c/101512 - fix missing address-taking in c_common_mark_addressable_vec
c_common_mark_addressable_vec fails to look through C_MAYBE_CONST_EXPR in the case it isn't at the toplevel. 2021-07-21 Richard Biener <rguenther@suse.de> PR c/101512 gcc/c-family/ * c-common.c (c_common_mark_addressable_vec): Look through C_MAYBE_CONST_EXPR even if not at the toplevel. gcc/testsuite/ * gcc.dg/torture/pr101512.c: New testcase.
This commit is contained in:
parent
841548f0f7
commit
e63d76234d
2 changed files with 18 additions and 4 deletions
|
@ -6894,10 +6894,13 @@ complete_flexible_array_elts (tree init)
|
|||
void
|
||||
c_common_mark_addressable_vec (tree t)
|
||||
{
|
||||
if (TREE_CODE (t) == C_MAYBE_CONST_EXPR)
|
||||
t = C_MAYBE_CONST_EXPR_EXPR (t);
|
||||
while (handled_component_p (t))
|
||||
t = TREE_OPERAND (t, 0);
|
||||
while (handled_component_p (t) || TREE_CODE (t) == C_MAYBE_CONST_EXPR)
|
||||
{
|
||||
if (TREE_CODE (t) == C_MAYBE_CONST_EXPR)
|
||||
t = C_MAYBE_CONST_EXPR_EXPR (t);
|
||||
else
|
||||
t = TREE_OPERAND (t, 0);
|
||||
}
|
||||
if (!VAR_P (t)
|
||||
&& TREE_CODE (t) != PARM_DECL
|
||||
&& TREE_CODE (t) != COMPOUND_LITERAL_EXPR)
|
||||
|
|
11
gcc/testsuite/gcc.dg/torture/pr101512.c
Normal file
11
gcc/testsuite/gcc.dg/torture/pr101512.c
Normal file
|
@ -0,0 +1,11 @@
|
|||
/* { dg-do compile } */
|
||||
/* { dg-additional-options "-w -Wno-psabi" } */
|
||||
|
||||
int n();
|
||||
typedef unsigned long V __attribute__ ((vector_size (64)));
|
||||
V
|
||||
foo (int i, V v)
|
||||
{
|
||||
i = ((V)(V){n()})[n()];
|
||||
return v + i;
|
||||
}
|
Loading…
Add table
Reference in a new issue