[libcxx-commits] [PATCH] D141336: [libc++][test] Avoid MSVC constexpr bug

Casey Carter via Phabricator via libcxx-commits libcxx-commits at lists.llvm.org
Mon Jan 9 17:17:50 PST 2023


CaseyCarter created this revision.
CaseyCarter added a reviewer: var-const.
CaseyCarter added a project: libc++.
Herald added a project: All.
CaseyCarter requested review of this revision.
Herald added a reviewer: libc++.

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.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D141336

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


Index: libcxx/test/std/algorithms/ranges_robust_against_nonbool_predicates.pass.cpp
===================================================================
--- libcxx/test/std/algorithms/ranges_robust_against_nonbool_predicates.pass.cpp
+++ libcxx/test/std/algorithms/ranges_robust_against_nonbool_predicates.pass.cpp
@@ -23,11 +23,11 @@
 
 #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>);
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D141336.487611.patch
Type: text/x-patch
Size: 937 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/libcxx-commits/attachments/20230110/70691f8c/attachment.bin>


More information about the libcxx-commits mailing list