Skip to content

Commit 3431312

Browse files
bors[bot]lnicola
andauthored
Merge #3857
3857: Fix inference of function pointer return types r=flodiebold a=lnicola Fixes #3852. r? @flodiebold Co-authored-by: Laurențiu Nicola <[email protected]>
2 parents e300e1e + b58a7f4 commit 3431312

File tree

2 files changed

+31
-1
lines changed

2 files changed

+31
-1
lines changed

crates/ra_hir_def/src/type_ref.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,11 @@ impl TypeRef {
9393
}
9494
ast::TypeRef::PlaceholderType(_inner) => TypeRef::Placeholder,
9595
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()));
97101
let mut params = if let Some(pl) = inner.param_list() {
98102
pl.params().map(|p| p.ascribed_type()).map(TypeRef::from_ast_opt).collect()
99103
} else {

crates/ra_hir_ty/src/tests/simple.rs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1729,3 +1729,29 @@ fn foo() -> u32 {
17291729
"###
17301730
);
17311731
}
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+
}

0 commit comments

Comments
 (0)