@@ -3966,7 +3966,7 @@ fn g(t: &(dyn T + Send)) {
3966
3966
3967
3967
#[ test]
3968
3968
fn gats_in_path ( ) {
3969
- check_infer_with_mismatches (
3969
+ check_types (
3970
3970
r#"
3971
3971
//- minicore: deref
3972
3972
use core::ops::Deref;
@@ -3976,32 +3976,22 @@ trait PointerFamily {
3976
3976
3977
3977
fn f<P: PointerFamily>(p: P::Pointer<i32>) {
3978
3978
let a = *p;
3979
+ //^ i32
3979
3980
}
3980
3981
fn g<P: PointerFamily>(p: <P as PointerFamily>::Pointer<i32>) {
3981
3982
let a = *p;
3983
+ //^ i32
3982
3984
}
3983
3985
"# ,
3984
- expect ! [ [ r#"
3985
- 110..111 'p': PointerFamily::Pointer<i32, P>
3986
- 130..149 '{ ... *p; }': ()
3987
- 140..141 'a': i32
3988
- 144..146 '*p': i32
3989
- 145..146 'p': PointerFamily::Pointer<i32, P>
3990
- 173..174 'p': PointerFamily::Pointer<i32, P>
3991
- 212..231 '{ ... *p; }': ()
3992
- 222..223 'a': i32
3993
- 226..228 '*p': i32
3994
- 227..228 'p': PointerFamily::Pointer<i32, P>
3995
- "# ] ] ,
3996
3986
) ;
3997
3987
}
3998
3988
3999
3989
#[ test]
4000
3990
fn gats_with_impl_trait ( ) {
4001
- // FIXME: the last function (`fn h ()`) is not valid Rust as of this writing because you cannot
4002
- // specify the same associated type multiple times even if their arguments are different.
4003
- // Reconsider how to treat these invalid types.
4004
- check_infer_with_mismatches (
3991
+ // FIXME: the last function (`fn i ()`) is not valid Rust as of this writing because you cannot
3992
+ // specify the same associated type multiple times even if their arguments are different (c.f .
3993
+ // `fn h()`, which is valid). Reconsider how to treat these invalid types.
3994
+ check_types (
4005
3995
r#"
4006
3996
//- minicore: deref
4007
3997
use core::ops::Deref;
@@ -4012,45 +4002,30 @@ trait Trait {
4012
4002
}
4013
4003
4014
4004
fn f<T>(v: impl Trait) {
4015
- v.get::<i32>().deref();
4016
- v.get::<T>().deref();
4005
+ let a = v.get::<i32>().deref();
4006
+ //^ &i32
4007
+ let a = v.get::<T>().deref();
4008
+ //^ &T
4017
4009
}
4018
- fn g<T >(v: impl Trait<Assoc<T> = &'a T>) {
4010
+ fn g<'a, T: 'a >(v: impl Trait<Assoc<T> = &'a T>) {
4019
4011
let a = v.get::<T>();
4012
+ //^ &T
4020
4013
let a = v.get::<()>();
4014
+ //^ Trait::Assoc<(), impl Trait<Assoc<T> = &T>>
4015
+ }
4016
+ fn h<'a>(v: impl Trait<Assoc<i32> = &'a i32> + Trait<Assoc<i64> = &'a i64>) {
4017
+ let a = v.get::<i32>();
4018
+ //^ &i32
4019
+ let a = v.get::<i64>();
4020
+ //^ &i64
4021
4021
}
4022
- fn h (v: impl Trait<Assoc<i32> = &'a i32, Assoc<i64> = &'a i64> {
4022
+ fn i<'a> (v: impl Trait<Assoc<i32> = &'a i32, Assoc<i64> = &'a i64>) {
4023
4023
let a = v.get::<i32>();
4024
+ //^ &i32
4024
4025
let a = v.get::<i64>();
4026
+ //^ &i64
4025
4027
}
4026
4028
"# ,
4027
- expect ! [ [ r#"
4028
- 90..94 'self': &Self
4029
- 126..127 'v': impl Trait
4030
- 141..198 '{ ...f(); }': ()
4031
- 147..148 'v': impl Trait
4032
- 147..161 'v.get::<i32>()': Trait::Assoc<i32, impl Trait>
4033
- 147..169 'v.get:...eref()': &i32
4034
- 175..176 'v': impl Trait
4035
- 175..187 'v.get::<T>()': Trait::Assoc<T, impl Trait>
4036
- 175..195 'v.get:...eref()': &T
4037
- 207..208 'v': impl Trait<Assoc<T> = &T>
4038
- 240..296 '{ ...>(); }': ()
4039
- 250..251 'a': &T
4040
- 254..255 'v': impl Trait<Assoc<T> = &T>
4041
- 254..266 'v.get::<T>()': &T
4042
- 276..277 'a': Trait::Assoc<(), impl Trait<Assoc<T> = &T>>
4043
- 280..281 'v': impl Trait<Assoc<T> = &T>
4044
- 280..293 'v.get::<()>()': Trait::Assoc<(), impl Trait<Assoc<T> = &T>>
4045
- 302..303 'v': impl Trait<Assoc<i32> = &i32, Assoc<i64> = &i64>
4046
- 360..419 '{ ...>(); }': ()
4047
- 370..371 'a': &i32
4048
- 374..375 'v': impl Trait<Assoc<i32> = &i32, Assoc<i64> = &i64>
4049
- 374..388 'v.get::<i32>()': &i32
4050
- 398..399 'a': &i64
4051
- 402..403 'v': impl Trait<Assoc<i32> = &i32, Assoc<i64> = &i64>
4052
- 402..416 'v.get::<i64>()': &i64
4053
- "# ] ] ,
4054
4029
) ;
4055
4030
}
4056
4031
@@ -4086,7 +4061,7 @@ fn f<'a>(v: &dyn Trait<Assoc<i32> = &'a i32>) {
4086
4061
4087
4062
#[ test]
4088
4063
fn gats_in_associated_type_binding ( ) {
4089
- check_infer_with_mismatches (
4064
+ check_types (
4090
4065
r#"
4091
4066
trait Trait {
4092
4067
type Assoc<T>;
@@ -4099,24 +4074,13 @@ where
4099
4074
T: Trait<Assoc<isize> = usize>,
4100
4075
{
4101
4076
let a = t.get::<i32>();
4077
+ //^ u32
4102
4078
let a = t.get::<isize>();
4079
+ //^ usize
4103
4080
let a = t.get::<()>();
4081
+ //^ Trait::Assoc<(), T>
4104
4082
}
4105
4083
4106
4084
"# ,
4107
- expect ! [ [ r#"
4108
- 48..52 'self': &Self
4109
- 84..85 't': T
4110
- 164..252 '{ ...>(); }': ()
4111
- 174..175 'a': u32
4112
- 178..179 't': T
4113
- 178..192 't.get::<i32>()': u32
4114
- 202..203 'a': usize
4115
- 206..207 't': T
4116
- 206..222 't.get:...ize>()': usize
4117
- 232..233 'a': Trait::Assoc<(), T>
4118
- 236..237 't': T
4119
- 236..249 't.get::<()>()': Trait::Assoc<(), T>
4120
- "# ] ] ,
4121
- )
4085
+ ) ;
4122
4086
}
0 commit comments