re PR c++/61683 (decltype-specifier not accepted as mem-initializer-id)
authorPaolo Carlini <paolo.carlini@oracle.com>
Tue, 2 Jun 2015 10:28:14 +0000 (10:28 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Tue, 2 Jun 2015 10:28:14 +0000 (10:28 +0000)
/cp
2015-06-02  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/61683
* parser.c (cp_parser_mem_initializer): Allow for decltype-specifier.

/testsuite
2015-06-02  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/61683
* g++.dg/cpp0x/decltype-mem-initializer1.C: New.

From-SVN: r224022

gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/decltype-mem-initializer1.C [new file with mode: 0644]

index be1a3f967172f358e0204346c8f6a38a4ab1aabd..c6f1a6d2282f3256c51add1c1f0ab56cbd7bc0e6 100644 (file)
@@ -1,3 +1,8 @@
+2015-06-02  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/61683
+       * parser.c (cp_parser_mem_initializer): Allow for decltype-specifier.
+
 2015-06-01  Jason Merrill  <jason@redhat.com>
 
        PR c++/65942
index bc48c11cbc6c8a1fa84e045c21bb3ba3ccfe0325..9ae555c1354a93caa6901ac6d23225b9cce2951b 100644 (file)
@@ -12803,11 +12803,12 @@ cp_parser_mem_initializer (cp_parser* parser)
 
    mem-initializer-id:
      :: [opt] nested-name-specifier [opt] class-name
+     decltype-specifier (C++11)
      identifier
 
-   Returns a TYPE indicating the class to be initializer for the first
-   production.  Returns an IDENTIFIER_NODE indicating the data member
-   to be initialized for the second production.  */
+   Returns a TYPE indicating the class to be initialized for the first
+   production (and the second in C++11).  Returns an IDENTIFIER_NODE
+   indicating the data member to be initialized for the last production.  */
 
 static tree
 cp_parser_mem_initializer_id (cp_parser* parser)
@@ -12865,14 +12866,18 @@ cp_parser_mem_initializer_id (cp_parser* parser)
                                 /*is_declaration=*/true);
   /* Otherwise, we could also be looking for an ordinary identifier.  */
   cp_parser_parse_tentatively (parser);
-  /* Try a class-name.  */
-  id = cp_parser_class_name (parser,
-                            /*typename_keyword_p=*/true,
-                            /*template_keyword_p=*/false,
-                            none_type,
-                            /*check_dependency_p=*/true,
-                            /*class_head_p=*/false,
-                            /*is_declaration=*/true);
+  if (cp_lexer_next_token_is_decltype (parser->lexer))
+    /* Try a decltype-specifier.  */
+    id = cp_parser_decltype (parser);
+  else
+    /* Otherwise, try a class-name.  */
+    id = cp_parser_class_name (parser,
+                              /*typename_keyword_p=*/true,
+                              /*template_keyword_p=*/false,
+                              none_type,
+                              /*check_dependency_p=*/true,
+                              /*class_head_p=*/false,
+                              /*is_declaration=*/true);
   /* If we found one, we're done.  */
   if (cp_parser_parse_definitely (parser))
     return id;
index 39617815ba6e20571c1efbb6d9eaac70a84d9285..2ea81dd1bba712d05cbbd1bc1b0cb6ff661c622a 100644 (file)
@@ -1,3 +1,8 @@
+2015-06-02  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/61683
+       * g++.dg/cpp0x/decltype-mem-initializer1.C: New.
+
 2015-06-02  Bin Cheng  <bin.cheng@arm.com>
 
        PR tree-optimization/48052
diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype-mem-initializer1.C b/gcc/testsuite/g++.dg/cpp0x/decltype-mem-initializer1.C
new file mode 100644 (file)
index 0000000..d036b29
--- /dev/null
@@ -0,0 +1,8 @@
+// PR c++/61683
+// { dg-do compile { target c++11 } }
+
+struct A {};
+A a;
+struct B : A {
+  B(): decltype(a)() {}
+};