Skip to content

Commit

Permalink
Don't synthesize host effect args inside trait object types
Browse files Browse the repository at this point in the history
  • Loading branch information
fmease committed Jan 3, 2024
1 parent e51e98d commit 695a02e
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 15 deletions.
28 changes: 15 additions & 13 deletions compiler/rustc_ast_lowering/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1454,19 +1454,21 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
let (bounds, lifetime_bound) = self.with_dyn_type_scope(true, |this| {
let bounds =
this.arena.alloc_from_iter(bounds.iter().filter_map(|bound| match bound {
GenericBound::Trait(
ty,
TraitBoundModifiers {
polarity: BoundPolarity::Positive | BoundPolarity::Negative(_),
constness,
},
) => Some(this.lower_poly_trait_ref(ty, itctx, *constness)),
// We can safely ignore constness here, since AST validation
// will take care of invalid modifier combinations.
GenericBound::Trait(
_,
TraitBoundModifiers { polarity: BoundPolarity::Maybe(_), .. },
) => None,
// We can safely ignore constness here since AST validation
// takes care of rejecting invalid modifier combinations and
// const trait bounds in trait object types.
GenericBound::Trait(ty, modifiers) => match modifiers.polarity {
BoundPolarity::Positive | BoundPolarity::Negative(_) => {
Some(this.lower_poly_trait_ref(
ty,
itctx,
// Still, don't pass along the constness here; we don't want to
// synthesize any host effect args, it'd only cause problems.
ast::BoundConstness::Never,
))
}
BoundPolarity::Maybe(_) => None,
},
GenericBound::Outlives(lifetime) => {
if lifetime_bound.is_none() {
lifetime_bound = Some(this.lower_lifetime(lifetime));
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,17 @@
#![feature(const_trait_impl)]
#![feature(const_trait_impl, effects)]
// edition: 2021

#[const_trait]
trait Trait {}

fn main() {
let _: &dyn const Trait; //~ ERROR const trait bounds are not allowed in trait object types
let _: &dyn ~const Trait; //~ ERROR `~const` is not allowed here
}

// Regression test for issue #119525.
trait NonConst {}
const fn handle(_: &dyn const NonConst) {}
//~^ ERROR const trait bounds are not allowed in trait object types
const fn take(_: &dyn ~const NonConst) {}
//~^ ERROR `~const` is not allowed here
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,27 @@ error: const trait bounds are not allowed in trait object types
LL | let _: &dyn const Trait;
| ^^^^^^^^^^^

error: aborting due to 1 previous error
error: `~const` is not allowed here
--> $DIR/const-trait-bounds-trait-objects.rs:9:17
|
LL | let _: &dyn ~const Trait;
| ^^^^^^
|
= note: trait objects cannot have `~const` trait bounds

error: const trait bounds are not allowed in trait object types
--> $DIR/const-trait-bounds-trait-objects.rs:14:25
|
LL | const fn handle(_: &dyn const NonConst) {}
| ^^^^^^^^^^^^^^

error: `~const` is not allowed here
--> $DIR/const-trait-bounds-trait-objects.rs:16:23
|
LL | const fn take(_: &dyn ~const NonConst) {}
| ^^^^^^
|
= note: trait objects cannot have `~const` trait bounds

error: aborting due to 4 previous errors

0 comments on commit 695a02e

Please sign in to comment.