]> git.lizzy.rs Git - rust.git/commitdiff
Fix inference of function pointer return types
authorLaurențiu Nicola <lnicola@dend.ro>
Sun, 5 Apr 2020 15:18:40 +0000 (18:18 +0300)
committerLaurențiu Nicola <lnicola@dend.ro>
Sun, 5 Apr 2020 15:18:40 +0000 (18:18 +0300)
crates/ra_hir_def/src/type_ref.rs
crates/ra_hir_ty/src/tests/simple.rs

index 102fdb13d72f5ed70e1f20e6100ac10739328b32..01cc392db02709ad5d445f42e1da374e5a32feda 100644 (file)
@@ -93,7 +93,11 @@ pub(crate) fn from_ast(node: ast::TypeRef) -> Self {
             }
             ast::TypeRef::PlaceholderType(_inner) => TypeRef::Placeholder,
             ast::TypeRef::FnPointerType(inner) => {
-                let ret_ty = TypeRef::from_ast_opt(inner.ret_type().and_then(|rt| rt.type_ref()));
+                let ret_ty = inner
+                    .ret_type()
+                    .and_then(|rt| rt.type_ref())
+                    .map(TypeRef::from_ast)
+                    .unwrap_or_else(|| TypeRef::Tuple(Vec::new()));
                 let mut params = if let Some(pl) = inner.param_list() {
                     pl.params().map(|p| p.ascribed_type()).map(TypeRef::from_ast_opt).collect()
                 } else {
index a600b947d0af5819a503f51753d86d1b9ada1707..141f0245aa0868952dd613c4f453e598c9636e25 100644 (file)
@@ -1729,3 +1729,29 @@ fn foo() -> u32 {
     "###
     );
 }
+
+#[test]
+fn fn_pointer_return() {
+    assert_snapshot!(
+        infer(r#"
+struct Vtable {
+    method: fn(),
+}
+
+fn main() {
+    let vtable = Vtable { method: || {} };
+    let m = vtable.method;
+}
+"#),
+        @r###"
+    [48; 121) '{     ...hod; }': ()
+    [58; 64) 'vtable': Vtable
+    [67; 91) 'Vtable...| {} }': Vtable
+    [84; 89) '|| {}': || -> ()
+    [87; 89) '{}': ()
+    [101; 102) 'm': fn() -> ()
+    [105; 111) 'vtable': Vtable
+    [105; 118) 'vtable.method': fn() -> ()
+    "###
+    );
+}