Skip to content

Commit

Permalink
Auto merge of #113742 - compiler-errors:dont-short-circuit-intercrate…
Browse files Browse the repository at this point in the history
…-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`
  • Loading branch information
bors committed Jul 16, 2023
2 parents c4083fa + 8f178d1 commit 0e8e857
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 2 deletions.
4 changes: 2 additions & 2 deletions compiler/rustc_trait_selection/src/traits/fulfill.rs
Original file line number Diff line number Diff line change
Expand Up @@ -670,7 +670,7 @@ impl<'a, 'tcx> FulfillProcessor<'a, 'tcx> {
stalled_on: &mut Vec<TyOrConstInferVar<'tcx>>,
) -> ProcessResult<PendingPredicateObligation<'tcx>, FulfillmentErrorCode<'tcx>> {
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.
// FIXME: consider caching errors too.
if infcx.predicate_must_hold_considering_regions(obligation) {
Expand Down Expand Up @@ -724,7 +724,7 @@ impl<'a, 'tcx> FulfillProcessor<'a, 'tcx> {
) -> ProcessResult<PendingPredicateObligation<'tcx>, FulfillmentErrorCode<'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.
// FIXME: consider caching errors too.
if self.selcx.infcx.predicate_must_hold_considering_regions(obligation) {
Expand Down
24 changes: 24 additions & 0 deletions tests/ui/coherence/coherence-doesnt-use-infcx-evaluate.rs
Original file line number Diff line number Diff line change
@@ -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() {}
12 changes: 12 additions & 0 deletions tests/ui/coherence/coherence-doesnt-use-infcx-evaluate.stderr
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit 0e8e857

Please sign in to comment.