diff --git a/compiler/rustc_codegen_ssa/src/back/link.rs b/compiler/rustc_codegen_ssa/src/back/link.rs index c527dd95e2db..d2c82280ad2a 100644 --- a/compiler/rustc_codegen_ssa/src/back/link.rs +++ b/compiler/rustc_codegen_ssa/src/back/link.rs @@ -781,9 +781,15 @@ fn for_each(bytes: &[u8], mut f: impl FnMut(&str, &mut String)) -> String { // FIXME: Tracked by https://github.com/rust-lang/rust/issues/136113 let deployment_mismatch = |line: &str| { - line.starts_with("ld: warning: object file (") - && line.contains("was built for newer 'macOS' version") - && line.contains("than being linked") + // ld64 (object files + dylibs) and ld_prime (object files only): + (line.starts_with("ld: ") + && line.contains("was built for newer") + && line.contains("than being linked")) + // ld_prime (Xcode 15+, dylibs only): + || (line.starts_with("ld: ") + && line.contains("building for") + && line.contains("but linking with") + && line.contains("which was built for newer version")) }; // FIXME: This is a real warning we would like to show, but it hits too many crates // to want to turn it on immediately. diff --git a/tests/run-make/macos-deployment-target-warning/dylib_warnings.txt b/tests/run-make/macos-deployment-target-warning/dylib_warnings.txt new file mode 100644 index 000000000000..70e531b6c47b --- /dev/null +++ b/tests/run-make/macos-deployment-target-warning/dylib_warnings.txt @@ -0,0 +1,11 @@ +warning: NORMALIZED_DYLIB_DEPLOYMENT_MISMATCH_LINKER_WARNING + + | +note: the lint level is defined here + --> main_dylib.rs:1:9 + | +1 | #![warn(linker_info, linker_messages)] + | ^^^^^^^^^^^ + +warning: 1 warning emitted + diff --git a/tests/run-make/macos-deployment-target-warning/main_dylib.rs b/tests/run-make/macos-deployment-target-warning/main_dylib.rs new file mode 100644 index 000000000000..2c3be92812e1 --- /dev/null +++ b/tests/run-make/macos-deployment-target-warning/main_dylib.rs @@ -0,0 +1,8 @@ +#![warn(linker_info, linker_messages)] +unsafe extern "C" { + safe fn foo(); +} + +fn main() { + foo(); +} diff --git a/tests/run-make/macos-deployment-target-warning/rmake.rs b/tests/run-make/macos-deployment-target-warning/rmake.rs index f48719ebd3b3..5c9463b6e392 100644 --- a/tests/run-make/macos-deployment-target-warning/rmake.rs +++ b/tests/run-make/macos-deployment-target-warning/rmake.rs @@ -1,4 +1,6 @@ +// ignore-tidy-linelength //! Tests that deployment target linker warnings are shown as `linker-info`, not `linker-messages` +//! See //@ only-macos @@ -7,6 +9,12 @@ use run_make_support::{diff, rustc}; fn main() { + let ld64_obj = r"ld: warning: object file \(.*\) was built for newer .+ version \(\d+\.\d+\) than being linked \(\d+\.\d+\)"; + let ld_prime_obj = r"ld: warning: object file \(.*\) was built for newer '.+' version \(\d+\.\d+\) than being linked \(\d+\.\d+\)"; + let ld64_dylib = r"ld: warning: dylib \(.*\) was built for newer .+ version \(\d+\.\d+\) than being linked \(\d+\.\d+\)"; + let ld_prime_dylib = r"ld: warning: building for [^ ,]+, but linking with dylib '[^']*' which was built for newer version [0-9.]+"; + + // Test 1: static archive (object file mismatch) cc().arg("-c").arg("-mmacosx-version-min=15.5").output("foo.o").input("foo.c").run(); llvm_ar().obj_to_ar().output_input("libfoo.a", "foo.o").run(); @@ -21,6 +29,29 @@ fn main() { diff() .expected_file("warnings.txt") .actual_text("(rustc -W linker-info)", &warnings) - .normalize(r"\(.*/rmake_out/", "(TEST_DIR/") + .normalize(ld64_obj, "NORMALIZED_OBJECT_DEPLOYMENT_MISMATCH_LINKER_WARNING") + .normalize(ld_prime_obj, "NORMALIZED_OBJECT_DEPLOYMENT_MISMATCH_LINKER_WARNING") + .run(); + + // Test 2: shared library (dylib mismatch) + cc().arg("-shared") + .arg("-mmacosx-version-min=15.5") + .output("libbar.dylib") + .input("foo.c") + .run(); + + let dylib_warnings = rustc() + .arg("-lbar") + .link_arg("-mmacosx-version-min=11.2") + .input("main_dylib.rs") + .crate_type("bin") .run() + .stderr_utf8(); + + diff() + .expected_file("dylib_warnings.txt") + .actual_text("(rustc -W linker-info dylib)", &dylib_warnings) + .normalize(ld64_dylib, "NORMALIZED_DYLIB_DEPLOYMENT_MISMATCH_LINKER_WARNING") + .normalize(ld_prime_dylib, "NORMALIZED_DYLIB_DEPLOYMENT_MISMATCH_LINKER_WARNING") + .run(); } diff --git a/tests/run-make/macos-deployment-target-warning/warnings.txt b/tests/run-make/macos-deployment-target-warning/warnings.txt index ab08c6d9ae5b..ebe9c2b28f22 100644 --- a/tests/run-make/macos-deployment-target-warning/warnings.txt +++ b/tests/run-make/macos-deployment-target-warning/warnings.txt @@ -1,4 +1,4 @@ -warning: ld: warning: object file (TEST_DIR/libfoo.a[2](foo.o)) was built for newer 'macOS' version (15.5) than being linked (11.2) +warning: NORMALIZED_OBJECT_DEPLOYMENT_MISMATCH_LINKER_WARNING | note: the lint level is defined here