From ac59f9beec4e2f44bd3c04eb8f4fb9432feaea40 Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Fri, 5 Jun 2015 13:35:30 +0000 Subject: [PATCH] re PR c++/52595 ([DR 325] commas and non-static data member initializers don't mix) 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 | 7 +++++ gcc/cp/parser.c | 35 ++++++++++++++++++----- gcc/testsuite/ChangeLog | 5 ++++ gcc/testsuite/g++.dg/cpp0x/nsdmi-defer5.C | 3 ++ 4 files changed, 43 insertions(+), 7 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 5a77b30eb88..e845b9f17ce 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2015-06-05 Nathan Sidwell + + 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 * call.c: Adjust includes for restructured coretypes.h. diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index ae9d3f04e9c..2ea61c02ed2 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -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::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 (); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 136c01c84c2..3d5ce994a97 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-06-05 Nathan Sidwell + + PR c++/52595 + * g++,dg/cpp0x/nsdmi-defer5.C: Add template case. + 2015-06-05 Kugan Vivekanandarajah * gcc.target/arm/neon-reload-class.c: Remove movw and movt. diff --git a/gcc/testsuite/g++.dg/cpp0x/nsdmi-defer5.C b/gcc/testsuite/g++.dg/cpp0x/nsdmi-defer5.C index a83d40b2924..cb74d8f849f 100644 --- a/gcc/testsuite/g++.dg/cpp0x/nsdmi-defer5.C +++ b/gcc/testsuite/g++.dg/cpp0x/nsdmi-defer5.C @@ -5,6 +5,9 @@ template struct tuple { tuple(T, U) { } + + static const int x = 3; + int var = tuple::x; }; struct Y -- 2.30.2