mirror of
https://github.com/darlinghq/darling-libcxx.git
synced 2024-11-24 04:19:48 +00:00
Add more test cases for PR31384
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@289778 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
1739d3ef0a
commit
90314c55d1
@ -15,24 +15,74 @@
|
||||
// template <class TupleLike> tuple(TupleLike&&); // libc++ extension
|
||||
|
||||
// See llvm.org/PR31384
|
||||
|
||||
#include <tuple>
|
||||
#include <cassert>
|
||||
|
||||
|
||||
int count = 0;
|
||||
|
||||
struct Explicit {
|
||||
Explicit() = default;
|
||||
explicit Explicit(int) {}
|
||||
};
|
||||
|
||||
struct Implicit {
|
||||
Implicit() = default;
|
||||
Implicit(int) {}
|
||||
};
|
||||
|
||||
template<class T>
|
||||
struct derived : std::tuple<T> {
|
||||
struct Derived : std::tuple<T> {
|
||||
using std::tuple<T>::tuple;
|
||||
template<class U>
|
||||
operator std::tuple<U>() && {
|
||||
++count;
|
||||
return {};
|
||||
}
|
||||
operator std::tuple<U>() && { ++count; return {}; }
|
||||
};
|
||||
|
||||
|
||||
template<class T>
|
||||
struct ExplicitDerived : std::tuple<T> {
|
||||
using std::tuple<T>::tuple;
|
||||
template<class U>
|
||||
explicit operator std::tuple<U>() && { ++count; return {}; }
|
||||
};
|
||||
|
||||
int main() {
|
||||
std::tuple<int> foo = derived<int&&>{42};
|
||||
assert(count == 1);
|
||||
{
|
||||
std::tuple<Explicit> foo = Derived<int>{42};
|
||||
assert(count == 1);
|
||||
std::tuple<Explicit> bar(Derived<int>{42});
|
||||
assert(count == 2);
|
||||
}
|
||||
count = 0;
|
||||
{
|
||||
std::tuple<Implicit> foo = Derived<int>{42};
|
||||
assert(count == 1);
|
||||
std::tuple<Implicit> bar(Derived<int>{42});
|
||||
assert(count == 2);
|
||||
}
|
||||
count = 0;
|
||||
{
|
||||
static_assert(!std::is_convertible<
|
||||
ExplicitDerived<int>, std::tuple<Explicit>>::value, "");
|
||||
std::tuple<Explicit> bar(ExplicitDerived<int>{42});
|
||||
assert(count == 1);
|
||||
}
|
||||
count = 0;
|
||||
{
|
||||
// FIXME: Libc++ incorrectly rejects this code.
|
||||
#ifndef _LIBCPP_VERSION
|
||||
std::tuple<Implicit> foo = ExplicitDerived<int>{42};
|
||||
static_assert(std::is_convertible<
|
||||
ExplicitDerived<int>, std::tuple<Implicit>>::value,
|
||||
"correct STLs accept this");
|
||||
#else
|
||||
static_assert(!std::is_convertible<
|
||||
ExplicitDerived<int>, std::tuple<Implicit>>::value,
|
||||
"libc++ incorrectly rejects this");
|
||||
#endif
|
||||
assert(count == 0);
|
||||
std::tuple<Implicit> bar(ExplicitDerived<int>{42});
|
||||
assert(count == 1);
|
||||
}
|
||||
count = 0;
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user