summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Fiselier <eric@efcs.ca>2020-04-09 17:39:40 -0400
committerTom Stellard <tstellar@redhat.com>2020-06-26 13:46:12 -0700
commit77d76b71d7df39b573dfa1e391096a040e9b7bd3 (patch)
tree5ffcb85f78ccdcb04080c7d30ab5835878940f0e
parent76ceebb0d96361de2b61bf8e504d306d1f2e492f (diff)
[libc++] Fix recursive instantiation in std::array.upstream/llvmorg-10.0.1-rc2llvmorg-10.0.1-rc2
The use of the `&& ...` fold expression in std::array's deduction guides recursively builds a set of binary operator expressions of depth N where `N` is the number of elements in the initializer. This is problematic because arrays may be large, and instantiation depth is limited. This patch addresses the issue by flattening the SFINAE using the existing `__all` type trait. (cherry picked from commit c6eb584c64872fbb779df14acd31c1f3947f6e52)
-rw-r--r--libcxx/include/array2
1 files changed, 1 insertions, 1 deletions
diff --git a/libcxx/include/array b/libcxx/include/array
index 88e9d57ff783..ddebf9159600 100644
--- a/libcxx/include/array
+++ b/libcxx/include/array
@@ -359,7 +359,7 @@ struct _LIBCPP_TEMPLATE_VIS array<_Tp, 0>
#ifndef _LIBCPP_HAS_NO_DEDUCTION_GUIDES
template<class _Tp, class... _Args,
- class = typename enable_if<(is_same_v<_Tp, _Args> && ...), void>::type
+ class = _EnableIf<__all<_IsSame<_Tp, _Args>::value...>::value>
>
array(_Tp, _Args...)
-> array<_Tp, 1 + sizeof...(_Args)>;