From be11af4cd5ac8b84cf1fd141e2e1ea1f47b685cf Mon Sep 17 00:00:00 2001 From: Yukang Date: Sun, 19 Jul 2026 01:40:42 +0800 Subject: [PATCH] Suggest valid command-line crate names --- compiler/rustc_session/src/diagnostics.rs | 9 +++++++++ compiler/rustc_session/src/output.rs | 9 ++++++++- .../invalid-crate-name-suggestion-issue-159485.rs | 7 +++++++ .../invalid-crate-name-suggestion-issue-159485.stderr | 7 +++++++ .../invalid/need-crate-arg-ignore-tidy$x.stderr | 3 +++ 5 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 tests/ui/compile-flags/invalid/invalid-crate-name-suggestion-issue-159485.rs create mode 100644 tests/ui/compile-flags/invalid/invalid-crate-name-suggestion-issue-159485.stderr diff --git a/compiler/rustc_session/src/diagnostics.rs b/compiler/rustc_session/src/diagnostics.rs index d1989609cefe2..a06c40f77a73e 100644 --- a/compiler/rustc_session/src/diagnostics.rs +++ b/compiler/rustc_session/src/diagnostics.rs @@ -435,11 +435,20 @@ pub(crate) struct CrateNameEmpty { #[derive(Diagnostic)] #[diag("invalid character {$character} in crate name: `{$crate_name}`")] +#[note("crate names may only contain alphanumeric characters or underscores")] pub(crate) struct InvalidCharacterInCrateName { #[primary_span] pub(crate) span: Option, pub(crate) character: char, pub(crate) crate_name: Symbol, + #[subdiagnostic] + pub(crate) suggestion: Option, +} + +#[derive(Subdiagnostic)] +#[help("you might have meant to use `--crate-name={$suggested_name}`")] +pub(crate) struct InvalidCharacterInCrateNameSuggestion { + pub(crate) suggested_name: String, } #[derive(Subdiagnostic)] diff --git a/compiler/rustc_session/src/output.rs b/compiler/rustc_session/src/output.rs index 120eb04c6e8c4..e2eb46c4ca878 100644 --- a/compiler/rustc_session/src/output.rs +++ b/compiler/rustc_session/src/output.rs @@ -6,7 +6,10 @@ use rustc_span::{Span, Symbol}; use crate::Session; use crate::config::{CrateType, OutFileName, OutputFilenames, OutputType}; -use crate::diagnostics::{CrateNameEmpty, FileIsNotWriteable, InvalidCharacterInCrateName}; +use crate::diagnostics::{ + CrateNameEmpty, FileIsNotWriteable, InvalidCharacterInCrateName, + InvalidCharacterInCrateNameSuggestion, +}; pub fn out_filename( sess: &Session, @@ -68,6 +71,10 @@ pub fn validate_crate_name(sess: &Session, crate_name: Symbol, span: Option