Do not feed anon const a type that references generics that it does not have
This commit is contained in:
parent
385970f0c1
commit
ed6dfddfeb
5 changed files with 76 additions and 13 deletions
|
@ -2294,18 +2294,14 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
|
|||
{
|
||||
let anon_const_type = tcx.type_of(param_def_id).instantiate(tcx, args);
|
||||
|
||||
// We must error if the instantiated type has any inference variables as we will
|
||||
// use this type to feed the `type_of` and query results must not contain inference
|
||||
// variables otherwise we will ICE.
|
||||
//
|
||||
// FIXME(generic_const_parameter_types): Ideally we remove these errors below when
|
||||
// we have the ability to intermix typeck of anon const const args with the parent
|
||||
// bodies typeck.
|
||||
|
||||
// We also error if the type contains any regions as effectively any region will wind
|
||||
// up as a region variable in mir borrowck. It would also be somewhat concerning if
|
||||
// hir typeck was using equality but mir borrowck wound up using subtyping as that could
|
||||
// result in a non-infer in hir typeck but a region variable in borrowck.
|
||||
//
|
||||
// FIXME(generic_const_parameter_types): Ideally we remove these errors one day when
|
||||
// we have the ability to intermix typeck of anon const const args with the parent
|
||||
// bodies typeck.
|
||||
if tcx.features().generic_const_parameter_types()
|
||||
&& (anon_const_type.has_free_regions() || anon_const_type.has_erased_regions())
|
||||
{
|
||||
|
@ -2316,6 +2312,9 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
|
|||
tcx.feed_anon_const_type(anon.def_id, ty::EarlyBinder::bind(Ty::new_error(tcx, e)));
|
||||
return ty::Const::new_error(tcx, e);
|
||||
}
|
||||
// We must error if the instantiated type has any inference variables as we will
|
||||
// use this type to feed the `type_of` and query results must not contain inference
|
||||
// variables otherwise we will ICE.
|
||||
if anon_const_type.has_non_region_infer() {
|
||||
let e = tcx.dcx().span_err(
|
||||
const_arg.span(),
|
||||
|
@ -2324,6 +2323,16 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
|
|||
tcx.feed_anon_const_type(anon.def_id, ty::EarlyBinder::bind(Ty::new_error(tcx, e)));
|
||||
return ty::Const::new_error(tcx, e);
|
||||
}
|
||||
// We error when the type contains unsubstituted generics since we do not currently
|
||||
// give the anon const any of the generics from the parent.
|
||||
if anon_const_type.has_non_region_param() {
|
||||
let e = tcx.dcx().span_err(
|
||||
const_arg.span(),
|
||||
"anonymous constants referencing generics are not yet supported",
|
||||
);
|
||||
tcx.feed_anon_const_type(anon.def_id, ty::EarlyBinder::bind(Ty::new_error(tcx, e)));
|
||||
return ty::Const::new_error(tcx, e);
|
||||
}
|
||||
|
||||
tcx.feed_anon_const_type(
|
||||
anon.def_id,
|
||||
|
|
|
@ -1,5 +0,0 @@
|
|||
//@ known-bug: #137865
|
||||
trait Foo {
|
||||
type Assoc<const N: Self>;
|
||||
fn foo() -> Self::Assoc<3>;
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
warning: the feature `generic_const_parameter_types` is incomplete and may not be safe to use and/or cause compiler crashes
|
||||
--> $DIR/references-parent-generics.rs:3:27
|
||||
|
|
||||
LL | #![cfg_attr(feat, feature(generic_const_parameter_types))]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: see issue #137626 <https://github.com/rust-lang/rust/issues/137626> for more information
|
||||
= note: `#[warn(incomplete_features)]` on by default
|
||||
|
||||
error: `Self` is forbidden as the type of a const generic parameter
|
||||
--> $DIR/references-parent-generics.rs:7:25
|
||||
|
|
||||
LL | type Assoc<const N: Self>;
|
||||
| ^^^^
|
||||
|
|
||||
= note: the only supported types are integers, `bool`, and `char`
|
||||
|
||||
error: anonymous constants referencing generics are not yet supported
|
||||
--> $DIR/references-parent-generics.rs:14:21
|
||||
|
|
||||
LL | let x: T::Assoc<3>;
|
||||
| ^
|
||||
|
||||
error: aborting due to 2 previous errors; 1 warning emitted
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
error: `Self` is forbidden as the type of a const generic parameter
|
||||
--> $DIR/references-parent-generics.rs:7:25
|
||||
|
|
||||
LL | type Assoc<const N: Self>;
|
||||
| ^^^^
|
||||
|
|
||||
= note: the only supported types are integers, `bool`, and `char`
|
||||
|
||||
error: anonymous constants referencing generics are not yet supported
|
||||
--> $DIR/references-parent-generics.rs:14:21
|
||||
|
|
||||
LL | let x: T::Assoc<3>;
|
||||
| ^
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
|
@ -0,0 +1,18 @@
|
|||
//@ revisions: feat nofeat
|
||||
|
||||
#![cfg_attr(feat, feature(generic_const_parameter_types))]
|
||||
//[feat]~^ WARN the feature `generic_const_parameter_types` is incomplete
|
||||
|
||||
trait Foo {
|
||||
type Assoc<const N: Self>;
|
||||
//~^ ERROR `Self` is forbidden as the type of a const generic parameter
|
||||
}
|
||||
|
||||
fn foo<T: Foo>() {
|
||||
// We used to end up feeding the type of this anon const to be `T`, but the anon const
|
||||
// doesn't inherit the generics of `foo`, which led to index oob errors.
|
||||
let x: T::Assoc<3>;
|
||||
//~^ ERROR anonymous constants referencing generics are not yet supported
|
||||
}
|
||||
|
||||
fn main() {}
|
Loading…
Add table
Add a link
Reference in a new issue