Skip to content

Commit 8324e25

Browse files
committed
fix(to_cpp1): support initializing assignment from expression list in operator=
1 parent 1032a5b commit 8324e25

File tree

3 files changed

+64
-3
lines changed

3 files changed

+64
-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: 47 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,63 @@
88

99
#line 1 "pure2-bugfix-for-assign-expression-list.cpp2"
1010

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

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

1417
#line 1 "pure2-bugfix-for-assign-expression-list.cpp2"
18+
using vec = std::vector<int>;
19+
#line 2 "pure2-bugfix-for-assign-expression-list.cpp2"
20+
21+
class my_vec {
22+
private: vec v {};
23+
public: explicit my_vec([[maybe_unused]] cpp2::impl::in<std::integral_constant<int,0>> unnamed_param_2);
24+
#line 5 "pure2-bugfix-for-assign-expression-list.cpp2"
25+
public: auto operator=([[maybe_unused]] cpp2::impl::in<std::integral_constant<int,0>> unnamed_param_2) -> my_vec& ;
26+
public: explicit my_vec([[maybe_unused]] cpp2::impl::in<std::integral_constant<int,1>> unnamed_param_2);
27+
#line 6 "pure2-bugfix-for-assign-expression-list.cpp2"
28+
public: auto operator=([[maybe_unused]] cpp2::impl::in<std::integral_constant<int,1>> unnamed_param_2) -> my_vec& ;
29+
public: explicit my_vec([[maybe_unused]] cpp2::impl::in<std::integral_constant<int,2>> unnamed_param_2);
30+
#line 7 "pure2-bugfix-for-assign-expression-list.cpp2"
31+
public: auto operator=([[maybe_unused]] cpp2::impl::in<std::integral_constant<int,2>> unnamed_param_2) -> my_vec& ;
32+
public: my_vec(my_vec const&) = delete; /* No 'that' constructor, suppress copy */
33+
public: auto operator=(my_vec const&) -> void = delete;
34+
35+
#line 8 "pure2-bugfix-for-assign-expression-list.cpp2"
36+
};
37+
1538
auto main() -> int;
1639

1740
//=== Cpp2 function definitions =================================================
1841

1942
#line 1 "pure2-bugfix-for-assign-expression-list.cpp2"
43+
44+
#line 5 "pure2-bugfix-for-assign-expression-list.cpp2"
45+
my_vec::my_vec([[maybe_unused]] cpp2::impl::in<std::integral_constant<int,0>> unnamed_param_2)
46+
: v{ } { }
47+
#line 5 "pure2-bugfix-for-assign-expression-list.cpp2"
48+
auto my_vec::operator=([[maybe_unused]] cpp2::impl::in<std::integral_constant<int,0>> unnamed_param_2) -> my_vec& {
49+
v = { };
50+
return *this; }
51+
#line 6 "pure2-bugfix-for-assign-expression-list.cpp2"
52+
my_vec::my_vec([[maybe_unused]] cpp2::impl::in<std::integral_constant<int,1>> unnamed_param_2)
53+
: v{ 1 } { }
54+
#line 6 "pure2-bugfix-for-assign-expression-list.cpp2"
55+
auto my_vec::operator=([[maybe_unused]] cpp2::impl::in<std::integral_constant<int,1>> unnamed_param_2) -> my_vec& {
56+
v = { 1 };
57+
return *this; }
58+
#line 7 "pure2-bugfix-for-assign-expression-list.cpp2"
59+
my_vec::my_vec([[maybe_unused]] cpp2::impl::in<std::integral_constant<int,2>> unnamed_param_2)
60+
: v{ 2, 3 } { }
61+
#line 7 "pure2-bugfix-for-assign-expression-list.cpp2"
62+
auto my_vec::operator=([[maybe_unused]] cpp2::impl::in<std::integral_constant<int,2>> unnamed_param_2) -> my_vec& {
63+
v = { 2, 3 };
64+
return *this; }
65+
66+
#line 10 "pure2-bugfix-for-assign-expression-list.cpp2"
2067
auto main() -> int{
21-
#line 2 "pure2-bugfix-for-assign-expression-list.cpp2"
22-
using vec = std::vector<int>;
2368
vec v {0};
2469
v = { };
2570
if (cpp2::cpp2_default.is_active() && !(v == vec{}) ) { cpp2::cpp2_default.report_violation(""); }

source/to_cpp1.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5451,6 +5451,14 @@ class cppfront
54515451
if (found_explicit_init)
54525452
{
54535453
initializer = rhs;
5454+
if (
5455+
is_assignment
5456+
&& std::get<statement_node::expression>((*statement)->statement)
5457+
->expr->expr->terms[0].expr->is_expression_list()
5458+
)
5459+
{
5460+
initializer = "{ " + rhs + " }";
5461+
}
54545462

54555463
// We've used this statement, so note it
54565464
// and move 'statement' forward

0 commit comments

Comments
 (0)