aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2011-12-17 19:55:18 -0500
committerJason Merrill <jason@gcc.gnu.org>2011-12-17 19:55:18 -0500
commit55f8ed96858fe0e5ccd871a49417ce92913b0987 (patch)
tree462c8cf9778eedea11d32d6e55952839482390b2
parentde4d7a7f8d08e75f7a6ac60c684b1080aea2a597 (diff)
downloadgcc-55f8ed96858fe0e5ccd871a49417ce92913b0987.zip
gcc-55f8ed96858fe0e5ccd871a49417ce92913b0987.tar.gz
gcc-55f8ed96858fe0e5ccd871a49417ce92913b0987.tar.bz2
re PR c++/51588 ([c++0x] [4.4/4.5/4.6/4.7 Regression] ICE using an enum as base class)
PR c++/51588 * parser.c (cp_parser_ptr_operator): Reject pointer to member of enum. From-SVN: r182452
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/parser.c3
-rw-r--r--gcc/testsuite/ChangeLog3
-rw-r--r--gcc/testsuite/g++.dg/parse/enum7.C9
4 files changed, 20 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 4faf001..18f1dfd 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,8 @@
+2011-12-17 Jason Merrill <jason@redhat.com>
+
+ PR c++/51588
+ * parser.c (cp_parser_ptr_operator): Reject pointer to member of enum.
+
2011-12-17 Richard Henderson <rth@redhat.com>
PR bootstrap/51072
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index ac7427e..51d04d4 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -16448,6 +16448,9 @@ cp_parser_ptr_operator (cp_parser* parser,
if (TREE_CODE (parser->scope) == NAMESPACE_DECL)
error_at (token->location, "%qD is a namespace", parser->scope);
+ else if (TREE_CODE (parser->scope) == ENUMERAL_TYPE)
+ error_at (token->location, "cannot form pointer to member of "
+ "non-class %q#T", parser->scope);
else
{
/* The type of which the member is a member is given by the
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 066121d..235f8c9 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,8 @@
2011-12-17 Jason Merrill <jason@redhat.com>
+ PR c++/51588
+ * g++.dg/parse/enum7.C: New.
+
PR c++/51586
* g++.dg/lookup/nested2.C: New.
diff --git a/gcc/testsuite/g++.dg/parse/enum7.C b/gcc/testsuite/g++.dg/parse/enum7.C
new file mode 100644
index 0000000..d9e3a89
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/enum7.C
@@ -0,0 +1,9 @@
+// PR c++/51588
+
+enum A {};
+
+struct B : A { // { dg-error "" }
+ int i;
+};
+
+int A::* p = &B::i; // { dg-error "" }