diff options
-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" } */ +}; |