From 604af3f6c0be6ea428a55cfcb303fa1cd1c7958d Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Mon, 11 Aug 2014 09:32:26 -0700 Subject: librustc: Implement simple `where` clauses. These `where` clauses are accepted everywhere generics are currently accepted and desugar during type collection to the type parameter bounds we have today. A new keyword, `where`, has been added. Therefore, this is a breaking change. Change uses of `where` to other identifiers. [breaking-change] --- src/test/auxiliary/where_clauses_xc.rs | 30 ++++++++++++++++++ .../where-clauses-no-bounds-or-predicates.rs | 23 ++++++++++++++ .../compile-fail/where-clauses-not-parameter.rs | 17 ++++++++++ src/test/compile-fail/where-clauses-unsatisfied.rs | 20 ++++++++++++ src/test/run-pass/where-clauses-cross-crate.rs | 23 ++++++++++++++ src/test/run-pass/where-clauses.rs | 37 ++++++++++++++++++++++ 6 files changed, 150 insertions(+) create mode 100644 src/test/auxiliary/where_clauses_xc.rs create mode 100644 src/test/compile-fail/where-clauses-no-bounds-or-predicates.rs create mode 100644 src/test/compile-fail/where-clauses-not-parameter.rs create mode 100644 src/test/compile-fail/where-clauses-unsatisfied.rs create mode 100644 src/test/run-pass/where-clauses-cross-crate.rs create mode 100644 src/test/run-pass/where-clauses.rs (limited to 'src/test') diff --git a/src/test/auxiliary/where_clauses_xc.rs b/src/test/auxiliary/where_clauses_xc.rs new file mode 100644 index 00000000000..002b31f099f --- /dev/null +++ b/src/test/auxiliary/where_clauses_xc.rs @@ -0,0 +1,30 @@ +// 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. + +pub trait Equal { + fn equal(&self, other: &Self) -> bool; + fn equals(&self, this: &T, that: &T, x: &U, y: &U) -> bool + where T: Eq, U: Eq; +} + +impl Equal for T where T: Eq { + fn equal(&self, other: &T) -> bool { + self == other + } + fn equals(&self, this: &U, other: &U, x: &X, y: &X) -> bool + where U: Eq, X: Eq { + this == other && x == y + } +} + +pub fn equal(x: &T, y: &T) -> bool where T: Eq { + x == y +} + diff --git a/src/test/compile-fail/where-clauses-no-bounds-or-predicates.rs b/src/test/compile-fail/where-clauses-no-bounds-or-predicates.rs new file mode 100644 index 00000000000..b96c7c2de6b --- /dev/null +++ b/src/test/compile-fail/where-clauses-no-bounds-or-predicates.rs @@ -0,0 +1,23 @@ +// 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. + +fn equal1(_: &T, _: &T) -> bool where { +//~^ ERROR a `where` clause must have at least one predicate in it + true +} + +fn equal2(_: &T, _: &T) -> bool where T: { +//~^ ERROR each predicate in a `where` clause must have at least one bound + true +} + +fn main() { +} + diff --git a/src/test/compile-fail/where-clauses-not-parameter.rs b/src/test/compile-fail/where-clauses-not-parameter.rs new file mode 100644 index 00000000000..2817aa16e8e --- /dev/null +++ b/src/test/compile-fail/where-clauses-not-parameter.rs @@ -0,0 +1,17 @@ +// 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. + +fn equal(_: &T, _: &T) -> bool where int : Eq { + //~^ ERROR undeclared type parameter +} + +fn main() { +} + diff --git a/src/test/compile-fail/where-clauses-unsatisfied.rs b/src/test/compile-fail/where-clauses-unsatisfied.rs new file mode 100644 index 00000000000..1d21313975f --- /dev/null +++ b/src/test/compile-fail/where-clauses-unsatisfied.rs @@ -0,0 +1,20 @@ +// 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. + +fn equal(_: &T, _: &T) -> bool where T : Eq { +} + +struct Struct; + +fn main() { + equal(&Struct, &Struct) + //~^ ERROR failed to find an implementation of trait +} + diff --git a/src/test/run-pass/where-clauses-cross-crate.rs b/src/test/run-pass/where-clauses-cross-crate.rs new file mode 100644 index 00000000000..648f646b637 --- /dev/null +++ b/src/test/run-pass/where-clauses-cross-crate.rs @@ -0,0 +1,23 @@ +// 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. + +// aux-build:where_clauses_xc.rs + +extern crate where_clauses_xc; + +use where_clauses_xc::{Equal, equal}; + +fn main() { + println!("{}", equal(&1i, &2i)); + println!("{}", equal(&1i, &1i)); + println!("{}", "hello".equal(&"hello")); + println!("{}", "hello".equals::(&1i, &1i, &"foo", &"bar")); +} + diff --git a/src/test/run-pass/where-clauses.rs b/src/test/run-pass/where-clauses.rs new file mode 100644 index 00000000000..807d95691f4 --- /dev/null +++ b/src/test/run-pass/where-clauses.rs @@ -0,0 +1,37 @@ +// 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. + +trait Equal { + fn equal(&self, other: &Self) -> bool; + fn equals(&self, this: &T, that: &T, x: &U, y: &U) -> bool + where T: Eq, U: Eq; +} + +impl Equal for T where T: Eq { + fn equal(&self, other: &T) -> bool { + self == other + } + fn equals(&self, this: &U, other: &U, x: &X, y: &X) -> bool + where U: Eq, X: Eq { + this == other && x == y + } +} + +fn equal(x: &T, y: &T) -> bool where T: Eq { + x == y +} + +fn main() { + println!("{}", equal(&1i, &2i)); + println!("{}", equal(&1i, &1i)); + println!("{}", "hello".equal(&"hello")); + println!("{}", "hello".equals::(&1i, &1i, &"foo", &"bar")); +} + -- cgit 1.4.1-3-g733a5