Skip to content

Commit 1fa4691

Browse files
committed
---
yaml --- r: 190139 b: refs/heads/auto c: 00211ec h: refs/heads/master i: 190137: fe5abdb 190135: 55a3363 v: v3
1 parent 93398de commit 1fa4691

File tree

25 files changed

+179
-256
lines changed

25 files changed

+179
-256
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ refs/tags/release-0.3: b5f0d0f648d9a6153664837026ba1be43d3e2503
1010
refs/tags/release-0.3.1: 495bae036dfe5ec6ceafd3312b4dca48741e845b
1111
refs/tags/release-0.4: e828ea2080499553b97dfe33b3f4d472b4562ad7
1212
refs/tags/release-0.5: 7e3bcfbf21278251ee936ad53e92e9b719702d73
13-
refs/heads/auto: 7eb9c3765f123964c1ca4ac52e9f4cb60c02ce3a
13+
refs/heads/auto: 00211ecfda53521ea6b6405beff1c490b04f3ce5
1414
refs/heads/servo: af82457af293e2a842ba6b7759b70288da276167
1515
refs/tags/release-0.6: b4ebcfa1812664df5e142f0134a5faea3918544c
1616
refs/tags/0.1: b19db808c2793fe2976759b85a355c3ad8c8b336

branches/auto/mk/main.mk

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,7 @@ LLVM_VERSION_$(1)=$$(shell "$$(LLVM_CONFIG_$(1))" --version)
290290
LLVM_BINDIR_$(1)=$$(shell "$$(LLVM_CONFIG_$(1))" --bindir)
291291
LLVM_INCDIR_$(1)=$$(shell "$$(LLVM_CONFIG_$(1))" --includedir)
292292
LLVM_LIBDIR_$(1)=$$(shell "$$(LLVM_CONFIG_$(1))" --libdir)
293+
LLVM_LIBDIR_RUSTFLAGS_$(1)=-L "$$(LLVM_LIBDIR_$(1))"
293294
LLVM_LIBS_$(1)=$$(shell "$$(LLVM_CONFIG_$(1))" --libs $$(LLVM_COMPONENTS))
294295
LLVM_LDFLAGS_$(1)=$$(shell "$$(LLVM_CONFIG_$(1))" --ldflags)
295296
# On FreeBSD, it may search wrong headers (that are for pre-installed LLVM),

branches/auto/mk/target.mk

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ $$(TLIB$(1)_T_$(2)_H_$(3))/stamp.$(4): \
8484
$$(subst @,,$$(STAGE$(1)_T_$(2)_H_$(3))) \
8585
$$(RUST_LIB_FLAGS_ST$(1)) \
8686
-L "$$(RT_OUTPUT_DIR_$(2))" \
87-
-L "$$(LLVM_LIBDIR_$(2))" \
87+
$$(LLVM_LIBDIR_RUSTFLAGS_$(2)) \
8888
$$(LLVM_STDCPP_RUSTFLAGS_$(2)) \
8989
$$(RUSTFLAGS_$(4)) \
9090
--out-dir $$(@D) \

branches/auto/mk/tests.mk

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -372,7 +372,7 @@ $(3)/stage$(1)/test/$(4)test-$(2)$$(X_$(2)): \
372372
$(Q)CFG_LLVM_LINKAGE_FILE=$$(LLVM_LINKAGE_PATH_$(3)) \
373373
$$(subst @,,$$(STAGE$(1)_T_$(2)_H_$(3))) -o $$@ $$< --test \
374374
-L "$$(RT_OUTPUT_DIR_$(2))" \
375-
-L "$$(LLVM_LIBDIR_$(2))" \
375+
$$(LLVM_LIBDIR_RUSTFLAGS_$(2)) \
376376
$$(RUSTFLAGS_$(4))
377377

378378
endef

branches/auto/src/libcollections/btree/node.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -348,8 +348,14 @@ impl<K, V> Node<K, V> {
348348
#[inline]
349349
pub fn as_slices<'a>(&'a self) -> (&'a [K], &'a [V]) {
350350
unsafe {(
351-
slice::from_raw_parts(*self.keys, self.len()),
352-
slice::from_raw_parts(*self.vals, self.len()),
351+
mem::transmute(raw::Slice {
352+
data: *self.keys as *const K,
353+
len: self.len()
354+
}),
355+
mem::transmute(raw::Slice {
356+
data: *self.vals as *const V,
357+
len: self.len()
358+
})
353359
)}
354360
}
355361

branches/auto/src/libcollections/string.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ use core::iter::{IntoIterator, FromIterator};
2424
use core::mem;
2525
use core::ops::{self, Deref, Add, Index};
2626
use core::ptr;
27-
use core::slice;
27+
use core::raw::Slice as RawSlice;
2828
use unicode::str as unicode_str;
2929
use unicode::str::Utf16Item;
3030

