Skip to content

Commit 8c7969a

Browse files
committedMar 16, 2025·
Auto merge of rust-lang#138525 - cuviper:beta-next, r=cuviper
[beta] backports - Windows: Fix error in `fs::rename` on Windows 1607 rust-lang#137528 - rustdoc: when merging target features, keep the highest stability rust-lang#137632 - doctests: fix merging on stable rust-lang#137899 - Revert wf sized check on beta rust-lang#138122 r? cuviper
2 parents b2af9a5 + ea14c4a commit 8c7969a

File tree

73 files changed

+788
-721
lines changed

Some content is hidden

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

73 files changed

+788
-721
lines changed
 

‎compiler/rustc_codegen_ssa/src/target_features.rs

+44-12
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use rustc_middle::query::Providers;
1010
use rustc_middle::ty::TyCtxt;
1111
use rustc_session::parse::feature_err;
1212
use rustc_span::{Span, Symbol, sym};
13-
use rustc_target::target_features;
13+
use rustc_target::target_features::{self, Stability};
1414

1515
use crate::errors;
1616

@@ -87,12 +87,17 @@ pub(crate) fn from_target_feature_attr(
8787
// But ensure the ABI does not forbid enabling this.
8888
// Here we do assume that LLVM doesn't add even more implied features
8989
// we don't know about, at least no features that would have ABI effects!
90-
if abi_feature_constraints.incompatible.contains(&name.as_str()) {
91-
tcx.dcx().emit_err(errors::ForbiddenTargetFeatureAttr {
92-
span: item.span(),
93-
feature: name.as_str(),
94-
reason: "this feature is incompatible with the target ABI",
95-
});
90+
// We skip this logic in rustdoc, where we want to allow all target features of
91+
// all targets, so we can't check their ABI compatibility and anyway we are not
92+
// generating code so "it's fine".
93+
if !tcx.sess.opts.actually_rustdoc {
94+
if abi_feature_constraints.incompatible.contains(&name.as_str()) {
95+
tcx.dcx().emit_err(errors::ForbiddenTargetFeatureAttr {
96+
span: item.span(),
97+
feature: name.as_str(),
98+
reason: "this feature is incompatible with the target ABI",
99+
});
100+
}
96101
}
97102
target_features.push(TargetFeature { name, implied: name != feature_sym })
98103
}
@@ -142,11 +147,38 @@ pub(crate) fn provide(providers: &mut Providers) {
142147
rust_target_features: |tcx, cnum| {
143148
assert_eq!(cnum, LOCAL_CRATE);
144149
if tcx.sess.opts.actually_rustdoc {
145-
// rustdoc needs to be able to document functions that use all the features, so
146-
// whitelist them all
147-
rustc_target::target_features::all_rust_features()
148-
.map(|(a, b)| (a.to_string(), b))
149-
.collect()
150+
// HACK: rustdoc would like to pretend that we have all the target features, so we
151+
// have to merge all the lists into one. To ensure an unstable target never prevents
152+
// a stable one from working, we merge the stability info of all instances of the
153+
// same target feature name, with the "most stable" taking precedence. And then we
154+
// hope that this doesn't cause issues anywhere else in the compiler...
155+
let mut result: UnordMap<String, Stability> = Default::default();
156+
for (name, stability) in rustc_target::target_features::all_rust_features() {
157+
use std::collections::hash_map::Entry;
158+
match result.entry(name.to_owned()) {
159+
Entry::Vacant(vacant_entry) => {
160+
vacant_entry.insert(stability);
161+
}
162+
Entry::Occupied(mut occupied_entry) => {
163+
// Merge the two stabilities, "more stable" taking precedence.
164+
match (occupied_entry.get(), stability) {
165+
(Stability::Stable, _)
166+
| (
167+
Stability::Unstable { .. },
168+
Stability::Unstable { .. } | Stability::Forbidden { .. },
169+
)
170+
| (Stability::Forbidden { .. }, Stability::Forbidden { .. }) => {
171+
// The stability in the entry is at least as good as the new one, just keep it.
172+
}
173+
_ => {
174+
// Overwrite stabilite.
175+
occupied_entry.insert(stability);
176+
}
177+
}
178+
}
179+
}
180+
}
181+
result
150182
} else {
151183
tcx.sess
152184
.target

‎compiler/rustc_hir_analysis/src/check/wfcheck.rs

+2-33
Original file line numberDiff line numberDiff line change
@@ -1110,7 +1110,6 @@ fn check_associated_item(
11101110
let ty = tcx.type_of(item.def_id).instantiate_identity();
11111111
let ty = wfcx.normalize(span, Some(WellFormedLoc::Ty(item_id)), ty);
11121112
wfcx.register_wf_obligation(span, loc, ty.into());
1113-
check_sized_if_body(wfcx, item.def_id.expect_local(), ty, Some(span));
11141113
Ok(())
11151114
}
11161115
ty::AssocKind::Fn => {
@@ -1235,7 +1234,7 @@ fn check_type_defn<'tcx>(
12351234
),
12361235
wfcx.param_env,
12371236
ty,
1238-
tcx.require_lang_item(LangItem::Sized, Some(hir_ty.span)),
1237+
tcx.require_lang_item(LangItem::Sized, None),
12391238
);
12401239
}
12411240

@@ -1360,7 +1359,7 @@ fn check_item_type(
13601359
),
13611360
wfcx.param_env,
13621361
item_ty,
1363-
tcx.require_lang_item(LangItem::Sized, Some(ty_span)),
1362+
tcx.require_lang_item(LangItem::Sized, None),
13641363
);
13651364
}
13661365

@@ -1690,36 +1689,6 @@ fn check_fn_or_method<'tcx>(
16901689
);
16911690
}
16921691
}
1693-
1694-
// If the function has a body, additionally require that the return type is sized.
1695-
check_sized_if_body(
1696-
wfcx,
1697-
def_id,
1698-
sig.output(),
1699-
match hir_decl.output {
1700-
hir::FnRetTy::Return(ty) => Some(ty.span),
1701-
hir::FnRetTy::DefaultReturn(_) => None,
1702-
},
1703-
);
1704-
}
1705-
1706-
fn check_sized_if_body<'tcx>(
1707-
wfcx: &WfCheckingCtxt<'_, 'tcx>,
1708-
def_id: LocalDefId,
1709-
ty: Ty<'tcx>,
1710-
maybe_span: Option<Span>,
1711-
) {
1712-
let tcx = wfcx.tcx();
1713-
if let Some(body) = tcx.hir().maybe_body_owned_by(def_id) {
1714-
let span = maybe_span.unwrap_or(body.value.span);
1715-
1716-
wfcx.register_bound(
1717-
ObligationCause::new(span, def_id, traits::ObligationCauseCode::SizedReturnType),
1718-
wfcx.param_env,
1719-
ty,
1720-
tcx.require_lang_item(LangItem::Sized, Some(span)),
1721-
);
1722-
}
17231692
}
17241693

17251694
/// The `arbitrary_self_types_pointers` feature implies `arbitrary_self_types`.

0 commit comments

Comments
 (0)
Please sign in to comment.