aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Carlini <paolo@gcc.gnu.org>2013-05-08 15:22:03 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2013-05-08 15:22:03 +0000
commitb0cda57f7b46e378c17be14241ce3e7a96d1df24 (patch)
tree6357a81fb073b47a705fc2bee4a3561f1bdaf44c
parente61e7d28462eb89a7933ea77ef17a511a07e8418 (diff)
downloadgcc-b0cda57f7b46e378c17be14241ce3e7a96d1df24.zip
gcc-b0cda57f7b46e378c17be14241ce3e7a96d1df24.tar.gz
gcc-b0cda57f7b46e378c17be14241ce3e7a96d1df24.tar.bz2
re PR c++/51226 ([c++0x] ICE with opaque enum and invalid template)
/cp 2013-05-08 Paolo Carlini <paolo.carlini@oracle.com> PR c++/51226 * parser.c (cp_parser_enum_specifier): Handle nested_name_specifier == error_mark_node. /testsuite 2013-05-08 Paolo Carlini <paolo.carlini@oracle.com> PR c++/51226 * g++.dg/cpp0x/pr51226.C: New. From-SVN: r198714
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/parser.c5
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/pr51226.C9
4 files changed, 25 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 21c4e39..b9e7e61 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2013-05-08 Paolo Carlini <paolo.carlini@oracle.com>
+
+ PR c++/51226
+ * parser.c (cp_parser_enum_specifier): Handle nested_name_specifier
+ == error_mark_node.
+
2013-05-06 Marc Glisse <marc.glisse@inria.fr>
* typeck.c (cp_build_binary_op): Call save_expr before
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index f87974e..6de8e1a 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -14856,6 +14856,8 @@ cp_parser_enum_specifier (cp_parser* parser)
type = NULL_TREE;
}
}
+ else if (nested_name_specifier == error_mark_node)
+ /* We already issued an error. */;
else
error_at (type_start_token->location,
"%qD is not an enumerator-name", identifier);
@@ -14965,7 +14967,8 @@ cp_parser_enum_specifier (cp_parser* parser)
if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
{
timevar_push (TV_PARSE_ENUM);
- if (nested_name_specifier)
+ if (nested_name_specifier
+ && nested_name_specifier != error_mark_node)
{
/* The following catches invalid code such as:
enum class S<int>::E { A, B, C }; */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 2180495..3ab939a 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2013-05-08 Paolo Carlini <paolo.carlini@oracle.com>
+
+ PR c++/51226
+ * g++.dg/cpp0x/pr51226.C: New.
+
2013-04-16 Han Shen <shenhan@google.com>
Test cases for '-fstack-protector-strong'.
@@ -6,7 +11,7 @@
2013-05-07 Ian Bolton <ian.bolton@arm.com>
- * gcc.target/aarch64/ands_1.c: New test.
+ * gcc.target/aarch64/ands_1.c: New test.
* gcc.target/aarch64/ands_2.c: Likewise
2013-05-07 Christophe Lyon <christophe.lyon@linaro.org>
diff --git a/gcc/testsuite/g++.dg/cpp0x/pr51226.C b/gcc/testsuite/g++.dg/cpp0x/pr51226.C
new file mode 100644
index 0000000..1e048ef
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/pr51226.C
@@ -0,0 +1,9 @@
+// PR c++/51226
+// { dg-do compile { target c++11 } }
+
+template<int> struct A // { dg-error "provided" }
+{
+ enum E : int;
+};
+
+template<> enum A<>::E : int {} // { dg-error "wrong number|expected" }