Skip to content
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
8b1f85c
Windows: Iterative `remove_dir_all`
ChrisDenton Apr 25, 2022
8dc4696
Retry deleting a directory
ChrisDenton Apr 26, 2022
d579665
Yield the thread when waiting to delete a file
ChrisDenton Apr 28, 2022
ab3a2a0
Unify copying data from enclave to userspace
raoulstrackx Mar 29, 2022
531752f
Mitigate MMIO stale data vulnerabilities
raoulstrackx Mar 28, 2022
6f7d193
Ensure userspace allocation is 8-byte aligned
raoulstrackx Mar 23, 2022
a27aace
Test `copy_to_userspace` function
raoulstrackx Mar 22, 2022
d722944
Leak pthreax_mutex_t when it's dropped while locked.
m-ou-se Jun 16, 2022
e642c59
Leak pthreax_rwlock_t when it's dropped while locked.
m-ou-se Jun 19, 2022
6ac6866
Reverse folder hierarchy
eggyal Jun 20, 2022
75203ee
Remove unecessary references to TypeFolder::Error
eggyal Jun 21, 2022
402dceb
point to type param definition when not finding variant, method and a…
TaKO8Ki Jun 20, 2022
6a6910e
Address reviewer comments
raoulstrackx Jun 22, 2022
d23eea5
Add tracking issues to `--extern` option docs.
ehuss Jun 22, 2022
3c7f1f1
Suggest defining variable as mutable on `&mut _` type mismatch in pats
WaffleLapkin Jun 23, 2022
ada2acc
Set relocation_model to Pic on emscripten target
hoodmane Jun 15, 2022
e25129b
take advantage of a labelled block
WaffleLapkin Jun 24, 2022
1dfb53b
improve wording of a suggestion
WaffleLapkin Jun 24, 2022
c06d8f9
Fix trait object reborrow suggestion
compiler-errors Jun 20, 2022
25fe474
Note concrete type being coerced into object
compiler-errors Jun 20, 2022
02318f3
Rollup merge of #96412 - ChrisDenton:remove-dir-all, r=thomcc
JohnTitor Jun 25, 2022
24ff792
Rollup merge of #98126 - fortanix:raoul/mitigate_stale_data_vulnerabi…
JohnTitor Jun 25, 2022
0104326
Rollup merge of #98149 - hoodmane:emscripten-pic, r=petrochenkov
JohnTitor Jun 25, 2022
f6c1d26
Rollup merge of #98194 - m-ou-se:leak-locked-pthread-mutex, r=Amanieu
JohnTitor Jun 25, 2022
d0cda3e
Rollup merge of #98277 - compiler-errors:issue-93596, r=estebank
JohnTitor Jun 25, 2022
f4c06c2
Rollup merge of #98298 - TaKO8Ki:point-to-type-param-definition, r=co…
JohnTitor Jun 25, 2022
5014bae
Rollup merge of #98311 - eggyal:reverse-folder-hierarchy, r=jackh726
JohnTitor Jun 25, 2022
e75f9a5
Rollup merge of #98401 - ehuss:extern-tracking, r=Dylan-DPC
JohnTitor Jun 25, 2022
134263f
Rollup merge of #98431 - WaffleLapkin:mut_pat_suggestions, r=compiler…
JohnTitor Jun 25, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Reverse folder hierarchy
#91318 introduced a trait for infallible folders distinct from the fallible version.  For some reason (completely unfathomable to me now that I look at it with fresh eyes), the infallible trait was a supertrait of the fallible one: that is, all fallible folders were required to also be infallible.  Moreover the `Error` associated type was defined on the infallible trait!  It's so absurd that it has me questioning whether I was entirely sane.

This trait reverses the hierarchy, so that the fallible trait is a supertrait of the infallible one: all infallible folders are required to also be fallible (which is a trivial blanket implementation).  This of course makes much more sense!  It also enables the `Error` associated type to sit on the fallible trait, where it sensibly belongs.

There is one downside however: folders expose a `tcx` accessor method.  Since the blanket fallible implementation for infallible folders only has access to a generic `F: TypeFolder`, we need that trait to expose such an accessor to which we can delegate.  Alternatively it's possible to extract that accessor into a separate `HasTcx` trait (or similar) that would then be a supertrait of both the fallible and infallible folder traits: this would ensure that there's only one unambiguous `tcx` method, at the cost of a little additional boilerplate.  If desired, I can submit that as a separate PR.

r? @jackh726
  • Loading branch information
