about summary refs log tree commit diff
diff options
context:
space:
mode:
authorP1start <rewi-github@whanau.org>2014-10-05 12:18:04 +1300
committerP1start <rewi-github@whanau.org>2014-10-05 14:16:32 +1300
commita29df44f51f950549957128ad1b65b2576a48383 (patch)
tree52463b204a4ba3f5bd62b03470e8419a773d412f
parent88baca7486607bb9799ab338afdf088b4cf9e2bd (diff)
downloadrust-a29df44f51f950549957128ad1b65b2576a48383.tar.gz
rust-a29df44f51f950549957128ad1b65b2576a48383.zip
Tweak ‘discriminant value already exists’ error message
Closes #15524.
-rw-r--r--src/librustc/middle/typeck/check/mod.rs11
-rw-r--r--src/test/compile-fail/issue-15524.rs24
-rw-r--r--src/test/compile-fail/tag-variant-disr-dup.rs2
3 files changed, 33 insertions, 4 deletions
diff --git a/src/librustc/middle/typeck/check/mod.rs b/src/librustc/middle/typeck/check/mod.rs
index ca5d711d360..315074e19c3 100644
--- a/src/librustc/middle/typeck/check/mod.rs
+++ b/src/librustc/middle/typeck/check/mod.rs
@@ -5004,9 +5004,14 @@ pub fn check_enum_variants(ccx: &CrateCtxt,
             };
 
             // Check for duplicate discriminant values
-            if disr_vals.contains(&current_disr_val) {
-                span_err!(ccx.tcx.sess, v.span, E0081,
-                    "discriminant value already exists");
+            match disr_vals.iter().position(|&x| x == current_disr_val) {
+                Some(i) => {
+                    span_err!(ccx.tcx.sess, v.span, E0081,
+                        "discriminant value `{}` already exists", disr_vals[i]);
+                    span_note!(ccx.tcx.sess, ccx.tcx().map.span(variants[i].id.node),
+                        "conflicting discriminant here")
+                }
+                None => {}
             }
             // Check for unrepresentable discriminant values
             match hint {
diff --git a/src/test/compile-fail/issue-15524.rs b/src/test/compile-fail/issue-15524.rs
new file mode 100644
index 00000000000..1e7bd6fc623
--- /dev/null
+++ b/src/test/compile-fail/issue-15524.rs
@@ -0,0 +1,24 @@
+// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+static N: int = 1;
+
+enum Foo {
+    A = 1,
+    B = 1, //~ ERROR discriminant value `1` already exists
+    //~^^ NOTE conflicting
+    C = 0,
+    D, //~ ERROR discriminant value `1` already exists
+    //~^^^^^ NOTE conflicting
+    E = N, //~ ERROR discriminant value `1` already exists
+    //~^^^^^^^ NOTE conflicting
+}
+
+fn main() {}
diff --git a/src/test/compile-fail/tag-variant-disr-dup.rs b/src/test/compile-fail/tag-variant-disr-dup.rs
index d0608ec4c19..5da5bb85409 100644
--- a/src/test/compile-fail/tag-variant-disr-dup.rs
+++ b/src/test/compile-fail/tag-variant-disr-dup.rs
@@ -8,7 +8,7 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
-//error-pattern:discriminant value already exists
+//error-pattern:discriminant value
 
 // black and white have the same discriminator value ...