Skip to content

Commit ebe5a91

Browse files
committed
Properly encode AnonConst into crate metadata
Fixes #68104 Previous, we were encoding AnonConst as a regular Const, causing us to treat them differently after being deserialized in another compilation session.
1 parent 698c5c6 commit ebe5a91

File tree

5 files changed

+31
-3
lines changed

5 files changed

+31
-3
lines changed

src/librustc_metadata/rmeta/decoder.rs

+6-2
Original file line numberDiff line numberDiff line change
@@ -564,6 +564,7 @@ impl MetadataBlob {
564564
impl EntryKind {
565565
fn def_kind(&self) -> DefKind {
566566
match *self {
567+
EntryKind::AnonConst(..) => DefKind::AnonConst,
567568
EntryKind::Const(..) => DefKind::Const,
568569
EntryKind::AssocConst(..) => DefKind::AssocConst,
569570
EntryKind::ImmStatic
@@ -1121,7 +1122,8 @@ impl<'a, 'tcx> CrateMetadataRef<'a> {
11211122

11221123
fn mir_const_qualif(&self, id: DefIndex) -> mir::ConstQualifs {
11231124
match self.kind(id) {
1124-
EntryKind::Const(qualif, _)
1125+
EntryKind::AnonConst(qualif, _)
1126+
| EntryKind::Const(qualif, _)
11251127
| EntryKind::AssocConst(
11261128
AssocContainer::ImplDefault
11271129
| AssocContainer::ImplFinal
@@ -1341,7 +1343,9 @@ impl<'a, 'tcx> CrateMetadataRef<'a> {
13411343

13421344
fn get_rendered_const(&self, id: DefIndex) -> String {
13431345
match self.kind(id) {
1344-
EntryKind::Const(_, data) | EntryKind::AssocConst(_, _, data) => data.decode(self).0,
1346+
EntryKind::AnonConst(_, data)
1347+
| EntryKind::Const(_, data)
1348+
| EntryKind::AssocConst(_, _, data) => data.decode(self).0,
13451349
_ => bug!(),
13461350
}
13471351
}

src/librustc_metadata/rmeta/encoder.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1342,7 +1342,7 @@ impl EncodeContext<'tcx> {
13421342
let const_data = self.encode_rendered_const_for_body(body_id);
13431343
let qualifs = self.tcx.mir_const_qualif(def_id);
13441344

1345-
record!(self.tables.kind[def_id.to_def_id()] <- EntryKind::Const(qualifs, const_data));
1345+
record!(self.tables.kind[def_id.to_def_id()] <- EntryKind::AnonConst(qualifs, const_data));
13461346
record!(self.tables.visibility[def_id.to_def_id()] <- ty::Visibility::Public);
13471347
record!(self.tables.span[def_id.to_def_id()] <- self.tcx.def_span(def_id));
13481348
self.encode_item_type(def_id.to_def_id());

src/librustc_metadata/rmeta/mod.rs

+1
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,7 @@ define_tables! {
281281

282282
#[derive(Copy, Clone, RustcEncodable, RustcDecodable)]
283283
enum EntryKind {
284+
AnonConst(mir::ConstQualifs, Lazy<RenderedConst>),
284285
Const(mir::ConstQualifs, Lazy<RenderedConst>),
285286
ImmStatic,
286287
MutStatic,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
#![feature(const_generics)]
2+
3+
pub struct Num<const N: usize>;
4+
5+
// Braces around const expression causes crash
6+
impl Num<{5}> {
7+
pub fn five(&self) {
8+
}
9+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
// aux-build:impl-const.rs
2+
// run-pass
3+
4+
#![feature(const_generics)]
5+
#![allow(incomplete_features)]
6+
7+
extern crate impl_const;
8+
9+
use impl_const::*;
10+
11+
pub fn main() {
12+
let n = Num::<5>;
13+
n.five();
14+
}

0 commit comments

Comments
 (0)