llvm-project/libcxx/test/std/utilities
Eric Fiselier 65500d4b29 [libc++] Try and prevent evaluation of `is_default_constructible` on tuples default constructor if it is not needed.
Summary:
Currently parts of the SFINAE on tuples default constructor always gets evaluated even when the default constructor is never called or instantiated. This can cause a hard compile error when a tuple is created with types that do not have a default constructor. Below is a self contained example using a pair like class. This code will not compile but probably should.

```

#include <type_traits>

template <class T>
struct IllFormedDefaultImp {
    IllFormedDefaultImp(T x) : value(x) {}
    constexpr IllFormedDefaultImp() {}
    T value;
};

typedef IllFormedDefaultImp<int &> IllFormedDefault;

template <class T, class U>
struct pair
{
  template <bool Dummy = true,
    class = typename std::enable_if<
         std::is_default_constructible<T>::value
      && std::is_default_constructible<U>::value
      && Dummy>::type
    >
  constexpr pair() : first(), second() {}

  pair(T const & t, U const & u) : first(t), second(u) {}

  T first;
  U second;
};

int main()
{
  int x = 1;
  IllFormedDefault v(x);
  pair<IllFormedDefault, IllFormedDefault> p(v, v);
}
```

One way to fix this is to use `Dummy` in a more involved way in the constructor SFINAE. The following patch fixes these sorts of hard compile errors for tuple.


Reviewers: mclow.lists, rsmith, K-ballo, EricWF

Reviewed By: EricWF

Subscribers: ldionne, cfe-commits

Differential Revision: http://reviews.llvm.org/D7569

llvm-svn: 230120
2015-02-21 02:30:41 +00:00
..
allocator.adaptor Walter Brown sent a list of tests which needed 'additional includes' to match what was in the standard. Added these includes to the tests. No changes to the library or test results. 2015-01-09 20:25:52 +00:00
date.time Get tests running with warnings. Fix warnings in headers and tests 2015-02-05 20:28:37 +00:00
function.objects [libcxx] Fix PR 22468 - std::function<void()> does not accept non-void-returning functions 2015-02-10 16:48:45 +00:00
intseq
memory Get tests running with warnings. Fix warnings in headers and tests 2015-02-05 20:28:37 +00:00
meta [libc++] Fix PR20084 - std::is_function<void() const> failed. 2015-02-18 16:31:46 +00:00
ratio
template.bitset libc++ implements its' hash objects as deriving from std::unary_function, and the tests test for that. STL @ MS pointed out that the standard doesn't requie these objects to derive from unary_function, and so the tests should not require that either. Change the tests to check for the embedded typedefs - which ARE required. No change to the library. 2015-01-07 21:53:23 +00:00
time Get tests running with warnings. Fix warnings in headers and tests 2015-02-05 20:28:37 +00:00
tuple [libc++] Try and prevent evaluation of `is_default_constructible` on tuples default constructor if it is not needed. 2015-02-21 02:30:41 +00:00
type.index Get tests running with warnings. Fix warnings in headers and tests 2015-02-05 20:28:37 +00:00
utilities.general
utility
utility.requirements
nothing_to_do.pass.cpp