@@ -468,11 +468,11 @@ impl String {
468468
unsafe {
469469
// Attempt to not use an intermediate buffer by just pushing bytes
470470
// directly onto this string.
471-
let slice = slice::from_raw_parts_mut (
472-
self.vec.as_mut_ptr().offset(cur_len as isize),
473-
4
474-
);
475-
let used = ch.encode_utf8(slice).unwrap_or(0);
471+
let slice = RawSlice {
472+
data: self.vec.as_ptr().offset(cur_len as isize),
473+
len: 4,
474+
};
475+
let used = ch.encode_utf8(mem::transmute(slice)).unwrap_or(0);
476476
self.vec.set_len(cur_len + used);
477477
}
478478
}

branches/auto/src/libcollections/vec.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ use core::ops::{Index, IndexMut, Deref, Add};
6464
use core::ops;
6565
use core::ptr;
6666
use core::ptr::Unique;
67+
use core::raw::Slice as RawSlice;
6768
use core::slice;
6869
use core::usize;
6970

@@ -434,7 +435,10 @@ impl<T> Vec<T> {
434435
unsafe {
435436
let ptr = *self.ptr;
436437
assume(!ptr.is_null());
437-
slice::from_raw_parts_mut(ptr, self.len)
438+
mem::transmute(RawSlice {
439+
data: ptr,
440+
len: self.len,
441+
})
438442
}
439443
}
440444

@@ -1556,7 +1560,10 @@ impl<T> AsSlice<T> for Vec<T> {
15561560
unsafe {
15571561
let p = *self.ptr;
15581562
assume(p != 0 as *mut T);
1559-
slice::from_raw_parts(p, self.len)
1563+
mem::transmute(RawSlice {
1564+
data: p,
1565+
len: self.len
1566+
})
15601567
}
15611568
}
15621569
}

branches/auto/src/libcollections/vec_deque.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ use core::num::{Int, UnsignedInt};
2929
use core::num::wrapping::WrappingOps;
3030
use core::ops::{Index, IndexMut};
3131
use core::ptr::{self, Unique};
32-
use core::slice;
32+
use core::raw::Slice as RawSlice;
3333

