OSDN Git Service

PR c++/48935
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 25 May 2011 14:35:17 +0000 (14:35 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 25 May 2011 14:35:17 +0000 (14:35 +0000)
* parser.c (cp_parser_constructor_declarator_p): Don't check
constructor_name_p for enums.
(cp_parser_diagnose_invalid_type_name): Correct error message.

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

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 3de0639..a349267 100644 (file)
@@ -1,5 +1,10 @@
 2011-05-25  Jason Merrill  <jason@redhat.com>
 
 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.
        PR c++/45418
        * init.c (perform_member_init): Handle list-initialization
        of array of non-trivial class type.
index 3493e44..db2cb96 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))
                  "%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 ();
                  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
   /* 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,
     {
       tree id = cp_parser_unqualified_id (parser,
                                          /*template_keyword_p=*/false,
index e6327e0..bc2eac9 100644 (file)
@@ -1,5 +1,8 @@
 2011-05-25  Jason Merrill  <jason@redhat.com>
 
 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.
        * 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 2352193..607a1db 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::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 }
 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::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 }
   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::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" }
 };
   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" }
 };