]> git.lizzy.rs Git - rust.git/commitdiff
Properly encode AnonConst into crate metadata
authorAaron Hill <aa1ronham@gmail.com>
Tue, 26 May 2020 04:18:47 +0000 (00:18 -0400)
committerAaron Hill <aa1ronham@gmail.com>
Tue, 26 May 2020 05:48:45 +0000 (01:48 -0400)
Fixes #68104

Previous, we were encoding AnonConst as a regular Const, causing us to
treat them differently after being deserialized in another compilation
session.

src/librustc_metadata/rmeta/decoder.rs
src/librustc_metadata/rmeta/encoder.rs
src/librustc_metadata/rmeta/mod.rs
src/test/ui/const-generics/auxiliary/impl-const.rs [new file with mode: 0644]
src/test/ui/const-generics/issue-68104-print-stack-overflow.rs [new file with mode: 0644]

index 2b292b35c159d169a77ad09306e9b7561e0a6e86..79c4c5214a60e4ccaad4edebd1c7b645618b2993 100644 (file)
@@ -564,6 +564,7 @@ impl MetadataBlob {
 impl EntryKind {
     fn def_kind(&self) -> DefKind {
         match *self {
+            EntryKind::AnonConst(..) => DefKind::AnonConst,
             EntryKind::Const(..) => DefKind::Const,
             EntryKind::AssocConst(..) => DefKind::AssocConst,
             EntryKind::ImmStatic
@@ -1121,7 +1122,8 @@ fn get_promoted_mir(&self, tcx: TyCtxt<'tcx>, id: DefIndex) -> IndexVec<Promoted
 
     fn mir_const_qualif(&self, id: DefIndex) -> mir::ConstQualifs {
         match self.kind(id) {
-            EntryKind::Const(qualif, _)
+            EntryKind::AnonConst(qualif, _)
+            | EntryKind::Const(qualif, _)
             | EntryKind::AssocConst(
                 AssocContainer::ImplDefault
                 | AssocContainer::ImplFinal
@@ -1341,7 +1343,9 @@ fn exported_symbols(
 
     fn get_rendered_const(&self, id: DefIndex) -> String {
         match self.kind(id) {
-            EntryKind::Const(_, data) | EntryKind::AssocConst(_, _, data) => data.decode(self).0,
+            EntryKind::AnonConst(_, data)
+            | EntryKind::Const(_, data)
+            | EntryKind::AssocConst(_, _, data) => data.decode(self).0,
             _ => bug!(),
         }
     }
index 91fbfcc0133eba0a8e2b46f61c63458e0bee4893..25166dd79028a14df4fd50d66cd661c1d95f63bf 100644 (file)
@@ -1342,7 +1342,7 @@ fn encode_info_for_anon_const(&mut self, def_id: LocalDefId) {
         let const_data = self.encode_rendered_const_for_body(body_id);
         let qualifs = self.tcx.mir_const_qualif(def_id);
 
-        record!(self.tables.kind[def_id.to_def_id()] <- EntryKind::Const(qualifs, const_data));
+        record!(self.tables.kind[def_id.to_def_id()] <- EntryKind::AnonConst(qualifs, const_data));
         record!(self.tables.visibility[def_id.to_def_id()] <- ty::Visibility::Public);
         record!(self.tables.span[def_id.to_def_id()] <- self.tcx.def_span(def_id));
         self.encode_item_type(def_id.to_def_id());
index 89d525eb80b8c4c2db5f243ebf7a7dac56922d8f..91febbcee10c18dcdaceb0cde91dd81a2ec1907f 100644 (file)
@@ -281,6 +281,7 @@ fn encode(&self, buf: &mut Encoder) -> LazyTables<'tcx> {
 
 #[derive(Copy, Clone, RustcEncodable, RustcDecodable)]
 enum EntryKind {
+    AnonConst(mir::ConstQualifs, Lazy<RenderedConst>),
     Const(mir::ConstQualifs, Lazy<RenderedConst>),
     ImmStatic,
     MutStatic,
diff --git a/src/test/ui/const-generics/auxiliary/impl-const.rs b/src/test/ui/const-generics/auxiliary/impl-const.rs
new file mode 100644 (file)
index 0000000..fc993d6
--- /dev/null
@@ -0,0 +1,9 @@
+#![feature(const_generics)]
+
+pub struct Num<const N: usize>;
+
+// Braces around const expression causes crash
+impl Num<{5}> {
+    pub fn five(&self) {
+    }
+}
diff --git a/src/test/ui/const-generics/issue-68104-print-stack-overflow.rs b/src/test/ui/const-generics/issue-68104-print-stack-overflow.rs
new file mode 100644 (file)
index 0000000..bda9ce8
--- /dev/null
@@ -0,0 +1,14 @@
+// aux-build:impl-const.rs
+// run-pass
+
+#![feature(const_generics)]
+#![allow(incomplete_features)]
+
+extern crate impl_const;
+
+use impl_const::*;
+
+pub fn main() {
+    let n = Num::<5>;
+    n.five();
+}