annotate gcc/testsuite/gcc.dg/torture/20200311-1.c @ 152:2b5abeee2509

update gcc11
author anatofuz
date Mon, 25 May 2020 07:50:57 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
152
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1 /* { dg-do run } */
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
2
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
3 struct list { struct list *n; };
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
4
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
5 struct obj {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
6 int n;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
7 struct list l;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
8 } _o;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
9
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
10 struct list _l = { .n = &_o.l };
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
11
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
12 int main(int argc, char *argv[])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
13 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
14 struct obj *o = &_o;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
15 _o.l.n = &_l;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
16 while (&o->l != &_l)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
17 /* Note the following is invoking undefined behavior but in
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
18 this kind of "obvious" cases we don't want to break things
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
19 unnecessarily and thus we avoid analyzing o as pointing
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
20 to nothing via the undefined pointer subtraction. Instead
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
21 we canonicalize the pointer subtraction followed by the
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
22 pointer conversion to pointer offsetting. */
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
23 o = ((struct obj *)((const char *)(o->l.n)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
24 - (const char *)&((struct obj *)0)->l));
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
25 return 0;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
26 }