Skip to content

Commit

Permalink
Refuse to codegen an upstream static.
Browse files Browse the repository at this point in the history
  • Loading branch information
cjgillot committed Aug 10, 2022
1 parent cc4dd6f commit d3fee8d
Show file tree
Hide file tree
Showing 5 changed files with 33 additions and 0 deletions.
5 changes: 5 additions & 0 deletions compiler/rustc_monomorphize/src/collector.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down
16 changes: 16 additions & 0 deletions src/test/run-make/issue-85401-static-mir/Makefile
Original file line number Diff line number Diff line change
@@ -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)
4 changes: 4 additions & 0 deletions src/test/run-make/issue-85401-static-mir/bar.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
pub fn bar() {
println!("bar {}", foo::FOO);
foo::foo();
}
3 changes: 3 additions & 0 deletions src/test/run-make/issue-85401-static-mir/baz.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
fn main() {
bar::bar()
}
5 changes: 5 additions & 0 deletions src/test/run-make/issue-85401-static-mir/foo.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
pub static FOO: &str = "foo";

pub fn foo() {
println!("foo");
}

0 comments on commit d3fee8d

Please sign in to comment.