Skip to content

Commit 159f52a

Browse files
committed
---
yaml --- r: 277391 b: refs/heads/try c: 897199a h: refs/heads/master i: 277389: d2735aa 277387: 5c1b8c4 277383: 7d12fa1 277375: e309796
1 parent ecd3de2 commit 159f52a

File tree

189 files changed

+1613
-1130
lines changed

Some content is hidden

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

189 files changed

+1613
-1130
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
---
22
refs/heads/master: 6dbb0e86aec11050480beb76eade6fb805010ba7
33
refs/heads/snap-stage3: 235d77457d80b549dad3ac36d94f235208a1eafb
4-
refs/heads/try: 36d9ee3da983a318f958077dbc68ba1adfae98b8
4+
refs/heads/try: 897199a0fbe01ab6f7e7f8096656603e238e85a2
55
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105
66
refs/tags/release-0.2: c870d2dffb391e14efb05aa27898f1f6333a9596
77
refs/tags/release-0.3: b5f0d0f648d9a6153664837026ba1be43d3e2503

branches/try/mk/tests.mk

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -623,7 +623,7 @@ CTEST_COMMON_ARGS$(1)-T-$(2)-H-$(3) := \
623623
--lldb-python $$(CFG_LLDB_PYTHON) \
624624
--gdb-version="$(CFG_GDB_VERSION)" \
625625
--lldb-version="$(CFG_LLDB_VERSION)" \
626-
--android-cross-path=$(CFG_ANDROID_CROSS_PATH) \
626+
--android-cross-path=$(CFG_ARM_LINUX_ANDROIDEABI_NDK) \
627627
--adb-path=$(CFG_ADB) \
628628
--adb-test-dir=$(CFG_ADB_TEST_DIR) \
629629
--host-rustcflags "$(RUSTC_FLAGS_$(3)) $$(CTEST_RUSTC_FLAGS) -L $$(RT_OUTPUT_DIR_$(3))" \

branches/try/src/doc/book/const-and-static.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,5 +79,5 @@ the result of a function call or anything similarly complex or at runtime.
7979

8080
Almost always, if you can choose between the two, choose `const`. It’s pretty
8181
rare that you actually want a memory location associated with your constant,
82-
and using a const allows for optimizations like constant propagation not only
82+
and using a `const` allows for optimizations like constant propagation not only
8383
in your crate but downstream crates.

branches/try/src/doc/nomicon/subtyping.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ inferred variance, so `Fn(T)` is invariant in `T`).
5353
Some important variances:
5454

5555
* `&'a T` is variant over `'a` and `T` (as is `*const T` by metaphor)
56-
* `&'a mut T` is variant with over `'a` but invariant over `T`
56+
* `&'a mut T` is variant over `'a` but invariant over `T`
5757
* `Fn(T) -> U` is invariant over `T`, but variant over `U`
5858
* `Box`, `Vec`, and all other collections are variant over the types of
5959
their contents

