Skip to content

Commit e39236c

Browse files
committed
---
yaml --- r: 225919 b: refs/heads/stable c: 8e969de h: refs/heads/master i: 225917: 3d29a27 225915: c6d8d36 225911: c8ddc67 225903: 0215163 225887: bb8968b 225855: e3122b2 225791: 224bfdb v: v3
1 parent f4e2232 commit e39236c

Some content is hidden

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

42 files changed

+214
-583
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,6 @@ refs/heads/tmp: e5d90d98402475b6e154ce216f9efcb80da1a747
2929
refs/tags/1.0.0-alpha.2: 4c705f6bc559886632d3871b04f58aab093bfa2f
3030
refs/tags/homu-tmp: 1fe32ca12c51afcd761d9962f51a74ff0d07a591
3131
refs/tags/1.0.0-beta: 8cbb92b53468ee2b0c2d3eeb8567005953d40828
32-
refs/heads/stable: 3afc385ae1e25b3747980a1d2652a1fd8c282359
32+
refs/heads/stable: 8e969dee689ecdb588434080a614a11fca0ecde7
3333
refs/tags/1.0.0: 55bd4f8ff2b323f317ae89e254ce87162d52a375
3434
refs/tags/1.1.0: bc3c16f09287e5545c1d3f76b7abd54f2eca868b

branches/stable/src/doc/reference.md

