]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/70513 (ICE on invalid C++ code on x86_64-linux-gnu: Segmentation fault)
authorMarek Polacek <polacek@redhat.com>
Thu, 21 Apr 2016 16:52:51 +0000 (16:52 +0000)
committerMarek Polacek <mpolacek@gcc.gnu.org>
Thu, 21 Apr 2016 16:52:51 +0000 (16:52 +0000)
PR c++/70513
* parser.c (cp_parser_enum_specifier): Check and possibly error for
extra qualification.

* g++.dg/cpp0x/forw_enum12.C: New test.
* g++.dg/cpp0x/forw_enum13.C: New test.

From-SVN: r235347

gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/forw_enum12.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp0x/forw_enum13.C [new file with mode: 0644]

index 50f3cc3bfd93f1fff5d99410eec21e2a9df49bb5..8efaa80b3444fb849b20f6e37977a2fc7a9b4018 100644 (file)
@@ -1,3 +1,9 @@
+2016-04-21  Marek Polacek  <polacek@redhat.com>
+
+       PR c++/70513
+       * parser.c (cp_parser_enum_specifier): Check and possibly error for
+       extra qualification.
+
 2016-04-20  Nathan Sidwell  <nathan@acm.org>
 
        PR c++/55635
index 0a1ed1a971053ff354ea0205678521e45615876a..feb8de76bc3a6bdfa688792547082f73e37d3b5b 100644 (file)
@@ -17233,6 +17233,16 @@ cp_parser_enum_specifier (cp_parser* parser)
                          type, prev_scope, nested_name_specifier);
              type = error_mark_node;
            }
+         /* If that scope is the scope where the declaration is being placed
+            the program is invalid.  */
+         else if (CLASS_TYPE_P (nested_name_specifier)
+                  && CLASS_TYPE_P (prev_scope)
+                  && same_type_p (nested_name_specifier, prev_scope))
+           {
+             permerror (type_start_token->location,
+                        "extra qualification not allowed");
+             nested_name_specifier = NULL_TREE;
+           }
        }
 
       if (scoped_enum_p)
index c881c000dcff47a945a57c365cfe36966a7d61e4..52257e5bd8aa631f0cb9a8178d6231b45b42c9ee 100644 (file)
@@ -1,3 +1,9 @@
+2016-04-21  Marek Polacek  <polacek@redhat.com>
+
+       PR c++/70513
+       * g++.dg/cpp0x/forw_enum12.C: New test.
+       * g++.dg/cpp0x/forw_enum13.C: New test.
+
 2016-04-21  Kirill Yukhin  <kirill.yukhin@intel.com>
 
        PR target/70728
diff --git a/gcc/testsuite/g++.dg/cpp0x/forw_enum12.C b/gcc/testsuite/g++.dg/cpp0x/forw_enum12.C
new file mode 100644 (file)
index 0000000..906ba68
--- /dev/null
@@ -0,0 +1,29 @@
+// PR c++/70513
+// { dg-do compile { target c++11 } }
+
+struct S1
+{
+  enum E : int;
+  enum S1::E : int { X } e; // { dg-error "extra qualification not allowed" }
+};
+
+struct S2
+{
+  enum class E : int;
+  enum class S2::E : int { X } e; // { dg-error "extra qualification not allowed" }
+};
+
+struct S3
+{
+  enum struct E : int;
+  enum struct S3::E : int { X } e; // { dg-error "extra qualification not allowed" }
+};
+
+struct S4
+{
+  struct S5
+  {
+    enum E : char;
+    enum S4::S5::E : char { X } e; // { dg-error "extra qualification not allowed" }
+  };
+};
diff --git a/gcc/testsuite/g++.dg/cpp0x/forw_enum13.C b/gcc/testsuite/g++.dg/cpp0x/forw_enum13.C
new file mode 100644 (file)
index 0000000..b8027f0
--- /dev/null
@@ -0,0 +1,47 @@
+// PR c++/70513
+// { dg-do compile { target c++11 } }
+
+template <typename T>
+class D1
+{
+  enum A : int;
+  enum D1::A : int { foo } c; // { dg-error "extra qualification not allowed" }
+};
+
+template <typename T>
+class D2
+{
+  enum A : int;
+  enum D2<T>::A : int { foo } c; // { dg-error "extra qualification not allowed" }
+};
+
+template <typename T>
+class D3
+{
+  enum D3::A { foo } c; // { dg-error "extra qualification not allowed" }
+};
+
+template <typename T>
+class D4
+{
+  enum D4<T>::A { foo } c; // { dg-error "extra qualification not allowed" }
+};
+
+template <typename T>
+class D5
+{
+  class D6
+  {
+    enum D6::A { foo } c; // { dg-error "extra qualification not allowed" }
+  };
+};
+
+template <typename T>
+class D7
+{
+  class D8
+  {
+    enum A : int;
+    enum D8::A : int { foo } c; // { dg-error "extra qualification not allowed" }
+  };
+};