Skip to content

Commit 573bf2c

Browse files
committed
---
yaml --- r: 206211 b: refs/heads/beta c: 62bd19f h: refs/heads/master i: 206209: cfa2e6d 206207: 78dedd1 v: v3
1 parent 818cbb9 commit 573bf2c

Some content is hidden

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

99 files changed

+6305
-4276
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ refs/tags/0.12.0: f0c419429ef30723ceaf6b42f9b5a2aeb5d2e2d1
2929
refs/heads/automation-fail: 1bf06495443584539b958873e04cc2f864ab10e4
3030
refs/heads/batch: b7fd822592a4fb577552d93010c4a4e14f314346
3131
refs/heads/building: 126db549b038c84269a1e4fe46f051b2c15d6970
32-
refs/heads/beta: f7947bc9364459b281e6b5c601ae2bcb148839f2
32+
refs/heads/beta: 62bd19fff20ced94d1d94cb644819270a2d4bf30
3333
refs/heads/windistfix: 7608dbad651f02e837ed05eef3d74a6662a6e928
3434
refs/tags/1.0.0-alpha: e42bd6d93a1d3433c486200587f8f9e12590a4d7
3535
refs/heads/tmp: 579e31929feff51dcaf8d444648eff8de735f91a

branches/beta/src/doc/not_found.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,12 @@ function populate_rust_search() {
5757

5858
// #18540, use a single token
5959

60+
var a = document.createElement("a");
61+
a.href = "http://doc.rust-lang.org/core/?search=" + encodeURIComponent(lt);
62+
a.textContent = lt;
6063
var search = document.getElementById('core-search');
61-
search.innerHTML = "<a href=\"http://doc.rust-lang.org/core/?search=" + lt + "\">" + lt + "</a>";
64+
search.innerHTML = "";
65+
search.appendChild(a);
6266
}
6367
populate_site_search();
6468
populate_rust_search();

branches/beta/src/doc/reference.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ Non-doc comments are interpreted as a form of whitespace.
103103

104104
## Whitespace
105105

106-
Whitespace is any non-empty string containing any the following characters:
106+
Whitespace is any non-empty string containing only the following characters:
107107

108108
- `U+0020` (space, `' '`)
109109
- `U+0009` (tab, `'\t'`)
@@ -1897,8 +1897,8 @@ release builds.
18971897

