mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-10-28 18:43:01 +00:00
Merge pull request #20666 from ChayimFriedman2/ns-cleanup1
minor: Add regression tests to some S-blocked-on-new-solver issues
This commit is contained in:
commit
c09b440f0e
2 changed files with 137 additions and 1 deletions
|
|
@ -2,6 +2,132 @@ use expect_test::expect;
|
||||||
|
|
||||||
use crate::tests::{check_infer, check_no_mismatches};
|
use crate::tests::{check_infer, check_no_mismatches};
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn regression_20365() {
|
||||||
|
check_infer(
|
||||||
|
r#"
|
||||||
|
//- minicore: iterator
|
||||||
|
struct Vec<T>(T);
|
||||||
|
struct IntoIter<T>(T);
|
||||||
|
impl<T> IntoIterator for Vec<T> {
|
||||||
|
type IntoIter = IntoIter<T>;
|
||||||
|
type Item = T;
|
||||||
|
}
|
||||||
|
impl<T> Iterator for IntoIter<T> {
|
||||||
|
type Item = T;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn f<T: Space>(a: Vec<u8>) {
|
||||||
|
let iter = a.into_iter();
|
||||||
|
}
|
||||||
|
|
||||||
|
pub trait Space: IntoIterator {
|
||||||
|
type Ty: Space;
|
||||||
|
}
|
||||||
|
impl Space for [u8; 1] {
|
||||||
|
type Ty = Self;
|
||||||
|
}
|
||||||
|
"#,
|
||||||
|
expect![[r#"
|
||||||
|
201..202 'a': Vec<u8>
|
||||||
|
213..246 '{ ...r(); }': ()
|
||||||
|
223..227 'iter': IntoIter<u8>
|
||||||
|
230..231 'a': Vec<u8>
|
||||||
|
230..243 'a.into_iter()': IntoIter<u8>
|
||||||
|
"#]],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn regression_19971() {
|
||||||
|
check_infer(
|
||||||
|
r#"
|
||||||
|
//- minicore: pointee
|
||||||
|
fn make<T>(_thin: *const (), _meta: core::ptr::DynMetadata<T>) -> *const T
|
||||||
|
where
|
||||||
|
T: core::ptr::Pointee<Metadata = core::ptr::DynMetadata<T>> + ?Sized,
|
||||||
|
{
|
||||||
|
loop {}
|
||||||
|
}
|
||||||
|
trait Foo {
|
||||||
|
fn foo(&self) -> i32 {
|
||||||
|
loop {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test() -> i32 {
|
||||||
|
struct F {}
|
||||||
|
impl Foo for F {}
|
||||||
|
let meta = core::ptr::metadata(0 as *const F as *const dyn Foo);
|
||||||
|
|
||||||
|
let f = F {};
|
||||||
|
let fat_ptr = make(&f as *const F as *const (), meta); // <-- infers type as `*const {unknown}`
|
||||||
|
|
||||||
|
let fat_ref = unsafe { &*fat_ptr }; // <-- infers type as `&{unknown}`
|
||||||
|
fat_ref.foo() // cannot 'go to definition' on `foo`
|
||||||
|
}
|
||||||
|
|
||||||
|
"#,
|
||||||
|
expect![[r#"
|
||||||
|
11..16 '_thin': *const ()
|
||||||
|
29..34 '_meta': DynMetadata<T>
|
||||||
|
155..170 '{ loop {} }': *const T
|
||||||
|
161..168 'loop {}': !
|
||||||
|
166..168 '{}': ()
|
||||||
|
195..199 'self': &'? Self
|
||||||
|
208..231 '{ ... }': i32
|
||||||
|
218..225 'loop {}': !
|
||||||
|
223..225 '{}': ()
|
||||||
|
252..613 '{ ...foo` }': i32
|
||||||
|
300..304 'meta': DynMetadata<dyn Foo + '?>
|
||||||
|
307..326 'core::...tadata': fn metadata<dyn Foo + '?>(*const (dyn Foo + '?)) -> <dyn Foo + '? as Pointee>::Metadata
|
||||||
|
307..359 'core::...n Foo)': DynMetadata<dyn Foo + '?>
|
||||||
|
327..328 '0': usize
|
||||||
|
327..340 '0 as *const F': *const F
|
||||||
|
327..358 '0 as *...yn Foo': *const (dyn Foo + '?)
|
||||||
|
370..371 'f': F
|
||||||
|
374..378 'F {}': F
|
||||||
|
388..395 'fat_ptr': *const (dyn Foo + '?)
|
||||||
|
398..402 'make': fn make<dyn Foo + '?>(*const (), DynMetadata<dyn Foo + '?>) -> *const (dyn Foo + '?)
|
||||||
|
398..437 'make(&... meta)': *const (dyn Foo + '?)
|
||||||
|
403..405 '&f': &'? F
|
||||||
|
403..417 '&f as *const F': *const F
|
||||||
|
403..430 '&f as ...nst ()': *const ()
|
||||||
|
404..405 'f': F
|
||||||
|
432..436 'meta': DynMetadata<dyn Foo + '?>
|
||||||
|
489..496 'fat_ref': &'? (dyn Foo + '?)
|
||||||
|
499..519 'unsafe..._ptr }': &'? (dyn Foo + '?)
|
||||||
|
508..517 '&*fat_ptr': &'? (dyn Foo + '?)
|
||||||
|
509..517 '*fat_ptr': dyn Foo + '?
|
||||||
|
510..517 'fat_ptr': *const (dyn Foo + '?)
|
||||||
|
560..567 'fat_ref': &'? (dyn Foo + '?)
|
||||||
|
560..573 'fat_ref.foo()': i32
|
||||||
|
"#]],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn regression_19752() {
|
||||||
|
check_no_mismatches(
|
||||||
|
r#"
|
||||||
|
//- minicore: sized, copy
|
||||||
|
trait T1<T: T2>: Sized + Copy {
|
||||||
|
fn a(self, other: Self) -> Self {
|
||||||
|
other
|
||||||
|
}
|
||||||
|
|
||||||
|
fn b(&mut self, other: Self) {
|
||||||
|
*self = self.a(other);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
trait T2: Sized {
|
||||||
|
type T1: T1<Self>;
|
||||||
|
}
|
||||||
|
"#,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn opaque_generics() {
|
fn opaque_generics() {
|
||||||
check_infer(
|
check_infer(
|
||||||
|
|
|
||||||
|
|
@ -55,7 +55,7 @@
|
||||||
//! panic: fmt
|
//! panic: fmt
|
||||||
//! phantom_data:
|
//! phantom_data:
|
||||||
//! pin:
|
//! pin:
|
||||||
//! pointee: copy, send, sync, ord, hash, unpin
|
//! pointee: copy, send, sync, ord, hash, unpin, phantom_data
|
||||||
//! range:
|
//! range:
|
||||||
//! receiver: deref
|
//! receiver: deref
|
||||||
//! result:
|
//! result:
|
||||||
|
|
@ -504,6 +504,16 @@ pub mod ptr {
|
||||||
#[lang = "metadata_type"]
|
#[lang = "metadata_type"]
|
||||||
type Metadata: Copy + Send + Sync + Ord + Hash + Unpin;
|
type Metadata: Copy + Send + Sync + Ord + Hash + Unpin;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[lang = "dyn_metadata"]
|
||||||
|
pub struct DynMetadata<Dyn: PointeeSized> {
|
||||||
|
_phantom: crate::marker::PhantomData<Dyn>,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub const fn metadata<T: PointeeSized>(ptr: *const T) -> <T as Pointee>::Metadata {
|
||||||
|
loop {}
|
||||||
|
}
|
||||||
|
|
||||||
// endregion:pointee
|
// endregion:pointee
|
||||||
// region:non_null
|
// region:non_null
|
||||||
#[rustc_layout_scalar_valid_range_start(1)]
|
#[rustc_layout_scalar_valid_range_start(1)]
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue