From: Adam Butcher Date: Wed, 24 Jun 2015 15:11:06 +0000 (+0100) Subject: re PR c++/65750 (misinterpret in a virtual member function with a C++11 style functio... X-Git-Tag: basepoints/gcc-7~6137 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=aa97bb6f1229cf69aa17ad7660c3bc63c39ab22b;p=thirdparty%2Fgcc.git re PR c++/65750 (misinterpret in a virtual member function with a C++11 style function signature) /cp 2015-06-24 Adam Butcher PR c++/65750 * parser.c (cp_parser_simple_type_specifier): Don't synthesize implicit template parm if 'auto' is a placeholder for trailing return type. /testsuite 2015-06-24 Adam Butcher PR c++/65750 * g++.dg/cpp0x/trailing11.C: New. From-SVN: r224901 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 4b275199f336..c9c3977a4ee5 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2015-06-24 Adam Butcher + + PR c++/65750 + * parser.c (cp_parser_simple_type_specifier): Don't synthesize + implicit template parm if 'auto' is a placeholder for trailing + return type. + 2015-06-24 Patrick Palka Revert: diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 9a1cbd814c05..5150abeec23d 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -14939,6 +14939,30 @@ cp_parser_simple_type_specifier (cp_parser* parser, maybe_warn_cpp0x (CPP0X_AUTO); if (parser->auto_is_implicit_function_template_parm_p) { + /* The 'auto' might be the placeholder return type for a function decl + with trailing return type. */ + bool have_trailing_return_fn_decl = false; + if (cp_lexer_peek_nth_token (parser->lexer, 2)->type + == CPP_OPEN_PAREN) + { + cp_parser_parse_tentatively (parser); + cp_lexer_consume_token (parser->lexer); + cp_lexer_consume_token (parser->lexer); + if (cp_parser_skip_to_closing_parenthesis (parser, + /*recovering*/false, + /*or_comma*/false, + /*consume_paren*/true)) + have_trailing_return_fn_decl + = cp_lexer_next_token_is (parser->lexer, CPP_DEREF); + cp_parser_abort_tentative_parse (parser); + } + + if (have_trailing_return_fn_decl) + { + type = make_auto (); + break; + } + if (cxx_dialect >= cxx14) type = synthesize_implicit_template_parm (parser); else diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 40d8497fa541..af6d43aa445a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-06-24 Adam Butcher + + PR c++/65750 + * g++.dg/cpp0x/trailing11.C: New. + 2015-06-24 Ramana Radhakrishnan * gcc.target/arm/fixed_float_conversion.c: Skip for inappropriate diff --git a/gcc/testsuite/g++.dg/cpp0x/trailing11.C b/gcc/testsuite/g++.dg/cpp0x/trailing11.C new file mode 100644 index 000000000000..0c9e9081fbf8 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/trailing11.C @@ -0,0 +1,12 @@ +// PR c++/65750 +// { dg-do compile { target c++11 } } + +template struct F { }; + +class a +{ + virtual auto f( F< void () > ) -> void; + virtual auto g( F< auto () -> void > ) -> void; +}; + +auto main() -> int { }