Rollup merge of #118608 - fee1-dead-contrib:backdoor-in-askconv, 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``
This commit is contained in:
commit
c6c0c658df
@ -243,6 +243,31 @@ pub fn create_args_for_parent_generic_args<'tcx, 'a>(
|
||||
match (args_iter.peek(), params.peek()) {
|
||||
(Some(&arg), Some(¶m)) => {
|
||||
match (arg, ¶m.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(_),
|
||||
|
@ -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() {}
|
@ -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 {}
|
||||
@ -353,8 +352,7 @@ fn eq(&self, other: &&B) -> bool {
|
||||
}
|
||||
}
|
||||
|
||||
// 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 {}
|
||||
}
|
||||
|
@ -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()
|
||||
| ^^^^^
|
||||
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user