Fix instantiation of implicit function template forward declarations.
authorabutcher <abutcher@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 23 Sep 2013 22:43:34 +0000 (22:43 +0000)
committerabutcher <abutcher@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 23 Sep 2013 22:43:34 +0000 (22:43 +0000)
* parser.c (cp_parser_init_declarator): Defer calling
finish_fully_implicit_template for forward declarations until after
other decl processing is complete.  Cleanup for clarity: Extract 'else'
case after 'if' containing unconditional return.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@202850 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/parser.c

index 156dea2..380fae9 100644 (file)
@@ -1,5 +1,12 @@
 2013-09-23  Adam Butcher  <adam@jessamine.co.uk>
 
+       * parser.c (cp_parser_init_declarator): Defer calling
+       finish_fully_implicit_template for forward declarations until after
+       other decl processing is complete.  Cleanup for clarity: Extract 'else'
+       case after 'if' containing unconditional return.
+
+2013-09-23  Adam Butcher  <adam@jessamine.co.uk>
+
        * parser.c (make_generic_type_name): Spell generic type names '<autoN>'
        rather than '__GenN'.
 
index 82abf7c..f3133f3 100644 (file)
@@ -16318,47 +16318,43 @@ cp_parser_init_declarator (cp_parser* parser,
                               "a function-definition is not allowed here");
              return error_mark_node;
            }
-         else
-           {
-             location_t func_brace_location
-               = cp_lexer_peek_token (parser->lexer)->location;
-
-             /* Neither attributes nor an asm-specification are allowed
-                on a function-definition.  */
-             if (asm_specification)
-               error_at (asm_spec_start_token->location,
-                         "an asm-specification is not allowed "
-                         "on a function-definition");
-             if (attributes)
-               error_at (attributes_start_token->location,
-                         "attributes are not allowed "
-                         "on a function-definition");
-             /* This is a function-definition.  */
-             *function_definition_p = true;
-
-             /* Parse the function definition.  */
-             if (member_p)
-               decl = cp_parser_save_member_function_body (parser,
-                                                           decl_specifiers,
-                                                           declarator,
-                                                           prefix_attributes);
-             else
-               decl =
-                 (cp_parser_function_definition_from_specifiers_and_declarator
-                  (parser, decl_specifiers, prefix_attributes, declarator));
 
-             if (decl != error_mark_node && DECL_STRUCT_FUNCTION (decl))
-               {
-                 /* This is where the prologue starts...  */
-                 DECL_STRUCT_FUNCTION (decl)->function_start_locus
-                   = func_brace_location;
-               }
+         location_t func_brace_location
+           = cp_lexer_peek_token (parser->lexer)->location;
 
-             return decl;
+         /* Neither attributes nor an asm-specification are allowed
+            on a function-definition.  */
+         if (asm_specification)
+           error_at (asm_spec_start_token->location,
+                     "an asm-specification is not allowed "
+                     "on a function-definition");
+         if (attributes)
+           error_at (attributes_start_token->location,
+                     "attributes are not allowed "
+                     "on a function-definition");
+         /* This is a function-definition.  */
+         *function_definition_p = true;
+
+         /* Parse the function definition.  */
+         if (member_p)
+           decl = cp_parser_save_member_function_body (parser,
+                                                       decl_specifiers,
+                                                       declarator,
+                                                       prefix_attributes);
+         else
+           decl =
+             (cp_parser_function_definition_from_specifiers_and_declarator
+              (parser, decl_specifiers, prefix_attributes, declarator));
+
+         if (decl != error_mark_node && DECL_STRUCT_FUNCTION (decl))
+           {
+             /* This is where the prologue starts...  */
+             DECL_STRUCT_FUNCTION (decl)->function_start_locus
+               = func_brace_location;
            }
+
+         return decl;
        }
-      else if (parser->fully_implicit_function_template_p)
-       decl = finish_fully_implicit_template (parser, decl);
     }
 
   /* [dcl.dcl]
@@ -16581,6 +16577,15 @@ cp_parser_init_declarator (cp_parser* parser,
   if (!friend_p && pushed_scope)
     pop_scope (pushed_scope);
 
+  if (function_declarator_p (declarator)
+      && parser->fully_implicit_function_template_p)
+    {
+      if (member_p)
+       decl = finish_fully_implicit_template (parser, decl);
+      else
+       finish_fully_implicit_template (parser, /*member_decl_opt=*/0);
+    }
+
   return decl;
 }