3434
use core::hash::{Hash, Hasher};
3535
use core::cmp;
@@ -91,13 +91,13 @@ impl<T> VecDeque<T> {
9191
/// Turn ptr into a slice
9292
#[inline]
9393
unsafe fn buffer_as_slice(&self) -> &[T] {
94-
slice::from_raw_parts(*self.ptr, self.cap)
94+
mem::transmute(RawSlice { data: *self.ptr as *const T, len: self.cap })
9595
}
9696

9797
/// Turn ptr into a mut slice
9898
#[inline]
9999
unsafe fn buffer_as_mut_slice(&mut self) -> &mut [T] {
100-
slice::from_raw_parts_mut(*self.ptr, self.cap)
100+
mem::transmute(RawSlice { data: *self.ptr as *const T, len: self.cap })
101101
}
102102

103103
/// Moves an element out of the buffer

branches/auto/src/libcore/panicking.rs

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,8 @@ use fmt;
3535
#[cold] #[inline(never)] // this is the slow path, always
3636
#[lang="panic"]
3737
pub fn panic(expr_file_line: &(&'static str, &'static str, u32)) -> ! {
38-
// Use Arguments::new_v1 instead of format_args!("{}", expr) to potentially
39-
// reduce size overhead. The format_args! macro uses str's Display trait to
40-
// write expr, which calls Formatter::pad, which must accommodate string
41-
// truncation and padding (even though none is used here). Using
42-
// Arguments::new_v1 may allow the compiler to omit Formatter::pad from the
43-
// output binary, saving up to a few kilobytes.
4438
let (expr, file, line) = *expr_file_line;
45-
panic_fmt(fmt::Arguments::new_v1(&[expr], &[]), &(file, line))
39+
panic_fmt(format_args!("{}", expr), &(file, line))
4640
}
4741

4842
#[cold] #[inline(never)]

branches/auto/src/libcore/slice.rs

Lines changed: 14 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -520,10 +520,10 @@ impl<T> ops::Index<ops::Range<usize>> for [T] {
520520
assert!(index.start <= index.end);
521521
assert!(index.end <= self.len());
522522
unsafe {
523-
from_raw_parts (
524-
self.as_ptr().offset(index.start as isize),
525-
index.end - index.start
526-
)
523+
transmute(RawSlice {
524+
data: self.as_ptr().offset(index.start as isize),
525+
len: index.end - index.start
526+
})
527527
}
528528
}
529529
}
@@ -559,10 +559,10 @@ impl<T> ops::IndexMut<ops::Range<usize>> for [T] {
559559
assert!(index.start <= index.end);
560560
assert!(index.end <= self.len());
561561
unsafe {
562-
from_raw_parts_mut(
563-
self.as_mut_ptr().offset(index.start as isize),
564-
index.end - index.start
565-
)
562+
transmute(RawSlice {
563+
data: self.as_ptr().offset(index.start as isize),
564+
len: index.end - index.start
565+
})
566566
}
567567
}
568568
}
@@ -731,21 +731,7 @@ macro_rules! make_slice {
731731
diff / mem::size_of::<$t>()
732732
};
733733
unsafe {
734-
from_raw_parts($start, len)
735-
}
736-
}}
737-
}
738-
739-
macro_rules! make_mut_slice {
740-
($t: ty => $result: ty: $start: expr, $end: expr) => {{
741-
let diff = $end as usize - $start as usize;
742-
let len = if mem::size_of::<T>() == 0 {
743-
diff
744-
} else {
745-
diff / mem::size_of::<$t>()
746-
};
747-
unsafe {
748-
from_raw_parts_mut($start, len)
734+
transmute::<_, $result>(RawSlice { data: $start, len: len })
749735
}
750736
}}
751737
}
@@ -912,7 +898,7 @@ impl<'a, T> ops::IndexMut<ops::RangeFrom<usize>> for IterMut<'a, T> {
912898
impl<'a, T> ops::IndexMut<RangeFull> for IterMut<'a, T> {
913899
#[inline]
914900
fn index_mut(&mut self, _index: &RangeFull) -> &mut [T] {
915-
make_mut_slice!(T => &mut [T]: self.ptr, self.end)
901+
make_slice!(T => &mut [T]: self.ptr, self.end)
916902
}
917903
}
918904

@@ -926,7 +912,7 @@ impl<'a, T> IterMut<'a, T> {
926912
/// restricted lifetimes that do not consume the iterator.
927913
#[unstable(feature = "core")]
928914
pub fn into_slice(self) -> &'a mut [T] {
929-
make_mut_slice!(T => &'a mut [T]: self.ptr, self.end)
915+
make_slice!(T => &'a mut [T]: self.ptr, self.end)
930916
}
931917
}
932918

@@ -1418,15 +1404,16 @@ impl<'a, T> ExactSizeIterator for ChunksMut<'a, T> {}
14181404
#[unstable(feature = "core")]
14191405
pub fn ref_slice<'a, A>(s: &'a A) -> &'a [A] {
14201406
unsafe {
1421-
from_raw_parts(s, 1)
1407+
transmute(RawSlice { data: s, len: 1 })
14221408
}
14231409
}
14241410

14251411
/// Converts a pointer to A into a slice of length 1 (without copying).
14261412
#[unstable(feature = "core")]
14271413
pub fn mut_ref_slice<'a, A>(s: &'a mut A) -> &'a mut [A] {
14281414
unsafe {
1429-
from_raw_parts_mut(s, 1)
1415+
let ptr: *const A = transmute(s);
1416+
transmute(RawSlice { data: ptr, len: 1 })
14301417
}
14311418
}
14321419

