annotate gcc/testsuite/gcc.dg/pure-2.c @ 111:04ced10e8804

gcc 7
author kono
date Fri, 27 Oct 2017 22:46:09 +0900
parents
children 1830386684a0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* { dg-do compile } */
kono
parents:
diff changeset
2 /* { dg-options "-O2 -Wsuggest-attribute=pure" } */
kono
parents:
diff changeset
3 /* { dg-add-options bind_pic_locally } */
kono
parents:
diff changeset
4
kono
parents:
diff changeset
5 extern int extern_const(int a) __attribute__ ((pure));
kono
parents:
diff changeset
6 extern int v;
kono
parents:
diff changeset
7
kono
parents:
diff changeset
8 /* Trivial. */
kono
parents:
diff changeset
9 int
kono
parents:
diff changeset
10 foo1(int a) /* { dg-bogus "normally" "detect pure candidate" } */
kono
parents:
diff changeset
11 { /* { dg-warning "pure" "detect pure candidate" { target *-*-* } "10" } */
kono
parents:
diff changeset
12 return v;
kono
parents:
diff changeset
13 }
kono
parents:
diff changeset
14
kono
parents:
diff changeset
15 /* Loops known to be normally and extern const calls should be safe. */
kono
parents:
diff changeset
16 int __attribute__ ((noinline))
kono
parents:
diff changeset
17 foo2(int n) /* { dg-bogus "normally" "detect pure candidate" } */
kono
parents:
diff changeset
18 { /* { dg-warning "pure" "detect pure candidate" { target *-*-* } "17" } */
kono
parents:
diff changeset
19 int ret = 0;
kono
parents:
diff changeset
20 int i;
kono
parents:
diff changeset
21 for (i=0; i<n; i++)
kono
parents:
diff changeset
22 ret+=extern_const (i);
kono
parents:
diff changeset
23 return ret;
kono
parents:
diff changeset
24 }
kono
parents:
diff changeset
25
kono
parents:
diff changeset
26 /* No warning here; we can work it by ourselves. */
kono
parents:
diff changeset
27 static int __attribute__ ((noinline))
kono
parents:
diff changeset
28 foo2b(int n)
kono
parents:
diff changeset
29 {
kono
parents:
diff changeset
30 int ret = 0;
kono
parents:
diff changeset
31 int i;
kono
parents:
diff changeset
32 for (i=0; i<n; i++)
kono
parents:
diff changeset
33 ret+=extern_const (i);
kono
parents:
diff changeset
34 return ret;
kono
parents:
diff changeset
35 }
kono
parents:
diff changeset
36
kono
parents:
diff changeset
37 /* Unbounded loops are not safe. */
kono
parents:
diff changeset
38 static int __attribute__ ((noinline))
kono
parents:
diff changeset
39 foo3(unsigned int n) /* { dg-warning "pure\[^\n\]* normally" "detect pure candidate" } */
kono
parents:
diff changeset
40 {
kono
parents:
diff changeset
41 int ret = 0;
kono
parents:
diff changeset
42 unsigned int i;
kono
parents:
diff changeset
43 for (i=0; extern_const (i+n); n++)
kono
parents:
diff changeset
44 ret+=extern_const (i);
kono
parents:
diff changeset
45 return ret;
kono
parents:
diff changeset
46 }
kono
parents:
diff changeset
47
kono
parents:
diff changeset
48 int
kono
parents:
diff changeset
49 foo4(int n) /* { dg-warning "pure\[^\n\]* normally" "detect pure candidate" } */
kono
parents:
diff changeset
50 {
kono
parents:
diff changeset
51 return foo3(n) + foo2b(n);
kono
parents:
diff changeset
52 }
kono
parents:
diff changeset
53
kono
parents:
diff changeset
54 int
kono
parents:
diff changeset
55 foo5(int n) /* { dg-bogus "normally" "detect pure candidate" } */
kono
parents:
diff changeset
56 { /* { dg-warning "pure" "detect pure candidate" { target *-*-* } "55" } */
kono
parents:
diff changeset
57 return foo2(n);
kono
parents:
diff changeset
58 }