================ @@ -108,7 +108,34 @@ constexpr bool test() { auto prvalue_proj = [](const CheckDoubleMove& x) -> CheckDoubleMove { return x; }; assert(&std::ranges::clamp(val, low, high, moving_comp, prvalue_proj) == &val); } + { // Make sure we don't call the projection more than three times per [alg.clamp], see #64717 + int counter = 0; + auto projection_function = [&counter](const int value) -> int { + counter++; + return value; + }; + assert(std::ranges::clamp(3, 2, 4, std::ranges::less{}, projection_function) == 3); + assert(counter <= 3); + } + { + struct Foo { + std::string s; + }; + + // taking by value is important here + auto comparator = [](std::string a, std::string b) { + return std::atoi(a.c_str()) < std::atoi(b.c_str()); + }; + + auto projection = [](Foo const& foo) { + return foo.s; + }; + Foo foo{"12"}; + Foo high{"10"}; + Foo low{"1"}; + assert(std::ranges::clamp(foo, low, high, comparator, projection).s == "10"); + } ---------------- ldionne wrote:
^ This test is still missing IIUC. https://github.com/llvm/llvm-project/pull/66315 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits