Skip to content

Commit 1458684

Browse files
committed
Fix feature gating for crate/extern in paths
1 parent 3a30bad commit 1458684

File tree

1 file changed

+10
-2
lines changed

1 file changed

+10
-2
lines changed

src/libsyntax/feature_gate.rs

+10-2
Original file line numberDiff line numberDiff line change
@@ -1766,11 +1766,19 @@ impl<'a> Visitor<'a> for PostExpansionVisitor<'a> {
17661766

17671767
fn visit_path(&mut self, path: &'a ast::Path, _id: NodeId) {
17681768
for segment in &path.segments {
1769+
// Identifiers we are going to check could come from a legacy macro (e.g. `#[test]`).
1770+
// For such macros identifiers must have empty context, because this context is
1771+
// used during name resolution and produced names must be unhygienic for compatibility.
1772+
// On the other hand, we need the actual non-empty context for feature gate checking
1773+
// because it's hygienic even for legacy macros. As previously stated, such context
1774+
// cannot be kept in identifiers, so it's kept in paths instead and we take it from
1775+
// there while keeping location info from the ident span.
1776+
let span = segment.ident.span.with_ctxt(path.span.ctxt());
17691777
if segment.ident.name == keywords::Crate.name() {
1770-
gate_feature_post!(&self, crate_in_paths, segment.ident.span,
1778+
gate_feature_post!(&self, crate_in_paths, span,
17711779
"`crate` in paths is experimental");
17721780
} else if segment.ident.name == keywords::Extern.name() {
1773-
gate_feature_post!(&self, extern_in_paths, segment.ident.span,
1781+
gate_feature_post!(&self, extern_in_paths, span,
17741782
"`extern` in paths is experimental");
17751783
}
17761784
}

0 commit comments

Comments
 (0)