Rollup merge of #133779 - BoxyUwU:array_const_arg_infer_hir_id, r=compiler-errors
Use correct `hir_id` for array const arg infers Fixes #133771 `self.next_id()` results in the `DefId` for the const argument, created from the hack introduced by #133468, having no `HirId` associated with it. This then results in an ICE in metadata encoding. Fixing this then results in *another* ICE where `encode_defs` was not skipping encoding `type_of` and other queries for `DefId`s when they correspond to a `ConstArgKind::Infer` node. This only reproduces with a library crate as metadata is not encoded for binaries, and apparently we had 0 tests for `generic_arg_infer` for array lengths in a library crate so this was not caught :< cc #133589 `@voidc` r? `@compiler-errors` `@lcnr`
This commit is contained in:
commit
c80286d35e
3 changed files with 22 additions and 5 deletions
|
@ -2011,7 +2011,8 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
||||||
ExprKind::Underscore => {
|
ExprKind::Underscore => {
|
||||||
if self.tcx.features().generic_arg_infer() {
|
if self.tcx.features().generic_arg_infer() {
|
||||||
let ct_kind = hir::ConstArgKind::Infer(self.lower_span(c.value.span));
|
let ct_kind = hir::ConstArgKind::Infer(self.lower_span(c.value.span));
|
||||||
self.arena.alloc(hir::ConstArg { hir_id: self.next_id(), kind: ct_kind })
|
self.arena
|
||||||
|
.alloc(hir::ConstArg { hir_id: self.lower_node_id(c.id), kind: ct_kind })
|
||||||
} else {
|
} else {
|
||||||
feature_err(
|
feature_err(
|
||||||
&self.tcx.sess,
|
&self.tcx.sess,
|
||||||
|
|
|
@ -1389,10 +1389,14 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
|
||||||
// `ConstArgKind::Path`. We never actually access this `DefId`
|
// `ConstArgKind::Path`. We never actually access this `DefId`
|
||||||
// anywhere so we don't need to encode it for other crates.
|
// anywhere so we don't need to encode it for other crates.
|
||||||
if def_kind == DefKind::AnonConst
|
if def_kind == DefKind::AnonConst
|
||||||
&& matches!(
|
&& match tcx.hir_node_by_def_id(local_id) {
|
||||||
tcx.hir_node_by_def_id(local_id),
|
hir::Node::ConstArg(hir::ConstArg { kind, .. }) => match kind {
|
||||||
hir::Node::ConstArg(hir::ConstArg { kind: hir::ConstArgKind::Path(..), .. })
|
// Skip encoding defs for these as they should not have had a `DefId` created
|
||||||
)
|
hir::ConstArgKind::Path(..) | hir::ConstArgKind::Infer(..) => true,
|
||||||
|
hir::ConstArgKind::Anon(..) => false,
|
||||||
|
},
|
||||||
|
_ => false,
|
||||||
|
}
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
//@ check-pass
|
||||||
|
|
||||||
|
#![feature(generic_arg_infer)]
|
||||||
|
#![crate_type = "lib"]
|
||||||
|
|
||||||
|
// Test that encoding the hallucinated `DefId` for the `_` const argument doesn't
|
||||||
|
// ICE (see #133468). This requires this to be a library crate.
|
||||||
|
|
||||||
|
pub fn foo() {
|
||||||
|
let s: [u8; 10];
|
||||||
|
s = [0; _];
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue