about summary refs log tree commit diff
path: root/src/libsyntax_pos/hygiene.rs
diff options
context:
space:
mode:
authorVadim Petrochenkov <vadim.petrochenkov@gmail.com>2019-07-06 20:25:34 +0300
committerVadim Petrochenkov <vadim.petrochenkov@gmail.com>2019-07-11 00:12:08 +0300
commitd1949b1ab01dbd482008f64af54161cc43bb0991 (patch)
tree6f96c59b462eb2dcbb935be4eaa967996e7be44f /src/libsyntax_pos/hygiene.rs
parent0ec6ea7333a8918a96f40110e014f2bbbd72281f (diff)
downloadrust-d1949b1ab01dbd482008f64af54161cc43bb0991.tar.gz
rust-d1949b1ab01dbd482008f64af54161cc43bb0991.zip
expand: Do not overwrite existing `ExpnInfo` when injecting derive markers
Create a fresh expansion for them instead - this is the usual way to allow unstable features for generated/desugared code.
Fixes https://github.com/rust-lang/rust/issues/52363
Diffstat (limited to 'src/libsyntax_pos/hygiene.rs')
-rw-r--r--src/libsyntax_pos/hygiene.rs6
1 files changed, 5 insertions, 1 deletions
diff --git a/src/libsyntax_pos/hygiene.rs b/src/libsyntax_pos/hygiene.rs
index 28d452233cc..ba2b2b7a2dd 100644
--- a/src/libsyntax_pos/hygiene.rs
+++ b/src/libsyntax_pos/hygiene.rs
@@ -117,7 +117,11 @@ impl Mark {
 
     #[inline]
     pub fn set_expn_info(self, info: ExpnInfo) {
-        HygieneData::with(|data| data.marks[self.0 as usize].expn_info = Some(info))
+        HygieneData::with(|data| {
+            let old_info = &mut data.marks[self.0 as usize].expn_info;
+            assert!(old_info.is_none(), "expansion info is reset for a mark");
+            *old_info = Some(info);
+        })
     }
 
     pub fn is_descendant_of(self, ancestor: Mark) -> bool {