diff options
author | Richard Biener <rguenther@suse.de> | 2021-07-21 09:14:24 +0200 |
---|---|---|
committer | Richard Biener <rguenther@suse.de> | 2021-07-29 08:13:29 +0200 |
commit | e63d76234d18cac731c4f3610d513bd8b39b5520 (patch) | |
tree | 2756a25fa6e99a59105ff653df8d5e8d7bf4bdc7 | |
parent | 841548f0f7d375c5b7022e19d588061cda3acfa6 (diff) | |
download | gcc-e63d76234d18cac731c4f3610d513bd8b39b5520.zip gcc-e63d76234d18cac731c4f3610d513bd8b39b5520.tar.gz gcc-e63d76234d18cac731c4f3610d513bd8b39b5520.tar.bz2 |
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.
-rw-r--r-- | gcc/c-family/c-common.c | 11 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr101512.c | 11 |
2 files changed, 18 insertions, 4 deletions
diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c index aacdfb4..21da679 100644 --- a/gcc/c-family/c-common.c +++ b/gcc/c-family/c-common.c @@ -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) diff --git a/gcc/testsuite/gcc.dg/torture/pr101512.c b/gcc/testsuite/gcc.dg/torture/pr101512.c new file mode 100644 index 0000000..a25da2a --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr101512.c @@ -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; +} |