aboutsummaryrefslogtreecommitdiff
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
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
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/decl.c8
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/parse/ctor9.C7
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" } */
+};