Skip to content

Commit

Permalink
Add chained comparisons, implements P0515R0 3.3 and P0893
Browse files Browse the repository at this point in the history
Now `min < index <= max` work and do the right thing (in today's C++ they silently compile but are a bug, even if the programmer intended the meaningful chained comparison)
And nonsense chains like `a >= b < c` are disallowed (in today's C++ they silently compile but are a bug, and conceptually meaningless)
  • Loading branch information
hsutter committed Jan 13, 2023
1 parent 290a3f6 commit 6454d26
Show file tree
Hide file tree
Showing 16 changed files with 309 additions and 33 deletions.
16 changes: 16 additions & 0 deletions regression-tests/pure2-chained-comparisons.cpp2
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
main: () -> int = {
std::cout << std::boolalpha;
i:=0; while i<3 next i++ {
j:=0; while j<3 next j++ {
k:=0; while k<3 next k++ {
std::cout
<< i << " "
<< j << " "
<< k << ": "
<< (i == j == k) << " "
<< (i < j <= k) << " "
<< (i >= j > k) << "\n";
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
0 0 0: true false false
0 0 1: false false false
0 0 2: false false false
0 1 0: false false false
0 1 1: false true false
0 1 2: false true false
0 2 0: false false false
0 2 1: false false false
0 2 2: false true false
1 0 0: false false false
1 0 1: false false false
1 0 2: false false false
1 1 0: false false true
1 1 1: true false false
1 1 2: false false false
1 2 0: false false false
1 2 1: false false false
1 2 2: false true false
2 0 0: false false false
2 0 1: false false false
2 0 2: false false false
2 1 0: false false true
2 1 1: false false false
2 1 2: false false false
2 2 0: false false true
2 2 1: false false true
2 2 2: true false false
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
0 0 0: true false false
0 0 1: false false false
0 0 2: false false false
0 1 0: false false false
0 1 1: false true false
0 1 2: false true false
0 2 0: false false false
0 2 1: false false false
0 2 2: false true false
1 0 0: false false false
1 0 1: false false false
1 0 2: false false false
1 1 0: false false true
1 1 1: true false false
1 1 2: false false false
1 2 0: false false false
1 2 1: false false false
1 2 2: false true false
2 0 0: false false false
2 0 1: false false false
2 0 2: false false false
2 1 0: false false true
2 1 1: false false false
2 1 2: false false false
2 2 0: false false true
2 2 1: false false true
2 2 2: true false false
Empty file.
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ std::vector<int> vec {};
auto insert_at(cpp2::in<int> where, cpp2::in<int> val) -> void
{
cpp2::Default.expects(cpp2::cmp_less_eq(0,where) && cpp2::cmp_less_eq(where,CPP2_UFCS_0(ssize, vec)), "");
auto post_21_5 = cpp2::finally_success([_0 = CPP2_UFCS_0(ssize, vec)]{cpp2::Default.expects(CPP2_UFCS_0(ssize, vec) == _0 + 1, "");} );
auto post_21_5 = cpp2::finally_success([_0 = CPP2_UFCS_0(ssize, vec)]{cpp2::Default.expects(CPP2_UFCS_0(ssize, vec)==_0 + 1, "");} );
#line 21 "mixed-captures-in-expressions-and-postconditions.cpp2"


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,5 +49,5 @@ auto print_decorated(auto const& x) -> void { std::cout << ">> [" << x << "]\n";

// for test determinism, force "xyzzy" branch
// the standard mandates that std::mt19937()() == 3499211612
[[nodiscard]] auto flip_a_coin() -> bool { return std::mt19937()() % 2 == 0; }
[[nodiscard]] auto flip_a_coin() -> bool { return std::mt19937()() % 2==0; }

Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ requires std::is_same_v<CPP2_TYPEOF(e), std::string>

copy_from(z);

if (std::time(nullptr) % 2 == 0) {
if (std::time(nullptr) % 2==0) {
copy_from(std::move(z));
}

Expand Down
2 changes: 1 addition & 1 deletion regression-tests/test-results/mixed-parameter-passing.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ auto parameter_styles(

copy_from(z);

if (std::time(nullptr) % 2 == 0) {
if (std::time(nullptr) % 2==0) {
copy_from(std::move(z));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ std::vector<int> vec {};
auto insert_at(cpp2::in<int> where, cpp2::in<int> val) -> void
{
cpp2::Default.expects(cpp2::cmp_less_eq(0,where) && cpp2::cmp_less_eq(where,CPP2_UFCS_0(ssize, vec)), "");
auto post_16_5 = cpp2::finally_success([_0 = CPP2_UFCS_0(size, vec)]{cpp2::Default.expects(CPP2_UFCS_0(size, vec) == _0 + 1, "");} );
auto post_16_5 = cpp2::finally_success([_0 = CPP2_UFCS_0(size, vec)]{cpp2::Default.expects(CPP2_UFCS_0(size, vec)==_0 + 1, "");} );
#line 16 "mixed-postexpression-with-capture.cpp2"


Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
0 0 0: true false false
0 0 1: false false false
0 0 2: false false false
0 1 0: false false false
0 1 1: false true false
0 1 2: false true false
0 2 0: false false false
0 2 1: false false false
0 2 2: false true false
1 0 0: false false false
1 0 1: false false false
1 0 2: false false false
1 1 0: false false true
1 1 1: true false false
1 1 2: false false false
1 2 0: false false false
1 2 1: false false false
1 2 2: false true false
2 0 0: false false false
2 0 1: false false false
2 0 2: false false false
2 1 0: false false true
2 1 1: false false false
2 1 2: false false false
2 2 0: false false true
2 2 1: false false true
2 2 2: true false false
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
pure2-chained-comparisons.cpp
28 changes: 28 additions & 0 deletions regression-tests/test-results/pure2-chained-comparisons.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
// ----- Cpp2 support -----
#define CPP2_USE_MODULES Yes
#include "cpp2util.h"


#line 1 "pure2-chained-comparisons.cpp2"
[[nodiscard]] auto main() -> int;

//=== Cpp2 definitions ==========================================================

#line 1 "pure2-chained-comparisons.cpp2"
[[nodiscard]] auto main() -> int{
std::cout << std::boolalpha;
auto i {0}; for( ; cpp2::cmp_less(i,3); ++i ) {
auto j {0}; for( ; cpp2::cmp_less(j,3); ++j ) {
auto k {0}; for( ; cpp2::cmp_less(k,3); ++k ) {
std::cout
<< i << " "
<< j << " "
<< k << ": "
<< ([_0 = i, _1 = j, _2 = k]{ return _0==_1 && _1==_2; }()) << " "
<< ([_0 = i, _1 = j, _2 = k]{ return cpp2::cmp_less(_0,_1) && cpp2::cmp_less_eq(_1,_2); }()) << " "
<< ([_0 = i, _1 = j, _2 = k]{ return cpp2::cmp_greater_eq(_0,_1) && cpp2::cmp_greater(_1,_2); }()) << "\n";
}
}
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
pure2-chained-comparisons.cpp2... ok (all Cpp2, passes safety checks)

Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ struct g__ret {
[[nodiscard]] auto f() -> f__ret{
int ri {0};
#line 3 "pure2-look-up-parameter-across-unnamed-function.cpp2"
auto pred {[](auto const& e) -> bool{return e == 1; }};
auto pred {[](auto const& e) -> bool{return e==1; }};
ri = 42;
return { std::move(ri) }; // "return;" is implicit"
}
Expand All @@ -34,7 +34,7 @@ struct g__ret {
cpp2::deferred_init<int> ri;
#line 9 "pure2-look-up-parameter-across-unnamed-function.cpp2"
ri.construct(0);
auto pred {[](auto const& e) -> bool{return e == 1; }};
auto pred {[](auto const& e) -> bool{return e==1; }};
ri.value() = 42;
return { std::move(ri.value()) };
}
Expand Down
Loading

0 comments on commit 6454d26

Please sign in to comment.