From d3fee8dbf311aa916d98912261c16cad1a27b53f Mon Sep 17 00:00:00 2001 From: Camille GILLOT Date: Sat, 6 Aug 2022 23:43:33 +0200 Subject: [PATCH] Refuse to codegen an upstream static. --- compiler/rustc_monomorphize/src/collector.rs | 5 +++++ .../run-make/issue-85401-static-mir/Makefile | 16 ++++++++++++++++ src/test/run-make/issue-85401-static-mir/bar.rs | 4 ++++ src/test/run-make/issue-85401-static-mir/baz.rs | 3 +++ src/test/run-make/issue-85401-static-mir/foo.rs | 5 +++++ 5 files changed, 33 insertions(+) create mode 100644 src/test/run-make/issue-85401-static-mir/Makefile create mode 100644 src/test/run-make/issue-85401-static-mir/bar.rs create mode 100644 src/test/run-make/issue-85401-static-mir/baz.rs create mode 100644 src/test/run-make/issue-85401-static-mir/foo.rs diff --git a/compiler/rustc_monomorphize/src/collector.rs b/compiler/rustc_monomorphize/src/collector.rs index 68b65658c72..96bbf5802e7 100644 --- a/compiler/rustc_monomorphize/src/collector.rs +++ b/compiler/rustc_monomorphize/src/collector.rs @@ -1027,6 +1027,11 @@ fn should_codegen_locally<'tcx>(tcx: TyCtxt<'tcx>, instance: &Instance<'tcx>) -> return false; } + if let DefKind::Static(_) = tcx.def_kind(def_id) { + // We cannot monomorphize statics from upstream crates. + return false; + } + if !tcx.is_mir_available(def_id) { bug!("no MIR available for {:?}", def_id); } diff --git a/src/test/run-make/issue-85401-static-mir/Makefile b/src/test/run-make/issue-85401-static-mir/Makefile new file mode 100644 index 00000000000..5e094cb4d33 --- /dev/null +++ b/src/test/run-make/issue-85401-static-mir/Makefile @@ -0,0 +1,16 @@ +-include ../../run-make-fulldeps/tools.mk + +# Regression test for issue #85401 +# Verify that we do not ICE when trying to access MIR for statics, +# but emit an error when linking. + +OUTPUT_FILE := $(TMPDIR)/build-output + +all: + $(RUSTC) --crate-type rlib --crate-name foo -Crelocation-model=pic --edition=2018 foo.rs -Zalways-encode-mir=yes --emit metadata -o $(TMPDIR)/libfoo.rmeta + $(RUSTC) --crate-type rlib --crate-name bar -Crelocation-model=pic --edition=2018 bar.rs -o $(TMPDIR)/libbar.rlib --extern=foo=$(TMPDIR)/libfoo.rmeta + $(RUSTC) --crate-type bin --crate-name baz -Crelocation-model=pic --edition=2018 baz.rs -o $(TMPDIR)/baz -L $(TMPDIR) --extern=bar=$(TMPDIR)/libbar.rlib > $(OUTPUT_FILE) 2>&1; [ $$? -eq 1 ] + cat $(OUTPUT_FILE) + $(CGREP) 'crate `foo` required to be available in rlib format, but was not found in this form' < $(OUTPUT_FILE) + # -v tests are fragile, hopefully this text won't change + $(CGREP) -v "internal compiler error" < $(OUTPUT_FILE) diff --git a/src/test/run-make/issue-85401-static-mir/bar.rs b/src/test/run-make/issue-85401-static-mir/bar.rs new file mode 100644 index 00000000000..15b12ecf36f --- /dev/null +++ b/src/test/run-make/issue-85401-static-mir/bar.rs @@ -0,0 +1,4 @@ +pub fn bar() { + println!("bar {}", foo::FOO); + foo::foo(); +} diff --git a/src/test/run-make/issue-85401-static-mir/baz.rs b/src/test/run-make/issue-85401-static-mir/baz.rs new file mode 100644 index 00000000000..2ff4c51e5d2 --- /dev/null +++ b/src/test/run-make/issue-85401-static-mir/baz.rs @@ -0,0 +1,3 @@ +fn main() { + bar::bar() +} diff --git a/src/test/run-make/issue-85401-static-mir/foo.rs b/src/test/run-make/issue-85401-static-mir/foo.rs new file mode 100644 index 00000000000..d064c454600 --- /dev/null +++ b/src/test/run-make/issue-85401-static-mir/foo.rs @@ -0,0 +1,5 @@ +pub static FOO: &str = "foo"; + +pub fn foo() { + println!("foo"); +}