File tree Expand file tree Collapse file tree 1 file changed +68
-0
lines changed
crates/ra_hir_ty/src/tests Expand file tree Collapse file tree 1 file changed +68
-0
lines changed Original file line number Diff line number Diff line change @@ -3043,3 +3043,71 @@ fn infer_box_fn_arg() {
3043
3043
"###
3044
3044
) ;
3045
3045
}
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
+ }
You can’t perform that action at this time.
0 commit comments