From 5768cbca0dc7147448f503a024b56abb4b6c9815 Mon Sep 17 00:00:00 2001 From: hjl Date: Fri, 27 Mar 2009 13:17:37 +0000 Subject: [PATCH] gcc/cp/ 2009-03-27 Simon Martin PR c++/37647 * decl.c (grokdeclarator): Reject [con|de]stuctors in a non-class scope. gcc/testsuite/ 2009-03-27 Simon Martin PR c++/37647 * g++.dg/parse/ctor9.C: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@145105 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/decl.c | 8 ++++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/parse/ctor9.C | 7 +++++++ 4 files changed, 26 insertions(+) create mode 100644 gcc/testsuite/g++.dg/parse/ctor9.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 3b91d68a123..d1205942034 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,11 @@ 2009-03-27 Simon Martin + PR c++/37647 + * decl.c (grokdeclarator): Reject [con|de]stuctors in a non-class + scope. + +2009-03-27 Simon Martin + 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 2a89ef45fbf..b16ae262bea 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 950397fcc2e..82fc8ab70ca 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ 2009-03-27 Simon Martin + PR c++/37647 + * g++.dg/parse/ctor9.C: New test. + +2009-03-27 Simon Martin + 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 00000000000..b80f7289253 --- /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" } */ +}; -- 2.11.0