From: Jason Merrill Date: Thu, 18 Dec 2014 23:53:15 +0000 (-0500) Subject: re PR c++/64105 (ICE: in strip_typedefs, at cp/tree.c:1326) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=90f6debee40951552f873164d332f7a46b1007df;p=gcc.git 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 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index c80690db079..823f0864229 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 0e7ba7aa3af..8ff16ed770c 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. */ diff --git a/gcc/testsuite/g++.dg/cpp1y/lambda-generic-variadic2.C b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-variadic2.C new file mode 100644 index 00000000000..2808aa6c190 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-variadic2.C @@ -0,0 +1,22 @@ +// PR c++/64105 +// This test was ICEing on pre-C++14 mode. + +#include + +using F = std::function; + +struct X +{ + template + static void f(T t) + { + g(t); + } + + static void g(F) {} +}; + +int main() +{ + X::f([](auto... xs){}); // { dg-error "" "" { target { ! cxx14 } } } +};