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 | |
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
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/decl.c | 8 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/parse/ctor9.C | 7 |
4 files changed, 26 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)) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 950397f..82fc8ab 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ 2009-03-27 Simon Martin <simartin@users.sourceforge.net> + PR c++/37647 + * g++.dg/parse/ctor9.C: New test. + +2009-03-27 Simon Martin <simartin@users.sourceforge.net> + PR c++/29727 * g++.dg/init/error2.C: New test. diff --git a/gcc/testsuite/g++.dg/parse/ctor9.C b/gcc/testsuite/g++.dg/parse/ctor9.C new file mode 100644 index 0000000..b80f728 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/ctor9.C @@ -0,0 +1,7 @@ +/* PR c++/37647 */ +/* { dg-do "compile" } */ + +struct A +{ + A() { void A(); } /* { dg-error "return type specification for constructor invalid|non-class scope" } */ +}; |