https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109112
--- Comment #13 from Ivan Lazaric <ivan.lazaric.gcc at gmail dot com> ---
A couple additional examples:
```cpp
struct S {
bool x;
bool pred() { return x; }
};
struct T : S {};
void do_something();
// optimized into just `ret`
void foo_builtin(T& t) {
if (t.pred()) __builtin_unreachable();
if (t.pred()) do_something();
}
// fails to optimize
// optimizes if `S&` instead of `T&` parameter
// optimizes if `t.x` instead of `t.pred()`
void foo_attribute(T& t) {
[[assume(!t.pred())]];
if (t.pred()) do_something();
}
```
```cpp
using el = int;
struct S {
el i;
bool pred() { return i != 42; }
};
void do_something();
// optimizes to just `ret`
void foo_builtin(S& s) {
if (s.pred()) __builtin_unreachable();
if (s.pred()) do_something();
}
// fails to optimize
// optimizes if `int i;` in `S` instead of `el i;`
void foo_attribute(S& s) {
[[assume(!s.pred())]];
if (s.pred()) do_something();
}
```