diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 53bf2f5981c..1809b26a010 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2014-12-12 Jason Merrill + + PR c++/61402 + * lambda.c (add_capture): Don't pass a dependent type to + variably_modified_type_p. + 2014-12-11 Jason Merrill Remove N3639 "array of runtime length" from -std=c++14. diff --git a/gcc/cp/lambda.c b/gcc/cp/lambda.c index 9eb92006323..3da28e56883 100644 --- a/gcc/cp/lambda.c +++ b/gcc/cp/lambda.c @@ -483,7 +483,8 @@ add_capture (tree lambda, tree id, tree orig_init, bool by_reference_p, NULL_TREE, array_type_nelts (type)); type = vla_capture_type (type); } - else if (variably_modified_type_p (type, NULL_TREE)) + else if (!dependent_type_p (type) + && variably_modified_type_p (type, NULL_TREE)) { error ("capture of variable-size type %qT that is not an N3639 array " "of runtime bound", type); diff --git a/gcc/testsuite/g++.dg/cpp1y/lambda-init11.C b/gcc/testsuite/g++.dg/cpp1y/lambda-init11.C new file mode 100644 index 00000000000..f7525d8664a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/lambda-init11.C @@ -0,0 +1,20 @@ +// PR c++/61402 +// { dg-do run { target c++14 } } + +extern "C" void abort(); + +template +void foo(T t) { + auto test = [ i = ++t ](T v) { + if (i != v) + abort(); + }; + test(t); +} + +int main(){ + foo(3.14f); + foo(0); + foo('a'); + foo(false); +}