1 // { dg-do run }
2 // { dg-additional-options "-fstrict-aliasing" }
3 
4 template <typename = void> struct Optional {
is_presentOptional5   auto is_present() const { const bool &p = inner.present; return p; }
set_presentOptional6   auto set_present() { if (not is_present()) inner.present = true; }
7   struct InnerType {
8     bool present = false;
9     char padding[1] = {0};
10   };
11   using inner_t = InnerType;
12   inner_t inner = {};
13 };
14 
15 template <typename WrappedType> struct Wrapper {
16   auto operator-> () { return value; }
17   WrappedType *value;
18 };
19 
foo(Optional<> & x)20 void __attribute__((noipa)) foo(Optional<>& x) {}
21 
main()22 int main()
23 {
24   Optional<> buf{};
25   foo(buf);
26   Wrapper<Optional<>> wo = {&buf};
27   wo->set_present();
28   auto x = wo->is_present();
29   if (!x)
30     __builtin_abort ();
31 }
32