Lines changed: 8 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -944,20 +944,9 @@ fn foo<T>(x: T) where T: Debug {
944944
```
945945

946946
When a generic function is referenced, its type is instantiated based on the
947-
context of the reference. For example, calling the `foo` function here:
948-
949-
```
950-
use std::fmt::Debug;
951-
952-
fn foo<T>(x: &[T]) where T: Debug {
953-
// details elided
954-
# ()
955-
}
956-
957-
foo(&[1, 2]);
958-
```
959-
960-
will instantiate type parameter `T` with `i32`.
947+
context of the reference. For example, calling the `iter` function defined
948+
above on `[1, 2]` will instantiate type parameter `T` with `i32`, and require
949+
the closure parameter to have type `Fn(i32)`.
961950

962951
The type parameters can also be explicitly supplied in a trailing
963952
[path](#paths) component after the function name. This might be necessary if
@@ -2779,24 +2768,22 @@ meaning of the operators on standard types is given here.
27792768
Like the [arithmetic operators](#arithmetic-operators), bitwise operators are
27802769
syntactic sugar for calls to methods of built-in traits. This means that
27812770
bitwise operators can be overridden for user-defined types. The default
2782-
meaning of the operators on standard types is given here. Bitwise `&`, `|` and
2783-
`^` applied to boolean arguments are equivalent to logical `&&`, `||` and `!=`
2784-
evaluated in non-lazy fashion.
2771+
meaning of the operators on standard types is given here.
27852772

27862773
* `&`
2787-
: Bitwise AND.
2774+
: And.
27882775
Calls the `bitand` method of the `std::ops::BitAnd` trait.
27892776
* `|`
2790-
: Bitwise inclusive OR.
2777+
: Inclusive or.
27912778
Calls the `bitor` method of the `std::ops::BitOr` trait.
27922779
* `^`
2793-
: Bitwise exclusive OR.
2780+
: Exclusive or.
27942781
Calls the `bitxor` method of the `std::ops::BitXor` trait.
27952782
* `<<`
27962783
: Left shift.
27972784
Calls the `shl` method of the `std::ops::Shl` trait.
27982785
* `>>`
2799-
: Right shift (arithmetic).
2786+
: Right shift.
28002787
Calls the `shr` method of the `std::ops::Shr` trait.
28012788

28022789
#### Lazy boolean operators

branches/stable/src/doc/trpl/traits.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -332,7 +332,7 @@ fn normal<T: ConvertTo<i64>>(x: &T) -> i64 {
332332
fn inverse<T>() -> T
333333
// this is using ConvertTo as if it were "ConvertFrom<i32>"
334334
where i32: ConvertTo<T> {
335-
42.convert()
335+
1i32.convert()
336336
}
337337
```
338338

branches/stable/src/libcore/char.rs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,17 @@ pub const MAX: char = '\u{10ffff}';
7474
/// ```
7575
/// use std::char;
7676
///
77-
/// assert_eq!(char::from_u32(0x2764), Some('❤'));
78-
/// assert_eq!(char::from_u32(0x110000), None); // invalid character
77+
/// let c = char::from_u32(10084); // produces `Some(❤)`
78+
/// assert_eq!(c, Some('❤'));
79+
/// ```
80+
///
81+
/// An invalid character:
82+
///
83+
/// ```
84+
/// use std::char;
85+
///
86+
/// let none = char::from_u32(1114112);
87+
/// assert_eq!(none, None);
7988
/// ```
8089
#[inline]
8190
#[stable(feature = "rust1", since = "1.0.0")]

branches/stable/src/librustc/middle/check_const.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,7 @@ impl<'a, 'tcx> CheckCrateVisitor<'a, 'tcx> {
285285
fn check_static_type(&self, e: &ast::Expr) {
286286
let ty = ty::node_id_to_type(self.tcx, e.id);
287287
let infcx = infer::new_infer_ctxt(self.tcx);
288-
let mut fulfill_cx = traits::FulfillmentContext::new(false);
288+
let mut fulfill_cx = traits::FulfillmentContext::new();
289289
let cause = traits::ObligationCause::new(e.span, e.id, traits::SharedStatic);
290290
fulfill_cx.register_builtin_bound(&infcx, ty, ty::BoundSync, cause);
291291
let env = ty::empty_parameter_environment(self.tcx);

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

Lines changed: 1 addition & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@ struct MarkSymbolVisitor<'a, 'tcx: 'a> {
4848
struct_has_extern_repr: bool,
4949
ignore_non_const_paths: bool,
5050
inherited_pub_visibility: bool,
51-
ignore_variant_stack: Vec<ast::NodeId>,
5251
}
5352

5453
impl<'a, 'tcx> MarkSymbolVisitor<'a, 'tcx> {
@@ -61,7 +60,6 @@ impl<'a, 'tcx> MarkSymbolVisitor<'a, 'tcx> {
6160
struct_has_extern_repr: false,
6261
ignore_non_const_paths: false,
6362
inherited_pub_visibility: false,
64-
ignore_variant_stack: vec![],
6563
}
6664
}
6765

@@ -82,9 +80,7 @@ impl<'a, 'tcx> MarkSymbolVisitor<'a, 'tcx> {
8280
def::DefPrimTy(_) => (),
8381
def::DefVariant(enum_id, variant_id, _) => {
8482
self.check_def_id(enum_id);
85-
if !self.ignore_variant_stack.contains(&variant_id.node) {
86-
self.check_def_id(variant_id);
87-
}
83+
self.check_def_id(variant_id);
8884
}
8985
_ => {
9086
self.check_def_id(def.def_id());
@@ -276,23 +272,6 @@ impl<'a, 'tcx, 'v> Visitor<'v> for MarkSymbolVisitor<'a, 'tcx> {
276272
visit::walk_expr(self, expr);
277273
}
278274

279-
fn visit_arm(&mut self, arm: &ast::Arm) {
280-
if arm.pats.len() == 1 {
281-
let pat = &*arm.pats[0];
282-
let variants = pat_util::necessary_variants(&self.tcx.def_map, pat);
283-
284-
// Inside the body, ignore constructions of variants
285-
// necessary for the pattern to match. Those construction sites
286-
// can't be reached unless the variant is constructed elsewhere.
287-
let len = self.ignore_variant_stack.len();
288-
self.ignore_variant_stack.push_all(&*variants);
289-
visit::walk_arm(self, arm);
290-
self.ignore_variant_stack.truncate(len);
291-
} else {
292-
visit::walk_arm(self, arm);
293-
}
294-
}
295-
296275
fn visit_pat(&mut self, pat: &ast::Pat) {
297276
let def_map = &self.tcx.def_map;
298277
match pat.node {
@@ -414,11 +393,6 @@ fn create_and_seed_worklist(tcx: &ty::ctxt,
414393
worklist.push(*id);
415394
}
416395
for id in reachable_symbols {
417-
// Reachable variants can be dead, because we warn about
418-
// variants never constructed, not variants never used.
419-
if let Some(ast_map::NodeVariant(..)) = tcx.map.find(*id) {
420-
continue;
421-
}
422396
worklist.push(*id);
423397
}
424398

branches/stable/src/librustc/middle/mem_categorization.rs

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ pub use self::InteriorKind::*;
6565
pub use self::FieldName::*;
6666
pub use self::ElementKind::*;
6767
pub use self::MutabilityCategory::*;
68+
pub use self::InteriorSafety::*;
6869
pub use self::AliasableReason::*;
6970
pub use self::Note::*;
7071
pub use self::deref_kind::*;
@@ -1384,6 +1385,12 @@ impl<'t,'tcx,TYPER:Typer<'tcx>> MemCategorizationContext<'t,TYPER> {
13841385
}
13851386
}
13861387

1388+
#[derive(Copy, Clone, Debug)]
1389+
pub enum InteriorSafety {
1390+
InteriorUnsafe,
1391+
InteriorSafe
1392+
}
1393+
13871394
#[derive(Clone, Debug)]
13881395
pub enum Aliasability {
13891396
FreelyAliasable(AliasableReason),
@@ -1397,8 +1404,8 @@ pub enum AliasableReason {
13971404
AliasableClosure(ast::NodeId), // Aliasable due to capture Fn closure env
13981405
AliasableOther,
13991406
UnaliasableImmutable, // Created as needed upon seeing ImmutableUnique
1400-
AliasableStatic,
1401-
AliasableStaticMut,
1407+
AliasableStatic(InteriorSafety),
1408+
AliasableStaticMut(InteriorSafety),
14021409
}
14031410

14041411
impl<'tcx> cmt_<'tcx> {
@@ -1462,10 +1469,16 @@ impl<'tcx> cmt_<'tcx> {
14621469
}
14631470

14641471
cat_static_item(..) => {
1472+
let int_safe = if ty::type_interior_is_unsafe(ctxt, self.ty) {
1473+
InteriorUnsafe
1474+
} else {
1475+
InteriorSafe
1476+
};
1477+
14651478
if self.mutbl.is_mutable() {
1466-
FreelyAliasable(AliasableStaticMut)
1479+
FreelyAliasable(AliasableStaticMut(int_safe))
14671480
} else {
1468-
FreelyAliasable(AliasableStatic)
1481+
FreelyAliasable(AliasableStatic(int_safe))
14691482
}
14701483
}
14711484

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

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -201,27 +201,3 @@ pub fn def_to_path(tcx: &ty::ctxt, id: ast::DefId) -> ast::Path {
201201
span: DUMMY_SP,
202202
})
203203
}
204-
205-
/// Return variants that are necessary to exist for the pattern to match.
206-
pub fn necessary_variants(dm: &DefMap, pat: &ast::Pat) -> Vec<ast::NodeId> {
207-
let mut variants = vec![];
208-
walk_pat(pat, |p| {
209-
match p.node {
210-
ast::PatEnum(_, _) |
211-
ast::PatIdent(_, _, None) |
212-
ast::PatStruct(..) => {
213-
match dm.borrow().get(&p.id) {
214-
Some(&PathResolution { base_def: DefVariant(_, id, _), .. }) => {
215-
variants.push(id.node);
216-
}
217-
_ => ()
218-
}
219-
}
220-
_ => ()
221-
}
222-
true
223-
});
224-
variants.sort();
225-
variants.dedup();
226-
variants
227-
}

branches/stable/src/librustc/middle/traits/fulfill.rs

Lines changed: 4 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,6 @@ use super::select::SelectionContext;
2828
use super::Unimplemented;
2929
use super::util::predicate_for_builtin_bound;
3030

31-
pub struct FulfilledPredicates<'tcx> {
32-
set: HashSet<ty::Predicate<'tcx>>
33-
}
34-
3531
/// The fulfillment context is used to drive trait resolution. It
3632
/// consists of a list of obligations that must be (eventually)
3733
/// satisfied. The job is to track which are satisfied, which yielded
@@ -48,7 +44,7 @@ pub struct FulfillmentContext<'tcx> {
4844
// than the `SelectionCache`: it avoids duplicate errors and
4945
// permits recursive obligations, which are often generated from
5046
// traits like `Send` et al.
51-
duplicate_set: FulfilledPredicates<'tcx>,
47+
duplicate_set: HashSet<ty::Predicate<'tcx>>,
5248

5349
// A list of all obligations that have been registered with this
5450
// fulfillment context.
@@ -84,8 +80,6 @@ pub struct FulfillmentContext<'tcx> {
8480
// obligations (otherwise, it's easy to fail to walk to a
8581
// particular node-id).
8682
region_obligations: NodeMap<Vec<RegionObligation<'tcx>>>,
87-
88-
errors_will_be_reported: bool,
8983
}
9084

9185
#[derive(Clone)]
@@ -96,30 +90,12 @@ pub struct RegionObligation<'tcx> {
9690
}
9791

9892
impl<'tcx> FulfillmentContext<'tcx> {
99-
/// Creates a new fulfillment context.
100-
///
101-
/// `errors_will_be_reported` indicates whether ALL errors that
102-
/// are generated by this fulfillment context will be reported to
103-
/// the end user. This is used to inform caching, because it
104-
/// allows us to conclude that traits that resolve successfully
105-
/// will in fact always resolve successfully (in particular, it
106-
/// guarantees that if some dependent obligation encounters a
107-
/// problem, compilation will be aborted). If you're not sure of
108-
/// the right value here, pass `false`, as that is the more
109-
/// conservative option.
110-
///
111-
/// FIXME -- a better option would be to hold back on modifying
112-
/// the global cache until we know that all dependent obligations
113-
/// are also satisfied. In that case, we could actually remove
114-
/// this boolean flag, and we'd also avoid the problem of squelching
115-
/// duplicate errors that occur across fns.
116-
pub fn new(errors_will_be_reported: bool) -> FulfillmentContext<'tcx> {
93+
pub fn new() -> FulfillmentContext<'tcx> {
11794
FulfillmentContext {
118-
duplicate_set: FulfilledPredicates::new(),
95+
duplicate_set: HashSet::new(),
11996
predicates: Vec::new(),
12097
attempted_mark: 0,
12198
region_obligations: NodeMap(),
122-
errors_will_be_reported: errors_will_be_reported,
12399
}
124100
}
125101

@@ -189,7 +165,7 @@ impl<'tcx> FulfillmentContext<'tcx> {
189165

190166
assert!(!obligation.has_escaping_regions());
191167

192-
if self.is_duplicate_or_add(infcx.tcx, &obligation.predicate) {
168+
if !self.duplicate_set.insert(obligation.predicate.clone()) {
193169
debug!("register_predicate({}) -- already seen, skip", obligation.repr(infcx.tcx));
194170
return;
195171
}
@@ -255,28 +231,6 @@ impl<'tcx> FulfillmentContext<'tcx> {
255231
&self.predicates
256232
}
257233

258-
fn is_duplicate_or_add(&mut self, tcx: &ty::ctxt<'tcx>,
259-
predicate: &ty::Predicate<'tcx>)
260-
-> bool {
261-
// This is a kind of dirty hack to allow us to avoid "rederiving"
262-
// things that we have already proven in other methods.
263-
//
264-
// The idea is that any predicate that doesn't involve type
265-
// parameters and which only involves the 'static region (and
266-
// no other regions) is universally solvable, since impls are global.
267-
//
268-
// This is particularly important since even if we have a
269-
// cache hit in the selection context, we still wind up
270-
// evaluating the 'nested obligations'. This cache lets us
271-
// skip those.
272-
273-
if self.errors_will_be_reported && predicate.is_global() {
274-
tcx.fulfilled_predicates.borrow_mut().is_duplicate_or_add(predicate)
275-
} else {
276-
self.duplicate_set.is_duplicate_or_add(predicate)
277-
}
278-
}
279-
280234
/// Attempts to select obligations using `selcx`. If `only_new_obligations` is true, then it
281235
/// only attempts to select obligations that haven't been seen before.
282236
fn select<'a>(&mut self,
@@ -488,21 +442,3 @@ fn register_region_obligation<'tcx>(tcx: &ty::ctxt<'tcx>,
488442
.push(region_obligation);
489443

490444
}
491-
492-
impl<'tcx> FulfilledPredicates<'tcx> {
493-
pub fn new() -> FulfilledPredicates<'tcx> {
494-
FulfilledPredicates {
495-
set: HashSet::new()
496-
}
497-
}
498-
499-
pub fn is_duplicate(&self, p: &ty::Predicate<'tcx>) -> bool {
500-
self.set.contains(p)
501-
}
502-
503-
fn is_duplicate_or_add(&mut self, p: &ty::Predicate<'tcx>) -> bool {
504-
!self.set.insert(p.clone())
505-
}
506-
}
507-
508-

0 commit comments

Comments
 (0)