about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2016-06-15 04:48:29 -0700
committerGitHub <noreply@github.com>2016-06-15 04:48:29 -0700
commita94881563c18e4ffca2e24aed4bd8f5de583cc91 (patch)
tree09ff7de58807e87a673d21ee2acbf5ca64d4c3e0 /src
parentc5f3706c0d90541ea76b1dfa28ec473af97aacb0 (diff)
parentdf924ca2a189598ed5f0bedcd452f8831d70060c (diff)
downloadrust-a94881563c18e4ffca2e24aed4bd8f5de583cc91.tar.gz
rust-a94881563c18e4ffca2e24aed4bd8f5de583cc91.zip
Auto merge of #34180 - durka:patch-24, r=brson
derive Hash (and not Copy) for ranges

Fixes #34170.

Also, `RangeInclusive` was `Copy` by mistake -- fix that, which is a [breaking-change] to that unstable type.
Diffstat (limited to 'src')
-rw-r--r--src/libcore/ops.rs12
-rw-r--r--src/test/compile-fail/range_traits-1.rs93
-rw-r--r--src/test/compile-fail/range_traits-2.rs17
-rw-r--r--src/test/compile-fail/range_traits-3.rs17
-rw-r--r--src/test/compile-fail/range_traits-4.rs20
-rw-r--r--src/test/compile-fail/range_traits-5.rs20
-rw-r--r--src/test/compile-fail/range_traits-6.rs19
-rw-r--r--src/test/compile-fail/range_traits-7.rs20
8 files changed, 212 insertions, 6 deletions
diff --git a/src/libcore/ops.rs b/src/libcore/ops.rs
index 50c4dc697c2..5e1210b2ff9 100644
--- a/src/libcore/ops.rs
+++ b/src/libcore/ops.rs
@@ -1475,7 +1475,7 @@ pub trait IndexMut<Idx: ?Sized>: Index<Idx> {
 ///     assert_eq!(arr[1..3], [  1,2  ]);
 /// }
 /// ```
-#[derive(Copy, Clone, PartialEq, Eq)]
+#[derive(Copy, Clone, PartialEq, Eq, Hash)]
 #[stable(feature = "rust1", since = "1.0.0")]
 pub struct RangeFull;
 
@@ -1506,7 +1506,7 @@ impl fmt::Debug for RangeFull {
 ///     assert_eq!(arr[1..3], [  1,2  ]);  // Range
 /// }
 /// ```
-#[derive(Clone, PartialEq, Eq)]
+#[derive(Clone, PartialEq, Eq, Hash)]  // not Copy -- see #27186
 #[stable(feature = "rust1", since = "1.0.0")]
 pub struct Range<Idx> {
     /// The lower bound of the range (inclusive).
@@ -1570,7 +1570,7 @@ impl<Idx: PartialOrd<Idx>> Range<Idx> {
 ///     assert_eq!(arr[1..3], [  1,2  ]);
 /// }
 /// ```
-#[derive(Clone, PartialEq, Eq)]
+#[derive(Clone, PartialEq, Eq, Hash)]  // not Copy -- see #27186
 #[stable(feature = "rust1", since = "1.0.0")]
 pub struct RangeFrom<Idx> {
     /// The lower bound of the range (inclusive).
@@ -1619,7 +1619,7 @@ impl<Idx: PartialOrd<Idx>> RangeFrom<Idx> {
 ///     assert_eq!(arr[1..3], [  1,2  ]);
 /// }
 /// ```
-#[derive(Copy, Clone, PartialEq, Eq)]
+#[derive(Copy, Clone, PartialEq, Eq, Hash)]
 #[stable(feature = "rust1", since = "1.0.0")]
 pub struct RangeTo<Idx> {
     /// The upper bound of the range (exclusive).
@@ -1669,7 +1669,7 @@ impl<Idx: PartialOrd<Idx>> RangeTo<Idx> {
 ///     assert_eq!(arr[1...2], [  1,2  ]);  // RangeInclusive
 /// }
 /// ```
-#[derive(Copy, Clone, PartialEq, Eq)]
+#[derive(Clone, PartialEq, Eq, Hash)]  // not Copy -- see #27186
 #[unstable(feature = "inclusive_range", reason = "recently added, follows RFC", issue = "28237")]
 pub enum RangeInclusive<Idx> {
     /// Empty range (iteration has finished)
@@ -1774,7 +1774,7 @@ impl<Idx: PartialOrd<Idx>> RangeInclusive<Idx> {
 ///     assert_eq!(arr[1...2], [  1,2  ]);
 /// }
 /// ```
-#[derive(Copy, Clone, PartialEq, Eq)]
+#[derive(Copy, Clone, PartialEq, Eq, Hash)]
 #[unstable(feature = "inclusive_range", reason = "recently added, follows RFC", issue = "28237")]
 pub struct RangeToInclusive<Idx> {
     /// The upper bound of the range (inclusive)
diff --git a/src/test/compile-fail/range_traits-1.rs b/src/test/compile-fail/range_traits-1.rs
new file mode 100644
index 00000000000..85219717758
--- /dev/null
+++ b/src/test/compile-fail/range_traits-1.rs
@@ -0,0 +1,93 @@
+// Copyright 2016 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.
+
+#![feature(inclusive_range)]
+
+use std::ops::*;
+
+// FIXME #34229 duplicated errors
+#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)]
+struct AllTheRanges {
+    a: Range<usize>,
+    //~^ ERROR PartialOrd
+    //~^^ ERROR PartialOrd
+    //~^^^ ERROR Ord
+    //~^^^^ ERROR binary operation
+    //~^^^^^ ERROR binary operation
+    //~^^^^^^ ERROR binary operation
+    //~^^^^^^^ ERROR binary operation
+    //~^^^^^^^^ ERROR binary operation
+    //~^^^^^^^^^ ERROR binary operation
+    //~^^^^^^^^^^ ERROR binary operation
+    //~^^^^^^^^^^^ ERROR binary operation
+    b: RangeTo<usize>,
+    //~^ ERROR PartialOrd
+    //~^^ ERROR PartialOrd
+    //~^^^ ERROR Ord
+    //~^^^^ ERROR binary operation
+    //~^^^^^ ERROR binary operation
+    //~^^^^^^ ERROR binary operation
+    //~^^^^^^^ ERROR binary operation
+    //~^^^^^^^^ ERROR binary operation
+    //~^^^^^^^^^ ERROR binary operation
+    //~^^^^^^^^^^ ERROR binary operation
+    //~^^^^^^^^^^^ ERROR binary operation
+    c: RangeFrom<usize>,
+    //~^ ERROR PartialOrd
+    //~^^ ERROR PartialOrd
+    //~^^^ ERROR Ord
+    //~^^^^ ERROR binary operation
+    //~^^^^^ ERROR binary operation
+    //~^^^^^^ ERROR binary operation
+    //~^^^^^^^ ERROR binary operation
+    //~^^^^^^^^ ERROR binary operation
+    //~^^^^^^^^^ ERROR binary operation
+    //~^^^^^^^^^^ ERROR binary operation
+    //~^^^^^^^^^^^ ERROR binary operation
+    d: RangeFull,
+    //~^ ERROR PartialOrd
+    //~^^ ERROR PartialOrd
+    //~^^^ ERROR Ord
+    //~^^^^ ERROR binary operation
+    //~^^^^^ ERROR binary operation
+    //~^^^^^^ ERROR binary operation
+    //~^^^^^^^ ERROR binary operation
+    //~^^^^^^^^ ERROR binary operation
+    //~^^^^^^^^^ ERROR binary operation
+    //~^^^^^^^^^^ ERROR binary operation
+    //~^^^^^^^^^^^ ERROR binary operation
+    e: RangeInclusive<usize>,
+    //~^ ERROR PartialOrd
+    //~^^ ERROR PartialOrd
+    //~^^^ ERROR Ord
+    //~^^^^ ERROR binary operation
+    //~^^^^^ ERROR binary operation
+    //~^^^^^^ ERROR binary operation
+    //~^^^^^^^ ERROR binary operation
+    //~^^^^^^^^ ERROR binary operation
+    //~^^^^^^^^^ ERROR binary operation
+    //~^^^^^^^^^^ ERROR binary operation
+    //~^^^^^^^^^^^ ERROR binary operation
+    f: RangeToInclusive<usize>,
+    //~^ ERROR PartialOrd
+    //~^^ ERROR PartialOrd
+    //~^^^ ERROR Ord
+    //~^^^^ ERROR binary operation
+    //~^^^^^ ERROR binary operation
+    //~^^^^^^ ERROR binary operation
+    //~^^^^^^^ ERROR binary operation
+    //~^^^^^^^^ ERROR binary operation
+    //~^^^^^^^^^ ERROR binary operation
+    //~^^^^^^^^^^ ERROR binary operation
+    //~^^^^^^^^^^^ ERROR binary operation
+}
+
+fn main() {}
+
diff --git a/src/test/compile-fail/range_traits-2.rs b/src/test/compile-fail/range_traits-2.rs
new file mode 100644
index 00000000000..64fcd25f538
--- /dev/null
+++ b/src/test/compile-fail/range_traits-2.rs
@@ -0,0 +1,17 @@
+// Copyright 2016 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.
+
+use std::ops::*;
+
+#[derive(Copy, Clone)] //~ ERROR Copy
+struct R(Range<usize>);
+
+fn main() {}
+
diff --git a/src/test/compile-fail/range_traits-3.rs b/src/test/compile-fail/range_traits-3.rs
new file mode 100644
index 00000000000..d26b7956ae8
--- /dev/null
+++ b/src/test/compile-fail/range_traits-3.rs
@@ -0,0 +1,17 @@
+// Copyright 2016 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.
+
+use std::ops::*;
+
+#[derive(Copy, Clone)] //~ ERROR Copy
+struct R(RangeFrom<usize>);
+
+fn main() {}
+
diff --git a/src/test/compile-fail/range_traits-4.rs b/src/test/compile-fail/range_traits-4.rs
new file mode 100644
index 00000000000..630969bdbdf
--- /dev/null
+++ b/src/test/compile-fail/range_traits-4.rs
@@ -0,0 +1,20 @@
+// Copyright 2016 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.
+
+#![feature(rustc_attrs)]
+
+use std::ops::*;
+
+#[derive(Copy, Clone)]
+struct R(RangeTo<usize>);
+
+#[rustc_error]
+fn main() {} //~ ERROR success
+
diff --git a/src/test/compile-fail/range_traits-5.rs b/src/test/compile-fail/range_traits-5.rs
new file mode 100644
index 00000000000..5963c4a9496
--- /dev/null
+++ b/src/test/compile-fail/range_traits-5.rs
@@ -0,0 +1,20 @@
+// Copyright 2016 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.
+
+#![feature(rustc_attrs)]
+
+use std::ops::*;
+
+#[derive(Copy, Clone)]
+struct R(RangeFull);
+
+#[rustc_error]
+fn main() {} //~ ERROR success
+
diff --git a/src/test/compile-fail/range_traits-6.rs b/src/test/compile-fail/range_traits-6.rs
new file mode 100644
index 00000000000..7c62711feae
--- /dev/null
+++ b/src/test/compile-fail/range_traits-6.rs
@@ -0,0 +1,19 @@
+// Copyright 2016 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.
+
+#![feature(inclusive_range)]
+
+use std::ops::*;
+
+#[derive(Copy, Clone)] //~ ERROR Copy
+struct R(RangeInclusive<usize>);
+
+fn main() {}
+
diff --git a/src/test/compile-fail/range_traits-7.rs b/src/test/compile-fail/range_traits-7.rs
new file mode 100644
index 00000000000..b6fec773a77
--- /dev/null
+++ b/src/test/compile-fail/range_traits-7.rs
@@ -0,0 +1,20 @@
+// Copyright 2016 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.
+
+#![feature(rustc_attrs, inclusive_range)]
+
+use std::ops::*;
+
+#[derive(Copy, Clone)]
+struct R(RangeToInclusive<usize>);
+
+#[rustc_error]
+fn main() {} //~ ERROR success
+