Skip to content

Commit 52e8dcb

Browse files
authored
Rollup merge of rust-lang#72600 - Aaron1011:fix/anon-const-encoding, r=varkor
Properly encode AnonConst into crate metadata Fixes rust-lang#68104 Previous, we were encoding AnonConst as a regular Const, causing us to treat them differently after being deserialized in another compilation session.
2 parents 033013c + ebe5a91 commit 52e8dcb

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
@@ -565,6 +565,7 @@ impl MetadataBlob {
565565
impl EntryKind {
566566
fn def_kind(&self) -> DefKind {
567567
match *self {
568+
EntryKind::AnonConst(..) => DefKind::AnonConst,
568569
EntryKind::Const(..) => DefKind::Const,
569570
EntryKind::AssocConst(..) => DefKind::AssocConst,
570571
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
@@ -1340,7 +1342,9 @@ impl<'a, 'tcx> CrateMetadataRef<'a> {
13401342

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

src/librustc_metadata/rmeta/encoder.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1358,7 +1358,7 @@ impl EncodeContext<'tcx> {
13581358
let const_data = self.encode_rendered_const_for_body(body_id);
13591359
let qualifs = self.tcx.mir_const_qualif(def_id);
13601360

1361-
record!(self.tables.kind[def_id.to_def_id()] <- EntryKind::Const(qualifs, const_data));
1361+
record!(self.tables.kind[def_id.to_def_id()] <- EntryKind::AnonConst(qualifs, const_data));
13621362
record!(self.tables.visibility[def_id.to_def_id()] <- ty::Visibility::Public);
13631363
record!(self.tables.span[def_id.to_def_id()] <- self.tcx.def_span(def_id));
13641364
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)