branches/try/src/etc/generate-keyword-tests.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,15 +34,17 @@
3434
// option. This file may not be copied, modified, or distributed
3535
// except according to those terms.
3636
37+
// compile-flags: -Z parse-only
38+
3739
// This file was auto-generated using 'src/etc/generate-keyword-tests.py %s'
3840
3941
fn main() {
40-
let %s = "foo"; //~ error: ident
42+
let %s = "foo"; //~ error: expected pattern, found keyword `%s`
4143
}
4244
"""
4345

4446
test_dir = os.path.abspath(
45-
os.path.join(os.path.dirname(__file__), '../test/compile-fail')
47+
os.path.join(os.path.dirname(__file__), '../test/parse-fail')
4648
)
4749

4850
for kw in sys.argv[1:]:
@@ -53,7 +55,7 @@
5355
os.chmod(test_file, stat.S_IWUSR)
5456

5557
with open(test_file, 'wt') as f:
56-
f.write(template % (datetime.datetime.now().year, kw, kw))
58+
f.write(template % (datetime.datetime.now().year, kw, kw, kw))
5759

5860
# mark file read-only
5961
os.chmod(test_file, stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH)

branches/try/src/libcore/iter/iterator.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -598,13 +598,13 @@ pub trait Iterator {
598598
/// # Examples
599599
///
600600
/// ```
601-
/// let a = [1, 2, 3];
601+
/// let a = ['a', 'b', 'c'];
602602
///
603603
/// let mut iter = a.iter().enumerate();
604604
///
605-
/// assert_eq!(iter.next(), Some((0, &1)));
606-
/// assert_eq!(iter.next(), Some((1, &2)));
607-
/// assert_eq!(iter.next(), Some((2, &3)));
605+
/// assert_eq!(iter.next(), Some((0, &'a')));
606+
/// assert_eq!(iter.next(), Some((1, &'b')));
607+
/// assert_eq!(iter.next(), Some((2, &'c')));
608608
/// assert_eq!(iter.next(), None);
609609
/// ```
610610
#[inline]
@@ -2109,4 +2109,3 @@ impl<'a, I: Iterator + ?Sized> Iterator for &'a mut I {
21092109
fn next(&mut self) -> Option<I::Item> { (**self).next() }
21102110
fn size_hint(&self) -> (usize, Option<usize>) { (**self).size_hint() }
21112111
}
2112-

branches/try/src/librustc/hir/fold.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ use syntax::attr::ThinAttributesExt;
1818
use hir;
1919
use syntax::codemap::{respan, Span, Spanned};
2020
use syntax::ptr::P;
21-
use syntax::parse::token;
21+
use syntax::parse::token::keywords;
2222
use syntax::util::move_map::MoveMap;
2323

2424
pub trait Folder : Sized {
@@ -867,7 +867,7 @@ pub fn noop_fold_crate<T: Folder>(Crate { module, attrs, config, span,
867867
let config = folder.fold_meta_items(config);
868868

869869
let crate_mod = folder.fold_item(hir::Item {
870-
name: token::special_idents::invalid.name,
870+
name: keywords::Invalid.name(),
871871
attrs: attrs,
872872
id: DUMMY_NODE_ID,
873873
vis: hir::Public,
@@ -1060,10 +1060,11 @@ pub fn noop_fold_expr<T: Folder>(Expr { id, node, span, attrs }: Expr, folder: &
10601060
arms.move_map(|x| folder.fold_arm(x)),
10611061
source)
10621062
}
1063-
ExprClosure(capture_clause, decl, body) => {
1063+
ExprClosure(capture_clause, decl, body, fn_decl_span) => {
10641064
ExprClosure(capture_clause,
10651065
folder.fold_fn_decl(decl),
1066-
folder.fold_block(body))
1066+
folder.fold_block(body),
1067+
folder.new_span(fn_decl_span))
10671068
}
10681069
ExprBlock(blk) => ExprBlock(folder.fold_block(blk)),
10691070
ExprAssign(el, er) => {

branches/try/src/librustc/hir/intravisit.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -785,7 +785,7 @@ pub fn walk_expr<'v, V: Visitor<'v>>(visitor: &mut V, expression: &'v Expr) {
785785
visitor.visit_expr(subexpression);
786786
walk_list!(visitor, visit_arm, arms);
787787
}
788-
ExprClosure(_, ref function_declaration, ref body) => {
788+
ExprClosure(_, ref function_declaration, ref body, _fn_decl_span) => {
789789
visitor.visit_fn(FnKind::Closure(expression.attrs.as_attr_slice()),
790790
function_declaration,
791791
body,

branches/try/src/librustc/hir/lowering.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1260,11 +1260,12 @@ pub fn lower_expr(lctx: &LoweringContext, e: &Expr) -> P<hir::Expr> {
12601260
arms.iter().map(|x| lower_arm(lctx, x)).collect(),
12611261
hir::MatchSource::Normal)
12621262
}
1263-
ExprKind::Closure(capture_clause, ref decl, ref body) => {
1263+
ExprKind::Closure(capture_clause, ref decl, ref body, fn_decl_span) => {
12641264
lctx.with_parent_def(e.id, || {
12651265
hir::ExprClosure(lower_capture_clause(lctx, capture_clause),
12661266
lower_fn_decl(lctx, decl),
1267-
lower_block(lctx, body))
1267+
lower_block(lctx, body),
1268+
fn_decl_span)
12681269
})
12691270
}
12701271
ExprKind::Block(ref blk) => hir::ExprBlock(lower_block(lctx, blk)),

branches/try/src/librustc/hir/map/blocks.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,7 @@ impl<'a> FnLikeNode<'a> {
250250
}
251251
}
252252
map::NodeExpr(e) => match e.node {
253-
ast::ExprClosure(_, ref decl, ref block) =>
253+
ast::ExprClosure(_, ref decl, ref block, _fn_decl_span) =>
254254
closure(ClosureParts::new(&decl,
255255
&block,
256256
e.id,

branches/try/src/librustc/hir/mod.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -949,8 +949,10 @@ pub enum Expr_ {
949949
/// A `match` block, with a source that indicates whether or not it is
950950
/// the result of a desugaring, and if so, which kind.
951951
ExprMatch(P<Expr>, HirVec<Arm>, MatchSource),
952-
/// A closure (for example, `move |a, b, c| {a + b + c}`)
953-
ExprClosure(CaptureClause, P<FnDecl>, P<Block>),
952+
/// A closure (for example, `move |a, b, c| {a + b + c}`).
953+
///
954+
/// The final span is the span of the argument block `|...|`
955+
ExprClosure(CaptureClause, P<FnDecl>, P<Block>, Span),
954956
/// A block (`{ ... }`)
955957
ExprBlock(P<Block>),
956958

branches/try/src/librustc/hir/print.rs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,8 @@ use syntax::abi::Abi;
1414
use syntax::ast;
1515
use syntax::codemap::{self, CodeMap, BytePos, Spanned};
1616
use syntax::errors;
17-
use syntax::parse::token::{self, BinOpToken};
17+
use syntax::parse::token::{self, keywords, BinOpToken};
1818
use syntax::parse::lexer::comments;
19-
use syntax::parse;
2019
use syntax::print::pp::{self, break_offset, word, space, hardbreak};
2120
use syntax::print::pp::{Breaks, eof};
2221
use syntax::print::pp::Breaks::{Consistent, Inconsistent};
@@ -1392,7 +1391,7 @@ impl<'a> State<'a> {
13921391
}
13931392
self.bclose_(expr.span, indent_unit)?;
13941393
}
1395-
hir::ExprClosure(capture_clause, ref decl, ref body) => {
1394+
hir::ExprClosure(capture_clause, ref decl, ref body, _fn_decl_span) => {
13961395
self.print_capture_clause(capture_clause)?;
13971396

13981397
self.print_fn_block_args(&decl)?;
@@ -2209,9 +2208,8 @@ impl<'a> State<'a> {
22092208
hir::TyInfer if is_closure => self.print_pat(&input.pat)?,
22102209
_ => {
22112210
match input.pat.node {
2212-
PatKind::Ident(_, ref path1, _) if
2213-
path1.node.name ==
2214-
parse::token::special_idents::invalid.name => {
2211+
PatKind::Ident(_, ref path1, _)
2212+
if path1.node.name == keywords::Invalid.name() => {
22152213
// Do nothing.
22162214
}
22172215
_ => {

branches/try/src/librustc/infer/mod.rs

Lines changed: 46 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ use ty::fold::TypeFoldable;
3535
use ty::relate::{Relate, RelateResult, TypeRelation};
3636
use traits::{self, PredicateObligations, ProjectionMode};
3737
use rustc_data_structures::unify::{self, UnificationTable};
38-
use std::cell::{RefCell, Ref};
38+
use std::cell::{Cell, RefCell, Ref};
3939
use std::fmt;
4040
use syntax::ast;
4141
use syntax::codemap;
@@ -110,6 +110,25 @@ pub struct InferCtxt<'a, 'tcx: 'a> {
110110
// documentation for `ProjectionMode`.
111111
projection_mode: ProjectionMode,
112112

113+
// When an error occurs, we want to avoid reporting "derived"
114+
// errors that are due to this original failure. Normally, we
115+
// handle this with the `err_count_on_creation` count, which
116+
// basically just tracks how many errors were reported when we
117+
// started type-checking a fn and checks to see if any new errors
118+
// have been reported since then. Not great, but it works.
119+
//
120+
// However, when errors originated in other passes -- notably
121+
// resolve -- this heuristic breaks down. Therefore, we have this
122+
// auxiliary flag that one can set whenever one creates a
123+
// type-error that is due to an error in a prior pass.
124+
//
125+
// Don't read this flag directly, call `is_tainted_by_errors()`
126+
// and `set_tainted_by_errors()`.
127+
tainted_by_errors_flag: Cell<bool>,
128+
129+
// Track how many errors were reported when this infcx is created.
130+
// If the number of errors increases, that's also a sign (line
131+
// `tained_by_errors`) to avoid reporting certain kinds of errors.
113132
err_count_on_creation: usize,
114133
}
115134

@@ -379,6 +398,7 @@ pub fn new_infer_ctxt<'a, 'tcx>(tcx: &'a TyCtxt<'tcx>,
379398
reported_trait_errors: RefCell::new(FnvHashSet()),
380399
normalize: false,
381400
projection_mode: projection_mode,
401+
tainted_by_errors_flag: Cell::new(false),
382402
err_count_on_creation: tcx.sess.err_count()
383403
}
384404
}
@@ -1128,15 +1148,36 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
11281148
.map(|method| resolve_ty(method.ty)))
11291149
}
11301150

1131-
pub fn errors_since_creation(&self) -> bool {
1132-
self.tcx.sess.err_count() - self.err_count_on_creation != 0
1151+
/// True if errors have been reported since this infcx was
1152+
/// created. This is sometimes used as a heuristic to skip
1153+
/// reporting errors that often occur as a result of earlier
1154+
/// errors, but where it's hard to be 100% sure (e.g., unresolved
1155+
/// inference variables, regionck errors).
1156+
pub fn is_tainted_by_errors(&self) -> bool {
1157+
debug!("is_tainted_by_errors(err_count={}, err_count_on_creation={}, \
1158+
tainted_by_errors_flag={})",
1159+
self.tcx.sess.err_count(),
1160+
self.err_count_on_creation,
1161+
self.tainted_by_errors_flag.get());
1162+
1163+
if self.tcx.sess.err_count() > self.err_count_on_creation {
1164+
return true; // errors reported since this infcx was made
1165+
}
1166+
self.tainted_by_errors_flag.get()
1167+
}
1168+
1169+
/// Set the "tainted by errors" flag to true. We call this when we
1170+
/// observe an error from a prior pass.
1171+
pub fn set_tainted_by_errors(&self) {
1172+
debug!("set_tainted_by_errors()");
1173+
self.tainted_by_errors_flag.set(true)
11331174
}
11341175

11351176
pub fn node_type(&self, id: ast::NodeId) -> Ty<'tcx> {
11361177
match self.tables.borrow().node_types.get(&id) {
11371178
Some(&t) => t,
11381179
// FIXME
1139-
None if self.errors_since_creation() =>
1180+
None if self.is_tainted_by_errors() =>
11401181
self.tcx.types.err,
11411182
None => {
11421183
bug!("no type for node {}: {} in fcx",
@@ -1158,7 +1199,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
11581199
free_regions: &FreeRegionMap,
11591200
subject_node_id: ast::NodeId) {
11601201
let errors = self.region_vars.resolve_regions(free_regions, subject_node_id);
1161-
if !self.errors_since_creation() {
1202+
if !self.is_tainted_by_errors() {
11621203
// As a heuristic, just skip reporting region errors
11631204
// altogether if other errors have been reported while
11641205
// this infcx was in use. This is totally hokey but

branches/try/src/librustc/infer/sub.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ impl<'a, 'tcx> TypeRelation<'a, 'tcx> for Sub<'a, 'tcx> {
9191
}
9292

9393
(&ty::TyError, _) | (_, &ty::TyError) => {
94+
infcx.set_tainted_by_errors();
9495
Ok(self.tcx().types.err)
9596
}
9697

branches/try/src/librustc/middle/expr_use_visitor.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -537,8 +537,8 @@ impl<'d,'t,'a,'tcx> ExprUseVisitor<'d,'t,'a,'tcx> {
537537
self.consume_expr(&count);
538538
}
539539

540-
hir::ExprClosure(..) => {
541-
self.walk_captures(expr)
540+
hir::ExprClosure(_, _, _, fn_decl_span) => {
541+
self.walk_captures(expr, fn_decl_span)
542542
}
543543

544544
hir::ExprBox(ref base) => {
@@ -1142,7 +1142,7 @@ impl<'d,'t,'a,'tcx> ExprUseVisitor<'d,'t,'a,'tcx> {
11421142
}));
11431143
}
11441144

1145-
fn walk_captures(&mut self, closure_expr: &hir::Expr) {
1145+
fn walk_captures(&mut self, closure_expr: &hir::Expr, fn_decl_span: Span) {
11461146
debug!("walk_captures({:?})", closure_expr);
11471147

11481148
self.tcx().with_freevars(closure_expr.id, |freevars| {
@@ -1152,7 +1152,7 @@ impl<'d,'t,'a,'tcx> ExprUseVisitor<'d,'t,'a,'tcx> {
11521152
closure_expr_id: closure_expr.id };
11531153
let upvar_capture = self.typer.upvar_capture(upvar_id).unwrap();
11541154
let cmt_var = return_if_err!(self.cat_captured_var(closure_expr.id,
1155-
closure_expr.span,
1155+
fn_decl_span,
11561156
freevar.def));
11571157
match upvar_capture {
11581158
ty::UpvarCapture::ByValue => {
@@ -1161,7 +1161,7 @@ impl<'d,'t,'a,'tcx> ExprUseVisitor<'d,'t,'a,'tcx> {
11611161
}
11621162
ty::UpvarCapture::ByRef(upvar_borrow) => {
11631163
self.delegate.borrow(closure_expr.id,
1164-
closure_expr.span,
1164+
fn_decl_span,
11651165
cmt_var,
11661166
upvar_borrow.region,
11671167
upvar_borrow.kind,

branches/try/src/librustc/middle/liveness.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ use std::io;
125125
use std::rc::Rc;
126126
use syntax::ast::{self, NodeId};
127127
use syntax::codemap::{BytePos, original_sp, Span};
128-
use syntax::parse::token::special_idents;
128+
use syntax::parse::token::keywords;
129129
use syntax::ptr::P;
130130

131131
use hir::Expr;
@@ -948,7 +948,7 @@ impl<'a, 'tcx> Liveness<'a, 'tcx> {
948948
self.propagate_through_expr(&e, succ)
949949
}
950950

951-
hir::ExprClosure(_, _, ref blk) => {
951+
hir::ExprClosure(_, _, ref blk, _) => {
952952
debug!("{} is an ExprClosure",
953953
expr_to_string(expr));
954954

@@ -1578,7 +1578,7 @@ impl<'a, 'tcx> Liveness<'a, 'tcx> {
15781578
let var = self.variable(p_id, sp);
15791579
// Ignore unused self.
15801580
let name = path1.node;
1581-
if name != special_idents::self_.name {
1581+
if name != keywords::SelfValue.name() {
15821582
if !self.warn_about_unused(sp, p_id, entry_ln, var) {
15831583
if self.live_on_entry(entry_ln, var).is_none() {
15841584
self.report_dead_assign(p_id, sp, var, true);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -728,7 +728,7 @@ impl<'t, 'a,'tcx> MemCategorizationContext<'t, 'a, 'tcx> {
728728
};
729729

730730
match fn_expr.node {
731-
hir::ExprClosure(_, _, ref body) => body.id,
731+
hir::ExprClosure(_, _, ref body, _) => body.id,
732732
_ => bug!()
733733
}
734734
};

branches/try/src/librustc/middle/region.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -389,7 +389,7 @@ impl RegionMaps {
389389
// but this isn't the only place
390390
}
391391
let idx = CodeExtent(self.code_extents.borrow().len() as u32);
392-
info!("CodeExtent({}) = {:?} [parent={}]", idx.0, e, parent.0);
392+
debug!("CodeExtent({}) = {:?} [parent={}]", idx.0, e, parent.0);
393393
self.code_extents.borrow_mut().push(e);
394394
self.scope_map.borrow_mut().push(parent);
395395
*v.insert(idx)

0 commit comments

Comments
 (0)