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:
Richard Biener 2021-07-21 09:14:24 +02:00
parent 841548f0f7
commit e63d76234d
2 changed files with 18 additions and 4 deletions

View file

@ -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)

View 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;
}