Auto merge of #137914 - matthiaskrgr:rollup-phaxe6f, r=matthiaskrgr
Rollup of 6 pull requests Successful merges: - #137103 ({json|html}docck: catch and error on deprecated syntax) - #137632 (rustdoc: when merging target features, keep the highest stability) - #137684 (Add rustdoc support for `--emit=dep-info[=path]`) - #137794 (make qnx pass a test) - #137801 (tests: Unignore target modifier tests on all platforms) - #137826 (test(codegen): add looping_over_ne_bytes test for #133528) r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
e16a049adb
26 changed files with 267 additions and 152 deletions
|
@ -10,7 +10,7 @@ use rustc_middle::query::Providers;
|
|||
use rustc_middle::ty::TyCtxt;
|
||||
use rustc_session::parse::feature_err;
|
||||
use rustc_span::{Span, Symbol, sym};
|
||||
use rustc_target::target_features;
|
||||
use rustc_target::target_features::{self, Stability};
|
||||
|
||||
use crate::errors;
|
||||
|
||||
|
@ -87,12 +87,17 @@ pub(crate) fn from_target_feature_attr(
|
|||
// But ensure the ABI does not forbid enabling this.
|
||||
// Here we do assume that LLVM doesn't add even more implied features
|
||||
// we don't know about, at least no features that would have ABI effects!
|
||||
if abi_feature_constraints.incompatible.contains(&name.as_str()) {
|
||||
tcx.dcx().emit_err(errors::ForbiddenTargetFeatureAttr {
|
||||
span: item.span(),
|
||||
feature: name.as_str(),
|
||||
reason: "this feature is incompatible with the target ABI",
|
||||
});
|
||||
// We skip this logic in rustdoc, where we want to allow all target features of
|
||||
// all targets, so we can't check their ABI compatibility and anyway we are not
|
||||
// generating code so "it's fine".
|
||||
if !tcx.sess.opts.actually_rustdoc {
|
||||
if abi_feature_constraints.incompatible.contains(&name.as_str()) {
|
||||
tcx.dcx().emit_err(errors::ForbiddenTargetFeatureAttr {
|
||||
span: item.span(),
|
||||
feature: name.as_str(),
|
||||
reason: "this feature is incompatible with the target ABI",
|
||||
});
|
||||
}
|
||||
}
|
||||
target_features.push(TargetFeature { name, implied: name != feature_sym })
|
||||
}
|
||||
|
@ -142,11 +147,38 @@ pub(crate) fn provide(providers: &mut Providers) {
|
|||
rust_target_features: |tcx, cnum| {
|
||||
assert_eq!(cnum, LOCAL_CRATE);
|
||||
if tcx.sess.opts.actually_rustdoc {
|
||||
// rustdoc needs to be able to document functions that use all the features, so
|
||||
// whitelist them all
|
||||
rustc_target::target_features::all_rust_features()
|
||||
.map(|(a, b)| (a.to_string(), b))
|
||||
.collect()
|
||||
// HACK: rustdoc would like to pretend that we have all the target features, so we
|
||||
// have to merge all the lists into one. To ensure an unstable target never prevents
|
||||
// a stable one from working, we merge the stability info of all instances of the
|
||||
// same target feature name, with the "most stable" taking precedence. And then we
|
||||
// hope that this doesn't cause issues anywhere else in the compiler...
|
||||
let mut result: UnordMap<String, Stability> = Default::default();
|
||||
for (name, stability) in rustc_target::target_features::all_rust_features() {
|
||||
use std::collections::hash_map::Entry;
|
||||
match result.entry(name.to_owned()) {
|
||||
Entry::Vacant(vacant_entry) => {
|
||||
vacant_entry.insert(stability);
|
||||
}
|
||||
Entry::Occupied(mut occupied_entry) => {
|
||||
// Merge the two stabilities, "more stable" taking precedence.
|
||||
match (occupied_entry.get(), stability) {
|
||||
(Stability::Stable, _)
|
||||
| (
|
||||
Stability::Unstable { .. },
|
||||
Stability::Unstable { .. } | Stability::Forbidden { .. },
|
||||
)
|
||||
| (Stability::Forbidden { .. }, Stability::Forbidden { .. }) => {
|
||||
// The stability in the entry is at least as good as the new one, just keep it.
|
||||
}
|
||||
_ => {
|
||||
// Overwrite stabilite.
|
||||
occupied_entry.insert(stability);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
result
|
||||
} else {
|
||||
tcx.sess
|
||||
.target
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue