mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-10 23:17:48 +08:00
[PR c++/86610] lambda captures in templates
https://gcc.gnu.org/ml/gcc-patches/2019-01/msg00948.html PR c++/86610 * semantics.c (process_outer_var_ref): Only skip dependent types in templates. PR c++/86610 * g++.dg/cpp0x/pr86610.C: New. From-SVN: r268016
This commit is contained in:
parent
fc881de282
commit
e32fc4499f
@ -1,3 +1,9 @@
|
||||
2019-01-17 Nathan Sidwell <nathan@acm.org>
|
||||
|
||||
PR c++/86610
|
||||
* semantics.c (process_outer_var_ref): Only skip dependent types
|
||||
in templates.
|
||||
|
||||
2019-01-17 Alexandre Oliva <aoliva@redhat.com>
|
||||
|
||||
PR c++/87768
|
||||
|
@ -3438,10 +3438,9 @@ process_outer_var_ref (tree decl, tsubst_flags_t complain, bool odr_use)
|
||||
}
|
||||
|
||||
/* 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)
|
||||
|
@ -1,3 +1,8 @@
|
||||
2019-01-17 Nathan Sidwell <nathan@acm.org>
|
||||
|
||||
PR c++/86610
|
||||
* g++.dg/cpp0x/pr86610.C: New.
|
||||
|
||||
2019-01-17 Wei Xiao <wei3.xiao@intel.com>
|
||||
|
||||
* gcc.target/i386/avx512f-vfixupimmpd-2.c: Fix the test cases for
|
||||
|
31
gcc/testsuite/g++.dg/cpp0x/pr86610.C
Normal file
31
gcc/testsuite/g++.dg/cpp0x/pr86610.C
Normal file
@ -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 <typename T>
|
||||
int f()
|
||||
{
|
||||
C c;
|
||||
T d;
|
||||
return [=] { return c[0]; }()
|
||||
+ [=] { return c[0] + d[0]; }();
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
return q () + f<C>();
|
||||
}
|
Loading…
Reference in New Issue
Block a user