1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
|
// PR c++/51222
// { dg-do compile { target c++11 } }
template<class T>
struct add_rref {
typedef T&& type;
};
template<>
struct add_rref<void> {
typedef void type;
};
template<class T>
typename add_rref<T>::type declval();
template<class T, class U, class =
decltype(::delete ::new T(declval<U>()))
>
auto f(int) -> char;
template<class, class>
auto f(...) -> char(&)[2];
template<class T, class =
decltype(::delete ::new T())
>
auto g(int) -> char;
template<class>
auto g(...) -> char(&)[2];
template<class T, class U>
auto f2(int) -> decltype(::delete ::new T(declval<U>()), char());
template<class, class>
auto f2(...) -> char(&)[2];
template<class T>
auto g2(int) -> decltype(::delete ::new T(), char());
template<class>
auto g2(...) -> char(&)[2];
struct C { };
struct A {
virtual ~A() = 0;
};
struct D1 {
D1() = delete;
};
struct D2 {
~D2() = delete;
};
static_assert(sizeof(g<void>(0)) == 2, "Ouch");
static_assert(sizeof(g<void()>(0)) == 2, "Ouch");
static_assert(sizeof(g<void() const>(0)) == 2, "Ouch");
static_assert(sizeof(g<A>(0)) == 2, "Ouch");
static_assert(sizeof(g<D1>(0)) == 2, "Ouch");
static_assert(sizeof(g<D2>(0)) == 2, "Ouch");
static_assert(sizeof(g<int&>(0)) == 2, "Ouch");
static_assert(sizeof(g<int&&>(0)) == 2, "Ouch");
static_assert(sizeof(g<void(&)()>(0)) == 2, "Ouch");
static_assert(sizeof(g<void(&&)()>(0)) == 2, "Ouch");
static_assert(sizeof(f<void, void>(0)) == 2, "Ouch");
static_assert(sizeof(f<void(), void()>(0)) == 2, "Ouch");
//static_assert(sizeof(f<void() const, void() const>(0)) == 2, "Ouch");
static_assert(sizeof(f<int, void>(0)) == 2, "Ouch");
static_assert(sizeof(f<void, int>(0)) == 2, "Ouch");
static_assert(sizeof(f<C, void>(0)) == 2, "Ouch");
static_assert(sizeof(f<C, int>(0)) == 2, "Ouch");
static_assert(sizeof(f<int&, int&>(0)) == 2, "Ouch");
static_assert(sizeof(f<int&&, int&&>(0)) == 2, "Ouch");
static_assert(sizeof(f<void(&)(), void(&)()>(0)) == 2, "Ouch");
static_assert(sizeof(f<void(&&)(), void(&&)()>(0)) == 2, "Ouch");
static_assert(sizeof(g2<void>(0)) == 2, "Ouch");
static_assert(sizeof(g2<void()>(0)) == 2, "Ouch");
static_assert(sizeof(g2<void() const>(0)) == 2, "Ouch");
static_assert(sizeof(g2<A>(0)) == 2, "Ouch");
static_assert(sizeof(g2<D1>(0)) == 2, "Ouch");
static_assert(sizeof(g2<D2>(0)) == 2, "Ouch");
static_assert(sizeof(g2<int&>(0)) == 2, "Ouch");
static_assert(sizeof(g2<int&&>(0)) == 2, "Ouch");
static_assert(sizeof(g2<void(&)()>(0)) == 2, "Ouch");
static_assert(sizeof(g2<void(&&)()>(0)) == 2, "Ouch");
static_assert(sizeof(f2<void, void>(0)) == 2, "Ouch");
static_assert(sizeof(f2<void(), void()>(0)) == 2, "Ouch");
//static_assert(sizeof(f2<void() const, void() const>(0)) == 2, "Ouch");
static_assert(sizeof(f2<int, void>(0)) == 2, "Ouch");
static_assert(sizeof(f2<void, int>(0)) == 2, "Ouch");
static_assert(sizeof(f2<C, void>(0)) == 2, "Ouch");
static_assert(sizeof(f2<C, int>(0)) == 2, "Ouch");
static_assert(sizeof(f2<int&, int&>(0)) == 2, "Ouch");
static_assert(sizeof(f2<int&&, int&&>(0)) == 2, "Ouch");
static_assert(sizeof(f2<void(&)(), void(&)()>(0)) == 2, "Ouch");
static_assert(sizeof(f2<void(&&)(), void(&&)()>(0)) == 2, "Ouch");
|