diff --git a/src/librustc/middle/typeck/check/_match.rs b/src/librustc/middle/typeck/check/_match.rs index 17cfa040804e1..b5af2b26b295b 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 ca5d711d360ab..315074e19c3a3 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(¤t_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 00fdf43663673..d2c0ebd439319 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 e5d87395286e4..2c7b56f9dc7f7 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 `[, ..2]`, found a fixed vector pattern of size 0 +//~^ ERROR expected `[, ..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 0000000000000..aaaad67be52dd --- /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 or the MIT license +// , 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 0000000000000..1e7bd6fc623a8 --- /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 or the MIT license +// , 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 fee49ad8fdb06..e095c7c240859 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 d0608ec4c1927..5da5bb854097d 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 ...