[libc++][test] Avoid MSVC constexpr bug
authorCasey Carter <Casey@Carter.net>
Tue, 10 Jan 2023 01:18:08 +0000 (17:18 -0800)
committerCasey Carter <Casey@Carter.net>
Tue, 10 Jan 2023 01:48:04 +0000 (17:48 -0800)
C++ constexpr allows a non-constant-expresssion lvalue to be used in a constant expression if it's not subject to lvalue-to-rvalue conversion. Subtly, this means you can make a constant-expression copy of a non-constant-expression object of empty type since the copy constructor doesn't perform lvalue-to-rvalue conversion. MSVC has had bugs with this usage forever, which will hopefully finally be mashed implementing C++23's relaxation on the use of pointers and references in constant expressions.

There's no need for this particular test to use this particular constexpr feature, we can simply make the predicates constant expressions.

Differential Revision: https://reviews.llvm.org/D141336

libcxx/test/std/algorithms/ranges_robust_against_nonbool_predicates.pass.cpp

index b69df4084052b8065b72ff8beb3c2a2040a2f750..38457201acf70f74fef138cb4ea669513e166297 100644 (file)
 
 #include "boolean_testable.h"
 
-auto unary_pred = [](int i) { return BooleanTestable(i > 0); };
+constexpr auto unary_pred = [](int i) { return BooleanTestable(i > 0); };
 static_assert(!std::same_as<decltype(unary_pred(1)), bool>);
 static_assert(std::convertible_to<decltype(unary_pred(1)), bool>);
 
-auto binary_pred = [](int i, int j) { return BooleanTestable(i < j); };
+constexpr auto binary_pred = [](int i, int j) { return BooleanTestable(i < j); };
 static_assert(!std::same_as<decltype(binary_pred(1, 2)), bool>);
 static_assert(std::convertible_to<decltype(binary_pred(1, 2)), bool>);