aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp
diff options
context:
space:
mode:
authorSimon Martin <simartin@users.sourceforge.net>2009-03-27 13:17:37 +0000
committerH.J. Lu <hjl@gcc.gnu.org>2009-03-27 06:17:37 -0700
commit48b6cd9d20b473886b39b2a206765da747a88484 (patch)
treec2bdd6259ed4f3763cf7a439c4ddf12a39f71514 /gcc/cp
parent6a837908f994e64fa285acdcc1183e9d0e41ff9a (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/cp/decl.c8
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))