macros.rs 54.9 KB
Newer Older
1 2 3
//! A bunch of methods and structures more or less related to resolving macros and
//! interface provided by `Resolver` to macro expander.

4
use crate::imports::ImportResolver;
M
Mark Rousskov 已提交
5
use crate::Namespace::*;
6
use crate::{AmbiguityError, AmbiguityErrorMisc, AmbiguityKind, BuiltinMacroState, Determinacy};
7
use crate::{CrateLint, DeriveData, ParentScope, ResolutionError, Resolver, Scope, ScopeSet, Weak};
M
Mark Rousskov 已提交
8
use crate::{ModuleKind, ModuleOrUniformRoot, NameBinding, PathResult, Segment, ToNameBinding};
9
use rustc_ast::{self as ast, Inline, ItemKind, ModKind, NodeId};
10
use rustc_ast_lowering::ResolverAstLowering;
11
use rustc_ast_pretty::pprust;
12
use rustc_attr::StabilityLevel;
13
use rustc_data_structures::fx::FxHashSet;
14
use rustc_data_structures::ptr_key::PtrKey;
15
use rustc_data_structures::sync::Lrc;
16
use rustc_errors::struct_span_err;
17 18
use rustc_expand::base::{Annotatable, DeriveResolutions, Indeterminate, ResolverExpand};
use rustc_expand::base::{SyntaxExtension, SyntaxExtensionKind};
19
use rustc_expand::compile_declarative_macro;
20
use rustc_expand::expand::{AstFragment, Invocation, InvocationKind, SupportsMacroExpansion};
21
use rustc_feature::is_builtin_attr_name;
22
use rustc_hir::def::{self, DefKind, NonMacroAttrKind};
23
use rustc_hir::def_id::{CrateNum, LocalDefId};
24
use rustc_hir::PrimTy;
25
use rustc_middle::middle::stability;
26
use rustc_middle::ty;
27 28
use rustc_session::lint::builtin::{LEGACY_DERIVE_HELPERS, PROC_MACRO_DERIVE_RESOLUTION_FALLBACK};
use rustc_session::lint::builtin::{SOFT_UNSTABLE, UNUSED_MACROS};
29
use rustc_session::lint::BuiltinLintDiagnostics;
30
use rustc_session::parse::feature_err;
31
use rustc_session::Session;
32
use rustc_span::edition::Edition;
33
use rustc_span::hygiene::{self, ExpnData, ExpnId, ExpnKind};
34
use rustc_span::hygiene::{AstPass, MacroKind};
35
use rustc_span::symbol::{kw, sym, Ident, Symbol};
36
use rustc_span::{Span, DUMMY_SP};
37
use std::cell::Cell;
M
Mark Rousskov 已提交
38
use std::{mem, ptr};
39

40
type Res = def::Res<NodeId>;
L
ljedrz 已提交
41

42
/// Binding produced by a `macro_rules` item.
43
/// Not modularized, can shadow previous `macro_rules` bindings, etc.
44
#[derive(Debug)]
45
pub struct MacroRulesBinding<'a> {
46
    crate binding: &'a NameBinding<'a>,
47
    /// `macro_rules` scope into which the `macro_rules` item was planted.
48
    crate parent_macro_rules_scope: MacroRulesScopeRef<'a>,
49
    crate ident: Ident,
50 51
}

A
Alexander Regueiro 已提交
52 53 54
/// The scope introduced by a `macro_rules!` macro.
/// This starts at the macro's definition and ends at the end of the macro's parent
/// module (named or unnamed), or even further if it escapes with `#[macro_use]`.
55
/// Some macro invocations need to introduce `macro_rules` scopes too because they
A
Alexander Regueiro 已提交
56
/// can potentially expand into macro definitions.
57
#[derive(Copy, Clone, Debug)]
58
pub enum MacroRulesScope<'a> {
59
    /// Empty "root" scope at the crate start containing no names.
J
Jeffrey Seyfried 已提交
60
    Empty,
A
Alexander Regueiro 已提交
61
    /// The scope introduced by a `macro_rules!` macro definition.
62
    Binding(&'a MacroRulesBinding<'a>),
A
Alexander Regueiro 已提交
63
    /// The scope introduced by a macro invocation that can potentially
64
    /// create a `macro_rules!` macro definition.
65
    Invocation(ExpnId),
66 67
}

68
/// `macro_rules!` scopes are always kept by reference and inside a cell.
69 70
/// The reason is that we update scopes with value `MacroRulesScope::Invocation(invoc_id)`
/// in-place after `invoc_id` gets expanded.
71 72 73 74 75
/// This helps to avoid uncontrollable growth of `macro_rules!` scope chains,
/// which usually grow lineraly with the number of macro invocations
/// in a module (including derives) and hurt performance.
pub(crate) type MacroRulesScopeRef<'a> = PtrKey<'a, Cell<MacroRulesScope<'a>>>;

76 77 78
// Macro namespace is separated into two sub-namespaces, one for bang macros and
// one for attribute-like macros (attributes, derives).
// We ignore resolutions from one sub-namespace when searching names in scope for another.
79
fn sub_namespace_match(candidate: Option<MacroKind>, requirement: Option<MacroKind>) -> bool {
80
    #[derive(PartialEq)]
M
Mark Rousskov 已提交
81 82 83 84
    enum SubNS {
        Bang,
        AttrLike,
    }
85
    let sub_ns = |kind| match kind {
86 87
        MacroKind::Bang => SubNS::Bang,
        MacroKind::Attr | MacroKind::Derive => SubNS::AttrLike,
88
    };
89 90
    let candidate = candidate.map(sub_ns);
    let requirement = requirement.map(sub_ns);
91
    // "No specific sub-namespace" means "matches anything" for both requirements and candidates.
92
    candidate.is_none() || requirement.is_none() || candidate == requirement
93 94
}

95 96 97
// We don't want to format a path using pretty-printing,
// `format!("{}", path)`, because that tries to insert
// line-breaks and is slow.
98 99
fn fast_print_path(path: &ast::Path) -> Symbol {
    if path.segments.len() == 1 {
100
        path.segments[0].ident.name
101 102 103 104 105 106 107 108 109
    } else {
        let mut path_str = String::with_capacity(64);
        for (i, segment) in path.segments.iter().enumerate() {
            if i != 0 {
                path_str.push_str("::");
            }
            if segment.ident.name != kw::PathRoot {
                path_str.push_str(&segment.ident.as_str())
            }
110
        }
111
        Symbol::intern(&path_str)
112 113 114
    }
}

