aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/lambda.c4
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/lambda/lambda-vla2.C2
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/lambda/lambda-vla3.C10
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/vla7.C4
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/vla9.C2
6 files changed, 22 insertions, 6 deletions
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 <jason@redhat.com>
+
+ 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 <jason@redhat.com>
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);