================
@@ -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:
Let's add the test case from https://gcc.godbolt.org/z/a8ne6e487.
In this case it means that we also need to use `std::forward` like you did
previously, thanks @timsong-cpp for clarifying.
https://github.com/llvm/llvm-project/pull/66315
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits