diff options
author | Florian Diebold <[email protected]> | 2019-12-20 15:41:32 +0000 |
---|---|---|
committer | Florian Diebold <[email protected]> | 2019-12-20 17:16:11 +0000 |
commit | 2a8c9100bfb1294a469bc039a5b9597eabed7073 (patch) | |
tree | ae4e2dd0ae2c62baf79ec1197f5ec5f94a7645e5 /crates/ra_hir_ty/src/tests | |
parent | cfc50ff160d0af2ce5cd931c6d41161abfdb2fbd (diff) |
Handle closure return types
Fixes #2547.
Diffstat (limited to 'crates/ra_hir_ty/src/tests')
-rw-r--r-- | crates/ra_hir_ty/src/tests/coercion.rs | 31 | ||||
-rw-r--r-- | crates/ra_hir_ty/src/tests/simple.rs | 55 |
2 files changed, 86 insertions, 0 deletions
diff --git a/crates/ra_hir_ty/src/tests/coercion.rs b/crates/ra_hir_ty/src/tests/coercion.rs index ac9e3872a..33d6ca403 100644 --- a/crates/ra_hir_ty/src/tests/coercion.rs +++ b/crates/ra_hir_ty/src/tests/coercion.rs | |||
@@ -440,3 +440,34 @@ fn test() { | |||
440 | "### | 440 | "### |
441 | ); | 441 | ); |
442 | } | 442 | } |
443 | |||
444 | #[test] | ||
445 | fn closure_return_coerce() { | ||
446 | assert_snapshot!( | ||
447 | infer_with_mismatches(r#" | ||
448 | fn foo() { | ||
449 | let x = || { | ||
450 | if true { | ||
451 | return &1u32; | ||
452 | } | ||
453 | &&1u32 | ||
454 | }; | ||
455 | } | ||
456 | "#, true), | ||
457 | @r###" | ||
458 | [10; 106) '{ ... }; }': () | ||
459 | [20; 21) 'x': || -> &u32 | ||
460 | [24; 103) '|| { ... }': || -> &u32 | ||
461 | [27; 103) '{ ... }': &u32 | ||
462 | [37; 82) 'if tru... }': () | ||
463 | [40; 44) 'true': bool | ||
464 | [45; 82) '{ ... }': ! | ||
465 | [59; 71) 'return &1u32': ! | ||
466 | [66; 71) '&1u32': &u32 | ||
467 | [67; 71) '1u32': u32 | ||
468 | [91; 97) '&&1u32': &&u32 | ||
469 | [92; 97) '&1u32': &u32 | ||
470 | [93; 97) '1u32': u32 | ||
471 | "### | ||
472 | ); | ||
473 | } | ||
diff --git a/crates/ra_hir_ty/src/tests/simple.rs b/crates/ra_hir_ty/src/tests/simple.rs index 18976c9ae..6fe647a5e 100644 --- a/crates/ra_hir_ty/src/tests/simple.rs +++ b/crates/ra_hir_ty/src/tests/simple.rs | |||
@@ -1606,3 +1606,58 @@ fn main() { | |||
1606 | ); | 1606 | ); |
1607 | assert_eq!(t, "u32"); | 1607 | assert_eq!(t, "u32"); |
1608 | } | 1608 | } |
1609 | |||
1610 | #[test] | ||
1611 | fn closure_return() { | ||
1612 | assert_snapshot!( | ||
1613 | infer(r#" | ||
1614 | fn foo() -> u32 { | ||
1615 | let x = || -> usize { return 1; }; | ||
1616 | } | ||
1617 | "#), | ||
1618 | @r###" | ||
1619 | [17; 59) '{ ...; }; }': () | ||
1620 | [27; 28) 'x': || -> usize | ||
1621 | [31; 56) '|| -> ...n 1; }': || -> usize | ||
1622 | [43; 56) '{ return 1; }': ! | ||
1623 | [45; 53) 'return 1': ! | ||
1624 | [52; 53) '1': usize | ||
1625 | "### | ||
1626 | ); | ||
1627 | } | ||
1628 | |||
1629 | #[test] | ||
1630 | fn closure_return_unit() { | ||
1631 | assert_snapshot!( | ||
1632 | infer(r#" | ||
1633 | fn foo() -> u32 { | ||
1634 | let x = || { return; }; | ||
1635 | } | ||
1636 | "#), | ||
1637 | @r###" | ||
1638 | [17; 48) '{ ...; }; }': () | ||
1639 | [27; 28) 'x': || -> () | ||
1640 | [31; 45) '|| { return; }': || -> () | ||
1641 | [34; 45) '{ return; }': ! | ||
1642 | [36; 42) 'return': ! | ||
1643 | "### | ||
1644 | ); | ||
1645 | } | ||
1646 | |||
1647 | #[test] | ||
1648 | fn closure_return_inferred() { | ||
1649 | assert_snapshot!( | ||
1650 | infer(r#" | ||
1651 | fn foo() -> u32 { | ||
1652 | let x = || { "test" }; | ||
1653 | } | ||
1654 | "#), | ||
1655 | @r###" | ||
1656 | [17; 47) '{ ..." }; }': () | ||
1657 | [27; 28) 'x': || -> &str | ||
1658 | [31; 44) '|| { "test" }': || -> &str | ||
1659 | [34; 44) '{ "test" }': &str | ||
1660 | [36; 42) '"test"': &str | ||
1661 | "### | ||
1662 | ); | ||
1663 | } | ||