Skip to content

Commit 973ce01

Browse files
committed
Perform unconstrained param detection in explicit_predicates_of and taint the query result
1 parent b6b72c7 commit 973ce01

File tree

15 files changed

+96
-46
lines changed

15 files changed

+96
-46
lines changed

compiler/rustc_hir_analysis/src/collect/predicates_of.rs

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@ use rustc_hir as hir;
44
use rustc_hir::def::DefKind;
55
use rustc_hir::def_id::{DefId, LocalDefId};
66
use rustc_hir::intravisit::{self, Visitor};
7-
use rustc_middle::ty::{self, GenericPredicates, ImplTraitInTraitData, Ty, TyCtxt, Upcast};
7+
use rustc_middle::ty::{
8+
self, GenericPredicates, ImplTraitInTraitData, Ty, TyCtxt, TypeVisitableExt, Upcast,
9+
};
810
use rustc_middle::{bug, span_bug};
911
use rustc_span::symbol::Ident;
1012
use rustc_span::{Span, DUMMY_SP};
@@ -86,6 +88,7 @@ fn gather_explicit_predicates_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::Gen
8688
parent: Some(tcx.parent(def_id.to_def_id())),
8789
predicates: tcx.arena.alloc_from_iter(predicates),
8890
effects_min_tys: ty::List::empty(),
91+
errored_due_to_unconstrained_params: Ok(()),
8992
};
9093
}
9194

@@ -108,6 +111,8 @@ fn gather_explicit_predicates_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::Gen
108111
parent: Some(impl_def_id),
109112
predicates: tcx.arena.alloc_from_iter(impl_predicates),
110113
effects_min_tys: ty::List::empty(),
114+
errored_due_to_unconstrained_params: trait_assoc_predicates
115+
.errored_due_to_unconstrained_params,
111116
};
112117
}
113118

@@ -128,6 +133,7 @@ fn gather_explicit_predicates_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::Gen
128133
// Preserving the order of insertion is important here so as not to break UI tests.
129134
let mut predicates: FxIndexSet<(ty::Clause<'_>, Span)> = FxIndexSet::default();
130135
let mut effects_min_tys = Vec::new();
136+
let mut errored_due_to_unconstrained_params = Ok(());
131137

132138
let hir_generics = node.generics().unwrap_or(NO_GENERICS);
133139
if let Node::Item(item) = node {
@@ -291,11 +297,16 @@ fn gather_explicit_predicates_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::Gen
291297
if let Node::Item(&Item { kind: ItemKind::Impl { .. }, .. }) = node {
292298
let self_ty = tcx.type_of(def_id).instantiate_identity();
293299
let trait_ref = tcx.impl_trait_ref(def_id).map(ty::EarlyBinder::instantiate_identity);
294-
cgp::setup_constraining_predicates(
295-
tcx,
296-
&mut predicates,
297-
trait_ref,
298-
&mut cgp::parameters_for_impl(tcx, self_ty, trait_ref),
300+
let mut input_parameters = cgp::parameters_for_impl(tcx, self_ty, trait_ref);
301+
cgp::setup_constraining_predicates(tcx, &mut predicates, trait_ref, &mut input_parameters);
302+
errored_due_to_unconstrained_params = errored_due_to_unconstrained_params.and(
303+
self_ty.error_reported().and(trait_ref.error_reported()).and_then(|()| {
304+
crate::impl_wf_check::enforce_impl_params_are_constrained(
305+
tcx,
306+
def_id,
307+
input_parameters,
308+
)
309+
}),
299310
);
300311
}
301312

@@ -338,6 +349,7 @@ fn gather_explicit_predicates_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::Gen
338349
parent: generics.parent,
339350
predicates: tcx.arena.alloc_from_iter(predicates),
340351
effects_min_tys: tcx.mk_type_list(&effects_min_tys),
352+
errored_due_to_unconstrained_params,
341353
}
342354
}
343355

@@ -489,6 +501,8 @@ pub(super) fn explicit_predicates_of<'tcx>(
489501
parent: predicates_and_bounds.parent,
490502
predicates: tcx.arena.alloc_slice(&predicates),
491503
effects_min_tys: predicates_and_bounds.effects_min_tys,
504+
errored_due_to_unconstrained_params: predicates_and_bounds
505+
.errored_due_to_unconstrained_params,
492506
}
493507
}
494508
} else {
@@ -541,6 +555,8 @@ pub(super) fn explicit_predicates_of<'tcx>(
541555
parent: parent_preds.parent,
542556
predicates: { tcx.arena.alloc_from_iter(filtered_predicates) },
543557
effects_min_tys: parent_preds.effects_min_tys,
558+
errored_due_to_unconstrained_params: parent_preds
559+
.errored_due_to_unconstrained_params,
544560
};
545561
}
546562
gather_explicit_predicates_of(tcx, def_id)
@@ -653,6 +669,7 @@ pub(super) fn implied_predicates_with_filter(
653669
parent: None,
654670
predicates: implied_bounds,
655671
effects_min_tys: ty::List::empty(),
672+
errored_due_to_unconstrained_params: Ok(()),
656673
}
657674
}
658675

