From a983abd29c19a3bbfa39512d1622e92797f22521 Mon Sep 17 00:00:00 2001 From: Paolo Carlini Date: Tue, 2 Jun 2015 10:28:14 +0000 Subject: [PATCH] re PR c++/61683 (decltype-specifier not accepted as mem-initializer-id) /cp 2015-06-02 Paolo Carlini PR c++/61683 * parser.c (cp_parser_mem_initializer): Allow for decltype-specifier. /testsuite 2015-06-02 Paolo Carlini PR c++/61683 * g++.dg/cpp0x/decltype-mem-initializer1.C: New. From-SVN: r224022 --- gcc/cp/ChangeLog | 5 ++++ gcc/cp/parser.c | 27 +++++++++++++--------- gcc/testsuite/ChangeLog | 5 ++++ .../g++.dg/cpp0x/decltype-mem-initializer1.C | 8 +++++++ 4 files changed, 34 insertions(+), 11 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/decltype-mem-initializer1.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index be1a3f9..c6f1a6d 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2015-06-02 Paolo Carlini + + PR c++/61683 + * parser.c (cp_parser_mem_initializer): Allow for decltype-specifier. + 2015-06-01 Jason Merrill PR c++/65942 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index bc48c11..9ae555c 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -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; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3961781..2ea81dd 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-06-02 Paolo Carlini + + PR c++/61683 + * g++.dg/cpp0x/decltype-mem-initializer1.C: New. + 2015-06-02 Bin Cheng 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 index 0000000..d036b29 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/decltype-mem-initializer1.C @@ -0,0 +1,8 @@ +// PR c++/61683 +// { dg-do compile { target c++11 } } + +struct A {}; +A a; +struct B : A { + B(): decltype(a)() {} +}; -- 2.7.4