about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--compiler/rustc_passes/src/lang_items.rs4
-rw-r--r--tests/ui/lang-items/duplicate.rs10
-rw-r--r--tests/ui/lang-items/duplicate.stderr13
-rw-r--r--tests/ui/traits/issue-102989.rs15
-rw-r--r--tests/ui/traits/issue-102989.stderr48
5 files changed, 26 insertions, 64 deletions
diff --git a/compiler/rustc_passes/src/lang_items.rs b/compiler/rustc_passes/src/lang_items.rs
index 6aeaa8945fb..9a21397789d 100644
--- a/compiler/rustc_passes/src/lang_items.rs
+++ b/compiler/rustc_passes/src/lang_items.rs
@@ -149,7 +149,9 @@ impl<'ast, 'tcx> LanguageItemCollector<'ast, 'tcx> {
                 }
             };
 
-            self.tcx.dcx().emit_err(DuplicateLangItem {
+            // When there's a duplicate lang item, something went very wrong and there's no value in recovering or doing anything.
+            // Give the user the one message to let them debug the mess they created and then wish them farewell.
+            self.tcx.dcx().emit_fatal(DuplicateLangItem {
                 local_span: item_span,
                 lang_item_name,
                 crate_name,
diff --git a/tests/ui/lang-items/duplicate.rs b/tests/ui/lang-items/duplicate.rs
new file mode 100644
index 00000000000..f88d2354414
--- /dev/null
+++ b/tests/ui/lang-items/duplicate.rs
@@ -0,0 +1,10 @@
+// normalize-stderr-test "loaded from .*libcore-.*.rlib" -> "loaded from SYSROOT/libcore-*.rlib"
+#![feature(lang_items)]
+
+#[lang = "sized"]
+trait Sized {}
+//~^ ERROR: duplicate lang item
+
+#[lang = "tuple_trait"]
+pub trait Tuple {}
+// no error
diff --git a/tests/ui/lang-items/duplicate.stderr b/tests/ui/lang-items/duplicate.stderr
new file mode 100644
index 00000000000..aaa8f5e605a
--- /dev/null
+++ b/tests/ui/lang-items/duplicate.stderr
@@ -0,0 +1,13 @@
+error[E0152]: found duplicate lang item `sized`
+  --> $DIR/duplicate.rs:5:1
+   |
+LL | trait Sized {}
+   | ^^^^^^^^^^^^^^
+   |
+   = note: the lang item is first defined in crate `core` (which `std` depends on)
+   = note: first definition in `core` loaded from SYSROOT/libcore-*.rlib
+   = note: second definition in the local crate (`duplicate`)
+
+error: aborting due to 1 previous error
+
+For more information about this error, try `rustc --explain E0152`.
diff --git a/tests/ui/traits/issue-102989.rs b/tests/ui/traits/issue-102989.rs
deleted file mode 100644
index f1ecee0a552..00000000000
--- a/tests/ui/traits/issue-102989.rs
+++ /dev/null
@@ -1,15 +0,0 @@
-// normalize-stderr-test "loaded from .*libcore-.*.rlib" -> "loaded from SYSROOT/libcore-*.rlib"
-
-#![feature(lang_items)]
-#[lang="sized"]
-trait Sized { } //~ ERROR found duplicate lang item `sized`
-
-fn ref_Struct(self: &Struct, f: &u32) -> &u32 {
-    //~^ ERROR `self` parameter is only allowed in associated functions
-    //~| ERROR cannot find type `Struct` in this scope
-    //~| ERROR mismatched types
-    let x = x << 1;
-    //~^ ERROR cannot find value `x` in this scope
-}
-
-fn main() {}
diff --git a/tests/ui/traits/issue-102989.stderr b/tests/ui/traits/issue-102989.stderr
deleted file mode 100644
index 40e49df2b2d..00000000000
--- a/tests/ui/traits/issue-102989.stderr
+++ /dev/null
@@ -1,48 +0,0 @@
-error: `self` parameter is only allowed in associated functions
-  --> $DIR/issue-102989.rs:7:15
-   |
-LL | fn ref_Struct(self: &Struct, f: &u32) -> &u32 {
-   |               ^^^^ not semantically valid as function parameter
-   |
-   = note: associated functions are those in `impl` or `trait` definitions
-
-error[E0412]: cannot find type `Struct` in this scope
-  --> $DIR/issue-102989.rs:7:22
-   |
-LL | fn ref_Struct(self: &Struct, f: &u32) -> &u32 {
-   |                      ^^^^^^ not found in this scope
-
-error[E0425]: cannot find value `x` in this scope
-  --> $DIR/issue-102989.rs:11:13
-   |
-LL |     let x = x << 1;
-   |             ^ help: a local variable with a similar name exists: `f`
-
-error[E0152]: found duplicate lang item `sized`
-  --> $DIR/issue-102989.rs:5:1
-   |
-LL | trait Sized { }
-   | ^^^^^^^^^^^^^^^
-   |
-   = note: the lang item is first defined in crate `core` (which `std` depends on)
-   = note: first definition in `core` loaded from SYSROOT/libcore-*.rlib
-   = note: second definition in the local crate (`issue_102989`)
-
-error[E0308]: mismatched types
-  --> $DIR/issue-102989.rs:7:42
-   |
-LL | fn ref_Struct(self: &Struct, f: &u32) -> &u32 {
-   |    ----------                            ^^^^ expected `&u32`, found `()`
-   |    |
-   |    implicitly returns `()` as its body has no tail or `return` expression
-   |
-help: consider returning the local binding `f`
-   |
-LL ~     let x = x << 1;
-LL +     f
-   |
-
-error: aborting due to 5 previous errors
-
-Some errors have detailed explanations: E0152, E0308, E0412, E0425.
-For more information about an error, try `rustc --explain E0152`.