re PR c++/64105 (ICE: in strip_typedefs, at cp/tree.c:1326)
authorJason Merrill <jason@redhat.com>
Thu, 18 Dec 2014 23:53:15 +0000 (18:53 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Thu, 18 Dec 2014 23:53:15 +0000 (18:53 -0500)
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
gcc/cp/parser.c
gcc/testsuite/g++.dg/cpp1y/lambda-generic-variadic2.C [new file with mode: 0644]

index c80690db079b587588b742f8765678c8988ceaba..823f086422996beac727a1d044f5e3ed15101515 100644 (file)
@@ -1,5 +1,9 @@
 2014-12-18  Jason Merrill  <jason@redhat.com>
 
+       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.
 
index 0e7ba7aa3af808fb2c56d3301d5c73d8194ee9a8..8ff16ed770c409b00dd561a06394d0b88d3f92c2 100644 (file)
@@ -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 %<auto%> 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 %<auto%> 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 %<auto%> 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 (file)
index 0000000..2808aa6
--- /dev/null
@@ -0,0 +1,22 @@
+// PR c++/64105
+// This test was ICEing on pre-C++14 mode.
+
+#include <functional>
+
+using F = std::function<void(void)>;
+
+struct X
+{
+  template <typename T>
+  static void f(T t)
+  {
+    g(t);
+  }
+
+  static void g(F) {}
+};
+
+int main()
+{
+  X::f([](auto... xs){});      // { dg-error "" "" { target { ! cxx14 } } }
+};