Skip to content

Commit eb5c65b

Browse files
authored
fix(sema): skip scope only when the using shadows (#965)
* fix(to_cpp1): remove bogus condition Named returns is orthogonal to last move of `this`. * fix(sema): skip scope only when the `using` shadows * test: apply CI patch * test: use actual reproducer
1 parent 0ac5ca6 commit eb5c65b

File tree

5 files changed

+65
-51
lines changed

5 files changed

+65
-51
lines changed

regression-tests/pure2-last-use.cpp2

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -786,6 +786,11 @@ issue_890: () = {
786786
(x := new<int>(0)) assert(identity(x)* == 0);
787787
}
788788

789+
issue_962: (s: ::std::string) = {
790+
using ::std::string;
791+
std::cout << "A: (s)$" << std::endl;
792+
}
793+
789794
draw: () = {
790795
pos := 0;
791796
vertex: move_only_function<int(int)> = ();
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
pure2-last-use.cpp2:938:44: error: a lambda expression cannot appear in this context
1+
pure2-last-use.cpp2:943:44: error: a lambda expression cannot appear in this context
22
static_cast<void>([_0 = std::array<int,[](auto const& x) mutable -> auto { return identity(x); }(0)>()]() mutable -> auto { return _0; });// Fails on Clang 12 (lambda in unevaluated context).
33
^
44
1 error generated.

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

Lines changed: 57 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -55,25 +55,25 @@ class issue_869_0;
5555
class issue_869_1;
5656

5757

58-
#line 838 "pure2-last-use.cpp2"
58+
#line 843 "pure2-last-use.cpp2"
5959
class cpp2_union;
6060

6161

62-
#line 846 "pure2-last-use.cpp2"
62+
#line 851 "pure2-last-use.cpp2"
6363
class my_string;
6464

6565

66-
#line 905 "pure2-last-use.cpp2"
66+
#line 910 "pure2-last-use.cpp2"
6767
namespace captures {
6868

69-
#line 919 "pure2-last-use.cpp2"
69+
#line 924 "pure2-last-use.cpp2"
7070
class t;
7171

7272

73-
#line 948 "pure2-last-use.cpp2"
73+
#line 953 "pure2-last-use.cpp2"
7474
}
7575

76-
#line 978 "pure2-last-use.cpp2"
76+
#line 983 "pure2-last-use.cpp2"
7777
class types;
7878

7979

@@ -334,18 +334,21 @@ auto issue_888_1([[maybe_unused]] std::string unnamed_param_1, move_only_functio
334334
auto issue_890() -> void;
335335

336336
#line 789 "pure2-last-use.cpp2"
337+
auto issue_962(cpp2::in<::std::string> s) -> void;
338+
339+
#line 794 "pure2-last-use.cpp2"
337340
auto draw() -> void;
338341

339-
#line 795 "pure2-last-use.cpp2"
342+
#line 800 "pure2-last-use.cpp2"
340343
auto enum_0() -> void;
341344

342-
#line 800 "pure2-last-use.cpp2"
345+
#line 805 "pure2-last-use.cpp2"
343346
auto enum_1() -> void;
344347

345-
#line 828 "pure2-last-use.cpp2"
348+
#line 833 "pure2-last-use.cpp2"
346349
auto enum_2() -> void;
347350

348-
#line 838 "pure2-last-use.cpp2"
351+
#line 843 "pure2-last-use.cpp2"
349352
class cpp2_union {
350353
public: auto destroy() & -> void;
351354
public: ~cpp2_union() noexcept;
@@ -354,7 +357,7 @@ class cpp2_union {
354357
public: auto operator=(cpp2_union const&) -> void = delete;
355358

356359

357-
#line 844 "pure2-last-use.cpp2"
360+
#line 849 "pure2-last-use.cpp2"
358361
};
359362

360363
class my_string {
@@ -363,58 +366,58 @@ class my_string {
363366
};
364367

365368
using no_pessimizing_move_ret = std::unique_ptr<int>;
366-
#line 851 "pure2-last-use.cpp2"
369+
#line 856 "pure2-last-use.cpp2"
367370
[[nodiscard]] auto no_pessimizing_move() -> no_pessimizing_move_ret;
368371

369372
auto deferred_non_copyable_0() -> void;
370373

371-
#line 859 "pure2-last-use.cpp2"
374+
#line 864 "pure2-last-use.cpp2"
372375
[[nodiscard]] auto deferred_non_copyable_1() -> auto;
373376
using deferred_non_copyable_2_ret = std::unique_ptr<int>;
374377

375378

376-
#line 865 "pure2-last-use.cpp2"
379+
#line 870 "pure2-last-use.cpp2"
377380
[[nodiscard]] auto deferred_non_copyable_2() -> deferred_non_copyable_2_ret;
378381

379-
#line 869 "pure2-last-use.cpp2"
382+
#line 874 "pure2-last-use.cpp2"
380383
auto loops() -> void;
381384

382-
#line 905 "pure2-last-use.cpp2"
385+
#line 910 "pure2-last-use.cpp2"
383386
namespace captures {
384387

385388
// Skip non captured name in function expression
386389

387390
auto f() -> void;
388391

389-
#line 917 "pure2-last-use.cpp2"
392+
#line 922 "pure2-last-use.cpp2"
390393
int inline constexpr x = 0;
391394

392395
class t {
393396
public: std::unique_ptr<int> x;
394397
public: auto operator()() && -> void;
395398

396-
#line 932 "pure2-last-use.cpp2"
399+
#line 937 "pure2-last-use.cpp2"
397400
};
398401

399402
auto g() -> void;
400403

401-
#line 948 "pure2-last-use.cpp2"
404+
#line 953 "pure2-last-use.cpp2"
402405
}
403406

404407
auto loops_and_captures() -> void;
405408

406-
#line 978 "pure2-last-use.cpp2"
409+
#line 983 "pure2-last-use.cpp2"
407410
class types {
408411
public: std::unique_ptr<int> x;
409412
public: auto f() && -> void;
410413
public: auto g() && -> void;
411414

412-
#line 986 "pure2-last-use.cpp2"
415+
#line 991 "pure2-last-use.cpp2"
413416
};
414417

415418
auto skip_hidden_names() -> void;
416419

417-
#line 1038 "pure2-last-use.cpp2"
420+
#line 1043 "pure2-last-use.cpp2"
418421
auto main(int const argc_, char** argv_) -> int;
419422

420423
//=== Cpp2 function definitions =================================================
@@ -1289,19 +1292,25 @@ auto const& x{cpp2_new<int>(0)};
12891292
}
12901293

12911294
#line 789 "pure2-last-use.cpp2"
1295+
auto issue_962(cpp2::in<::std::string> s) -> void{
1296+
using ::std::string;
1297+
std::cout << ("A: " + cpp2::to_string(s)) << std::endl;
1298+
}
1299+
1300+
#line 794 "pure2-last-use.cpp2"
12921301
auto draw() -> void{
12931302
auto pos {0};
12941303
move_only_function<int(int)> vertex {};
12951304
static_cast<void>(CPP2_UFCS_MOVE(vertex)((std::move(pos))));
12961305
}
12971306

1298-
#line 795 "pure2-last-use.cpp2"
1307+
#line 800 "pure2-last-use.cpp2"
12991308
auto enum_0() -> void{
13001309
cpp2::deferred_init<std::string> underlying_type;
13011310
if (true) {}
13021311
underlying_type.construct("");
13031312
}
1304-
#line 800 "pure2-last-use.cpp2"
1313+
#line 805 "pure2-last-use.cpp2"
13051314
auto enum_1() -> void{
13061315
auto max_value {cpp2_new<int>(0)};
13071316
std::reference_wrapper<std::unique_ptr<int> const> min_value {max_value};
@@ -1330,7 +1339,7 @@ auto enum_1() -> void{
13301339
f_copy(std::move(v));
13311340
} while ( *cpp2::assert_not_null(identity(z)));
13321341
}
1333-
#line 828 "pure2-last-use.cpp2"
1342+
#line 833 "pure2-last-use.cpp2"
13341343
auto enum_2() -> void{
13351344
auto umax {cpp2_new<int>(0)};
13361345
if (pred(umax)) {
@@ -1341,41 +1350,41 @@ auto enum_2() -> void{
13411350
}}}
13421351
}
13431352

1344-
#line 839 "pure2-last-use.cpp2"
1353+
#line 844 "pure2-last-use.cpp2"
13451354
auto cpp2_union::destroy() & -> void{}
1346-
#line 840 "pure2-last-use.cpp2"
1355+
#line 845 "pure2-last-use.cpp2"
13471356
cpp2_union::~cpp2_union() noexcept{
13481357
destroy();
13491358
static_cast<void>(std::move((*this)));
13501359
}
13511360

1352-
#line 851 "pure2-last-use.cpp2"
1361+
#line 856 "pure2-last-use.cpp2"
13531362
[[nodiscard]] auto no_pessimizing_move() -> no_pessimizing_move_ret{
13541363
std::unique_ptr<int> ret {};
1355-
#line 852 "pure2-last-use.cpp2"
1364+
#line 857 "pure2-last-use.cpp2"
13561365
return ret; }
1357-
#line 853 "pure2-last-use.cpp2"
1366+
#line 858 "pure2-last-use.cpp2"
13581367
auto deferred_non_copyable_0() -> void{
13591368
cpp2::deferred_init<std::unique_ptr<int>> p;
13601369
p.construct();
13611370
f_copy(std::move(p.value()));
13621371
}
13631372

1364-
#line 859 "pure2-last-use.cpp2"
1373+
#line 864 "pure2-last-use.cpp2"
13651374
[[nodiscard]] auto deferred_non_copyable_1() -> auto{
13661375
cpp2::deferred_init<std::unique_ptr<int>> p;
13671376
p.construct();
13681377
return std::move(p.value());
13691378
}
13701379

1371-
#line 865 "pure2-last-use.cpp2"
1380+
#line 870 "pure2-last-use.cpp2"
13721381
[[nodiscard]] auto deferred_non_copyable_2() -> deferred_non_copyable_2_ret{
13731382
cpp2::deferred_init<std::unique_ptr<int>> p;
1374-
#line 866 "pure2-last-use.cpp2"
1383+
#line 871 "pure2-last-use.cpp2"
13751384
p.construct();
13761385
return std::move(p.value()); }
13771386

1378-
#line 869 "pure2-last-use.cpp2"
1387+
#line 874 "pure2-last-use.cpp2"
13791388
auto loops() -> void{
13801389
static_cast<void>([]() mutable -> void{
13811390
auto x {cpp2_new<int>(0)};
@@ -1414,7 +1423,7 @@ auto loops() -> void{
14141423

14151424
namespace captures {
14161425

1417-
#line 909 "pure2-last-use.cpp2"
1426+
#line 914 "pure2-last-use.cpp2"
14181427
auto f() -> void{
14191428
auto x {cpp2_new<int>(0)};
14201429
f_copy(std::move(x));
@@ -1423,7 +1432,7 @@ auto f() -> void{
14231432
if (cpp2::Default.has_handler() && !(&std::move(id)(y) == &y) ) { cpp2::Default.report_violation(""); }
14241433
}
14251434

1426-
#line 921 "pure2-last-use.cpp2"
1435+
#line 926 "pure2-last-use.cpp2"
14271436
auto t::operator()() && -> void{
14281437
f_copy(std::move(*this).x);
14291438
static_cast<void>([&]() mutable -> void{
@@ -1436,7 +1445,7 @@ auto f() -> void{
14361445
});
14371446
}
14381447

1439-
#line 934 "pure2-last-use.cpp2"
1448+
#line 939 "pure2-last-use.cpp2"
14401449
auto g() -> void{
14411450
static_cast<void>([]() mutable -> void{
14421451
auto x {cpp2_new<int>(0)};
@@ -1453,7 +1462,7 @@ auto g() -> void{
14531462

14541463
}
14551464

1456-
#line 950 "pure2-last-use.cpp2"
1465+
#line 955 "pure2-last-use.cpp2"
14571466
auto loops_and_captures() -> void{
14581467
static_cast<void>([]() mutable -> void{
14591468
auto x {cpp2_new<int>(0)};
@@ -1468,7 +1477,7 @@ auto loops_and_captures() -> void{
14681477
f_copy(std::move(x));
14691478
for (
14701479

1471-
#line 966 "pure2-last-use.cpp2"
1480+
#line 971 "pure2-last-use.cpp2"
14721481
[[maybe_unused]] auto const& unnamed_param_1 : { []() mutable -> auto{using captures::x;return x; } } )
14731482
{}
14741483
});
@@ -1481,27 +1490,27 @@ auto loops_and_captures() -> void{
14811490
});
14821491
}
14831492

1484-
#line 980 "pure2-last-use.cpp2"
1493+
#line 985 "pure2-last-use.cpp2"
14851494
auto types::f() && -> void { static_cast<void>([&, _1 = std::move(*this).x]() mutable -> auto { return *cpp2::assert_not_null(_1); }); }
1486-
#line 981 "pure2-last-use.cpp2"
1495+
#line 986 "pure2-last-use.cpp2"
14871496
auto types::g() && -> void{
14881497
for (
14891498
[[maybe_unused]] auto const& unnamed_param_1 : { [&, _1 = std::move(*this).x]() mutable -> auto { return *cpp2::assert_not_null(_1); } } )
14901499
{}
14911500
}
14921501

1493-
#line 988 "pure2-last-use.cpp2"
1502+
#line 993 "pure2-last-use.cpp2"
14941503
auto skip_hidden_names() -> void{
14951504
static_cast<void>([]() mutable -> void{
14961505
auto x {cpp2_new<int>(0)};
14971506
f_copy(std::move(x));
14981507
{
14991508
auto x{cpp2_new<int>(0)};
15001509

1501-
#line 993 "pure2-last-use.cpp2"
1510+
#line 998 "pure2-last-use.cpp2"
15021511
f_copy(std::move(x));
15031512
}
1504-
#line 994 "pure2-last-use.cpp2"
1513+
#line 999 "pure2-last-use.cpp2"
15051514
});
15061515

15071516
static_cast<void>([]() mutable -> void{
@@ -1524,10 +1533,10 @@ auto x{cpp2_new<int>(0)};
15241533
{
15251534
auto x{cpp2_new<int>(0)};
15261535

1527-
#line 1014 "pure2-last-use.cpp2"
1536+
#line 1019 "pure2-last-use.cpp2"
15281537
f_copy(std::move(x));
15291538
}
1530-
#line 1015 "pure2-last-use.cpp2"
1539+
#line 1020 "pure2-last-use.cpp2"
15311540
});
15321541

15331542
static_cast<void>([]() mutable -> void{
@@ -1551,10 +1560,10 @@ auto x{cpp2_new<int>(0)};
15511560
});
15521561
}
15531562

1554-
#line 1038 "pure2-last-use.cpp2"
1563+
#line 1043 "pure2-last-use.cpp2"
15551564
auto main(int const argc_, char** argv_) -> int{
15561565
auto const args = cpp2::make_args(argc_, argv_);
1557-
#line 1039 "pure2-last-use.cpp2"
1566+
#line 1044 "pure2-last-use.cpp2"
15581567
issue_683(args);
15591568
issue_847_2(std::vector<std::unique_ptr<int>>());
15601569
issue_847_5(args);

source/sema.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -832,9 +832,10 @@ class sema
832832
else if (auto sym = std::get_if<symbol::active::identifier>(&symbols[i].sym);
833833
sym
834834
&& sym->is_using_declaration()
835+
&& sym->identifier
836+
&& *sym->identifier == *id
835837
)
836838
{
837-
assert(sym->identifier);
838839
skip_to(sym->identifier);
839840
return true;
840841
}

source/to_cpp1.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1788,7 +1788,6 @@ class cppfront
17881788
// This way, members of lvalue reference type won't be implicitly moved
17891789
bool add_this =
17901790
add_move
1791-
&& synthesized_multi_return_size == 0
17921791
&& decl
17931792
&& decl->identifier
17941793
&& *decl->identifier == "this"

0 commit comments

Comments
 (0)