From 3d035505a3e24830e6da84d31d7f63b02b6d5ae0 Mon Sep 17 00:00:00 2001 From: bjorn3 <17426603+bjorn3@users.noreply.github.com> Date: Sun, 2 Nov 2025 12:33:38 +0000 Subject: [PATCH] Better warning message for crate type unsupported by codegen backend --- compiler/rustc_driver_impl/src/lib.rs | 8 ++++++-- compiler/rustc_interface/src/passes.rs | 1 + compiler/rustc_session/messages.ftl | 3 +++ compiler/rustc_session/src/errors.rs | 7 +++++++ compiler/rustc_session/src/output.rs | 14 ++++++++------ 5 files changed, 25 insertions(+), 8 deletions(-) diff --git a/compiler/rustc_driver_impl/src/lib.rs b/compiler/rustc_driver_impl/src/lib.rs index c926a7c742a0a..462ca98c21151 100644 --- a/compiler/rustc_driver_impl/src/lib.rs +++ b/compiler/rustc_driver_impl/src/lib.rs @@ -686,8 +686,12 @@ fn print_crate_info( }; let t_outputs = rustc_interface::util::build_output_filenames(attrs, sess); let crate_name = passes::get_crate_name(sess, attrs); - let crate_types = - collect_crate_types(sess, &codegen_backend.supported_crate_types(sess), attrs); + let crate_types = collect_crate_types( + sess, + &codegen_backend.supported_crate_types(sess), + codegen_backend.name(), + attrs, + ); for &style in &crate_types { let fname = rustc_session::output::filename_for_input( sess, style, crate_name, &t_outputs, diff --git a/compiler/rustc_interface/src/passes.rs b/compiler/rustc_interface/src/passes.rs index 58ed71a970776..e68db4f44ca48 100644 --- a/compiler/rustc_interface/src/passes.rs +++ b/compiler/rustc_interface/src/passes.rs @@ -929,6 +929,7 @@ pub fn create_and_enter_global_ctxt FnOnce(TyCtxt<'tcx>) -> T>( let crate_types = collect_crate_types( sess, &compiler.codegen_backend.supported_crate_types(sess), + compiler.codegen_backend.name(), &pre_configured_attrs, ); let stable_crate_id = StableCrateId::new( diff --git a/compiler/rustc_session/messages.ftl b/compiler/rustc_session/messages.ftl index b46e8ab4fdcbe..a4166951e350a 100644 --- a/compiler/rustc_session/messages.ftl +++ b/compiler/rustc_session/messages.ftl @@ -140,6 +140,9 @@ session_unleashed_feature_help_unnamed = skipping check that does not even have session_unstable_virtual_function_elimination = `-Zvirtual-function-elimination` requires `-Clto` +session_unsupported_crate_type_for_codegen_backend = + dropping unsupported crate type `{$crate_type}` for codegen backend `{$codegen_backend}` + session_unsupported_crate_type_for_target = dropping unsupported crate type `{$crate_type}` for target `{$target_triple}` diff --git a/compiler/rustc_session/src/errors.rs b/compiler/rustc_session/src/errors.rs index 50bc7348dc9ef..07b41a3de714d 100644 --- a/compiler/rustc_session/src/errors.rs +++ b/compiler/rustc_session/src/errors.rs @@ -371,6 +371,13 @@ struct BinaryFloatLiteralNotSupported { span: Span, } +#[derive(Diagnostic)] +#[diag(session_unsupported_crate_type_for_codegen_backend)] +pub(crate) struct UnsupportedCrateTypeForCodegenBackend { + pub(crate) crate_type: CrateType, + pub(crate) codegen_backend: &'static str, +} + #[derive(Diagnostic)] #[diag(session_unsupported_crate_type_for_target)] pub(crate) struct UnsupportedCrateTypeForTarget<'a> { diff --git a/compiler/rustc_session/src/output.rs b/compiler/rustc_session/src/output.rs index a48a4f649da1d..99c736c3b1a5e 100644 --- a/compiler/rustc_session/src/output.rs +++ b/compiler/rustc_session/src/output.rs @@ -177,6 +177,7 @@ pub fn categorize_crate_type(s: Symbol) -> Option { pub fn collect_crate_types( session: &Session, backend_crate_types: &[CrateType], + codegen_backend_name: &'static str, attrs: &[ast::Attribute], ) -> Vec { // If we're generating a test executable, then ignore all other output @@ -223,17 +224,18 @@ pub fn collect_crate_types( } base.retain(|crate_type| { - if invalid_output_for_target(session, *crate_type) - || !backend_crate_types.contains(crate_type) - { - // FIXME provide a better warning for the case where the codegen - // backend doesn't support it once cargo doesn't hard code this - // warning message. + if invalid_output_for_target(session, *crate_type) { session.dcx().emit_warn(errors::UnsupportedCrateTypeForTarget { crate_type: *crate_type, target_triple: &session.opts.target_triple, }); false + } else if !backend_crate_types.contains(crate_type) { + session.dcx().emit_warn(errors::UnsupportedCrateTypeForCodegenBackend { + crate_type: *crate_type, + codegen_backend: codegen_backend_name, + }); + false } else { true }