about summary refs log tree commit diff
path: root/src/libsyntax
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
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')
-rw-r--r--src/libsyntax/ext/derive.rs7
1 files changed, 4 insertions, 3 deletions
diff --git a/src/libsyntax/ext/derive.rs b/src/libsyntax/ext/derive.rs
index 68e7225c3cf..11c1fceb7e7 100644
--- a/src/libsyntax/ext/derive.rs
+++ b/src/libsyntax/ext/derive.rs
@@ -8,7 +8,7 @@ use crate::symbol::{Symbol, sym};
 use crate::errors::Applicability;
 
 use syntax_pos::Span;
-
+use syntax_pos::hygiene::{Mark, SyntaxContext};
 use rustc_data_structures::fx::FxHashSet;
 
 pub fn collect_derives(cx: &mut ExtCtxt<'_>, attrs: &mut Vec<ast::Attribute>) -> Vec<ast::Path> {
@@ -55,12 +55,13 @@ pub fn add_derived_markers<T>(cx: &mut ExtCtxt<'_>, span: Span, traits: &[ast::P
         names.insert(unwrap_or!(path.segments.get(0), continue).ident.name);
     }
 
-    cx.current_expansion.mark.set_expn_info(ExpnInfo::with_unstable(
+    let mark = Mark::fresh(cx.current_expansion.mark);
+    mark.set_expn_info(ExpnInfo::with_unstable(
         ExpnKind::Macro(MacroKind::Derive, Symbol::intern(&pretty_name)), span,
         cx.parse_sess.edition, &[sym::rustc_attrs, sym::structural_match],
     ));
 
-    let span = span.with_ctxt(cx.backtrace());
+    let span = span.with_ctxt(SyntaxContext::empty().apply_mark(mark));
     item.visit_attrs(|attrs| {
         if names.contains(&sym::Eq) && names.contains(&sym::PartialEq) {
             let meta = cx.meta_word(span, sym::structural_match);