|
144 | 144 | blk3: |
145 | 145 | Statements: |
146 | 146 | End: |
147 | | - Return(v6) |
| 147 | + Return(v1) |
148 | 148 |
|
149 | 149 | //! > ========================================================================== |
150 | 150 |
|
|
368 | 368 | blk3: |
369 | 369 | Statements: |
370 | 370 | End: |
371 | | - Return(v6) |
| 371 | + Return(v1) |
372 | 372 |
|
373 | 373 | //! > ========================================================================== |
374 | 374 |
|
@@ -411,10 +411,10 @@ Statements: |
411 | 411 | (v3: core::array::Array::<core::felt252>, v2: ()) <- core::array::ArrayImpl::<core::felt252>::append(v0{`__array_builder_macro_result__`}, v1{`'err_code'`}) |
412 | 412 | (v4: core::felt252) <- 6450273 |
413 | 413 | (v6: core::array::Array::<core::felt252>, v5: ()) <- core::array::ArrayImpl::<core::felt252>::append(v3{`b`}, v4{`'bla'`}) |
414 | | - (v8: core::panics::Panic) <- struct_construct() |
415 | | - (v9: (core::panics::Panic, core::array::Array::<core::felt252>)) <- struct_construct(v8{`panic(arr)`}, v7{`arr`}) |
| 414 | + (v7: core::panics::Panic) <- struct_construct() |
| 415 | + (v8: (core::panics::Panic, core::array::Array::<core::felt252>)) <- struct_construct(v7{`panic(arr)`}, v3{`arr`}) |
416 | 416 | End: |
417 | | - Panic(v9) |
| 417 | + Panic(v8) |
418 | 418 |
|
419 | 419 | //! > ========================================================================== |
420 | 420 |
|
@@ -458,28 +458,28 @@ blk0 (root): |
458 | 458 | Statements: |
459 | 459 | () <- test::use_non_copy(v0{`x`}) |
460 | 460 | End: |
461 | | - Match(match test::do_match_extern(v1{`x`}) { |
462 | | - Option::Some(v2) => blk1, |
| 461 | + Match(match test::do_match_extern(v0{`x`}) { |
| 462 | + Option::Some(v1) => blk1, |
463 | 463 | Option::None => blk2, |
464 | 464 | }) |
465 | 465 |
|
466 | 466 | blk1: |
467 | 467 | Statements: |
468 | | - (v3: core::option::Option::<test::NonCopy>) <- Option::Some(v2{`do_match_extern(x)`}) |
| 468 | + (v2: core::option::Option::<test::NonCopy>) <- Option::Some(v1{`do_match_extern(x)`}) |
469 | 469 | End: |
470 | | - Goto(blk3, {v3 -> v6}) |
| 470 | + Goto(blk3, {v2 -> v5}) |
471 | 471 |
|
472 | 472 | blk2: |
473 | 473 | Statements: |
474 | | - (v4: ()) <- struct_construct() |
475 | | - (v5: core::option::Option::<test::NonCopy>) <- Option::None(v4{`do_match_extern(x)`}) |
| 474 | + (v3: ()) <- struct_construct() |
| 475 | + (v4: core::option::Option::<test::NonCopy>) <- Option::None(v3{`do_match_extern(x)`}) |
476 | 476 | End: |
477 | | - Goto(blk3, {v5 -> v6}) |
| 477 | + Goto(blk3, {v4 -> v5}) |
478 | 478 |
|
479 | 479 | blk3: |
480 | 480 | Statements: |
481 | 481 | End: |
482 | | - Return(v6) |
| 482 | + Return(v5) |
483 | 483 |
|
484 | 484 | //! > ========================================================================== |
485 | 485 |
|
@@ -528,6 +528,7 @@ Statements: |
528 | 528 | (v1: core::integer::u32) <- 17 |
529 | 529 | (v2: core::integer::u32, v3: test::NonCopy) <- struct_destructure(v0{`x.a`}) |
530 | 530 | () <- test::use_non_copy(v3{`x.b`}) |
| 531 | + (v4: test::MyStruct) <- struct_construct(v1{`x`}, v3{`x`}) |
531 | 532 | End: |
532 | 533 | Return(v4) |
533 | 534 |
|
@@ -588,6 +589,8 @@ Statements: |
588 | 589 | (v4: core::array::Array::<core::felt252>, v5: core::integer::u8) <- struct_destructure(v1{`s2.a`}) |
589 | 590 | () <- test::invalidate(v4{`s2.a`}) |
590 | 591 | (v6: ()) <- struct_construct() |
| 592 | + (v7: test::MyStruct) <- struct_construct(v2{`s1`}, v3{`s1`}) |
| 593 | + (v8: test::MyStruct) <- struct_construct(v4{`s2`}, v5{`s2`}) |
591 | 594 | End: |
592 | 595 | Return(v7, v8, v6) |
593 | 596 |
|
|
661 | 664 | blk3: |
662 | 665 | Statements: |
663 | 666 | (v12: ()) <- struct_construct() |
| 667 | + (v13: test::MyStruct) <- struct_construct(v11{`self`}, v3{`self`}) |
664 | 668 | End: |
665 | 669 | Return(v13, v12) |
666 | 670 |
|
@@ -947,6 +951,7 @@ blk0 (root): |
947 | 951 | Statements: |
948 | 952 | (v1: core::felt252, v2: test::NonCopy) <- struct_destructure(v0{`x.b`}) |
949 | 953 | () <- test::consume(v2{`x.b`}) |
| 954 | + (v3: test::MyStruct) <- struct_construct(v1{`x`}, v2{`x`}) |
950 | 955 | End: |
951 | 956 | Return(v3) |
952 | 957 |
|
@@ -1119,16 +1124,18 @@ note: variable was previously used here: |
1119 | 1124 | note: Trait has no implementation in context: core::traits::Copy::<test::Wrapper>. |
1120 | 1125 |
|
1121 | 1126 | error[E3002]: Variable not dropped. |
1122 | | - --> lib.cairo:12:11 |
1123 | | - use_x(x); // Second use. |
1124 | | - ^ |
1125 | | -note: the variable needs to be dropped due to the potential panic here: |
1126 | | - --> lib.cairo:8:8 |
1127 | | - if x.inner.is_zero() { |
1128 | | - ^^^^^^^^^^^^^^^^^ |
| 1127 | + --> lib.cairo:9:15 |
| 1128 | + use_x(x); // First use. |
| 1129 | + ^ |
| 1130 | +note: the variable needs to be dropped due to the divergence here: |
| 1131 | + --> lib.cairo:8:5-10:5 |
| 1132 | + if x.inner.is_zero() { |
| 1133 | + _____^ |
| 1134 | +| use_x(x); // First use. |
| 1135 | +| } |
| 1136 | +|_____^ |
1129 | 1137 | note: Trait has no implementation in context: core::traits::Drop::<test::Wrapper>. |
1130 | 1138 | note: Trait has no implementation in context: core::traits::Destruct::<test::Wrapper>. |
1131 | | -note: Trait has no implementation in context: core::traits::PanicDestruct::<test::Wrapper>. |
1132 | 1139 |
|
1133 | 1140 | //! > lowering |
1134 | 1141 | Parameters: v0: test::Wrapper |
@@ -1156,10 +1163,10 @@ End: |
1156 | 1163 |
|
1157 | 1164 | blk3: |
1158 | 1165 | Statements: |
1159 | | - () <- test::use_x(v6{`x`}) |
1160 | | - (v7: ()) <- struct_construct() |
| 1166 | + () <- test::use_x(v5{`x`}) |
| 1167 | + (v6: ()) <- struct_construct() |
1161 | 1168 | End: |
1162 | | - Return(v7) |
| 1169 | + Return(v6) |
1163 | 1170 |
|
1164 | 1171 | //! > ========================================================================== |
1165 | 1172 |
|
@@ -1257,3 +1264,64 @@ Statements: |
1257 | 1264 | (v1: ()) <- struct_construct() |
1258 | 1265 | End: |
1259 | 1266 | Return(v1) |
| 1267 | + |
| 1268 | +//! > ========================================================================== |
| 1269 | + |
| 1270 | +//! > Spurious E3002 alongside E3001 for orphaned inner struct construction (bug repro). |
| 1271 | + |
| 1272 | +//! > test_runner_name |
| 1273 | +test_borrow_check |
| 1274 | + |
| 1275 | +//! > function_code |
| 1276 | +fn foo(outer: Outer) { |
| 1277 | + bar(outer.inner.a); |
| 1278 | + consume(outer.b); |
| 1279 | + use_outer(outer); |
| 1280 | +} |
| 1281 | + |
| 1282 | +//! > function_name |
| 1283 | +foo |
| 1284 | + |
| 1285 | +//! > module_code |
| 1286 | +extern type NonCopy; |
| 1287 | + |
| 1288 | +struct Inner { |
| 1289 | + a: felt252, |
| 1290 | +} |
| 1291 | + |
| 1292 | +struct Outer { |
| 1293 | + inner: Inner, |
| 1294 | + b: NonCopy, |
| 1295 | +} |
| 1296 | + |
| 1297 | +extern fn bar(x: felt252) nopanic; |
| 1298 | +extern fn consume(x: NonCopy) nopanic; |
| 1299 | +extern fn use_outer(x: Outer) nopanic; |
| 1300 | + |
| 1301 | +//! > semantic_diagnostics |
| 1302 | + |
| 1303 | +//! > lowering_diagnostics |
| 1304 | +error[E3001]: Variable was previously moved. |
| 1305 | + --> lib.cairo:18:15 |
| 1306 | + use_outer(outer); |
| 1307 | + ^^^^^ |
| 1308 | +note: variable was previously used here: |
| 1309 | + --> lib.cairo:17:13 |
| 1310 | + consume(outer.b); |
| 1311 | + ^^^^^^^ |
| 1312 | +note: Trait has no implementation in context: core::traits::Copy::<test::NonCopy>. |
| 1313 | + |
| 1314 | +//! > lowering |
| 1315 | +Parameters: v0: test::Outer |
| 1316 | +blk0 (root): |
| 1317 | +Statements: |
| 1318 | + (v1: test::Inner, v2: test::NonCopy) <- struct_destructure(v0{`outer.inner.a`}) |
| 1319 | + (v3: core::felt252) <- struct_destructure(v1{`outer.inner.a`}) |
| 1320 | + () <- test::bar(v3{`outer.inner.a`}) |
| 1321 | + () <- test::consume(v2{`outer.b`}) |
| 1322 | + (v4: test::Inner) <- struct_construct(v3{`outer`}) |
| 1323 | + (v5: test::Outer) <- struct_construct(v4{`outer`}, v2{`outer`}) |
| 1324 | + () <- test::use_outer(v5{`outer`}) |
| 1325 | + (v6: ()) <- struct_construct() |
| 1326 | +End: |
| 1327 | + Return(v6) |
0 commit comments