1 /* { dg-do run } */ 2 /* { dg-options "-fdump-tree-alias" } */ 3 /* { dg-skip-if "" { *-*-* } { "-O0" "-fno-fat-lto-objects" } { "" } } */ 4 5 extern void abort (void); 6 int *g; 7 int dummy; 8 9 int * __attribute__((noinline,const)) foo_const(int * p)10foo_const(int *p) { return p; } 11 12 int * __attribute__((noinline,pure)) foo_pure(int * p)13foo_pure(int *p) { return p + dummy; } 14 15 int * __attribute__((noinline)) foo_normal(int * p)16foo_normal(int *p) { g = p; return p; } 17 test_const(void)18void test_const(void) 19 { 20 int i; 21 int *p = &i; 22 int *q_const = foo_const(p); 23 *p = 1; 24 *q_const = 2; 25 if (*p != 2) 26 abort (); 27 } 28 test(void)29void test(void) 30 { 31 int i; 32 int *p = &i; 33 int *q_normal = foo_normal(p); 34 *p = 1; 35 *q_normal = 2; 36 if (*p != 2) 37 abort (); 38 } 39 test_pure(void)40void test_pure(void) 41 { 42 int i; 43 int *p = &i; 44 int *q_pure = foo_pure(p); 45 *p = 1; 46 *q_pure = 2; 47 if (*p != 2) 48 abort (); 49 } 50 main()51int main() 52 { 53 test_const(); 54 test(); 55 test_pure(); 56 return 0; 57 } 58 59 /* { dg-final { scan-tree-dump "q_const_. = { NONLOCAL i }" "alias" } } */ 60 /* { dg-final { scan-tree-dump "q_pure_. = { ESCAPED NONLOCAL i }" "alias" } } */ 61 /* { dg-final { scan-tree-dump "q_normal_. = { ESCAPED NONLOCAL }" "alias" } } */ 62