From b219bd5062c327f0eb25df2deff7fedd04c4754d Mon Sep 17 00:00:00 2001 From: Niko Matsakis Date: Tue, 25 Nov 2014 07:42:16 -0500 Subject: [PATCH] Add tests for the parsing of `+` and the error messages if people get it wrong. Fixes #18772. --- .../hrtb-precedence-of-plus-error-message.rs | 36 +++++++++++++++++++ .../hrtb-precedence-of-plus-where-clause.rs | 27 ++++++++++++++ src/test/run-pass/hrtb-precedence-of-plus.rs | 21 +++++++++++ 3 files changed, 84 insertions(+) create mode 100644 src/test/compile-fail/hrtb-precedence-of-plus-error-message.rs create mode 100644 src/test/run-pass/hrtb-precedence-of-plus-where-clause.rs create mode 100644 src/test/run-pass/hrtb-precedence-of-plus.rs diff --git a/src/test/compile-fail/hrtb-precedence-of-plus-error-message.rs b/src/test/compile-fail/hrtb-precedence-of-plus-error-message.rs new file mode 100644 index 0000000000000..ff3512ad8e72a --- /dev/null +++ b/src/test/compile-fail/hrtb-precedence-of-plus-error-message.rs @@ -0,0 +1,36 @@ +// 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. + +#![feature(unboxed_closures)] + +// Test that we suggest the correct parentheses + +trait Bar { + fn dummy(&self) { } +} + +struct Foo<'a> { + a: &'a Bar+'a, + //~^ ERROR E0171 + //~^^ NOTE perhaps you meant `&'a (Bar + 'a)`? + + b: &'a mut Bar+'a, + //~^ ERROR E0171 + //~^^ NOTE perhaps you meant `&'a mut (Bar + 'a)`? + + c: Box, // OK, no paren needed in this context + + d: fn() -> Bar+'a, + //~^ ERROR E0171 + //~^^ NOTE perhaps you forgot parentheses + //~^^^ WARN deprecated syntax +} + +fn main() { } diff --git a/src/test/run-pass/hrtb-precedence-of-plus-where-clause.rs b/src/test/run-pass/hrtb-precedence-of-plus-where-clause.rs new file mode 100644 index 0000000000000..f942abe55c366 --- /dev/null +++ b/src/test/run-pass/hrtb-precedence-of-plus-where-clause.rs @@ -0,0 +1,27 @@ +// 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. + +#![feature(unboxed_closures)] + +// Test that `F : Fn(int) -> int + Send` is interpreted as two +// distinct bounds on `F`. + +fn foo(f: F) + where F : FnOnce(int) -> int + Send +{ + bar(&f); + baz(&f); +} + +fn bar(f: &F) { } + +fn baz int>(f: &F) { } + +fn main() {} diff --git a/src/test/run-pass/hrtb-precedence-of-plus.rs b/src/test/run-pass/hrtb-precedence-of-plus.rs new file mode 100644 index 0000000000000..9a43b5b711eb5 --- /dev/null +++ b/src/test/run-pass/hrtb-precedence-of-plus.rs @@ -0,0 +1,21 @@ +// 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. + +#![feature(unboxed_closures)] + +// Test that `Fn(int) -> int + 'static` parses as `(Fn(int) -> int) + +// 'static` and not `Fn(int) -> (int + 'static)`. The latter would +// cause a compilation error. Issue #18772. + +fn adder(y: int) -> Box int + 'static> { + box move |&: x| y + x +} + +fn main() {}