eggyal committed Jun 21, 2022
commit 6ac6866bec092e0c2a3e0fc4aaf14b015b859a57
6 changes: 2 additions & 4 deletions compiler/rustc_infer/src/infer/resolve.rs
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ impl<'a, 'tcx> TypeFolder<'tcx> for OpportunisticRegionResolver<'a, 'tcx> {
.borrow_mut()
.unwrap_region_constraints()
.opportunistic_resolve_var(rid);
self.tcx().reuse_or_mk_region(r, ty::ReVar(resolved))
TypeFolder::tcx(self).reuse_or_mk_region(r, ty::ReVar(resolved))
}
_ => r,
}
Expand Down Expand Up @@ -179,15 +179,13 @@ struct FullTypeResolver<'a, 'tcx> {
infcx: &'a InferCtxt<'a, 'tcx>,
}

impl<'a, 'tcx> TypeFolder<'tcx> for FullTypeResolver<'a, 'tcx> {
impl<'a, 'tcx> FallibleTypeFolder<'tcx> for FullTypeResolver<'a, 'tcx> {
type Error = FixupError<'tcx>;

fn tcx<'b>(&'b self) -> TyCtxt<'tcx> {
self.infcx.tcx
}
}

impl<'a, 'tcx> FallibleTypeFolder<'tcx> for FullTypeResolver<'a, 'tcx> {
fn try_fold_ty(&mut self, t: Ty<'tcx>) -> Result<Ty<'tcx>, Self::Error> {
if !t.needs_infer() {
Ok(t) // micro-optimize -- if there is nothing in this type that this fold affects...
Expand Down
49 changes: 19 additions & 30 deletions compiler/rustc_middle/src/ty/fold.rs
Original file line number Diff line number Diff line change
Expand Up @@ -241,58 +241,37 @@ pub trait TypeSuperFoldable<'tcx>: TypeFoldable<'tcx> {
/// a blanket implementation of [`FallibleTypeFolder`] will defer to
/// the infallible methods of this trait to ensure that the two APIs
/// are coherent.
pub trait TypeFolder<'tcx>: Sized {
type Error = !;

pub trait TypeFolder<'tcx>: FallibleTypeFolder<'tcx, Error = !> {
fn tcx<'a>(&'a self) -> TyCtxt<'tcx>;

fn fold_binder<T>(&mut self, t: Binder<'tcx, T>) -> Binder<'tcx, T>
where
T: TypeFoldable<'tcx>,
Self: TypeFolder<'tcx, Error = !>,
{
t.super_fold_with(self)
}

fn fold_ty(&mut self, t: Ty<'tcx>) -> Ty<'tcx>
where
Self: TypeFolder<'tcx, Error = !>,
{
fn fold_ty(&mut self, t: Ty<'tcx>) -> Ty<'tcx> {
t.super_fold_with(self)
}

fn fold_region(&mut self, r: ty::Region<'tcx>) -> ty::Region<'tcx>
where
Self: TypeFolder<'tcx, Error = !>,
{
fn fold_region(&mut self, r: ty::Region<'tcx>) -> ty::Region<'tcx> {
r.super_fold_with(self)
}

fn fold_const(&mut self, c: ty::Const<'tcx>) -> ty::Const<'tcx>
where
Self: TypeFolder<'tcx, Error = !>,
{
fn fold_const(&mut self, c: ty::Const<'tcx>) -> ty::Const<'tcx> {
c.super_fold_with(self)
}

fn fold_unevaluated(&mut self, uv: ty::Unevaluated<'tcx>) -> ty::Unevaluated<'tcx>
where
Self: TypeFolder<'tcx, Error = !>,
{
fn fold_unevaluated(&mut self, uv: ty::Unevaluated<'tcx>) -> ty::Unevaluated<'tcx> {
uv.super_fold_with(self)
}

fn fold_predicate(&mut self, p: ty::Predicate<'tcx>) -> ty::Predicate<'tcx>
where
Self: TypeFolder<'tcx, Error = !>,
{
fn fold_predicate(&mut self, p: ty::Predicate<'tcx>) -> ty::Predicate<'tcx> {
p.super_fold_with(self)
}

fn fold_mir_const(&mut self, c: mir::ConstantKind<'tcx>) -> mir::ConstantKind<'tcx>
where
Self: TypeFolder<'tcx, Error = !>,
{
fn fold_mir_const(&mut self, c: mir::ConstantKind<'tcx>) -> mir::ConstantKind<'tcx> {
bug!("most type folders should not be folding MIR datastructures: {:?}", c)
}
}
Expand All @@ -304,7 +283,11 @@ pub trait TypeFolder<'tcx>: Sized {
/// A blanket implementation of this trait (that defers to the relevant
/// method of [`TypeFolder`]) is provided for all infallible folders in
/// order to ensure the two APIs are coherent.
pub trait FallibleTypeFolder<'tcx>: TypeFolder<'tcx> {
pub trait FallibleTypeFolder<'tcx>: Sized {
type Error;

fn tcx<'a>(&'a self) -> TyCtxt<'tcx>;

fn try_fold_binder<T>(&mut self, t: Binder<'tcx, T>) -> Result<Binder<'tcx, T>, Self::Error>
where
T: TypeFoldable<'tcx>,
Expand Down Expand Up @@ -350,8 +333,14 @@ pub trait FallibleTypeFolder<'tcx>: TypeFolder<'tcx> {
// delegates to infallible methods to ensure coherence.
impl<'tcx, F> FallibleTypeFolder<'tcx> for F
where
F: TypeFolder<'tcx, Error = !>,
F: TypeFolder<'tcx>,
{
type Error = !;

fn tcx<'a>(&'a self) -> TyCtxt<'tcx> {
TypeFolder::tcx(self)
}

fn try_fold_binder<T>(&mut self, t: Binder<'tcx, T>) -> Result<Binder<'tcx, T>, Self::Error>
where
T: TypeFoldable<'tcx>,
Expand Down
4 changes: 1 addition & 3 deletions compiler/rustc_middle/src/ty/normalize_erasing_regions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -228,15 +228,13 @@ impl<'tcx> TryNormalizeAfterErasingRegionsFolder<'tcx> {
}
}

impl<'tcx> TypeFolder<'tcx> for TryNormalizeAfterErasingRegionsFolder<'tcx> {
impl<'tcx> FallibleTypeFolder<'tcx> for TryNormalizeAfterErasingRegionsFolder<'tcx> {
type Error = NormalizationError<'tcx>;

fn tcx(&self) -> TyCtxt<'tcx> {
self.tcx
}
}

impl<'tcx> FallibleTypeFolder<'tcx> for TryNormalizeAfterErasingRegionsFolder<'tcx> {
fn try_fold_ty(&mut self, ty: Ty<'tcx>) -> Result<Ty<'tcx>, Self::Error> {
match self.try_normalize_generic_arg_after_erasing_regions(ty.into()) {
Ok(t) => Ok(t.expect_ty()),
Expand Down
2 changes: 1 addition & 1 deletion compiler/rustc_middle/src/ty/subst.rs
Original file line number Diff line number Diff line change
Expand Up @@ -705,7 +705,7 @@ impl<'a, 'tcx> SubstFolder<'a, 'tcx> {
return val;
}

let result = ty::fold::shift_vars(self.tcx(), val, self.binders_passed);
let result = ty::fold::shift_vars(TypeFolder::tcx(self), val, self.binders_passed);
debug!("shift_vars: shifted result = {:?}", result);

result
Expand Down
6 changes: 2 additions & 4 deletions compiler/rustc_trait_selection/src/traits/query/normalize.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ use rustc_data_structures::sso::SsoHashMap;
use rustc_data_structures::stack::ensure_sufficient_stack;
use rustc_infer::traits::Normalized;
use rustc_middle::mir;
use rustc_middle::ty::fold::{FallibleTypeFolder, TypeFoldable, TypeFolder, TypeSuperFoldable};
use rustc_middle::ty::fold::{FallibleTypeFolder, TypeFoldable, TypeSuperFoldable};
use rustc_middle::ty::subst::Subst;
use rustc_middle::ty::{self, Ty, TyCtxt, TypeVisitor};

Expand Down Expand Up @@ -162,15 +162,13 @@ struct QueryNormalizer<'cx, 'tcx> {
universes: Vec<Option<ty::UniverseIndex>>,
}

impl<'cx, 'tcx> TypeFolder<'tcx> for QueryNormalizer<'cx, 'tcx> {
impl<'cx, 'tcx> FallibleTypeFolder<'tcx> for QueryNormalizer<'cx, 'tcx> {
type Error = NoSolution;

fn tcx<'c>(&'c self) -> TyCtxt<'tcx> {
self.infcx.tcx
}
}

impl<'cx, 'tcx> FallibleTypeFolder<'tcx> for QueryNormalizer<'cx, 'tcx> {
fn try_fold_binder<T: TypeFoldable<'tcx>>(
&mut self,
t: ty::Binder<'tcx, T>,
Expand Down