V
Vadim Petrochenkov 已提交
115
/// The code common between processing `#![register_tool]` and `#![register_attr]`.
116 117 118 119 120 121 122
fn registered_idents(
    sess: &Session,
    attrs: &[ast::Attribute],
    attr_name: Symbol,
    descr: &str,
) -> FxHashSet<Ident> {
    let mut registered = FxHashSet::default();
123
    for attr in sess.filter_by_name(attrs, attr_name) {
124 125
        for nested_meta in attr.meta_item_list().unwrap_or_default() {
            match nested_meta.ident() {
M
Mark Rousskov 已提交
126 127 128 129 130 131 132
                Some(ident) => {
                    if let Some(old_ident) = registered.replace(ident) {
                        let msg = format!("{} `{}` was already registered", descr, ident);
                        sess.struct_span_err(ident.span, &msg)
                            .span_label(old_ident.span, "already registered here")
                            .emit();
                    }
133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
                }
                None => {
                    let msg = format!("`{}` only accepts identifiers", attr_name);
                    let span = nested_meta.span();
                    sess.struct_span_err(span, &msg).span_label(span, "not an identifier").emit();
                }
            }
        }
    }
    registered
}

crate fn registered_attrs_and_tools(
    sess: &Session,
    attrs: &[ast::Attribute],
) -> (FxHashSet<Ident>, FxHashSet<Ident>) {
    let registered_attrs = registered_idents(sess, attrs, sym::register_attr, "attribute");
    let mut registered_tools = registered_idents(sess, attrs, sym::register_tool, "tool");
    // We implicitly add `rustfmt` and `clippy` to known tools,
    // but it's not an error to register them explicitly.
    let predefined_tools = [sym::clippy, sym::rustfmt];
    registered_tools.extend(predefined_tools.iter().cloned().map(Ident::with_dummy_span));
    (registered_attrs, registered_tools)
}

158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177
// Some feature gates for inner attributes are reported as lints for backward compatibility.
fn soft_custom_inner_attributes_gate(path: &ast::Path, invoc: &Invocation) -> bool {
    match &path.segments[..] {
        // `#![test]`
        [seg] if seg.ident.name == sym::test => return true,
        // `#![rustfmt::skip]` on out-of-line modules
        [seg1, seg2] if seg1.ident.name == sym::rustfmt && seg2.ident.name == sym::skip => {
            if let InvocationKind::Attr { item, .. } = &invoc.kind {
                if let Annotatable::Item(item) = item {
                    if let ItemKind::Mod(_, ModKind::Loaded(_, Inline::No, _)) = item.kind {
                        return true;
                    }
                }
            }
        }
        _ => {}
    }
    false
}

