}
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 {
"###
);
}
+
+#[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() -> ()
+ "###
+ );
+}