re PR c++/15890 (internal compiler error: in c_expand_expr, at c-common.c:4138)

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
This commit is contained in:
Mark Mitchell 2004-08-19 20:16:01 +00:00 committed by Mark Mitchell
parent 5815280853
commit 717a7d5d00
4 changed files with 50 additions and 9 deletions

View 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.

View 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]
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;
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
{

View 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

View File

@ -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;
}