From c82a3706f7f4560ae0e742a19a854b3cf755fc62 Mon Sep 17 00:00:00 2001
From: Vadim Petrochenkov <vadim.petrochenkov@gmail.com>
Date: Mon, 23 May 2022 20:27:06 +0300
Subject: [PATCH] rustc: Fix ICE in native library error reporting

---
 compiler/rustc_metadata/src/native_libs.rs               | 9 +++++----
 .../ui/native-library-link-flags/modifiers-override-3.rs | 7 +++++++
 .../modifiers-override-3.stderr                          | 4 ++++
 3 files changed, 16 insertions(+), 4 deletions(-)
 create mode 100644 src/test/ui/native-library-link-flags/modifiers-override-3.rs
 create mode 100644 src/test/ui/native-library-link-flags/modifiers-override-3.stderr

diff --git a/compiler/rustc_metadata/src/native_libs.rs b/compiler/rustc_metadata/src/native_libs.rs
index 8d044be195a..95892d83414 100644
--- a/compiler/rustc_metadata/src/native_libs.rs
+++ b/compiler/rustc_metadata/src/native_libs.rs
@@ -418,10 +418,11 @@ impl<'tcx> Collector<'tcx> {
                             // involved or not, library reordering and kind overriding without
                             // explicit `:rename` in particular.
                             if lib.has_modifiers() || passed_lib.has_modifiers() {
-                                self.tcx.sess.span_err(
-                                    self.tcx.def_span(lib.foreign_module.unwrap()),
-                                    "overriding linking modifiers from command line is not supported"
-                                );
+                                let msg = "overriding linking modifiers from command line is not supported";
+                                match lib.foreign_module {
+                                    Some(def_id) => self.tcx.sess.span_err(self.tcx.def_span(def_id), msg),
+                                    None => self.tcx.sess.err(msg),
+                                };
                             }
                             if passed_lib.kind != NativeLibKind::Unspecified {
                                 lib.kind = passed_lib.kind;
diff --git a/src/test/ui/native-library-link-flags/modifiers-override-3.rs b/src/test/ui/native-library-link-flags/modifiers-override-3.rs
new file mode 100644
index 00000000000..b28c53c6b0a
--- /dev/null
+++ b/src/test/ui/native-library-link-flags/modifiers-override-3.rs
@@ -0,0 +1,7 @@
+// Regression test for issue #97299, one command line library with modifiers
+// overrides another command line library with modifiers.
+
+// compile-flags:-lstatic:+whole-archive=foo -lstatic:+whole-archive=foo
+// error-pattern: overriding linking modifiers from command line is not supported
+
+fn main() {}
diff --git a/src/test/ui/native-library-link-flags/modifiers-override-3.stderr b/src/test/ui/native-library-link-flags/modifiers-override-3.stderr
new file mode 100644
index 00000000000..365e5618100
--- /dev/null
+++ b/src/test/ui/native-library-link-flags/modifiers-override-3.stderr
@@ -0,0 +1,4 @@
+error: overriding linking modifiers from command line is not supported
+
+error: aborting due to previous error
+