Skip to content

Commit 0006519

Browse files
committed
Auto merge of #155267 - jhpratt:rollup-fgQZJCS, r=jhpratt
Rollup of 5 pull requests Successful merges: - #149357 (Implement `-Z allow-partial-mitigations` (RFC 3855)) - #154939 (Refactor: simplify report_selection_error) - #152688 (Trait aliases: Also imply default trait bounds on type params other than `Self`) - #154352 (rustdoc: dep-info for standalone markdown inputs) - #155195 (tidy: handle `#[cfg_attr(bootstrap, doc = "...")]` in `compiler/` comments)
2 parents 338dff3 + 30d2f5a commit 0006519

47 files changed

Lines changed: 1738 additions & 103 deletions

File tree

Some content is hidden

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

compiler/rustc_hir_analysis/src/collect/predicates_of.rs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -979,6 +979,32 @@ impl<'tcx> ItemCtxt<'tcx> {
979979
) -> Vec<(ty::Clause<'tcx>, Span)> {
980980
let mut bounds = Vec::new();
981981

982+
if let PredicateFilter::All = filter {
983+
for param in hir_generics.params {
984+
match param.kind {
985+
hir::GenericParamKind::Type { .. } => {
986+
let param_ty = self.lowerer().lower_ty_param(param.hir_id);
987+
self.lowerer().add_implicit_sizedness_bounds(
988+
&mut bounds,
989+
param_ty,
990+
&[],
991+
ImpliedBoundsContext::TyParam(param.def_id, hir_generics.predicates),
992+
param.span,
993+
);
994+
self.lowerer().add_default_traits(
995+
&mut bounds,
996+
param_ty,
997+
&[],
998+
ImpliedBoundsContext::TyParam(param.def_id, hir_generics.predicates),
999+
param.span,
1000+
);
1001+
}
1002+
hir::GenericParamKind::Lifetime { .. }
1003+
| hir::GenericParamKind::Const { .. } => {}
1004+
}
1005+
}
1006+
}
1007+
9821008
for predicate in hir_generics.predicates {
9831009
let hir_id = predicate.hir_id;
9841010
let hir::WherePredicateKind::BoundPredicate(predicate) = predicate.kind else {

compiler/rustc_interface/src/passes.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -304,8 +304,7 @@ fn configure_and_expand(
304304

305305
resolver.resolve_crate(&krate);
306306

307-
CStore::from_tcx(tcx).report_incompatible_target_modifiers(tcx, &krate);
308-
CStore::from_tcx(tcx).report_incompatible_async_drop_feature(tcx, &krate);
307+
CStore::from_tcx(tcx).report_session_incompatibilities(tcx, &krate);
309308
krate
310309
}
311310

compiler/rustc_metadata/src/creader.rs

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
//! Validates all used crates and extern libraries and loads their metadata
22
3+
use std::collections::BTreeMap;
34
use std::error::Error;
45
use std::path::Path;
56
use std::str::FromStr;
@@ -23,6 +24,7 @@ use rustc_middle::bug;
2324
use rustc_middle::ty::data_structures::IndexSet;
2425
use rustc_middle::ty::{TyCtxt, TyCtxtFeed};
2526
use rustc_proc_macro::bridge::client::ProcMacro;
27+
use rustc_session::config::mitigation_coverage::DeniedPartialMitigationLevel;
2628
use rustc_session::config::{
2729
CrateType, ExtendedTargetModifierInfo, ExternLocation, Externs, OptionsTargetModifiers,
2830
TargetModifier,
@@ -463,6 +465,12 @@ impl CStore {
463465
}
464466
}
465467

468+
pub fn report_session_incompatibilities(&self, tcx: TyCtxt<'_>, krate: &Crate) {
469+
self.report_incompatible_target_modifiers(tcx, krate);
470+
self.report_incompatible_partial_mitigations(tcx, krate);
471+
self.report_incompatible_async_drop_feature(tcx, krate);
472+
}
473+
466474
pub fn report_incompatible_target_modifiers(&self, tcx: TyCtxt<'_>, krate: &Crate) {
467475
for flag_name in &tcx.sess.opts.cg.unsafe_allow_abi_mismatch {
468476
if !OptionsTargetModifiers::is_target_modifier(flag_name) {
@@ -484,6 +492,43 @@ impl CStore {
484492
}
485493
}
486494

495+
pub fn report_incompatible_partial_mitigations(&self, tcx: TyCtxt<'_>, krate: &Crate) {
496+
let my_mitigations = tcx.sess.gather_enabled_denied_partial_mitigations();
497+
let mut my_mitigations: BTreeMap<_, _> =
498+
my_mitigations.iter().map(|mitigation| (mitigation.kind, mitigation)).collect();
499+
for skipped_mitigation in tcx.sess.opts.allowed_partial_mitigations(tcx.sess.edition()) {
500+
my_mitigations.remove(&skipped_mitigation);
501+
}
502+
const MAX_ERRORS_PER_MITIGATION: usize = 5;
503+
let mut errors_per_mitigation = BTreeMap::new();
504+
for (_cnum, data) in self.iter_crate_data() {
505+
if data.is_proc_macro_crate() {
506+
continue;
507+
}
508+
let their_mitigations = data.enabled_denied_partial_mitigations();
509+
for my_mitigation in my_mitigations.values() {
510+
let their_mitigation = their_mitigations
511+
.iter()
512+
.find(|mitigation| mitigation.kind == my_mitigation.kind)
513+
.map_or(DeniedPartialMitigationLevel::Enabled(false), |m| m.level);
514+
if their_mitigation < my_mitigation.level {
515+
let errors = errors_per_mitigation.entry(my_mitigation.kind).or_insert(0);
516+
if *errors >= MAX_ERRORS_PER_MITIGATION {
517+
continue;
518+
}
519+
*errors += 1;
520+
521+
tcx.dcx().emit_err(errors::MitigationLessStrictInDependency {
522+
span: krate.spans.inner_span.shrink_to_lo(),
523+
mitigation_name: my_mitigation.kind.to_string(),
524+
mitigation_level: my_mitigation.level.level_str().to_string(),
525+
extern_crate: data.name(),
526+
});
527+
}
528+
}
529+
}
530+
}
531+
487532
// Report about async drop types in dependency if async drop feature is disabled
488533
pub fn report_incompatible_async_drop_feature(&self, tcx: TyCtxt<'_>, krate: &Crate) {
489534
if tcx.features().async_drop() {

compiler/rustc_metadata/src/errors.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -696,3 +696,21 @@ pub(crate) struct UnusedCrateDependency {
696696
pub extern_crate: Symbol,
697697
pub local_crate: Symbol,
698698
}
699+
700+
#[derive(Diagnostic)]
701+
#[diag(
702+
"your program uses the crate `{$extern_crate}`, that is not compiled with `{$mitigation_name}{$mitigation_level}` enabled"
703+
)]
704+
#[note(
705+
"recompile `{$extern_crate}` with `{$mitigation_name}{$mitigation_level}` enabled, or use `-Z allow-partial-mitigations={$mitigation_name}` to allow creating an artifact that has the mitigation partially enabled "
706+
)]
707+
#[help(
708+
"it is possible to disable `-Z allow-partial-mitigations={$mitigation_name}` via `-Z deny-partial-mitigations={$mitigation_name}`"
709+
)]
710+
pub struct MitigationLessStrictInDependency {
711+
#[primary_span]
712+
pub span: Span,
713+
pub mitigation_name: String,
714+
pub mitigation_level: String,
715+
pub extern_crate: Symbol,
716+
}

compiler/rustc_metadata/src/rmeta/decoder.rs

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ use rustc_proc_macro::bridge::client::ProcMacro;
3030
use rustc_serialize::opaque::MemDecoder;
3131
use rustc_serialize::{Decodable, Decoder};
3232
use rustc_session::config::TargetModifier;
33+
use rustc_session::config::mitigation_coverage::DeniedPartialMitigation;
3334
use rustc_session::cstore::{CrateSource, ExternCrate};
3435
use rustc_span::hygiene::HygieneDecodeContext;
3536
use rustc_span::{
@@ -78,9 +79,15 @@ impl MetadataBlob {
7879
/// own crate numbers.
7980
pub(crate) type CrateNumMap = IndexVec<CrateNum, CrateNum>;
8081

81-
/// Target modifiers - abi or exploit mitigations flags
82+
/// Target modifiers - abi or exploit mitigations options that may cause unsoundness when mixed or
83+
/// partially enabled.
8284
pub(crate) type TargetModifiers = Vec<TargetModifier>;
8385

86+
/// The set of mitigations that cannot be partially enabled (see
87+
/// [RFC 3855](https://github.com/rust-lang/rfcs/pull/3855)), but are currently enabled for this
88+
/// crate.
89+
pub(crate) type DeniedPartialMitigations = Vec<DeniedPartialMitigation>;
90+
8491
pub(crate) struct CrateMetadata {
8592
/// The primary crate data - binary metadata blob.
8693
blob: MetadataBlob,
@@ -959,6 +966,13 @@ impl CrateRoot {
959966
) -> impl ExactSizeIterator<Item = TargetModifier> {
960967
self.target_modifiers.decode(metadata)
961968
}
969+
970+
pub(crate) fn decode_denied_partial_mitigations<'a>(
971+
&self,
972+
metadata: &'a MetadataBlob,
973+
) -> impl ExactSizeIterator<Item = DeniedPartialMitigation> {
974+
self.denied_partial_mitigations.decode(metadata)
975+
}
962976
}
963977

964978
impl<'a> CrateMetadataRef<'a> {
@@ -1941,6 +1955,10 @@ impl CrateMetadata {
19411955
self.root.decode_target_modifiers(&self.blob).collect()
19421956
}
19431957

1958+
pub(crate) fn enabled_denied_partial_mitigations(&self) -> DeniedPartialMitigations {
1959+
self.root.decode_denied_partial_mitigations(&self.blob).collect()
1960+
}
1961+
19441962
/// Keep `new_extern_crate` if it looks better in diagnostics
19451963
pub(crate) fn update_extern_crate_diagnostics(
19461964
&mut self,

compiler/rustc_metadata/src/rmeta/encoder.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ use rustc_middle::ty::codec::TyEncoder;
2727
use rustc_middle::ty::fast_reject::{self, TreatParams};
2828
use rustc_middle::{bug, span_bug};
2929
use rustc_serialize::{Decodable, Decoder, Encodable, Encoder, opaque};
30+
use rustc_session::config::mitigation_coverage::DeniedPartialMitigation;
3031
use rustc_session::config::{CrateType, OptLevel, TargetModifier};
3132
use rustc_span::hygiene::HygieneEncodeContext;
3233
use rustc_span::{
@@ -715,6 +716,8 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
715716
// `SourceFiles` we actually need to encode.
716717
let source_map = stat!("source-map", || self.encode_source_map());
717718
let target_modifiers = stat!("target-modifiers", || self.encode_target_modifiers());
719+
let denied_partial_mitigations = stat!("denied-partial-mitigations", || self
720+
.encode_enabled_denied_partial_mitigations());
718721

719722
let root = stat!("final", || {
720723
let attrs = tcx.hir_krate_attrs();
@@ -758,6 +761,7 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
758761
foreign_modules,
759762
source_map,
760763
target_modifiers,
764+
denied_partial_mitigations,
761765
traits,
762766
impls,
763767
incoherent_impls,
@@ -2107,6 +2111,12 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
21072111
self.lazy_array(tcx.sess.opts.gather_target_modifiers())
21082112
}
21092113

2114+
fn encode_enabled_denied_partial_mitigations(&mut self) -> LazyArray<DeniedPartialMitigation> {
2115+
empty_proc_macro!(self);
2116+
let tcx = self.tcx;
2117+
self.lazy_array(tcx.sess.gather_enabled_denied_partial_mitigations())
2118+
}
2119+
21102120
fn encode_lib_features(&mut self) -> LazyArray<(Symbol, FeatureStability)> {
21112121
empty_proc_macro!(self);
21122122
let tcx = self.tcx;

compiler/rustc_metadata/src/rmeta/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ use rustc_middle::ty::fast_reject::SimplifiedType;
3636
use rustc_middle::ty::{self, Ty, TyCtxt};
3737
use rustc_middle::util::Providers;
3838
use rustc_serialize::opaque::FileEncoder;
39+
use rustc_session::config::mitigation_coverage::DeniedPartialMitigation;
3940
use rustc_session::config::{SymbolManglingVersion, TargetModifier};
4041
use rustc_session::cstore::{CrateDepKind, ForeignModule, LinkagePreference, NativeLib};
4142
use rustc_span::edition::Edition;
@@ -286,6 +287,7 @@ pub(crate) struct CrateRoot {
286287

287288
source_map: LazyTable<u32, Option<LazyValue<rustc_span::SourceFile>>>,
288289
target_modifiers: LazyArray<TargetModifier>,
290+
denied_partial_mitigations: LazyArray<DeniedPartialMitigation>,
289291

290292
compiler_builtins: bool,
291293
needs_allocator: bool,

compiler/rustc_metadata/src/rmeta/parameterized.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ trivially_parameterized_over_tcx! {
120120
rustc_middle::ty::adjustment::CoerceUnsizedInfo,
121121
rustc_middle::ty::fast_reject::SimplifiedType,
122122
rustc_session::config::TargetModifier,
123+
rustc_session::config::mitigation_coverage::DeniedPartialMitigation,
123124
rustc_session::cstore::ForeignModule,
124125
rustc_session::cstore::LinkagePreference,
125126
rustc_session::cstore::NativeLib,

compiler/rustc_session/src/config.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1449,6 +1449,7 @@ impl Default for Options {
14491449
logical_env: FxIndexMap::default(),
14501450
verbose: false,
14511451
target_modifiers: BTreeMap::default(),
1452+
mitigation_coverage_map: Default::default(),
14521453
}
14531454
}
14541455
}
@@ -2469,9 +2470,9 @@ pub fn build_session_options(early_dcx: &mut EarlyDiagCtxt, matches: &getopts::M
24692470
let crate_types = parse_crate_types_from_list(unparsed_crate_types)
24702471
.unwrap_or_else(|e| early_dcx.early_fatal(e));
24712472

2472-
let mut target_modifiers = BTreeMap::<OptionsTargetModifiers, String>::new();
2473+
let mut collected_options = Default::default();
24732474

2474-
let mut unstable_opts = UnstableOptions::build(early_dcx, matches, &mut target_modifiers);
2475+
let mut unstable_opts = UnstableOptions::build(early_dcx, matches, &mut collected_options);
24752476
let (lint_opts, describe_lints, lint_cap) = get_cmd_lint_options(early_dcx, matches);
24762477

24772478
if !unstable_opts.unstable_options && json_timings {
@@ -2487,7 +2488,7 @@ pub fn build_session_options(early_dcx: &mut EarlyDiagCtxt, matches: &getopts::M
24872488

24882489
let output_types = parse_output_types(early_dcx, &unstable_opts, matches);
24892490

2490-
let mut cg = CodegenOptions::build(early_dcx, matches, &mut target_modifiers);
2491+
let mut cg = CodegenOptions::build(early_dcx, matches, &mut collected_options);
24912492
let (disable_local_thinlto, codegen_units) = should_override_cgus_and_disable_thinlto(
24922493
early_dcx,
24932494
&output_types,
@@ -2638,7 +2639,7 @@ pub fn build_session_options(early_dcx: &mut EarlyDiagCtxt, matches: &getopts::M
26382639
// -Zretpoline-external-thunk also requires -Zretpoline
26392640
if unstable_opts.retpoline_external_thunk {
26402641
unstable_opts.retpoline = true;
2641-
target_modifiers.insert(
2642+
collected_options.target_modifiers.insert(
26422643
OptionsTargetModifiers::UnstableOptions(UnstableOptionsTargetModifiers::retpoline),
26432644
"true".to_string(),
26442645
);
@@ -2798,7 +2799,8 @@ pub fn build_session_options(early_dcx: &mut EarlyDiagCtxt, matches: &getopts::M
27982799
color,
27992800
logical_env,
28002801
verbose,
2801-
target_modifiers,
2802+
target_modifiers: collected_options.target_modifiers,
2803+
mitigation_coverage_map: collected_options.mitigations,
28022804
}
28032805
}
28042806

0 commit comments

Comments
 (0)