diff options
author | Jason Merrill <jason@redhat.com> | 2022-09-12 12:59:46 -0400 |
---|---|---|
committer | Jason Merrill <jason@redhat.com> | 2022-09-12 12:59:46 -0400 |
commit | 7c989a8ed47228bdd494a2f0d1f6fdd325f953d7 (patch) | |
tree | 65ce7ea863471bd1ff041b5751cf32a0e3b78c9f | |
parent | 8ef5fa4c56c82dfbd6e8fc5e4e08c4be843abc3e (diff) | |
download | gcc-7c989a8ed47228bdd494a2f0d1f6fdd325f953d7.zip gcc-7c989a8ed47228bdd494a2f0d1f6fdd325f953d7.tar.gz gcc-7c989a8ed47228bdd494a2f0d1f6fdd325f953d7.tar.bz2 |
c++: lambda capture of array with deduced bounds [PR106567]
We can't use the type of an array variable directly if we haven't deduced
its length yet.
PR c++/106567
gcc/cp/ChangeLog:
* lambda.cc (type_deducible_expression_p): Check
array_of_unknown_bound_p.
gcc/testsuite/ChangeLog:
* g++.dg/cpp0x/lambda/lambda-array4.C: New test.
-rw-r--r-- | gcc/cp/lambda.cc | 1 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/lambda/lambda-array4.C | 29 |
2 files changed, 30 insertions, 0 deletions
diff --git a/gcc/cp/lambda.cc b/gcc/cp/lambda.cc index 3fb98a9..3ee1fe9 100644 --- a/gcc/cp/lambda.cc +++ b/gcc/cp/lambda.cc @@ -198,6 +198,7 @@ type_deducible_expression_p (tree expr) tree t = non_reference (TREE_TYPE (expr)); return (t && TREE_CODE (t) != TYPE_PACK_EXPANSION && !WILDCARD_TYPE_P (t) && !LAMBDA_TYPE_P (t) + && !array_of_unknown_bound_p (t) && !type_uses_auto (t)); } diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-array4.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-array4.C new file mode 100644 index 0000000..94ec7f8 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-array4.C @@ -0,0 +1,29 @@ +// PR c++/106567 +// { dg-do compile { target c++11 } } + +template <class V> +void urgh() +{ + const V x[] = {V(0), V(1), V(2), V(0)}; + + [&]() { + for (auto& v : x) {} + }(); +} + +void no_urgh() +{ + using V = int; + + const V x[] = {V(0), V(1), V(2), V(0)}; + + [&]() { + for (auto& v : x) {} + }(); +} + +int main() +{ + no_urgh(); + urgh<int>(); +} |