mirror of
https://github.com/rust-lang/rust.git
synced 2026-04-26 13:01:27 +03:00
Revert "Fix an ICE in the vtable iteration for a trait reference"
The ICE fix appears to be unsound, causing a miscompilation involving
`dyn Trait` and `async {}` which induces segfaults in safe Rust code.
As the patch only hid an ICE, it does not seem worth the risk.
This reverts commit 8afd63610b, reversing
changes made to 19122c03c7.
This commit is contained in:
@@ -12,7 +12,7 @@
|
||||
use smallvec::{SmallVec, smallvec};
|
||||
use tracing::debug;
|
||||
|
||||
use crate::traits::is_vtable_safe_method;
|
||||
use crate::traits::{impossible_predicates, is_vtable_safe_method};
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub enum VtblSegment<'tcx> {
|
||||
@@ -271,7 +271,11 @@ fn vtable_entries<'tcx>(
|
||||
// do not hold for this particular set of type parameters.
|
||||
// Note that this method could then never be called, so we
|
||||
// do not want to try and codegen it, in that case (see #23435).
|
||||
if tcx.instantiate_and_check_impossible_predicates((def_id, args)) {
|
||||
let predicates = tcx.predicates_of(def_id).instantiate_own(tcx, args);
|
||||
if impossible_predicates(
|
||||
tcx,
|
||||
predicates.map(|(predicate, _)| predicate).collect(),
|
||||
) {
|
||||
debug!("vtable_entries: predicates do not hold");
|
||||
return VtblEntry::Vacant;
|
||||
}
|
||||
|
||||
@@ -1,8 +1,4 @@
|
||||
// Regression test for #135470.
|
||||
// Verify that we don't ICE when building vtable entries
|
||||
// for a blanket impl involving async and impossible predicates.
|
||||
|
||||
//@ check-pass
|
||||
//@ known-bug: #135470
|
||||
//@ compile-flags: -Copt-level=0
|
||||
//@ edition: 2021
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
//@ known-bug: #137190
|
||||
trait Supertrait<T> {
|
||||
fn method(&self) {}
|
||||
}
|
||||
|
||||
trait Trait<P>: Supertrait<()> {}
|
||||
|
||||
impl<P> Trait<P> for () {}
|
||||
|
||||
const fn upcast<P>(x: &dyn Trait<P>) -> &dyn Supertrait<()> {
|
||||
x
|
||||
}
|
||||
|
||||
const fn foo() -> &'static dyn Supertrait<()> {
|
||||
upcast::<()>(&())
|
||||
}
|
||||
|
||||
const _: &'static dyn Supertrait<()> = foo();
|
||||
@@ -0,0 +1,10 @@
|
||||
//@ known-bug: #137190
|
||||
trait Supertrait {
|
||||
fn method(&self) {}
|
||||
}
|
||||
|
||||
trait Trait: Supertrait {}
|
||||
|
||||
impl Trait for () {}
|
||||
|
||||
const _: &dyn Supertrait = &() as &dyn Trait as &dyn Supertrait;
|
||||
@@ -1,25 +0,0 @@
|
||||
// Regression test for #137190.
|
||||
// Variant of vtable-unsatisfied-supertrait.rs with generic traits.
|
||||
// Verify that we don't ICE when building vtable entries
|
||||
// for a generic trait whose supertrait is not implemented.
|
||||
|
||||
//@ compile-flags: --crate-type lib
|
||||
|
||||
trait Supertrait<T> {
|
||||
fn method(&self) {}
|
||||
}
|
||||
|
||||
trait Trait<P>: Supertrait<()> {}
|
||||
|
||||
impl<P> Trait<P> for () {}
|
||||
//~^ ERROR the trait bound `(): Supertrait<()>` is not satisfied
|
||||
|
||||
const fn upcast<P>(x: &dyn Trait<P>) -> &dyn Supertrait<()> {
|
||||
x
|
||||
}
|
||||
|
||||
const fn foo() -> &'static dyn Supertrait<()> {
|
||||
upcast::<()>(&())
|
||||
}
|
||||
|
||||
const _: &'static dyn Supertrait<()> = foo();
|
||||
@@ -1,20 +0,0 @@
|
||||
error[E0277]: the trait bound `(): Supertrait<()>` is not satisfied
|
||||
--> $DIR/vtable-unsatisfied-supertrait-generics.rs:14:22
|
||||
|
|
||||
LL | impl<P> Trait<P> for () {}
|
||||
| ^^ the trait `Supertrait<()>` is not implemented for `()`
|
||||
|
|
||||
help: this trait has no implementations, consider adding one
|
||||
--> $DIR/vtable-unsatisfied-supertrait-generics.rs:8:1
|
||||
|
|
||||
LL | trait Supertrait<T> {
|
||||
| ^^^^^^^^^^^^^^^^^^^
|
||||
note: required by a bound in `Trait`
|
||||
--> $DIR/vtable-unsatisfied-supertrait-generics.rs:12:17
|
||||
|
|
||||
LL | trait Trait<P>: Supertrait<()> {}
|
||||
| ^^^^^^^^^^^^^^ required by this bound in `Trait`
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0277`.
|
||||
@@ -1,16 +0,0 @@
|
||||
// Regression test for #137190.
|
||||
// Verify that we don't ICE when building vtable entries
|
||||
// for a trait whose supertrait is not implemented.
|
||||
|
||||
//@ compile-flags: --crate-type lib
|
||||
|
||||
trait Supertrait {
|
||||
fn method(&self) {}
|
||||
}
|
||||
|
||||
trait Trait: Supertrait {}
|
||||
|
||||
impl Trait for () {}
|
||||
//~^ ERROR the trait bound `(): Supertrait` is not satisfied
|
||||
|
||||
const _: &dyn Supertrait = &() as &dyn Trait as &dyn Supertrait;
|
||||
@@ -1,20 +0,0 @@
|
||||
error[E0277]: the trait bound `(): Supertrait` is not satisfied
|
||||
--> $DIR/vtable-unsatisfied-supertrait.rs:13:16
|
||||
|
|
||||
LL | impl Trait for () {}
|
||||
| ^^ the trait `Supertrait` is not implemented for `()`
|
||||
|
|
||||
help: this trait has no implementations, consider adding one
|
||||
--> $DIR/vtable-unsatisfied-supertrait.rs:7:1
|
||||
|
|
||||
LL | trait Supertrait {
|
||||
| ^^^^^^^^^^^^^^^^
|
||||
note: required by a bound in `Trait`
|
||||
--> $DIR/vtable-unsatisfied-supertrait.rs:11:14
|
||||
|
|
||||
LL | trait Trait: Supertrait {}
|
||||
| ^^^^^^^^^^ required by this bound in `Trait`
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0277`.
|
||||
Reference in New Issue
Block a user