mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-23 07:00:27 +08:00
c++: Fix sizeof VLA lambda capture.
sizeof a VLA type is not a constant in C or the GNU C++ extension, so we need to capture the VLA even in unevaluated context. For PR60855 we stopped looking through a previous capture, but we also need to capture the first time the variable is mentioned. PR c++/86216 * semantics.c (process_outer_var_ref): Capture VLAs even in unevaluated context.
This commit is contained in:
parent
e98ebda074
commit
00a49cd840
@ -1,5 +1,9 @@
|
||||
2020-01-31 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/86216
|
||||
* semantics.c (process_outer_var_ref): Capture VLAs even in
|
||||
unevaluated context.
|
||||
|
||||
PR c++/14179
|
||||
* decl.c (reshape_init_array_1): Reuse a single CONSTRUCTOR with
|
||||
non-aggregate elements.
|
||||
|
@ -3524,8 +3524,15 @@ tree
|
||||
process_outer_var_ref (tree decl, tsubst_flags_t complain, bool odr_use)
|
||||
{
|
||||
if (cp_unevaluated_operand)
|
||||
/* It's not a use (3.2) if we're in an unevaluated context. */
|
||||
return decl;
|
||||
{
|
||||
tree type = TREE_TYPE (decl);
|
||||
if (!dependent_type_p (type)
|
||||
&& variably_modified_type_p (type, NULL_TREE))
|
||||
/* VLAs are used even in unevaluated context. */;
|
||||
else
|
||||
/* It's not a use (3.2) if we're in an unevaluated context. */
|
||||
return decl;
|
||||
}
|
||||
if (decl == error_mark_node)
|
||||
return decl;
|
||||
|
||||
|
13
gcc/testsuite/g++.dg/cpp0x/lambda/lambda-vla5.C
Normal file
13
gcc/testsuite/g++.dg/cpp0x/lambda/lambda-vla5.C
Normal file
@ -0,0 +1,13 @@
|
||||
// PR c++/86216
|
||||
// { dg-do compile { target c++11 } }
|
||||
// { dg-additional-options -Wno-vla }
|
||||
|
||||
template <typename T> void b(int n, T arg) {
|
||||
int buffer[arg];
|
||||
int buffer2[arg][arg];
|
||||
[&] {
|
||||
n = sizeof(buffer);
|
||||
n = sizeof(buffer2); // { dg-bogus "sorry" "" { xfail *-*-* } }
|
||||
}();
|
||||
}
|
||||
int main() { b(2, 3); }
|
Loading…
x
Reference in New Issue
Block a user