aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2019-02-06 17:25:26 +0000
committerJonathan Wakely <redi@gcc.gnu.org>2019-02-06 17:25:26 +0000
commit373c726ec641e33ca640a51d6f4200318101f49d (patch)
treecdb60d48320834f95dda954fada89379850803ec
parent12f82acc9e55a16334d303ae2b88609bdcbf13e5 (diff)
downloadgcc-373c726ec641e33ca640a51d6f4200318101f49d.zip
gcc-373c726ec641e33ca640a51d6f4200318101f49d.tar.gz
gcc-373c726ec641e33ca640a51d6f4200318101f49d.tar.bz2
PR libstdc++/89102 fix common_type<> and common_type<T> specializations
This is a partial implementation of the revised std::common_type rules from P0435R1. PR libstdc++/89102 (partial) * include/std/type_traits (common_type<>): Define. (common_type<T>): Derive from common_type<T, T>. * testsuite/20_util/common_type/requirements/explicit_instantiation.cc: Test zero-length template argument list. * testsuite/20_util/common_type/requirements/sfinae_friendly_1.cc: Test additional single argument cases. * testsuite/20_util/common_type/requirements/sfinae_friendly_2.cc: Adjust expected error. From-SVN: r268586
-rw-r--r--libstdc++-v3/ChangeLog12
-rw-r--r--libstdc++-v3/include/std/type_traits7
-rw-r--r--libstdc++-v3/testsuite/20_util/common_type/requirements/explicit_instantiation.cc1
-rw-r--r--libstdc++-v3/testsuite/20_util/common_type/requirements/sfinae_friendly_1.cc13
-rw-r--r--libstdc++-v3/testsuite/20_util/common_type/requirements/sfinae_friendly_2.cc2
5 files changed, 33 insertions, 2 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index e08c08a..3206127 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,15 @@
+2019-02-06 Jonathan Wakely <jwakely@redhat.com>
+
+ PR libstdc++/89102 (partial)
+ * include/std/type_traits (common_type<>): Define.
+ (common_type<T>): Derive from common_type<T, T>.
+ * testsuite/20_util/common_type/requirements/explicit_instantiation.cc:
+ Test zero-length template argument list.
+ * testsuite/20_util/common_type/requirements/sfinae_friendly_1.cc:
+ Test additional single argument cases.
+ * testsuite/20_util/common_type/requirements/sfinae_friendly_2.cc:
+ Adjust expected error.
+
2019-02-05 Jonathan Wakely <jwakely@redhat.com>
PR libstdc++/89128
diff --git a/libstdc++-v3/include/std/type_traits b/libstdc++-v3/include/std/type_traits
index f05a583..bc2250d 100644
--- a/libstdc++-v3/include/std/type_traits
+++ b/libstdc++-v3/include/std/type_traits
@@ -2132,9 +2132,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
struct __expanded_common_type_wrapper<__failure_type, _Args...>
{ typedef __failure_type type; };
+ template<>
+ struct common_type<>
+ { };
+
template<typename _Tp>
struct common_type<_Tp>
- { typedef typename decay<_Tp>::type type; };
+ : common_type<_Tp, _Tp>
+ { };
template<typename _Tp, typename _Up>
struct common_type<_Tp, _Up>
diff --git a/libstdc++-v3/testsuite/20_util/common_type/requirements/explicit_instantiation.cc b/libstdc++-v3/testsuite/20_util/common_type/requirements/explicit_instantiation.cc
index 28535a8..dc57ab5 100644
--- a/libstdc++-v3/testsuite/20_util/common_type/requirements/explicit_instantiation.cc
+++ b/libstdc++-v3/testsuite/20_util/common_type/requirements/explicit_instantiation.cc
@@ -30,6 +30,7 @@ namespace std
typedef void test_type5;
typedef const void test_type6;
+ template struct common_type<>;
template struct common_type<test_type1>;
template struct common_type<test_type1, test_type2>;
template struct common_type<test_type1, test_type2, test_type3>;
diff --git a/libstdc++-v3/testsuite/20_util/common_type/requirements/sfinae_friendly_1.cc b/libstdc++-v3/testsuite/20_util/common_type/requirements/sfinae_friendly_1.cc
index 372c1a5..9b94eb1 100644
--- a/libstdc++-v3/testsuite/20_util/common_type/requirements/sfinae_friendly_1.cc
+++ b/libstdc++-v3/testsuite/20_util/common_type/requirements/sfinae_friendly_1.cc
@@ -159,7 +159,10 @@ namespace std {
};
}
+static_assert(is_type<std::common_type<int>, int>(), "");
+static_assert(is_type<std::common_type<const int>, int>(), "");
static_assert(is_type<std::common_type<int, int>, int>(), "");
+static_assert(is_type<std::common_type<const int, int>, int>(), "");
static_assert(is_type<std::common_type<ScEn, ScEn>, ScEn>(), "");
static_assert(is_type<std::common_type<UnscEn, UnscEn>, UnscEn>(), "");
static_assert(is_type<std::common_type<UnscEn, int>, int>(), "");
@@ -180,6 +183,8 @@ static_assert(is_type<std::common_type<int*, const volatile int*>,
const volatile int*>(), "");
static_assert(is_type<std::common_type<void*, const volatile int*>,
const volatile void*>(), "");
+static_assert(is_type<std::common_type<void>, void>(), "");
+static_assert(is_type<std::common_type<const void>, void>(), "");
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<int&, int&&>, int>(), "");
@@ -316,6 +321,14 @@ static_assert(!has_type<std::common_type<UConv1, Abstract&&>>(), "");
static_assert(!has_type<std::common_type<std::initializer_list<int>,
std::initializer_list<long>>>(), "");
+// PR libstdc++/89102
+static_assert(!has_type<std::common_type<int() &>>(), "");
+static_assert(!has_type<std::common_type<int() & noexcept>>(), "");
+static_assert(!has_type<std::common_type<int() const>>(), "");
+static_assert(!has_type<std::common_type<int(...) &>>(), "");
+static_assert(!has_type<std::common_type<int(...) & noexcept>>(), "");
+static_assert(!has_type<std::common_type<int(...) const>>(), "");
+
void test(int i)
{
auto local_lmd1 = [=](int, double) { return i + i; };
diff --git a/libstdc++-v3/testsuite/20_util/common_type/requirements/sfinae_friendly_2.cc b/libstdc++-v3/testsuite/20_util/common_type/requirements/sfinae_friendly_2.cc
index 64c8ea9..8f6f4ec 100644
--- a/libstdc++-v3/testsuite/20_util/common_type/requirements/sfinae_friendly_2.cc
+++ b/libstdc++-v3/testsuite/20_util/common_type/requirements/sfinae_friendly_2.cc
@@ -25,7 +25,7 @@ template<typename... Args>
constexpr
std::array<typename std::common_type<Args...>::type,
sizeof...(Args)>
-make_array(Args&&... args) // { dg-error "invalid use" }
+make_array(Args&&... args) // { dg-error "no type.*common_type<>" }
{
typedef typename std::common_type<Args...>::type CT;
return std::array<CT, sizeof...(Args)>{static_cast<CT>