Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
e5ec5e2
rustdoc: dep-info for standalone markdown inputs
notriddle Mar 25, 2026
a15a3d1
rustdoc: loaded files in dep-info for standalone
notriddle Mar 25, 2026
bfaf027
rustdoc: include index-page in dep-info
notriddle Mar 30, 2026
de2408a
Implement `-Z allow-partial-mitigations` (RFC 3855)
Nov 24, 2025
daedc77
address review comments
Nov 26, 2025
51b2b93
allow denying mitigations in earlier editions
Nov 27, 2025
eb89ca9
enforced => enforcable mitigation
Dec 7, 2025
3600f4c
EnforcableMitigation => DeniedPartialMitigation
Dec 10, 2025
cc2d560
use -Z deny-partial-mitigations instead of -Z allow-partial-mitigatio…
Dec 10, 2025
c55bfc6
enforcable -> enforceable
Dec 10, 2025
b4bfd7f
address review comments
Dec 16, 2025
a0ff19d
reset mitigation status on a mitigation option as per the RFC
Feb 19, 2026
1b96797
address review comments
Apr 6, 2026
8864a66
try to fix msvc
Apr 11, 2026
67be8c2
tidy: handle `#[cfg_attr(bootstrap, doc = "...")]` in `compiler/` com…
jieyouxu Apr 12, 2026
9d627dd
Trait aliases: Imply default trait bounds on type params other than `…
fmease Feb 16, 2026
270cc62
refactor: simplify fn pointer cast suggestion logic
chenyukang Apr 7, 2026
7d1b042
Rollup merge of #149357 - arielb1:enforce-partial-mitigations, r=rcvalle
jhpratt Apr 14, 2026
2a0b534
Rollup merge of #154939 - chenyukang:yukang-refactor-fn-pointer-cast-…
jhpratt Apr 14, 2026
7e40efc
Rollup merge of #152688 - fmease:implied-preds-default-bounds, r=jack…
jhpratt Apr 14, 2026
4691e61
Rollup merge of #154352 - notriddle:emit-md, r=fmease
jhpratt Apr 14, 2026
30d2f5a
Rollup merge of #155195 - jieyouxu:tidy-compiler-doc-attr, r=WaffleLa…
jhpratt Apr 14, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 26 additions & 0 deletions compiler/rustc_hir_analysis/src/collect/predicates_of.rs
Original file line number Diff line number Diff line change
Expand Up @@ -979,6 +979,32 @@ impl<'tcx> ItemCtxt<'tcx> {
) -> Vec<(ty::Clause<'tcx>, Span)> {
let mut bounds = Vec::new();

if let PredicateFilter::All = filter {
for param in hir_generics.params {
match param.kind {
hir::GenericParamKind::Type { .. } => {
let param_ty = self.lowerer().lower_ty_param(param.hir_id);
self.lowerer().add_implicit_sizedness_bounds(
&mut bounds,
param_ty,
&[],
ImpliedBoundsContext::TyParam(param.def_id, hir_generics.predicates),
param.span,
);
self.lowerer().add_default_traits(
&mut bounds,
param_ty,
&[],
ImpliedBoundsContext::TyParam(param.def_id, hir_generics.predicates),
param.span,
);
}
hir::GenericParamKind::Lifetime { .. }
| hir::GenericParamKind::Const { .. } => {}
}
}
}

for predicate in hir_generics.predicates {
let hir_id = predicate.hir_id;
let hir::WherePredicateKind::BoundPredicate(predicate) = predicate.kind else {
Expand Down
3 changes: 1 addition & 2 deletions compiler/rustc_interface/src/passes.rs
Original file line number Diff line number Diff line change
Expand Up @@ -304,8 +304,7 @@ fn configure_and_expand(

resolver.resolve_crate(&krate);

CStore::from_tcx(tcx).report_incompatible_target_modifiers(tcx, &krate);
CStore::from_tcx(tcx).report_incompatible_async_drop_feature(tcx, &krate);
CStore::from_tcx(tcx).report_session_incompatibilities(tcx, &krate);
krate
}

Expand Down
45 changes: 45 additions & 0 deletions compiler/rustc_metadata/src/creader.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
//! Validates all used crates and extern libraries and loads their metadata

use std::collections::BTreeMap;
use std::error::Error;
use std::path::Path;
use std::str::FromStr;
Expand All @@ -23,6 +24,7 @@ use rustc_middle::bug;
use rustc_middle::ty::data_structures::IndexSet;
use rustc_middle::ty::{TyCtxt, TyCtxtFeed};
use rustc_proc_macro::bridge::client::ProcMacro;
use rustc_session::config::mitigation_coverage::DeniedPartialMitigationLevel;
use rustc_session::config::{
CrateType, ExtendedTargetModifierInfo, ExternLocation, Externs, OptionsTargetModifiers,
TargetModifier,
Expand Down Expand Up @@ -463,6 +465,12 @@ impl CStore {
}
}

pub fn report_session_incompatibilities(&self, tcx: TyCtxt<'_>, krate: &Crate) {
self.report_incompatible_target_modifiers(tcx, krate);
self.report_incompatible_partial_mitigations(tcx, krate);
self.report_incompatible_async_drop_feature(tcx, krate);
}

pub fn report_incompatible_target_modifiers(&self, tcx: TyCtxt<'_>, krate: &Crate) {
for flag_name in &tcx.sess.opts.cg.unsafe_allow_abi_mismatch {
if !OptionsTargetModifiers::is_target_modifier(flag_name) {
Expand All @@ -484,6 +492,43 @@ impl CStore {
}
}

pub fn report_incompatible_partial_mitigations(&self, tcx: TyCtxt<'_>, krate: &Crate) {
let my_mitigations = tcx.sess.gather_enabled_denied_partial_mitigations();
let mut my_mitigations: BTreeMap<_, _> =
my_mitigations.iter().map(|mitigation| (mitigation.kind, mitigation)).collect();
for skipped_mitigation in tcx.sess.opts.allowed_partial_mitigations(tcx.sess.edition()) {
my_mitigations.remove(&skipped_mitigation);
}
const MAX_ERRORS_PER_MITIGATION: usize = 5;
let mut errors_per_mitigation = BTreeMap::new();
for (_cnum, data) in self.iter_crate_data() {
if data.is_proc_macro_crate() {
continue;
}
let their_mitigations = data.enabled_denied_partial_mitigations();
for my_mitigation in my_mitigations.values() {
let their_mitigation = their_mitigations
.iter()
.find(|mitigation| mitigation.kind == my_mitigation.kind)
.map_or(DeniedPartialMitigationLevel::Enabled(false), |m| m.level);
if their_mitigation < my_mitigation.level {
let errors = errors_per_mitigation.entry(my_mitigation.kind).or_insert(0);
if *errors >= MAX_ERRORS_PER_MITIGATION {
continue;
}
*errors += 1;

tcx.dcx().emit_err(errors::MitigationLessStrictInDependency {
span: krate.spans.inner_span.shrink_to_lo(),
mitigation_name: my_mitigation.kind.to_string(),
mitigation_level: my_mitigation.level.level_str().to_string(),
extern_crate: data.name(),
});
}
}
}
}

// Report about async drop types in dependency if async drop feature is disabled
pub fn report_incompatible_async_drop_feature(&self, tcx: TyCtxt<'_>, krate: &Crate) {
if tcx.features().async_drop() {
Expand Down
18 changes: 18 additions & 0 deletions compiler/rustc_metadata/src/errors.rs
Original file line number Diff line number Diff line change
Expand Up @@ -696,3 +696,21 @@ pub(crate) struct UnusedCrateDependency {
pub extern_crate: Symbol,
pub local_crate: Symbol,
}

#[derive(Diagnostic)]
#[diag(
"your program uses the crate `{$extern_crate}`, that is not compiled with `{$mitigation_name}{$mitigation_level}` enabled"
)]
#[note(
"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 "
)]
#[help(
"it is possible to disable `-Z allow-partial-mitigations={$mitigation_name}` via `-Z deny-partial-mitigations={$mitigation_name}`"
)]
pub struct MitigationLessStrictInDependency {
#[primary_span]
pub span: Span,
pub mitigation_name: String,
pub mitigation_level: String,
pub extern_crate: Symbol,
}
20 changes: 19 additions & 1 deletion compiler/rustc_metadata/src/rmeta/decoder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ use rustc_proc_macro::bridge::client::ProcMacro;
use rustc_serialize::opaque::MemDecoder;
use rustc_serialize::{Decodable, Decoder};
use rustc_session::config::TargetModifier;
use rustc_session::config::mitigation_coverage::DeniedPartialMitigation;
use rustc_session::cstore::{CrateSource, ExternCrate};
use rustc_span::hygiene::HygieneDecodeContext;
use rustc_span::{
Expand Down Expand Up @@ -78,9 +79,15 @@ impl MetadataBlob {
/// own crate numbers.
pub(crate) type CrateNumMap = IndexVec<CrateNum, CrateNum>;

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

/// The set of mitigations that cannot be partially enabled (see
/// [RFC 3855](https://github.com/rust-lang/rfcs/pull/3855)), but are currently enabled for this
/// crate.
pub(crate) type DeniedPartialMitigations = Vec<DeniedPartialMitigation>;

pub(crate) struct CrateMetadata {
/// The primary crate data - binary metadata blob.
blob: MetadataBlob,
Expand Down Expand Up @@ -959,6 +966,13 @@ impl CrateRoot {
) -> impl ExactSizeIterator<Item = TargetModifier> {
self.target_modifiers.decode(metadata)
}

pub(crate) fn decode_denied_partial_mitigations<'a>(
&self,
metadata: &'a MetadataBlob,
) -> impl ExactSizeIterator<Item = DeniedPartialMitigation> {
self.denied_partial_mitigations.decode(metadata)
}
}

impl<'a> CrateMetadataRef<'a> {
Expand Down Expand Up @@ -1941,6 +1955,10 @@ impl CrateMetadata {
self.root.decode_target_modifiers(&self.blob).collect()
}

pub(crate) fn enabled_denied_partial_mitigations(&self) -> DeniedPartialMitigations {
self.root.decode_denied_partial_mitigations(&self.blob).collect()
}

/// Keep `new_extern_crate` if it looks better in diagnostics
pub(crate) fn update_extern_crate_diagnostics(
&mut self,
Expand Down
10 changes: 10 additions & 0 deletions compiler/rustc_metadata/src/rmeta/encoder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ use rustc_middle::ty::codec::TyEncoder;
use rustc_middle::ty::fast_reject::{self, TreatParams};
use rustc_middle::{bug, span_bug};
use rustc_serialize::{Decodable, Decoder, Encodable, Encoder, opaque};
use rustc_session::config::mitigation_coverage::DeniedPartialMitigation;
use rustc_session::config::{CrateType, OptLevel, TargetModifier};
use rustc_span::hygiene::HygieneEncodeContext;
use rustc_span::{
Expand Down Expand Up @@ -715,6 +716,8 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
// `SourceFiles` we actually need to encode.
let source_map = stat!("source-map", || self.encode_source_map());
let target_modifiers = stat!("target-modifiers", || self.encode_target_modifiers());
let denied_partial_mitigations = stat!("denied-partial-mitigations", || self
.encode_enabled_denied_partial_mitigations());

let root = stat!("final", || {
let attrs = tcx.hir_krate_attrs();
Expand Down Expand Up @@ -758,6 +761,7 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
foreign_modules,
source_map,
target_modifiers,
denied_partial_mitigations,
traits,
impls,
incoherent_impls,
Expand Down Expand Up @@ -2107,6 +2111,12 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
self.lazy_array(tcx.sess.opts.gather_target_modifiers())
}

fn encode_enabled_denied_partial_mitigations(&mut self) -> LazyArray<DeniedPartialMitigation> {
empty_proc_macro!(self);
let tcx = self.tcx;
self.lazy_array(tcx.sess.gather_enabled_denied_partial_mitigations())
}

fn encode_lib_features(&mut self) -> LazyArray<(Symbol, FeatureStability)> {
empty_proc_macro!(self);
let tcx = self.tcx;
Expand Down
2 changes: 2 additions & 0 deletions compiler/rustc_metadata/src/rmeta/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ use rustc_middle::ty::fast_reject::SimplifiedType;
use rustc_middle::ty::{self, Ty, TyCtxt};
use rustc_middle::util::Providers;
use rustc_serialize::opaque::FileEncoder;
use rustc_session::config::mitigation_coverage::DeniedPartialMitigation;
use rustc_session::config::{SymbolManglingVersion, TargetModifier};
use rustc_session::cstore::{CrateDepKind, ForeignModule, LinkagePreference, NativeLib};
use rustc_span::edition::Edition;
Expand Down Expand Up @@ -286,6 +287,7 @@ pub(crate) struct CrateRoot {

source_map: LazyTable<u32, Option<LazyValue<rustc_span::SourceFile>>>,
target_modifiers: LazyArray<TargetModifier>,
denied_partial_mitigations: LazyArray<DeniedPartialMitigation>,

compiler_builtins: bool,
needs_allocator: bool,
Expand Down
1 change: 1 addition & 0 deletions compiler/rustc_metadata/src/rmeta/parameterized.rs
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,7 @@ trivially_parameterized_over_tcx! {
rustc_middle::ty::adjustment::CoerceUnsizedInfo,
rustc_middle::ty::fast_reject::SimplifiedType,
rustc_session::config::TargetModifier,
rustc_session::config::mitigation_coverage::DeniedPartialMitigation,
rustc_session::cstore::ForeignModule,
rustc_session::cstore::LinkagePreference,
rustc_session::cstore::NativeLib,
Expand Down
12 changes: 7 additions & 5 deletions compiler/rustc_session/src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1449,6 +1449,7 @@ impl Default for Options {
logical_env: FxIndexMap::default(),
verbose: false,
target_modifiers: BTreeMap::default(),
mitigation_coverage_map: Default::default(),
}
}
}
Expand Down Expand Up @@ -2469,9 +2470,9 @@ pub fn build_session_options(early_dcx: &mut EarlyDiagCtxt, matches: &getopts::M
let crate_types = parse_crate_types_from_list(unparsed_crate_types)
.unwrap_or_else(|e| early_dcx.early_fatal(e));

let mut target_modifiers = BTreeMap::<OptionsTargetModifiers, String>::new();
let mut collected_options = Default::default();

let mut unstable_opts = UnstableOptions::build(early_dcx, matches, &mut target_modifiers);
let mut unstable_opts = UnstableOptions::build(early_dcx, matches, &mut collected_options);
let (lint_opts, describe_lints, lint_cap) = get_cmd_lint_options(early_dcx, matches);

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

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

let mut cg = CodegenOptions::build(early_dcx, matches, &mut target_modifiers);
let mut cg = CodegenOptions::build(early_dcx, matches, &mut collected_options);
let (disable_local_thinlto, codegen_units) = should_override_cgus_and_disable_thinlto(
early_dcx,
&output_types,
Expand Down Expand Up @@ -2638,7 +2639,7 @@ pub fn build_session_options(early_dcx: &mut EarlyDiagCtxt, matches: &getopts::M
// -Zretpoline-external-thunk also requires -Zretpoline
if unstable_opts.retpoline_external_thunk {
unstable_opts.retpoline = true;
target_modifiers.insert(
collected_options.target_modifiers.insert(
OptionsTargetModifiers::UnstableOptions(UnstableOptionsTargetModifiers::retpoline),
"true".to_string(),
);
Expand Down Expand Up @@ -2798,7 +2799,8 @@ pub fn build_session_options(early_dcx: &mut EarlyDiagCtxt, matches: &getopts::M
color,
logical_env,
verbose,
target_modifiers,
target_modifiers: collected_options.target_modifiers,
mitigation_coverage_map: collected_options.mitigations,
}
}

Expand Down
Loading
Loading