// PR c++/105550
// { dg-do compile { target c++14 } }

struct A {
  const A *p = this;
};

struct B {
  const B *p = this;
  constexpr operator A() const { return {}; }
};

constexpr A
bar (A)
{
  return {};
}

constexpr A baz() { return {}; }

struct E {
  A a1 = true ? A{} : A{};
  A a2 = true ? A{} : B{};
  A a3 = false ? A{} : B{};
  A a4 = false ? B{} : B{};
  A a5 = A{};
  A a6 = B{};
  A a7 = false ? B{} : (true ? A{} : A{});
  A a8 = false ? (true ? A{} : B{}) : (true ? A{} : A{});
  A a9 = (A{});
  A a10 = (true, A{});
  A a11 = bar (A{});
  A a12 = baz ();
  A a13 = (A{}, A{});
};

constexpr E e{};

constexpr A a1 = true ? A{} : A{};
constexpr A a2 = true ? A{} : B{};
constexpr A a3 = false ? A{} : B{};
constexpr A a4 = false ? B{} : B{};
constexpr A a5 = A{};
constexpr A a6 = B{};
constexpr A a7 = false ? B{} : (true ? A{} : A{});
constexpr A a8 = false ? (true ? A{} : B{}) : (true ? A{} : A{});
constexpr A a9 = (A{});
constexpr A a10 = (true, A{});
constexpr A a11 = bar (A{});
//static_assert(a10.p == &a10, ""); // bug, 105619
constexpr A a12 = baz ();
//static_assert(a11.p == &a11, ""); // bug, 105619
constexpr A a13 = (A{}, A{});