about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2014-10-05 10:57:04 +0000
committerbors <bors@rust-lang.org>2014-10-05 10:57:04 +0000
commitc586490715a35d3c9dae17de7f8907c2f73168d3 (patch)
tree52b24e796acafe2ecc781a8ce920eae97080caaa
parentdfbe9eb3b24fdc7ea5c78f96fedec6630476dec7 (diff)
parentcc31d9cabcc6c8ad396c1aae6257a4b5ea25cb46 (diff)
downloadrust-c586490715a35d3c9dae17de7f8907c2f73168d3.tar.gz
rust-c586490715a35d3c9dae17de7f8907c2f73168d3.zip
auto merge of #17785 : P1start/rust/diagnostics, r=alexcrichton
Closes #17765.
Closes #15524.
Closes #14772.
-rw-r--r--src/librustc/middle/typeck/check/_match.rs10
-rw-r--r--src/librustc/middle/typeck/check/mod.rs11
-rw-r--r--src/libsyntax/test.rs37
-rw-r--r--src/test/compile-fail/issue-13482.rs2
-rw-r--r--src/test/compile-fail/issue-14772.rs16
-rw-r--r--src/test/compile-fail/issue-15524.rs24
-rw-r--r--src/test/compile-fail/match-vec-mismatch-2.rs2
-rw-r--r--src/test/compile-fail/tag-variant-disr-dup.rs2
8 files changed, 81 insertions, 23 deletions
diff --git a/src/librustc/middle/typeck/check/_match.rs b/src/librustc/middle/typeck/check/_match.rs
index 17cfa040804..b5af2b26b29 100644
--- a/src/librustc/middle/typeck/check/_match.rs
+++ b/src/librustc/middle/typeck/check/_match.rs
@@ -670,19 +670,19 @@ pub fn check_pat(pcx: &pat_ctxt, pat: &ast::Pat, expected: ty::t) {
                   (ty, default_region_var, ast::MutImmutable, None)
               }
               _ => {
-                  check_err("a vector pattern".to_string());
+                  check_err("an array  pattern".to_string());
                   return;
               }
           },
           ty::ty_rptr(r, mt) => match ty::get(mt.ty).sty {
               ty::ty_vec(ty, None) => (ty, r, mt.mutbl, None),
               _ => {
-                  check_err("a vector pattern".to_string());
+                  check_err("an array pattern".to_string());
                   return;
               }
           },
           _ => {
-              check_err("a vector pattern".to_string());
+              check_err("an array pattern".to_string());
               return;
           }
         };
@@ -690,10 +690,10 @@ pub fn check_pat(pcx: &pat_ctxt, pat: &ast::Pat, expected: ty::t) {
         let min_len = before.len() + after.len();
         fixed.and_then(|count| match *slice {
             Some(_) if count < min_len =>
-                Some(format!("a fixed vector pattern of size at least {}", min_len)),
+                Some(format!("a fixed array pattern of size at least {}", min_len)),
 
             None if count != min_len =>
-                Some(format!("a fixed vector pattern of size {}", min_len)),
+                Some(format!("a fixed array pattern of size {}", min_len)),
 
             _ => None
         }).map(check_err);
diff --git a/src/librustc/middle/typeck/check/mod.rs b/src/librustc/middle/typeck/check/mod.rs
index 8aa78614d2e..bb490273e9f 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/libsyntax/test.rs b/src/libsyntax/test.rs
index 00fdf436636..d2c0ebd4393 100644
--- a/src/libsyntax/test.rs
+++ b/src/libsyntax/test.rs
@@ -274,30 +274,43 @@ fn strip_test_functions(krate: ast::Crate) -> ast::Crate {
 fn is_test_fn(cx: &TestCtxt, i: &ast::Item) -> bool {
     let has_test_attr = attr::contains_name(i.attrs.as_slice(), "test");
 
-    fn has_test_signature(i: &ast::Item) -> bool {
+    #[deriving(PartialEq)]
+    enum HasTestSignature {
+        Yes,
+        No,
+        NotEvenAFunction,
+    }
+
+    fn has_test_signature(i: &ast::Item) -> HasTestSignature {
         match &i.node {
           &ast::ItemFn(ref decl, _, _, ref generics, _) => {
             let no_output = match decl.output.node {
                 ast::TyNil => true,
-                _ => false
+                _ => false,
             };
-            decl.inputs.is_empty()
-                && no_output
-                && !generics.is_parameterized()
+            if decl.inputs.is_empty()
+                   && no_output
+                   && !generics.is_parameterized() {
+                Yes
+            } else {
+                No
+            }
           }
-          _ => false
+          _ => NotEvenAFunction,
         }
     }
 
-    if has_test_attr && !has_test_signature(i) {
+    if has_test_attr {
         let diag = cx.span_diagnostic;
-        diag.span_err(
-            i.span,
-            "functions used as tests must have signature fn() -> ()."
-        );
+        match has_test_signature(i) {
+            Yes => {},
+            No => diag.span_err(i.span, "functions used as tests must have signature fn() -> ()"),
+            NotEvenAFunction => diag.span_err(i.span,
+                                              "only functions may be used as tests"),
+        }
     }
 
-    return has_test_attr && has_test_signature(i);
+    return has_test_attr && has_test_signature(i) == Yes;
 }
 
 fn is_bench_fn(cx: &TestCtxt, i: &ast::Item) -> bool {
diff --git a/src/test/compile-fail/issue-13482.rs b/src/test/compile-fail/issue-13482.rs
index e5d87395286..2c7b56f9dc7 100644
--- a/src/test/compile-fail/issue-13482.rs
+++ b/src/test/compile-fail/issue-13482.rs
@@ -12,7 +12,7 @@ fn main() {
   let x = [1,2];
   let y = match x {
     [] => None,
-//~^ ERROR expected `[<generic integer #0>, ..2]`, found a fixed vector pattern of size 0
+//~^ ERROR expected `[<generic integer #0>, ..2]`, found a fixed array pattern of size 0
     [a,_] => Some(a)
   };
 }
diff --git a/src/test/compile-fail/issue-14772.rs b/src/test/compile-fail/issue-14772.rs
new file mode 100644
index 00000000000..aaaad67be52
--- /dev/null
+++ b/src/test/compile-fail/issue-14772.rs
@@ -0,0 +1,16 @@
+// 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.
+
+// compile-flags: --test
+
+#[test]
+mod foo {} //~ ERROR only functions may be used as tests
+
+fn main() {}
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/match-vec-mismatch-2.rs b/src/test/compile-fail/match-vec-mismatch-2.rs
index fee49ad8fdb..e095c7c2408 100644
--- a/src/test/compile-fail/match-vec-mismatch-2.rs
+++ b/src/test/compile-fail/match-vec-mismatch-2.rs
@@ -10,6 +10,6 @@
 
 fn main() {
     match () {
-        [()] => { } //~ ERROR mismatched types: expected `()`, found a vector pattern
+        [()] => { } //~ ERROR mismatched types: expected `()`, found an array pattern
     }
 }
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 ...