@@ -688,7 +705,12 @@ pub(super) fn type_param_predicates(
688705
let icx = ItemCtxt::new(tcx, parent);
689706
icx.probe_ty_param_bounds(DUMMY_SP, def_id, assoc_name)
690707
})
691-
.unwrap_or_default();
708+
.unwrap_or(GenericPredicates {
709+
parent: None,
710+
predicates: &[],
711+
effects_min_tys: ty::List::empty(),
712+
errored_due_to_unconstrained_params: Ok(()),
713+
});
692714
let mut extend = None;
693715

694716
let item_hir_id = tcx.local_def_id_to_hir_id(item_def_id);

compiler/rustc_hir_analysis/src/impl_wf_check.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,11 @@
99
//! fixed, but for the moment it's easier to do these checks early.
1010
1111
use min_specialization::check_min_specialization;
12+
use rustc_data_structures::fx::FxHashSet;
1213
use rustc_errors::codes::*;
1314
use rustc_hir::def::DefKind;
1415
use rustc_hir::def_id::LocalDefId;
15-
use rustc_middle::ty::{self, TyCtxt, TypeVisitableExt};
16+
use rustc_middle::ty::{self, TyCtxt};
1617
use rustc_span::ErrorGuaranteed;
1718

1819
use crate::constrained_generic_params as cgp;

compiler/rustc_hir_typeck/src/fn_ctxt/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,7 @@ impl<'tcx> HirTyLowerer<'tcx> for FnCtxt<'_, 'tcx> {
279279
}),
280280
),
281281
effects_min_tys: ty::List::empty(),
282+
errored_due_to_unconstrained_params: Ok(()),
282283
}
283284
}
284285

compiler/rustc_middle/src/ty/generics.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use rustc_data_structures::fx::FxHashMap;
33
use rustc_hir::def_id::DefId;
44
use rustc_macros::{HashStable, TyDecodable, TyEncodable};
55
use rustc_span::symbol::{kw, Symbol};
6-
use rustc_span::Span;
6+
use rustc_span::{ErrorGuaranteed, Span};
77
use tracing::instrument;
88

99
use super::{Clause, InstantiatedPredicates, ParamConst, ParamTy, Ty, TyCtxt};
@@ -367,11 +367,12 @@ impl<'tcx> Generics {
367367
}
368368

369369
/// Bounds on generics.
370-
#[derive(Copy, Clone, Default, Debug, TyEncodable, TyDecodable, HashStable)]
370+
#[derive(Copy, Clone, Debug, TyEncodable, TyDecodable, HashStable)]
371371
pub struct GenericPredicates<'tcx> {
372372
pub parent: Option<DefId>,
373373
pub predicates: &'tcx [(Clause<'tcx>, Span)],
374374
pub effects_min_tys: &'tcx ty::List<Ty<'tcx>>,
375+
pub errored_due_to_unconstrained_params: Result<(), ErrorGuaranteed>,
375376
}
376377

377378
impl<'tcx> GenericPredicates<'tcx> {

compiler/rustc_smir/src/rustc_smir/context.rs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -161,8 +161,12 @@ impl<'tcx> Context for TablesWrapper<'tcx> {
161161
fn predicates_of(&self, def_id: stable_mir::DefId) -> stable_mir::ty::GenericPredicates {
162162
let mut tables = self.0.borrow_mut();
163163
let def_id = tables[def_id];
164-
let GenericPredicates { parent, predicates, effects_min_tys: _ } =
165-
tables.tcx.predicates_of(def_id);
164+
let GenericPredicates {
165+
parent,
166+
predicates,
167+
effects_min_tys: _,
168+
errored_due_to_unconstrained_params: _,
169+
} = tables.tcx.predicates_of(def_id);
166170
stable_mir::ty::GenericPredicates {
167171
parent: parent.map(|did| tables.trait_def(did)),
168172
predicates: predicates
@@ -183,8 +187,12 @@ impl<'tcx> Context for TablesWrapper<'tcx> {
183187
) -> stable_mir::ty::GenericPredicates {
184188
let mut tables = self.0.borrow_mut();
185189
let def_id = tables[def_id];
186-
let GenericPredicates { parent, predicates, effects_min_tys: _ } =
187-
tables.tcx.explicit_predicates_of(def_id);
190+
let GenericPredicates {
191+
parent,
192+
predicates,
193+
effects_min_tys: _,
194+
errored_due_to_unconstrained_params: _,
195+
} = tables.tcx.explicit_predicates_of(def_id);
188196
stable_mir::ty::GenericPredicates {
189197
parent: parent.map(|did| tables.trait_def(did)),
190198
predicates: predicates

inc-fat/debuginfo_lto_alloc-3sqmtdvybgxcy/s-gyc0fcg7uo-1vs3i8e.lock

Whitespace-only changes.

src/librustdoc/clean/auto_trait.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,12 @@ fn synthesize_auto_trait_impl<'tcx>(
103103
let mut generics = clean_ty_generics(
104104
cx,
105105
tcx.generics_of(item_def_id),
106-
ty::GenericPredicates::default(),
106+
ty::GenericPredicates {
107+
parent: None,
108+
predicates: &[],
109+
effects_min_tys: ty::List::empty(),
110+
errored_due_to_unconstrained_params: Ok(()),
111+
},
107112
);
108113
generics.where_predicates.clear();
109114

0 commit comments

Comments
 (0)