[libcxx-commits] [libcxx] c6eb584 - [libc++] Fix recursive instantiation in std::array.

Eric Fiselier via libcxx-commits libcxx-commits at lists.llvm.org
Thu Apr 9 14:42:24 PDT 2020


Author: Eric Fiselier
Date: 2020-04-09T17:42:10-04:00
New Revision: c6eb584c64872fbb779df14acd31c1f3947f6e52

URL: https://github.com/llvm/llvm-project/commit/c6eb584c64872fbb779df14acd31c1f3947f6e52
DIFF: https://github.com/llvm/llvm-project/commit/c6eb584c64872fbb779df14acd31c1f3947f6e52.diff

LOG: [libc++] Fix recursive instantiation in std::array.

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.

Added: 
    

Modified: 
    libcxx/include/array

Removed: 
    


################################################################################
diff  --git a/libcxx/include/array b/libcxx/include/array
index 64ca68d4834f..81685bf06040 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)>;


        


More information about the libcxx-commits mailing list