[libcxx] Delay evaluation of __make_tuple_types to prevent blowing the max template...
authorEric Fiselier <eric@efcs.ca>
Tue, 28 Oct 2014 06:31:22 +0000 (06:31 +0000)
committerEric Fiselier <eric@efcs.ca>
Tue, 28 Oct 2014 06:31:22 +0000 (06:31 +0000)
commit295bce1130906e415534b8aa9104b75cb553d173
tree328ed3604a820c63a1d0c47fa161f04aa5250826
parent44067eead197169274e235562a242f9747be5cc3
[libcxx] Delay evaluation of __make_tuple_types to prevent blowing the max template instantiation depth. Fixes Bug #18345

Summary:
http://llvm.org/bugs/show_bug.cgi?id=18345

Tuple's constructor and assignment operators for "tuple-like" types evaluates __make_tuple_types unnecessarily. In the case of a large array this can blow the template instantiation depth.

Ex:
```
#include <array>
#include <tuple>
#include <memory>

typedef std::array<int, 1256> array_t;
typedef std::tuple<array_t> tuple_t;

int main() {
  array_t a;
  tuple_t t(a); // broken
  t = a; // broken

  // make_shared uses tuple behind the scenes. This bug breaks this code.
  std::make_shared<array_t>(a);
}
```

To prevent this from happening we delay the instantiation of `__make_tuple_types` until after we perform the length check. Currently `__make_tuple_types` is instantiated at the same time that the length check .

Test Plan: Two tests have been added. One for the "tuple-like" constructors and another for the "tuple-like" assignment operator.

Reviewers: mclow.lists, EricWF

Reviewed By: EricWF

Subscribers: K-ballo, cfe-commits

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

llvm-svn: 220769
libcxx/include/__tuple
libcxx/test/utilities/tuple/tuple.tuple/tuple.assign/tuple_array_template_depth.pass.cpp [new file with mode: 0644]
libcxx/test/utilities/tuple/tuple.tuple/tuple.cnstr/tuple_array_template_depth.pass.cpp [new file with mode: 0644]