mirror of
https://gcc.gnu.org/git/gcc.git
synced 2024-11-26 12:23:59 +08:00
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:
parent
5815280853
commit
717a7d5d00
@ -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.
|
||||
|
34
gcc/cp/pt.c
34
gcc/cp/pt.c
@ -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
|
||||
{
|
||||
|
@ -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
|
||||
|
14
gcc/testsuite/g++.dg/template/delete1.C
Normal file
14
gcc/testsuite/g++.dg/template/delete1.C
Normal 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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user