re PR c++/15890 (internal compiler error: in c_expand_expr, at c-common.c:4138)
authorMark Mitchell <mark@codesourcery.com>
Thu, 19 Aug 2004 20:16:01 +0000 (20:16 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Thu, 19 Aug 2004 20:16:01 +0000 (20:16 +0000)
PR c++/15890
* pt.c (push_template_decl_real): Disallow template allocation
functions with fewer than two parameters.

PR c++/15890
* g++.dg/template/delete1.C: New test.

From-SVN: r86265

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/template/delete1.C [new file with mode: 0644]

index 85d5038ae54d85d8c09b3a2a2690591ae11adb58..5f63d12b0eb022fe0e317f723dcb6b7b910a0f5f 100644 (file)
@@ -1,3 +1,9 @@
+2004-08-19  Mark Mitchell  <mark@codesourcery.com>
+
+       PR c++/15890
+       * pt.c (push_template_decl_real): Disallow template allocation
+       functions with fewer than two parameters.
+
 2004-08-19  Nathan Sidwell  <nathan@codesourcery.com>
 
        * cp-tree.h (build_shared_int_cst): Remove.
index f4e9362ff1b1eb95d6fa54882a28ea4ed60b6104..34ea3a6a53446627e172b7b0da0dc200cb3a9f7e 100644 (file)
@@ -2875,19 +2875,35 @@ push_template_decl_real (tree decl, int is_friend)
       else if (TREE_CODE (decl) == TYPE_DECL 
               && ANON_AGGRNAME_P (DECL_NAME (decl))) 
        error ("template class without a name");
-      else if (TREE_CODE (decl) == FUNCTION_DECL
-              && DECL_DESTRUCTOR_P (decl))
+      else if (TREE_CODE (decl) == FUNCTION_DECL)
        {
-         /* [temp.mem]
-            
-             A destructor shall not be a member template.  */
-         error ("destructor `%D' declared as member template", decl);
-         return error_mark_node;
+         if (DECL_DESTRUCTOR_P (decl))
+           {
+             /* [temp.mem]
+                
+                A destructor shall not be a member template.  */
+             error ("destructor `%D' declared as member template", decl);
+             return error_mark_node;
+           }
+         if (NEW_DELETE_OPNAME_P (DECL_NAME (decl))
+             && (!TYPE_ARG_TYPES (TREE_TYPE (decl))
+                 || TYPE_ARG_TYPES (TREE_TYPE (decl)) == void_list_node
+                 || !TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (decl)))
+                 || (TREE_CHAIN (TYPE_ARG_TYPES ((TREE_TYPE (decl))))
+                     == void_list_node)))
+           {
+             /* [basic.stc.dynamic.allocation] 
+
+                An allocation function can be a function
+                template. ... Template allocation functions shall
+                have two or more parameters.  */
+             error ("invalid template declaration of `%D'", decl);
+             return decl;
+           }
        }
       else if ((DECL_IMPLICIT_TYPEDEF_P (decl)
                && CLASS_TYPE_P (TREE_TYPE (decl)))
-              || (TREE_CODE (decl) == VAR_DECL && ctx && CLASS_TYPE_P (ctx))
-              || TREE_CODE (decl) == FUNCTION_DECL)
+              || (TREE_CODE (decl) == VAR_DECL && ctx && CLASS_TYPE_P (ctx)))
        /* OK */;
       else
        {
index f4acb9313e3ce568909a95a47b130d4e94d2652b..7e639c105a2091da2a1591b50cea5fb2b1366abb 100644 (file)
@@ -1,3 +1,8 @@
+2004-08-19  Mark Mitchell  <mark@codesourcery.com>
+
+       PR c++/15890
+       * g++.dg/template/delete1.C: New test.
+
 2004-08-19  Paul Brook  <paul@codesourcery.com>
 
        PR fortran/14976
diff --git a/gcc/testsuite/g++.dg/template/delete1.C b/gcc/testsuite/g++.dg/template/delete1.C
new file mode 100644 (file)
index 0000000..fc53270
--- /dev/null
@@ -0,0 +1,14 @@
+// PR c++/15890
+
+template < typename T >
+void operator delete ( void* raw ) { // { dg-error "" }
+  delete raw;
+}
+
+class A { };
+
+int main() {
+  A* a = new A;
+  delete a;
+}
+