diff options
author | Laurențiu Nicola <[email protected]> | 2020-04-05 16:18:40 +0100 |
---|---|---|
committer | Laurențiu Nicola <[email protected]> | 2020-04-05 16:18:40 +0100 |
commit | b58a7f41f14f56375c602911be768d40cf46de04 (patch) | |
tree | 9c27eb88a68fceade7480ac83b1ba271c8e1f6f0 /crates | |
parent | e300e1e8d8f4de273d52fa62762ed14e8a7f96bb (diff) |
Fix inference of function pointer return types
Diffstat (limited to 'crates')
-rw-r--r-- | crates/ra_hir_def/src/type_ref.rs | 6 | ||||
-rw-r--r-- | crates/ra_hir_ty/src/tests/simple.rs | 26 |
2 files changed, 31 insertions, 1 deletions
diff --git a/crates/ra_hir_def/src/type_ref.rs b/crates/ra_hir_def/src/type_ref.rs index 102fdb13d..01cc392db 100644 --- a/crates/ra_hir_def/src/type_ref.rs +++ b/crates/ra_hir_def/src/type_ref.rs | |||
@@ -93,7 +93,11 @@ impl TypeRef { | |||
93 | } | 93 | } |
94 | ast::TypeRef::PlaceholderType(_inner) => TypeRef::Placeholder, | 94 | ast::TypeRef::PlaceholderType(_inner) => TypeRef::Placeholder, |
95 | ast::TypeRef::FnPointerType(inner) => { | 95 | ast::TypeRef::FnPointerType(inner) => { |
96 | let ret_ty = TypeRef::from_ast_opt(inner.ret_type().and_then(|rt| rt.type_ref())); | 96 | let ret_ty = inner |
97 | .ret_type() | ||
98 | .and_then(|rt| rt.type_ref()) | ||
99 | .map(TypeRef::from_ast) | ||
100 | .unwrap_or_else(|| TypeRef::Tuple(Vec::new())); | ||
97 | let mut params = if let Some(pl) = inner.param_list() { | 101 | let mut params = if let Some(pl) = inner.param_list() { |
98 | pl.params().map(|p| p.ascribed_type()).map(TypeRef::from_ast_opt).collect() | 102 | pl.params().map(|p| p.ascribed_type()).map(TypeRef::from_ast_opt).collect() |
99 | } else { | 103 | } else { |
diff --git a/crates/ra_hir_ty/src/tests/simple.rs b/crates/ra_hir_ty/src/tests/simple.rs index a600b947d..141f0245a 100644 --- a/crates/ra_hir_ty/src/tests/simple.rs +++ b/crates/ra_hir_ty/src/tests/simple.rs | |||
@@ -1729,3 +1729,29 @@ fn foo() -> u32 { | |||
1729 | "### | 1729 | "### |
1730 | ); | 1730 | ); |
1731 | } | 1731 | } |
1732 | |||
1733 | #[test] | ||
1734 | fn fn_pointer_return() { | ||
1735 | assert_snapshot!( | ||
1736 | infer(r#" | ||
1737 | struct Vtable { | ||
1738 | method: fn(), | ||
1739 | } | ||
1740 | |||
1741 | fn main() { | ||
1742 | let vtable = Vtable { method: || {} }; | ||
1743 | let m = vtable.method; | ||
1744 | } | ||
1745 | "#), | ||
1746 | @r###" | ||
1747 | [48; 121) '{ ...hod; }': () | ||
1748 | [58; 64) 'vtable': Vtable | ||
1749 | [67; 91) 'Vtable...| {} }': Vtable | ||
1750 | [84; 89) '|| {}': || -> () | ||
1751 | [87; 89) '{}': () | ||
1752 | [101; 102) 'm': fn() -> () | ||
1753 | [105; 111) 'vtable': Vtable | ||
1754 | [105; 118) 'vtable.method': fn() -> () | ||
1755 | "### | ||
1756 | ); | ||
1757 | } | ||