Commit 770e9be9 by Daniel Krugler Committed by Paolo Carlini

sfinae_friendly_1.cc: Update / extend.

2012-10-11  Daniel Krugler  <daniel.kruegler@googlemail.com>

	* testsuite/20_util/common_type/requirements/sfinae_friendly_1.cc:
	Update / extend.
	* testsuite/20_util/common_type/requirements/sfinae_friendly_2.cc:
	Likewise.
	* testsuite/20_util/duration/requirements/sfinae_friendly_1.cc:
	Likewise.

From-SVN: r192352
parent cb2bb1ed
...@@ -163,20 +163,23 @@ namespace std { ...@@ -163,20 +163,23 @@ namespace std {
}; };
} }
static_assert(is_type<std::common_type<int, int>, int>(), ""); #ifdef HAS_53000_FIXED
static_assert(is_type<std::common_type<ScEn, ScEn>, ScEn>(), ""); static_assert(is_type<std::common_type<int, int>, int&&>(), "");
static_assert(is_type<std::common_type<UnscEn, UnscEn>, UnscEn>(), ""); static_assert(is_type<std::common_type<ScEn, ScEn>, ScEn&&>(), "");
static_assert(is_type<std::common_type<int, int>, int>(), ""); static_assert(is_type<std::common_type<UnscEn, UnscEn>, UnscEn&&>(), "");
#endif
static_assert(is_type<std::common_type<UnscEn, int>, int>(), ""); static_assert(is_type<std::common_type<UnscEn, int>, int>(), "");
static_assert(is_type<std::common_type<int, int, int>, int>(), ""); #ifdef HAS_53000_FIXED
static_assert(is_type<std::common_type<int, int, int, int>, int>(), ""); static_assert(is_type<std::common_type<int, int, int>, int&&>(), "");
static_assert(is_type<std::common_type<int, int, int, int, int>, int>(), ""); static_assert(is_type<std::common_type<int, int, int, int>, int&&>(), "");
static_assert(is_type<std::common_type<S, S>, S>(), ""); static_assert(is_type<std::common_type<int, int, int, int, int>, int&&>(), "");
static_assert(is_type<std::common_type<const S, const S>, const S>(), ""); static_assert(is_type<std::common_type<S, S>, S&&>(), "");
static_assert(is_type<std::common_type<const S, const S>, const S&&>(), "");
static_assert(is_type<std::common_type<std::initializer_list<int>, static_assert(is_type<std::common_type<std::initializer_list<int>,
std::initializer_list<int>>, std::initializer_list<int>>(), ""); std::initializer_list<int>>, std::initializer_list<int>&&>(), "");
static_assert(is_type<std::common_type<B, D>, B>(), ""); static_assert(is_type<std::common_type<B, D>, B&&>(), "");
static_assert(is_type<std::common_type<D, B>, B>(), ""); static_assert(is_type<std::common_type<D, B>, B&&>(), "");
#endif
static_assert(is_type<std::common_type<F1, F2>, void*>(), ""); static_assert(is_type<std::common_type<F1, F2>, void*>(), "");
static_assert(is_type<std::common_type<F2, F1>, void*>(), ""); static_assert(is_type<std::common_type<F2, F1>, void*>(), "");
static_assert(is_type<std::common_type<G1, G2>, const volatile void*>(), ""); static_assert(is_type<std::common_type<G1, G2>, const volatile void*>(), "");
...@@ -189,10 +192,15 @@ static_assert(is_type<std::common_type<void, void>, void>(), ""); ...@@ -189,10 +192,15 @@ static_assert(is_type<std::common_type<void, void>, void>(), "");
static_assert(is_type<std::common_type<const void, const void>, void>(), ""); static_assert(is_type<std::common_type<const void, const void>, void>(), "");
static_assert(is_type<std::common_type<int&, int&&>, int>(), ""); static_assert(is_type<std::common_type<int&, int&&>, int>(), "");
static_assert(is_type<std::common_type<int&, int&>, int&>(), ""); static_assert(is_type<std::common_type<int&, int&>, int&>(), "");
static_assert(is_type<std::common_type<int&&, int&&>, int>(), ""); #ifdef HAS_53000_FIXED
static_assert(is_type<std::common_type<int&&, int&&>, int&&>(), "");
static_assert(is_type<std::common_type<int&&, const int&&>, const int&&>(), "");
#endif
static_assert(is_type<std::common_type<U&, const U&&>, const U>(), ""); static_assert(is_type<std::common_type<U&, const U&&>, const U>(), "");
static_assert(is_type<std::common_type<U&, U&>, U&>(), ""); static_assert(is_type<std::common_type<U&, U&>, U&>(), "");
static_assert(is_type<std::common_type<U&&, U&&>, U>(), ""); #ifdef HAS_53000_FIXED
static_assert(is_type<std::common_type<U&&, U&&>, U&&>(), "");
#endif
static_assert(is_type<std::common_type<int B::*, int D::*>, int D::*>(), ""); static_assert(is_type<std::common_type<int B::*, int D::*>, int D::*>(), "");
static_assert(is_type<std::common_type<int D::*, int B::*>, int D::*>(), ""); static_assert(is_type<std::common_type<int D::*, int B::*>, int D::*>(), "");
static_assert(is_type<std::common_type<const int B::*, volatile int D::*>, static_assert(is_type<std::common_type<const int B::*, volatile int D::*>,
...@@ -201,7 +209,9 @@ static_assert(is_type<std::common_type<int (B::*)(), int (D::*)()>, ...@@ -201,7 +209,9 @@ static_assert(is_type<std::common_type<int (B::*)(), int (D::*)()>,
int (D::*)()>(), ""); int (D::*)()>(), "");
static_assert(is_type<std::common_type<int (B::*)() const, int (D::*)() const>, static_assert(is_type<std::common_type<int (B::*)() const, int (D::*)() const>,
int (D::*)() const>(), ""); int (D::*)() const>(), "");
static_assert(is_type<std::common_type<int[3], int[3]>, int*>(), ""); #ifdef HAS_53000_FIXED
static_assert(is_type<std::common_type<int[3], int[3]>, int(&&)[3]>(), "");
#endif
static_assert(is_type<std::common_type<int[1], const int[3]>, static_assert(is_type<std::common_type<int[1], const int[3]>,
const int*>(), ""); const int*>(), "");
static_assert(is_type<std::common_type<void(), void()>, void(&)()>(), ""); static_assert(is_type<std::common_type<void(), void()>, void(&)()>(), "");
...@@ -213,14 +223,18 @@ static_assert(is_type<std::common_type<void(&&)(), void(&)()>, ...@@ -213,14 +223,18 @@ static_assert(is_type<std::common_type<void(&&)(), void(&)()>,
static_assert(is_type<std::common_type<void(&&)(), void(&&)()>, static_assert(is_type<std::common_type<void(&&)(), void(&&)()>,
void(&)()>(), ""); void(&)()>(), "");
static_assert(is_type<std::common_type<ImplicitTo<int>, int>, int>(), ""); static_assert(is_type<std::common_type<ImplicitTo<int>, int>, int>(), "");
#ifdef HAS_53000_FIXED
static_assert(is_type<std::common_type<ImplicitTo<int>, ImplicitTo<int>>, static_assert(is_type<std::common_type<ImplicitTo<int>, ImplicitTo<int>>,
ImplicitTo<int>>(), ""); ImplicitTo<int>&&>(), "");
#endif
static_assert(is_type<std::common_type<ImplicitTo<int>, int, static_assert(is_type<std::common_type<ImplicitTo<int>, int,
ImplicitTo<int>>, int>(), ""); ImplicitTo<int>>, int>(), "");
#ifdef HAS_53000_FIXED
static_assert(is_type<std::common_type<ExplicitTo<int>, ExplicitTo<int>>, static_assert(is_type<std::common_type<ExplicitTo<int>, ExplicitTo<int>>,
ExplicitTo<int>>(), ""); ExplicitTo<int>&&>(), "");
static_assert(is_type<std::common_type<decltype(lmd1), decltype(lmd1)>, static_assert(is_type<std::common_type<decltype(lmd1), decltype(lmd1)>,
decltype(lmd1)>(), ""); decltype(lmd1)&&>(), "");
#endif
static_assert(is_type<std::common_type<decltype(lmd1)&, decltype(lmd1)&>, static_assert(is_type<std::common_type<decltype(lmd1)&, decltype(lmd1)&>,
decltype(lmd1)&>(), ""); decltype(lmd1)&>(), "");
static_assert(is_type<std::common_type<decltype(lmd1)&, decltype(lmd2)&>, static_assert(is_type<std::common_type<decltype(lmd1)&, decltype(lmd2)&>,
...@@ -248,12 +262,12 @@ static_assert(is_type<std::common_type<UConv1&, UConv2&>, Abstract*>(), ""); ...@@ -248,12 +262,12 @@ static_assert(is_type<std::common_type<UConv1&, UConv2&>, Abstract*>(), "");
#ifdef HAS_53000_FIXED #ifdef HAS_53000_FIXED
static_assert(is_type<std::common_type<Abstract&&, Abstract&&>, static_assert(is_type<std::common_type<Abstract&&, Abstract&&>,
Abstract>(), ""); Abstract&&>(), "");
static_assert(is_type<std::common_type<const Abstract&&, static_assert(is_type<std::common_type<const Abstract&&,
volatile Abstract&&>, Abstract>(), ""); volatile Abstract&&>, const volatile Abstract&&>(), "");
static_assert(is_type<std::common_type<Ukn&&, Ukn&&>, Ukn>(), ""); static_assert(is_type<std::common_type<Ukn&&, Ukn&&>, Ukn&&>(), "");
static_assert(is_type<std::common_type<const Ukn&&, volatile Ukn&&>, static_assert(is_type<std::common_type<const Ukn&&, volatile Ukn&&>,
Ukn>(), ""); const volatile Ukn&&>(), "");
#endif #endif
static_assert(is_type<std::common_type<X1, X2>, RX12>(), ""); static_assert(is_type<std::common_type<X1, X2>, RX12>(), "");
...@@ -323,8 +337,10 @@ void test(int i) ...@@ -323,8 +337,10 @@ void test(int i)
auto local_lmd1 = [=](int, double) { return i + i; }; auto local_lmd1 = [=](int, double) { return i + i; };
auto local_lmd2 = [=](int, double) { return i - i; }; auto local_lmd2 = [=](int, double) { return i - i; };
#ifdef HAS_53000_FIXED
static_assert(is_type<std::common_type<decltype(local_lmd1), static_assert(is_type<std::common_type<decltype(local_lmd1),
decltype(local_lmd1)>, decltype(local_lmd1)>(), ""); decltype(local_lmd1)>, decltype(local_lmd1)&&>(), "");
#endif
static_assert(is_type<std::common_type<decltype(local_lmd1)&, static_assert(is_type<std::common_type<decltype(local_lmd1)&,
decltype(local_lmd1)>, decltype(local_lmd1)>(), ""); decltype(local_lmd1)>, decltype(local_lmd1)>(), "");
static_assert(is_type<std::common_type<decltype(local_lmd1)&, static_assert(is_type<std::common_type<decltype(local_lmd1)&,
......
...@@ -24,10 +24,12 @@ ...@@ -24,10 +24,12 @@
template<typename... Args> template<typename... Args>
constexpr constexpr
std::array<typename std::common_type<Args...>::type, sizeof...(Args)> std::array<typename std::decay<typename std::common_type<Args...>::type>::type,
sizeof...(Args)>
make_array(Args&&... args) // { dg-error "invalid use" } make_array(Args&&... args) // { dg-error "invalid use" }
{ {
typedef typename std::common_type<Args...>::type CT; typedef typename std::decay<typename std::common_type<Args...>::type>::type
CT;
return std::array<CT, sizeof...(Args)>{static_cast<CT> return std::array<CT, sizeof...(Args)>{static_cast<CT>
(std::forward<Args>(args))...}; (std::forward<Args>(args))...};
} }
......
...@@ -21,6 +21,9 @@ ...@@ -21,6 +21,9 @@
#include <type_traits> #include <type_traits>
#include <chrono> #include <chrono>
//TODO: Uncomment this once gcc bug 53000 has been resolved:
//#define HAS_53000_FIXED
// Helper types: // Helper types:
struct has_type_impl struct has_type_impl
{ {
...@@ -52,8 +55,10 @@ typedef std::chrono::duration<int, std::nano> din; ...@@ -52,8 +55,10 @@ typedef std::chrono::duration<int, std::nano> din;
typedef std::chrono::duration<double, std::nano> ddn; typedef std::chrono::duration<double, std::nano> ddn;
typedef std::chrono::duration<int, std::milli> dim; typedef std::chrono::duration<int, std::milli> dim;
static_assert(is_type<std::common_type<din, din>, din>(), ""); #ifdef HAS_53000_FIXED
static_assert(is_type<std::common_type<din, din, din>, din>(), ""); static_assert(is_type<std::common_type<din, din>, din&&>(), "");
static_assert(is_type<std::common_type<din, din, din>, din&&>(), "");
#endif
static_assert(is_type<std::common_type<din, ddn>, ddn>(), ""); static_assert(is_type<std::common_type<din, ddn>, ddn>(), "");
static_assert(is_type<std::common_type<din, din, ddn>, ddn>(), ""); static_assert(is_type<std::common_type<din, din, ddn>, ddn>(), "");
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment