Skip to content

Commit 88f7016

Browse files
committed
Auto merge of #40167 - frewsxcv:rollup, r=frewsxcv
Rollup of 6 pull requests - Successful merges: #39419, #39936, #39944, #39960, #40028, #40128 - Failed merges:
2 parents 2f52386 + 0b5bf67 commit 88f7016

File tree

53 files changed

+1521
-1297
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

53 files changed

+1521
-1297
lines changed

src/libcollections/range.rs

+27-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515
//! Range syntax.
1616

17-
use core::ops::{RangeFull, Range, RangeTo, RangeFrom};
17+
use core::ops::{RangeFull, Range, RangeTo, RangeFrom, RangeInclusive, RangeToInclusive};
1818
use Bound::{self, Excluded, Included, Unbounded};
1919

2020
/// **RangeArgument** is implemented by Rust's built-in range types, produced
@@ -105,6 +105,32 @@ impl<T> RangeArgument<T> for Range<T> {
105105
}
106106
}
107107

108+
#[unstable(feature = "inclusive_range", reason = "recently added, follows RFC", issue = "28237")]
109+
impl<T> RangeArgument<T> for RangeInclusive<T> {
110+
fn start(&self) -> Bound<&T> {
111+
match *self {
112+
RangeInclusive::Empty{ ref at } => Included(at),
113+
RangeInclusive::NonEmpty { ref start, .. } => Included(start),
114+
}
115+
}
116+
fn end(&self) -> Bound<&T> {
117+
match *self {
118+
RangeInclusive::Empty{ ref at } => Excluded(at),
119+
RangeInclusive::NonEmpty { ref end, .. } => Included(end),
120+
}
121+
}
122+
}
123+
124+
#[unstable(feature = "inclusive_range", reason = "recently added, follows RFC", issue = "28237")]
125+
impl<T> RangeArgument<T> for RangeToInclusive<T> {
126+
fn start(&self) -> Bound<&T> {
127+
Unbounded
128+
}
129+
fn end(&self) -> Bound<&T> {
130+
Included(&self.end)
131+
}
132+
}
133+
108134
impl<T> RangeArgument<T> for (Bound<T>, Bound<T>) {
109135
fn start(&self) -> Bound<&T> {
110136
match *self {

src/libcollections/string.rs

+9
Original file line numberDiff line numberDiff line change
@@ -1483,6 +1483,15 @@ impl FromIterator<char> for String {
14831483
}
14841484
}
14851485

1486+
#[stable(feature = "string_from_iter_by_ref", since = "1.17.0")]
1487+
impl<'a> FromIterator<&'a char> for String {
1488+
fn from_iter<I: IntoIterator<Item = &'a char>>(iter: I) -> String {
1489+
let mut buf = String::new();
1490+
buf.extend(iter);
1491+
buf
1492+
}
1493+
}
1494+
14861495
#[stable(feature = "rust1", since = "1.0.0")]
14871496
impl<'a> FromIterator<&'a str> for String {
14881497
fn from_iter<I: IntoIterator<Item = &'a str>>(iter: I) -> String {

src/libcollectionstest/btree/map.rs

+37
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,43 @@ fn test_range_small() {
178178
assert_eq!(j, size - 2);
179179
}
180180

181+
#[test]
182+
fn test_range_inclusive() {
183+
let size = 500;
184+
185+
let map: BTreeMap<_, _> = (0...size).map(|i| (i, i)).collect();
186+
187+
fn check<'a, L, R>(lhs: L, rhs: R)
188+
where L: IntoIterator<Item=(&'a i32, &'a i32)>,
189+
R: IntoIterator<Item=(&'a i32, &'a i32)>,
190+
{
191+
let lhs: Vec<_> = lhs.into_iter().collect();
192+
let rhs: Vec<_> = rhs.into_iter().collect();
193+
assert_eq!(lhs, rhs);
194+
}
195+
196+
check(map.range(size + 1...size + 1), vec![]);
197+
check(map.range(size...size), vec![(&size, &size)]);
198+
check(map.range(size...size + 1), vec![(&size, &size)]);
199+
check(map.range(0...0), vec![(&0, &0)]);
200+
check(map.range(0...size - 1), map.range(..size));
201+
check(map.range(-1...-1), vec![]);
202+
check(map.range(-1...size), map.range(..));
203+
check(map.range(...size), map.range(..));
204+
check(map.range(...200), map.range(..201));
205+
check(map.range(5...8), vec![(&5, &5), (&6, &6), (&7, &7), (&8, &8)]);
206+
check(map.range(-1...0), vec![(&0, &0)]);
207+
check(map.range(-1...2), vec![(&0, &0), (&1, &1), (&2, &2)]);
208+
}
209+
210+
#[test]
211+
fn test_range_inclusive_max_value() {
212+
let max = ::std::usize::MAX;
213+
let map: BTreeMap<_, _> = vec![(max, 0)].into_iter().collect();
214+
215+
assert_eq!(map.range(max...max).collect::<Vec<_>>(), &[(&max, &0)]);
216+
}
217+
181218
#[test]
182219
fn test_range_equal_empty_cases() {
183220
let map: BTreeMap<_, _> = (0..5).map(|i| (i, i)).collect();

src/libcollectionstest/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#![feature(binary_heap_peek_mut_pop)]
1515
#![feature(box_syntax)]
1616
#![feature(btree_range)]
17+
#![feature(inclusive_range_syntax)]
1718
#![feature(collection_placement)]
1819
#![feature(collections)]
1920
#![feature(collections_bound)]

src/libcollectionstest/vec.rs

+50
Original file line numberDiff line numberDiff line change
@@ -507,6 +507,56 @@ fn test_drain_range() {
507507
assert_eq!(v, &[(), ()]);
508508
}
509509

510+
#[test]
511+
fn test_drain_inclusive_range() {
512+
let mut v = vec!['a', 'b', 'c', 'd', 'e'];
513+
for _ in v.drain(1...3) {
514+
}
515+
assert_eq!(v, &['a', 'e']);
516+
517+
let mut v: Vec<_> = (0...5).map(|x| x.to_string()).collect();
518+
for _ in v.drain(1...5) {
519+
}
520+
assert_eq!(v, &["0".to_string()]);
521+
522+
let mut v: Vec<String> = (0...5).map(|x| x.to_string()).collect();
523+
for _ in v.drain(0...5) {
524+
}
525+
assert_eq!(v, Vec::<String>::new());
526+
527+
let mut v: Vec<_> = (0...5).map(|x| x.to_string()).collect();
528+
for _ in v.drain(0...3) {
529+
}
530+
assert_eq!(v, &["4".to_string(), "5".to_string()]);
531+
532+
let mut v: Vec<_> = (0...1).map(|x| x.to_string()).collect();
533+
for _ in v.drain(...0) {
534+
}
535+
assert_eq!(v, &["1".to_string()]);
536+
}
537+
538+
#[test]
539+
fn test_drain_max_vec_size() {
540+
let mut v = Vec::<()>::with_capacity(usize::max_value());
541+
unsafe { v.set_len(usize::max_value()); }
542+
for _ in v.drain(usize::max_value() - 1..) {
543+
}
544+
assert_eq!(v.len(), usize::max_value() - 1);
545+
546+
let mut v = Vec::<()>::with_capacity(usize::max_value());
547+
unsafe { v.set_len(usize::max_value()); }
548+
for _ in v.drain(usize::max_value() - 1...usize::max_value() - 1) {
549+
}
550+
assert_eq!(v.len(), usize::max_value() - 1);
551+
}
552+
553+
#[test]
554+
#[should_panic]
555+
fn test_drain_inclusive_out_of_bounds() {
556+
let mut v = vec![1, 2, 3, 4, 5];
557+
v.drain(5...5);
558+
}
559+
510560
#[test]
511561
fn test_into_boxed_slice() {
512562
let xs = vec![1, 2, 3];

src/libproc_macro/lib.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -173,8 +173,7 @@ impl FromStr for TokenStream {
173173
__internal::with_parse_sess(|sess| {
174174
let src = src.to_string();
175175
let name = "<proc-macro source code>".to_string();
176-
let tts = try!(parse::parse_tts_from_source_str(name, src, sess)
177-
.map_err(parse_to_lex_err));
176+
let tts = parse::parse_tts_from_source_str(name, src, sess);
178177

179178
Ok(__internal::token_stream_wrap(tts.into_iter().collect()))
180179
})

src/libproc_macro_plugin/qquote.rs

-1
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,6 @@ impl Quote for TokenTree {
119119
::syntax::tokenstream::TokenTree::Delimited(::syntax::ext::quote::rt::DUMMY_SP,
120120
(quote delimited))
121121
},
122-
_ => panic!("unexpected `TokenTree::Sequence` in `qquote`"),
123122
}
124123
}
125124
}

0 commit comments

Comments
 (0)