Skip to content
13 changes: 8 additions & 5 deletions compiler/rustc_llvm/llvm-wrapper/PassWrapper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -347,7 +347,13 @@ extern "C" LLVMTargetMachineRef LLVMRustCreateTargetMachine(
// option causes bugs in the LLVM WebAssembly backend. You should be able to
// remove this check when Rust's minimum supported LLVM version is >= 18
// https://github.com/llvm/llvm-project/pull/65876
if (!Trip.isWasm()) {
//
// Also keep traps after noreturn calls on Windows, because the trap is
// needed to keep the return address within the calling function's
// .pdata range. Without it, RtlLookupFunctionEntry resolves the wrong
// function and SEH unwinding (used for backtraces) terminates early.
// See https://github.com/rust-lang/rust/issues/140489
if (!Trip.isWasm() && !Trip.isOSWindows()) {
Options.NoTrapAfterNoreturn = true;
}
}
Expand Down Expand Up @@ -840,11 +846,8 @@ extern "C" LLVMRustResult LLVMRustOptimize(
}
break;
case LLVMRustOptStage::PreLinkThinLTO:
MPM = PB.buildThinLTOPreLinkDefaultPipeline(OptLevel);
NeedThinLTOBufferPasses = false;
break;
case LLVMRustOptStage::PreLinkFatLTO:
MPM = PB.buildLTOPreLinkDefaultPipeline(OptLevel);
MPM = PB.buildThinLTOPreLinkDefaultPipeline(OptLevel);
NeedThinLTOBufferPasses = false;
break;
case LLVMRustOptStage::ThinLTO:
Expand Down
13 changes: 4 additions & 9 deletions library/test/build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,11 @@ fn main() {
println!("cargo:rerun-if-changed=build.rs");
println!("cargo:rustc-check-cfg=cfg(enable_unstable_features)");

// Miri testing uses unstable features, so always enable that for its sysroot.
// Otherwise, only enable unstable if rustc looks like a nightly or dev build.
let enable_unstable_features = std::env::var("MIRI_CALLED_FROM_SETUP").is_ok() || {
let rustc = std::env::var("RUSTC").unwrap_or_else(|_| "rustc".into());
let version = std::process::Command::new(rustc).arg("-vV").output().unwrap();
let stdout = String::from_utf8(version.stdout).unwrap();
stdout.contains("nightly") || stdout.contains("dev")
};
let rustc = std::env::var("RUSTC").unwrap_or_else(|_| "rustc".into());
let version = std::process::Command::new(rustc).arg("-vV").output().unwrap();
let stdout = String::from_utf8(version.stdout).unwrap();

if enable_unstable_features {
if stdout.contains("nightly") || stdout.contains("dev") {
println!("cargo:rustc-cfg=enable_unstable_features");
}
}
19 changes: 18 additions & 1 deletion src/bootstrap/src/core/build_steps/test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -741,7 +741,13 @@ impl Step for Miri {

// Run it again for mir-opt-level 4 to catch some miscompilations.
if builder.config.test_args().is_empty() {
cargo.env("MIRIFLAGS", "-O -Zmir-opt-level=4 -Cdebug-assertions=yes");
cargo.env(
"MIRIFLAGS",
format!(
"{} -O -Zmir-opt-level=4 -Cdebug-assertions=yes",
env::var("MIRIFLAGS").unwrap_or_default()
),
);
// Optimizations can change backtraces
cargo.env("MIRI_SKIP_UI_CHECKS", "1");
// `MIRI_SKIP_UI_CHECKS` and `RUSTC_BLESS` are incompatible
Expand Down Expand Up @@ -3108,6 +3114,17 @@ impl Step for Crate {
// does not set this directly, but relies on the rustc wrapper to set it, and we are not using
// the wrapper -- hence we have to set it ourselves.
cargo.rustflag("-Zforce-unstable-if-unmarked");
// Miri is told to invoke the libtest runner and bootstrap sets unstable flags
// for that runner. That only works when RUSTC_BOOTSTRAP is set. Bootstrap sets
// that flag but Miri by default does not forward the host environment to the test.
// Here we set up MIRIFLAGS to forward that env var.
cargo.env(
"MIRIFLAGS",
format!(
"{} -Zmiri-env-forward=RUSTC_BOOTSTRAP",
env::var("MIRIFLAGS").unwrap_or_default()
),
);
cargo
} else {
// Also prepare a sysroot for the target.
Expand Down
22 changes: 22 additions & 0 deletions tests/ui/proc-macro/identity-closure-preserving.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
//! Make sure that the closure still gets the correct precedence when round-tripping
//! through a proc macro.
//! The correct precendence is `(|| ()) as fn()`, even though these parentheses are not
//! directly part of the code.
//! If it would get lost, the code would be `|| () as fn()`, get parsed as
//! `|| (() as fn())` and fail to compile.
//! Notably, this will also fail to compile if we use `recollect` instead of `identity`.
//! Regression test for https://github.com/rust-lang/rust/pull/151830#issuecomment-4010899019.
//@ proc-macro: test-macros.rs
//@ check-pass

macro_rules! operator_impl {
($target_expr:expr) => {
test_macros::identity! {
$target_expr as fn()
};
};
}

fn main() {
operator_impl!(|| ());
}
5 changes: 0 additions & 5 deletions tests/ui/runtime/backtrace-debuginfo.rs
Original file line number Diff line number Diff line change
Expand Up @@ -47,14 +47,9 @@ macro_rules! dump_and_die {
// there, even on i686-pc-windows-msvc. We do the best we can in
// rust-lang/rust to test it as well, but sometimes we just gotta keep
// landing PRs.
//
// aarch64-msvc/arm64ec-msvc is broken as its backtraces are truncated.
// See https://github.com/rust-lang/rust/issues/140489
if cfg!(any(target_os = "android",
all(target_os = "linux", target_arch = "arm"),
all(target_env = "msvc", target_arch = "x86"),
all(target_env = "msvc", target_arch = "aarch64"),
all(target_env = "msvc", target_arch = "arm64ec"),
target_os = "freebsd",
target_os = "dragonfly",
target_os = "openbsd")) {
Expand Down
Loading