Auto merge of #113742 - compiler-errors:dont-short-circuit-intercrate-global-preds, r=lcnr
Don't call `predicate_must_hold`-esque functions during fulfillment in intercrate Fixes #113415 Given that this only happens in `translate_substs`, I don't actually think that this is something that you can weaponize, but it's still sketchy regardless. r? `@lcnr`
This commit is contained in:
commit
0e8e857b11
3 changed files with 38 additions and 2 deletions
|
@ -670,7 +670,7 @@ impl<'a, 'tcx> FulfillProcessor<'a, 'tcx> {
|
||||||
stalled_on: &mut Vec<TyOrConstInferVar<'tcx>>,
|
stalled_on: &mut Vec<TyOrConstInferVar<'tcx>>,
|
||||||
) -> ProcessResult<PendingPredicateObligation<'tcx>, FulfillmentErrorCode<'tcx>> {
|
) -> ProcessResult<PendingPredicateObligation<'tcx>, FulfillmentErrorCode<'tcx>> {
|
||||||
let infcx = self.selcx.infcx;
|
let infcx = self.selcx.infcx;
|
||||||
if obligation.predicate.is_global() {
|
if obligation.predicate.is_global() && !self.selcx.is_intercrate() {
|
||||||
// no type variables present, can use evaluation for better caching.
|
// no type variables present, can use evaluation for better caching.
|
||||||
// FIXME: consider caching errors too.
|
// FIXME: consider caching errors too.
|
||||||
if infcx.predicate_must_hold_considering_regions(obligation) {
|
if infcx.predicate_must_hold_considering_regions(obligation) {
|
||||||
|
@ -724,7 +724,7 @@ impl<'a, 'tcx> FulfillProcessor<'a, 'tcx> {
|
||||||
) -> ProcessResult<PendingPredicateObligation<'tcx>, FulfillmentErrorCode<'tcx>> {
|
) -> ProcessResult<PendingPredicateObligation<'tcx>, FulfillmentErrorCode<'tcx>> {
|
||||||
let tcx = self.selcx.tcx();
|
let tcx = self.selcx.tcx();
|
||||||
|
|
||||||
if obligation.predicate.is_global() {
|
if obligation.predicate.is_global() && !self.selcx.is_intercrate() {
|
||||||
// no type variables present, can use evaluation for better caching.
|
// no type variables present, can use evaluation for better caching.
|
||||||
// FIXME: consider caching errors too.
|
// FIXME: consider caching errors too.
|
||||||
if self.selcx.infcx.predicate_must_hold_considering_regions(obligation) {
|
if self.selcx.infcx.predicate_must_hold_considering_regions(obligation) {
|
||||||
|
|
24
tests/ui/coherence/coherence-doesnt-use-infcx-evaluate.rs
Normal file
24
tests/ui/coherence/coherence-doesnt-use-infcx-evaluate.rs
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
// check-pass
|
||||||
|
// issue: 113415
|
||||||
|
|
||||||
|
// Makes sure that coherence doesn't call any of the `predicate_may_hold`-esque fns,
|
||||||
|
// since they are using a different infcx which doesn't preserve the intercrate flag.
|
||||||
|
|
||||||
|
#![feature(specialization)]
|
||||||
|
//~^ WARN the feature `specialization` is incomplete
|
||||||
|
|
||||||
|
trait Assoc {
|
||||||
|
type Output;
|
||||||
|
}
|
||||||
|
|
||||||
|
default impl<T> Assoc for T {
|
||||||
|
type Output = bool;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Assoc for u8 {}
|
||||||
|
|
||||||
|
trait Foo {}
|
||||||
|
impl Foo for u32 {}
|
||||||
|
impl Foo for <u8 as Assoc>::Output {}
|
||||||
|
|
||||||
|
fn main() {}
|
|
@ -0,0 +1,12 @@
|
||||||
|
warning: the feature `specialization` is incomplete and may not be safe to use and/or cause compiler crashes
|
||||||
|
--> $DIR/coherence-doesnt-use-infcx-evaluate.rs:7:12
|
||||||
|
|
|
||||||
|
LL | #![feature(specialization)]
|
||||||
|
| ^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: see issue #31844 <https://github.com/rust-lang/rust/issues/31844> for more information
|
||||||
|
= help: consider using `min_specialization` instead, which is more stable and complete
|
||||||
|
= note: `#[warn(incomplete_features)]` on by default
|
||||||
|
|
||||||
|
warning: 1 warning emitted
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue