2019-01-16 Nathan Sidwell PR c++/86610 * semantics.c (process_outer_var_ref): Only skip dependent types in templates. PR c++/86610 * g++.dg/cpp0x/pr86610.C: New. Index: cp/semantics.c =================================================================== --- cp/semantics.c (revision 267983) +++ cp/semantics.c (working copy) @@ -3438,10 +3438,9 @@ process_outer_var_ref (tree decl, tsubst } /* In a lambda within a template, wait until instantiation - time to implicitly capture. */ + time to implicitly capture a dependent type. */ if (context == containing_function - && DECL_TEMPLATE_INFO (containing_function) - && uses_template_parms (DECL_TI_ARGS (containing_function))) + && dependent_type_p (TREE_TYPE (decl))) return decl; if (lambda_expr && VAR_P (decl) Index: testsuite/g++.dg/cpp0x/pr86610.C =================================================================== --- testsuite/g++.dg/cpp0x/pr86610.C (revision 0) +++ testsuite/g++.dg/cpp0x/pr86610.C (working copy) @@ -0,0 +1,31 @@ +// { dg-do run { target c++11 } } +// PR c++86610 lambda capture inside template + +struct C +{ + int operator[](int) + { return 1; } + + int operator[](int) const + { return 0; } // Want this one +}; + +int q() +{ + C c; + return [=] { return c[0]; }(); +} + +template +int f() +{ + C c; + T d; + return [=] { return c[0]; }() + + [=] { return c[0] + d[0]; }(); +} + +int main() +{ + return q () + f(); +}