re PR c++/48935 ([C++0x] Name lookup error at enum class)
authorJason Merrill <jason@redhat.com>
Wed, 25 May 2011 14:35:17 +0000 (10:35 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Wed, 25 May 2011 14:35:17 +0000 (10:35 -0400)
PR c++/48935
* parser.c (cp_parser_constructor_declarator_p): Don't check
constructor_name_p for enums.
(cp_parser_diagnose_invalid_type_name): Correct error message.

From-SVN: r174205

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

index 3de0639bd60884e2ea9880bed6e9a488c0b8d620..a34926730ec7d32dda7ab056b6aee28372784dc6 100644 (file)
@@ -1,5 +1,10 @@
 2011-05-25  Jason Merrill  <jason@redhat.com>
 
+       PR c++/48935
+       * parser.c (cp_parser_constructor_declarator_p): Don't check
+       constructor_name_p for enums.
+       (cp_parser_diagnose_invalid_type_name): Correct error message.
+
        PR c++/45418
        * init.c (perform_member_init): Handle list-initialization
        of array of non-trivial class type.
index 3493e44496d8fb96450ed137ad5588759650e62d..db2cb96c6138b36125369334af44634abdc45760 100644 (file)
@@ -2534,7 +2534,7 @@ cp_parser_diagnose_invalid_type_name (cp_parser *parser,
                  "%qT is a dependent scope",
                  parser->scope, id, parser->scope);
       else if (TYPE_P (parser->scope))
-       error_at (location, "%qE in class %qT does not name a type",
+       error_at (location, "%qE in %q#T does not name a type",
                  id, parser->scope);
       else
        gcc_unreachable ();
@@ -19589,7 +19589,7 @@ cp_parser_constructor_declarator_p (cp_parser *parser, bool friend_p)
   /* If we have a class scope, this is easy; DR 147 says that S::S always
      names the constructor, and no other qualified name could.  */
   if (constructor_p && nested_name_specifier
-      && TYPE_P (nested_name_specifier))
+      && CLASS_TYPE_P (nested_name_specifier))
     {
       tree id = cp_parser_unqualified_id (parser,
                                          /*template_keyword_p=*/false,
index e6327e0bad326a2ef6678897e33a3e45ab1f84b5..bc2eac9529a7b1f169cb9b2cd8d7b4fa41cc64ba 100644 (file)
@@ -1,5 +1,8 @@
 2011-05-25  Jason Merrill  <jason@redhat.com>
 
+       * g++.dg/cpp0x/enum16.C: New.
+       * g++.dg/parse/error15.C: Adjust.
+
        * g++.dg/cpp0x/initlist50.C: New.
 
        * g++.dg/cpp0x/lambda/lambda-conv5.C: New.
diff --git a/gcc/testsuite/g++.dg/cpp0x/enum16.C b/gcc/testsuite/g++.dg/cpp0x/enum16.C
new file mode 100644 (file)
index 0000000..ebb4868
--- /dev/null
@@ -0,0 +1,6 @@
+// PR c++/48935
+// { dg-options -std=c++0x }
+
+enum class ENUM { a };
+
+ENUM::Type func() { return ENUM::a; } // { dg-error "does not name a type" }
index 2352193bcd681e2ffb3e9d6a09a9c3158f913360..607a1dbb86c2ae96f712e63687a00cf23f1cd8fb 100644 (file)
@@ -12,7 +12,7 @@ namespace N
 
 N::A f2;              // { dg-error "1:invalid use of template-name 'N::A' without an argument list" }
 N::INVALID f3;        // { dg-error "1:'INVALID' in namespace 'N' does not name a type" }
-N::C::INVALID f4;     // { dg-error "1:'INVALID' in class 'N::C' does not name a type" }
+N::C::INVALID f4;     // { dg-error "1:'INVALID' in 'struct N::C' does not name a type" }
 N::K f6;              // { dg-error "1:'K' in namespace 'N' does not name a type" }
 typename N::A f7;
 // { dg-error "13:invalid use of template-name 'N::A' without an argument list" "13" { target *-*-* } 17 }
@@ -22,7 +22,7 @@ struct B
 {
   N::A f2;            // { dg-error "3:invalid use of template-name 'N::A' without an argument list" }
   N::INVALID f3;      // { dg-error "3:'INVALID' in namespace 'N' does not name a type" }
-  N::C::INVALID f4;   // { dg-error "3:'INVALID' in class 'N::C' does not name a type" }
+  N::C::INVALID f4;   // { dg-error "3:'INVALID' in 'struct N::C' does not name a type" }
   N::K f6;            // { dg-error "3:'K' in namespace 'N' does not name a type" }
   typename N::A f7;
 // { dg-error "15:invalid use of template-name 'N::A' without an argument list" "15" { target *-*-* } 27 }
@@ -33,7 +33,7 @@ struct C
 {
   N::A f2;            // { dg-error "3:invalid use of template-name 'N::A' without an argument list" }
   N::INVALID f3;      // { dg-error "3:'INVALID' in namespace 'N' does not name a type" }
-  N::C::INVALID f4;   // { dg-error "3:'INVALID' in class 'N::C' does not name a type" }
+  N::C::INVALID f4;   // { dg-error "3:'INVALID' in 'struct N::C' does not name a type" }
   N::K f6;            // { dg-error "3:'K' in namespace 'N' does not name a type" }
   typename N::A f7;   // { dg-error "15:invalid use of template-name 'N::A' without an argument list" }
 };