| /* { dg-do compile } */ |
| /* { dg-options "-Wall -O3" } */ |
| |
| typedef __SIZE_TYPE__ size_t; |
| |
| struct S { |
| int *p0, *p1, *p2; |
| |
| size_t size () const { return p1 - p0; } |
| |
| void f (size_t n) { |
| if (n > size ()) // can't happen because |
| foo (n - size ()); // n is in [1, MIN(size() - 1, 3)] |
| else if (n < size ()) |
| bar (p0 + n); |
| } |
| |
| void foo (size_t n) |
| { |
| size_t left = (size_t)(p2 - p1); |
| if (left >= n) |
| __builtin_memset (p2, 0, n * sizeof *p2); // { dg-bogus "maximum object size" } |
| |
| } |
| |
| void bar (int*); |
| }; |
| |
| void f (S &s) |
| { |
| size_t n = s.size (); |
| if (n > 1 && n < 5) |
| s.f (n - 1); |
| } |