summaryrefslogtreecommitdiffstats
path: root/libcxx/test/std
diff options
context:
space:
mode:
authorEric Fiselier <eric@efcs.ca>2018-05-10 20:59:35 +0000
committerEric Fiselier <eric@efcs.ca>2018-05-10 20:59:35 +0000
commit11a18a7902dad9982d80301bf575266a353b1ac5 (patch)
tree9ae7adeb2ce814386f15db9b7f720802135ac84a /libcxx/test/std
parent1dc90204bf2971c6f2fc4527c0ee0620a79727b8 (diff)
downloadbcm5719-llvm-11a18a7902dad9982d80301bf575266a353b1ac5.tar.gz
bcm5719-llvm-11a18a7902dad9982d80301bf575266a353b1ac5.zip
Fix PR37407 - callable traits don't correctly check complete types.
Checking for complete types is really rather tricky when you consider the amount of specializations required to check a function type. This specifically caused PR37407 where we incorrectly diagnosed noexcept function types as incomplete (but there were plenty of other cases that would cause this). This patch removes the complete type checking for now. I'm going to look into adding a clang builtin to correctly do this for us. llvm-svn: 332040
Diffstat (limited to 'libcxx/test/std')
-rw-r--r--libcxx/test/std/utilities/meta/meta.trans/meta.trans.other/result_of.pass.cpp24
-rw-r--r--libcxx/test/std/utilities/meta/meta.trans/meta.trans.other/result_of11.pass.cpp14
2 files changed, 37 insertions, 1 deletions
diff --git a/libcxx/test/std/utilities/meta/meta.trans/meta.trans.other/result_of.pass.cpp b/libcxx/test/std/utilities/meta/meta.trans/meta.trans.other/result_of.pass.cpp
index 24231526b2b..69e805d1e1f 100644
--- a/libcxx/test/std/utilities/meta/meta.trans/meta.trans.other/result_of.pass.cpp
+++ b/libcxx/test/std/utilities/meta/meta.trans/meta.trans.other/result_of.pass.cpp
@@ -104,36 +104,43 @@ int main()
test_result_of<S const volatile&(unsigned char, int&), double const volatile&> ();
}
{ // pointer to function
- typedef bool (&RF0)();
+ typedef bool (&RF0)();
typedef bool* (&RF1)(int);
typedef bool& (&RF2)(int, int);
typedef bool const& (&RF3)(int, int, int);
+ typedef bool (&RF4)(int, ...);
typedef bool (*PF0)();
typedef bool* (*PF1)(int);
typedef bool& (*PF2)(int, int);
typedef bool const& (*PF3)(int, int, int);
+ typedef bool (*PF4)(int, ...);
typedef bool (*&PRF0)();
typedef bool* (*&PRF1)(int);
typedef bool& (*&PRF2)(int, int);
typedef bool const& (*&PRF3)(int, int, int);
+ typedef bool (*&PRF4)(int, ...);
test_result_of<RF0(), bool>();
test_result_of<RF1(int), bool*>();
test_result_of<RF2(int, long), bool&>();
test_result_of<RF3(int, long, int), bool const&>();
+ test_result_of<RF4(int, float, void*), bool>();
test_result_of<PF0(), bool>();
test_result_of<PF1(int), bool*>();
test_result_of<PF2(int, long), bool&>();
test_result_of<PF3(int, long, int), bool const&>();
+ test_result_of<PF4(int, float, void*), bool>();
test_result_of<PRF0(), bool>();
test_result_of<PRF1(int), bool*>();
test_result_of<PRF2(int, long), bool&>();
test_result_of<PRF3(int, long, int), bool const&>();
+ test_result_of<PRF4(int, float, void*), bool>();
}
{ // pointer to member function
typedef int (S::*PMS0)();
typedef int* (S::*PMS1)(long);
typedef int& (S::*PMS2)(long, int);
+ typedef const int& (S::*PMS3)(int, ...);
test_result_of<PMS0( S), int> ();
test_result_of<PMS0( S&), int> ();
test_result_of<PMS0( S*), int> ();
@@ -193,9 +200,13 @@ int main()
test_no_result<PMS2(std::reference_wrapper<ND>, int, int)>();
test_no_result<PMS2(std::unique_ptr<ND>, int, int)>();
+ test_result_of<PMS3(S&, int), const int &>();
+ test_result_of<PMS3(S&, int, long), const int &>();
+
typedef int (S::*PMS0C)() const;
typedef int* (S::*PMS1C)(long) const;
typedef int& (S::*PMS2C)(long, int) const;
+ typedef const int& (S::*PMS3C)(int, ...) const;
test_result_of<PMS0C( S), int> ();
test_result_of<PMS0C( S&), int> ();
test_result_of<PMS0C(const S&), int> ();
@@ -238,9 +249,13 @@ int main()
test_no_result<PMS2C(volatile S&, int, int)>();
test_no_result<PMS2C(const volatile S&, int, int)>();
+ test_result_of<PMS3C(S&, int), const int &>();
+ test_result_of<PMS3C(S&, int, long), const int &>();
+
typedef int (S::*PMS0V)() volatile;
typedef int* (S::*PMS1V)(long) volatile;
typedef int& (S::*PMS2V)(long, int) volatile;
+ typedef const int& (S::*PMS3V)(int, ...) volatile;
test_result_of<PMS0V( S), int> ();
test_result_of<PMS0V( S&), int> ();
test_result_of<PMS0V(volatile S&), int> ();
@@ -274,9 +289,13 @@ int main()
test_no_result<PMS2V(const S&, int, int)>();
test_no_result<PMS2V(const volatile S&, int, int)>();
+ test_result_of<PMS3V(S&, int), const int &>();
+ test_result_of<PMS3V(S&, int, long), const int &>();
+
typedef int (S::*PMS0CV)() const volatile;
typedef int* (S::*PMS1CV)(long) const volatile;
typedef int& (S::*PMS2CV)(long, int) const volatile;
+ typedef const int& (S::*PMS3CV)(int, ...) const volatile;
test_result_of<PMS0CV( S), int> ();
test_result_of<PMS0CV( S&), int> ();
test_result_of<PMS0CV(const S&), int> ();
@@ -321,6 +340,9 @@ int main()
test_result_of<PMS2CV(volatile S*&, int, int), int&> ();
test_result_of<PMS2CV(const volatile S*&, int, int), int&> ();
test_result_of<PMS2CV(std::unique_ptr<S>, int, int), int&> ();
+
+ test_result_of<PMS3CV(S&, int), const int &>();
+ test_result_of<PMS3CV(S&, int, long), const int &>();
}
{ // pointer to member data
typedef char S::*PMD;
diff --git a/libcxx/test/std/utilities/meta/meta.trans/meta.trans.other/result_of11.pass.cpp b/libcxx/test/std/utilities/meta/meta.trans/meta.trans.other/result_of11.pass.cpp
index 2b8cd709677..f7fb7ccfdfb 100644
--- a/libcxx/test/std/utilities/meta/meta.trans/meta.trans.other/result_of11.pass.cpp
+++ b/libcxx/test/std/utilities/meta/meta.trans/meta.trans.other/result_of11.pass.cpp
@@ -58,6 +58,20 @@ void test_result_of_imp()
int main()
{
+ { // Function types with noexcept
+ typedef bool (&RF0)(int) noexcept;
+ typedef bool (&RF1)(int, ...) noexcept;
+ typedef bool (*PF0)(int) noexcept;
+ typedef bool (*PF1)(int, ...) noexcept;
+ typedef bool (*&PRF0)(int) noexcept;
+ typedef bool (*&PRF1)(int, ...) noexcept;
+ test_result_of_imp<RF0(int), bool>();
+ test_result_of_imp<PF0(int), bool>();
+ test_result_of_imp<PRF0(int), bool>();
+ test_result_of_imp<RF1(int, int), bool>();
+ test_result_of_imp<PF1(int, int), bool>();
+ test_result_of_imp<PRF1(int, int), bool>();
+ }
{
typedef char F::*PMD;
test_result_of_imp<PMD(F &), char &>();
OpenPOWER on IntegriCloud