Skip to content

Commit f07338b

Browse files
committed
Add test for dyn Fn Output
1 parent 436dcd9 commit f07338b

File tree

1 file changed

+68
-0
lines changed

1 file changed

+68
-0
lines changed

crates/ra_hir_ty/src/tests/traits.rs

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3043,3 +3043,71 @@ fn infer_box_fn_arg() {
30433043
"###
30443044
);
30453045
}
3046+
3047+
#[test]
3048+
fn infer_dyn_fn_output() {
3049+
assert_snapshot!(
3050+
infer(
3051+
r#"
3052+
//- /lib.rs deps:std
3053+
3054+
#[lang = "fn_once"]
3055+
pub trait FnOnce<Args> {
3056+
type Output;
3057+
3058+
extern "rust-call" fn call_once(self, args: Args) -> Self::Output;
3059+
}
3060+
3061+
#[lang = "fn"]
3062+
pub trait Fn<Args>:FnOnce<Args> {
3063+
extern "rust-call" fn call(&self, args: Args) -> Self::Output;
3064+
}
3065+
3066+
#[lang = "deref"]
3067+
pub trait Deref {
3068+
type Target: ?Sized;
3069+
3070+
fn deref(&self) -> &Self::Target;
3071+
}
3072+
3073+
#[lang = "owned_box"]
3074+
pub struct Box<T: ?Sized> {
3075+
inner: *mut T,
3076+
}
3077+
3078+
impl<T: ?Sized> Deref for Box<T> {
3079+
type Target = T;
3080+
3081+
fn deref(&self) -> &T {
3082+
&self.inner
3083+
}
3084+
}
3085+
3086+
fn foo() {
3087+
let f: Box<dyn Fn() -> i32> = box(|| 5);
3088+
let x = f();
3089+
}
3090+
"#
3091+
),
3092+
@r###"
3093+
182..186 'self': Self
3094+
188..192 'args': Args
3095+
349..353 'self': &Self
3096+
355..359 'args': Args
3097+
523..527 'self': &Self
3098+
789..793 'self': &Box<T>
3099+
801..852 '{ ... }': &T
3100+
823..834 '&self.inner': &*mut T
3101+
824..828 'self': &Box<T>
3102+
824..834 'self.inner': *mut T
3103+
889..990 '{ ... }': ()
3104+
911..912 'f': Box<dyn Fn<(), Output = i32>>
3105+
937..946 'box(|| 5)': Box<|| -> i32>
3106+
941..945 '|| 5': || -> i32
3107+
944..945 '5': i32
3108+
968..969 'x': i32
3109+
972..973 'f': Box<dyn Fn<(), Output = i32>>
3110+
972..975 'f()': i32
3111+
"###
3112+
);
3113+
}

0 commit comments

Comments
 (0)