[libcxx] [test] Use dedicated types for the invocable concept tests for multiple overloads

This should be clearer, instead of relying on rules for implicit
conversions regarding built in float/integer types.

Differential Revision: https://reviews.llvm.org/D99928
This commit is contained in:
Martin Storsjö 2021-04-06 10:20:59 +03:00
parent 3ae03f67fe
commit 91d6debbb9
2 changed files with 42 additions and 24 deletions

View File

@ -222,21 +222,30 @@ static_assert(!std::invocable<rvalue_cv_function_object volatile&, int*>);
static_assert(!std::invocable<rvalue_cv_function_object const volatile&, int*>);
struct multiple_overloads {
bool operator()();
void operator()(int);
int operator()(double);
struct A {};
struct B { B(int); };
struct AB : A, B {};
struct O {};
struct DA : A {};
struct DB : B {};
void operator()(A) {};
void operator()(B) {};
};
static_assert(std::invocable<multiple_overloads&>);
static_assert(std::invocable<multiple_overloads&, short>);
static_assert(std::invocable<multiple_overloads&, multiple_overloads::A>);
static_assert(std::invocable<multiple_overloads&, multiple_overloads::B>);
static_assert(std::invocable<multiple_overloads&, multiple_overloads::DA>);
static_assert(std::invocable<multiple_overloads&, multiple_overloads::DB>);
static_assert(std::invocable<multiple_overloads&, int>);
static_assert(!std::invocable<multiple_overloads&, long long>);
static_assert(std::invocable<multiple_overloads&, double>);
static_assert(std::invocable<multiple_overloads&, float>);
static_assert(std::invocable<multiple_overloads&, short&>);
static_assert(!std::invocable<multiple_overloads&, multiple_overloads::AB>);
static_assert(!std::invocable<multiple_overloads&, multiple_overloads::O>);
static_assert(std::invocable<multiple_overloads&, multiple_overloads::A&>);
static_assert(std::invocable<multiple_overloads&, multiple_overloads::B&>);
static_assert(std::invocable<multiple_overloads&, multiple_overloads::DA&>);
static_assert(std::invocable<multiple_overloads&, multiple_overloads::DB&>);
static_assert(std::invocable<multiple_overloads&, int&>);
static_assert(!std::invocable<multiple_overloads&, long long>);
static_assert(std::invocable<multiple_overloads&, float&>);
static_assert(std::invocable<multiple_overloads&, double&>);
static_assert(!std::invocable<multiple_overloads&, multiple_overloads::AB&>);
static_assert(!std::invocable<multiple_overloads&, multiple_overloads::O&>);
} // namespace function_objects
namespace pointer_to_member_functions {

View File

@ -248,21 +248,30 @@ static_assert(
!std::regular_invocable<rvalue_cv_function_object const volatile&, int*>);
struct multiple_overloads {
bool operator()();
void operator()(int);
int operator()(double);
struct A {};
struct B { B(int); };
struct AB : A, B {};
struct O {};
struct DA : A {};
struct DB : B {};
void operator()(A) {};
void operator()(B) {};
};
static_assert(std::regular_invocable<multiple_overloads&>);
static_assert(std::regular_invocable<multiple_overloads&, short>);
static_assert(std::regular_invocable<multiple_overloads&, multiple_overloads::A>);
static_assert(std::regular_invocable<multiple_overloads&, multiple_overloads::B>);
static_assert(std::regular_invocable<multiple_overloads&, multiple_overloads::DA>);
static_assert(std::regular_invocable<multiple_overloads&, multiple_overloads::DB>);
static_assert(std::regular_invocable<multiple_overloads&, int>);
static_assert(!std::regular_invocable<multiple_overloads&, long long>);
static_assert(std::regular_invocable<multiple_overloads&, double>);
static_assert(std::regular_invocable<multiple_overloads&, float>);
static_assert(std::regular_invocable<multiple_overloads&, short&>);
static_assert(!std::regular_invocable<multiple_overloads&, multiple_overloads::AB>);
static_assert(!std::regular_invocable<multiple_overloads&, multiple_overloads::O>);
static_assert(std::regular_invocable<multiple_overloads&, multiple_overloads::A&>);
static_assert(std::regular_invocable<multiple_overloads&, multiple_overloads::B&>);
static_assert(std::regular_invocable<multiple_overloads&, multiple_overloads::DA&>);
static_assert(std::regular_invocable<multiple_overloads&, multiple_overloads::DB&>);
static_assert(std::regular_invocable<multiple_overloads&, int&>);
static_assert(!std::regular_invocable<multiple_overloads&, long long&>);
static_assert(std::regular_invocable<multiple_overloads&, float&>);
static_assert(std::regular_invocable<multiple_overloads&, double&>);
static_assert(!std::regular_invocable<multiple_overloads&, multiple_overloads::AB&>);
static_assert(!std::regular_invocable<multiple_overloads&, multiple_overloads::O&>);
} // namespace function_objects
namespace pointer_to_member_functions {