Avoid follow-up errors and ICEs after missing lifetime errors on data structures

This commit is contained in:
Oli Scherer 2024-07-04 10:27:00 +00:00
parent 8c39ac9ecc
commit dce98c52ff
22 changed files with 37 additions and 211 deletions

1
.gitignore vendored
View File

@ -50,6 +50,7 @@ build/
/target /target
/src/bootstrap/target /src/bootstrap/target
/src/tools/x/target /src/tools/x/target
/inc-fat/
# Created by default with `src/ci/docker/run.sh` # Created by default with `src/ci/docker/run.sh`
/obj/ /obj/
/rustc-ice* /rustc-ice*

View File

@ -1264,6 +1264,9 @@ pub fn resolve_vars_if_possible<T>(&self, value: T) -> T
where where
T: TypeFoldable<TyCtxt<'tcx>>, T: TypeFoldable<TyCtxt<'tcx>>,
{ {
if let Err(guar) = value.error_reported() {
self.set_tainted_by_errors(guar);
}
if !value.has_non_region_infer() { if !value.has_non_region_infer() {
return value; return value;
} }

View File

@ -1,9 +0,0 @@
//@ known-bug: #124083
struct Outest(&'a ());
fn make() -> Outest {}
fn main() {
if let Outest("foo") = make() {}
}

View File

@ -1,5 +0,0 @@
//@ known-bug: #124262
//@ edition:2021
struct Foo(<&[fn()] as ::core::ops::Deref>::Target);
const _: *const Foo = 0 as _;

View File

@ -1,17 +0,0 @@
//@ known-bug: rust-lang/rust#125155
enum NestedEnum {
First,
Second,
Third
}
enum Enum {
Variant2(Option<*mut &'a &'b ()>)
}
fn foo(x: Enum) -> isize {
match x {
Enum::Variant2(NestedEnum::Third) => 4,
}
}

View File

@ -1,17 +0,0 @@
//@ known-bug: rust-lang/rust#125888
enum NestedEnum {
First,
Second,
}
enum Enum {
Variant(*const &'a ()),
}
fn foo(x: Enum) {
match x {
Enum::Variant(NestedEnum::Second) => {}
}
}
fn main() {}

View File

@ -1,19 +0,0 @@
//@ known-bug: rust-lang/rust#125992
//@ compile-flags: -Zpolonius=next
#![feature(inherent_associated_types)]
type Function = for<'a> fn(&'a i32) -> S<'a>::P;
struct S<'a>(&'a ());
impl<'a> S {
type P = &'a i32;
}
fn ret_ref_local<'e>() -> &'e i32 {
let f: Function = |x| x;
let local = 0;
f(&local)
}

View File

@ -1,8 +0,0 @@
//@ known-bug: rust-lang/rust#126648
struct Outest(*const &'a ());
fn make() -> Outest {}
fn main() {
if let Outest("foo") = make() {}
}

View File

@ -1,18 +0,0 @@
//@ known-bug: rust-lang/rust#126666
#![feature(const_mut_refs)]
#![feature(const_refs_to_static)]
#![feature(object_safe_for_dispatch)]
struct Meh {
x: &'static dyn UnsafeCell,
}
const MUH: Meh = Meh {
x: &mut *(&READONLY as *const _ as *mut _),
};
static READONLY: i32 = 0;
trait UnsafeCell<'a> {}
pub fn main() {}

View File

@ -1,17 +0,0 @@
//@ known-bug: rust-lang/rust#127266
#![feature(const_mut_refs)]
#![feature(const_refs_to_static)]
struct Meh {
x: &'static dyn UnsafeCell,
}
const MUH: Meh = Meh {
x: &mut *(READONLY as *mut _),
};
static READONLY: i32 = 0;
trait UnsafeCell<'a> {}
pub fn main() {}

View File

@ -1,20 +0,0 @@
//@ known-bug: rust-lang/rust #127304
#![feature(adt_const_params)]
trait Trait<T> {}
impl Trait<u16> for () {}
struct MyStr(str);
impl std::marker::ConstParamTy for MyStr {}
fn function_with_my_str<const S: &'static MyStr>() -> &'static MyStr {
S
}
impl MyStr {
const fn new(s: &Trait str) -> &'static MyStr {}
}
pub fn main() {
let f = function_with_my_str::<{ MyStr::new("hello") }>();
}

View File

@ -4,7 +4,6 @@ pub struct Foo<'a, 'b, T> {
field1: dyn Bar<'a, 'b>, field1: dyn Bar<'a, 'b>,
//~^ ERROR //~^ ERROR
//~| ERROR //~| ERROR
//~| ERROR
} }
pub trait Bar<'x, 's, U> pub trait Bar<'x, 's, U>

View File

@ -5,7 +5,7 @@ LL | field1: dyn Bar<'a, 'b>,
| ^^^ expected 1 generic argument | ^^^ expected 1 generic argument
| |
note: trait defined here, with 1 generic parameter: `U` note: trait defined here, with 1 generic parameter: `U`
--> $DIR/unable-fulfill-trait.rs:10:11 --> $DIR/unable-fulfill-trait.rs:9:11
| |
LL | pub trait Bar<'x, 's, U> LL | pub trait Bar<'x, 's, U>
| ^^^ - | ^^^ -
@ -20,24 +20,7 @@ error[E0227]: ambiguous lifetime bound, explicit lifetime bound required
LL | field1: dyn Bar<'a, 'b>, LL | field1: dyn Bar<'a, 'b>,
| ^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^
error[E0478]: lifetime bound not satisfied error: aborting due to 2 previous errors
--> $DIR/unable-fulfill-trait.rs:4:13
|
LL | field1: dyn Bar<'a, 'b>,
| ^^^^^^^^^^^^^^^
|
note: lifetime parameter instantiated with the lifetime `'b` as defined here
--> $DIR/unable-fulfill-trait.rs:3:20
|
LL | pub struct Foo<'a, 'b, T> {
| ^^
note: but lifetime parameter must outlive the lifetime `'a` as defined here
--> $DIR/unable-fulfill-trait.rs:3:16
|
LL | pub struct Foo<'a, 'b, T> {
| ^^
error: aborting due to 3 previous errors Some errors have detailed explanations: E0107, E0227.
Some errors have detailed explanations: E0107, E0227, E0478.
For more information about an error, try `rustc --explain E0107`. For more information about an error, try `rustc --explain E0107`.

View File

@ -7,25 +7,13 @@ LL | pub fn call_me<Args: Sized, const IDX: usize, const FN: unsafe extern "
= note: type parameters may not be used in the type of const parameters = note: type parameters may not be used in the type of const parameters
error[E0770]: the type of const parameters must not depend on other generic parameters error[E0770]: the type of const parameters must not depend on other generic parameters
--> $DIR/issue-71381.rs:24:40 --> $DIR/issue-71381.rs:23:40
| |
LL | const FN: unsafe extern "C" fn(Args), LL | const FN: unsafe extern "C" fn(Args),
| ^^^^ the type must not depend on the parameter `Args` | ^^^^ the type must not depend on the parameter `Args`
| |
= note: type parameters may not be used in the type of const parameters = note: type parameters may not be used in the type of const parameters
error[E0594]: cannot assign to `self.0`, which is behind a `&` reference error: aborting due to 2 previous errors
--> $DIR/issue-71381.rs:17:9
|
LL | self.0 = Self::trampiline::<Args, IDX, FN> as _
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `self` is a `&` reference, so the data it refers to cannot be written
|
help: consider changing this to be a mutable reference
|
LL | pub fn call_me<Args: Sized, const IDX: usize, const FN: unsafe extern "C" fn(Args)>(&mut self) {
| ~~~~~~~~~
error: aborting due to 3 previous errors For more information about this error, try `rustc --explain E0770`.
Some errors have detailed explanations: E0594, E0770.
For more information about an error, try `rustc --explain E0594`.

View File

@ -7,7 +7,7 @@ LL | pub fn call_me<Args: Sized, const IDX: usize, const FN: unsafe extern "
= note: type parameters may not be used in the type of const parameters = note: type parameters may not be used in the type of const parameters
error[E0770]: the type of const parameters must not depend on other generic parameters error[E0770]: the type of const parameters must not depend on other generic parameters
--> $DIR/issue-71381.rs:24:40 --> $DIR/issue-71381.rs:23:40
| |
LL | const FN: unsafe extern "C" fn(Args), LL | const FN: unsafe extern "C" fn(Args),
| ^^^^ the type must not depend on the parameter `Args` | ^^^^ the type must not depend on the parameter `Args`
@ -23,25 +23,13 @@ LL | pub fn call_me<Args: Sized, const IDX: usize, const FN: unsafe extern "
= note: the only supported types are integers, `bool` and `char` = note: the only supported types are integers, `bool` and `char`
error: using function pointers as const generic parameters is forbidden error: using function pointers as const generic parameters is forbidden
--> $DIR/issue-71381.rs:24:19 --> $DIR/issue-71381.rs:23:19
| |
LL | const FN: unsafe extern "C" fn(Args), LL | const FN: unsafe extern "C" fn(Args),
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^^
| |
= note: the only supported types are integers, `bool` and `char` = note: the only supported types are integers, `bool` and `char`
error[E0594]: cannot assign to `self.0`, which is behind a `&` reference error: aborting due to 4 previous errors
--> $DIR/issue-71381.rs:17:9
|
LL | self.0 = Self::trampiline::<Args, IDX, FN> as _
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `self` is a `&` reference, so the data it refers to cannot be written
|
help: consider changing this to be a mutable reference
|
LL | pub fn call_me<Args: Sized, const IDX: usize, const FN: unsafe extern "C" fn(Args)>(&mut self) {
| ~~~~~~~~~
error: aborting due to 5 previous errors For more information about this error, try `rustc --explain E0770`.
Some errors have detailed explanations: E0594, E0770.
For more information about an error, try `rustc --explain E0594`.

View File

@ -15,7 +15,6 @@ pub fn call_me<Args: Sized, const IDX: usize, const FN: unsafe extern "C" fn(Arg
//~^ ERROR: the type of const parameters must not depend on other generic parameters //~^ ERROR: the type of const parameters must not depend on other generic parameters
//[min]~^^ ERROR: using function pointers as const generic parameters is forbidden //[min]~^^ ERROR: using function pointers as const generic parameters is forbidden
self.0 = Self::trampiline::<Args, IDX, FN> as _ self.0 = Self::trampiline::<Args, IDX, FN> as _
//~^ ERROR: cannot assign to `self.0`
} }
unsafe extern "C" fn trampiline< unsafe extern "C" fn trampiline<

View File

@ -15,7 +15,6 @@ fn gather_from_file(dir_entry: &foo::MissingItem) -> impl Iterator<Item = Lint>
fn lint_files() -> impl Iterator<Item = foo::MissingItem> { fn lint_files() -> impl Iterator<Item = foo::MissingItem> {
//~^ ERROR: failed to resolve //~^ ERROR: failed to resolve
//~| ERROR: `()` is not an iterator
unimplemented!() unimplemented!()
} }

View File

@ -1,11 +1,3 @@
error[E0277]: `()` is not an iterator
--> $DIR/issue-72911.rs:16:20
|
LL | fn lint_files() -> impl Iterator<Item = foo::MissingItem> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `()` is not an iterator
|
= help: the trait `Iterator` is not implemented for `()`
error[E0433]: failed to resolve: use of undeclared crate or module `foo` error[E0433]: failed to resolve: use of undeclared crate or module `foo`
--> $DIR/issue-72911.rs:11:33 --> $DIR/issue-72911.rs:11:33
| |
@ -18,7 +10,6 @@ error[E0433]: failed to resolve: use of undeclared crate or module `foo`
LL | fn lint_files() -> impl Iterator<Item = foo::MissingItem> { LL | fn lint_files() -> impl Iterator<Item = foo::MissingItem> {
| ^^^ use of undeclared crate or module `foo` | ^^^ use of undeclared crate or module `foo`
error: aborting due to 3 previous errors error: aborting due to 2 previous errors
Some errors have detailed explanations: E0277, E0433. For more information about this error, try `rustc --explain E0433`.
For more information about an error, try `rustc --explain E0277`.

View File

@ -9,7 +9,6 @@ impl<T, S: Iterator<Item = T>> Iterator for ChunkingIterator<T, S> {
type Item = IteratorChunk<T, S>; //~ ERROR missing lifetime type Item = IteratorChunk<T, S>; //~ ERROR missing lifetime
fn next(&mut self) -> Option<IteratorChunk<T, S>> { fn next(&mut self) -> Option<IteratorChunk<T, S>> {
//~^ ERROR `impl` item signature doesn't match `trait` item signature
todo!() todo!()
} }
} }

View File

@ -9,20 +9,6 @@ help: consider introducing a named lifetime parameter
LL | type Item<'a> = IteratorChunk<'a, T, S>; LL | type Item<'a> = IteratorChunk<'a, T, S>;
| ++++ +++ | ++++ +++
error: `impl` item signature doesn't match `trait` item signature error: aborting due to 1 previous error
--> $DIR/issue-74918-missing-lifetime.rs:11:5
|
LL | fn next(&mut self) -> Option<IteratorChunk<T, S>> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ found `fn(&'1 mut ChunkingIterator<T, S>) -> Option<IteratorChunk<'1, T, S>>`
--> $SRC_DIR/core/src/iter/traits/iterator.rs:LL:COL
|
= note: expected `fn(&'1 mut ChunkingIterator<T, S>) -> Option<IteratorChunk<'2, T, S>>`
|
= note: expected signature `fn(&'1 mut ChunkingIterator<T, S>) -> Option<IteratorChunk<'2, T, S>>`
found signature `fn(&'1 mut ChunkingIterator<T, S>) -> Option<IteratorChunk<'1, T, S>>`
= help: the lifetime requirements from the `impl` do not correspond to the requirements in the `trait`
= help: verify the lifetime relationships in the `trait` and `impl` between the `self` argument, the other inputs and its output
error: aborting due to 2 previous errors
For more information about this error, try `rustc --explain E0106`. For more information about this error, try `rustc --explain E0106`.

View File

@ -0,0 +1,9 @@
//! This test checks that we taint typeck results when there are
//! error lifetimes, even though typeck doesn't actually care about lifetimes.
struct Slice(&'reborrow [&'static [u8]]);
//~^ ERROR undeclared lifetime
static MAP: Slice = Slice(&[b"" as &'static [u8]]);
fn main() {}

View File

@ -0,0 +1,11 @@
error[E0261]: use of undeclared lifetime name `'reborrow`
--> $DIR/missing_lifetime.rs:4:15
|
LL | struct Slice(&'reborrow [&'static [u8]]);
| - ^^^^^^^^^ undeclared lifetime
| |
| help: consider introducing lifetime `'reborrow` here: `<'reborrow>`
error: aborting due to 1 previous error
For more information about this error, try `rustc --explain E0261`.