| /* { dg-do compile { target { nonpic || pie_enabled } } } */ |
| /* { dg-options "-O2 -Wsuggest-attribute=const -fno-finite-loops" } */ |
| |
| extern int extern_const(int a) __attribute__ ((const)); |
| |
| /* Trivial. */ |
| int |
| foo1(int a) /* { dg-bogus "normally" "detect const candidate" } */ |
| { /* { dg-warning "const" "detect const candidate" { target *-*-* } "8" } */ |
| return extern_const (a); |
| } |
| |
| /* Loops known to be normally and extern const calls should be safe. */ |
| |
| int __attribute__ ((noinline)) |
| foo2(int n) /* { dg-bogus "normally" "detect const candidate" } */ |
| { /* { dg-warning "const" "detect const candidate" { target *-*-* } "16" } */ |
| int ret = 0; |
| int i; |
| for (i=0; i<n; i++) |
| ret+=extern_const (i); |
| return ret; |
| } |
| |
| /* No warning here; we can work it by ourselves. */ |
| static int __attribute__ ((noinline)) |
| foo2b(int n) |
| { |
| int ret = 0; |
| int i; |
| for (i=0; i<n; i++) |
| ret+=extern_const (i); |
| return ret; |
| } |
| |
| /* Unbounded loops are not safe. */ |
| static int __attribute__ ((noinline)) |
| foo3(unsigned int n) /* { dg-warning "const\[^\n\]* normally" "detect const candidate" } */ |
| { |
| int ret = 0; |
| unsigned int i; |
| for (i=0; extern_const (i+n); n++) |
| ret+=extern_const (i); |
| return ret; |
| } |
| |
| int |
| foo4(int n) /* { dg-warning "const\[^\n\]* normally" "detect const candidate" } */ |
| { |
| return foo3(n) + foo2b(n); |
| } |
| |
| int |
| foo5(int n) /* { dg-bogus "normally" "detect const candidate" } */ |
| { /* { dg-warning "const" "detect const candidate" { target *-*-* } "54" } */ |
| return foo2(n); |
| } |