branches/auto/src/librustc/middle/check_match.rs

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -646,7 +646,6 @@ fn is_useful(cx: &MatchCheckCtxt,
646646
if rows[0].len() == 0 {
647647
return NotUseful;
648648
}
649-
assert!(rows.iter().all(|r| r.len() == v.len()));
650649
let real_pat = match rows.iter().find(|r| (*r)[0].id != DUMMY_NODE_ID) {
651650
Some(r) => raw_pat(r[0]),
652651
None if v.len() == 0 => return NotUseful,
@@ -655,12 +654,7 @@ fn is_useful(cx: &MatchCheckCtxt,
655654
let left_ty = if real_pat.id == DUMMY_NODE_ID {
656655
ty::mk_nil(cx.tcx)
657656
} else {
658-
let left_ty = ty::pat_ty(cx.tcx, &*real_pat);
659-
660-
match real_pat.node {
661-
ast::PatIdent(ast::BindByRef(..), _, _) => ty::deref(left_ty, false).unwrap().ty,
662-
_ => left_ty,
663-
}
657+
ty::pat_ty(cx.tcx, &*real_pat)
664658
};
665659

666660
let max_slice_length = rows.iter().filter_map(|row| match row[0].node {

branches/auto/src/librustc/middle/dead.rs

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ struct MarkSymbolVisitor<'a, 'tcx: 'a> {
4747
struct_has_extern_repr: bool,
4848
ignore_non_const_paths: bool,
4949
inherited_pub_visibility: bool,
50+
ignore_variant_stack: Vec<ast::NodeId>,
5051
}
5152

5253
impl<'a, 'tcx> MarkSymbolVisitor<'a, 'tcx> {
@@ -59,6 +60,7 @@ impl<'a, 'tcx> MarkSymbolVisitor<'a, 'tcx> {
5960
struct_has_extern_repr: false,
6061
ignore_non_const_paths: false,
6162
inherited_pub_visibility: false,
63+
ignore_variant_stack: vec![],
6264
}
6365
}
6466

@@ -79,7 +81,9 @@ impl<'a, 'tcx> MarkSymbolVisitor<'a, 'tcx> {
7981
def::DefPrimTy(_) => (),
8082
def::DefVariant(enum_id, variant_id, _) => {
8183
self.check_def_id(enum_id);
82-
self.check_def_id(variant_id);
84+
if !self.ignore_variant_stack.contains(&variant_id.node) {
85+
self.check_def_id(variant_id);
86+
}
8387
}
8488
_ => {
8589
self.check_def_id(def.def_id());
@@ -278,6 +282,23 @@ impl<'a, 'tcx, 'v> Visitor<'v> for MarkSymbolVisitor<'a, 'tcx> {
278282
visit::walk_expr(self, expr);
279283
}
280284

285+
fn visit_arm(&mut self, arm: &ast::Arm) {
286+
if arm.pats.len() == 1 {
287+
let pat = &*arm.pats[0];
288+
let variants = pat_util::necessary_variants(&self.tcx.def_map, pat);
289+
290+
// Inside the body, ignore constructions of variants
291+
// necessary for the pattern to match. Those construction sites
292+
// can't be reached unless the variant is constructed elsewhere.
293+
let len = self.ignore_variant_stack.len();
294+
self.ignore_variant_stack.push_all(&*variants);
295+
visit::walk_arm(self, arm);
296+
self.ignore_variant_stack.truncate(len);
297+
} else {
298+
visit::walk_arm(self, arm);
299+
}
300+
}
301+
281302
fn visit_pat(&mut self, pat: &ast::Pat) {
282303
let def_map = &self.tcx.def_map;
283304
match pat.node {
@@ -397,6 +418,11 @@ fn create_and_seed_worklist(tcx: &ty::ctxt,
397418
worklist.push(*id);
398419
}
399420
for id in reachable_symbols {
421+
// Reachable variants can be dead, because we warn about
422+
// variants never constructed, not variants never used.
423+
if let Some(ast_map::NodeVariant(..)) = tcx.map.find(*id) {
424+
continue;
425+
}
400426
worklist.push(*id);
401427
}
402428

branches/auto/src/librustc/middle/pat_util.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,3 +155,27 @@ pub fn def_to_path(tcx: &ty::ctxt, id: ast::DefId) -> ast::Path {
155155
span: DUMMY_SP,
156156
})
157157
}
158+
159+
/// Return variants that are necessary to exist for the pattern to match.
160+
pub fn necessary_variants(dm: &DefMap, pat: &ast::Pat) -> Vec<ast::NodeId> {
161+
let mut variants = vec![];
162+
walk_pat(pat, |p| {
163+
match p.node {
164+
ast::PatEnum(_, _) |
165+
ast::PatIdent(_, _, None) |
166+
ast::PatStruct(..) => {
167+
match dm.borrow().get(&p.id) {
168+
Some(&PathResolution {base_def: DefVariant(_, id, _), ..}) => {
169+
variants.push(id.node);
170+
}
171+
_ => ()
172+
}
173+
}
174+
_ => ()
175+
}
176+
true
177+
});
178+
variants.sort();
179+
variants.dedup();
180+
variants
181+
}

branches/auto/src/librustc_lint/builtin.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -811,7 +811,7 @@ impl NonCamelCaseTypes {
811811
if i == 0 {
812812
c.to_uppercase().collect::<String>()
813813
} else {
814-
c.to_lowercase().collect()
814+
c.to_string()
815815
}
816816
)).collect::<Vec<_>>().concat()
817817
}

branches/auto/src/librustc_llvm/archive_ro.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ use libc;
1414
use ArchiveRef;
1515

1616
use std::ffi::CString;
17-
use std::slice;
17+
use std::mem;
18+
use std::raw;
1819
use std::path::Path;
1920

2021
pub struct ArchiveRO {
@@ -61,7 +62,10 @@ impl ArchiveRO {
6162
if ptr.is_null() {
6263
None
6364
} else {
64-
Some(slice::from_raw_parts(ptr as *const u8, size as uint))
65+
Some(mem::transmute(raw::Slice {
66+
data: ptr,
67+
len: size as uint,
68+
}))
6569
}
6670
}
6771
}

0 commit comments

Comments
 (0)