diff options
author | Simon Martin <simartin@users.sourceforge.net> | 2009-03-27 13:17:37 +0000 |
---|---|---|
committer | H.J. Lu <hjl@gcc.gnu.org> | 2009-03-27 06:17:37 -0700 |
commit | 48b6cd9d20b473886b39b2a206765da747a88484 (patch) | |
tree | c2bdd6259ed4f3763cf7a439c4ddf12a39f71514 /gcc/cp | |
parent | 6a837908f994e64fa285acdcc1183e9d0e41ff9a (diff) | |
download | gcc-48b6cd9d20b473886b39b2a206765da747a88484.zip gcc-48b6cd9d20b473886b39b2a206765da747a88484.tar.gz gcc-48b6cd9d20b473886b39b2a206765da747a88484.tar.bz2 |
re PR c++/37647 (ICE with invalid use of constructor)
gcc/cp/
2009-03-27 Simon Martin <simartin@users.sourceforge.net>
PR c++/37647
* decl.c (grokdeclarator): Reject [con|de]stuctors in a non-class
scope.
gcc/testsuite/
2009-03-27 Simon Martin <simartin@users.sourceforge.net>
PR c++/37647
* g++.dg/parse/ctor9.C: New test.
From-SVN: r145105
Diffstat (limited to 'gcc/cp')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/decl.c | 8 |
2 files changed, 14 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 3b91d68..d120594 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,11 @@ 2009-03-27 Simon Martin <simartin@users.sourceforge.net> + PR c++/37647 + * decl.c (grokdeclarator): Reject [con|de]stuctors in a non-class + scope. + +2009-03-27 Simon Martin <simartin@users.sourceforge.net> + PR c++/29727 * decl.c (check_array_designated_initializer): Handle error_mark_node. diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 2a89ef4..b16ae26 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -9346,6 +9346,14 @@ grokdeclarator (const cp_declarator *declarator, error ("virtual non-class function %qs", name); virtualp = 0; } + else if (sfk == sfk_constructor + || sfk == sfk_destructor) + { + error (funcdef_flag + ? "%qs defined in a non-class scope" + : "%qs declared in a non-class scope", name); + sfk = sfk_none; + } } else if (TREE_CODE (type) == FUNCTION_TYPE && staticp < 2 && !NEW_DELETE_OPNAME_P (original_name)) |