
This fixes the issue by implementing _And using the short-circuiting SFINAE trick that we previously used only in std::tuple. One thing we could look into is use the naive recursive implementation for disjunctions with a small number of arguments, and use that trick with larger numbers of arguments. It might be the case that the constant overhead for setting up the SFINAE trick makes it only worth doing for larger packs, but that's left for further work. This problem was raised in https://reviews.llvm.org/D96523. Differential Revision: https://reviews.llvm.org/D101661
36 lines
969 B
C++
36 lines
969 B
C++
// -*- C++ -*-
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
// UNSUPPORTED: c++03, c++11
|
|
|
|
// Make sure that we don't blow up the template instantiation recursion depth
|
|
// for tuples of size <= 1024.
|
|
|
|
#include <tuple>
|
|
#include <cassert>
|
|
#include <utility>
|
|
|
|
template <size_t... I>
|
|
constexpr void CreateTuple(std::index_sequence<I...>) {
|
|
std::tuple<decltype(I)...> tuple(I...);
|
|
assert(std::get<0>(tuple) == 0);
|
|
assert(std::get<sizeof...(I)-1>(tuple) == sizeof...(I)-1);
|
|
}
|
|
|
|
constexpr bool test() {
|
|
CreateTuple(std::make_index_sequence<1024>{});
|
|
return true;
|
|
}
|
|
|
|
int main(int, char**) {
|
|
test();
|
|
static_assert(test(), "");
|
|
return 0;
|
|
}
|