re PR c++/60626 ([c++1y] ICE with pointer to function with auto parameter)
authorAdam Butcher <adam@jessamine.co.uk>
Sat, 29 Mar 2014 19:23:44 +0000 (19:23 +0000)
committerAdam Butcher <abutcher@gcc.gnu.org>
Sat, 29 Mar 2014 19:23:44 +0000 (19:23 +0000)
Fix PR c++/60626

PR c++/60626
* parser.c (cp_parser_init_declarator): Handle erroneous generic type
usage in non-functions with pushed scope.

PR c++/60626
* g++.dg/cpp1y/pr60626.C: New testcase.

From-SVN: r208940

gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp1y/pr60626.C [new file with mode: 0644]

index 49f0d4a..aca5f44 100644 (file)
@@ -1,3 +1,9 @@
+2014-03-29  Adam Butcher  <adam@jessamine.co.uk>
+
+       PR c++/60626
+       * parser.c (cp_parser_init_declarator): Handle erroneous generic type
+       usage in non-functions with pushed scope.
+
 2014-03-28  Adam Butcher  <adam@jessamine.co.uk>
 
        PR c++/60573
index 5d8446d..7bea3d2 100644 (file)
@@ -16829,7 +16829,14 @@ cp_parser_init_declarator (cp_parser* parser,
      been issued.  */
   if (parser->fully_implicit_function_template_p)
     if (!function_declarator_p (declarator))
-      finish_fully_implicit_template (parser, /*member_decl_opt=*/0);
+      {
+       if (pushed_scope)
+         {
+           pop_scope (pushed_scope);
+           pushed_scope = 0;
+         }
+       finish_fully_implicit_template (parser, /*member_decl_opt=*/0);
+      }
 
   /* For an in-class declaration, use `grokfield' to create the
      declaration.  */
index e2031db..49000c3 100644 (file)
@@ -1,3 +1,8 @@
+2014-03-29  Adam Butcher  <adam@jessamine.co.uk>
+
+       PR c++/60626
+       * g++.dg/cpp1y/pr60626.C: New testcase.
+
 2014-03-29  Joseph Myers  <joseph@codesourcery.com>
 
        * gcc.dg/pr45416.c: Allow bextr on x86.
diff --git a/gcc/testsuite/g++.dg/cpp1y/pr60626.C b/gcc/testsuite/g++.dg/cpp1y/pr60626.C
new file mode 100644 (file)
index 0000000..39ea438
--- /dev/null
@@ -0,0 +1,7 @@
+// PR c++/60626
+// { dg-do compile { target c++1y } }
+// { dg-options "" }
+
+struct A {};
+
+void (*A::p)(auto) = 0;  // { dg-error "static member|non-template" }