diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/testsuite/gcc.c-torture/execute/pr103209.c | 36 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/pta-callused.c | 2 | ||||
-rw-r--r-- | gcc/tree-ssa-structalias.c | 2 |
3 files changed, 38 insertions, 2 deletions
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr103209.c b/gcc/testsuite/gcc.c-torture/execute/pr103209.c new file mode 100644 index 0000000..4816893 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr103209.c @@ -0,0 +1,36 @@ +#include <stdio.h> +#include <stdint.h> + +int32_t a[6]; +int64_t b; +int32_t *c; +int32_t **d = &c; +int64_t *e = &b; +int32_t **const *f = &d; +int32_t **const **g = &f; +int32_t *h(); +static int16_t j(); +static uint32_t k(int8_t, const int32_t *, int64_t); +static uint32_t l() { + int32_t *m = &a[3]; + int32_t n = 0; + int8_t o = 0; + int32_t *p[] = {&n, &n, &n, &n}; + uint32_t q[6][1][2] = {}; + for (o = 0; o <= 1; o = 6) + if (h(j(k(3, 0, q[2][0][0]), &n), n) == p[3]) + *m = *e; + return 0; +} +int32_t *h(uint32_t, int32_t) { return ***g; } +int16_t j(uint32_t, int32_t *r) { **f = r; return 0;} +uint32_t k(int8_t, const int32_t *, int64_t) { *e = 3; return 0;} +int main() { + int i = 0; + l(); + for (i = 0; i < 6; i++){ + if (i == 3 && a[i] != 3) + __builtin_abort (); + } + return 0; +} diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pta-callused.c b/gcc/testsuite/gcc.dg/tree-ssa/pta-callused.c index aa639b4..b9a57d8 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/pta-callused.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/pta-callused.c @@ -22,5 +22,5 @@ int bar (int b) return *foo (&q); } -/* { dg-final { scan-tree-dump "CALLUSED\\(\[0-9\]+\\) = { NONLOCAL f.* i q }" "alias" } } */ +/* { dg-final { scan-tree-dump "CALLUSED\\(\[0-9\]+\\) = { ESCAPED NONLOCAL f.* i q }" "alias" } } */ diff --git a/gcc/tree-ssa-structalias.c b/gcc/tree-ssa-structalias.c index 153ddf5..34fd47f 100644 --- a/gcc/tree-ssa-structalias.c +++ b/gcc/tree-ssa-structalias.c @@ -4996,7 +4996,7 @@ find_func_aliases_for_call (struct function *fn, gcall *t) reachable from their arguments, but they are not an escape point for reachable memory of their arguments. */ else if (flags & (ECF_PURE|ECF_LOOPING_CONST_OR_PURE)) - handle_rhs_call (t, &rhsc, implicit_pure_eaf_flags, true, false); + handle_rhs_call (t, &rhsc, implicit_pure_eaf_flags, false, true); /* If the call is to a replaceable operator delete and results from a delete expression as opposed to a direct call to such operator, then the effects for PTA (in particular |