aboutsummaryrefslogtreecommitdiff
path: root/crates
diff options
context:
space:
mode:
authorLaurenČ›iu Nicola <[email protected]>2020-04-05 16:18:40 +0100
committerLaurenČ›iu Nicola <[email protected]>2020-04-05 16:18:40 +0100
commitb58a7f41f14f56375c602911be768d40cf46de04 (patch)
tree9c27eb88a68fceade7480ac83b1ba271c8e1f6f0 /crates
parente300e1e8d8f4de273d52fa62762ed14e8a7f96bb (diff)
Fix inference of function pointer return types
Diffstat (limited to 'crates')
-rw-r--r--crates/ra_hir_def/src/type_ref.rs6
-rw-r--r--crates/ra_hir_ty/src/tests/simple.rs26
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]
1734fn fn_pointer_return() {
1735 assert_snapshot!(
1736 infer(r#"
1737struct Vtable {
1738 method: fn(),
1739}
1740
1741fn 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}