Skip to content

Commit eb7cd63

Browse files
committed
fix(to_cpp1): support initializing assignment from expression list in operator=
1 parent 61550a5 commit eb7cd63

File tree

3 files changed

+76
-3
lines changed

3 files changed

+76
-3
lines changed

regression-tests/pure2-bugfix-for-assign-expression-list.cpp2

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
1+
vec: type == std::vector<int>;
2+
3+
my_vec: type = {
4+
v: vec = ();
5+
operator=: (out this, _: std::integral_constant<int, 0>) = v = ();
6+
operator=: (out this, _: std::integral_constant<int, 1>) = v = (1);
7+
operator=: (out this, _: std::integral_constant<int, 2>) = v = (2, 3);
8+
}
9+
110
main: () = {
2-
vec: type == std::vector<int>;
311
v: vec = (0);
412
v = ();
513
assert( v == :vec = () );

regression-tests/test-results/pure2-bugfix-for-assign-expression-list.cpp

Lines changed: 59 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,73 @@
77
#include "cpp2util.h"
88

99

10+
#line 3 "pure2-bugfix-for-assign-expression-list.cpp2"
11+
class my_vec;
12+
1013

1114
//=== Cpp2 type definitions and function declarations ===========================
1215

13-
auto main() -> int;
16+
using vec = std::vector<int>;
17+
18+
class my_vec {
19+
private: vec v {};
20+
public: explicit my_vec([[maybe_unused]] cpp2::in<std::integral_constant<int,0>> param2);
1421

22+
#line 5 "pure2-bugfix-for-assign-expression-list.cpp2"
23+
public: auto operator=([[maybe_unused]] cpp2::in<std::integral_constant<int,0>> param2) -> my_vec& ;
24+
public: explicit my_vec([[maybe_unused]] cpp2::in<std::integral_constant<int,1>> param2);
25+
26+
#line 6 "pure2-bugfix-for-assign-expression-list.cpp2"
27+
public: auto operator=([[maybe_unused]] cpp2::in<std::integral_constant<int,1>> param2) -> my_vec& ;
28+
public: explicit my_vec([[maybe_unused]] cpp2::in<std::integral_constant<int,2>> param2);
29+
#line 7 "pure2-bugfix-for-assign-expression-list.cpp2"
30+
public: auto operator=([[maybe_unused]] cpp2::in<std::integral_constant<int,2>> param2) -> my_vec& ;
31+
32+
public: my_vec(my_vec const&) = delete; /* No 'that' constructor, suppress copy */
33+
public: auto operator=(my_vec const&) -> void = delete;
34+
#line 8 "pure2-bugfix-for-assign-expression-list.cpp2"
35+
};
36+
37+
auto main() -> int;
38+
1539

1640
//=== Cpp2 function definitions =================================================
1741

42+
43+
#line 5 "pure2-bugfix-for-assign-expression-list.cpp2"
44+
my_vec::my_vec([[maybe_unused]] cpp2::in<std::integral_constant<int,0>> param2)
45+
: v{ }
46+
#line 5 "pure2-bugfix-for-assign-expression-list.cpp2"
47+
{ }
48+
#line 5 "pure2-bugfix-for-assign-expression-list.cpp2"
49+
auto my_vec::operator=([[maybe_unused]] cpp2::in<std::integral_constant<int,0>> param2) -> my_vec& {
50+
v = { };
51+
return *this;
52+
#line 5 "pure2-bugfix-for-assign-expression-list.cpp2"
53+
}
54+
my_vec::my_vec([[maybe_unused]] cpp2::in<std::integral_constant<int,1>> param2)
55+
: v{ 1 }
56+
#line 6 "pure2-bugfix-for-assign-expression-list.cpp2"
57+
{ }
58+
#line 6 "pure2-bugfix-for-assign-expression-list.cpp2"
59+
auto my_vec::operator=([[maybe_unused]] cpp2::in<std::integral_constant<int,1>> param2) -> my_vec& {
60+
v = { 1 };
61+
return *this;
62+
#line 6 "pure2-bugfix-for-assign-expression-list.cpp2"
63+
}
64+
my_vec::my_vec([[maybe_unused]] cpp2::in<std::integral_constant<int,2>> param2)
65+
: v{ 2, 3 }
66+
#line 7 "pure2-bugfix-for-assign-expression-list.cpp2"
67+
{ }
68+
#line 7 "pure2-bugfix-for-assign-expression-list.cpp2"
69+
auto my_vec::operator=([[maybe_unused]] cpp2::in<std::integral_constant<int,2>> param2) -> my_vec& {
70+
v = { 2, 3 };
71+
return *this;
72+
#line 7 "pure2-bugfix-for-assign-expression-list.cpp2"
73+
}
74+
75+
#line 10 "pure2-bugfix-for-assign-expression-list.cpp2"
1876
auto main() -> int{
19-
using vec = std::vector<int>;
2077
vec v {0};
2178
v = { };
2279
cpp2::Default.expects(v == vec{}, "");

source/to_cpp1.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4739,6 +4739,14 @@ class cppfront
47394739
if (found_explicit_init)
47404740
{
47414741
initializer = rhs;
4742+
if (
4743+
is_assignment
4744+
&& std::get<statement_node::expression>((*statement)->statement)
4745+
->expr->expr->terms[0].expr->is_expression_list()
4746+
)
4747+
{
4748+
initializer = "{ " + rhs + " }";
4749+
}
47424750

47434751
// We've used this statement, so note it
47444752
// and move 'statement' forward

0 commit comments

Comments
 (0)