blob: b39f90f3397fbbe208d6090e7529626329f5e216 [file] [log] [blame]
// P0892R2
// { dg-do compile }
// { dg-options "-std=c++2a" }
constexpr int fn0 () { return 0; }
constexpr int fn1 () { return 1; }
struct S {
explicit(true) S(int);
explicit(1 == 0) S(int, int);
explicit(fn0()) S(int, int, int);
explicit(fn1()) S(int, int, int, int);
};
struct X {
static const bool value = true;
static constexpr bool foo () { return 1; }
};
struct T {
explicit(true ? 1 : throw 1) T(int);
explicit(true || true ? 1 : throw 1) T(int, int);
explicit(X::value) T(int, int, int);
explicit(X::foo ()) T(int, int, int, int);
};
struct W {
constexpr operator bool() { return true; };
};
struct W2 {
constexpr operator bool() { return false; };
};
struct U {
explicit(W()) U(int);
explicit(W2()) U(int, int);
};
int
main ()
{
S s1 = { 1 }; // { dg-error "converting" }
S s1x{ 1 };
S s2 = { 2, 3 };
S s3 = { 4, 5, 6 };
S s4 = { 7, 8, 9, 10 }; // { dg-error "converting" }
S s4x{ 7, 8, 9, 10 };
T t1 = { 1 }; // { dg-error "converting" }
T t2 = { 1, 2 }; // { dg-error "converting" }
T t3 = { 1, 2, 3 }; // { dg-error "converting" }
T t4 = { 1, 2, 3, 4 }; // { dg-error "converting" }
T t5{ 1 };
T t6{ 1, 2 };
T t7{ 1, 2, 3 };
T t8{ 1, 2, 3, 4 };
U u1 = { 1 }; // { dg-error "converting" }
U u2{ 1 };
U u3 = { 1, 2 };
U u4 { 1, 2 };
}