18981898
There are two kinds of configuration options, one that is either defined or not
18991899
(`#[cfg(foo)]`), and the other that contains a string that can be checked
1900-
against (`#[cfg(bar = "baz")]` (currently only compiler-defined configuration
1901-
options can have the latter form).
1900+
against (`#[cfg(bar = "baz")]`). Currently, only compiler-defined configuration
1901+
options can have the latter form.
19021902

19031903
```
19041904
// The function is only included in the build when compiling for OSX

branches/beta/src/doc/trpl/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ vector. When we try to compile this program, we get an error:
127127

128128
```text
129129
error: cannot borrow `x` as mutable because it is also borrowed as immutable
130-
x.push(4);
130+
x.push("foo");
131131
^
132132
note: previous borrow of `x` occurs here; the immutable borrow prevents
133133
subsequent moves or mutable borrows of `x` until the borrow ends

branches/beta/src/libcore/intrinsics.rs

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,21 @@ extern "rust-intrinsic" {
139139
pub fn atomic_fence_rel();
140140
pub fn atomic_fence_acqrel();
141141

142+
/// A compiler-only memory barrier.
143+
///
144+
/// Memory accesses will never be reordered across this barrier by the compiler,
145+
/// but no instructions will be emitted for it. This is appropriate for operations
146+
/// on the same thread that may be preempted, such as when interacting with signal
147+
/// handlers.
148+
#[cfg(not(stage0))] // SNAP 857ef6e
149+
pub fn atomic_singlethreadfence();
150+
#[cfg(not(stage0))] // SNAP 857ef6e
151+
pub fn atomic_singlethreadfence_acq();
152+
#[cfg(not(stage0))] // SNAP 857ef6e
153+
pub fn atomic_singlethreadfence_rel();
154+
#[cfg(not(stage0))] // SNAP 857ef6e
155+
pub fn atomic_singlethreadfence_acqrel();
156+
142157
/// Aborts the execution of the process.
143158
pub fn abort() -> !;
144159

@@ -255,12 +270,17 @@ extern "rust-intrinsic" {
255270
/// Returns `true` if a type is managed (will be allocated on the local heap)
256271
pub fn owns_managed<T>() -> bool;
257272

258-
/// Calculates the offset from a pointer. The offset *must* be in-bounds of
259-
/// the object, or one-byte-past-the-end. An arithmetic overflow is also
260-
/// undefined behaviour.
273+
/// Calculates the offset from a pointer.
261274
///
262275
/// This is implemented as an intrinsic to avoid converting to and from an
263276
/// integer, since the conversion would throw away aliasing information.
277+
///
278+
/// # Safety
279+
///
280+
/// Both the starting and resulting pointer must be either in bounds or one
281+
/// byte past the end of an allocated object. If either pointer is out of
282+
/// bounds or arithmetic overflow occurs then any further use of the
283+
/// returned value will result in undefined behavior.
264284
pub fn offset<T>(dst: *const T, offset: isize) -> *const T;
265285

266286
/// Copies `count * size_of<T>` bytes from `src` to `dst`. The source
@@ -562,3 +582,20 @@ extern "rust-intrinsic" {
562582
/// cast to a `u64`; if `T` has no discriminant, returns 0.
563583
pub fn discriminant_value<T>(v: &T) -> u64;
564584
}
585+
586+
#[cfg(not(stage0))]
587+
extern "rust-intrinsic" {
588+
/// Performs an unchecked signed division, which results in undefined behavior,
589+
/// in cases where y == 0, or x == int::MIN and y == -1
590+
pub fn unchecked_sdiv<T>(x: T, y: T) -> T;
591+
/// Performs an unchecked unsigned division, which results in undefined behavior,
592+
/// in cases where y == 0
593+
pub fn unchecked_udiv<T>(x: T, y: T) -> T;
594+
595+
/// Returns the remainder of an unchecked signed division, which results in
596+
/// undefined behavior, in cases where y == 0, or x == int::MIN and y == -1
597+
pub fn unchecked_urem<T>(x: T, y: T) -> T;
598+
/// Returns the remainder of an unchecked signed division, which results in
599+
/// undefined behavior, in cases where y == 0
600+
pub fn unchecked_srem<T>(x: T, y: T) -> T;
601+
}

branches/beta/src/libcore/num/mod.rs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -745,7 +745,20 @@ macro_rules! uint_impl {
745745
#[stable(feature = "rust1", since = "1.0.0")]
746746
#[inline]
747747
pub fn trailing_zeros(self) -> u32 {
748-
unsafe { $cttz(self as $ActualT) as u32 }
748+
// As of LLVM 3.6 the codegen for the zero-safe cttz8 intrinsic
749+
// emits two conditional moves on x86_64. By promoting the value to
750+
// u16 and setting bit 8, we get better code without any conditional
751+
// operations.
752+
// FIXME: There's a LLVM patch (http://reviews.llvm.org/D9284)
753+
// pending, remove this workaround once LLVM generates better code
754+
// for cttz8.
755+
unsafe {
756+
if $BITS == 8 {
757+
intrinsics::cttz16(self as u16 | 0x100) as u32
758+
} else {
759+
$cttz(self as $ActualT) as u32
760+
}
761+
}
749762
}
750763

751764
/// Shifts the bits to the left by a specified amount, `n`,

branches/beta/src/libcore/ptr.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -284,9 +284,10 @@ impl<T: ?Sized> *const T {
284284
///
285285
/// # Safety
286286
///
287-
/// The offset must be in-bounds of the object, or one-byte-past-the-end.
288-
/// Otherwise `offset` invokes Undefined Behaviour, regardless of whether
289-
/// the pointer is used.
287+
/// Both the starting and resulting pointer must be either in bounds or one
288+
/// byte past the end of an allocated object. If either pointer is out of
289+
/// bounds or arithmetic overflow occurs then
290+
/// any further use of the returned value will result in undefined behavior.
290291
#[stable(feature = "rust1", since = "1.0.0")]
291292
#[inline]
292293
pub unsafe fn offset(self, count: isize) -> *const T where T: Sized {

branches/beta/src/librustc/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ The rustc crate itself consists of the following submodules
7171
- util: ubiquitous types and helper functions
7272
- lib: bindings to LLVM
7373

74-
The entry-point for the compiler is main() in the librustc_trans
74+
The entry-point for the compiler is main() in the librustc_driver
7575
crate.
7676

7777
The 3 central data structures:

branches/beta/src/librustc/diagnostics.rs

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,25 @@ match x {
168168
```
169169
"##,
170170

171+
E0013: r##"
172+
Static and const variables can refer to other const variables. But a const
173+
variable cannot refer to a static variable. For example, `Y` cannot refer to `X`
174+
here:
175+
176+
```
177+
static X: i32 = 42;
178+
const Y: i32 = X;
179+
```
180+
181+
To fix this, the value can be extracted as a const and then used:
182+
183+
```
184+
const A: i32 = 42;
185+
static X: i32 = A;
186+
const Y: i32 = A;
187+
```
188+
"##,
189+
171190
E0015: r##"
172191
The only function calls allowed in static or constant expressions are enum
173192
variant constructors or struct constructors (for unit or tuple structs). This
@@ -336,6 +355,22 @@ enum Method { GET, POST }
336355
```
337356
"##,
338357

358+
E0265: r##"
359+
This error indicates that a static or constant references itself.
360+
All statics and constants need to resolve to a value in an acyclic manner.
361+
362+
For example, neither of the following can be sensibly compiled:
363+
364+
```
365+
const X: u32 = X;
366+
```
367+
368+
```
369+
const X: u32 = Y;
370+
const Y: u32 = X;
371+
```
372+
"##,
373+
339374
E0267: r##"
340375
This error indicates the use of loop keyword (break or continue) inside a
341376
closure but outside of any loop. Break and continue can be used as normal
@@ -462,7 +497,6 @@ register_diagnostics! {
462497
E0010,
463498
E0011,
464499
E0012,
465-
E0013,
466500
E0014,
467501
E0016,
468502
E0017,
@@ -482,7 +516,6 @@ register_diagnostics! {
482516
E0262, // illegal lifetime parameter name
483517
E0263, // lifetime name declared twice in same scope
484518
E0264, // unknown external lang item
485-
E0265, // recursive constant
486519
E0266, // expected item
487520
E0269, // not all control paths return a value
488521
E0270, // computation may converge in a function marked as diverging

branches/beta/src/librustc/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
#![feature(path_ext)]
4040
#![feature(str_char)]
4141
#![feature(into_cow)]
42+
#![feature(fs_canonicalize)]
4243
#![feature(slice_patterns)]
4344
#![cfg_attr(test, feature(test))]
4445

@@ -138,7 +139,6 @@ pub mod plugin;
138139
pub mod lint;
139140

140141
pub mod util {
141-
pub use rustc_back::fs;
142142
pub use rustc_back::sha2;
143143

144144
pub mod common;

branches/beta/src/librustc/metadata/creader.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,10 @@ use metadata::decoder;
2121
use metadata::loader;
2222
use metadata::loader::CratePaths;
2323

24-
use std::path::{Path, PathBuf};
24+
use std::path::PathBuf;
2525
use std::rc::Rc;
26+
use std::fs;
27+
2628
use syntax::ast;
2729
use syntax::abi;
2830
use syntax::attr;
@@ -32,7 +34,6 @@ use syntax::parse;
3234
use syntax::parse::token::InternedString;
3335
use syntax::parse::token;
3436
use syntax::visit;
35-
use util::fs;
3637
use log;
3738

3839
pub struct CrateReader<'a> {
@@ -322,7 +323,7 @@ impl<'a> CrateReader<'a> {
322323
let source = self.sess.cstore.get_used_crate_source(cnum).unwrap();
323324
if let Some(locs) = self.sess.opts.externs.get(name) {
324325
let found = locs.iter().any(|l| {
325-
let l = fs::realpath(&Path::new(&l[..])).ok();
326+
let l = fs::canonicalize(l).ok();
326327
source.dylib.as_ref().map(|p| &p.0) == l.as_ref() ||
327328
source.rlib.as_ref().map(|p| &p.0) == l.as_ref()
328329
});
@@ -664,7 +665,7 @@ fn import_codemap(local_codemap: &codemap::CodeMap,
664665
.into_inner()
665666
.map_in_place(|mbc|
666667
codemap::MultiByteChar {
667-
pos: mbc.pos + start_pos,
668+
pos: mbc.pos - start_pos,
668669
bytes: mbc.bytes
669670
});
670671

branches/beta/src/librustc/metadata/filesearch.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ use std::fs;
1818
use std::io::prelude::*;
1919
use std::path::{Path, PathBuf};
2020

21-
use util::fs as myfs;
2221
use session::search_paths::{SearchPaths, PathKind};
2322

2423
#[derive(Copy, Clone)]
@@ -191,7 +190,7 @@ pub fn get_or_default_sysroot() -> PathBuf {
191190
// Follow symlinks. If the resolved path is relative, make it absolute.
192191
fn canonicalize(path: Option<PathBuf>) -> Option<PathBuf> {
193192
path.and_then(|path| {
194-
match myfs::realpath(&path) {
193+
match fs::canonicalize(&path) {
195194
Ok(canon) => Some(canon),
196195
Err(e) => panic!("failed to get realpath: {}", e),
197196
}

branches/beta/src/librustc/metadata/loader.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -225,12 +225,12 @@ use metadata::encoder;
225225
use metadata::filesearch::{FileSearch, FileMatches, FileDoesntMatch};
226226
use syntax::codemap::Span;
227227
use syntax::diagnostic::SpanHandler;
228-
use util::fs;
229228
use util::common;
230229
use rustc_back::target::Target;
231230

232231
use std::cmp;
233232
use std::collections::HashMap;
233+
use std::fs;
234234
use std::io::prelude::*;
235235
use std::io;
236236
use std::path::{Path, PathBuf};
@@ -430,9 +430,9 @@ impl<'a> Context<'a> {
430430
.or_insert_with(|| (HashMap::new(), HashMap::new()));
431431
let (ref mut rlibs, ref mut dylibs) = *slot;
432432
if rlib {
433-
rlibs.insert(fs::realpath(path).unwrap(), kind);
433+
rlibs.insert(fs::canonicalize(path).unwrap(), kind);
434434
} else {
435-
dylibs.insert(fs::realpath(path).unwrap(), kind);
435+
dylibs.insert(fs::canonicalize(path).unwrap(), kind);
436436
}
437437

438438
FileMatches
@@ -660,10 +660,10 @@ impl<'a> Context<'a> {
660660
// there's at most one rlib and at most one dylib.
661661
for loc in locs {
662662
if loc.file_name().unwrap().to_str().unwrap().ends_with(".rlib") {
663-
rlibs.insert(fs::realpath(&loc).unwrap(),
663+
rlibs.insert(fs::canonicalize(&loc).unwrap(),
664664
PathKind::ExternFlag);
665665
} else {
666-
dylibs.insert(fs::realpath(&loc).unwrap(),
666+
dylibs.insert(fs::canonicalize(&loc).unwrap(),
667667
PathKind::ExternFlag);
668668
}
669669
}

0 commit comments

Comments
 (0)