Auto merge of #152412 - JonathanBrouwer:rollup-hShycIY, r=JonathanBrouwer

Rollup of 7 pull requests

Successful merges:

 - rust-lang/rust#151960 (rustc_parse: improve the error diagnostic for "missing let")
 - rust-lang/rust#152157 (Fix error spans for `asm!()` args that are macros)
 - rust-lang/rust#152317 (fix: sup_trace to sub_trace)
 - rust-lang/rust#150897 (rustc_parse_format: improve diagnostics for unsupported debug = syntax)
 - rust-lang/rust#151154 (Add `s390x-unknown-none-softfloat` with `RustcAbi::Softfloat`)
 - rust-lang/rust#152013 (Update to Xcode 26.2)
 - rust-lang/rust#152326 (Remove the compiler adhoc group)
This commit is contained in:
bors 2026-02-10 02:25:24 +00:00
commit f21b4c0888
44 changed files with 600 additions and 91 deletions

View file

@ -288,6 +288,18 @@ fn expand_preparsed_asm(
let msg = "asm template must be a string literal"; let msg = "asm template must be a string literal";
let template_sp = template_expr.span; let template_sp = template_expr.span;
let template_is_mac_call = matches!(template_expr.kind, ast::ExprKind::MacCall(_)); let template_is_mac_call = matches!(template_expr.kind, ast::ExprKind::MacCall(_));
// Gets the span inside `template_sp` corresponding to the given range
let span_in_template = |range: std::ops::Range<usize>| -> Span {
if template_is_mac_call {
// When the template is a macro call we can't reliably get inner spans
// so just use the entire template span (see ICEs #129503, #131292)
template_sp
} else {
template_sp.from_inner(InnerSpan::new(range.start, range.end))
}
};
let ExprToSpannedString { let ExprToSpannedString {
symbol: template_str, symbol: template_str,
style: template_style, style: template_style,
@ -382,13 +394,8 @@ fn expand_preparsed_asm(
if !parser.errors.is_empty() { if !parser.errors.is_empty() {
let err = parser.errors.remove(0); let err = parser.errors.remove(0);
let err_sp = if template_is_mac_call {
// If the template is a macro call we can't reliably point to the error's let err_sp = span_in_template(err.span);
// span so just use the template's span as the error span (fixes #129503)
template_span
} else {
template_span.from_inner(InnerSpan::new(err.span.start, err.span.end))
};
let msg = format!("invalid asm template string: {}", err.description); let msg = format!("invalid asm template string: {}", err.description);
let mut e = ecx.dcx().struct_span_err(err_sp, msg); let mut e = ecx.dcx().struct_span_err(err_sp, msg);
@ -397,8 +404,7 @@ fn expand_preparsed_asm(
e.note(note); e.note(note);
} }
if let Some((label, span)) = err.secondary_label { if let Some((label, span)) = err.secondary_label {
let err_sp = template_span.from_inner(InnerSpan::new(span.start, span.end)); e.span_label(span_in_template(span), label);
e.span_label(err_sp, label);
} }
let guar = e.emit(); let guar = e.emit();
return ExpandResult::Ready(Err(guar)); return ExpandResult::Ready(Err(guar));
@ -477,8 +483,7 @@ fn expand_preparsed_asm(
ecx.dcx() ecx.dcx()
.create_err(errors::AsmNoMatchedArgumentName { .create_err(errors::AsmNoMatchedArgumentName {
name: name.to_owned(), name: name.to_owned(),
span: template_span span: span_in_template(span),
.from_inner(InnerSpan::new(span.start, span.end)),
}) })
.emit(); .emit();
None None
@ -490,11 +495,7 @@ fn expand_preparsed_asm(
let mut chars = arg.format.ty.chars(); let mut chars = arg.format.ty.chars();
let mut modifier = chars.next(); let mut modifier = chars.next();
if chars.next().is_some() { if chars.next().is_some() {
let span = arg let span = arg.format.ty_span.map(span_in_template).unwrap_or(template_sp);
.format
.ty_span
.map(|sp| template_sp.from_inner(InnerSpan::new(sp.start, sp.end)))
.unwrap_or(template_sp);
ecx.dcx().emit_err(errors::AsmModifierInvalid { span }); ecx.dcx().emit_err(errors::AsmModifierInvalid { span });
modifier = None; modifier = None;
} }

View file

@ -678,6 +678,18 @@ pub(crate) enum InvalidFormatStringSuggestion {
#[primary_span] #[primary_span]
span: Span, span: Span,
}, },
#[suggestion(
"use rust debug printing macro",
code = "{replacement}",
style = "verbose",
applicability = "machine-applicable"
)]
UseRustDebugPrintingMacro {
#[primary_span]
macro_span: Span,
replacement: String,
},
} }
#[derive(Diagnostic)] #[derive(Diagnostic)]

View file

@ -160,6 +160,7 @@ fn make_format_args(
ecx: &mut ExtCtxt<'_>, ecx: &mut ExtCtxt<'_>,
input: MacroInput, input: MacroInput,
append_newline: bool, append_newline: bool,
macro_span: Span,
) -> ExpandResult<Result<FormatArgs, ErrorGuaranteed>, ()> { ) -> ExpandResult<Result<FormatArgs, ErrorGuaranteed>, ()> {
let msg = "format argument must be a string literal"; let msg = "format argument must be a string literal";
let unexpanded_fmt_span = input.fmtstr.span; let unexpanded_fmt_span = input.fmtstr.span;
@ -333,6 +334,23 @@ fn make_format_args(
let span = fmt_span.from_inner(InnerSpan::new(span.start, span.end)); let span = fmt_span.from_inner(InnerSpan::new(span.start, span.end));
e.sugg_ = Some(errors::InvalidFormatStringSuggestion::AddMissingColon { span }); e.sugg_ = Some(errors::InvalidFormatStringSuggestion::AddMissingColon { span });
} }
parse::Suggestion::UseRustDebugPrintingMacro => {
// This targets `println!("{=}", x);` and `println!("{0=}", x);`
if let [arg] = args.all_args() {
let expr_span = arg.expr.span;
if let Ok(expr_snippet) = ecx.source_map().span_to_snippet(expr_span) {
let replacement = format!("{}!({})", "dbg", expr_snippet);
let call_span = macro_span.source_callsite();
e.sugg_ = Some(
errors::InvalidFormatStringSuggestion::UseRustDebugPrintingMacro {
macro_span: call_span,
replacement,
},
);
}
}
}
} }
let guar = ecx.dcx().emit_err(e); let guar = ecx.dcx().emit_err(e);
return ExpandResult::Ready(Err(guar)); return ExpandResult::Ready(Err(guar));
@ -1048,7 +1066,7 @@ fn expand_format_args_impl<'cx>(
sp = ecx.with_def_site_ctxt(sp); sp = ecx.with_def_site_ctxt(sp);
ExpandResult::Ready(match parse_args(ecx, sp, tts) { ExpandResult::Ready(match parse_args(ecx, sp, tts) {
Ok(input) => { Ok(input) => {
let ExpandResult::Ready(mac) = make_format_args(ecx, input, nl) else { let ExpandResult::Ready(mac) = make_format_args(ecx, input, nl, sp) else {
return ExpandResult::Retry(()); return ExpandResult::Retry(());
}; };
match mac { match mac {

View file

@ -573,6 +573,24 @@ pub(crate) struct ExpectedExpressionFoundLet {
pub comparison: Option<MaybeComparison>, pub comparison: Option<MaybeComparison>,
} }
#[derive(Diagnostic)]
#[diag("let-chain with missing `let`")]
pub(crate) struct LetChainMissingLet {
#[primary_span]
pub span: Span,
#[label("expected `let` expression, found assignment")]
pub label_span: Span,
#[label("let expression later in the condition")]
pub rhs_span: Span,
#[suggestion(
"add `let` before the expression",
applicability = "maybe-incorrect",
code = "let ",
style = "verbose"
)]
pub sug_span: Span,
}
#[derive(Diagnostic)] #[derive(Diagnostic)]
#[diag("`||` operators are not supported in let chain conditions")] #[diag("`||` operators are not supported in let chain conditions")]
pub(crate) struct OrInLetChain { pub(crate) struct OrInLetChain {

View file

@ -4282,7 +4282,52 @@ impl MutVisitor for CondChecker<'_> {
mut_visit::walk_expr(self, e); mut_visit::walk_expr(self, e);
self.forbid_let_reason = forbid_let_reason; self.forbid_let_reason = forbid_let_reason;
} }
ExprKind::Assign(ref lhs, _, span) => { ExprKind::Assign(ref lhs, ref rhs, span) => {
if let ExprKind::Call(_, _) = &lhs.kind {
fn get_path_from_rhs(e: &Expr) -> Option<(u32, &Path)> {
fn inner(e: &Expr, depth: u32) -> Option<(u32, &Path)> {
match &e.kind {
ExprKind::Binary(_, lhs, _) => inner(lhs, depth + 1),
ExprKind::Path(_, path) => Some((depth, path)),
_ => None,
}
}
inner(e, 0)
}
if let Some((depth, path)) = get_path_from_rhs(rhs) {
// For cases like if Some(_) = x && let Some(_) = y && let Some(_) = z
// This return let Some(_) = y expression
fn find_let_some(expr: &Expr) -> Option<&Expr> {
match &expr.kind {
ExprKind::Let(..) => Some(expr),
ExprKind::Binary(op, lhs, rhs) if op.node == BinOpKind::And => {
find_let_some(lhs).or_else(|| find_let_some(rhs))
}
_ => None,
}
}
let expr_span = lhs.span.to(path.span);
if let Some(later_rhs) = find_let_some(rhs)
&& depth > 0
{
let guar = self.parser.dcx().emit_err(errors::LetChainMissingLet {
span: lhs.span,
label_span: expr_span,
rhs_span: later_rhs.span,
sug_span: lhs.span.shrink_to_lo(),
});
self.found_incorrect_let_chain = Some(guar);
}
}
}
let forbid_let_reason = self.forbid_let_reason; let forbid_let_reason = self.forbid_let_reason;
self.forbid_let_reason = Some(errors::ForbiddenLetReason::OtherForbidden); self.forbid_let_reason = Some(errors::ForbiddenLetReason::OtherForbidden);
let missing_let = self.missing_let; let missing_let = self.missing_let;

View file

@ -187,6 +187,9 @@ pub enum Suggestion {
/// Add missing colon: /// Add missing colon:
/// `format!("{foo?}")` -> `format!("{foo:?}")` /// `format!("{foo?}")` -> `format!("{foo:?}")`
AddMissingColon(Range<usize>), AddMissingColon(Range<usize>),
/// Use Rust format string:
/// `format!("{x=}")` -> `dbg!(x)`
UseRustDebugPrintingMacro,
} }
/// The parser structure for interpreting the input format string. This is /// The parser structure for interpreting the input format string. This is
@ -462,6 +465,7 @@ impl<'input> Parser<'input> {
('?', _) => self.suggest_format_debug(), ('?', _) => self.suggest_format_debug(),
('<' | '^' | '>', _) => self.suggest_format_align(c), ('<' | '^' | '>', _) => self.suggest_format_align(c),
(',', _) => self.suggest_unsupported_python_numeric_grouping(), (',', _) => self.suggest_unsupported_python_numeric_grouping(),
('=', '}') => self.suggest_rust_debug_printing_macro(),
_ => self.suggest_positional_arg_instead_of_captured_arg(arg), _ => self.suggest_positional_arg_instead_of_captured_arg(arg),
} }
} }
@ -871,6 +875,27 @@ impl<'input> Parser<'input> {
} }
} }
fn suggest_rust_debug_printing_macro(&mut self) {
if let Some((range, _)) = self.consume_pos('=') {
self.errors.insert(
0,
ParseError {
description:
"python's f-string debug `=` is not supported in rust, use `dbg(x)` instead"
.to_owned(),
note: Some(format!("to print `{{`, you can escape it using `{{{{`",)),
label: "expected `}`".to_owned(),
span: range,
secondary_label: self
.last_open_brace
.clone()
.map(|sp| ("because of this opening brace".to_owned(), sp)),
suggestion: Suggestion::UseRustDebugPrintingMacro,
},
);
}
}
fn suggest_format_align(&mut self, alignment: char) { fn suggest_format_align(&mut self, alignment: char) {
if let Some((range, _)) = self.consume_pos(alignment) { if let Some((range, _)) = self.consume_pos(alignment) {
self.errors.insert( self.errors.insert(

View file

@ -28,7 +28,7 @@ where
BackendRepr::ScalableVector { .. } => panic!("scalable vectors are unsupported"), BackendRepr::ScalableVector { .. } => panic!("scalable vectors are unsupported"),
BackendRepr::Scalar(scalar) => { BackendRepr::Scalar(scalar) => {
if is_ret && matches!(scalar.primitive(), Primitive::Int(Integer::I128, _)) { if is_ret && matches!(scalar.primitive(), Primitive::Int(Integer::I128, _)) {
if cx.target_spec().rustc_abi == Some(RustcAbi::X86Softfloat) { if cx.target_spec().rustc_abi == Some(RustcAbi::Softfloat) {
// Use the native `i128` LLVM type for the softfloat ABI -- in other words, adjust nothing. // Use the native `i128` LLVM type for the softfloat ABI -- in other words, adjust nothing.
} else { } else {
// `i128` is returned in xmm0 by Clang and GCC // `i128` is returned in xmm0 by Clang and GCC

View file

@ -76,7 +76,7 @@ macro_rules! target_spec_enum {
pub enum $Name:ident { pub enum $Name:ident {
$( $(
$( #[$variant_attr:meta] )* $( #[$variant_attr:meta] )*
$Variant:ident = $string:literal, $Variant:ident = $string:literal $(,$alias:literal)* ,
)* )*
} }
parse_error_type = $parse_error_type:literal; parse_error_type = $parse_error_type:literal;
@ -88,6 +88,7 @@ macro_rules! target_spec_enum {
$( $(
$( #[$variant_attr] )* $( #[$variant_attr] )*
#[serde(rename = $string)] // for JSON schema generation only #[serde(rename = $string)] // for JSON schema generation only
$( #[serde(alias = $alias)] )*
$Variant, $Variant,
)* )*
} }
@ -97,7 +98,10 @@ macro_rules! target_spec_enum {
fn from_str(s: &str) -> Result<Self, Self::Err> { fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(match s { Ok(match s {
$( $string => Self::$Variant, )* $(
$string => Self::$Variant,
$($alias => Self::$Variant,)*
)*
_ => { _ => {
let all = [$( concat!("'", $string, "'") ),*].join(", "); let all = [$( concat!("'", $string, "'") ),*].join(", ");
return Err(format!("invalid {}: '{s}'. allowed values: {all}", $parse_error_type)); return Err(format!("invalid {}: '{s}'. allowed values: {all}", $parse_error_type));
@ -123,7 +127,7 @@ macro_rules! target_spec_enum {
pub enum $Name:ident { pub enum $Name:ident {
$( $(
$( #[$variant_attr:meta] )* $( #[$variant_attr:meta] )*
$Variant:ident = $string:literal, $Variant:ident = $string:literal $(,$alias:literal)* ,
)* )*
} }
$( #[$other_variant_attr:meta] )* $( #[$other_variant_attr:meta] )*
@ -134,6 +138,7 @@ macro_rules! target_spec_enum {
pub enum $Name { pub enum $Name {
$( $(
$( #[$variant_attr:meta] )* $( #[$variant_attr:meta] )*
$( #[serde(alias = $alias)] )*
$Variant, $Variant,
)* )*
/// The vast majority of the time, the compiler deals with a fixed /// The vast majority of the time, the compiler deals with a fixed
@ -165,7 +170,10 @@ macro_rules! target_spec_enum {
fn from_str(s: &str) -> Result<Self, Self::Err> { fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(match s { Ok(match s {
$( $string => Self::$Variant, )* $(
$string => Self::$Variant,
$($alias => Self::$Variant,)*
)*
_ => Self::$OtherVariant(s.to_owned().into()), _ => Self::$OtherVariant(s.to_owned().into()),
}) })
} }

View file

@ -1005,8 +1005,8 @@ crate::target_spec_enum! {
pub enum RustcAbi { pub enum RustcAbi {
/// On x86-32 only: make use of SSE and SSE2 for ABI purposes. /// On x86-32 only: make use of SSE and SSE2 for ABI purposes.
X86Sse2 = "x86-sse2", X86Sse2 = "x86-sse2",
/// On x86-32/64 only: do not use any FPU or SIMD registers for the ABI. /// On x86-32/64 and S390x: do not use any FPU or SIMD registers for the ABI.
X86Softfloat = "x86-softfloat", Softfloat = "softfloat", "x86-softfloat",
} }
parse_error_type = "rustc abi"; parse_error_type = "rustc abi";
@ -1460,6 +1460,7 @@ supported_targets! {
("powerpc64le-unknown-linux-gnu", powerpc64le_unknown_linux_gnu), ("powerpc64le-unknown-linux-gnu", powerpc64le_unknown_linux_gnu),
("powerpc64le-unknown-linux-musl", powerpc64le_unknown_linux_musl), ("powerpc64le-unknown-linux-musl", powerpc64le_unknown_linux_musl),
("s390x-unknown-linux-gnu", s390x_unknown_linux_gnu), ("s390x-unknown-linux-gnu", s390x_unknown_linux_gnu),
("s390x-unknown-none-softfloat", s390x_unknown_none_softfloat),
("s390x-unknown-linux-musl", s390x_unknown_linux_musl), ("s390x-unknown-linux-musl", s390x_unknown_linux_musl),
("sparc-unknown-linux-gnu", sparc_unknown_linux_gnu), ("sparc-unknown-linux-gnu", sparc_unknown_linux_gnu),
("sparc64-unknown-linux-gnu", sparc64_unknown_linux_gnu), ("sparc64-unknown-linux-gnu", sparc64_unknown_linux_gnu),
@ -3204,10 +3205,10 @@ impl Target {
Arch::X86, Arch::X86,
"`x86-sse2` ABI is only valid for x86-32 targets" "`x86-sse2` ABI is only valid for x86-32 targets"
), ),
RustcAbi::X86Softfloat => check_matches!( RustcAbi::Softfloat => check_matches!(
self.arch, self.arch,
Arch::X86 | Arch::X86_64, Arch::X86 | Arch::X86_64 | Arch::S390x,
"`x86-softfloat` ABI is only valid for x86 targets" "`softfloat` ABI is only valid for x86 and s390x targets"
), ),
} }
} }

View file

@ -22,7 +22,7 @@ pub(crate) fn target() -> Target {
// If you initialize FP units yourself, you can override these flags with custom linker // If you initialize FP units yourself, you can override these flags with custom linker
// arguments, thus giving you access to full MMX/SSE acceleration. // arguments, thus giving you access to full MMX/SSE acceleration.
base.features = "-mmx,-sse,+soft-float".into(); base.features = "-mmx,-sse,+soft-float".into();
base.rustc_abi = Some(RustcAbi::X86Softfloat); base.rustc_abi = Some(RustcAbi::Softfloat);
// Turn off DWARF. This fixes an lld warning, "section name .debug_frame is longer than 8 // Turn off DWARF. This fixes an lld warning, "section name .debug_frame is longer than 8
// characters and will use a non-standard string table". That section will not be created if // characters and will use a non-standard string table". That section will not be created if

View file

@ -0,0 +1,39 @@
use rustc_abi::{Align, Endian};
use crate::spec::{
Abi, Arch, Cc, LinkerFlavor, Lld, PanicStrategy, RelocModel, RustcAbi, SanitizerSet,
StackProbeType, Target, TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
let opts = TargetOptions {
abi: Abi::SoftFloat,
cpu: "z10".into(),
endian: Endian::Big,
features: "+soft-float,-vector".into(),
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
max_atomic_width: Some(128),
min_global_align: Some(Align::from_bits(16).unwrap()),
panic_strategy: PanicStrategy::Abort,
relocation_model: RelocModel::Static,
rustc_abi: Some(RustcAbi::Softfloat),
stack_probes: StackProbeType::Inline,
supported_sanitizers: SanitizerSet::KERNELADDRESS,
..Default::default()
};
Target {
llvm_target: "s390x-unknown-linux-gnu".into(),
metadata: TargetMetadata {
description: Some("S390x Linux".into()),
host_tools: Some(false),
std: Some(false),
tier: Some(2),
},
arch: Arch::S390x,
data_layout: "E-S64-m:e-i1:8:16-i8:8:16-i64:64-f128:64-v128:64-a:8:16-n32:64".into(),
options: opts,
pointer_width: 64,
}
}

View file

@ -20,7 +20,7 @@ pub(crate) fn target() -> Target {
relro_level: RelroLevel::Full, relro_level: RelroLevel::Full,
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes), linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()), linker: Some("rust-lld".into()),
rustc_abi: Some(RustcAbi::X86Softfloat), rustc_abi: Some(RustcAbi::Softfloat),
features: "-mmx,-sse,-sse2,-sse3,-ssse3,-sse4.1,-sse4.2,-avx,-avx2,+soft-float".into(), features: "-mmx,-sse,-sse2,-sse3,-ssse3,-sse4.1,-sse4.2,-avx,-avx2,+soft-float".into(),
supported_sanitizers: SanitizerSet::KCFI | SanitizerSet::KERNELADDRESS, supported_sanitizers: SanitizerSet::KCFI | SanitizerSet::KERNELADDRESS,
disable_redzone: true, disable_redzone: true,

View file

@ -27,7 +27,7 @@ pub(crate) fn target() -> Target {
// If you initialize FP units yourself, you can override these flags with custom linker // If you initialize FP units yourself, you can override these flags with custom linker
// arguments, thus giving you access to full MMX/SSE acceleration. // arguments, thus giving you access to full MMX/SSE acceleration.
base.features = "-mmx,-sse,+soft-float".into(); base.features = "-mmx,-sse,+soft-float".into();
base.rustc_abi = Some(RustcAbi::X86Softfloat); base.rustc_abi = Some(RustcAbi::Softfloat);
Target { Target {
llvm_target: "x86_64-unknown-windows".into(), llvm_target: "x86_64-unknown-windows".into(),

View file

@ -863,7 +863,7 @@ const IBMZ_FEATURES: &[(&str, Stability, ImpliedFeatures)] = &[
("miscellaneous-extensions-3", Stable, &[]), ("miscellaneous-extensions-3", Stable, &[]),
("miscellaneous-extensions-4", Stable, &[]), ("miscellaneous-extensions-4", Stable, &[]),
("nnp-assist", Stable, &["vector"]), ("nnp-assist", Stable, &["vector"]),
("soft-float", Forbidden { reason: "currently unsupported ABI-configuration feature" }, &[]), ("soft-float", Forbidden { reason: "unsupported ABI-configuration feature" }, &[]),
("transactional-execution", Unstable(sym::s390x_target_feature), &[]), ("transactional-execution", Unstable(sym::s390x_target_feature), &[]),
("vector", Stable, &[]), ("vector", Stable, &[]),
("vector-enhancements-1", Stable, &["vector"]), ("vector-enhancements-1", Stable, &["vector"]),
@ -1117,7 +1117,7 @@ impl Target {
incompatible: &["soft-float"], incompatible: &["soft-float"],
} }
} }
Some(RustcAbi::X86Softfloat) => { Some(RustcAbi::Softfloat) => {
// Softfloat ABI, requires corresponding target feature. That feature trumps // Softfloat ABI, requires corresponding target feature. That feature trumps
// `x87` and all other FPU features so those do not matter. // `x87` and all other FPU features so those do not matter.
// Note that this one requirement is the entire implementation of the ABI! // Note that this one requirement is the entire implementation of the ABI!
@ -1137,7 +1137,7 @@ impl Target {
incompatible: &["soft-float"], incompatible: &["soft-float"],
} }
} }
Some(RustcAbi::X86Softfloat) => { Some(RustcAbi::Softfloat) => {
// Softfloat ABI, requires corresponding target feature. That feature trumps // Softfloat ABI, requires corresponding target feature. That feature trumps
// `x87` and all other FPU features so those do not matter. // `x87` and all other FPU features so those do not matter.
// Note that this one requirement is the entire implementation of the ABI! // Note that this one requirement is the entire implementation of the ABI!
@ -1237,11 +1237,27 @@ impl Target {
} }
} }
Arch::S390x => { Arch::S390x => {
// We don't currently support a softfloat target on this architecture. // Same as x86, We use our own ABI indicator here;
// As usual, we have to reject swapping the `soft-float` target feature. // LLVM does not have anything native and will switch ABI based
// The "vector" target feature does not affect the ABI for floats // on the soft-float target feature.
// because the vector and float registers overlap. // Every case should require or forbid `soft-float`!
FeatureConstraints { required: &[], incompatible: &["soft-float"] } // The "vector" target feature may only be used without soft-float
// because the float and vector registers overlap and the
// standard s390x C ABI may pass vectors via these registers.
match self.rustc_abi {
None => {
// Default hardfloat ABI.
FeatureConstraints { required: &[], incompatible: &["soft-float"] }
}
Some(RustcAbi::Softfloat) => {
// Softfloat ABI, requires corresponding target feature.
// llvm will switch to soft-float ABI just based on this feature.
FeatureConstraints { required: &["soft-float"], incompatible: &["vector"] }
}
Some(r) => {
panic!("invalid Rust ABI for s390x: {r:?}");
}
}
} }
Arch::Avr => { Arch::Avr => {
// SRAM is minimum requirement for C/C++ in both avr-gcc and Clang, // SRAM is minimum requirement for C/C++ in both avr-gcc and Clang,

View file

@ -1020,7 +1020,7 @@ impl<'a, 'tcx> TypeErrCtxt<'a, 'tcx> {
&& let Some((sup_expected, sup_found)) = && let Some((sup_expected, sup_found)) =
self.values_str(sup_trace.values, &sup_trace.cause, err.long_ty_path()) self.values_str(sup_trace.values, &sup_trace.cause, err.long_ty_path())
&& let Some((sub_expected, sub_found)) = && let Some((sub_expected, sub_found)) =
self.values_str(sub_trace.values, &sup_trace.cause, err.long_ty_path()) self.values_str(sub_trace.values, &sub_trace.cause, err.long_ty_path())
&& sub_expected == sup_expected && sub_expected == sup_expected
&& sub_found == sup_found && sub_found == sup_found
{ {

View file

@ -48,6 +48,7 @@ const STAGE0_MISSING_TARGETS: &[&str] = &[
"thumbv6-none-eabi", "thumbv6-none-eabi",
"aarch64v8r-unknown-none", "aarch64v8r-unknown-none",
"aarch64v8r-unknown-none-softfloat", "aarch64v8r-unknown-none-softfloat",
"s390x-unknown-none-softfloat",
]; ];
/// Minimum version threshold for libstdc++ required when using prebuilt LLVM /// Minimum version threshold for libstdc++ required when using prebuilt LLVM

View file

@ -6,7 +6,7 @@ const TEST_JOBS_YML_PATH: &str = concat!(env!("CARGO_MANIFEST_DIR"), "/tests/tes
fn auto_jobs() { fn auto_jobs() {
let stdout = get_matrix("push", "commit", "refs/heads/automation/bors/auto"); let stdout = get_matrix("push", "commit", "refs/heads/automation/bors/auto");
insta::assert_snapshot!(stdout, @r#" insta::assert_snapshot!(stdout, @r#"
jobs=[{"name":"aarch64-gnu","full_name":"auto - aarch64-gnu","os":"ubuntu-22.04-arm","env":{"ARTIFACTS_AWS_ACCESS_KEY_ID":"AKIA46X5W6CZN24CBO55","AWS_REGION":"us-west-1","CACHES_AWS_ACCESS_KEY_ID":"AKIA46X5W6CZI5DHEBFL","DEPLOY_BUCKET":"rust-lang-ci2","TOOLSTATE_PUBLISH":1},"free_disk":true},{"name":"x86_64-gnu-llvm-18-1","full_name":"auto - x86_64-gnu-llvm-18-1","os":"ubuntu-24.04","env":{"ARTIFACTS_AWS_ACCESS_KEY_ID":"AKIA46X5W6CZN24CBO55","AWS_REGION":"us-west-1","CACHES_AWS_ACCESS_KEY_ID":"AKIA46X5W6CZI5DHEBFL","DEPLOY_BUCKET":"rust-lang-ci2","DOCKER_SCRIPT":"stage_2_test_set1.sh","IMAGE":"x86_64-gnu-llvm-18","READ_ONLY_SRC":"0","RUST_BACKTRACE":1,"TOOLSTATE_PUBLISH":1},"free_disk":true},{"name":"aarch64-apple","full_name":"auto - aarch64-apple","os":"macos-14","env":{"ARTIFACTS_AWS_ACCESS_KEY_ID":"AKIA46X5W6CZN24CBO55","AWS_REGION":"us-west-1","CACHES_AWS_ACCESS_KEY_ID":"AKIA46X5W6CZI5DHEBFL","DEPLOY_BUCKET":"rust-lang-ci2","DEVELOPER_DIR":"/Applications/Xcode_15.4.app/Contents/Developer","MACOSX_DEPLOYMENT_TARGET":11.0,"MACOSX_STD_DEPLOYMENT_TARGET":11.0,"NO_DEBUG_ASSERTIONS":1,"NO_LLVM_ASSERTIONS":1,"NO_OVERFLOW_CHECKS":1,"RUSTC_RETRY_LINKER_ON_SEGFAULT":1,"RUST_CONFIGURE_ARGS":"--enable-sanitizers --enable-profiler --set rust.jemalloc","SCRIPT":"./x.py --stage 2 test --host=aarch64-apple-darwin --target=aarch64-apple-darwin","TOOLSTATE_PUBLISH":1}},{"name":"dist-i686-msvc","full_name":"auto - dist-i686-msvc","os":"windows-2022","env":{"ARTIFACTS_AWS_ACCESS_KEY_ID":"AKIA46X5W6CZN24CBO55","AWS_REGION":"us-west-1","CACHES_AWS_ACCESS_KEY_ID":"AKIA46X5W6CZI5DHEBFL","CODEGEN_BACKENDS":"llvm,cranelift","DEPLOY_BUCKET":"rust-lang-ci2","DIST_REQUIRE_ALL_TOOLS":1,"RUST_CONFIGURE_ARGS":"--build=i686-pc-windows-msvc --host=i686-pc-windows-msvc --target=i686-pc-windows-msvc,i586-pc-windows-msvc --enable-full-tools --enable-profiler","SCRIPT":"python x.py dist bootstrap --include-default-paths","TOOLSTATE_PUBLISH":1}},{"name":"pr-check-1","full_name":"auto - pr-check-1","os":"ubuntu-24.04","env":{"ARTIFACTS_AWS_ACCESS_KEY_ID":"AKIA46X5W6CZN24CBO55","AWS_REGION":"us-west-1","CACHES_AWS_ACCESS_KEY_ID":"AKIA46X5W6CZI5DHEBFL","DEPLOY_BUCKET":"rust-lang-ci2","TOOLSTATE_PUBLISH":1},"continue_on_error":false,"free_disk":true},{"name":"pr-check-2","full_name":"auto - pr-check-2","os":"ubuntu-24.04","env":{"ARTIFACTS_AWS_ACCESS_KEY_ID":"AKIA46X5W6CZN24CBO55","AWS_REGION":"us-west-1","CACHES_AWS_ACCESS_KEY_ID":"AKIA46X5W6CZI5DHEBFL","DEPLOY_BUCKET":"rust-lang-ci2","TOOLSTATE_PUBLISH":1},"continue_on_error":false,"free_disk":true},{"name":"tidy","full_name":"auto - tidy","os":"ubuntu-24.04","env":{"ARTIFACTS_AWS_ACCESS_KEY_ID":"AKIA46X5W6CZN24CBO55","AWS_REGION":"us-west-1","CACHES_AWS_ACCESS_KEY_ID":"AKIA46X5W6CZI5DHEBFL","DEPLOY_BUCKET":"rust-lang-ci2","TOOLSTATE_PUBLISH":1},"continue_on_error":false,"free_disk":true,"doc_url":"https://foo.bar"}] jobs=[{"name":"aarch64-gnu","full_name":"auto - aarch64-gnu","os":"ubuntu-22.04-arm","env":{"ARTIFACTS_AWS_ACCESS_KEY_ID":"AKIA46X5W6CZN24CBO55","AWS_REGION":"us-west-1","CACHES_AWS_ACCESS_KEY_ID":"AKIA46X5W6CZI5DHEBFL","DEPLOY_BUCKET":"rust-lang-ci2","TOOLSTATE_PUBLISH":1},"free_disk":true},{"name":"x86_64-gnu-llvm-18-1","full_name":"auto - x86_64-gnu-llvm-18-1","os":"ubuntu-24.04","env":{"ARTIFACTS_AWS_ACCESS_KEY_ID":"AKIA46X5W6CZN24CBO55","AWS_REGION":"us-west-1","CACHES_AWS_ACCESS_KEY_ID":"AKIA46X5W6CZI5DHEBFL","DEPLOY_BUCKET":"rust-lang-ci2","DOCKER_SCRIPT":"stage_2_test_set1.sh","IMAGE":"x86_64-gnu-llvm-18","READ_ONLY_SRC":"0","RUST_BACKTRACE":1,"TOOLSTATE_PUBLISH":1},"free_disk":true},{"name":"aarch64-apple","full_name":"auto - aarch64-apple","os":"macos-15","env":{"ARTIFACTS_AWS_ACCESS_KEY_ID":"AKIA46X5W6CZN24CBO55","AWS_REGION":"us-west-1","CACHES_AWS_ACCESS_KEY_ID":"AKIA46X5W6CZI5DHEBFL","DEPLOY_BUCKET":"rust-lang-ci2","DEVELOPER_DIR":"/Applications/Xcode_26.2.app/Contents/Developer","MACOSX_DEPLOYMENT_TARGET":11.0,"MACOSX_STD_DEPLOYMENT_TARGET":11.0,"NO_DEBUG_ASSERTIONS":1,"NO_LLVM_ASSERTIONS":1,"NO_OVERFLOW_CHECKS":1,"RUSTC_RETRY_LINKER_ON_SEGFAULT":1,"RUST_CONFIGURE_ARGS":"--enable-sanitizers --enable-profiler --set rust.jemalloc","SCRIPT":"./x.py --stage 2 test --host=aarch64-apple-darwin --target=aarch64-apple-darwin","TOOLSTATE_PUBLISH":1}},{"name":"dist-i686-msvc","full_name":"auto - dist-i686-msvc","os":"windows-2022","env":{"ARTIFACTS_AWS_ACCESS_KEY_ID":"AKIA46X5W6CZN24CBO55","AWS_REGION":"us-west-1","CACHES_AWS_ACCESS_KEY_ID":"AKIA46X5W6CZI5DHEBFL","CODEGEN_BACKENDS":"llvm,cranelift","DEPLOY_BUCKET":"rust-lang-ci2","DIST_REQUIRE_ALL_TOOLS":1,"RUST_CONFIGURE_ARGS":"--build=i686-pc-windows-msvc --host=i686-pc-windows-msvc --target=i686-pc-windows-msvc,i586-pc-windows-msvc --enable-full-tools --enable-profiler","SCRIPT":"python x.py dist bootstrap --include-default-paths","TOOLSTATE_PUBLISH":1}},{"name":"pr-check-1","full_name":"auto - pr-check-1","os":"ubuntu-24.04","env":{"ARTIFACTS_AWS_ACCESS_KEY_ID":"AKIA46X5W6CZN24CBO55","AWS_REGION":"us-west-1","CACHES_AWS_ACCESS_KEY_ID":"AKIA46X5W6CZI5DHEBFL","DEPLOY_BUCKET":"rust-lang-ci2","TOOLSTATE_PUBLISH":1},"continue_on_error":false,"free_disk":true},{"name":"pr-check-2","full_name":"auto - pr-check-2","os":"ubuntu-24.04","env":{"ARTIFACTS_AWS_ACCESS_KEY_ID":"AKIA46X5W6CZN24CBO55","AWS_REGION":"us-west-1","CACHES_AWS_ACCESS_KEY_ID":"AKIA46X5W6CZI5DHEBFL","DEPLOY_BUCKET":"rust-lang-ci2","TOOLSTATE_PUBLISH":1},"continue_on_error":false,"free_disk":true},{"name":"tidy","full_name":"auto - tidy","os":"ubuntu-24.04","env":{"ARTIFACTS_AWS_ACCESS_KEY_ID":"AKIA46X5W6CZN24CBO55","AWS_REGION":"us-west-1","CACHES_AWS_ACCESS_KEY_ID":"AKIA46X5W6CZI5DHEBFL","DEPLOY_BUCKET":"rust-lang-ci2","TOOLSTATE_PUBLISH":1},"continue_on_error":false,"free_disk":true,"doc_url":"https://foo.bar"}]
run_type=auto run_type=auto
"#); "#);
} }

View file

@ -13,7 +13,7 @@ runners:
<<: *base-job <<: *base-job
- &job-macos-m1 - &job-macos-m1
os: macos-14 os: macos-15
<<: *base-job <<: *base-job
- &job-windows - &job-windows
@ -33,7 +33,7 @@ envs:
# Ensure that host tooling is tested on our minimum supported macOS version. # Ensure that host tooling is tested on our minimum supported macOS version.
MACOSX_DEPLOYMENT_TARGET: 10.12 MACOSX_DEPLOYMENT_TARGET: 10.12
MACOSX_STD_DEPLOYMENT_TARGET: 10.12 MACOSX_STD_DEPLOYMENT_TARGET: 10.12
DEVELOPER_DIR: /Applications/Xcode_15.2.app/Contents/Developer DEVELOPER_DIR: /Applications/Xcode_26.2.app/Contents/Developer
NO_LLVM_ASSERTIONS: 1 NO_LLVM_ASSERTIONS: 1
NO_DEBUG_ASSERTIONS: 1 NO_DEBUG_ASSERTIONS: 1
NO_OVERFLOW_CHECKS: 1 NO_OVERFLOW_CHECKS: 1
@ -112,7 +112,7 @@ auto:
--enable-profiler --enable-profiler
--set rust.jemalloc --set rust.jemalloc
RUSTC_RETRY_LINKER_ON_SEGFAULT: 1 RUSTC_RETRY_LINKER_ON_SEGFAULT: 1
DEVELOPER_DIR: /Applications/Xcode_15.4.app/Contents/Developer DEVELOPER_DIR: /Applications/Xcode_26.2.app/Contents/Developer
# Aarch64 tooling only needs to support macOS 11.0 and up as nothing else # Aarch64 tooling only needs to support macOS 11.0 and up as nothing else
# supports the hardware, so only need to test it there. # supports the hardware, so only need to test it there.
MACOSX_DEPLOYMENT_TARGET: 11.0 MACOSX_DEPLOYMENT_TARGET: 11.0

View file

@ -23,7 +23,7 @@ runners:
<<: *base-job <<: *base-job
- &job-macos - &job-macos
os: macos-14 os: macos-15 # macOS 15 Arm64
<<: *base-job <<: *base-job
- &job-windows - &job-windows
@ -459,7 +459,7 @@ auto:
# Ensure that host tooling is built to support our minimum support macOS version. # Ensure that host tooling is built to support our minimum support macOS version.
MACOSX_DEPLOYMENT_TARGET: 10.12 MACOSX_DEPLOYMENT_TARGET: 10.12
MACOSX_STD_DEPLOYMENT_TARGET: 10.12 MACOSX_STD_DEPLOYMENT_TARGET: 10.12
DEVELOPER_DIR: /Applications/Xcode_15.4.app/Contents/Developer DEVELOPER_DIR: /Applications/Xcode_26.2.app/Contents/Developer
DIST_REQUIRE_ALL_TOOLS: 1 DIST_REQUIRE_ALL_TOOLS: 1
CODEGEN_BACKENDS: llvm,cranelift CODEGEN_BACKENDS: llvm,cranelift
<<: *job-macos <<: *job-macos
@ -474,7 +474,7 @@ auto:
# FIXME(madsmtm): This might be redundant, as we're not building host tooling here (?) # FIXME(madsmtm): This might be redundant, as we're not building host tooling here (?)
MACOSX_DEPLOYMENT_TARGET: 10.12 MACOSX_DEPLOYMENT_TARGET: 10.12
MACOSX_STD_DEPLOYMENT_TARGET: 10.12 MACOSX_STD_DEPLOYMENT_TARGET: 10.12
DEVELOPER_DIR: /Applications/Xcode_15.2.app/Contents/Developer DEVELOPER_DIR: /Applications/Xcode_26.2.app/Contents/Developer
<<: *job-macos <<: *job-macos
- name: dist-aarch64-apple - name: dist-aarch64-apple
@ -495,7 +495,7 @@ auto:
# supports the hardware. # supports the hardware.
MACOSX_DEPLOYMENT_TARGET: 11.0 MACOSX_DEPLOYMENT_TARGET: 11.0
MACOSX_STD_DEPLOYMENT_TARGET: 11.0 MACOSX_STD_DEPLOYMENT_TARGET: 11.0
DEVELOPER_DIR: /Applications/Xcode_15.4.app/Contents/Developer DEVELOPER_DIR: /Applications/Xcode_26.2.app/Contents/Developer
DIST_REQUIRE_ALL_TOOLS: 1 DIST_REQUIRE_ALL_TOOLS: 1
CODEGEN_BACKENDS: llvm,cranelift CODEGEN_BACKENDS: llvm,cranelift
<<: *job-macos <<: *job-macos
@ -509,7 +509,7 @@ auto:
--enable-sanitizers --enable-sanitizers
--enable-profiler --enable-profiler
--set rust.jemalloc --set rust.jemalloc
DEVELOPER_DIR: /Applications/Xcode_15.4.app/Contents/Developer DEVELOPER_DIR: /Applications/Xcode_26.2.app/Contents/Developer
# Aarch64 tooling only needs to support macOS 11.0 and up as nothing else # Aarch64 tooling only needs to support macOS 11.0 and up as nothing else
# supports the hardware, so only need to test it there. # supports the hardware, so only need to test it there.
MACOSX_DEPLOYMENT_TARGET: 11.0 MACOSX_DEPLOYMENT_TARGET: 11.0

View file

@ -120,6 +120,7 @@
- [riscv64a23-unknown-linux-gnu](platform-support/riscv64a23-unknown-linux-gnu.md) - [riscv64a23-unknown-linux-gnu](platform-support/riscv64a23-unknown-linux-gnu.md)
- [s390x-unknown-linux-gnu](platform-support/s390x-unknown-linux-gnu.md) - [s390x-unknown-linux-gnu](platform-support/s390x-unknown-linux-gnu.md)
- [s390x-unknown-linux-musl](platform-support/s390x-unknown-linux-musl.md) - [s390x-unknown-linux-musl](platform-support/s390x-unknown-linux-musl.md)
- [s390x-unknown-none-softfloat](platform-support/s390x-unknown-none-softfloat.md)
- [sparc-unknown-none-elf](./platform-support/sparc-unknown-none-elf.md) - [sparc-unknown-none-elf](./platform-support/sparc-unknown-none-elf.md)
- [solaris](platform-support/solaris.md) - [solaris](platform-support/solaris.md)
- [\*-nto-qnx-\*](platform-support/nto-qnx.md) - [\*-nto-qnx-\*](platform-support/nto-qnx.md)

View file

@ -188,6 +188,7 @@ target | std | notes
[`riscv64im-unknown-none-elf`](platform-support/riscv64im-unknown-none-elf.md) | * | Bare RISC-V (RV64IM ISA) [`riscv64im-unknown-none-elf`](platform-support/riscv64im-unknown-none-elf.md) | * | Bare RISC-V (RV64IM ISA)
`riscv64imac-unknown-none-elf` | * | Bare RISC-V (RV64IMAC ISA) `riscv64imac-unknown-none-elf` | * | Bare RISC-V (RV64IMAC ISA)
`sparc64-unknown-linux-gnu` | ✓ | SPARC Linux (kernel 4.4+, glibc 2.23) `sparc64-unknown-linux-gnu` | ✓ | SPARC Linux (kernel 4.4+, glibc 2.23)
[`s390x-unknown-none-softfloat`](platform-support/s390x-unknown-none-softfloat.md) | * | Bare S390x (softfloat ABI)
[`thumbv6m-none-eabi`](platform-support/thumbv6m-none-eabi.md) | * | Bare Armv6-M [`thumbv6m-none-eabi`](platform-support/thumbv6m-none-eabi.md) | * | Bare Armv6-M
[`thumbv7em-none-eabi`](platform-support/thumbv7em-none-eabi.md) | * | Bare Armv7E-M [`thumbv7em-none-eabi`](platform-support/thumbv7em-none-eabi.md) | * | Bare Armv7E-M
[`thumbv7em-none-eabihf`](platform-support/thumbv7em-none-eabi.md) | * | Bare Armv7E-M, hardfloat [`thumbv7em-none-eabihf`](platform-support/thumbv7em-none-eabi.md) | * | Bare Armv7E-M, hardfloat

View file

@ -0,0 +1,77 @@
# `s390x-unknown-none-softfloat`
**Tier: 2**
IBM z/Architecture (s390x) code in ELF format for kernels, etc.
## Target maintainers
[@uweigand](https://github.com/uweigand)
[@cuviper](https://github.com/cuviper)
## Requirements
This target is intended for kernel development on s390x only. This target is
cross-compiled. There is no support for `std`.There is no default allocator,
but it's possible to use `alloc` by supplying an allocator.
The target does not assume existence of a FPU and does not make use of any
non-GPR register. This allows the generated code to run in environments, such
as kernels, which may need to avoid the use of such registers or which may have
special considerations about the use of such registers (e.g. saving and
restoring them to avoid breaking userspace code using the same registers). You
can change code generation to use additional CPU features via the
`-C target-feature=` codegen options to rustc, or via the `#[target_feature]`
mechanism within Rust code.
By default, code generated with the soft-float target should run on any Z System
starting at [Z10][s390x-isa]. Enabling additional target features or changing the
`-Ctarget-cpu` may raise the ISA required from the `z10` baseline.
`extern "C"` does not use a stable ABI and is subject to change between compiler
or codegen backend versions.
The target only generates object files in the ELF format. Any alternate formats
or special considerations for binary layout will require linker options or linker
scripts.
* [z/Architecture Principles of Operation][s390x-isa]
[s390x-isa]: https://publibfp.dhe.ibm.com/epubs/pdf/a227832d.pdf
[s390x-abi]: https://github.com/IBM/s390x-abi
## Building the target
You can build Rust with support for the target by adding it to the `target`
list in `bootstrap.toml`:
```toml
[build]
target = ["s390x-unknown-none-softfloat"]
```
## Building Rust programs
This target is not intended to build stand-alone binaries. You should only use
it in conjunction with the kernel build toolchain.
## Testing
As code generated by this target is intended to always be part of the kernel,
there are no additional requirements for testing.
If you want to do native testing but do not have your own s390x
machine, there are several options how to get access to one:
* The [IBM LinuxONE Community Cloud][cloud-community] provides a
self-service portal where you can create s390x virtual machine
instances. These are intended for temporary use (limited to 120 days).
* The [IBM LinuxONE Open Source Cloud][cloud-opensource] provides
permanent access to s390x machines. This requires approval by IBM,
which will normally be granted if you're planning to use the machine
to work on an open-source project that is relevant to the IBM Z
ecosystem - the Rust compiler would certainly qualify.
[cloud-community]: https://linuxone.cloud.marist.edu/
[cloud-opensource]: https://community.ibm.com/zsystems/form/l1cc-oss-vm-request/

View file

@ -0,0 +1,64 @@
//@ add-minicore
//@ revisions: enable-softfloat disable-softfloat
//@ assembly-output: emit-asm
//@ compile-flags: -Copt-level=3 --crate-type=lib
//@[enable-softfloat] compile-flags: --target=s390x-unknown-none-softfloat
//@[enable-softfloat] needs-llvm-components: systemz
//@[disable-softfloat] compile-flags: --target=s390x-unknown-linux-gnu
//@[disable-softfloat] needs-llvm-components: systemz
//@ ignore-backends: gcc
#![feature(no_core, lang_items)]
#![no_std]
#![no_core]
extern crate minicore;
use minicore::*;
extern "C" {
fn extern_func(value: f64) -> f64;
}
// CHECK-LABEL: test_softfloat
#[no_mangle]
extern "C" fn test_softfloat() -> f64 {
let value = 3.141_f64;
// without softfloat we load the value direct to the first float register
// we do NOT construct a softfloat in r2 (first non-float arg register)
// disable-softfloat: ld %f{{.*}}, 0(%r{{.*}})
// disable-softfloat-NOT: llihf %r{{.*}}, 1074340036
// disable-softfloat-NOT: oilf %r{{.*}}, 2611340116
// with softfloat we construct the softfloat arg in r2
// we do NOT pass anything by f0 (first float arg register)
// float registers can not be accessed
// enable-softfloat: llihf %r{{.*}}, 1074340036
// enable-softfloat-NEXT: oilf %r{{.*}}, 2611340116
// enable-softfloat-NOT: ld %f{{.*}}, 0(%r{{.*}})
unsafe { extern_func(value) };
// disable-softfloat-NEXT: brasl %r{{.*}}, extern_func@PLT
// enable-softfloat-NEXT: brasl %r{{.*}}, extern_func@PLT
// for return we check that without softfloat we write to float register
// disable-softfloat: ld %f{{.*}}, 0(%r{{.*}})
// disable-softfloat-NOT: llihf %r{{.*}}, 1072841097
// disable-softfloat-NOT: oilf %r{{.*}}, 927712936
#[cfg(not(target_feature = "soft-float"))]
{
1.141_f64
}
// for return we check that WITH softfloat we write to genral purpose register
// enable-softfloat: llihf %r{{.*}}, 1072841097
// enable-softfloat-NEXT: oilf %r{{.*}}, 927712936
// enable-softfloat-NOT: ld %f{{.*}}, 0(%r{{.*}})
#[cfg(target_feature = "soft-float")]
{
2.718_f64
}
// enable-softfloat: br %r{{.*}}
// disable-softfloat: br %r{{.*}}
}

View file

@ -544,6 +544,9 @@
//@ revisions: s390x_unknown_linux_musl //@ revisions: s390x_unknown_linux_musl
//@ [s390x_unknown_linux_musl] compile-flags: --target s390x-unknown-linux-musl //@ [s390x_unknown_linux_musl] compile-flags: --target s390x-unknown-linux-musl
//@ [s390x_unknown_linux_musl] needs-llvm-components: systemz //@ [s390x_unknown_linux_musl] needs-llvm-components: systemz
//@ revisions: s390x_unknown_none_softfloat
//@ [s390x_unknown_none_softfloat] compile-flags: --target s390x-unknown-none-softfloat
//@ [s390x_unknown_none_softfloat] needs-llvm-components: systemz
//@ revisions: sparc64_unknown_helenos //@ revisions: sparc64_unknown_helenos
//@ [sparc64_unknown_helenos] compile-flags: --target sparc64-unknown-helenos //@ [sparc64_unknown_helenos] compile-flags: --target sparc64-unknown-helenos
//@ [sparc64_unknown_helenos] needs-llvm-components: sparc //@ [sparc64_unknown_helenos] needs-llvm-components: sparc

View file

@ -1,7 +0,0 @@
//@ known-bug: #131292
//@ needs-asm-support
use std::arch::asm;
unsafe fn f6() {
asm!(concat!(r#"lJ𐏿Æ<F0908FBF>.𐏿<>"#, "{}/day{:02}.txt"));
}

View file

@ -0,0 +1,12 @@
warning: target feature `soft-float` cannot be enabled with `-Ctarget-feature`: unsupported ABI-configuration feature
|
= note: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
= note: for more information, see issue #116344 <https://github.com/rust-lang/rust/issues/116344>
warning: target feature `soft-float` must be disabled to ensure that the ABI of the current target can be implemented correctly
|
= note: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
= note: for more information, see issue #116344 <https://github.com/rust-lang/rust/issues/116344>
warning: 2 warnings emitted

View file

@ -0,0 +1,7 @@
warning: target feature `vector` must be disabled to ensure that the ABI of the current target can be implemented correctly
|
= note: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
= note: for more information, see issue #116344 <https://github.com/rust-lang/rust/issues/116344>
warning: 1 warning emitted

View file

@ -0,0 +1,38 @@
//@ add-minicore
//@ revisions: disable-softfloat enable-softfloat
//@ assembly-output: emit-asm
//@ compile-flags: -Copt-level=3 --crate-type=lib
// we expect the build to fail in the feature
//@ build-pass
//@ [enable-softfloat] compile-flags: --target=s390x-unknown-none-softfloat
//@ [enable-softfloat] compile-flags: -C target-feature=+vector
//@ [enable-softfloat] needs-llvm-components: systemz
//@ [disable-softfloat] compile-flags: --target=s390x-unknown-linux-gnu
//@ [disable-softfloat] compile-flags: -C target-feature=+soft-float
//@ [disable-softfloat] needs-llvm-components: systemz
//@ ignore-backends: gcc
//[disable-softfloat]~? WARN target feature `soft-float` must be disabled to ensure that the ABI of the current target can be implemented correctly
//[disable-softfloat]~? WARN target feature `soft-float` cannot be enabled with `-Ctarget-feature`
//[enable-softfloat]~? WARN target feature `vector` must be disabled to ensure that the ABI of the current target can be implemented correctly
#![feature(no_core, lang_items)]
#![no_std]
#![no_core]
extern crate minicore;
use minicore::*;
extern "C" {
fn extern_func(value: f64) -> f64;
}
#[no_mangle]
extern "C" fn test_softfloat() -> f64 {
let value = 3.141_f64;
unsafe { extern_func(value) } ;
2.718_f64
}

View file

@ -1,4 +1,4 @@
warning: target feature `soft-float` cannot be enabled with `-Ctarget-feature`: currently unsupported ABI-configuration feature warning: target feature `soft-float` cannot be enabled with `-Ctarget-feature`: unsupported ABI-configuration feature
| |
= note: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = note: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
= note: for more information, see issue #116344 <https://github.com/rust-lang/rust/issues/116344> = note: for more information, see issue #116344 <https://github.com/rust-lang/rust/issues/116344>

View file

@ -1,17 +1,22 @@
// Regression test for ICE #129503 // Regression test for ICEs #129503 and #131292
//
// Tests that we come up with decent error spans // Tests that we come up with decent error spans
// when the template fed to `asm!()` is itself a // when the template fed to `asm!()` is itself a
// macro call like `concat!()` and should not ICE // macro call like `concat!()` and should not ICE
//@ needs-asm-support
use std::arch::asm; use std::arch::asm;
fn main() { fn main() {
// Should not ICE // Should not ICE (test case for #129503)
asm!(concat!(r#"lJ𐏿Æ<F0908FBF>.𐏿<>"#, "r} {}")); asm!(concat!(r#"lJ𐏿Æ<F0908FBF>.𐏿<>"#, "r} {}"));
//~^ ERROR invalid asm template string: unmatched `}` found //~^ ERROR invalid asm template string: unmatched `}` found
// Should not ICE (test case for #131292)
asm!(concat!(r#"lJ𐏿Æ<F0908FBF>.𐏿<>"#, "{}/day{:02}.txt"));
//~^ ERROR invalid asm template string: expected `}`, found `0`
// Macro call template: should point to // Macro call template: should point to
// everything within `asm!()` as error span // everything within `asm!()` as error span

View file

@ -1,13 +1,24 @@
error: invalid asm template string: unmatched `}` found error: invalid asm template string: unmatched `}` found
--> $DIR/ice-bad-err-span-in-template-129503.rs:12:10 --> $DIR/ice-bad-err-span-in-template-129503.rs:13:10
| |
LL | asm!(concat!(r#"lJ𐏿Æ<F0908FBF>.𐏿<>"#, "r} {}")); LL | asm!(concat!(r#"lJ𐏿Æ<F0908FBF>.𐏿<>"#, "r} {}"));
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ unmatched `}` in asm template string | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ unmatched `}` in asm template string
| |
= note: if you intended to print `}`, you can escape it using `}}` = note: if you intended to print `}`, you can escape it using `}}`
error: invalid asm template string: expected `}`, found `0`
--> $DIR/ice-bad-err-span-in-template-129503.rs:17:10
|
LL | asm!(concat!(r#"lJ𐏿Æ<F0908FBF>.𐏿<>"#, "{}/day{:02}.txt"));
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
| |
| expected `}` in asm template string
| because of this opening brace
|
= note: if you intended to print `{`, you can escape it using `{{`
error: invalid asm template string: unmatched `}` found error: invalid asm template string: unmatched `}` found
--> $DIR/ice-bad-err-span-in-template-129503.rs:18:10 --> $DIR/ice-bad-err-span-in-template-129503.rs:23:10
| |
LL | asm!(concat!("abc", "r} {}")); LL | asm!(concat!("abc", "r} {}"));
| ^^^^^^^^^^^^^^^^^^^^^^^ unmatched `}` in asm template string | ^^^^^^^^^^^^^^^^^^^^^^^ unmatched `}` in asm template string
@ -15,12 +26,12 @@ LL | asm!(concat!("abc", "r} {}"));
= note: if you intended to print `}`, you can escape it using `}}` = note: if you intended to print `}`, you can escape it using `}}`
error: invalid asm template string: unmatched `}` found error: invalid asm template string: unmatched `}` found
--> $DIR/ice-bad-err-span-in-template-129503.rs:24:19 --> $DIR/ice-bad-err-span-in-template-129503.rs:29:19
| |
LL | asm!("abc", "r} {}"); LL | asm!("abc", "r} {}");
| ^ unmatched `}` in asm template string | ^ unmatched `}` in asm template string
| |
= note: if you intended to print `}`, you can escape it using `}}` = note: if you intended to print `}`, you can escape it using `}}`
error: aborting due to 3 previous errors error: aborting due to 4 previous errors

View file

@ -88,4 +88,7 @@ raw { \n
//~^ ERROR invalid format string: expected `}`, found `?` //~^ ERROR invalid format string: expected `}`, found `?`
println!("{x,}, world!",); println!("{x,}, world!",);
//~^ ERROR invalid format string: python's numeric grouping `,` is not supported in rust format strings //~^ ERROR invalid format string: python's numeric grouping `,` is not supported in rust format strings
println!("{x=}");
//~^ ERROR invalid format string: python's f-string debug `=` is not supported in rust, use `dbg(x)` instead
} }

View file

@ -198,5 +198,15 @@ LL | println!("{x,}, world!",);
| |
= note: to print `{`, you can escape it using `{{` = note: to print `{`, you can escape it using `{{`
error: aborting due to 20 previous errors error: invalid format string: python's f-string debug `=` is not supported in rust, use `dbg(x)` instead
--> $DIR/format-string-error-2.rs:92:17
|
LL | println!("{x=}");
| - ^ expected `}` in format string
| |
| because of this opening brace
|
= note: to print `{`, you can escape it using `{{`
error: aborting due to 21 previous errors

View file

@ -0,0 +1,5 @@
//@ run-rustfix
fn main() {
let x = 32;
dbg!(x); //~ ERROR invalid format string: python's f-string debug
}

View file

@ -0,0 +1,5 @@
//@ run-rustfix
fn main() {
let x = 32;
println!("{=}", x); //~ ERROR invalid format string: python's f-string debug
}

View file

@ -0,0 +1,17 @@
error: invalid format string: python's f-string debug `=` is not supported in rust, use `dbg(x)` instead
--> $DIR/format-string-error-3.rs:4:16
|
LL | println!("{=}", x);
| -^ expected `}` in format string
| |
| because of this opening brace
|
= note: to print `{`, you can escape it using `{{`
help: use rust debug printing macro
|
LL - println!("{=}", x);
LL + dbg!(x);
|
error: aborting due to 1 previous error

View file

@ -1,6 +1,18 @@
fn main() { fn main() {
let x = Some(42); let x = Some(42);
let y = Some(42);
let z = Some(42);
if let Some(_) = x if let Some(_) = x
&& Some(x) = x //~^ ERROR expected expression, found `let` statement && Some(x) = x //~^ ERROR expected expression, found `let` statement
//~| NOTE: only supported directly in conditions of `if` and `while` expressions
{}
if Some(_) = y &&
//~^ NOTE expected `let` expression, found assignment
//~| ERROR let-chain with missing `let`
let Some(_) = z
//~^ ERROR: expected expression, found `let` statement
//~| NOTE: let expression later in the condition
//~| NOTE: only supported directly in conditions of `if` and `while` expressions
{} {}
} }

View file

@ -1,5 +1,5 @@
error: expected expression, found `let` statement error: expected expression, found `let` statement
--> $DIR/missing-let.rs:3:8 --> $DIR/missing-let.rs:5:8
| |
LL | if let Some(_) = x LL | if let Some(_) = x
| ^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^
@ -14,5 +14,29 @@ help: you might have meant to compare for equality
LL | && Some(x) == x LL | && Some(x) == x
| + | +
error: aborting due to 1 previous error error: expected expression, found `let` statement
--> $DIR/missing-let.rs:13:9
|
LL | let Some(_) = z
| ^^^
|
= note: only supported directly in conditions of `if` and `while` expressions
error: let-chain with missing `let`
--> $DIR/missing-let.rs:10:8
|
LL | if Some(_) = y &&
| ^^^^^^^----
| |
| expected `let` expression, found assignment
...
LL | let Some(_) = z
| --------------- let expression later in the condition
|
help: add `let` before the expression
|
LL | if let Some(_) = y &&
| +++
error: aborting due to 3 previous errors

View file

@ -0,0 +1,8 @@
//@ add-minicore
//@ no-prefer-dynamic
//@ compile-flags: --target=s390x-unknown-linux-gnu
//@ needs-llvm-components: systemz
#![feature(no_core)]
#![crate_type = "rlib"]
#![no_core]

View file

@ -0,0 +1,8 @@
//@ add-minicore
//@ no-prefer-dynamic
//@ compile-flags: --target=s390x-unknown-none-softfloat
//@ needs-llvm-components: systemz
#![feature(no_core)]
#![crate_type = "rlib"]
#![no_core]

View file

@ -0,0 +1,12 @@
error[E0461]: couldn't find crate `enabled_softfloat` with expected target triple s390x-unknown-linux-gnu
--> $DIR/incompatible_softfloat_targets.rs:17:1
|
LL | extern crate enabled_softfloat;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: the following crate versions were found:
crate `enabled_softfloat`, target triple s390x-unknown-none-softfloat: $TEST_BUILD_DIR/auxiliary/libenabled_softfloat.rlib
error: aborting due to 1 previous error
For more information about this error, try `rustc --explain E0461`.

View file

@ -0,0 +1,12 @@
error[E0461]: couldn't find crate `disabled_softfloat` with expected target triple s390x-unknown-none-softfloat
--> $DIR/incompatible_softfloat_targets.rs:19:1
|
LL | extern crate disabled_softfloat;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: the following crate versions were found:
crate `disabled_softfloat`, target triple s390x-unknown-linux-gnu: $TEST_BUILD_DIR/auxiliary/libdisabled_softfloat.rlib
error: aborting due to 1 previous error
For more information about this error, try `rustc --explain E0461`.

View file

@ -0,0 +1,20 @@
//@ add-minicore
//@ aux-build: disabled_softfloat.rs
//@ aux-build: enabled_softfloat.rs
//@ revisions: disable-softfloat enable-softfloat
//@ check-fail
//@ [enable-softfloat] compile-flags: --target=s390x-unknown-none-softfloat
//@ [enable-softfloat] needs-llvm-components: systemz
//@ [disable-softfloat] compile-flags: --target=s390x-unknown-linux-gnu
//@ [disable-softfloat] needs-llvm-components: systemz
//@ ignore-backends: gcc
#![feature(no_core)]
#![crate_type = "rlib"]
#![no_core]
extern crate enabled_softfloat;
//[disable-softfloat]~^ ERROR couldn't find crate `enabled_softfloat` with expected target triple s390x-unknown-linux-gnu
extern crate disabled_softfloat;
//[enable-softfloat]~^ ERROR couldn't find crate `disabled_softfloat` with expected target triple s390x-unknown-none-softfloat

View file

@ -1449,29 +1449,6 @@ compiler_leads = [
"@davidtwco", "@davidtwco",
"@wesleywiser", "@wesleywiser",
] ]
compiler = [
"@BoxyUwU",
"@chenyukang",
"@davidtwco",
"@eholk",
"@fee1-dead",
"@fmease",
"@jackh726",
"@jieyouxu",
"@jdonszelmann",
"@JonathanBrouwer",
"@madsmtm",
"@mati865",
"@Nadrieril",
"@nnethercote",
"@oli-obk",
"@petrochenkov",
"@SparrowLii",
"@TaKO8Ki",
"@tiif",
"@WaffleLapkin",
"@wesleywiser",
]
libs = [ libs = [
"@Mark-Simulacrum", "@Mark-Simulacrum",
"@workingjubilee", "@workingjubilee",