/* { dg-do run } */ /* { dg-options "-fdump-tree-alias-details" } */ /* { dg-skip-if "" { *-*-* } { "-O0" "-fno-fat-lto-objects" } { "" } } */ extern void abort (void); int *g; int dummy; int * __attribute__((noinline,const,noipa)) foo_const(int *p) { return p; } int * __attribute__((noinline,pure,noipa)) foo_pure(int *p) { return p + dummy; } int * __attribute__((noinline,noipa)) foo_normal(int *p) { g = p; return p; } void test_const(void) { int i; int *p = &i; int *q_const = foo_const(p); *p = 1; *q_const = 2; if (*p != 2) abort (); } void test(void) { int i; int *p = &i; int *q_normal = foo_normal(p); *p = 1; *q_normal = 2; if (*p != 2) abort (); } void test_pure(void) { int i; int *p = &i; int *q_pure = foo_pure(p); *p = 1; *q_pure = 2; if (*p != 2) abort (); } int main() { test_const(); test(); test_pure(); return 0; } /* { dg-final { scan-tree-dump "q_const_. = { NONLOCAL i }" "alias" } } */ /* { dg-final { scan-tree-dump "q_pure_. = { ESCAPED NONLOCAL i }" "alias" } } */ /* { dg-final { scan-tree-dump "q_normal_. = { ESCAPED NONLOCAL i }" "alias" } } */