re PR c++/52595 ([DR 325] commas and non-static data member initializers don't mix)
authorNathan Sidwell <nathan@acm.org>
Fri, 5 Jun 2015 13:35:30 +0000 (13:35 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Fri, 5 Jun 2015 13:35:30 +0000 (13:35 +0000)
cp/
PR c++/52595
* parser.c (cp_parser_cache_defarg): Continue looking for
declarators when scanning a potential template argument list of an
NSDMI.

testsuite/
PR c++/52595
* g++,dg/cpp0x/nsdmi-defer5.C: Add template case.

From-SVN: r224152

gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/nsdmi-defer5.C

index 5a77b30..e845b9f 100644 (file)
@@ -1,3 +1,10 @@
+2015-06-05  Nathan Sidwell  <nathan@acm.org>
+
+       PR c++/52595
+       * parser.c (cp_parser_cache_defarg): Continue looking for
+       declarators when scanning a potential template argument list of an
+       NSDMI.
+
 2015-06-04  Andrew MacLeod  <amacleod@redhat.com>
 
        * call.c: Adjust includes for restructured coretypes.h.
index ae9d3f0..2ea61c0 100644 (file)
@@ -25388,6 +25388,7 @@ cp_parser_cache_defarg (cp_parser *parser, bool nsdmi)
                 the default argument; otherwise the default
                 argument continues.  */
              bool error = false;
+             cp_token *peek;
 
              /* Set ITALP so cp_parser_parameter_declaration_list
                 doesn't decide to commit to this parse.  */
@@ -25395,19 +25396,39 @@ cp_parser_cache_defarg (cp_parser *parser, bool nsdmi)
              parser->in_template_argument_list_p = true;
 
              cp_parser_parse_tentatively (parser);
-             cp_lexer_consume_token (parser->lexer);
 
              if (nsdmi)
                {
-                 int ctor_dtor_or_conv_p;
-                 cp_parser_declarator (parser, CP_PARSER_DECLARATOR_NAMED,
-                                       &ctor_dtor_or_conv_p,
-                                       /*parenthesized_p=*/NULL,
-                                       /*member_p=*/true,
-                                       /*friend_p=*/false);
+                 /* Parse declarators until we reach a non-comma or
+                    somthing that cannot be an initializer.
+                    Just checking whether we're looking at a single
+                    declarator is insufficient.  Consider:
+                      int var = tuple<T,U>::x;
+                    The template parameter 'U' looks exactly like a
+                    declarator.  */
+                 do
+                   {
+                     int ctor_dtor_or_conv_p;
+                     cp_lexer_consume_token (parser->lexer);
+                     cp_parser_declarator (parser, CP_PARSER_DECLARATOR_NAMED,
+                                           &ctor_dtor_or_conv_p,
+                                           /*parenthesized_p=*/NULL,
+                                           /*member_p=*/true,
+                                           /*friend_p=*/false);
+                     peek = cp_lexer_peek_token (parser->lexer);
+                     if (cp_parser_error_occurred (parser))
+                       break;
+                   }
+                 while (peek->type == CPP_COMMA);
+                 /* If we met an '=' or ';' then the original comma
+                    was the end of the NSDMI.  Otherwise assume
+                    we're still in the NSDMI.  */
+                 error = (peek->type != CPP_EQ
+                          && peek->type != CPP_SEMICOLON);
                }
              else
                {
+                 cp_lexer_consume_token (parser->lexer);
                  begin_scope (sk_function_parms, NULL_TREE);
                  cp_parser_parameter_declaration_list (parser, &error);
                  pop_bindings_and_leave_scope ();
index 136c01c..3d5ce99 100644 (file)
@@ -1,3 +1,8 @@
+2015-06-05  Nathan Sidwell  <nathan@acm.org>
+
+       PR c++/52595
+       * g++,dg/cpp0x/nsdmi-defer5.C: Add template case.
+
 2015-06-05  Kugan Vivekanandarajah  <kuganv@linaro.org>
 
        * gcc.target/arm/neon-reload-class.c: Remove movw and movt.
index a83d40b..cb74d8f 100644 (file)
@@ -5,6 +5,9 @@ template<typename T, typename U>
 struct tuple
 {
   tuple(T, U) { }
+
+  static const int x = 3;
+  int var = tuple<T,U>::x;
 };
 
 struct Y