From 8bebb9532b4724afacf514dfe1f0d127cb7f6f07 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Mon, 23 Dec 2013 23:22:23 -0500 Subject: [PATCH] re PR c++/59271 (a.C:16:21: internal compiler error: in strip_typedefs, at cp/tree.c:1315) PR c++/59271 * lambda.c (build_capture_proxy): Use build_cplus_array_type. From-SVN: r206193 --- gcc/cp/ChangeLog | 3 +++ gcc/cp/lambda.c | 4 ++-- .../g++.dg/cpp1y/lambda-generic-vla1.C | 24 +++++++++++++++++++ 3 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp1y/lambda-generic-vla1.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index c921f203ac9..242342b5453 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,8 @@ 2013-12-23 Jason Merrill + PR c++/59271 + * lambda.c (build_capture_proxy): Use build_cplus_array_type. + PR c++/59349 * parser.c (cp_parser_lambda_introducer): Handle empty init. diff --git a/gcc/cp/lambda.c b/gcc/cp/lambda.c index 24aa2c55cc0..bd8df1d94a9 100644 --- a/gcc/cp/lambda.c +++ b/gcc/cp/lambda.c @@ -377,8 +377,8 @@ build_capture_proxy (tree member) tree ptr = build_simple_component_ref (object, field); field = next_initializable_field (DECL_CHAIN (field)); tree max = build_simple_component_ref (object, field); - type = build_array_type (TREE_TYPE (TREE_TYPE (ptr)), - build_index_type (max)); + type = build_cplus_array_type (TREE_TYPE (TREE_TYPE (ptr)), + build_index_type (max)); type = build_reference_type (type); REFERENCE_VLA_OK (type) = true; object = convert (type, ptr); diff --git a/gcc/testsuite/g++.dg/cpp1y/lambda-generic-vla1.C b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-vla1.C new file mode 100644 index 00000000000..556722ca62d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-vla1.C @@ -0,0 +1,24 @@ +// PR c++/59271 +// { dg-options -std=c++1y } + +extern "C" int printf (const char *, ...); + +void f(int n) +{ + int a[n]; + + for (auto& i : a) + { + i = &i - a; + } + + [&a] (auto m) + { + for (auto i : a) + { + printf ("%d", i); + } + + return m; + }; +} -- 2.30.2