From 13c60208d0428ad14b4bd41a63a47d67bd35253f Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Mon, 9 Apr 2018 11:32:05 -0400 Subject: [PATCH] PR c++/85256 - ICE capturing pointer to VLA. * lambda.c (add_capture): Distinguish between variable-size and variably-modified types. From-SVN: r259240 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/lambda.c | 4 ++-- gcc/testsuite/g++.dg/cpp0x/lambda/lambda-vla2.C | 2 +- gcc/testsuite/g++.dg/cpp0x/lambda/lambda-vla3.C | 10 ++++++++++ gcc/testsuite/g++.dg/cpp1y/vla7.C | 4 ++-- gcc/testsuite/g++.dg/cpp1y/vla9.C | 2 +- 6 files changed, 22 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/lambda/lambda-vla3.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index ba323bf..c375155 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2018-04-09 Jason Merrill + + PR c++/85256 - ICE capturing pointer to VLA. + * lambda.c (add_capture): Distinguish between variable-size and + variably-modified types. + 2018-04-06 Jason Merrill PR c++/85214 - ICE with alias, generic lambda, constexpr if. diff --git a/gcc/cp/lambda.c b/gcc/cp/lambda.c index 3740606..e9b962a 100644 --- a/gcc/cp/lambda.c +++ b/gcc/cp/lambda.c @@ -554,13 +554,13 @@ add_capture (tree lambda, tree id, tree orig_init, bool by_reference_p, 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 " + sorry ("capture of variably-modified type %qT that is not an N3639 array " "of runtime bound", type); if (TREE_CODE (type) == ARRAY_TYPE && variably_modified_type_p (TREE_TYPE (type), NULL_TREE)) inform (input_location, "because the array element type %qT has " "variable size", TREE_TYPE (type)); - type = error_mark_node; + return error_mark_node; } else { diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-vla2.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-vla2.C index d4de131..aee9694 100644 --- a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-vla2.C +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-vla2.C @@ -7,6 +7,6 @@ void f() { int m = 1; int d[n][m]; [&]() { - return d[1]; // { dg-error "variabl" } + return d[1]; // { dg-prune-output "sorry" } }(); } diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-vla3.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-vla3.C new file mode 100644 index 0000000..eebdbcd --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-vla3.C @@ -0,0 +1,10 @@ +// PR c++/85256 +// { dg-do compile { target c++11 } } +// { dg-additional-options -Wno-vla } + +void foo(int i) +{ + int (*x)[i]; + [=]{ [=]{ 0 ? x : x; }; }; // { dg-bogus "sorry" "" { xfail *-*-* } } + +} diff --git a/gcc/testsuite/g++.dg/cpp1y/vla7.C b/gcc/testsuite/g++.dg/cpp1y/vla7.C index df34c82..afa5fac 100644 --- a/gcc/testsuite/g++.dg/cpp1y/vla7.C +++ b/gcc/testsuite/g++.dg/cpp1y/vla7.C @@ -6,7 +6,7 @@ int main(int argc, char** argv) { int x[1][argc]; - [&x](int i) { // { dg-error "variable.size" } - x[0][i] = 0; // { dg-prune-output "assignment" } + [&x](int i) { // { dg-prune-output "sorry" } + x[0][i] = 0; // { dg-prune-output "not captured" } }(5); } diff --git a/gcc/testsuite/g++.dg/cpp1y/vla9.C b/gcc/testsuite/g++.dg/cpp1y/vla9.C index 939de30..2c5b3a5 100644 --- a/gcc/testsuite/g++.dg/cpp1y/vla9.C +++ b/gcc/testsuite/g++.dg/cpp1y/vla9.C @@ -25,7 +25,7 @@ int main(){ fa[0][1]=1.8; auto fx=[&](){ for(int c=0; c<2; c++){ - printf("use me", fa[0][c]); // { dg-error "capture of variable-size type" } + printf("use me", fa[0][c]); // { dg-prune-output "sorry" } } }; call(fx); -- 2.7.4