Skip to content

Commit 2633251

Browse files
committed
Make @struct constructors implicit
Closes #1151 See also #904
1 parent 6c5c5df commit 2633251

File tree

6 files changed

+58
-58
lines changed

6 files changed

+58
-58
lines changed

regression-tests/test-results/pure2-bugfix-for-ufcs-arguments.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ class A {
8181
class B {
8282
public: A m;
8383
public: auto f() const& -> void;
84-
public: explicit B(auto const& m_);
84+
public: B(auto const& m_);
8585

8686
public: auto operator=(auto const& m_) -> B& ;
8787

@@ -173,8 +173,8 @@ namespace ns {
173173
auto B::f() const& -> void { CPP2_UFCS(f)(m); }
174174

175175
B::B(auto const& m_)
176-
: m{ m_ }{}
176+
: m{ m_ }{}
177177

178178
auto B::operator=(auto const& m_) -> B& {
179-
m = m_;
180-
return *this;}
179+
m = m_;
180+
return *this;}

regression-tests/test-results/pure2-last-use.cpp

Lines changed: 41 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,7 @@ class issue_857 {
244244

245245
class issue_857_2 {
246246
public: std::unique_ptr<int> a;
247-
public: explicit issue_857_2(auto const& a_);
247+
public: issue_857_2(auto const& a_);
248248

249249
public: auto operator=(auto const& a_) -> issue_857_2& ;
250250

@@ -257,20 +257,20 @@ extern int gi;
257257
class issue_857_3 {
258258
public: std::add_lvalue_reference_t<int> i {gi};
259259
public: auto f() && -> void;
260-
public: explicit issue_857_3(auto const& i_);
260+
public: issue_857_3(auto const& i_);
261261

262262
public: auto operator=(auto const& i_) -> issue_857_3& ;
263-
public: explicit issue_857_3();
263+
public: issue_857_3();
264264

265265
#line 265 "pure2-last-use.cpp2"
266266
};
267267
class issue_857_6 {
268268
public: auto f() && -> void;
269269
public: std::add_lvalue_reference_t<int> i {gi};
270-
public: explicit issue_857_6(auto const& i_);
270+
public: issue_857_6(auto const& i_);
271271

272272
public: auto operator=(auto const& i_) -> issue_857_6& ;
273-
public: explicit issue_857_6();
273+
public: issue_857_6();
274274

275275
#line 269 "pure2-last-use.cpp2"
276276
};
@@ -289,7 +289,7 @@ class issue_857_4 {
289289
public: std::add_pointer_t<int(int)> g;
290290
public: move_only_function<int()> mf;
291291
public: move_only_function<int(int)> mg;
292-
public: explicit issue_857_4(auto const& f_, auto const& g_, auto const& mf_, auto const& mg_);
292+
public: issue_857_4(auto const& f_, auto const& g_, auto const& mf_, auto const& mg_);
293293

294294
// h0: (move this) = _ = mf();
295295
// h1: (move this) = _ = this.mf();
@@ -350,7 +350,7 @@ class issue_857_4 {
350350
class issue_857_5 {
351351
public: auto f() && -> void;
352352
public: std::unique_ptr<int> a;
353-
public: explicit issue_857_5(auto const& a_);
353+
public: issue_857_5(auto const& a_);
354354

355355
public: auto operator=(auto const& a_) -> issue_857_5& ;
356356

@@ -363,7 +363,7 @@ class issue_857_7: public issue_857_7_A_as_base, public std::monostate {
363363

364364
#line 346 "pure2-last-use.cpp2"
365365
public: auto F() && -> void;
366-
public: explicit issue_857_7(auto const& A_);
366+
public: issue_857_7(auto const& A_);
367367

368368
#line 347 "pure2-last-use.cpp2"
369369
};
@@ -373,7 +373,7 @@ class issue_857_8 {
373373
public: move_only_function<int()> b;
374374
public: std::add_lvalue_reference_t<int> c;
375375
public: auto d() && -> void;
376-
public: explicit issue_857_8(auto const& a_, auto const& b_, auto const& c_);
376+
public: issue_857_8(auto const& a_, auto const& b_, auto const& c_);
377377

378378
#line 354 "pure2-last-use.cpp2"
379379
};
@@ -471,7 +471,7 @@ class cpp2_union {
471471
class my_string {
472472
public: std::string string;
473473
public: std::size_t size {CPP2_UFCS(size)(string)};
474-
public: explicit my_string(auto const& string_, auto const& size_);
474+
public: my_string(auto const& string_, auto const& size_);
475475

476476
#line 855 "pure2-last-use.cpp2"
477477
};
@@ -506,7 +506,7 @@ int inline constexpr x{ 0 };
506506
class t {
507507
public: std::unique_ptr<int> x;
508508
public: auto operator()() && -> void;
509-
public: explicit t(auto const& x_);
509+
public: t(auto const& x_);
510510

511511
public: auto operator=(auto const& x_) -> t& ;
512512

@@ -523,7 +523,7 @@ auto loops_and_captures() -> void;
523523
#line 984 "pure2-last-use.cpp2"
524524
class types {
525525
public: std::unique_ptr<int> x;
526-
public: explicit types(auto const& x_);
526+
public: types(auto const& x_);
527527

528528
public: auto operator=(auto const& x_) -> types& ;
529529

@@ -738,23 +738,23 @@ auto issue_850() -> void{
738738
auto issue_857::h() & -> void { f_inout(a); }
739739

740740
issue_857_2::issue_857_2(auto const& a_)
741-
: a{ a_ }{}
741+
: a{ a_ }{}
742742

743743
auto issue_857_2::operator=(auto const& a_) -> issue_857_2& {
744-
a = a_;
745-
return *this;}
744+
a = a_;
745+
return *this;}
746746
#line 261 "pure2-last-use.cpp2"
747747
int gi {0};
748748

749749
#line 264 "pure2-last-use.cpp2"
750750
auto issue_857_3::f() && -> void { f_inout(cpp2::move(*this).i); }
751751

752752
issue_857_3::issue_857_3(auto const& i_)
753-
: i{ i_ }{}
753+
: i{ i_ }{}
754754

755755
auto issue_857_3::operator=(auto const& i_) -> issue_857_3& {
756-
i = i_;
757-
return *this;}
756+
i = i_;
757+
return *this;}
758758
issue_857_3::issue_857_3(){}
759759
#line 264 "pure2-last-use.cpp2"
760760
// OK: The implicit `this` is moved, not `i`.
@@ -763,11 +763,11 @@ issue_857_3::issue_857_3(){}
763763
auto issue_857_6::f() && -> void { f_inout(cpp2::move(*this).i); }
764764

765765
issue_857_6::issue_857_6(auto const& i_)
766-
: i{ i_ }{}
766+
: i{ i_ }{}
767767

768768
auto issue_857_6::operator=(auto const& i_) -> issue_857_6& {
769-
i = i_;
770-
return *this;}
769+
i = i_;
770+
return *this;}
771771
issue_857_6::issue_857_6(){}
772772
#line 267 "pure2-last-use.cpp2"
773773
// OK: The implicit `this` is moved, not `i`.
@@ -783,34 +783,34 @@ issue_857_6::issue_857_6(){}
783783
template <typename T> [[nodiscard]] auto move_only_function<T>::operator()([[maybe_unused]] auto const& ...unnamed_param_2) && -> int { return 0; }
784784

785785
issue_857_4::issue_857_4(auto const& f_, auto const& g_, auto const& mf_, auto const& mg_)
786-
: f{ f_ }
787-
, g{ g_ }
788-
, mf{ mf_ }
789-
, mg{ mg_ }{}
786+
: f{ f_ }
787+
, g{ g_ }
788+
, mf{ mf_ }
789+
, mg{ mg_ }{}
790790

791791
#line 339 "pure2-last-use.cpp2"
792792
auto issue_857_5::f() && -> void { f_copy(std::move(cpp2::move(*this).a)); }
793793

794794
issue_857_5::issue_857_5(auto const& a_)
795-
: a{ a_ }{}
795+
: a{ a_ }{}
796796

797797
auto issue_857_5::operator=(auto const& a_) -> issue_857_5& {
798-
a = a_;
799-
return *this;}
798+
a = a_;
799+
return *this;}
800800
#line 346 "pure2-last-use.cpp2"
801801
auto issue_857_7::F() && -> void { f_inout(cpp2::move(*this).A); }
802802

803803
issue_857_7::issue_857_7(auto const& A_)
804-
: issue_857_7_A_as_base{ A_ }
805-
, std::monostate{ }{}
804+
: issue_857_7_A_as_base{ A_ }
805+
, std::monostate{ }{}
806806

807807
#line 353 "pure2-last-use.cpp2"
808808
auto issue_857_8::d() && -> void{}
809809

810810
issue_857_8::issue_857_8(auto const& a_, auto const& b_, auto const& c_)
811-
: a{ a_ }
812-
, b{ b_ }
813-
, c{ c_ }{}
811+
: a{ a_ }
812+
, b{ b_ }
813+
, c{ c_ }{}
814814

815815
#line 362 "pure2-last-use.cpp2"
816816
auto issue_857_9::f2() && -> void { f_inout(c); }// OK: Happens to work, like non-'move' 'this' parameters.
@@ -1363,8 +1363,8 @@ auto enum_2() -> void{
13631363
}
13641364

13651365
my_string::my_string(auto const& string_, auto const& size_)
1366-
: string{ string_ }
1367-
, size{ size_ }{}
1366+
: string{ string_ }
1367+
, size{ size_ }{}
13681368

13691369
#line 857 "pure2-last-use.cpp2"
13701370
[[nodiscard]] auto no_pessimizing_move() -> no_pessimizing_move_ret{
@@ -1454,11 +1454,11 @@ auto f() -> void{
14541454
}
14551455

14561456
t::t(auto const& x_)
1457-
: x{ x_ }{}
1457+
: x{ x_ }{}
14581458

14591459
auto t::operator=(auto const& x_) -> t& {
1460-
x = x_;
1461-
return *this;}
1460+
x = x_;
1461+
return *this;}
14621462
#line 940 "pure2-last-use.cpp2"
14631463
auto g() -> void{
14641464
static_cast<void>([]() mutable -> void{
@@ -1505,11 +1505,11 @@ auto loops_and_captures() -> void{
15051505
}
15061506

15071507
types::types(auto const& x_)
1508-
: x{ x_ }{}
1508+
: x{ x_ }{}
15091509

15101510
auto types::operator=(auto const& x_) -> types& {
1511-
x = x_;
1512-
return *this;}
1511+
x = x_;
1512+
return *this;}
15131513
#line 994 "pure2-last-use.cpp2"
15141514
auto skip_hidden_names() -> void{
15151515
static_cast<void>([]() mutable -> void{

regression-tests/test-results/pure2-trailing-commas.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ using doubler_ret = int;
2727

2828
#line 9 "pure2-trailing-commas.cpp2"
2929
class vals {public: int i;
30-
public: explicit vals(auto const& i_);
30+
public: vals(auto const& i_);
3131

3232
public: auto operator=(auto const& i_) -> vals& ;
3333

@@ -52,11 +52,11 @@ template<typename T, typename U> [[nodiscard]] auto g(T const& a, U const& b) ->
5252
return std::move(i.value()); }
5353

5454
vals::vals(auto const& i_)
55-
: i{ i_ }{}
55+
: i{ i_ }{}
5656

5757
auto vals::operator=(auto const& i_) -> vals& {
58-
i = i_;
59-
return *this;}
58+
i = i_;
59+
return *this;}
6060
#line 11 "pure2-trailing-commas.cpp2"
6161
auto main() -> int{
6262
{

regression-tests/test-results/pure2-types-ordering-via-meta-functions.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -70,10 +70,10 @@ class person_in_family_tree {
7070

7171
class mystruct {
7272
public: int val {0};
73-
public: explicit mystruct(auto const& val_);
73+
public: mystruct(auto const& val_);
7474

7575
public: auto operator=(auto const& val_) -> mystruct& ;
76-
public: explicit mystruct();
76+
public: mystruct();
7777

7878
#line 19 "pure2-types-ordering-via-meta-functions.cpp2"
7979
};
@@ -112,11 +112,11 @@ auto main() -> int;
112112

113113

114114
mystruct::mystruct(auto const& val_)
115-
: val{ val_ }{}
115+
: val{ val_ }{}
116116

117117
auto mystruct::operator=(auto const& val_) -> mystruct& {
118-
val = val_;
119-
return *this;}
118+
val = val_;
119+
return *this;}
120120
mystruct::mystruct(){}
121121
#line 21 "pure2-types-ordering-via-meta-functions.cpp2"
122122
auto main() -> int{

source/reflect.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1635,11 +1635,11 @@ auto cpp2_struct(meta::type_declaration& t) -> void
16351635
{
16361636
// Then to enable construction from corresponding values
16371637
// requires a constructor... an exception to the rule of zero
1638-
CPP2_UFCS(add_member)(t, (" operator=: (out this, " + cpp2::to_string(cpp2::move(ctor_params)) + ") = { " + cpp2::to_string(cpp2::move(ctor_inits)) + " }"));
1638+
CPP2_UFCS(add_member)(t, (" operator=: (implicit out this, " + cpp2::to_string(cpp2::move(ctor_params)) + ") = { " + cpp2::to_string(cpp2::move(ctor_inits)) + " }"));
16391639

16401640
// And if all members had initializers, we need a default constructor
16411641
if (!(cpp2::move(found_member_without_initializer))) {
1642-
CPP2_UFCS(add_member)(t, " operator=: (out this) = { }");
1642+
CPP2_UFCS(add_member)(t, " operator=: (implicit out this) = { }");
16431643
}
16441644
}
16451645
}

source/reflect.h2

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -964,11 +964,11 @@ struct: (inout t: meta::type_declaration) =
964964
{
965965
// Then to enable construction from corresponding values
966966
// requires a constructor... an exception to the rule of zero
967-
t.add_member(" operator=: (out this, (ctor_params)$) = { (ctor_inits)$ }");
967+
t.add_member(" operator=: (implicit out this, (ctor_params)$) = { (ctor_inits)$ }");
968968

969969
// And if all members had initializers, we need a default constructor
970970
if !found_member_without_initializer {
971-
t.add_member(" operator=: (out this) = { }");
971+
t.add_member(" operator=: (implicit out this) = { }");
972972
}
973973
}
974974
}

0 commit comments

Comments
 (0)