From 88baca7486607bb9799ab338afdf088b4cf9e2bd Mon Sep 17 00:00:00 2001 From: P1start Date: Sun, 5 Oct 2014 12:08:37 +1300 Subject: [PATCH 1/3] Rename vector patterns to array patterns Closes #17765. --- src/librustc/middle/typeck/check/_match.rs | 10 +++++----- src/test/compile-fail/issue-13482.rs | 2 +- src/test/compile-fail/match-vec-mismatch-2.rs | 2 +- 3 files changed, 7 insertions(+), 7 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/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 `[, ..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/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 } } From a29df44f51f950549957128ad1b65b2576a48383 Mon Sep 17 00:00:00 2001 From: P1start Date: Sun, 5 Oct 2014 12:18:04 +1300 Subject: [PATCH 2/3] =?UTF-8?q?Tweak=20=E2=80=98discriminant=20value=20alr?= =?UTF-8?q?eady=20exists=E2=80=99=20error=20message?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes #15524. --- src/librustc/middle/typeck/check/mod.rs | 11 ++++++--- src/test/compile-fail/issue-15524.rs | 24 +++++++++++++++++++ src/test/compile-fail/tag-variant-disr-dup.rs | 2 +- 3 files changed, 33 insertions(+), 4 deletions(-) create mode 100644 src/test/compile-fail/issue-15524.rs 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 @@ fn do_check(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/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 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/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 ... From cc31d9cabcc6c8ad396c1aae6257a4b5ea25cb46 Mon Sep 17 00:00:00 2001 From: P1start Date: Sun, 5 Oct 2014 12:27:42 +1300 Subject: [PATCH 3/3] Give a more descriptive error when marking non-test items as #[test] Closes #14772. --- src/libsyntax/test.rs | 37 +++++++++++++++++++--------- src/test/compile-fail/issue-14772.rs | 16 ++++++++++++ 2 files changed, 41 insertions(+), 12 deletions(-) create mode 100644 src/test/compile-fail/issue-14772.rs 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-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 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() {}