Skip to content

Commit

Permalink
Rollup merge of rust-lang#118608 - fee1-dead-contrib:backdoor-in-askc…
Browse files Browse the repository at this point in the history
…onv, r=compiler-errors

Use default params until effects in desugaring

See the comment and [this section](https://fee1-dead.github.io/devlog001/#effects-desugaring-with-default-type-params) from my blog post

r? ``@compiler-errors``
  • Loading branch information
matthiaskrgr authored Dec 5, 2023
2 parents a260acc + e6a14c0 commit c6c0c65
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 6 deletions.
25 changes: 25 additions & 0 deletions compiler/rustc_hir_analysis/src/astconv/generics.rs
Original file line number Diff line number Diff line change
Expand Up @@ -243,6 +243,31 @@ pub fn create_args_for_parent_generic_args<'tcx, 'a>(
match (args_iter.peek(), params.peek()) {
(Some(&arg), Some(&param)) => {
match (arg, &param.kind, arg_count.explicit_late_bound) {
(
GenericArg::Const(hir::ConstArg {
is_desugared_from_effects: true,
..
}),
GenericParamDefKind::Const { is_host_effect: false, .. }
| GenericParamDefKind::Type { .. }
| GenericParamDefKind::Lifetime,
_,
) => {
// SPECIAL CASE FOR DESUGARED EFFECT PARAMS
// This comes from the following example:
//
// ```
// #[const_trait]
// pub trait PartialEq<Rhs: ?Sized = Self> {}
// impl const PartialEq for () {}
// ```
//
// Since this is a const impl, we need to insert `<false>` at the end of
// `PartialEq`'s generics, but this errors since `Rhs` isn't specified.
// To work around this, we infer all arguments until we reach the host param.
args.push(ctx.inferred_kind(Some(&args), param, infer_args));
params.next();
}
(GenericArg::Lifetime(_), GenericParamDefKind::Lifetime, _)
| (
GenericArg::Type(_) | GenericArg::Infer(_),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
// Ensure that we don't get a mismatch error when inserting the host param
// at the end of generic args when the generics have defaulted params.
//
// check-pass

#![feature(const_trait_impl, effects)]

#[const_trait]
pub trait Foo<Rhs: ?Sized = Self> {
/* stuff */
}

impl const Foo for () {}

fn main() {}
6 changes: 2 additions & 4 deletions tests/ui/rfcs/rfc-2632-const-trait-impl/effects/minicore.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,7 @@ trait Add<Rhs = Self> {
fn add(self, rhs: Rhs) -> Self::Output;
}

// FIXME(effects) we shouldn't need to have to specify `Rhs`.
impl const Add<i32> for i32 {
impl const Add for i32 {
type Output = i32;
fn add(self, rhs: i32) -> i32 {
loop {}
Expand Down Expand Up @@ -353,8 +352,7 @@ where
}
}

// FIXME(effects): again, this should not error without Rhs specified
impl PartialEq<str> for str {
impl PartialEq for str {
fn eq(&self, other: &str) -> bool {
loop {}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
error[E0493]: destructor of `Self` cannot be evaluated at compile-time
--> $DIR/minicore.rs:503:9
--> $DIR/minicore.rs:501:9
|
LL | *self = source.clone()
| ^^^^^
Expand All @@ -8,7 +8,7 @@ LL | *self = source.clone()
| value is dropped here

error[E0493]: destructor of `T` cannot be evaluated at compile-time
--> $DIR/minicore.rs:513:35
--> $DIR/minicore.rs:511:35
|
LL | const fn drop<T: ~const Destruct>(_: T) {}
| ^ - value is dropped here
Expand Down

0 comments on commit c6c0c65

Please sign in to comment.