Skip to content

Commit 09335b6

Browse files
Auto merge of #139493 - Voultapher:explicitly-export-core-and-std-macros, r=<try>
Explicitly export core and std macros
2 parents 11d2046 + 3ff59e0 commit 09335b6

File tree

85 files changed

+423
-123
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

85 files changed

+423
-123
lines changed

compiler/rustc_builtin_macros/src/standard_library_imports.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ pub fn inject(
4343

4444
let item = cx.item(
4545
span,
46-
thin_vec![cx.attr_word(sym::macro_use, span)],
46+
ast::AttrVec::new(),
4747
ast::ItemKind::ExternCrate(None, Ident::new(name, ident_span)),
4848
);
4949

compiler/rustc_lint/src/early/diagnostics.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -257,8 +257,8 @@ pub fn decorate_builtin_lint(
257257

258258
lints::ExternCrateNotIdiomatic { span: suggestion_span, code }.decorate_lint(diag);
259259
}
260-
BuiltinLintDiag::AmbiguousGlobImports { diag: ambiguity } => {
261-
lints::AmbiguousGlobImports { ambiguity }.decorate_lint(diag);
260+
BuiltinLintDiag::AmbiguousImports { diag: ambiguity } => {
261+
lints::AmbiguousImports { ambiguity }.decorate_lint(diag);
262262
}
263263
BuiltinLintDiag::AmbiguousGlobReexports {
264264
name,

compiler/rustc_lint/src/lints.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2870,11 +2870,11 @@ pub(crate) struct ExternCrateNotIdiomatic {
28702870
}
28712871

28722872
// FIXME: make this translatable
2873-
pub(crate) struct AmbiguousGlobImports {
2873+
pub(crate) struct AmbiguousImports {
28742874
pub ambiguity: AmbiguityErrorDiag,
28752875
}
28762876

2877-
impl<'a, G: EmissionGuarantee> LintDiagnostic<'a, G> for AmbiguousGlobImports {
2877+
impl<'a, G: EmissionGuarantee> LintDiagnostic<'a, G> for AmbiguousImports {
28782878
fn decorate_lint<'b>(self, diag: &'b mut Diag<'a, G>) {
28792879
diag.primary_message(self.ambiguity.msg.clone());
28802880
rustc_errors::report_ambiguity_error(diag, self.ambiguity);

compiler/rustc_lint_defs/src/builtin.rs

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ declare_lint_pass! {
2121
AMBIGUOUS_ASSOCIATED_ITEMS,
2222
AMBIGUOUS_GLOB_IMPORTS,
2323
AMBIGUOUS_GLOB_REEXPORTS,
24+
AMBIGUOUS_PANIC_IMPORTS,
2425
ARITHMETIC_OVERFLOW,
2526
ASM_SUB_REGISTER,
2627
BAD_ASM_STYLE,
@@ -4437,6 +4438,43 @@ declare_lint! {
44374438
};
44384439
}
44394440

4441+
declare_lint! {
4442+
/// The `ambiguous_panic_imports` lint detects ambiguous core and std panic imports, but
4443+
/// previously didn't do that due to `#[macro_use]` prelude macro import.
4444+
///
4445+
/// ### Example
4446+
///
4447+
/// ```rust,compile_fail
4448+
/// #![deny(ambiguous_panic_imports)]
4449+
/// #![no_std]
4450+
///
4451+
/// extern crate std;
4452+
/// use std::prelude::v1::*;
4453+
///
4454+
/// fn xx() {
4455+
/// panic!(); // resolves to core::panic
4456+
/// }
4457+
/// ```
4458+
///
4459+
/// {{produces}}
4460+
///
4461+
/// ### Explanation
4462+
///
4463+
/// Future versions of Rust will no longer accept the ambiguous resolution.
4464+
///
4465+
/// This is a [future-incompatible] lint to transition this to a hard error in the future.
4466+
///
4467+
/// [future-incompatible]: ../index.md#future-incompatible-lints
4468+
pub AMBIGUOUS_PANIC_IMPORTS,
4469+
Warn,
4470+
"detects ambiguous core and std panic imports",
4471+
@future_incompatible = FutureIncompatibleInfo {
4472+
reason: FutureIncompatibilityReason::FutureReleaseError,
4473+
reference: "issue #147319 <https://github.com/rust-lang/rust/issues/147319>",
4474+
report_in_deps: true,
4475+
};
4476+
}
4477+
44404478
declare_lint! {
44414479
/// The `refining_impl_trait_reachable` lint detects `impl Trait` return
44424480
/// types in method signatures that are refined by a publically reachable

compiler/rustc_lint_defs/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -682,7 +682,7 @@ pub enum BuiltinLintDiag {
682682
vis_span: Span,
683683
ident_span: Span,
684684
},
685-
AmbiguousGlobImports {
685+
AmbiguousImports {
686686
diag: AmbiguityErrorDiag,
687687
},
688688
AmbiguousGlobReexports {

compiler/rustc_resolve/src/diagnostics.rs

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ use rustc_middle::bug;
2121
use rustc_middle::ty::TyCtxt;
2222
use rustc_session::Session;
2323
use rustc_session::lint::builtin::{
24-
ABSOLUTE_PATHS_NOT_STARTING_WITH_CRATE, AMBIGUOUS_GLOB_IMPORTS,
24+
ABSOLUTE_PATHS_NOT_STARTING_WITH_CRATE, AMBIGUOUS_GLOB_IMPORTS, AMBIGUOUS_PANIC_IMPORTS,
2525
MACRO_EXPANDED_MACRO_EXPORTS_ACCESSED_BY_ABSOLUTE_PATHS,
2626
};
2727
use rustc_session::lint::{AmbiguityErrorDiag, BuiltinLintDiag};
@@ -42,9 +42,9 @@ use crate::errors::{
4242
use crate::imports::{Import, ImportKind};
4343
use crate::late::{PatternSource, Rib};
4444
use crate::{
45-
AmbiguityError, AmbiguityErrorMisc, AmbiguityKind, BindingError, BindingKey, Finalize,
46-
ForwardGenericParamBanReason, HasGenericParams, LexicalScopeBinding, MacroRulesScope, Module,
47-
ModuleKind, ModuleOrUniformRoot, NameBinding, NameBindingKind, ParentScope, PathResult,
45+
AmbiguityError, AmbiguityErrorMisc, AmbiguityKind, AmbiguityWarning, BindingError, BindingKey,
46+
Finalize, ForwardGenericParamBanReason, HasGenericParams, LexicalScopeBinding, MacroRulesScope,
47+
Module, ModuleKind, ModuleOrUniformRoot, NameBinding, NameBindingKind, ParentScope, PathResult,
4848
PrivacyError, ResolutionError, Resolver, Scope, ScopeSet, Segment, UseError, Used,
4949
VisResolutionError, errors as errs, path_names_to_string,
5050
};
@@ -144,15 +144,21 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
144144

145145
for ambiguity_error in &self.ambiguity_errors {
146146
let diag = self.ambiguity_diagnostics(ambiguity_error);
147-
if ambiguity_error.warning {
147+
if let Some(ambiguity_warning) = ambiguity_error.warning {
148148
let NameBindingKind::Import { import, .. } = ambiguity_error.b1.0.kind else {
149149
unreachable!()
150150
};
151+
152+
let lint = match ambiguity_warning {
153+
AmbiguityWarning::GlobImport => AMBIGUOUS_GLOB_IMPORTS,
154+
AmbiguityWarning::PanicImport => AMBIGUOUS_PANIC_IMPORTS,
155+
};
156+
151157
self.lint_buffer.buffer_lint(
152-
AMBIGUOUS_GLOB_IMPORTS,
158+
lint,
153159
import.root_id,
154160
ambiguity_error.ident.span,
155-
BuiltinLintDiag::AmbiguousGlobImports { diag },
161+
BuiltinLintDiag::AmbiguousImports { diag },
156162
);
157163
} else {
158164
let mut err = struct_span_code_err!(self.dcx(), diag.span, E0659, "{}", diag.msg);

compiler/rustc_resolve/src/ident.rs

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use rustc_hir::def::{DefKind, MacroKinds, Namespace, NonMacroAttrKind, PartialRe
66
use rustc_middle::{bug, span_bug};
77
use rustc_session::lint::builtin::PROC_MACRO_DERIVE_RESOLUTION_FALLBACK;
88
use rustc_session::parse::feature_err;
9+
use rustc_span::edition::Edition;
910
use rustc_span::hygiene::{ExpnId, ExpnKind, LocalExpnId, MacroKind, SyntaxContext};
1011
use rustc_span::{Ident, Span, kw, sym};
1112
use tracing::{debug, instrument};
@@ -15,10 +16,10 @@ use crate::imports::{Import, NameResolution};
1516
use crate::late::{ConstantHasGenerics, NoConstantGenericsReason, PathSource, Rib, RibKind};
1617
use crate::macros::{MacroRulesScope, sub_namespace_match};
1718
use crate::{
18-
AmbiguityError, AmbiguityErrorMisc, AmbiguityKind, BindingKey, CmResolver, Determinacy,
19-
Finalize, ImportKind, LexicalScopeBinding, Module, ModuleKind, ModuleOrUniformRoot,
20-
NameBinding, NameBindingKind, ParentScope, PathResult, PrivacyError, Res, ResolutionError,
21-
Resolver, Scope, ScopeSet, Segment, Stage, Used, Weak, errors,
19+
AmbiguityError, AmbiguityErrorMisc, AmbiguityKind, AmbiguityWarning, BindingKey, CmResolver,
20+
Determinacy, Finalize, ImportKind, LexicalScopeBinding, Module, ModuleKind,
21+
ModuleOrUniformRoot, NameBinding, NameBindingKind, ParentScope, PathResult, PrivacyError, Res,
22+
ResolutionError, Resolver, Scope, ScopeSet, Segment, Stage, Used, Weak, errors,
2223
};
2324

2425
#[derive(Copy, Clone)]
@@ -704,13 +705,29 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
704705
// Skip ambiguity errors for extern flag bindings "overridden"
705706
// by extern item bindings.
706707
// FIXME: Remove with lang team approval.
707-
let issue_145575_hack = Some(binding)
708-
== extern_prelude_flag_binding
709-
&& extern_prelude_item_binding.is_some()
710-
&& extern_prelude_item_binding != Some(innermost_binding);
708+
let is_issue_145575_hack = || {
709+
Some(binding) == extern_prelude_flag_binding
710+
&& extern_prelude_item_binding.is_some()
711+
&& extern_prelude_item_binding != Some(innermost_binding)
712+
};
713+
711714
if let Some(kind) = ambiguity_error_kind
712-
&& !issue_145575_hack
715+
&& !is_issue_145575_hack()
713716
{
717+
// Turn ambiguity errors for core vs std panic into warnings.
718+
// FIXME: Remove with lang team approval.
719+
let is_issue_147319_hack = ctxt.edition()
720+
<= Edition::Edition2024
721+
&& matches!(orig_ident.name, sym::panic)
722+
&& this.is_builtin_macro(binding.res())
723+
&& this.is_builtin_macro(innermost_binding.res());
724+
725+
let warning = if is_issue_147319_hack {
726+
Some(AmbiguityWarning::PanicImport)
727+
} else {
728+
None
729+
};
730+
714731
let misc = |f: Flags| {
715732
if f.contains(Flags::MISC_SUGGEST_CRATE) {
716733
AmbiguityErrorMisc::SuggestCrate
@@ -727,7 +744,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
727744
ident: orig_ident,
728745
b1: innermost_binding,
729746
b2: binding,
730-
warning: false,
747+
warning,
731748
misc1: misc(innermost_flags),
732749
misc2: misc(flags),
733750
});
@@ -1071,7 +1088,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
10711088
ident,
10721089
b1: binding,
10731090
b2: shadowed_glob,
1074-
warning: false,
1091+
warning: None,
10751092
misc1: AmbiguityErrorMisc::None,
10761093
misc2: AmbiguityErrorMisc::None,
10771094
});

compiler/rustc_resolve/src/imports.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -945,8 +945,9 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
945945
ImportKind::Single { bindings, .. } => bindings[TypeNS].get().binding(),
946946
_ => None,
947947
};
948-
let ambiguity_errors_len =
949-
|errors: &Vec<AmbiguityError<'_>>| errors.iter().filter(|error| !error.warning).count();
948+
let ambiguity_errors_len = |errors: &Vec<AmbiguityError<'_>>| {
949+
errors.iter().filter(|error| error.warning.is_none()).count()
950+
};
950951
let prev_ambiguity_errors_len = ambiguity_errors_len(&self.ambiguity_errors);
951952
let finalize = Finalize::with_root_span(import.root_id, import.span, import.root_span);
952953

@@ -1161,7 +1162,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
11611162
});
11621163
let res = binding.res();
11631164
let has_ambiguity_error =
1164-
this.ambiguity_errors.iter().any(|error| !error.warning);
1165+
this.ambiguity_errors.iter().any(|error| error.warning.is_none());
11651166
if res == Res::Err || has_ambiguity_error {
11661167
this.dcx()
11671168
.span_delayed_bug(import.span, "some error happened for an import");

compiler/rustc_resolve/src/lib.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -903,14 +903,20 @@ enum AmbiguityErrorMisc {
903903
None,
904904
}
905905

906+
#[derive(Clone, Copy, PartialEq)]
907+
enum AmbiguityWarning {
908+
GlobImport,
909+
PanicImport,
910+
}
911+
906912
struct AmbiguityError<'ra> {
907913
kind: AmbiguityKind,
908914
ident: Ident,
909915
b1: NameBinding<'ra>,
910916
b2: NameBinding<'ra>,
911917
misc1: AmbiguityErrorMisc,
912918
misc2: AmbiguityErrorMisc,
913-
warning: bool,
919+
warning: Option<AmbiguityWarning>,
914920
}
915921

916922
impl<'ra> NameBindingData<'ra> {
@@ -2039,7 +2045,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
20392045
b2,
20402046
misc1: AmbiguityErrorMisc::None,
20412047
misc2: AmbiguityErrorMisc::None,
2042-
warning: warn_ambiguity,
2048+
warning: if warn_ambiguity { Some(AmbiguityWarning::GlobImport) } else { None },
20432049
};
20442050
if !self.matches_previous_ambiguity_error(&ambiguity_error) {
20452051
// avoid duplicated span information to be emit out

compiler/rustc_resolve/src/macros.rs

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -844,10 +844,19 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
844844
res: Res| {
845845
if let Some(initial_res) = initial_res {
846846
if res != initial_res {
847-
// Make sure compilation does not succeed if preferred macro resolution
848-
// has changed after the macro had been expanded. In theory all such
849-
// situations should be reported as errors, so this is a bug.
850-
this.dcx().span_delayed_bug(span, "inconsistent resolution for a macro");
847+
// Delayed versions of the #147319 workaround are inconsistent, but not really
848+
// problematic and already seen as a bug.
849+
// FIXME: Remove with lang team approval.
850+
if !this
851+
.ambiguity_errors
852+
.iter()
853+
.all(|ambiguity_error| ambiguity_error.warning.is_some())
854+
{
855+
// Make sure compilation does not succeed if preferred macro resolution
856+
// has changed after the macro had been expanded. In theory all such
857+
// situations should be reported as errors, so this is a bug.
858+
this.dcx().span_delayed_bug(span, "inconsistent resolution for a macro");
859+
}
851860
}
852861
} else if this.tcx.dcx().has_errors().is_none() && this.privacy_errors.is_empty() {
853862
// It's possible that the macro was unresolved (indeterminate) and silently

0 commit comments

Comments
 (0)