178
impl<'a> ResolverExpand for Resolver<'a> {
179
    fn next_node_id(&mut self) -> NodeId {
M
Mark Rousskov 已提交
180
        self.next_node_id()
181 182
    }

183 184 185 186
    fn resolve_dollar_crates(&mut self) {
        hygiene::update_dollar_crate_names(|ctxt| {
            let ident = Ident::new(kw::DollarCrate, DUMMY_SP.with_ctxt(ctxt));
            match self.resolve_crate_root(ident).kind {
J
Joshua Nelson 已提交
187
                ModuleKind::Def(.., name) if name != kw::Empty => name,
188
                _ => kw::Crate,
189
            }
190
        });
191 192
    }

193
    fn visit_ast_fragment_with_placeholders(&mut self, expansion: ExpnId, fragment: &AstFragment) {
194
        // Integrate the new AST fragment into all the definition and module structures.
195 196
        // We are inside the `expansion` now, but other parent scope components are still the same.
        let parent_scope = ParentScope { expansion, ..self.invocation_parent_scopes[&expansion] };
197 198
        let output_macro_rules_scope = self.build_reduced_graph(fragment, parent_scope);
        self.output_macro_rules_scopes.insert(expansion, output_macro_rules_scope);
199

200
        parent_scope.module.unexpanded_invocations.borrow_mut().remove(&expansion);
201 202
    }

203 204
    fn register_builtin_macro(&mut self, name: Symbol, ext: SyntaxExtensionKind) {
        if self.builtin_macros.insert(name, BuiltinMacroState::NotYetSeen(ext)).is_some() {
M
Mark Rousskov 已提交
205
            self.session
206 207
                .diagnostic()
                .bug(&format!("built-in macro `{}` was already registered", name));
208
        }
209 210
    }

M
Matthew Jasper 已提交
211 212
    // Create a new Expansion with a definition site of the provided module, or
    // a fake empty `#[no_implicit_prelude]` module if no module is provided.
213
    fn expansion_for_ast_pass(
214
        &mut self,
215
        call_site: Span,
216 217 218
        pass: AstPass,
        features: &[Symbol],
        parent_module_id: Option<NodeId>,
219
    ) -> ExpnId {
220
        let parent_module = parent_module_id.map(|module_id| self.local_def_id(module_id));
221 222 223 224 225
        let expn_id = ExpnId::fresh(Some(ExpnData::allow_unstable(
            ExpnKind::AstPass(pass),
            call_site,
            self.session.edition(),
            features.into(),
A
Aaron Hill 已提交
226
            None,
227
            parent_module.map(LocalDefId::to_def_id),
228 229
        )));

230 231
        let parent_scope = parent_module
            .map_or(self.empty_module, |parent_def_id| self.module_map[&parent_def_id]);
232
        self.ast_transform_scopes.insert(expn_id, parent_scope);
233

234
        expn_id
235 236
    }

237
    fn resolve_imports(&mut self) {
238
        ImportResolver { r: self }.resolve_imports()
239 240
    }

241
    fn resolve_macro_invocation(
M
Mark Rousskov 已提交
242 243 244 245
        &mut self,
        invoc: &Invocation,
        eager_expansion_root: ExpnId,
        force: bool,
246
    ) -> Result<Lrc<SyntaxExtension>, Indeterminate> {
247 248 249 250 251 252 253
        let invoc_id = invoc.expansion_data.id;
        let parent_scope = match self.invocation_parent_scopes.get(&invoc_id) {
            Some(parent_scope) => *parent_scope,
            None => {
                // If there's no entry in the table, then we are resolving an eagerly expanded
                // macro, which should inherit its parent scope from its eager expansion root -
                // the macro that requested this eager expansion.
M
Mark Rousskov 已提交
254 255 256
                let parent_scope = *self
                    .invocation_parent_scopes
                    .get(&eager_expansion_root)
257 258 259 260 261 262
                    .expect("non-eager expansion without a parent scope");
                self.invocation_parent_scopes.insert(invoc_id, parent_scope);
                parent_scope
            }
        };

263 264
        let (path, kind, inner_attr, derives) = match invoc.kind {
            InvocationKind::Attr { ref attr, ref derives, .. } => (
M
Mark Rousskov 已提交
265 266
                &attr.get_normal_item().path,
                MacroKind::Attr,
267
                attr.style == ast::AttrStyle::Inner,
M
Mark Rousskov 已提交
268 269
                self.arenas.alloc_ast_paths(derives),
            ),
270 271
            InvocationKind::Bang { ref mac, .. } => (&mac.path, MacroKind::Bang, false, &[][..]),
            InvocationKind::Derive { ref path, .. } => (path, MacroKind::Derive, false, &[][..]),
272
        };
273

274
        // Derives are not included when `invocations` are collected, so we have to add them here.
275
        let parent_scope = &ParentScope { derives, ..parent_scope };
276
        let supports_macro_expansion = invoc.fragment_kind.supports_macro_expansion();
277
        let node_id = self.lint_node_id(eager_expansion_root);
278 279 280
        let (ext, res) = self.smart_resolve_macro_path(
            path,
            kind,
281
            supports_macro_expansion,
282 283 284 285
            inner_attr,
            parent_scope,
            node_id,
            force,
286
            soft_custom_inner_attributes_gate(path, invoc),
287
        )?;
288

289
        let span = invoc.span();
A
Aaron Hill 已提交
290 291 292 293 294
        invoc_id.set_expn_data(ext.expn_data(
            parent_scope.expansion,
            span,
            fast_print_path(path),
            res.opt_def_id(),
295 296 297
            res.opt_def_id().map(|macro_def_id| {
                self.macro_def_scope_from_def_id(macro_def_id).nearest_parent_mod
            }),
A
Aaron Hill 已提交
298
        ));
299

A
Aaron Hill 已提交
300
        if let Res::Def(_, _) = res {
301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321
            // Gate macro attributes in `#[derive]` output.
            if !self.session.features_untracked().macro_attributes_in_derive_output
                && kind == MacroKind::Attr
                && ext.builtin_name != Some(sym::derive)
            {
                let mut expn_id = parent_scope.expansion;
                loop {
                    // Helper attr table is a quick way to determine whether the attr is `derive`.
                    if self.helper_attrs.contains_key(&expn_id) {
                        feature_err(
                            &self.session.parse_sess,
                            sym::macro_attributes_in_derive_output,
                            path.span,
                            "macro attributes in `#[derive]` output are unstable",
                        )
                        .emit();
                        break;
                    } else {
                        let expn_data = expn_id.expn_data();
                        match expn_data.kind {
                            ExpnKind::Root
322
                            | ExpnKind::Macro(MacroKind::Bang | MacroKind::Derive, _) => {
323 324 325 326 327 328 329
                                break;
                            }
                            _ => expn_id = expn_data.parent,
                        }
                    }
                }
            }
330
        }
331

332
        Ok(ext)
333 334
    }

335
    fn check_unused_macros(&mut self) {
336
        for (_, &(node_id, span)) in self.unused_macros.iter() {
337
            self.lint_buffer.buffer_lint(UNUSED_MACROS, node_id, span, "unused macro definition");
E
est31 已提交
338
        }
339
    }
340

341
    fn lint_node_id(&self, expn_id: ExpnId) -> NodeId {
342 343
        // FIXME - make this more precise. This currently returns the NodeId of the
        // nearest closing item - we should try to return the closest parent of the ExpnId
344 345
        self.invocation_parents
            .get(&expn_id)
346
            .map_or(ast::CRATE_NODE_ID, |id| self.def_id_to_node_id[id.0])
347 348
    }

349
    fn has_derive_copy(&self, expn_id: ExpnId) -> bool {
350
        self.containers_deriving_copy.contains(&expn_id)
351 352
    }

353 354 355 356
    fn resolve_derives(
        &mut self,
        expn_id: ExpnId,
        force: bool,
357
        derive_paths: &dyn Fn() -> DeriveResolutions,
358 359 360 361 362 363 364
    ) -> Result<(), Indeterminate> {
        // Block expansion of the container until we resolve all derives in it.
        // This is required for two reasons:
        // - Derive helper attributes are in scope for the item to which the `#[derive]`
        //   is applied, so they have to be produced by the container's expansion rather
        //   than by individual derives.
        // - Derives in the container need to know whether one of them is a built-in `Copy`.
365 366 367 368 369 370 371
        // Temporarily take the data to avoid borrow checker conflicts.
        let mut derive_data = mem::take(&mut self.derive_data);
        let entry = derive_data.entry(expn_id).or_insert_with(|| DeriveData {
            resolutions: derive_paths(),
            helper_attrs: Vec::new(),
            has_derive_copy: false,
        });
372
        let parent_scope = self.invocation_parent_scopes[&expn_id];
373
        for (i, (path, _, opt_ext)) in entry.resolutions.iter_mut().enumerate() {
374 375 376 377 378 379 380 381 382 383 384 385 386 387
            if opt_ext.is_none() {
                *opt_ext = Some(
                    match self.resolve_macro_path(
                        &path,
                        Some(MacroKind::Derive),
                        &parent_scope,
                        true,
                        force,
                    ) {
                        Ok((Some(ext), _)) => {
                            if !ext.helper_attrs.is_empty() {
                                let last_seg = path.segments.last().unwrap();
                                let span = last_seg.ident.span.normalize_to_macros_2_0();
                                entry.helper_attrs.extend(
388 389 390
                                    ext.helper_attrs
                                        .iter()
                                        .map(|name| (i, Ident::new(*name, span))),
391 392 393 394 395 396 397 398 399 400 401 402 403 404
                                );
                            }
                            entry.has_derive_copy |= ext.builtin_name == Some(sym::Copy);
                            ext
                        }
                        Ok(_) | Err(Determinacy::Determined) => self.dummy_ext(MacroKind::Derive),
                        Err(Determinacy::Undetermined) => {
                            assert!(self.derive_data.is_empty());
                            self.derive_data = derive_data;
                            return Err(Indeterminate);
                        }
                    },
                );
            }
405
        }
406 407 408 409
        // Sort helpers in a stable way independent from the derive resolution order.
        entry.helper_attrs.sort_by_key(|(i, _)| *i);
        self.helper_attrs
            .insert(expn_id, entry.helper_attrs.iter().map(|(_, ident)| *ident).collect());
410 411
        // Mark this derive as having `Copy` either if it has `Copy` itself or if its parent derive
        // has `Copy`, to support cases like `#[derive(Clone, Copy)] #[derive(Debug)]`.
412
        if entry.has_derive_copy || self.has_derive_copy(parent_scope.expansion) {
413 414
            self.containers_deriving_copy.insert(expn_id);
        }
415 416
        assert!(self.derive_data.is_empty());
        self.derive_data = derive_data;
417 418 419
        Ok(())
    }

420 421
    fn take_derive_resolutions(&mut self, expn_id: ExpnId) -> Option<DeriveResolutions> {
        self.derive_data.remove(&expn_id).map(|data| data.resolutions)
422 423
    }

424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458
    // The function that implements the resolution logic of `#[cfg_accessible(path)]`.
    // Returns true if the path can certainly be resolved in one of three namespaces,
    // returns false if the path certainly cannot be resolved in any of the three namespaces.
    // Returns `Indeterminate` if we cannot give a certain answer yet.
    fn cfg_accessible(&mut self, expn_id: ExpnId, path: &ast::Path) -> Result<bool, Indeterminate> {
        let span = path.span;
        let path = &Segment::from_path(path);
        let parent_scope = self.invocation_parent_scopes[&expn_id];

        let mut indeterminate = false;
        for ns in [TypeNS, ValueNS, MacroNS].iter().copied() {
            match self.resolve_path(path, Some(ns), &parent_scope, false, span, CrateLint::No) {
                PathResult::Module(ModuleOrUniformRoot::Module(_)) => return Ok(true),
                PathResult::NonModule(partial_res) if partial_res.unresolved_segments() == 0 => {
                    return Ok(true);
                }
                PathResult::Indeterminate => indeterminate = true,
                // FIXME: `resolve_path` is not ready to report partially resolved paths
                // correctly, so we just report an error if the path was reported as unresolved.
                // This needs to be fixed for `cfg_accessible` to be useful.
                PathResult::NonModule(..) | PathResult::Failed { .. } => {}
                PathResult::Module(_) => panic!("unexpected path resolution"),
            }
        }

        if indeterminate {
            return Err(Indeterminate);
        }

        self.session
            .struct_span_err(span, "not sure whether the path is accessible or not")
            .span_note(span, "`cfg_accessible` is not fully implemented")
            .emit();
        Ok(false)
    }
459 460 461 462

