This is a very large commit since a lot needs to be changed in order to make the tests pass. The salient changes are: - `ConstArgKind` gets a new `Path` variant, and all const params are now represented using it. Non-param paths still use `ConstArgKind::Anon` to prevent this change from getting too large, but they will soon use the `Path` variant too. - `ConstArg` gets a distinct `hir_id` field and its own variant in `hir::Node`. This affected many parts of the compiler that expected the parent of an `AnonConst` to be the containing context (e.g., an array repeat expression). They have been changed to check the "grandparent" where necessary. - Some `ast::AnonConst`s now have their `DefId`s created in rustc_ast_lowering rather than `DefCollector`. This is because in some cases they will end up becoming a `ConstArgKind::Path` instead, which has no `DefId`. We have to solve this in a hacky way where we guess whether the `AnonConst` could end up as a path const since we can't know for sure until after name resolution (`N` could refer to a free const or a nullary struct). If it has no chance as being a const param, then we create a `DefId` in `DefCollector` -- otherwise we decide during ast_lowering. This will have to be updated once all path consts use `ConstArgKind::Path`. - We explicitly use `ConstArgHasType` for array lengths, rather than implicitly relying on anon const type feeding -- this is due to the addition of `ConstArgKind::Path`. - Some tests have their outputs changed, but the changes are for the most part minor (including removing duplicate or almost-duplicate errors). One test now ICEs, but it is for an incomplete, unstable feature and is now tracked at #127009.
40 lines
1.3 KiB
Rust
40 lines
1.3 KiB
Rust
// rust-lang/rust#119731
|
|
// ICE ... unevaluated constant UnevaluatedConst
|
|
|
|
#![feature(generic_const_exprs)]
|
|
#![allow(incomplete_features)]
|
|
|
|
mod v20 {
|
|
const v4: usize = 512;
|
|
pub type v11 = [[usize; v4]; v4];
|
|
//~^ WARN type `v11` should have an upper camel case name
|
|
const v2: v11 = [[256; v4]; v4];
|
|
|
|
const v0: [[usize; v4]; v4] = v6(v8);
|
|
//~^ ERROR cannot find value `v8` in this scope
|
|
//~| ERROR cannot find function `v6` in this scope
|
|
pub struct v17<const v10: usize, const v7: v11> {
|
|
//~^ WARN type `v17` should have an upper camel case name
|
|
//~| ERROR `[[usize; v4]; v4]` is forbidden as the type of a const generic parameter
|
|
_p: (),
|
|
}
|
|
|
|
impl v17<512, v0> {
|
|
pub const fn v21() -> v18 {}
|
|
//~^ ERROR cannot find type `v18` in this scope
|
|
}
|
|
|
|
impl<const v10: usize> v17<v10, v2> {
|
|
//~^ ERROR maximum number of nodes exceeded in constant v20::v17::<v10, v2>::{constant#0}
|
|
//~| ERROR maximum number of nodes exceeded in constant v20::v17::<v10, v2>::{constant#0}
|
|
pub const fn v21() -> v18 {
|
|
//~^ ERROR cannot find type `v18` in this scope
|
|
v18 { _p: () }
|
|
//~^ ERROR cannot find struct, variant or union type `v18` in this scope
|
|
}
|
|
}
|
|
}
|
|
pub use v20::{v13, v17};
|
|
//~^ ERROR unresolved import `v20::v13`
|
|
fn main() {}
|