@@ -18372,11 +18372,21 @@ cp_parser_parameter_declaration_list (cp_parser* parser, bool *is_error)
parser->in_unbraced_linkage_specification_p
= saved_in_unbraced_linkage_specification_p;
+ /* Reset implicit_template_scope if we are about to leave the function
+ parameter list that introduced it. Note that for out-of-line member
+ definitions, there will be one or more class scopes before we get to
+ the template parameter scope. */
+
if (cp_binding_level *its = parser->implicit_template_scope)
- if (current_binding_level->level_chain == its)
+ if (cp_binding_level *maybe_its = current_binding_level->level_chain)
{
- parser->implicit_template_parms = 0;
- parser->implicit_template_scope = 0;
+ while (maybe_its->kind == sk_class)
+ maybe_its = maybe_its->level_chain;
+ if (maybe_its == its)
+ {
+ parser->implicit_template_parms = 0;
+ parser->implicit_template_scope = 0;
+ }
}
return parameters;
new file mode 100644
@@ -0,0 +1,15 @@
+// PR c++/60052
+// { dg-do compile }
+// { dg-options "-std=c++1y" }
+
+struct A
+{
+ void foo(auto);
+};
+
+void A::foo(auto) {}
+
+struct B
+{
+ void bar(auto);
+};