From 90f6debee40951552f873164d332f7a46b1007df Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Thu, 18 Dec 2014 18:53:15 -0500 Subject: re PR c++/64105 (ICE: in strip_typedefs, at cp/tree.c:1326) PR c++/64105 * parser.c (cp_parser_simple_type_specifier): Make auto parameter before -std=c++14 an error. From-SVN: r218879 --- gcc/cp/ChangeLog | 4 ++++ gcc/cp/parser.c | 14 ++++++++++---- 2 files changed, 14 insertions(+), 4 deletions(-) (limited to 'gcc/cp') diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index c80690d..823f086 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2014-12-18 Jason Merrill + PR c++/64105 + * parser.c (cp_parser_simple_type_specifier): Make auto parameter + before -std=c++14 an error. + PR c++/64352 * pt.c (tsubst_copy_and_build): Pass complain to mark_used. diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 0e7ba7a..8ff16ed 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -14862,23 +14862,26 @@ cp_parser_simple_type_specifier (cp_parser* parser, maybe_warn_cpp0x (CPP0X_AUTO); if (parser->auto_is_implicit_function_template_parm_p) { - type = synthesize_implicit_template_parm (parser); + if (cxx_dialect >= cxx14) + type = synthesize_implicit_template_parm (parser); + else + type = error_mark_node; if (current_class_type && LAMBDA_TYPE_P (current_class_type)) { if (cxx_dialect < cxx14) - pedwarn (location_of (type), 0, + error_at (token->location, "use of % in lambda parameter declaration " "only available with " "-std=c++14 or -std=gnu++14"); } else if (cxx_dialect < cxx14) - pedwarn (location_of (type), 0, + error_at (token->location, "use of % in parameter declaration " "only available with " "-std=c++14 or -std=gnu++14"); else - pedwarn (location_of (type), OPT_Wpedantic, + pedwarn (token->location, OPT_Wpedantic, "ISO C++ forbids use of % in parameter " "declaration"); } @@ -14971,6 +14974,9 @@ cp_parser_simple_type_specifier (cp_parser* parser, /* Consume the token. */ cp_lexer_consume_token (parser->lexer); + if (type == error_mark_node) + return error_mark_node; + /* There is no valid C++ program where a non-template type is followed by a "<". That usually indicates that the user thought that the type was a template. */ -- cgit v1.1