mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-27 17:24:06 +00:00
Rollup merge of #93802 - lcnr:mcg-woops, r=BoxyUwU
fix oversight in the `min_const_generics` checks r? `@BoxyUwU`
This commit is contained in:
commit
f3f41d76ad
@ -2281,8 +2281,27 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
|||||||
assert_eq!(opt_self_ty, None);
|
assert_eq!(opt_self_ty, None);
|
||||||
self.prohibit_generics(path.segments);
|
self.prohibit_generics(path.segments);
|
||||||
// Try to evaluate any array length constants.
|
// Try to evaluate any array length constants.
|
||||||
let normalized_ty = self.normalize_ty(span, tcx.at(span).type_of(def_id));
|
let ty = tcx.at(span).type_of(def_id);
|
||||||
if forbid_generic && normalized_ty.needs_subst() {
|
// HACK(min_const_generics): Forbid generic `Self` types
|
||||||
|
// here as we can't easily do that during nameres.
|
||||||
|
//
|
||||||
|
// We do this before normalization as we otherwise allow
|
||||||
|
// ```rust
|
||||||
|
// trait AlwaysApplicable { type Assoc; }
|
||||||
|
// impl<T: ?Sized> AlwaysApplicable for T { type Assoc = usize; }
|
||||||
|
//
|
||||||
|
// trait BindsParam<T> {
|
||||||
|
// type ArrayTy;
|
||||||
|
// }
|
||||||
|
// impl<T> BindsParam<T> for <T as AlwaysApplicable>::Assoc {
|
||||||
|
// type ArrayTy = [u8; Self::MAX];
|
||||||
|
// }
|
||||||
|
// ```
|
||||||
|
// Note that the normalization happens in the param env of
|
||||||
|
// the anon const, which is empty. This is why the
|
||||||
|
// `AlwaysApplicable` impl needs a `T: ?Sized` bound for
|
||||||
|
// this to compile if we were to normalize here.
|
||||||
|
if forbid_generic && ty.needs_subst() {
|
||||||
let mut err = tcx.sess.struct_span_err(
|
let mut err = tcx.sess.struct_span_err(
|
||||||
path.span,
|
path.span,
|
||||||
"generic `Self` types are currently not permitted in anonymous constants",
|
"generic `Self` types are currently not permitted in anonymous constants",
|
||||||
@ -2297,7 +2316,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
|||||||
err.emit();
|
err.emit();
|
||||||
tcx.ty_error()
|
tcx.ty_error()
|
||||||
} else {
|
} else {
|
||||||
normalized_ty
|
self.normalize_ty(span, ty)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Res::Def(DefKind::AssocTy, def_id) => {
|
Res::Def(DefKind::AssocTy, def_id) => {
|
||||||
|
@ -0,0 +1,15 @@
|
|||||||
|
trait AlwaysApplicable {
|
||||||
|
type Assoc;
|
||||||
|
}
|
||||||
|
impl<T: ?Sized> AlwaysApplicable for T {
|
||||||
|
type Assoc = usize;
|
||||||
|
}
|
||||||
|
|
||||||
|
trait BindsParam<T> {
|
||||||
|
type ArrayTy;
|
||||||
|
}
|
||||||
|
impl<T> BindsParam<T> for <T as AlwaysApplicable>::Assoc {
|
||||||
|
type ArrayTy = [u8; Self::MAX]; //~ ERROR generic `Self` types
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
@ -0,0 +1,14 @@
|
|||||||
|
error: generic `Self` types are currently not permitted in anonymous constants
|
||||||
|
--> $DIR/forbid-self-no-normalize.rs:12:25
|
||||||
|
|
|
||||||
|
LL | type ArrayTy = [u8; Self::MAX];
|
||||||
|
| ^^^^
|
||||||
|
|
|
||||||
|
note: not a concrete type
|
||||||
|
--> $DIR/forbid-self-no-normalize.rs:11:27
|
||||||
|
|
|
||||||
|
LL | impl<T> BindsParam<T> for <T as AlwaysApplicable>::Assoc {
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
Loading…
Reference in New Issue
Block a user