| // RUN: %clang_cc1 -fsyntax-only -verify -std=c++20 %s |
| // expected-no-diagnostics |
| |
| template <bool v> |
| struct BC { |
| static constexpr bool value = v; |
| }; |
| |
| template <typename T, typename Arg> |
| struct Constructible : BC<__is_constructible(T, Arg)> {}; |
| |
| template <typename T> |
| using Requires = T::value; |
| |
| template <typename T> |
| struct optional { |
| template <typename U, Requires<Constructible<T, U>> = true> |
| optional(U) {} |
| }; |
| |
| struct MO {}; |
| struct S : MO {}; |
| struct TB { |
| TB(optional<S>) {} |
| }; |
| |
| class TD : TB, MO { |
| using TB::TB; |
| }; |
| |
| void foo() { |
| static_assert(Constructible<TD, TD>::value); |
| } |