OSDN Git Service

PR c++/51541 - ICE with invalid identifier in alias-declaration
authordodji <dodji@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 5 Jan 2012 23:00:14 +0000 (23:00 +0000)
committerdodji <dodji@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 5 Jan 2012 23:00:14 +0000 (23:00 +0000)
gcc/cp/

PR c++/51541
* parser.c (cp_parser_alias_declaration): Get out early upon
errors in the identifier or the attributes.

gcc/testsuite/

PR c++/51541
* g++.dg/cpp0x/alias-decl-18.C: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@182935 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/alias-decl-18.C [new file with mode: 0644]

index d889d29..e6ea3bf 100644 (file)
@@ -1,3 +1,9 @@
+2012-01-05  Dodji Seketeli  <dodji@redhat.com>
+
+       PR c++/51541
+       * parser.c (cp_parser_alias_declaration): Get out early upon
+       errors in the identifier or the attributes.
+
 2012-01-04  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/51064
index 8f2357e..0ae55a2 100644 (file)
@@ -15046,7 +15046,13 @@ cp_parser_alias_declaration (cp_parser* parser)
   cp_parser_require_keyword (parser, RID_USING, RT_USING);
   id_location = cp_lexer_peek_token (parser->lexer)->location;
   id = cp_parser_identifier (parser);
+  if (id == error_mark_node)
+    return error_mark_node;
+
   attributes = cp_parser_attributes_opt (parser);
+  if (attributes == error_mark_node)
+    return error_mark_node;
+
   cp_parser_require (parser, CPP_EQ, RT_EQ);
 
   /* Now we are going to parse the type-id of the declaration.  */
index 5fdcd11..5980066 100644 (file)
@@ -1,3 +1,8 @@
+2012-01-05  Dodji Seketeli  <dodji@redhat.com>
+
+       PR c++/51541
+       * g++.dg/cpp0x/alias-decl-18.C: New test.
+
 
 2012-01-05  Eric Botcazou  <ebotcazou@adacore.com>
 
diff --git a/gcc/testsuite/g++.dg/cpp0x/alias-decl-18.C b/gcc/testsuite/g++.dg/cpp0x/alias-decl-18.C
new file mode 100644 (file)
index 0000000..ba65561
--- /dev/null
@@ -0,0 +1,9 @@
+// Origin: PR c++/51541
+// { dg-options -std=c++11 }
+
+template<typename Z> using ::T = void(int n); // { dg-error "" }
+template<typename Z> using operator int = void(int n); // { dg-error "" }
+template<typename Z> using typename U = void; // { dg-error "" }
+template<typename Z> using typename ::V = void(int n); // { dg-error "" }
+template<typename Z> using typename ::operator bool = void(int n); // { dg-error "" }
+using foo __attribute__((aligned(4)) = int; // { dg-error "" }