From 21aa149b0bc7f6321bf03f5f5df75b4d16bdb406 Mon Sep 17 00:00:00 2001 From: "Felix S. Klock II" Date: Fri, 24 May 2019 14:59:19 +0200 Subject: [PATCH 1/5] Move existing `#[linkage]` tests to a subdirectory where I can add more tests. --- src/test/ui/{ => linkage-attr}/linkage2.rs | 0 src/test/ui/{ => linkage-attr}/linkage2.stderr | 0 src/test/ui/{ => linkage-attr}/linkage3.rs | 0 src/test/ui/{ => linkage-attr}/linkage3.stderr | 0 src/test/ui/{ => linkage-attr}/linkage4.rs | 0 src/test/ui/{ => linkage-attr}/linkage4.stderr | 0 6 files changed, 0 insertions(+), 0 deletions(-) rename src/test/ui/{ => linkage-attr}/linkage2.rs (100%) rename src/test/ui/{ => linkage-attr}/linkage2.stderr (100%) rename src/test/ui/{ => linkage-attr}/linkage3.rs (100%) rename src/test/ui/{ => linkage-attr}/linkage3.stderr (100%) rename src/test/ui/{ => linkage-attr}/linkage4.rs (100%) rename src/test/ui/{ => linkage-attr}/linkage4.stderr (100%) diff --git a/src/test/ui/linkage2.rs b/src/test/ui/linkage-attr/linkage2.rs similarity index 100% rename from src/test/ui/linkage2.rs rename to src/test/ui/linkage-attr/linkage2.rs diff --git a/src/test/ui/linkage2.stderr b/src/test/ui/linkage-attr/linkage2.stderr similarity index 100% rename from src/test/ui/linkage2.stderr rename to src/test/ui/linkage-attr/linkage2.stderr diff --git a/src/test/ui/linkage3.rs b/src/test/ui/linkage-attr/linkage3.rs similarity index 100% rename from src/test/ui/linkage3.rs rename to src/test/ui/linkage-attr/linkage3.rs diff --git a/src/test/ui/linkage3.stderr b/src/test/ui/linkage-attr/linkage3.stderr similarity index 100% rename from src/test/ui/linkage3.stderr rename to src/test/ui/linkage-attr/linkage3.stderr diff --git a/src/test/ui/linkage4.rs b/src/test/ui/linkage-attr/linkage4.rs similarity index 100% rename from src/test/ui/linkage4.rs rename to src/test/ui/linkage-attr/linkage4.rs diff --git a/src/test/ui/linkage4.stderr b/src/test/ui/linkage-attr/linkage4.stderr similarity index 100% rename from src/test/ui/linkage4.stderr rename to src/test/ui/linkage-attr/linkage4.stderr From 64edaec6b35ea32e8dffbe27ff123c4a090869a8 Mon Sep 17 00:00:00 2001 From: "Felix S. Klock II" Date: Fri, 24 May 2019 14:11:39 +0200 Subject: [PATCH 2/5] Always supply span to check_and_apply_linkage, sidestepping need to add `bug!`s to rustc. --- src/librustc_codegen_llvm/consts.rs | 22 ++++++---------------- 1 file changed, 6 insertions(+), 16 deletions(-) diff --git a/src/librustc_codegen_llvm/consts.rs b/src/librustc_codegen_llvm/consts.rs index 5f47108309fbf..23e2bfe1ad195 100644 --- a/src/librustc_codegen_llvm/consts.rs +++ b/src/librustc_codegen_llvm/consts.rs @@ -102,7 +102,7 @@ fn check_and_apply_linkage( attrs: &CodegenFnAttrs, ty: Ty<'tcx>, sym: LocalInternedString, - span: Option + span: Span ) -> &'ll Value { let llty = cx.layout_of(ty).llvm_type(cx); if let Some(linkage) = attrs.linkage { @@ -116,11 +116,7 @@ fn check_and_apply_linkage( let llty2 = if let ty::RawPtr(ref mt) = ty.sty { cx.layout_of(mt.ty).llvm_type(cx) } else { - if let Some(span) = span { - cx.sess().span_fatal(span, "must have type `*const T` or `*mut T`") - } else { - bug!("must have type `*const T` or `*mut T`") - } + cx.sess().span_fatal(span, "must have type `*const T` or `*mut T`") }; unsafe { // Declare a symbol `foo` with the desired linkage. @@ -136,14 +132,7 @@ fn check_and_apply_linkage( let mut real_name = "_rust_extern_with_linkage_".to_string(); real_name.push_str(&sym); let g2 = cx.define_global(&real_name, llty).unwrap_or_else(||{ - if let Some(span) = span { - cx.sess().span_fatal( - span, - &format!("symbol `{}` is already defined", &sym) - ) - } else { - bug!("symbol `{}` is already defined", &sym) - } + cx.sess().span_fatal(span, &format!("symbol `{}` is already defined", &sym)) }); llvm::LLVMRustSetLinkage(g2, llvm::Linkage::InternalLinkage); llvm::LLVMSetInitializer(g2, g1); @@ -240,7 +229,7 @@ impl CodegenCx<'ll, 'tcx> { ref attrs, span, node: hir::ForeignItemKind::Static(..), .. }) => { let fn_attrs = self.tcx.codegen_fn_attrs(def_id); - (check_and_apply_linkage(&self, &fn_attrs, ty, sym, Some(span)), attrs) + (check_and_apply_linkage(&self, &fn_attrs, ty, sym, span), attrs) } item => bug!("get_static: expected static, found {:?}", item) @@ -260,7 +249,8 @@ impl CodegenCx<'ll, 'tcx> { debug!("get_static: sym={} item_attr={:?}", sym, self.tcx.item_attrs(def_id)); let attrs = self.tcx.codegen_fn_attrs(def_id); - let g = check_and_apply_linkage(&self, &attrs, ty, sym, None); + let span = self.tcx.def_span(def_id); + let g = check_and_apply_linkage(&self, &attrs, ty, sym, span); // Thread-local statics in some other crate need to *always* be linked // against in a thread-local fashion, so we need to be sure to apply the From 444f2bae5920a93677a9de6063897e5ce00491e7 Mon Sep 17 00:00:00 2001 From: "Felix S. Klock II" Date: Fri, 24 May 2019 14:55:15 +0200 Subject: [PATCH 3/5] Refine the message to at least *mention* the attribute itself. Update pre-existing test's diagnostic output accordingly. --- src/librustc_codegen_llvm/consts.rs | 3 ++- src/test/ui/linkage-attr/linkage2.rs | 2 +- src/test/ui/linkage-attr/linkage2.stderr | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/librustc_codegen_llvm/consts.rs b/src/librustc_codegen_llvm/consts.rs index 23e2bfe1ad195..99b5cf42551fa 100644 --- a/src/librustc_codegen_llvm/consts.rs +++ b/src/librustc_codegen_llvm/consts.rs @@ -116,7 +116,8 @@ fn check_and_apply_linkage( let llty2 = if let ty::RawPtr(ref mt) = ty.sty { cx.layout_of(mt.ty).llvm_type(cx) } else { - cx.sess().span_fatal(span, "must have type `*const T` or `*mut T`") + cx.sess().span_fatal( + span, "must have type `*const T` or `*mut T` due to `#[linkage]` attribute") }; unsafe { // Declare a symbol `foo` with the desired linkage. diff --git a/src/test/ui/linkage-attr/linkage2.rs b/src/test/ui/linkage-attr/linkage2.rs index f9ea5319d54c6..c8af1a69979a0 100644 --- a/src/test/ui/linkage-attr/linkage2.rs +++ b/src/test/ui/linkage-attr/linkage2.rs @@ -7,7 +7,7 @@ extern { #[linkage = "extern_weak"] static foo: i32; - //~^ ERROR: must have type `*const T` or `*mut T` + //~^ ERROR: must have type `*const T` or `*mut T` due to `#[linkage]` attribute } fn main() { diff --git a/src/test/ui/linkage-attr/linkage2.stderr b/src/test/ui/linkage-attr/linkage2.stderr index 8326c0bacccb6..2654ffd67b678 100644 --- a/src/test/ui/linkage-attr/linkage2.stderr +++ b/src/test/ui/linkage-attr/linkage2.stderr @@ -1,4 +1,4 @@ -error: must have type `*const T` or `*mut T` +error: must have type `*const T` or `*mut T` due to `#[linkage]` attribute --> $DIR/linkage2.rs:9:32 | LL | #[linkage = "extern_weak"] static foo: i32; From 4e60f53280c34d35c29b007b28e32b9a6f695d1b Mon Sep 17 00:00:00 2001 From: "Felix S. Klock II" Date: Fri, 24 May 2019 15:13:16 +0200 Subject: [PATCH 4/5] Regression test for issue #59548. --- .../ui/linkage-attr/auxiliary/def_illtyped_external.rs | 5 +++++ src/test/ui/linkage-attr/linkage-requires-raw-ptr.rs | 10 ++++++++++ .../ui/linkage-attr/linkage-requires-raw-ptr.stderr | 8 ++++++++ 3 files changed, 23 insertions(+) create mode 100644 src/test/ui/linkage-attr/auxiliary/def_illtyped_external.rs create mode 100644 src/test/ui/linkage-attr/linkage-requires-raw-ptr.rs create mode 100644 src/test/ui/linkage-attr/linkage-requires-raw-ptr.stderr diff --git a/src/test/ui/linkage-attr/auxiliary/def_illtyped_external.rs b/src/test/ui/linkage-attr/auxiliary/def_illtyped_external.rs new file mode 100644 index 0000000000000..2300930e513af --- /dev/null +++ b/src/test/ui/linkage-attr/auxiliary/def_illtyped_external.rs @@ -0,0 +1,5 @@ +#![feature(linkage)] +#![crate_type = "lib"] + +#[linkage="external"] +pub static EXTERN: u32 = 0; diff --git a/src/test/ui/linkage-attr/linkage-requires-raw-ptr.rs b/src/test/ui/linkage-attr/linkage-requires-raw-ptr.rs new file mode 100644 index 0000000000000..014c715be0d3b --- /dev/null +++ b/src/test/ui/linkage-attr/linkage-requires-raw-ptr.rs @@ -0,0 +1,10 @@ +// rust-lang/rust#59548: We used to ICE when trying to use a static +// with a type that violated its own `#[linkage]`. + +// aux-build:def_illtyped_external.rs + +extern crate def_illtyped_external as dep; + +fn main() { + println!("{:p}", &dep::EXTERN); +} diff --git a/src/test/ui/linkage-attr/linkage-requires-raw-ptr.stderr b/src/test/ui/linkage-attr/linkage-requires-raw-ptr.stderr new file mode 100644 index 0000000000000..a80b495f97fa3 --- /dev/null +++ b/src/test/ui/linkage-attr/linkage-requires-raw-ptr.stderr @@ -0,0 +1,8 @@ +error: must have type `*const T` or `*mut T` due to `#[linkage]` attribute + --> $DIR/auxiliary/def_illtyped_external.rs:5:1 + | +LL | pub static EXTERN: u32 = 0; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to previous error + From c8887abf20f72631eeeb72eaf14fa27fc4e550fa Mon Sep 17 00:00:00 2001 From: "Felix S. Klock II" Date: Mon, 27 May 2019 12:08:10 +0200 Subject: [PATCH 5/5] Tests for external linkage symbol collision check. Fix #61232 --- .../auxiliary/def_colliding_external.rs | 7 ++++++ ...-detect-extern-generated-name-collision.rs | 21 +++++++++++++++++ ...ect-extern-generated-name-collision.stderr | 8 +++++++ ...e-detect-local-generated-name-collision.rs | 23 +++++++++++++++++++ ...tect-local-generated-name-collision.stderr | 8 +++++++ 5 files changed, 67 insertions(+) create mode 100644 src/test/ui/linkage-attr/auxiliary/def_colliding_external.rs create mode 100644 src/test/ui/linkage-attr/linkage-detect-extern-generated-name-collision.rs create mode 100644 src/test/ui/linkage-attr/linkage-detect-extern-generated-name-collision.stderr create mode 100644 src/test/ui/linkage-attr/linkage-detect-local-generated-name-collision.rs create mode 100644 src/test/ui/linkage-attr/linkage-detect-local-generated-name-collision.stderr diff --git a/src/test/ui/linkage-attr/auxiliary/def_colliding_external.rs b/src/test/ui/linkage-attr/auxiliary/def_colliding_external.rs new file mode 100644 index 0000000000000..bbbfc4857918d --- /dev/null +++ b/src/test/ui/linkage-attr/auxiliary/def_colliding_external.rs @@ -0,0 +1,7 @@ +#![feature(linkage)] +#![crate_type = "lib"] + +extern { + #[linkage="external"] + pub static collision: *const i32; +} diff --git a/src/test/ui/linkage-attr/linkage-detect-extern-generated-name-collision.rs b/src/test/ui/linkage-attr/linkage-detect-extern-generated-name-collision.rs new file mode 100644 index 0000000000000..85a9a336b0d64 --- /dev/null +++ b/src/test/ui/linkage-attr/linkage-detect-extern-generated-name-collision.rs @@ -0,0 +1,21 @@ +// rust-lang/rust#61232: We used to ICE when trying to detect a +// collision on the symbol generated for the external linkage item in +// an extern crate. + +// aux-build:def_colliding_external.rs + +extern crate def_colliding_external as dep1; + +#[no_mangle] +pub static _rust_extern_with_linkage_collision: i32 = 0; + +mod dep2 { + #[no_mangle] + pub static collision: usize = 0; +} + +fn main() { + unsafe { + println!("{:p}", &dep1::collision); + } +} diff --git a/src/test/ui/linkage-attr/linkage-detect-extern-generated-name-collision.stderr b/src/test/ui/linkage-attr/linkage-detect-extern-generated-name-collision.stderr new file mode 100644 index 0000000000000..dcb954a4bc0c1 --- /dev/null +++ b/src/test/ui/linkage-attr/linkage-detect-extern-generated-name-collision.stderr @@ -0,0 +1,8 @@ +error: symbol `collision` is already defined + --> $DIR/auxiliary/def_colliding_external.rs:6:5 + | +LL | pub static collision: *const i32; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to previous error + diff --git a/src/test/ui/linkage-attr/linkage-detect-local-generated-name-collision.rs b/src/test/ui/linkage-attr/linkage-detect-local-generated-name-collision.rs new file mode 100644 index 0000000000000..dc15798e16a6a --- /dev/null +++ b/src/test/ui/linkage-attr/linkage-detect-local-generated-name-collision.rs @@ -0,0 +1,23 @@ +#![feature(linkage)] + +mod dep1 { + extern { + #[linkage="external"] + #[no_mangle] + pub static collision: *const i32; //~ ERROR symbol `collision` is already defined + } +} + +#[no_mangle] +pub static _rust_extern_with_linkage_collision: i32 = 0; + +mod dep2 { + #[no_mangle] + pub static collision: usize = 0; +} + +fn main() { + unsafe { + println!("{:p}", &dep1::collision); + } +} diff --git a/src/test/ui/linkage-attr/linkage-detect-local-generated-name-collision.stderr b/src/test/ui/linkage-attr/linkage-detect-local-generated-name-collision.stderr new file mode 100644 index 0000000000000..117c76f7f26c7 --- /dev/null +++ b/src/test/ui/linkage-attr/linkage-detect-local-generated-name-collision.stderr @@ -0,0 +1,8 @@ +error: symbol `collision` is already defined + --> $DIR/linkage-detect-local-generated-name-collision.rs:7:9 + | +LL | pub static collision: *const i32; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to previous error +