    fn get_proc_macro_quoted_span(&self, krate: CrateNum, id: usize) -> Span {
        self.crate_loader.cstore().get_proc_macro_quoted_span_untracked(krate, id, self.session)
    }
463 464
}

J
John Kåre Alsaker 已提交
465
impl<'a> Resolver<'a> {
466
    /// Resolve macro path with error reporting and recovery.
467 468
    /// Uses dummy syntax extensions for unresolved macros or macros with unexpected resolutions
    /// for better error recovery.
469
    fn smart_resolve_macro_path(
470 471 472
        &mut self,
        path: &ast::Path,
        kind: MacroKind,
473
        supports_macro_expansion: SupportsMacroExpansion,
474
        inner_attr: bool,
475
        parent_scope: &ParentScope<'a>,
476
        node_id: NodeId,
477
        force: bool,
478
        soft_custom_inner_attributes_gate: bool,
479
    ) -> Result<(Lrc<SyntaxExtension>, Res), Indeterminate> {
M
Mark Rousskov 已提交
480 481
        let (ext, res) = match self.resolve_macro_path(path, Some(kind), parent_scope, true, force)
        {
482 483 484 485 486
            Ok((Some(ext), res)) => (ext, res),
            Ok((None, res)) => (self.dummy_ext(kind), res),
            Err(Determinacy::Determined) => (self.dummy_ext(kind), Res::Err),
            Err(Determinacy::Undetermined) => return Err(Indeterminate),
        };
487

488
        // Report errors for the resolved macro.
489 490 491
        for segment in &path.segments {
            if let Some(args) = &segment.args {
                self.session.span_err(args.span(), "generic arguments in macro path");
492
            }
493 494 495 496 497
            if kind == MacroKind::Attr && segment.ident.as_str().starts_with("rustc") {
                self.session.span_err(
                    segment.ident.span,
                    "attributes starting with `rustc` are reserved for use by the `rustc` compiler",
                );
498
            }
499
        }
500

501
        match res {
502
            Res::Def(DefKind::Macro(_), def_id) => {
503 504 505
                if let Some(def_id) = def_id.as_local() {
                    self.unused_macros.remove(&def_id);
                    if self.proc_macro_stubs.contains(&def_id) {
506 507 508 509 510
                        self.session.span_err(
                            path.span,
                            "can't use a procedural macro from the same crate that defines it",
                        );
                    }
511
                }
512
            }
513
            Res::NonMacroAttr(..) | Res::Err => {}
514
            _ => panic!("expected `DefKind::Macro` or `Res::NonMacroAttr`"),
515
        };
516

517
        self.check_stability_and_deprecation(&ext, path, node_id);
518

519 520
        let unexpected_res = if ext.macro_kind() != kind {
            Some((kind.article(), kind.descr_expected()))
521 522 523 524 525 526 527 528 529 530 531
        } else if matches!(res, Res::Def(..)) {
            match supports_macro_expansion {
                SupportsMacroExpansion::No => Some(("a", "non-macro attribute")),
                SupportsMacroExpansion::Yes { supports_inner_attrs } => {
                    if inner_attr && !supports_inner_attrs {
                        Some(("a", "non-macro inner attribute"))
                    } else {
                        None
                    }
                }
            }
532 533 534 535
        } else {
            None
        };
        if let Some((article, expected)) = unexpected_res {
536 537
            let path_str = pprust::path_to_string(path);
            let msg = format!("expected {}, found {} `{}`", expected, res.descr(), path_str);
M
Mark Rousskov 已提交
538 539
            self.session
                .struct_span_err(path.span, &msg)
540
                .span_label(path.span, format!("not {} {}", article, expected))
M
Mark Rousskov 已提交
541
                .emit();
542 543 544 545
            return Ok((self.dummy_ext(kind), Res::Err));
        }

        // We are trying to avoid reporting this error if other related errors were reported.
546 547
        if res != Res::Err
            && inner_attr
548 549
            && !self.session.features_untracked().custom_inner_attributes
        {
550 551 552 553 554
            let msg = match res {
                Res::Def(..) => "inner macro attributes are unstable",
                Res::NonMacroAttr(..) => "custom inner attributes are unstable",
                _ => unreachable!(),
            };
555
            if soft_custom_inner_attributes_gate {
556 557 558 559 560
                self.session.parse_sess.buffer_lint(SOFT_UNSTABLE, path.span, node_id, msg);
            } else {
                feature_err(&self.session.parse_sess, sym::custom_inner_attributes, path.span, msg)
                    .emit();
            }
561 562 563
        }

        Ok((ext, res))
564
    }
565

566
    pub fn resolve_macro_path(
567 568
        &mut self,
        path: &ast::Path,
569
        kind: Option<MacroKind>,
570
        parent_scope: &ParentScope<'a>,
571
        trace: bool,
572
        force: bool,
573
    ) -> Result<(Option<Lrc<SyntaxExtension>>, Res), Determinacy> {
574
        let path_span = path.span;
N
Nick Cameron 已提交
575
        let mut path = Segment::from_path(path);
576

577
        // Possibly apply the macro helper hack
M
Mark Rousskov 已提交
578 579 580 581
        if kind == Some(MacroKind::Bang)
            && path.len() == 1
            && path[0].ident.span.ctxt().outer_expn_data().local_inner_macros
        {
582
            let root = Ident::new(kw::DollarCrate, path[0].ident.span);
N
Nick Cameron 已提交
583
            path.insert(0, Segment::from_ident(root));
584 585
        }

586
        let res = if path.len() > 1 {
M
Mark Rousskov 已提交
587 588 589 590 591 592 593 594
            let res = match self.resolve_path(
                &path,
                Some(MacroNS),
                parent_scope,
                false,
                path_span,
                CrateLint::No,
            ) {
595
                PathResult::NonModule(path_res) if path_res.unresolved_segments() == 0 => {
596
                    Ok(path_res.base_res())
597
                }
598
                PathResult::Indeterminate if !force => return Err(Determinacy::Undetermined),
599 600 601
                PathResult::NonModule(..)
                | PathResult::Indeterminate
                | PathResult::Failed { .. } => Err(Determinacy::Determined),
602
                PathResult::Module(..) => unreachable!(),
603
            };
604

605
            if trace {
606
                let kind = kind.expect("macro kind must be specified if tracing is enabled");
M
Mark Rousskov 已提交
607 608 609 610 611 612 613
                self.multi_segment_macro_resolutions.push((
                    path,
                    path_span,
                    kind,
                    *parent_scope,
                    res.ok(),
                ));
614
            }
615

616 617
            self.prohibit_imported_non_macro_attrs(None, res.ok(), path_span);
            res
618
        } else {
619
            let scope_set = kind.map_or(ScopeSet::All(MacroNS, false), ScopeSet::Macro);
620
            let binding = self.early_resolve_ident_in_lexical_scope(
M
Mark Rousskov 已提交
621 622 623 624 625 626
                path[0].ident,
                scope_set,
                parent_scope,
                false,
                force,
                path_span,
627
            );
628 629
            if let Err(Determinacy::Undetermined) = binding {
                return Err(Determinacy::Undetermined);
630
            }
631

632
            if trace {
633
                let kind = kind.expect("macro kind must be specified if tracing is enabled");
M
Mark Rousskov 已提交
634 635 636 637 638 639
                self.single_segment_macro_resolutions.push((
                    path[0].ident,
                    kind,
                    *parent_scope,
                    binding.ok(),
                ));
640
            }
641

642 643 644
            let res = binding.map(|binding| binding.res());
            self.prohibit_imported_non_macro_attrs(binding.ok(), res.ok(), path_span);
            res
645 646 647
        };

        res.map(|res| (self.get_macro(res), res))
648
    }
649

650
    // Resolve an identifier in lexical scope.
651 652
    // This is a variation of `fn resolve_ident_in_lexical_scope` that can be run during
    // expansion and import resolution (perhaps they can be merged in the future).
653
    // The function is used for resolving initial segments of macro paths (e.g., `foo` in
654
    // `foo::bar!(); or `foo!();`) and also for import paths on 2018 edition.
655
    crate fn early_resolve_ident_in_lexical_scope(
656
        &mut self,
657
        orig_ident: Ident,
658
        scope_set: ScopeSet<'a>,
659
        parent_scope: &ParentScope<'a>,
660 661
        record_used: bool,
        force: bool,
662
        path_span: Span,
663
    ) -> Result<&'a NameBinding<'a>, Determinacy> {
T
Taiki Endo 已提交
664
        bitflags::bitflags! {
665
            struct Flags: u8 {
666 667
                const MACRO_RULES          = 1 << 0;
                const MODULE               = 1 << 1;
668 669 670
                const MISC_SUGGEST_CRATE   = 1 << 2;
                const MISC_SUGGEST_SELF    = 1 << 3;
                const MISC_FROM_PRELUDE    = 1 << 4;
671 672
            }
        }
673

V
Vadim Petrochenkov 已提交
674
        assert!(force || !record_used); // `record_used` implies `force`
675

676
        // Make sure `self`, `super` etc produce an error when passed to here.
677
        if orig_ident.is_path_segment_keyword() {
678 679 680
            return Err(Determinacy::Determined);
        }

681
        let (ns, macro_kind, is_import) = match scope_set {
682
            ScopeSet::All(ns, is_import) => (ns, None, is_import),
683 684
            ScopeSet::AbsolutePath(ns) => (ns, None, false),
            ScopeSet::Macro(macro_kind) => (MacroNS, Some(macro_kind), false),
685
            ScopeSet::Late(ns, ..) => (ns, None, false),
686 687
        };

688 689 690 691
        // This is *the* result, resolution from the scope closest to the resolved identifier.
        // However, sometimes this result is "weak" because it comes from a glob import or
        // a macro expansion, and in this case it cannot shadow names from outer scopes, e.g.
        // mod m { ... } // solution in outer scope
692
        // {
693 694
        //     use prefix::*; // imports another `m` - innermost solution
        //                    // weak, cannot shadow the outer `m`, need to report ambiguity error
695 696
        //     m::mac!();
        // }
697 698
        // So we have to save the innermost solution and continue searching in outer scopes
        // to detect potential ambiguities.
T
Taiki Endo 已提交
699
        let mut innermost_result: Option<(&NameBinding<'_>, Flags)> = None;
700
        let mut determinacy = Determinacy::Determined;
701 702

        // Go through all the scopes and try to resolve the name.
M
Mark Rousskov 已提交
703 704 705
        let break_result = self.visit_scopes(
            scope_set,
            parent_scope,
706 707 708
            orig_ident.span.ctxt(),
            |this, scope, use_prelude, ctxt| {
                let ident = Ident::new(orig_ident.name, orig_ident.span.with_ctxt(ctxt));
M
Mark Rousskov 已提交
709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732
                let ok = |res, span, arenas| {
                    Ok((
                        (res, ty::Visibility::Public, span, ExpnId::root()).to_name_binding(arenas),
                        Flags::empty(),
                    ))
                };
                let result = match scope {
                    Scope::DeriveHelpers(expn_id) => {
                        if let Some(attr) = this
                            .helper_attrs
                            .get(&expn_id)
                            .and_then(|attrs| attrs.iter().rfind(|i| ident == **i))
                        {
                            let binding = (
                                Res::NonMacroAttr(NonMacroAttrKind::DeriveHelper),
                                ty::Visibility::Public,
                                attr.span,
                                expn_id,
                            )
                                .to_name_binding(this.arenas);
                            Ok((binding, Flags::empty()))
                        } else {
                            Err(Determinacy::Determined)
                        }
733
                    }
M
Mark Rousskov 已提交
734 735 736 737 738 739 740 741 742 743 744 745 746
                    Scope::DeriveHelpersCompat => {
                        let mut result = Err(Determinacy::Determined);
                        for derive in parent_scope.derives {
                            let parent_scope = &ParentScope { derives: &[], ..*parent_scope };
                            match this.resolve_macro_path(
                                derive,
                                Some(MacroKind::Derive),
                                parent_scope,
                                true,
                                force,
                            ) {
                                Ok((Some(ext), _)) => {
                                    if ext.helper_attrs.contains(&ident.name) {
747 748
                                        result = ok(
                                            Res::NonMacroAttr(NonMacroAttrKind::DeriveHelperCompat),
M
Mark Rousskov 已提交
749
                                            derive.span,
750 751
                                            this.arenas,
                                        );
M
Mark Rousskov 已提交
752 753 754 755 756 757 758
                                        break;
                                    }
                                }
                                Ok(_) | Err(Determinacy::Determined) => {}
                                Err(Determinacy::Undetermined) => {
                                    result = Err(Determinacy::Undetermined)
                                }
759 760
                            }
                        }
M
Mark Rousskov 已提交
761
                        result
762
                    }
763
                    Scope::MacroRules(macro_rules_scope) => match macro_rules_scope.get() {
764 765 766 767
                        MacroRulesScope::Binding(macro_rules_binding)
                            if ident == macro_rules_binding.ident =>
                        {
                            Ok((macro_rules_binding.binding, Flags::MACRO_RULES))
768
                        }
769
                        MacroRulesScope::Invocation(_) => Err(Determinacy::Undetermined),
M
Mark Rousskov 已提交
770 771 772 773 774 775 776
                        _ => Err(Determinacy::Determined),
                    },
                    Scope::CrateRoot => {
                        let root_ident = Ident::new(kw::PathRoot, ident.span);
                        let root_module = this.resolve_crate_root(root_ident);
                        let binding = this.resolve_ident_in_module_ext(
                            ModuleOrUniformRoot::Module(root_module),
777 778
                            ident,
                            ns,
779
                            parent_scope,
M
Mark Rousskov 已提交
780
                            record_used,
781
                            path_span,
M
Mark Rousskov 已提交
782 783 784 785 786 787 788 789
                        );
                        match binding {
                            Ok(binding) => Ok((binding, Flags::MODULE | Flags::MISC_SUGGEST_CRATE)),
                            Err((Determinacy::Undetermined, Weak::No)) => {
                                return Some(Err(Determinacy::determined(force)));
                            }
                            Err((Determinacy::Undetermined, Weak::Yes)) => {
                                Err(Determinacy::Undetermined)
790
                            }
M
Mark Rousskov 已提交
791
                            Err((Determinacy::Determined, _)) => Err(Determinacy::Determined),
792 793
                        }
                    }
794
                    Scope::Module(module, derive_fallback_lint_id) => {
M
Mark Rousskov 已提交
795 796 797 798 799 800
                        let adjusted_parent_scope = &ParentScope { module, ..*parent_scope };
                        let binding = this.resolve_ident_in_module_unadjusted_ext(
                            ModuleOrUniformRoot::Module(module),
                            ident,
                            ns,
                            adjusted_parent_scope,
801
                            !matches!(scope_set, ScopeSet::Late(..)),
M
Mark Rousskov 已提交
802 803 804 805 806
                            record_used,
                            path_span,
                        );
                        match binding {
                            Ok(binding) => {
807 808 809 810 811 812 813 814 815 816 817 818 819 820 821
                                if let Some(lint_id) = derive_fallback_lint_id {
                                    this.lint_buffer.buffer_lint_with_diagnostic(
                                        PROC_MACRO_DERIVE_RESOLUTION_FALLBACK,
                                        lint_id,
                                        orig_ident.span,
                                        &format!(
                                            "cannot find {} `{}` in this scope",
                                            ns.descr(),
                                            ident
                                        ),
                                        BuiltinLintDiagnostics::ProcMacroDeriveResolutionFallback(
                                            orig_ident.span,
                                        ),
                                    );
                                }
M
Mark Rousskov 已提交
822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857
                                let misc_flags = if ptr::eq(module, this.graph_root) {
                                    Flags::MISC_SUGGEST_CRATE
                                } else if module.is_normal() {
                                    Flags::MISC_SUGGEST_SELF
                                } else {
                                    Flags::empty()
                                };
                                Ok((binding, Flags::MODULE | misc_flags))
                            }
                            Err((Determinacy::Undetermined, Weak::No)) => {
                                return Some(Err(Determinacy::determined(force)));
                            }
                            Err((Determinacy::Undetermined, Weak::Yes)) => {
                                Err(Determinacy::Undetermined)
                            }
                            Err((Determinacy::Determined, _)) => Err(Determinacy::Determined),
                        }
                    }
                    Scope::RegisteredAttrs => match this.registered_attrs.get(&ident).cloned() {
                        Some(ident) => ok(
                            Res::NonMacroAttr(NonMacroAttrKind::Registered),
                            ident.span,
                            this.arenas,
                        ),
                        None => Err(Determinacy::Determined),
                    },
                    Scope::MacroUsePrelude => {
                        match this.macro_use_prelude.get(&ident.name).cloned() {
                            Some(binding) => Ok((binding, Flags::MISC_FROM_PRELUDE)),
                            None => Err(Determinacy::determined(
                                this.graph_root.unexpanded_invocations.borrow().is_empty(),
                            )),
                        }
                    }
                    Scope::BuiltinAttrs => {
                        if is_builtin_attr_name(ident.name) {
858 859 860 861 862
                            ok(
                                Res::NonMacroAttr(NonMacroAttrKind::Builtin(ident.name)),
                                DUMMY_SP,
                                this.arenas,
                            )
M
Mark Rousskov 已提交
863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893
                        } else {
                            Err(Determinacy::Determined)
                        }
                    }
                    Scope::ExternPrelude => match this.extern_prelude_get(ident, !record_used) {
                        Some(binding) => Ok((binding, Flags::empty())),
                        None => Err(Determinacy::determined(
                            this.graph_root.unexpanded_invocations.borrow().is_empty(),
                        )),
                    },
                    Scope::ToolPrelude => match this.registered_tools.get(&ident).cloned() {
                        Some(ident) => ok(Res::ToolMod, ident.span, this.arenas),
                        None => Err(Determinacy::Determined),
                    },
                    Scope::StdLibPrelude => {
                        let mut result = Err(Determinacy::Determined);
                        if let Some(prelude) = this.prelude {
                            if let Ok(binding) = this.resolve_ident_in_module_unadjusted(
                                ModuleOrUniformRoot::Module(prelude),
                                ident,
                                ns,
                                parent_scope,
                                false,
                                path_span,
                            ) {
                                if use_prelude || this.is_builtin_macro(binding.res()) {
                                    result = Ok((binding, Flags::MISC_FROM_PRELUDE));
                                }
                            }
                        }
                        result
894
                    }
895 896 897 898
                    Scope::BuiltinTypes => match PrimTy::from_name(ident.name) {
                        Some(prim_ty) => ok(Res::PrimTy(prim_ty), DUMMY_SP, this.arenas),
                        None => Err(Determinacy::Determined),
                    },
M
Mark Rousskov 已提交
899 900 901 902 903 904
                };

                match result {
                    Ok((binding, flags))
                        if sub_namespace_match(binding.macro_kind(), macro_kind) =>
                    {
905
                        if !record_used || matches!(scope_set, ScopeSet::Late(..)) {
M
Mark Rousskov 已提交
906 907 908 909 910 911 912
                            return Some(Ok(binding));
                        }

                        if let Some((innermost_binding, innermost_flags)) = innermost_result {
                            // Found another solution, if the first one was "weak", report an error.
                            let (res, innermost_res) = (binding.res(), innermost_binding.res());
                            if res != innermost_res {
913 914 915
                                let is_builtin = |res| {
                                    matches!(res, Res::NonMacroAttr(NonMacroAttrKind::Builtin(..)))
                                };
916 917
                                let derive_helper =
                                    Res::NonMacroAttr(NonMacroAttrKind::DeriveHelper);
918 919
                                let derive_helper_compat =
                                    Res::NonMacroAttr(NonMacroAttrKind::DeriveHelperCompat);
920

M
Mark Rousskov 已提交
921 922
                                let ambiguity_error_kind = if is_import {
                                    Some(AmbiguityKind::Import)
923
                                } else if is_builtin(innermost_res) || is_builtin(res) {
M
Mark Rousskov 已提交
924
                                    Some(AmbiguityKind::BuiltinAttr)
925
                                } else if innermost_res == derive_helper_compat
926
                                    || res == derive_helper_compat && innermost_res != derive_helper
M
Mark Rousskov 已提交
927 928 929 930
                                {
                                    Some(AmbiguityKind::DeriveHelper)
                                } else if innermost_flags.contains(Flags::MACRO_RULES)
                                    && flags.contains(Flags::MODULE)
931 932 933 934
                                    && !this.disambiguate_macro_rules_vs_modularized(
                                        innermost_binding,
                                        binding,
                                    )
M
Mark Rousskov 已提交
935 936
                                    || flags.contains(Flags::MACRO_RULES)
                                        && innermost_flags.contains(Flags::MODULE)
937
                                        && !this.disambiguate_macro_rules_vs_modularized(
M
Mark Rousskov 已提交
938 939 940 941
                                            binding,
                                            innermost_binding,
                                        )
                                {
942
                                    Some(AmbiguityKind::MacroRulesVsModularized)
M
Mark Rousskov 已提交
943 944 945 946 947 948
                                } else if innermost_binding.is_glob_import() {
                                    Some(AmbiguityKind::GlobVsOuter)
                                } else if innermost_binding
                                    .may_appear_after(parent_scope.expansion, binding)
                                {
                                    Some(AmbiguityKind::MoreExpandedVsOuter)
949
                                } else {
M
Mark Rousskov 已提交
950
                                    None
951
                                };
M
Mark Rousskov 已提交
952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973
                                if let Some(kind) = ambiguity_error_kind {
                                    let misc = |f: Flags| {
                                        if f.contains(Flags::MISC_SUGGEST_CRATE) {
                                            AmbiguityErrorMisc::SuggestCrate
                                        } else if f.contains(Flags::MISC_SUGGEST_SELF) {
                                            AmbiguityErrorMisc::SuggestSelf
                                        } else if f.contains(Flags::MISC_FROM_PRELUDE) {
                                            AmbiguityErrorMisc::FromPrelude
                                        } else {
                                            AmbiguityErrorMisc::None
                                        }
                                    };
                                    this.ambiguity_errors.push(AmbiguityError {
                                        kind,
                                        ident: orig_ident,
                                        b1: innermost_binding,
                                        b2: binding,
                                        misc1: misc(innermost_flags),
                                        misc2: misc(flags),
                                    });
                                    return Some(Ok(innermost_binding));
                                }
974
                            }
M
Mark Rousskov 已提交
975 976 977
                        } else {
                            // Found the first solution.
                            innermost_result = Some((binding, flags));
978
                        }
979
                    }
M
Mark Rousskov 已提交
980 981
                    Ok(..) | Err(Determinacy::Determined) => {}
                    Err(Determinacy::Undetermined) => determinacy = Determinacy::Undetermined,
982
                }
983

M
Mark Rousskov 已提交
984 985 986
                None
            },
        );
987

988 989
        if let Some(break_result) = break_result {
            return break_result;
990
        }
991

992
        // The first found solution was the only one, return it.
993
        if let Some((binding, _)) = innermost_result {
994
            return Ok(binding);
995
        }
996

997
        Err(Determinacy::determined(determinacy == Determinacy::Determined || force))
998 999
    }

1000
    crate fn finalize_macro_resolutions(&mut self) {
M
Mark Rousskov 已提交
1001 1002 1003 1004 1005 1006
        let check_consistency = |this: &mut Self,
                                 path: &[Segment],
                                 span,
                                 kind: MacroKind,
                                 initial_res: Option<Res>,
                                 res: Res| {
1007
            if let Some(initial_res) = initial_res {
1008
                if res != initial_res {
1009 1010
                    // Make sure compilation does not succeed if preferred macro resolution
                    // has changed after the macro had been expanded. In theory all such
1011 1012
                    // situations should be reported as errors, so this is a bug.
                    this.session.delay_span_bug(span, "inconsistent resolution for a macro");
1013 1014 1015 1016 1017 1018 1019 1020 1021 1022
                }
            } else {
                // It's possible that the macro was unresolved (indeterminate) and silently
                // expanded into a dummy fragment for recovery during expansion.
                // Now, post-expansion, the resolution may succeed, but we can't change the
                // past and need to report an error.
                // However, non-speculative `resolve_path` can successfully return private items
                // even if speculative `resolve_path` returned nothing previously, so we skip this
                // less informative error if the privacy error is reported elsewhere.
                if this.privacy_errors.is_empty() {
M
Mark Rousskov 已提交
1023 1024 1025 1026 1027
                    let msg = format!(
                        "cannot determine resolution for the {} `{}`",
                        kind.descr(),
                        Segment::names_to_string(path)
                    );
1028 1029 1030 1031 1032 1033
                    let msg_note = "import resolution is stuck, try simplifying macro imports";
                    this.session.struct_span_err(span, &msg).note(msg_note).emit();
                }
            }
        };

1034
        let macro_resolutions = mem::take(&mut self.multi_segment_macro_resolutions);
1035
        for (mut path, path_span, kind, parent_scope, initial_res) in macro_resolutions {
1036
            // FIXME: Path resolution will ICE if segment IDs present.
M
Mark Rousskov 已提交
1037 1038 1039
            for seg in &mut path {
                seg.id = None;
            }
1040
            match self.resolve_path(
M
Mark Rousskov 已提交
1041 1042 1043 1044 1045 1046
                &path,
                Some(MacroNS),
                &parent_scope,
                true,
                path_span,
                CrateLint::No,
1047
            ) {
1048
                PathResult::NonModule(path_res) if path_res.unresolved_segments() == 0 => {
1049 1050
                    let res = path_res.base_res();
                    check_consistency(self, &path, path_span, kind, initial_res, res);
1051
                }
1052 1053 1054
                path_res @ PathResult::NonModule(..) | path_res @ PathResult::Failed { .. } => {
                    let (span, label) = if let PathResult::Failed { span, label, .. } = path_res {
                        (span, label)
1055
                    } else {
M
Mark Rousskov 已提交
1056 1057 1058 1059 1060 1061 1062 1063
                        (
                            path_span,
                            format!(
                                "partially resolved path in {} {}",
                                kind.article(),
                                kind.descr()
                            ),
                        )
1064
                    };
M
Mark Rousskov 已提交
1065 1066 1067 1068
                    self.report_error(
                        span,
                        ResolutionError::FailedToResolve { label, suggestion: None },
                    );
1069
                }
1070
                PathResult::Module(..) | PathResult::Indeterminate => unreachable!(),
1071 1072 1073
            }
        }

1074
        let macro_resolutions = mem::take(&mut self.single_segment_macro_resolutions);
1075
        for (ident, kind, parent_scope, initial_binding) in macro_resolutions {
M
Mark Rousskov 已提交
1076 1077 1078 1079 1080 1081 1082 1083
            match self.early_resolve_ident_in_lexical_scope(
                ident,
                ScopeSet::Macro(kind),
                &parent_scope,
                true,
                true,
                ident.span,
            ) {
1084
                Ok(binding) => {
1085
                    let initial_res = initial_binding.map(|initial_binding| {
1086
                        self.record_use(ident, MacroNS, initial_binding, false);
1087
                        initial_binding.res()
1088
                    });
1089
                    let res = binding.res();
V
Vadim Petrochenkov 已提交
1090
                    let seg = Segment::from_ident(ident);
1091
                    check_consistency(self, &[seg], ident.span, kind, initial_res, res);
1092 1093 1094 1095 1096 1097 1098 1099 1100
                    if res == Res::NonMacroAttr(NonMacroAttrKind::DeriveHelperCompat) {
                        self.lint_buffer.buffer_lint_with_diagnostic(
                            LEGACY_DERIVE_HELPERS,
                            self.lint_node_id(parent_scope.expansion),
                            ident.span,
                            "derive helper attribute is used before it is introduced",
                            BuiltinLintDiagnostics::LegacyDeriveHelpers(binding.span),
                        );
                    }
1101
                }
1102
                Err(..) => {
1103
                    let expected = kind.descr_expected();
1104
                    let msg = format!("cannot find {} `{}` in this scope", expected, ident);
1105
                    let mut err = self.session.struct_span_err(ident.span, &msg);
1106
                    self.unresolved_macro_suggestions(&mut err, kind, &parent_scope, ident);
1107
                    err.emit();
1108
                }
1109
            }
J
Jeffrey Seyfried 已提交
1110
        }
1111

1112
        let builtin_attrs = mem::take(&mut self.builtin_attrs);
1113
        for (ident, parent_scope) in builtin_attrs {
1114
            let _ = self.early_resolve_ident_in_lexical_scope(
M
Mark Rousskov 已提交
1115 1116 1117 1118 1119 1120
                ident,
                ScopeSet::Macro(MacroKind::Attr),
                &parent_scope,
                true,
                true,
                ident.span,
1121
            );
1122
        }
1123
    }
1124

1125 1126 1127 1128 1129 1130
    fn check_stability_and_deprecation(
        &mut self,
        ext: &SyntaxExtension,
        path: &ast::Path,
        node_id: NodeId,
    ) {
1131
        let span = path.span;
1132
        if let Some(stability) = &ext.stability {
1133
            if let StabilityLevel::Unstable { reason, issue, is_soft } = stability.level {
1134 1135
                let feature = stability.feature;
                if !self.active_features.contains(&feature) && !span.allows_unstable(feature) {
1136
                    let lint_buffer = &mut self.lint_buffer;
M
Mark Rousskov 已提交
1137 1138
                    let soft_handler =
                        |lint, span, msg: &_| lint_buffer.buffer_lint(lint, node_id, span, msg);
1139
                    stability::report_unstable(
M
Mark Rousskov 已提交
1140 1141 1142 1143 1144 1145 1146
                        self.session,
                        feature,
                        reason,
                        issue,
                        is_soft,
                        span,
                        soft_handler,
1147
                    );
1148 1149 1150 1151
                }
            }
        }
        if let Some(depr) = &ext.deprecation {
1152
            let path = pprust::path_to_string(&path);
1153
            let (message, lint) = stability::deprecation_message(depr, "macro", &path);
1154 1155 1156 1157 1158 1159
            stability::early_report_deprecation(
                &mut self.lint_buffer,
                &message,
                depr.suggestion,
                lint,
                span,
1160
                node_id,
1161
            );
1162 1163 1164
        }
    }

M
Mark Rousskov 已提交
1165 1166 1167 1168 1169 1170
    fn prohibit_imported_non_macro_attrs(
        &self,
        binding: Option<&'a NameBinding<'a>>,
        res: Option<Res>,
        span: Span,
    ) {
1171
        if let Some(Res::NonMacroAttr(kind)) = res {
1172
            if kind != NonMacroAttrKind::Tool && binding.map_or(true, |b| b.is_import()) {
V
Vadim Petrochenkov 已提交
1173 1174
                let msg =
                    format!("cannot use {} {} through an import", kind.article(), kind.descr());
1175 1176 1177 1178 1179 1180 1181 1182 1183
                let mut err = self.session.struct_span_err(span, &msg);
                if let Some(binding) = binding {
                    err.span_note(binding.span, &format!("the {} imported here", kind.descr()));
                }
                err.emit();
            }
        }
    }

1184 1185 1186
    crate fn check_reserved_macro_name(&mut self, ident: Ident, res: Res) {
        // Reserve some names that are not quite covered by the general check
        // performed on `Resolver::builtin_attrs`.
1187
        if ident.name == sym::cfg || ident.name == sym::cfg_attr {
1188
            let macro_kind = self.get_macro(res).map(|ext| ext.macro_kind());
1189 1190
            if macro_kind.is_some() && sub_namespace_match(macro_kind, Some(MacroKind::Attr)) {
                self.session.span_err(
M
Mark Rousskov 已提交
1191 1192
                    ident.span,
                    &format!("name `{}` is reserved in attribute namespace", ident),
1193 1194 1195 1196 1197
                );
            }
        }
    }

1198 1199
    /// Compile the macro into a `SyntaxExtension` and possibly replace
    /// its expander to a pre-defined one for built-in macros.
1200
    crate fn compile_macro(&mut self, item: &ast::Item, edition: Edition) -> SyntaxExtension {
1201
        let mut result = compile_declarative_macro(
1202
            &self.session,
M
Mark Rousskov 已提交
1203 1204 1205
            self.session.features_untracked(),
            item,
            edition,
1206 1207
        );

1208
        if let Some(builtin_name) = result.builtin_name {
1209
            // The macro was marked with `#[rustc_builtin_macro]`.
1210
            if let Some(builtin_macro) = self.builtin_macros.get_mut(&builtin_name) {
1211 1212
                // The macro is a built-in, replace its expander function
                // while still taking everything else from the source code.
1213 1214
                // If we already loaded this builtin macro, give a better error message than 'no such builtin macro'.
                match mem::replace(builtin_macro, BuiltinMacroState::AlreadySeen(item.span)) {
1215
                    BuiltinMacroState::NotYetSeen(ext) => result.kind = ext,
1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226
                    BuiltinMacroState::AlreadySeen(span) => {
                        struct_span_err!(
                            self.session,
                            item.span,
                            E0773,
                            "attempted to define built-in macro more than once"
                        )
                        .span_note(span, "previously defined here")
                        .emit();
                    }
                }
1227 1228 1229 1230 1231 1232
            } else {
                let msg = format!("cannot find a built-in macro with name `{}`", item.ident);
                self.session.span_err(item.span, &msg);
            }
        }

1233
        result
1234
    }
1235
}