Skip to content

Commit ae3c353

Browse files
committed
fix make_ambiguous_response_no_constraints
we previously had incorrect universes in the query response.
1 parent a090b45 commit ae3c353

File tree

6 files changed

+41
-47
lines changed

6 files changed

+41
-47
lines changed

compiler/rustc_trait_selection/src/solve/eval_ctxt.rs

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ use rustc_infer::infer::at::ToTrace;
33
use rustc_infer::infer::canonical::CanonicalVarValues;
44
use rustc_infer::infer::type_variable::{TypeVariableOrigin, TypeVariableOriginKind};
55
use rustc_infer::infer::{
6-
DefineOpaqueTypes, InferCtxt, InferOk, LateBoundRegionConversionTime, RegionVariableOrigin,
7-
TyCtxtInferExt,
6+
DefineOpaqueTypes, InferCtxt, InferOk, LateBoundRegionConversionTime, TyCtxtInferExt,
87
};
98
use rustc_infer::traits::query::NoSolution;
109
use rustc_infer::traits::ObligationCause;
10+
use rustc_middle::infer::canonical::CanonicalVarInfos;
1111
use rustc_middle::infer::unify_key::{ConstVariableOrigin, ConstVariableOriginKind};
1212
use rustc_middle::traits::solve::inspect;
1313
use rustc_middle::traits::solve::{
@@ -55,6 +55,9 @@ pub struct EvalCtxt<'a, 'tcx> {
5555
/// the job already.
5656
infcx: &'a InferCtxt<'tcx>,
5757

58+
/// The variable info for the `var_values`, only used to make an ambiguous response
59+
/// with no constraints.
60+
variables: CanonicalVarInfos<'tcx>,
5861
pub(super) var_values: CanonicalVarValues<'tcx>,
5962

6063
predefined_opaques_in_body: PredefinedOpaques<'tcx>,
@@ -184,18 +187,19 @@ impl<'a, 'tcx> EvalCtxt<'a, 'tcx> {
184187

185188
let mut ecx = EvalCtxt {
186189
search_graph: &mut search_graph,
187-
infcx: infcx,
190+
infcx,
191+
nested_goals: NestedGoals::new(),
192+
inspect: ProofTreeBuilder::new_maybe_root(infcx.tcx, generate_proof_tree),
193+
188194
// Only relevant when canonicalizing the response,
189195
// which we don't do within this evaluation context.
190196
predefined_opaques_in_body: infcx
191197
.tcx
192198
.mk_predefined_opaques_in_body(PredefinedOpaquesData::default()),
193-
// Only relevant when canonicalizing the response.
194199
max_input_universe: ty::UniverseIndex::ROOT,
200+
variables: ty::List::empty(),
195201
var_values: CanonicalVarValues::dummy(),
196-
nested_goals: NestedGoals::new(),
197202
tainted: Ok(()),
198-
inspect: ProofTreeBuilder::new_maybe_root(infcx.tcx, generate_proof_tree),
199203
};
200204
let result = f(&mut ecx);
201205

@@ -245,6 +249,7 @@ impl<'a, 'tcx> EvalCtxt<'a, 'tcx> {
245249

246250
let mut ecx = EvalCtxt {
247251
infcx,
252+
variables: canonical_input.variables,
248253
var_values,
249254
predefined_opaques_in_body: input.predefined_opaques_in_body,
250255
max_input_universe: canonical_input.max_universe,
@@ -593,10 +598,6 @@ impl<'tcx> EvalCtxt<'_, 'tcx> {
593598
})
594599
}
595600

596-
pub(super) fn next_region_infer(&self) -> ty::Region<'tcx> {
597-
self.infcx.next_region_var(RegionVariableOrigin::MiscVariable(DUMMY_SP))
598-
}
599-
600601
pub(super) fn next_const_infer(&self, ty: Ty<'tcx>) -> ty::Const<'tcx> {
601602
self.infcx.next_const_var(
602603
ty,

compiler/rustc_trait_selection/src/solve/eval_ctxt/canonical.rs

Lines changed: 6 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
//! [c]: https://rustc-dev-guide.rust-lang.org/solve/canonicalization.html
1111
use super::{CanonicalInput, Certainty, EvalCtxt, Goal};
1212
use crate::solve::canonicalize::{CanonicalizeMode, Canonicalizer};
13-
use crate::solve::{CanonicalResponse, QueryResult, Response};
13+
use crate::solve::{response_no_constraints_raw, CanonicalResponse, QueryResult, Response};
1414
use rustc_data_structures::fx::FxHashSet;
1515
use rustc_index::IndexVec;
1616
use rustc_infer::infer::canonical::query_response::make_query_region_constraints;
@@ -109,29 +109,11 @@ impl<'tcx> EvalCtxt<'_, 'tcx> {
109109
&self,
110110
maybe_cause: MaybeCause,
111111
) -> CanonicalResponse<'tcx> {
112-
let unconstrained_response = Response {
113-
var_values: CanonicalVarValues {
114-
var_values: self.tcx().mk_args_from_iter(self.var_values.var_values.iter().map(
115-
|arg| -> ty::GenericArg<'tcx> {
116-
match arg.unpack() {
117-
GenericArgKind::Lifetime(_) => self.next_region_infer().into(),
118-
GenericArgKind::Type(_) => self.next_ty_infer().into(),
119-
GenericArgKind::Const(ct) => self.next_const_infer(ct.ty()).into(),
120-
}
121-
},
122-
)),
123-
},
124-
external_constraints: self
125-
.tcx()
126-
.mk_external_constraints(ExternalConstraintsData::default()),
127-
certainty: Certainty::Maybe(maybe_cause),
128-
};
129-
130-
Canonicalizer::canonicalize(
131-
self.infcx,
132-
CanonicalizeMode::Response { max_input_universe: self.max_input_universe },
133-
&mut Default::default(),
134-
unconstrained_response,
112+
response_no_constraints_raw(
113+
self.tcx(),
114+
self.max_input_universe,
115+
self.variables,
116+
Certainty::Maybe(maybe_cause),
135117
)
136118
}
137119

compiler/rustc_trait_selection/src/solve/eval_ctxt/probe.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ where
1717

1818
let mut nested_ecx = EvalCtxt {
1919
infcx: outer_ecx.infcx,
20+
variables: outer_ecx.variables,
2021
var_values: outer_ecx.var_values,
2122
predefined_opaques_in_body: outer_ecx.predefined_opaques_in_body,
2223
max_input_universe: outer_ecx.max_input_universe,

compiler/rustc_trait_selection/src/solve/mod.rs

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,11 @@
1717
use rustc_hir::def_id::DefId;
1818
use rustc_infer::infer::canonical::{Canonical, CanonicalVarValues};
1919
use rustc_infer::traits::query::NoSolution;
20+
use rustc_middle::infer::canonical::CanonicalVarInfos;
2021
use rustc_middle::traits::solve::{
2122
CanonicalResponse, Certainty, ExternalConstraintsData, Goal, QueryResult, Response,
2223
};
23-
use rustc_middle::ty::{self, Ty, TyCtxt};
24+
use rustc_middle::ty::{self, Ty, TyCtxt, UniverseIndex};
2425
use rustc_middle::ty::{
2526
CoercePredicate, RegionOutlivesPredicate, SubtypePredicate, TypeOutlivesPredicate,
2627
};
@@ -284,20 +285,21 @@ impl<'tcx> EvalCtxt<'_, 'tcx> {
284285
}
285286
}
286287

287-
pub(super) fn response_no_constraints<'tcx>(
288+
fn response_no_constraints_raw<'tcx>(
288289
tcx: TyCtxt<'tcx>,
289-
goal: Canonical<'tcx, impl Sized>,
290+
max_universe: UniverseIndex,
291+
variables: CanonicalVarInfos<'tcx>,
290292
certainty: Certainty,
291-
) -> QueryResult<'tcx> {
292-
Ok(Canonical {
293-
max_universe: goal.max_universe,
294-
variables: goal.variables,
293+
) -> CanonicalResponse<'tcx> {
294+
Canonical {
295+
max_universe,
296+
variables,
295297
value: Response {
296-
var_values: CanonicalVarValues::make_identity(tcx, goal.variables),
298+
var_values: CanonicalVarValues::make_identity(tcx, variables),
297299
// FIXME: maybe we should store the "no response" version in tcx, like
298300
// we do for tcx.types and stuff.
299301
external_constraints: tcx.mk_external_constraints(ExternalConstraintsData::default()),
300302
certainty,
301303
},
302-
})
304+
}
303305
}

