Skip to content

Commit

Permalink
Do not ICE on invalid const param
Browse files Browse the repository at this point in the history
When encountering a path that can't have generics, do not call
`generics_of`. This would happen when writing something like
`path::this_is_a_mod<const_val>`.

Fix rust-lang#84831.
  • Loading branch information
estebank authored and Mark-Simulacrum committed May 22, 2021
1 parent 5d1125d commit e68af12
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 1 deletion.
20 changes: 19 additions & 1 deletion compiler/rustc_typeck/src/collect/type_of.rs
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,25 @@ pub(super) fn opt_const_param_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> Option<
Res::Def(DefKind::Ctor(..), def_id) => {
tcx.generics_of(tcx.parent(def_id).unwrap())
}
Res::Def(_, def_id) => tcx.generics_of(def_id),
// Other `DefKind`s don't have generics and would ICE when calling
// `generics_of`.
Res::Def(
DefKind::Struct
| DefKind::Union
| DefKind::Enum
| DefKind::Variant
| DefKind::Trait
| DefKind::OpaqueTy
| DefKind::TyAlias
| DefKind::ForeignTy
| DefKind::TraitAlias
| DefKind::AssocTy
| DefKind::Fn
| DefKind::AssocFn
| DefKind::AssocConst
| DefKind::Impl,
def_id,
) => tcx.generics_of(def_id),
Res::Err => {
tcx.sess.delay_span_bug(tcx.def_span(def_id), "anon const with Res::Err");
return None;
Expand Down
9 changes: 9 additions & 0 deletions src/test/ui/typeck/issue-84831.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
fn f() {
std::<0>; //~ ERROR expected value
}
fn j() {
std::<_ as _>; //~ ERROR expected value
//~^ ERROR expected one of `,` or `>`, found keyword `as`
}

fn main () {}
26 changes: 26 additions & 0 deletions src/test/ui/typeck/issue-84831.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
error: expected one of `,` or `>`, found keyword `as`
--> $DIR/issue-84831.rs:5:13
|
LL | std::<_ as _>;
| ^^ expected one of `,` or `>`
|
help: expressions must be enclosed in braces to be used as const generic arguments
|
LL | std::<{ _ as _ }>;
| ^ ^

error[E0423]: expected value, found crate `std`
--> $DIR/issue-84831.rs:2:5
|
LL | std::<0>;
| ^^^^^^^^ not a value

error[E0423]: expected value, found crate `std`
--> $DIR/issue-84831.rs:5:5
|
LL | std::<_ as _>;
| ^^^^^^^^^^^^^ not a value

error: aborting due to 3 previous errors

For more information about this error, try `rustc --explain E0423`.

0 comments on commit e68af12

Please sign in to comment.