Skip to content

Commit

Permalink
Rollup merge of #102945 - compiler-errors:placeholder-region-outlives…
Browse files Browse the repository at this point in the history
…, r=lcnr

Do not register placeholder `RegionOutlives` obligations when `considering_regions` is false

**NOTE:** I'm kinda just putting this up for discussion. I'm not certain this is correct...?

This was introduced in [`608625d`](608625d#diff-6e54b18681342ec725d75591dbf384ad08cd73df29db00485fe51b4e90f76ff7R361).

Interestingly, we only check `data.has_placeholders()` for `RegionOutlives`, and not for `TypeOutlives`... why? For the record, that different treatment between `RegionOutlives` and `TypeOutlives` is why the fix "The compiling succeeds when all `'a : 'b` are replaced with `&'a () : 'b`" in #100689 _"works"_, but it seems like an implementation detail considering this.

Also, why do we care about placeholder regions being registered if `considering_regions` is false? It doesn't seem to affect any UI tests, for example.

r? `@lcnr`

Fixes #102899
Fixes #100689
  • Loading branch information
matthiaskrgr authored Oct 17, 2022
2 parents e91fd0b + 3021598 commit d02a221
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 1 deletion.
2 changes: 1 addition & 1 deletion compiler/rustc_trait_selection/src/traits/fulfill.rs
Original file line number Diff line number Diff line change
Expand Up @@ -355,7 +355,7 @@ impl<'a, 'tcx> ObligationProcessor for FulfillProcessor<'a, 'tcx> {
}

ty::PredicateKind::RegionOutlives(data) => {
if infcx.considering_regions || data.has_placeholders() {
if infcx.considering_regions {
infcx.region_outlives_predicate(&obligation.cause, Binder::dummy(data));
}

Expand Down
29 changes: 29 additions & 0 deletions src/test/ui/higher-rank-trait-bounds/issue-100689.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
// check-pass

struct Foo<'a> {
foo: &'a mut usize,
}

trait Bar<'a> {
type FooRef<'b>
where
'a: 'b;
fn uwu(foo: Foo<'a>, f: impl for<'b> FnMut(Self::FooRef<'b>));
}
impl<'a> Bar<'a> for () {
type FooRef<'b>
=
&'b Foo<'a>
where
'a : 'b,
;

fn uwu(
foo: Foo<'a>,
mut f: impl for<'b> FnMut(&'b Foo<'a>), //relevant part
) {
f(&foo);
}
}

fn main() {}
32 changes: 32 additions & 0 deletions src/test/ui/higher-rank-trait-bounds/issue-102899.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
// check-pass

pub trait BufferTrait<'buffer> {
type Subset<'channel>
where
'buffer: 'channel;

fn for_each_subset<F>(&self, f: F)
where
F: for<'channel> Fn(Self::Subset<'channel>);
}

pub struct SomeBuffer<'buffer> {
samples: &'buffer [()],
}

impl<'buffer> BufferTrait<'buffer> for SomeBuffer<'buffer> {
type Subset<'subset> = Subset<'subset> where 'buffer: 'subset;

fn for_each_subset<F>(&self, _f: F)
where
F: for<'subset> Fn(Subset<'subset>),
{
todo!()
}
}

pub struct Subset<'subset> {
buffer: &'subset [()],
}

fn main() {}

0 comments on commit d02a221

Please sign in to comment.