mirror of
https://github.com/rust-lang/rust
synced 2024-10-14 04:23:37 +00:00
Auto merge of #21582 - FlaPer87:rollup, r=brson
- Successful merges: #21108, #21445, #21498, #21504, #21532, #21535, #21539, #21540, #21541, #21550, #21560, #21573, #21579 - Failed merges:
This commit is contained in:
commit
102ab57d80
5
configure
vendored
5
configure
vendored
|
@ -28,8 +28,8 @@ need_ok() {
|
||||||
|
|
||||||
need_cmd() {
|
need_cmd() {
|
||||||
if command -v $1 >/dev/null 2>&1
|
if command -v $1 >/dev/null 2>&1
|
||||||
then msg "found $1"
|
then msg "found program $1"
|
||||||
else err "need $1"
|
else err "need program $1"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -340,6 +340,7 @@ need_cmd date
|
||||||
need_cmd tr
|
need_cmd tr
|
||||||
need_cmd sed
|
need_cmd sed
|
||||||
need_cmd file
|
need_cmd file
|
||||||
|
need_cmd make
|
||||||
|
|
||||||
msg "inspecting environment"
|
msg "inspecting environment"
|
||||||
|
|
||||||
|
|
|
@ -30,8 +30,8 @@ CFG_PACKAGE_VERS=$(CFG_RELEASE_NUM)
|
||||||
CFG_DISABLE_UNSTABLE_FEATURES=1
|
CFG_DISABLE_UNSTABLE_FEATURES=1
|
||||||
endif
|
endif
|
||||||
ifeq ($(CFG_RELEASE_CHANNEL),beta)
|
ifeq ($(CFG_RELEASE_CHANNEL),beta)
|
||||||
CFG_RELEASE=$(CFG_RELEASE_NUM)-beta(CFG_PRERELEASE_VERSION)
|
CFG_RELEASE=$(CFG_RELEASE_NUM)-beta$(CFG_PRERELEASE_VERSION)
|
||||||
CFG_PACKAGE_VERS=$(CFG_RELEASE_NUM)-beta(CFG_PRERELEASE_VERSION)
|
CFG_PACKAGE_VERS=$(CFG_RELEASE_NUM)-beta$(CFG_PRERELEASE_VERSION)
|
||||||
CFG_DISABLE_UNSTABLE_FEATURES=1
|
CFG_DISABLE_UNSTABLE_FEATURES=1
|
||||||
endif
|
endif
|
||||||
ifeq ($(CFG_RELEASE_CHANNEL),nightly)
|
ifeq ($(CFG_RELEASE_CHANNEL),nightly)
|
||||||
|
|
|
@ -12,6 +12,20 @@
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
|
|
||||||
|
#[cfg(stage0)] // NOTE: remove impl after snapshot
|
||||||
|
#[derive(Clone, PartialEq, Show)]
|
||||||
|
pub enum Mode {
|
||||||
|
CompileFail,
|
||||||
|
RunFail,
|
||||||
|
RunPass,
|
||||||
|
RunPassValgrind,
|
||||||
|
Pretty,
|
||||||
|
DebugInfoGdb,
|
||||||
|
DebugInfoLldb,
|
||||||
|
Codegen
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(not(stage0))] // NOTE: remove cfg after snapshot
|
||||||
#[derive(Clone, PartialEq, Debug)]
|
#[derive(Clone, PartialEq, Debug)]
|
||||||
pub enum Mode {
|
pub enum Mode {
|
||||||
CompileFail,
|
CompileFail,
|
||||||
|
@ -24,6 +38,7 @@ pub enum Mode {
|
||||||
Codegen
|
Codegen
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
impl Copy for Mode {}
|
impl Copy for Mode {}
|
||||||
|
|
||||||
impl FromStr for Mode {
|
impl FromStr for Mode {
|
||||||
|
|
|
@ -2291,136 +2291,7 @@ The name `str_eq` has a special meaning to the Rust compiler, and the presence
|
||||||
of this definition means that it will use this definition when generating calls
|
of this definition means that it will use this definition when generating calls
|
||||||
to the string equality function.
|
to the string equality function.
|
||||||
|
|
||||||
A complete list of the built-in language items follows:
|
A complete list of the built-in language items will be added in the future.
|
||||||
|
|
||||||
#### Built-in Traits
|
|
||||||
|
|
||||||
* `copy`
|
|
||||||
: Types that do not move ownership when used by-value.
|
|
||||||
* `drop`
|
|
||||||
: Have destructors.
|
|
||||||
* `send`
|
|
||||||
: Able to be sent across thread boundaries.
|
|
||||||
* `sized`
|
|
||||||
: Has a size known at compile time.
|
|
||||||
* `sync`
|
|
||||||
: Able to be safely shared between threads when aliased.
|
|
||||||
|
|
||||||
#### Operators
|
|
||||||
|
|
||||||
These language items are traits:
|
|
||||||
|
|
||||||
* `add`
|
|
||||||
: Elements can be added (for example, integers and floats).
|
|
||||||
* `sub`
|
|
||||||
: Elements can be subtracted.
|
|
||||||
* `mul`
|
|
||||||
: Elements can be multiplied.
|
|
||||||
* `div`
|
|
||||||
: Elements have a division operation.
|
|
||||||
* `rem`
|
|
||||||
: Elements have a remainder operation.
|
|
||||||
* `neg`
|
|
||||||
: Elements can be negated arithmetically.
|
|
||||||
* `not`
|
|
||||||
: Elements can be negated logically.
|
|
||||||
* `bitxor`
|
|
||||||
: Elements have an exclusive-or operation.
|
|
||||||
* `bitand`
|
|
||||||
: Elements have a bitwise `and` operation.
|
|
||||||
* `bitor`
|
|
||||||
: Elements have a bitwise `or` operation.
|
|
||||||
* `shl`
|
|
||||||
: Elements have a left shift operation.
|
|
||||||
* `shr`
|
|
||||||
: Elements have a right shift operation.
|
|
||||||
* `index`
|
|
||||||
: Elements can be indexed.
|
|
||||||
* `index_mut`
|
|
||||||
: ___Needs filling in___
|
|
||||||
* `eq`
|
|
||||||
: Elements can be compared for equality.
|
|
||||||
* `ord`
|
|
||||||
: Elements have a partial ordering.
|
|
||||||
* `deref`
|
|
||||||
: `*` can be applied, yielding a reference to another type.
|
|
||||||
* `deref_mut`
|
|
||||||
: `*` can be applied, yielding a mutable reference to another type.
|
|
||||||
|
|
||||||
These are functions:
|
|
||||||
|
|
||||||
* `fn`
|
|
||||||
: ___Needs filling in___
|
|
||||||
* `fn_mut`
|
|
||||||
: ___Needs filling in___
|
|
||||||
* `fn_once`
|
|
||||||
: ___Needs filling in___
|
|
||||||
* `str_eq`
|
|
||||||
: Compare two strings (`&str`) for equality.
|
|
||||||
* `strdup_uniq`
|
|
||||||
: Return a new unique string
|
|
||||||
containing a copy of the contents of a unique string.
|
|
||||||
|
|
||||||
#### Types
|
|
||||||
|
|
||||||
* `type_id`
|
|
||||||
: The type returned by the `type_id` intrinsic.
|
|
||||||
* `unsafe`
|
|
||||||
: A type whose contents can be mutated through an immutable reference.
|
|
||||||
|
|
||||||
#### Marker types
|
|
||||||
|
|
||||||
These types help drive the compiler's analysis
|
|
||||||
|
|
||||||
* `begin_unwind`
|
|
||||||
: ___Needs filling in___
|
|
||||||
* `no_copy_bound`
|
|
||||||
: This type does not implement "copy", even if eligible.
|
|
||||||
* `eh_personality`
|
|
||||||
: ___Needs filling in___
|
|
||||||
* `exchange_free`
|
|
||||||
: Free memory that was allocated on the exchange heap.
|
|
||||||
* `exchange_malloc`
|
|
||||||
: Allocate memory on the exchange heap.
|
|
||||||
* `closure_exchange_malloc`
|
|
||||||
: ___Needs filling in___
|
|
||||||
* `panic`
|
|
||||||
: Abort the program with an error.
|
|
||||||
* `fail_bounds_check`
|
|
||||||
: Abort the program with a bounds check error.
|
|
||||||
* `free`
|
|
||||||
: Free memory that was allocated on the managed heap.
|
|
||||||
* `gc`
|
|
||||||
: ___Needs filling in___
|
|
||||||
* `exchange_heap`
|
|
||||||
: ___Needs filling in___
|
|
||||||
* `iterator`
|
|
||||||
: ___Needs filling in___
|
|
||||||
* `contravariant_lifetime`
|
|
||||||
: The lifetime parameter should be considered contravariant.
|
|
||||||
* `covariant_lifetime`
|
|
||||||
: The lifetime parameter should be considered covariant.
|
|
||||||
* `invariant_lifetime`
|
|
||||||
: The lifetime parameter should be considered invariant.
|
|
||||||
* `malloc`
|
|
||||||
: Allocate memory on the managed heap.
|
|
||||||
* `owned_box`
|
|
||||||
: ___Needs filling in___
|
|
||||||
* `stack_exhausted`
|
|
||||||
: ___Needs filling in___
|
|
||||||
* `start`
|
|
||||||
: ___Needs filling in___
|
|
||||||
* `contravariant_type`
|
|
||||||
: The type parameter should be considered contravariant.
|
|
||||||
* `covariant_type`
|
|
||||||
: The type parameter should be considered covariant.
|
|
||||||
* `invariant_type`
|
|
||||||
: The type parameter should be considered invariant.
|
|
||||||
* `ty_desc`
|
|
||||||
: ___Needs filling in___
|
|
||||||
|
|
||||||
> **Note:** This list is likely to become out of date. We should auto-generate
|
|
||||||
> it from `librustc/middle/lang_items.rs`.
|
|
||||||
|
|
||||||
### Inline attributes
|
### Inline attributes
|
||||||
|
|
||||||
|
@ -2652,9 +2523,7 @@ The currently implemented features of the reference compiler are:
|
||||||
declare a `static` as being unique per-thread leveraging
|
declare a `static` as being unique per-thread leveraging
|
||||||
LLVM's implementation which works in concert with the kernel
|
LLVM's implementation which works in concert with the kernel
|
||||||
loader and dynamic linker. This is not necessarily available
|
loader and dynamic linker. This is not necessarily available
|
||||||
on all platforms, and usage of it is discouraged (rust
|
on all platforms, and usage of it is discouraged.
|
||||||
focuses more on thread-local data instead of thread-local
|
|
||||||
data).
|
|
||||||
|
|
||||||
* `trace_macros` - Allows use of the `trace_macros` macro, which is a nasty
|
* `trace_macros` - Allows use of the `trace_macros` macro, which is a nasty
|
||||||
hack that will certainly be removed.
|
hack that will certainly be removed.
|
||||||
|
|
|
@ -83,7 +83,6 @@ If not, there are a number of places where you can get help. The easiest is
|
||||||
you can access through
|
you can access through
|
||||||
[Mibbit](http://chat.mibbit.com/?server=irc.mozilla.org&channel=%23rust). Click
|
[Mibbit](http://chat.mibbit.com/?server=irc.mozilla.org&channel=%23rust). Click
|
||||||
that link, and you'll be chatting with other Rustaceans (a silly nickname we
|
that link, and you'll be chatting with other Rustaceans (a silly nickname we
|
||||||
call ourselves), and we can help you out. Other great resources include [our
|
call ourselves), and we can help you out. Other great resources include [the
|
||||||
forum](http://discuss.rust-lang.org/), [the /r/rust
|
/r/rust subreddit](http://www.reddit.com/r/rust), and [Stack
|
||||||
subreddit](http://www.reddit.com/r/rust), and [Stack
|
|
||||||
Overflow](http://stackoverflow.com/questions/tagged/rust).
|
Overflow](http://stackoverflow.com/questions/tagged/rust).
|
||||||
|
|
|
@ -18,6 +18,8 @@ x.foo().bar().baz();
|
||||||
Luckily, as you may have guessed with the leading question, you can! Rust provides
|
Luckily, as you may have guessed with the leading question, you can! Rust provides
|
||||||
the ability to use this *method call syntax* via the `impl` keyword.
|
the ability to use this *method call syntax* via the `impl` keyword.
|
||||||
|
|
||||||
|
## Method calls
|
||||||
|
|
||||||
Here's how it works:
|
Here's how it works:
|
||||||
|
|
||||||
```{rust}
|
```{rust}
|
||||||
|
@ -56,11 +58,56 @@ other parameter. Because we know it's a `Circle`, we can access the `radius`
|
||||||
just like we would with any other struct. An import of π and some
|
just like we would with any other struct. An import of π and some
|
||||||
multiplications later, and we have our area.
|
multiplications later, and we have our area.
|
||||||
|
|
||||||
|
## Chaining method calls
|
||||||
|
|
||||||
|
So, now we know how to call a method, such as `foo.bar()`. But what about our
|
||||||
|
original example, `foo.bar().baz()`? This is called 'method chaining', and we
|
||||||
|
can do it by returning `self`.
|
||||||
|
|
||||||
|
```
|
||||||
|
struct Circle {
|
||||||
|
x: f64,
|
||||||
|
y: f64,
|
||||||
|
radius: f64,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Circle {
|
||||||
|
fn area(&self) -> f64 {
|
||||||
|
std::f64::consts::PI * (self.radius * self.radius)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn grow(&self) -> Circle {
|
||||||
|
Circle { x: self.x, y: self.y, radius: (self.radius * 10.0) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let c = Circle { x: 0.0, y: 0.0, radius: 2.0 };
|
||||||
|
println!("{}", c.area());
|
||||||
|
|
||||||
|
let d = c.grow().area();
|
||||||
|
println!("{}", d);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Check the return type:
|
||||||
|
|
||||||
|
```
|
||||||
|
# struct Circle;
|
||||||
|
# impl Circle {
|
||||||
|
fn grow(&self) -> Circle {
|
||||||
|
# Circle } }
|
||||||
|
```
|
||||||
|
|
||||||
|
We just say we're returning a `Circle`. With this, we can grow a new circle
|
||||||
|
that's twice as big as the old one.
|
||||||
|
|
||||||
|
## Static methods
|
||||||
|
|
||||||
You can also define methods that do not take a `self` parameter. Here's a
|
You can also define methods that do not take a `self` parameter. Here's a
|
||||||
pattern that's very common in Rust code:
|
pattern that's very common in Rust code:
|
||||||
|
|
||||||
```{rust}
|
```
|
||||||
# #![allow(non_shorthand_field_patterns)]
|
|
||||||
struct Circle {
|
struct Circle {
|
||||||
x: f64,
|
x: f64,
|
||||||
y: f64,
|
y: f64,
|
||||||
|
@ -86,3 +133,66 @@ This *static method* builds a new `Circle` for us. Note that static methods
|
||||||
are called with the `Struct::method()` syntax, rather than the `ref.method()`
|
are called with the `Struct::method()` syntax, rather than the `ref.method()`
|
||||||
syntax.
|
syntax.
|
||||||
|
|
||||||
|
## Builder Pattern
|
||||||
|
|
||||||
|
Let's say that we want our users to be able to create Circles, but we will
|
||||||
|
allow them to only set the properties they care about. Otherwise, the `x`
|
||||||
|
and `y` attributes will be `0.0`, and the `radius` will be `1.0`. Rust doesn't
|
||||||
|
have method overloading, named arguments, or variable arguments. We employ
|
||||||
|
the builder pattern instead. It looks like this:
|
||||||
|
|
||||||
|
```
|
||||||
|
struct Circle {
|
||||||
|
x: f64,
|
||||||
|
y: f64,
|
||||||
|
radius: f64,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Circle {
|
||||||
|
fn area(&self) -> f64 {
|
||||||
|
std::f64::consts::PI * (self.radius * self.radius)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct CircleBuilder {
|
||||||
|
coordinate: f64,
|
||||||
|
radius: f64,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl CircleBuilder {
|
||||||
|
fn new() -> CircleBuilder {
|
||||||
|
CircleBuilder { coordinate: 0.0, radius: 0.0, }
|
||||||
|
}
|
||||||
|
|
||||||
|
fn coordinate(&mut self, coordinate: f64) -> &mut CircleBuilder {
|
||||||
|
self.coordinate = coordinate;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
fn radius(&mut self, radius: f64) -> &mut CircleBuilder {
|
||||||
|
self.radius = radius;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
fn finalize(&self) -> Circle {
|
||||||
|
Circle { x: self.coordinate, y: self.coordinate, radius: self.radius }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let c = CircleBuilder::new()
|
||||||
|
.coordinate(10.0)
|
||||||
|
.radius(5.0)
|
||||||
|
.finalize();
|
||||||
|
|
||||||
|
|
||||||
|
println!("area: {}", c.area());
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
What we've done here is make another struct, `CircleBuilder`. We've defined our
|
||||||
|
builder methods on it. We've also defined our `area()` method on `Circle`. We
|
||||||
|
also made one more method on `CircleBuilder`: `finalize()`. This method creates
|
||||||
|
our final `Circle` from the builder. Now, we've used the type system to enforce
|
||||||
|
our concerns: we can use the methods on `CircleBuilder` to constrain making
|
||||||
|
`Circle`s in any way we choose.
|
||||||
|
|
|
@ -14,11 +14,10 @@
|
||||||
import sys, os, re
|
import sys, os, re
|
||||||
|
|
||||||
src_dir = sys.argv[1]
|
src_dir = sys.argv[1]
|
||||||
|
errcode_map = {}
|
||||||
errcode_map = { }
|
error_re = re.compile("(E\d\d\d\d)")
|
||||||
|
|
||||||
for (dirpath, dirnames, filenames) in os.walk(src_dir):
|
for (dirpath, dirnames, filenames) in os.walk(src_dir):
|
||||||
|
|
||||||
if "src/test" in dirpath or "src/llvm" in dirpath:
|
if "src/test" in dirpath or "src/llvm" in dirpath:
|
||||||
# Short circuit for fast
|
# Short circuit for fast
|
||||||
continue
|
continue
|
||||||
|
@ -28,15 +27,12 @@ for (dirpath, dirnames, filenames) in os.walk(src_dir):
|
||||||
continue
|
continue
|
||||||
|
|
||||||
path = os.path.join(dirpath, filename)
|
path = os.path.join(dirpath, filename)
|
||||||
line_num = 1
|
|
||||||
with open(path, 'r') as f:
|
with open(path, 'r') as f:
|
||||||
for line in f:
|
for line_num, line in enumerate(f, start=1):
|
||||||
|
match = error_re.search(line)
|
||||||
p = re.compile("(E\d\d\d\d)")
|
if match:
|
||||||
m = p.search(line)
|
errcode = match.group(1)
|
||||||
if not m is None:
|
|
||||||
errcode = m.group(1)
|
|
||||||
|
|
||||||
new_record = [(errcode, path, line_num, line)]
|
new_record = [(errcode, path, line_num, line)]
|
||||||
existing = errcode_map.get(errcode)
|
existing = errcode_map.get(errcode)
|
||||||
if existing is not None:
|
if existing is not None:
|
||||||
|
@ -45,26 +41,19 @@ for (dirpath, dirnames, filenames) in os.walk(src_dir):
|
||||||
else:
|
else:
|
||||||
errcode_map[errcode] = new_record
|
errcode_map[errcode] = new_record
|
||||||
|
|
||||||
line_num += 1
|
|
||||||
|
|
||||||
errors = False
|
errors = False
|
||||||
all_errors = []
|
all_errors = []
|
||||||
for errcode in errcode_map:
|
|
||||||
entries = errcode_map[errcode]
|
for errcode, entries in errcode_map.items():
|
||||||
all_errors += [entries[0][0]]
|
all_errors.append(entries[0][0])
|
||||||
if len(entries) > 1:
|
if len(entries) > 1:
|
||||||
print "error: duplicate error code " + errcode
|
print("error: duplicate error code " + errcode)
|
||||||
for entry in entries:
|
for entry in entries:
|
||||||
print entry[1] + ": " + str(entry[2])
|
print("{1}: {2}\n{3}".format(*entry))
|
||||||
print entry[3]
|
|
||||||
errors = True
|
errors = True
|
||||||
|
|
||||||
print str(len(errcode_map)) + " error codes"
|
print("{0} error codes".format(len(errcode_map)))
|
||||||
|
print("highest error code: " + max(all_errors))
|
||||||
all_errors.sort()
|
|
||||||
all_errors.reverse()
|
|
||||||
|
|
||||||
print "highest error code: " + all_errors[0]
|
|
||||||
|
|
||||||
if errors:
|
if errors:
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
|
@ -8,29 +8,18 @@
|
||||||
# option. This file may not be copied, modified, or distributed
|
# option. This file may not be copied, modified, or distributed
|
||||||
# except according to those terms.
|
# except according to those terms.
|
||||||
|
|
||||||
license1 = """// Copyright """
|
import re
|
||||||
license2 = """ 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.
|
|
||||||
"""
|
|
||||||
|
|
||||||
license3 = """# Copyright """
|
license_re = re.compile(
|
||||||
license4 = """ The Rust Project Developers. See the COPYRIGHT
|
u"""(#|//) Copyright .* The Rust Project Developers. See the COPYRIGHT
|
||||||
# file at the top-level directory of this distribution and at
|
\\1 file at the top-level directory of this distribution and at
|
||||||
# http://rust-lang.org/COPYRIGHT.
|
\\1 http://rust-lang.org/COPYRIGHT.
|
||||||
#
|
\\1
|
||||||
# Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
\\1 Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
\\1 http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||||
# <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
\\1 <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||||
# option. This file may not be copied, modified, or distributed
|
\\1 option. This file may not be copied, modified, or distributed
|
||||||
# except according to those terms.
|
\\1 except according to those terms.""")
|
||||||
"""
|
|
||||||
|
|
||||||
exceptions = [
|
exceptions = [
|
||||||
"rt/rust_android_dummy.cpp", # BSD, chromium
|
"rt/rust_android_dummy.cpp", # BSD, chromium
|
||||||
|
@ -57,18 +46,14 @@ exceptions = [
|
||||||
|
|
||||||
def check_license(name, contents):
|
def check_license(name, contents):
|
||||||
# Whitelist check
|
# Whitelist check
|
||||||
for exception in exceptions:
|
if any(name.endswith(e) for e in exceptions):
|
||||||
if name.endswith(exception):
|
return True
|
||||||
return True
|
|
||||||
|
|
||||||
# Xfail check
|
# Xfail check
|
||||||
firstlineish = contents[:100]
|
firstlineish = contents[:100]
|
||||||
if firstlineish.find("ignore-license") != -1:
|
if "ignore-license" in firstlineish:
|
||||||
return True
|
return True
|
||||||
|
|
||||||
# License check
|
# License check
|
||||||
boilerplate = contents[:500]
|
boilerplate = contents[:500]
|
||||||
if (boilerplate.find(license1) == -1 or boilerplate.find(license2) == -1) and \
|
return bool(license_re.search(boilerplate))
|
||||||
(boilerplate.find(license3) == -1 or boilerplate.find(license4) == -1):
|
|
||||||
return False
|
|
||||||
return True
|
|
||||||
|
|
|
@ -113,7 +113,7 @@ try:
|
||||||
if current_name != "":
|
if current_name != "":
|
||||||
do_license_check(current_name, current_contents)
|
do_license_check(current_name, current_contents)
|
||||||
|
|
||||||
except UnicodeDecodeError, e:
|
except UnicodeDecodeError as e:
|
||||||
report_err("UTF-8 decoding error " + str(e))
|
report_err("UTF-8 decoding error " + str(e))
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -243,6 +243,8 @@ pub trait Show {
|
||||||
/// Format trait for the `:?` format. Useful for debugging, most all types
|
/// Format trait for the `:?` format. Useful for debugging, most all types
|
||||||
/// should implement this.
|
/// should implement this.
|
||||||
#[unstable = "I/O and core have yet to be reconciled"]
|
#[unstable = "I/O and core have yet to be reconciled"]
|
||||||
|
#[rustc_on_unimplemented = "`{Self}` cannot be formatted using `:?`; if it is defined in your \
|
||||||
|
crate, add `#[derive(Debug)]` or manually implement it"]
|
||||||
pub trait Debug {
|
pub trait Debug {
|
||||||
/// Formats the value using the given formatter.
|
/// Formats the value using the given formatter.
|
||||||
fn fmt(&self, &mut Formatter) -> Result;
|
fn fmt(&self, &mut Formatter) -> Result;
|
||||||
|
@ -266,6 +268,8 @@ pub trait String {
|
||||||
/// When a value can be semantically expressed as a String, this trait may be
|
/// When a value can be semantically expressed as a String, this trait may be
|
||||||
/// used. It corresponds to the default format, `{}`.
|
/// used. It corresponds to the default format, `{}`.
|
||||||
#[unstable = "I/O and core have yet to be reconciled"]
|
#[unstable = "I/O and core have yet to be reconciled"]
|
||||||
|
#[rustc_on_unimplemented = "`{Self}` cannot be formatted with the default formatter; try using \
|
||||||
|
`:?` instead if you are using a format string"]
|
||||||
pub trait Display {
|
pub trait Display {
|
||||||
/// Formats the value using the given formatter.
|
/// Formats the value using the given formatter.
|
||||||
fn fmt(&self, &mut Formatter) -> Result;
|
fn fmt(&self, &mut Formatter) -> Result;
|
||||||
|
|
|
@ -82,6 +82,8 @@
|
||||||
/// else.
|
/// else.
|
||||||
#[lang="iterator"]
|
#[lang="iterator"]
|
||||||
#[stable]
|
#[stable]
|
||||||
|
#[rustc_on_unimplemented = "`{Self}` is not an iterator; maybe try calling `.iter()` or a similar \
|
||||||
|
method"]
|
||||||
pub trait Iterator {
|
pub trait Iterator {
|
||||||
#[stable]
|
#[stable]
|
||||||
type Item;
|
type Item;
|
||||||
|
|
|
@ -27,9 +27,10 @@
|
||||||
|
|
||||||
use clone::Clone;
|
use clone::Clone;
|
||||||
|
|
||||||
/// Types able to be transferred across task boundaries.
|
/// Types able to be transferred across thread boundaries.
|
||||||
#[unstable = "will be overhauled with new lifetime rules; see RFC 458"]
|
#[unstable = "will be overhauled with new lifetime rules; see RFC 458"]
|
||||||
#[lang="send"]
|
#[lang="send"]
|
||||||
|
#[rustc_on_unimplemented = "`{Self}` cannot be sent between threads safely"]
|
||||||
pub unsafe trait Send: 'static {
|
pub unsafe trait Send: 'static {
|
||||||
// empty.
|
// empty.
|
||||||
}
|
}
|
||||||
|
@ -37,6 +38,7 @@ pub unsafe trait Send: 'static {
|
||||||
/// Types with a constant size known at compile-time.
|
/// Types with a constant size known at compile-time.
|
||||||
#[stable]
|
#[stable]
|
||||||
#[lang="sized"]
|
#[lang="sized"]
|
||||||
|
#[rustc_on_unimplemented = "`{Self}` does not have a constant size known at compile-time"]
|
||||||
pub trait Sized {
|
pub trait Sized {
|
||||||
// Empty.
|
// Empty.
|
||||||
}
|
}
|
||||||
|
@ -146,11 +148,11 @@ pub trait Copy {
|
||||||
// Empty.
|
// Empty.
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Types that can be safely shared between tasks when aliased.
|
/// Types that can be safely shared between threads when aliased.
|
||||||
///
|
///
|
||||||
/// The precise definition is: a type `T` is `Sync` if `&T` is
|
/// The precise definition is: a type `T` is `Sync` if `&T` is
|
||||||
/// thread-safe. In other words, there is no possibility of data races
|
/// thread-safe. In other words, there is no possibility of data races
|
||||||
/// when passing `&T` references between tasks.
|
/// when passing `&T` references between threads.
|
||||||
///
|
///
|
||||||
/// As one would expect, primitive types like `u8` and `f64` are all
|
/// As one would expect, primitive types like `u8` and `f64` are all
|
||||||
/// `Sync`, and so are simple aggregate types containing them (like
|
/// `Sync`, and so are simple aggregate types containing them (like
|
||||||
|
@ -193,6 +195,7 @@ pub trait Copy {
|
||||||
/// `transmute`-ing from `&T` to `&mut T` is illegal).
|
/// `transmute`-ing from `&T` to `&mut T` is illegal).
|
||||||
#[unstable = "will be overhauled with new lifetime rules; see RFC 458"]
|
#[unstable = "will be overhauled with new lifetime rules; see RFC 458"]
|
||||||
#[lang="sync"]
|
#[lang="sync"]
|
||||||
|
#[rustc_on_unimplemented = "`{Self}` cannot be shared between threads safely"]
|
||||||
pub unsafe trait Sync {
|
pub unsafe trait Sync {
|
||||||
// Empty
|
// Empty
|
||||||
}
|
}
|
||||||
|
|
|
@ -295,6 +295,7 @@ fn has_test_signature(i: &ast::Item) -> HasTestSignature {
|
||||||
&ast::ItemFn(ref decl, _, _, ref generics, _) => {
|
&ast::ItemFn(ref decl, _, _, ref generics, _) => {
|
||||||
let no_output = match decl.output {
|
let no_output = match decl.output {
|
||||||
ast::DefaultReturn(..) => true,
|
ast::DefaultReturn(..) => true,
|
||||||
|
ast::Return(ref t) if t.node == ast::TyTup(vec![]) => true,
|
||||||
_ => false
|
_ => false
|
||||||
};
|
};
|
||||||
if decl.inputs.is_empty()
|
if decl.inputs.is_empty()
|
||||||
|
@ -331,6 +332,7 @@ fn has_test_signature(i: &ast::Item) -> bool {
|
||||||
let input_cnt = decl.inputs.len();
|
let input_cnt = decl.inputs.len();
|
||||||
let no_output = match decl.output {
|
let no_output = match decl.output {
|
||||||
ast::DefaultReturn(..) => true,
|
ast::DefaultReturn(..) => true,
|
||||||
|
ast::Return(ref t) if t.node == ast::TyTup(vec![]) => true,
|
||||||
_ => false
|
_ => false
|
||||||
};
|
};
|
||||||
let tparm_cnt = generics.ty_params.len();
|
let tparm_cnt = generics.ty_params.len();
|
||||||
|
|
22
src/test/compile-fail/issue-19660.rs
Normal file
22
src/test/compile-fail/issue-19660.rs
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
// Copyright 2015 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.
|
||||||
|
|
||||||
|
// error-pattern: requires `copy` lang_item
|
||||||
|
|
||||||
|
#![feature(lang_items, start)]
|
||||||
|
#![no_std]
|
||||||
|
|
||||||
|
#[lang = "sized"]
|
||||||
|
trait Sized {}
|
||||||
|
|
||||||
|
#[start]
|
||||||
|
fn main(_: int, _: *const *const u8) -> int {
|
||||||
|
0
|
||||||
|
}
|
|
@ -8,33 +8,54 @@
|
||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
use std::io::{TempDir, Command, fs};
|
use std::slice::SliceExt;
|
||||||
|
use std::io::{Command, fs, USER_RWX};
|
||||||
use std::os;
|
use std::os;
|
||||||
|
use std::path::BytesContainer;
|
||||||
|
use std::rand::random;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
// If we're the child, make sure we were invoked correctly
|
// If we're the child, make sure we were invoked correctly
|
||||||
let args = os::args();
|
let args = os::args();
|
||||||
if args.len() > 1 && args[1].as_slice() == "child" {
|
if args.len() > 1 && args[1].as_slice() == "child" {
|
||||||
return assert_eq!(args[0].as_slice(), "mytest");
|
// FIXME: This should check the whole `args[0]` instead of just
|
||||||
|
// checking that it ends_with the executable name. This
|
||||||
|
// is needed because of Windows, which has a different behavior.
|
||||||
|
// See #15149 for more info.
|
||||||
|
return assert!(args[0].ends_with(&format!("mytest{}", os::consts::EXE_SUFFIX)[]));
|
||||||
}
|
}
|
||||||
|
|
||||||
test();
|
test();
|
||||||
}
|
}
|
||||||
|
|
||||||
fn test() {
|
fn test() {
|
||||||
// If we're the parent, copy our own binary to a tempr directory, and then
|
// If we're the parent, copy our own binary to a new directory.
|
||||||
// make it executable.
|
let my_path = os::self_exe_name().unwrap();
|
||||||
let dir = TempDir::new("mytest").unwrap();
|
let my_dir = my_path.dir_path();
|
||||||
let me = os::self_exe_name().unwrap();
|
|
||||||
let dest = dir.path().join(format!("mytest{}", os::consts::EXE_SUFFIX));
|
|
||||||
fs::copy(&me, &dest).unwrap();
|
|
||||||
|
|
||||||
// Append the temp directory to our own PATH.
|
let random_u32: u32 = random();
|
||||||
|
let child_dir = Path::new(my_dir.join(format!("issue-15149-child-{}",
|
||||||
|
random_u32)));
|
||||||
|
fs::mkdir(&child_dir, USER_RWX).unwrap();
|
||||||
|
|
||||||
|
let child_path = child_dir.join(format!("mytest{}",
|
||||||
|
os::consts::EXE_SUFFIX));
|
||||||
|
fs::copy(&my_path, &child_path).unwrap();
|
||||||
|
|
||||||
|
// Append the new directory to our own PATH.
|
||||||
let mut path = os::split_paths(os::getenv("PATH").unwrap_or(String::new()));
|
let mut path = os::split_paths(os::getenv("PATH").unwrap_or(String::new()));
|
||||||
path.push(dir.path().clone());
|
path.push(child_dir.clone());
|
||||||
let path = os::join_paths(path.as_slice()).unwrap();
|
let path = os::join_paths(path.as_slice()).unwrap();
|
||||||
|
|
||||||
Command::new("mytest").env("PATH", path.as_slice())
|
let child_output = Command::new("mytest").env("PATH", path.as_slice())
|
||||||
.arg("child")
|
.arg("child")
|
||||||
.spawn().unwrap();
|
.output().unwrap();
|
||||||
|
|
||||||
|
assert!(child_output.status.success(),
|
||||||
|
format!("child assertion failed\n child stdout:\n {}\n child stderr:\n {}",
|
||||||
|
child_output.output.container_as_str().unwrap(),
|
||||||
|
child_output.error.container_as_str().unwrap()));
|
||||||
|
|
||||||
|
fs::rmdir_recursive(&child_dir).unwrap();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
// Copyright 2015 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.
|
||||||
|
|
||||||
|
// compile-flags: --test
|
||||||
|
// no-pretty-expanded
|
||||||
|
extern crate test;
|
||||||
|
|
||||||
|
#[bench]
|
||||||
|
fn bench_explicit_return_type(_: &mut ::test::Bencher) -> () {}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_explicit_return_type() -> () {}
|
||||||
|
|
Loading…
Reference in a new issue