compiler/rustc_trait_selection/src/solve/search_graph/mod.rs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ impl<'tcx> SearchGraph<'tcx> {
107107
}
108108

109109
let depth = self.stack.push(StackElem { input, has_been_used: false });
110-
let response = super::response_no_constraints(tcx, input, Certainty::Yes);
110+
let response = Self::response_no_constraints(tcx, input, Certainty::Yes);
111111
let entry_index = cache.entries.push(ProvisionalEntry { response, depth, input });
112112
v.insert(entry_index);
113113
Ok(())
@@ -144,7 +144,7 @@ impl<'tcx> SearchGraph<'tcx> {
144144
{
145145
Err(cache.provisional_result(entry_index))
146146
} else {
147-
Err(super::response_no_constraints(tcx, input, Certainty::OVERFLOW))
147+
Err(Self::response_no_constraints(tcx, input, Certainty::OVERFLOW))
148148
}
149149
}
150150
}
@@ -283,4 +283,12 @@ impl<'tcx> SearchGraph<'tcx> {
283283

284284
result
285285
}
286+
287+
fn response_no_constraints(
288+
tcx: TyCtxt<'tcx>,
289+
goal: CanonicalInput<'tcx>,
290+
certainty: Certainty,
291+
) -> QueryResult<'tcx> {
292+
Ok(super::response_no_constraints_raw(tcx, goal.max_universe, goal.variables, certainty))
293+
}
286294
}

compiler/rustc_trait_selection/src/solve/search_graph/overflow.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use rustc_middle::ty::TyCtxt;
55
use rustc_session::Limit;
66

77
use super::SearchGraph;
8-
use crate::solve::{response_no_constraints, EvalCtxt};
8+
use crate::solve::{response_no_constraints_raw, EvalCtxt};
99

1010
/// When detecting a solver overflow, we return ambiguity. Overflow can be
1111
/// *hidden* by either a fatal error in an **AND** or a trivial success in an **OR**.
@@ -115,6 +115,6 @@ impl<'tcx> SearchGraph<'tcx> {
115115
goal: Canonical<'tcx, impl Sized>,
116116
) -> QueryResult<'tcx> {
117117
self.overflow_data.deal_with_overflow();
118-
response_no_constraints(tcx, goal, Certainty::OVERFLOW)
118+
Ok(response_no_constraints_raw(tcx, goal.max_universe, goal.variables, Certainty::OVERFLOW))
119119
}
120120
}

0 commit comments

Comments
 (0)