auto merge of #15377 : alexcrichton/rust/rollup, r=alexcrichton
Closes #15276 (Guide: if) Closes #15280 (std::os - Add join_paths, make setenv non-utf8 capable) Closes #15314 (Guide: functions) Closes #15327 (Simplify PatIdent to contain an Ident rather than a Path) Closes #15340 (Guide: add mutable binding section) Closes #15342 (Fix ICE with nested macro_rules!-style macros) Closes #15350 (Remove duplicated slash in install script path) Closes #15351 (correct a few spelling mistakes in the tutorial) Closes #15352 (librustc: Have the kind checker check sub-bounds in trait casts.) Closes #15359 (Fix spelling errors.) Closes #15361 (Rename set_broadast() to set_broadcast().) Closes #15366 (Simplify creating a parser from a token tree) Closes #15367 (Add examples for StrVector methods) Closes #15372 (Vec::grow should use reserve_additional, Vec::reserve should check against capacity) Closes #15373 (Fix minor issues in the documentation of libtime.)
This commit is contained in:
commit
5d5c20647f
68 changed files with 869 additions and 423 deletions
|
|
@ -119,7 +119,7 @@ pub mod write {
|
|||
// get all hardware potential via VFP3 (hardware floating point)
|
||||
// and NEON (SIMD) instructions supported by LLVM.
|
||||
// Note that without those flags various linking errors might
|
||||
// arise as some of intrinsicts are converted into function calls
|
||||
// arise as some of intrinsics are converted into function calls
|
||||
// and nobody provides implementations those functions
|
||||
fn target_feature<'a>(sess: &'a Session) -> &'a str {
|
||||
match sess.targ_cfg.os {
|
||||
|
|
|
|||
|
|
@ -902,12 +902,10 @@ impl LintPass for NonUppercasePatternStatics {
|
|||
fn check_pat(&mut self, cx: &Context, p: &ast::Pat) {
|
||||
// Lint for constants that look like binding identifiers (#7526)
|
||||
match (&p.node, cx.tcx.def_map.borrow().find(&p.id)) {
|
||||
(&ast::PatIdent(_, ref path, _), Some(&def::DefStatic(_, false))) => {
|
||||
// last identifier alone is right choice for this lint.
|
||||
let ident = path.segments.last().unwrap().identifier;
|
||||
let s = token::get_ident(ident);
|
||||
(&ast::PatIdent(_, ref path1, _), Some(&def::DefStatic(_, false))) => {
|
||||
let s = token::get_ident(path1.node);
|
||||
if s.get().chars().any(|c| c.is_lowercase()) {
|
||||
cx.span_lint(NON_UPPERCASE_PATTERN_STATICS, path.span,
|
||||
cx.span_lint(NON_UPPERCASE_PATTERN_STATICS, path1.span,
|
||||
format!("static constant in pattern `{}` should have an uppercase \
|
||||
name such as `{}`",
|
||||
s.get(), s.get().chars().map(|c| c.to_uppercase())
|
||||
|
|
@ -931,15 +929,13 @@ impl LintPass for UppercaseVariables {
|
|||
|
||||
fn check_pat(&mut self, cx: &Context, p: &ast::Pat) {
|
||||
match &p.node {
|
||||
&ast::PatIdent(_, ref path, _) => {
|
||||
&ast::PatIdent(_, ref path1, _) => {
|
||||
match cx.tcx.def_map.borrow().find(&p.id) {
|
||||
Some(&def::DefLocal(_, _)) | Some(&def::DefBinding(_, _)) |
|
||||
Some(&def::DefArg(_, _)) => {
|
||||
// last identifier alone is right choice for this lint.
|
||||
let ident = path.segments.last().unwrap().identifier;
|
||||
let s = token::get_ident(ident);
|
||||
let s = token::get_ident(path1.node);
|
||||
if s.get().len() > 0 && s.get().char_at(0).is_uppercase() {
|
||||
cx.span_lint(UPPERCASE_VARIABLES, path.span,
|
||||
cx.span_lint(UPPERCASE_VARIABLES, path1.span,
|
||||
"variable names should start with \
|
||||
a lowercase character");
|
||||
}
|
||||
|
|
@ -989,7 +985,7 @@ impl UnnecessaryParens {
|
|||
_ => {}
|
||||
}
|
||||
|
||||
/// Expressions that syntatically contain an "exterior" struct
|
||||
/// Expressions that syntactically contain an "exterior" struct
|
||||
/// literal i.e. not surrounded by any parens or other
|
||||
/// delimiters, e.g. `X { y: 1 }`, `X { y: 1 }.method()`, `foo
|
||||
/// == X { y: 1 }` and `X { y: 1 } == foo` all do, but `(X {
|
||||
|
|
@ -1113,15 +1109,10 @@ impl UnusedMut {
|
|||
// avoid false warnings in match arms with multiple patterns
|
||||
let mut mutables = HashMap::new();
|
||||
for &p in pats.iter() {
|
||||
pat_util::pat_bindings(&cx.tcx.def_map, &*p, |mode, id, _, path| {
|
||||
pat_util::pat_bindings(&cx.tcx.def_map, &*p, |mode, id, _, path1| {
|
||||
let ident = path1.node;
|
||||
match mode {
|
||||
ast::BindByValue(ast::MutMutable) => {
|
||||
if path.segments.len() != 1 {
|
||||
cx.sess().span_bug(p.span,
|
||||
"mutable binding that doesn't consist \
|
||||
of exactly one segment");
|
||||
}
|
||||
let ident = path.segments.get(0).identifier;
|
||||
if !token::get_ident(ident).get().starts_with("_") {
|
||||
mutables.insert_or_update_with(ident.name as uint,
|
||||
vec!(id), |_, old| { old.push(id); });
|
||||
|
|
|
|||
|
|
@ -809,9 +809,8 @@ fn encode_method_argument_names(ebml_w: &mut Encoder,
|
|||
for arg in decl.inputs.iter() {
|
||||
ebml_w.start_tag(tag_method_argument_name);
|
||||
match arg.pat.node {
|
||||
ast::PatIdent(_, ref name, _) => {
|
||||
let name = name.segments.last().unwrap().identifier;
|
||||
let name = token::get_ident(name);
|
||||
ast::PatIdent(_, ref path1, _) => {
|
||||
let name = token::get_ident(path1.node);
|
||||
ebml_w.writer.write(name.get().as_bytes());
|
||||
}
|
||||
_ => {}
|
||||
|
|
@ -1106,8 +1105,9 @@ fn encode_info_for_item(ecx: &EncodeContext,
|
|||
match ty.node {
|
||||
ast::TyPath(ref path, ref bounds, _) if path.segments
|
||||
.len() == 1 => {
|
||||
let ident = path.segments.last().unwrap().identifier;
|
||||
assert!(bounds.is_none());
|
||||
encode_impl_type_basename(ebml_w, ast_util::path_to_ident(path));
|
||||
encode_impl_type_basename(ebml_w, ident);
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -66,9 +66,9 @@ pub fn gather_move_from_pat(bccx: &BorrowckCtxt,
|
|||
move_pat: &ast::Pat,
|
||||
cmt: mc::cmt) {
|
||||
let pat_span_path_opt = match move_pat.node {
|
||||
ast::PatIdent(_, ref path, _) => {
|
||||
Some(MoveSpanAndPath::with_span_and_path(move_pat.span,
|
||||
(*path).clone()))
|
||||
ast::PatIdent(_, ref path1, _) => {
|
||||
Some(MoveSpanAndPath{span: move_pat.span,
|
||||
ident: path1.node})
|
||||
},
|
||||
_ => None,
|
||||
};
|
||||
|
|
|
|||
|
|
@ -56,19 +56,8 @@ impl MoveError {
|
|||
|
||||
#[deriving(Clone)]
|
||||
pub struct MoveSpanAndPath {
|
||||
span: codemap::Span,
|
||||
path: ast::Path
|
||||
}
|
||||
|
||||
impl MoveSpanAndPath {
|
||||
pub fn with_span_and_path(span: codemap::Span,
|
||||
path: ast::Path)
|
||||
-> MoveSpanAndPath {
|
||||
MoveSpanAndPath {
|
||||
span: span,
|
||||
path: path,
|
||||
}
|
||||
}
|
||||
pub span: codemap::Span,
|
||||
pub ident: ast::Ident
|
||||
}
|
||||
|
||||
pub struct GroupedMoveErrors {
|
||||
|
|
@ -83,7 +72,7 @@ fn report_move_errors(bccx: &BorrowckCtxt, errors: &Vec<MoveError>) {
|
|||
let mut is_first_note = true;
|
||||
for move_to in error.move_to_places.iter() {
|
||||
note_move_destination(bccx, move_to.span,
|
||||
&move_to.path, is_first_note);
|
||||
&move_to.ident, is_first_note);
|
||||
is_first_note = false;
|
||||
}
|
||||
}
|
||||
|
|
@ -154,9 +143,9 @@ fn report_cannot_move_out_of(bccx: &BorrowckCtxt, move_from: mc::cmt) {
|
|||
|
||||
fn note_move_destination(bccx: &BorrowckCtxt,
|
||||
move_to_span: codemap::Span,
|
||||
pat_ident_path: &ast::Path,
|
||||
pat_ident: &ast::Ident,
|
||||
is_first_note: bool) {
|
||||
let pat_name = pprust::path_to_str(pat_ident_path);
|
||||
let pat_name = pprust::ident_to_str(pat_ident);
|
||||
if is_first_note {
|
||||
bccx.span_note(
|
||||
move_to_span,
|
||||
|
|
|
|||
|
|
@ -247,6 +247,10 @@ impl<'a> Visitor<MarkSymbolVisitorContext> for MarkSymbolVisitor<'a> {
|
|||
ast::PatStruct(_, ref fields, _) => {
|
||||
self.handle_field_pattern_match(pat, fields.as_slice());
|
||||
}
|
||||
ast::PatIdent(_, _, _) => {
|
||||
// it might be the only use of a static:
|
||||
self.lookup_and_handle_definition(&pat.id)
|
||||
}
|
||||
_ => ()
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@ use middle::freevars::freevar_entry;
|
|||
use middle::freevars;
|
||||
use middle::subst;
|
||||
use middle::ty;
|
||||
use middle::typeck::{MethodCall, NoAdjustment};
|
||||
use middle::typeck;
|
||||
use util::ppaux::{Repr, ty_to_str};
|
||||
use util::ppaux::UserString;
|
||||
|
|
@ -20,7 +21,7 @@ use util::ppaux::UserString;
|
|||
use syntax::ast::*;
|
||||
use syntax::attr;
|
||||
use syntax::codemap::Span;
|
||||
use syntax::print::pprust::{expr_to_str,path_to_str};
|
||||
use syntax::print::pprust::{expr_to_str, ident_to_str};
|
||||
use syntax::{visit};
|
||||
use syntax::visit::Visitor;
|
||||
|
||||
|
|
@ -261,7 +262,15 @@ pub fn check_expr(cx: &mut Context, e: &Expr) {
|
|||
ExprCast(ref source, _) => {
|
||||
let source_ty = ty::expr_ty(cx.tcx, &**source);
|
||||
let target_ty = ty::expr_ty(cx.tcx, e);
|
||||
check_trait_cast(cx, source_ty, target_ty, source.span);
|
||||
let method_call = MethodCall {
|
||||
expr_id: e.id,
|
||||
adjustment: NoAdjustment,
|
||||
};
|
||||
check_trait_cast(cx,
|
||||
source_ty,
|
||||
target_ty,
|
||||
source.span,
|
||||
method_call);
|
||||
}
|
||||
ExprRepeat(ref element, ref count_expr) => {
|
||||
let count = ty::eval_repeat_count(cx.tcx, &**count_expr);
|
||||
|
|
@ -281,7 +290,15 @@ pub fn check_expr(cx: &mut Context, e: &Expr) {
|
|||
ty::AutoObject(..) => {
|
||||
let source_ty = ty::expr_ty(cx.tcx, e);
|
||||
let target_ty = ty::expr_ty_adjusted(cx.tcx, e);
|
||||
check_trait_cast(cx, source_ty, target_ty, e.span);
|
||||
let method_call = MethodCall {
|
||||
expr_id: e.id,
|
||||
adjustment: typeck::AutoObject,
|
||||
};
|
||||
check_trait_cast(cx,
|
||||
source_ty,
|
||||
target_ty,
|
||||
e.span,
|
||||
method_call);
|
||||
}
|
||||
ty::AutoAddEnv(..) |
|
||||
ty::AutoDerefRef(..) => {}
|
||||
|
|
@ -364,15 +381,62 @@ fn check_bounds_on_type_parameters(cx: &mut Context, e: &Expr) {
|
|||
}
|
||||
}
|
||||
|
||||
fn check_trait_cast(cx: &mut Context, source_ty: ty::t, target_ty: ty::t, span: Span) {
|
||||
fn check_type_parameter_bounds_in_vtable_result(
|
||||
cx: &mut Context,
|
||||
span: Span,
|
||||
vtable_res: &typeck::vtable_res) {
|
||||
for origins in vtable_res.iter() {
|
||||
for origin in origins.iter() {
|
||||
let (type_param_defs, substs) = match *origin {
|
||||
typeck::vtable_static(def_id, ref tys, _) => {
|
||||
let type_param_defs =
|
||||
ty::lookup_item_type(cx.tcx, def_id).generics
|
||||
.types
|
||||
.clone();
|
||||
(type_param_defs, (*tys).clone())
|
||||
}
|
||||
_ => {
|
||||
// Nothing to do here.
|
||||
continue
|
||||
}
|
||||
};
|
||||
for type_param_def in type_param_defs.iter() {
|
||||
let typ = substs.types.get(type_param_def.space,
|
||||
type_param_def.index);
|
||||
check_typaram_bounds(cx, span, *typ, type_param_def)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn check_trait_cast(cx: &mut Context,
|
||||
source_ty: ty::t,
|
||||
target_ty: ty::t,
|
||||
span: Span,
|
||||
method_call: MethodCall) {
|
||||
check_cast_for_escaping_regions(cx, source_ty, target_ty, span);
|
||||
match ty::get(target_ty).sty {
|
||||
ty::ty_uniq(ty) | ty::ty_rptr(_, ty::mt{ ty, .. }) => match ty::get(ty).sty {
|
||||
ty::ty_trait(box ty::TyTrait { bounds, .. }) => {
|
||||
check_trait_cast_bounds(cx, span, source_ty, bounds);
|
||||
ty::ty_uniq(ty) | ty::ty_rptr(_, ty::mt{ ty, .. }) => {
|
||||
match ty::get(ty).sty {
|
||||
ty::ty_trait(box ty::TyTrait { bounds, .. }) => {
|
||||
match cx.tcx.vtable_map.borrow().find(&method_call) {
|
||||
None => {
|
||||
cx.tcx.sess.span_bug(span,
|
||||
"trait cast not in vtable \
|
||||
map?!")
|
||||
}
|
||||
Some(vtable_res) => {
|
||||
check_type_parameter_bounds_in_vtable_result(
|
||||
cx,
|
||||
span,
|
||||
vtable_res)
|
||||
}
|
||||
};
|
||||
check_trait_cast_bounds(cx, span, source_ty, bounds);
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
_ => {}
|
||||
},
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
|
|
@ -627,7 +691,7 @@ fn check_sized(tcx: &ty::ctxt, ty: ty::t, name: String, sp: Span) {
|
|||
fn check_pat(cx: &mut Context, pat: &Pat) {
|
||||
let var_name = match pat.node {
|
||||
PatWild => Some("_".to_string()),
|
||||
PatIdent(_, ref path, _) => Some(path_to_str(path).to_string()),
|
||||
PatIdent(_, ref path1, _) => Some(ident_to_str(&path1.node).to_string()),
|
||||
_ => None
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -367,9 +367,9 @@ fn visit_fn(ir: &mut IrMaps,
|
|||
for arg in decl.inputs.iter() {
|
||||
pat_util::pat_bindings(&ir.tcx.def_map,
|
||||
&*arg.pat,
|
||||
|_bm, arg_id, _x, path| {
|
||||
|_bm, arg_id, _x, path1| {
|
||||
debug!("adding argument {}", arg_id);
|
||||
let ident = ast_util::path_to_ident(path);
|
||||
let ident = path1.node;
|
||||
fn_maps.add_variable(Arg(arg_id, ident));
|
||||
})
|
||||
};
|
||||
|
|
@ -399,9 +399,9 @@ fn visit_fn(ir: &mut IrMaps,
|
|||
}
|
||||
|
||||
fn visit_local(ir: &mut IrMaps, local: &Local) {
|
||||
pat_util::pat_bindings(&ir.tcx.def_map, &*local.pat, |_, p_id, sp, path| {
|
||||
pat_util::pat_bindings(&ir.tcx.def_map, &*local.pat, |_, p_id, sp, path1| {
|
||||
debug!("adding local variable {}", p_id);
|
||||
let name = ast_util::path_to_ident(path);
|
||||
let name = path1.node;
|
||||
ir.add_live_node_for_node(p_id, VarDefNode(sp));
|
||||
ir.add_variable(Local(LocalInfo {
|
||||
id: p_id,
|
||||
|
|
@ -413,10 +413,10 @@ fn visit_local(ir: &mut IrMaps, local: &Local) {
|
|||
|
||||
fn visit_arm(ir: &mut IrMaps, arm: &Arm) {
|
||||
for pat in arm.pats.iter() {
|
||||
pat_util::pat_bindings(&ir.tcx.def_map, &**pat, |bm, p_id, sp, path| {
|
||||
pat_util::pat_bindings(&ir.tcx.def_map, &**pat, |bm, p_id, sp, path1| {
|
||||
debug!("adding local variable {} from match with bm {:?}",
|
||||
p_id, bm);
|
||||
let name = ast_util::path_to_ident(path);
|
||||
let name = path1.node;
|
||||
ir.add_live_node_for_node(p_id, VarDefNode(sp));
|
||||
ir.add_variable(Local(LocalInfo {
|
||||
id: p_id,
|
||||
|
|
@ -1522,10 +1522,10 @@ impl<'a> Liveness<'a> {
|
|||
for arg in decl.inputs.iter() {
|
||||
pat_util::pat_bindings(&self.ir.tcx.def_map,
|
||||
&*arg.pat,
|
||||
|_bm, p_id, sp, path| {
|
||||
|_bm, p_id, sp, path1| {
|
||||
let var = self.variable(p_id, sp);
|
||||
// Ignore unused self.
|
||||
let ident = ast_util::path_to_ident(path);
|
||||
let ident = path1.node;
|
||||
if ident.name != special_idents::self_.name {
|
||||
self.warn_about_unused(sp, p_id, entry_ln, var);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -383,7 +383,7 @@ impl<'t,TYPER:Typer> MemCategorizationContext<'t,TYPER> {
|
|||
Some(adjustment) => {
|
||||
match *adjustment {
|
||||
ty::AutoObject(..) => {
|
||||
// Implicity cast a concrete object to trait object.
|
||||
// Implicitly cast a concrete object to trait object.
|
||||
// Result is an rvalue.
|
||||
let expr_ty = if_ok!(self.expr_ty_adjusted(expr));
|
||||
Ok(self.cat_rvalue_node(expr.id(), expr.span(), expr_ty))
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ use middle::resolve;
|
|||
use std::collections::HashMap;
|
||||
use std::gc::{Gc, GC};
|
||||
use syntax::ast::*;
|
||||
use syntax::ast_util::{path_to_ident, walk_pat};
|
||||
use syntax::ast_util::{walk_pat};
|
||||
use syntax::codemap::{Span, DUMMY_SP};
|
||||
|
||||
pub type PatIdMap = HashMap<Ident, NodeId>;
|
||||
|
|
@ -23,8 +23,8 @@ pub type PatIdMap = HashMap<Ident, NodeId>;
|
|||
// use the NodeId of their namesake in the first pattern.
|
||||
pub fn pat_id_map(dm: &resolve::DefMap, pat: &Pat) -> PatIdMap {
|
||||
let mut map = HashMap::new();
|
||||
pat_bindings(dm, pat, |_bm, p_id, _s, n| {
|
||||
map.insert(path_to_ident(n), p_id);
|
||||
pat_bindings(dm, pat, |_bm, p_id, _s, path1| {
|
||||
map.insert(path1.node, p_id);
|
||||
});
|
||||
map
|
||||
}
|
||||
|
|
@ -75,7 +75,7 @@ pub fn pat_is_binding_or_wild(dm: &resolve::DefMap, pat: &Pat) -> bool {
|
|||
/// `match foo() { Some(a) => (), None => () }`
|
||||
pub fn pat_bindings(dm: &resolve::DefMap,
|
||||
pat: &Pat,
|
||||
it: |BindingMode, NodeId, Span, &Path|) {
|
||||
it: |BindingMode, NodeId, Span, &SpannedIdent|) {
|
||||
walk_pat(pat, |p| {
|
||||
match p.node {
|
||||
PatIdent(binding_mode, ref pth, _) if pat_is_binding(dm, p) => {
|
||||
|
|
@ -102,10 +102,10 @@ pub fn pat_contains_bindings(dm: &resolve::DefMap, pat: &Pat) -> bool {
|
|||
contains_bindings
|
||||
}
|
||||
|
||||
pub fn simple_identifier<'a>(pat: &'a Pat) -> Option<&'a Path> {
|
||||
pub fn simple_identifier<'a>(pat: &'a Pat) -> Option<&'a Ident> {
|
||||
match pat.node {
|
||||
PatIdent(BindByValue(_), ref path, None) => {
|
||||
Some(path)
|
||||
PatIdent(BindByValue(_), ref path1, None) => {
|
||||
Some(&path1.node)
|
||||
}
|
||||
_ => {
|
||||
None
|
||||
|
|
|
|||
|
|
@ -1267,7 +1267,7 @@ impl<'a> Visitor<()> for VisiblePrivateTypesVisitor<'a> {
|
|||
// error messages without (too many) false positives
|
||||
// (i.e. we could just return here to not check them at
|
||||
// all, or some worse estimation of whether an impl is
|
||||
// publically visible.
|
||||
// publicly visible.
|
||||
ast::ItemImpl(ref g, ref trait_ref, self_, ref methods) => {
|
||||
// `impl [... for] Private` is never visible.
|
||||
let self_contains_private;
|
||||
|
|
|
|||
|
|
@ -23,11 +23,10 @@ use util::nodemap::{NodeMap, DefIdSet, FnvHashMap};
|
|||
use syntax::ast::*;
|
||||
use syntax::ast;
|
||||
use syntax::ast_util::{local_def};
|
||||
use syntax::ast_util::{path_to_ident, walk_pat, trait_method_to_ty_method};
|
||||
use syntax::ast_util::{walk_pat, trait_method_to_ty_method};
|
||||
use syntax::ext::mtwt;
|
||||
use syntax::parse::token::special_idents;
|
||||
use syntax::parse::token;
|
||||
use syntax::print::pprust::path_to_str;
|
||||
use syntax::codemap::{Span, DUMMY_SP, Pos};
|
||||
use syntax::owned_slice::OwnedSlice;
|
||||
use syntax::visit;
|
||||
|
|
@ -1247,7 +1246,7 @@ impl<'a> Resolver<'a> {
|
|||
// Create the module and add all methods.
|
||||
match ty.node {
|
||||
TyPath(ref path, _, _) if path.segments.len() == 1 => {
|
||||
let name = path_to_ident(path);
|
||||
let name = path.segments.last().unwrap().identifier;
|
||||
|
||||
let parent_opt = parent.module().children.borrow()
|
||||
.find_copy(&name.name);
|
||||
|
|
@ -4104,8 +4103,8 @@ impl<'a> Resolver<'a> {
|
|||
// user and one 'x' came from the macro.
|
||||
fn binding_mode_map(&mut self, pat: &Pat) -> BindingMap {
|
||||
let mut result = HashMap::new();
|
||||
pat_bindings(&self.def_map, pat, |binding_mode, _id, sp, path| {
|
||||
let name = mtwt::resolve(path_to_ident(path));
|
||||
pat_bindings(&self.def_map, pat, |binding_mode, _id, sp, path1| {
|
||||
let name = mtwt::resolve(path1.node);
|
||||
result.insert(name,
|
||||
binding_info {span: sp,
|
||||
binding_mode: binding_mode});
|
||||
|
|
@ -4314,8 +4313,7 @@ impl<'a> Resolver<'a> {
|
|||
let pat_id = pattern.id;
|
||||
walk_pat(pattern, |pattern| {
|
||||
match pattern.node {
|
||||
PatIdent(binding_mode, ref path, _)
|
||||
if !path.global && path.segments.len() == 1 => {
|
||||
PatIdent(binding_mode, ref path1, _) => {
|
||||
|
||||
// The meaning of pat_ident with no type parameters
|
||||
// depends on whether an enum variant or unit-like struct
|
||||
|
|
@ -4326,7 +4324,7 @@ impl<'a> Resolver<'a> {
|
|||
// such a value is simply disallowed (since it's rarely
|
||||
// what you want).
|
||||
|
||||
let ident = path.segments.get(0).identifier;
|
||||
let ident = path1.node;
|
||||
let renamed = mtwt::resolve(ident);
|
||||
|
||||
match self.resolve_bare_identifier_pattern(ident) {
|
||||
|
|
@ -4416,57 +4414,12 @@ impl<'a> Resolver<'a> {
|
|||
format!("identifier `{}` is bound \
|
||||
more than once in the same \
|
||||
pattern",
|
||||
path_to_str(path)).as_slice());
|
||||
token::get_ident(ident)).as_slice());
|
||||
}
|
||||
// Else, not bound in the same pattern: do
|
||||
// nothing.
|
||||
}
|
||||
}
|
||||
|
||||
// Check the types in the path pattern.
|
||||
for ty in path.segments
|
||||
.iter()
|
||||
.flat_map(|seg| seg.types.iter()) {
|
||||
self.resolve_type(&**ty);
|
||||
}
|
||||
}
|
||||
|
||||
PatIdent(binding_mode, ref path, _) => {
|
||||
// This must be an enum variant, struct, or constant.
|
||||
match self.resolve_path(pat_id, path, ValueNS, false) {
|
||||
Some(def @ (DefVariant(..), _)) |
|
||||
Some(def @ (DefStruct(..), _)) => {
|
||||
self.record_def(pattern.id, def);
|
||||
}
|
||||
Some(def @ (DefStatic(..), _)) => {
|
||||
self.enforce_default_binding_mode(
|
||||
pattern,
|
||||
binding_mode,
|
||||
"a constant");
|
||||
self.record_def(pattern.id, def);
|
||||
}
|
||||
Some(_) => {
|
||||
self.resolve_error(
|
||||
path.span,
|
||||
format!("`{}` is not an enum variant or constant",
|
||||
token::get_ident(
|
||||
path.segments
|
||||
.last()
|
||||
.unwrap()
|
||||
.identifier)).as_slice())
|
||||
}
|
||||
None => {
|
||||
self.resolve_error(path.span,
|
||||
"unresolved enum variant");
|
||||
}
|
||||
}
|
||||
|
||||
// Check the types in the path pattern.
|
||||
for ty in path.segments
|
||||
.iter()
|
||||
.flat_map(|s| s.types.iter()) {
|
||||
self.resolve_type(&**ty);
|
||||
}
|
||||
}
|
||||
|
||||
PatEnum(ref path, _) => {
|
||||
|
|
@ -5202,8 +5155,8 @@ impl<'a> Resolver<'a> {
|
|||
in a static method. Maybe a \
|
||||
`self` argument is missing?");
|
||||
} else {
|
||||
let name = path_to_ident(path).name;
|
||||
let mut msg = match self.find_fallback_in_self_type(name) {
|
||||
let last_name = path.segments.last().unwrap().identifier.name;
|
||||
let mut msg = match self.find_fallback_in_self_type(last_name) {
|
||||
NoSuggestion => {
|
||||
// limit search to 5 to reduce the number
|
||||
// of stupid suggestions
|
||||
|
|
|
|||
|
|
@ -484,7 +484,7 @@ impl <'l> DxrVisitor<'l> {
|
|||
{
|
||||
let qualname = self.analysis.ty_cx.map.path_to_str(item.id);
|
||||
|
||||
// If the variable is immutable, save the initialising expresion.
|
||||
// If the variable is immutable, save the initialising expression.
|
||||
let value = match mt {
|
||||
ast::MutMutable => String::from_str("<mutable>"),
|
||||
ast::MutImmutable => self.span.snippet(expr.span),
|
||||
|
|
@ -845,7 +845,7 @@ impl <'l> DxrVisitor<'l> {
|
|||
let decl_id = ty::trait_method_of_method(&self.analysis.ty_cx, def_id);
|
||||
|
||||
// This incantation is required if the method referenced is a trait's
|
||||
// defailt implementation.
|
||||
// default implementation.
|
||||
let def_id = ty::method(&self.analysis.ty_cx, def_id).provided_source
|
||||
.unwrap_or(def_id);
|
||||
(Some(def_id), decl_id)
|
||||
|
|
@ -926,7 +926,7 @@ impl <'l> DxrVisitor<'l> {
|
|||
self.collected_paths.push((p.id, path.clone(), false, recorder::VarRef));
|
||||
visit::walk_pat(self, p, e);
|
||||
}
|
||||
ast::PatIdent(bm, ref path, ref optional_subpattern) => {
|
||||
ast::PatIdent(bm, ref path1, ref optional_subpattern) => {
|
||||
let immut = match bm {
|
||||
// Even if the ref is mut, you can't change the ref, only
|
||||
// the data pointed at, so showing the initialising expression
|
||||
|
|
@ -940,7 +940,8 @@ impl <'l> DxrVisitor<'l> {
|
|||
}
|
||||
};
|
||||
// collect path for either visit_local or visit_arm
|
||||
self.collected_paths.push((p.id, path.clone(), immut, recorder::VarRef));
|
||||
let path = ast_util::ident_to_path(path1.span,path1.node);
|
||||
self.collected_paths.push((p.id, path, immut, recorder::VarRef));
|
||||
match *optional_subpattern {
|
||||
None => {}
|
||||
Some(subpattern) => self.visit_pat(&*subpattern, e),
|
||||
|
|
@ -1402,7 +1403,7 @@ pub fn process_crate(sess: &Session,
|
|||
info!("Writing output to {}", disp);
|
||||
}
|
||||
|
||||
// Create ouput file.
|
||||
// Create output file.
|
||||
let mut out_name = cratename.clone();
|
||||
out_name.push_str(".csv");
|
||||
root_path.push(out_name);
|
||||
|
|
|
|||
|
|
@ -224,8 +224,6 @@ use std::rc::Rc;
|
|||
use std::gc::{Gc};
|
||||
use syntax::ast;
|
||||
use syntax::ast::Ident;
|
||||
use syntax::ast_util::path_to_ident;
|
||||
use syntax::ast_util;
|
||||
use syntax::codemap::Span;
|
||||
use syntax::parse::token::InternedString;
|
||||
|
||||
|
|
@ -429,13 +427,13 @@ fn expand_nested_bindings<'a, 'b>(
|
|||
|
||||
m.iter().map(|br| {
|
||||
match br.pats.get(col).node {
|
||||
ast::PatIdent(_, ref path, Some(inner)) => {
|
||||
ast::PatIdent(_, ref path1, Some(inner)) => {
|
||||
let pats = Vec::from_slice(br.pats.slice(0u, col))
|
||||
.append((vec!(inner))
|
||||
.append(br.pats.slice(col + 1u, br.pats.len())).as_slice());
|
||||
|
||||
let mut bound_ptrs = br.bound_ptrs.clone();
|
||||
bound_ptrs.push((path_to_ident(path), val));
|
||||
bound_ptrs.push((path1.node, val));
|
||||
Match {
|
||||
pats: pats,
|
||||
data: &*br.data,
|
||||
|
|
@ -473,9 +471,9 @@ fn enter_match<'a, 'b>(
|
|||
let this = *br.pats.get(col);
|
||||
let mut bound_ptrs = br.bound_ptrs.clone();
|
||||
match this.node {
|
||||
ast::PatIdent(_, ref path, None) => {
|
||||
ast::PatIdent(_, ref path1, None) => {
|
||||
if pat_is_binding(dm, &*this) {
|
||||
bound_ptrs.push((path_to_ident(path), val));
|
||||
bound_ptrs.push((path1.node, val));
|
||||
}
|
||||
}
|
||||
_ => {}
|
||||
|
|
@ -1366,8 +1364,8 @@ fn create_bindings_map(bcx: &Block, pat: Gc<ast::Pat>) -> BindingsMap {
|
|||
let ccx = bcx.ccx();
|
||||
let tcx = bcx.tcx();
|
||||
let mut bindings_map = HashMap::new();
|
||||
pat_bindings(&tcx.def_map, &*pat, |bm, p_id, span, path| {
|
||||
let ident = path_to_ident(path);
|
||||
pat_bindings(&tcx.def_map, &*pat, |bm, p_id, span, path1| {
|
||||
let ident = path1.node;
|
||||
let variable_ty = node_id_type(bcx, p_id);
|
||||
let llvariable_ty = type_of::type_of(ccx, variable_ty);
|
||||
let tcx = bcx.tcx();
|
||||
|
|
@ -1520,10 +1518,10 @@ pub fn store_local<'a>(bcx: &'a Block<'a>,
|
|||
// In such cases, the more general path is unsafe, because
|
||||
// it assumes it is matching against a valid value.
|
||||
match simple_identifier(&*pat) {
|
||||
Some(path) => {
|
||||
Some(ident) => {
|
||||
let var_scope = cleanup::var_scope(tcx, local.id);
|
||||
return mk_binding_alloca(
|
||||
bcx, pat.id, path, BindLocal, var_scope, (),
|
||||
bcx, pat.id, ident, BindLocal, var_scope, (),
|
||||
|(), bcx, v, _| expr::trans_into(bcx, &*init_expr,
|
||||
expr::SaveIn(v)));
|
||||
}
|
||||
|
|
@ -1555,10 +1553,10 @@ pub fn store_local<'a>(bcx: &'a Block<'a>,
|
|||
// create dummy memory for the variables if we have no
|
||||
// value to store into them immediately
|
||||
let tcx = bcx.tcx();
|
||||
pat_bindings(&tcx.def_map, &*pat, |_, p_id, _, path| {
|
||||
pat_bindings(&tcx.def_map, &*pat, |_, p_id, _, path1| {
|
||||
let scope = cleanup::var_scope(tcx, p_id);
|
||||
bcx = mk_binding_alloca(
|
||||
bcx, p_id, path, BindLocal, scope, (),
|
||||
bcx, p_id, &path1.node, BindLocal, scope, (),
|
||||
|(), bcx, llval, ty| { zero_mem(bcx, llval, ty); bcx });
|
||||
});
|
||||
bcx
|
||||
|
|
@ -1586,7 +1584,7 @@ pub fn store_arg<'a>(mut bcx: &'a Block<'a>,
|
|||
let _icx = push_ctxt("match::store_arg");
|
||||
|
||||
match simple_identifier(&*pat) {
|
||||
Some(path) => {
|
||||
Some(ident) => {
|
||||
// Generate nicer LLVM for the common case of fn a pattern
|
||||
// like `x: T`
|
||||
let arg_ty = node_id_type(bcx, pat.id);
|
||||
|
|
@ -1601,7 +1599,7 @@ pub fn store_arg<'a>(mut bcx: &'a Block<'a>,
|
|||
bcx
|
||||
} else {
|
||||
mk_binding_alloca(
|
||||
bcx, pat.id, path, BindArgument, arg_scope, arg,
|
||||
bcx, pat.id, ident, BindArgument, arg_scope, arg,
|
||||
|arg, bcx, llval, _| arg.store_to(bcx, llval))
|
||||
}
|
||||
}
|
||||
|
|
@ -1619,17 +1617,16 @@ pub fn store_arg<'a>(mut bcx: &'a Block<'a>,
|
|||
|
||||
fn mk_binding_alloca<'a,A>(bcx: &'a Block<'a>,
|
||||
p_id: ast::NodeId,
|
||||
path: &ast::Path,
|
||||
ident: &ast::Ident,
|
||||
binding_mode: IrrefutablePatternBindingMode,
|
||||
cleanup_scope: cleanup::ScopeId,
|
||||
arg: A,
|
||||
populate: |A, &'a Block<'a>, ValueRef, ty::t| -> &'a Block<'a>)
|
||||
-> &'a Block<'a> {
|
||||
let var_ty = node_id_type(bcx, p_id);
|
||||
let ident = ast_util::path_to_ident(path);
|
||||
|
||||
// Allocate memory on stack for the binding.
|
||||
let llval = alloc_ty(bcx, var_ty, bcx.ident(ident).as_slice());
|
||||
let llval = alloc_ty(bcx, var_ty, bcx.ident(*ident).as_slice());
|
||||
|
||||
// Subtle: be sure that we *populate* the memory *before*
|
||||
// we schedule the cleanup.
|
||||
|
|
@ -1687,13 +1684,13 @@ fn bind_irrefutable_pat<'a>(
|
|||
let tcx = bcx.tcx();
|
||||
let ccx = bcx.ccx();
|
||||
match pat.node {
|
||||
ast::PatIdent(pat_binding_mode, ref path, inner) => {
|
||||
ast::PatIdent(pat_binding_mode, ref path1, inner) => {
|
||||
if pat_is_binding(&tcx.def_map, &*pat) {
|
||||
// Allocate the stack slot where the value of this
|
||||
// binding will live and place it into the appropriate
|
||||
// map.
|
||||
bcx = mk_binding_alloca(
|
||||
bcx, pat.id, path, binding_mode, cleanup_scope, (),
|
||||
bcx, pat.id, &path1.node, binding_mode, cleanup_scope, (),
|
||||
|(), bcx, llval, ty| {
|
||||
match pat_binding_mode {
|
||||
ast::BindByValue(_) => {
|
||||
|
|
|
|||
|
|
@ -842,8 +842,8 @@ pub fn create_local_var_metadata(bcx: &Block, local: &ast::Local) {
|
|||
let cx = bcx.ccx();
|
||||
let def_map = &cx.tcx.def_map;
|
||||
|
||||
pat_util::pat_bindings(def_map, &*local.pat, |_, node_id, span, path_ref| {
|
||||
let var_ident = ast_util::path_to_ident(path_ref);
|
||||
pat_util::pat_bindings(def_map, &*local.pat, |_, node_id, span, path1| {
|
||||
let var_ident = path1.node;
|
||||
|
||||
let datum = match bcx.fcx.lllocals.borrow().find_copy(&node_id) {
|
||||
Some(datum) => datum,
|
||||
|
|
@ -890,8 +890,8 @@ pub fn create_captured_var_metadata(bcx: &Block,
|
|||
}
|
||||
Some(ast_map::NodeLocal(pat)) | Some(ast_map::NodeArg(pat)) => {
|
||||
match pat.node {
|
||||
ast::PatIdent(_, ref path, _) => {
|
||||
ast_util::path_to_ident(path)
|
||||
ast::PatIdent(_, ref path1, _) => {
|
||||
path1.node
|
||||
}
|
||||
_ => {
|
||||
cx.sess()
|
||||
|
|
@ -1007,7 +1007,7 @@ pub fn create_argument_metadata(bcx: &Block, arg: &ast::Arg) {
|
|||
let def_map = &cx.tcx.def_map;
|
||||
let scope_metadata = bcx.fcx.debug_context.get_ref(cx, arg.pat.span).fn_metadata;
|
||||
|
||||
pat_util::pat_bindings(def_map, &*arg.pat, |_, node_id, span, path_ref| {
|
||||
pat_util::pat_bindings(def_map, &*arg.pat, |_, node_id, span, path1| {
|
||||
let llarg = match bcx.fcx.llargs.borrow().find_copy(&node_id) {
|
||||
Some(v) => v,
|
||||
None => {
|
||||
|
|
@ -1022,8 +1022,6 @@ pub fn create_argument_metadata(bcx: &Block, arg: &ast::Arg) {
|
|||
Referenced variable location is not an alloca!");
|
||||
}
|
||||
|
||||
let argument_ident = ast_util::path_to_ident(path_ref);
|
||||
|
||||
let argument_index = {
|
||||
let counter = &fcx.debug_context.get_ref(cx, span).argument_counter;
|
||||
let argument_index = counter.get();
|
||||
|
|
@ -1032,7 +1030,7 @@ pub fn create_argument_metadata(bcx: &Block, arg: &ast::Arg) {
|
|||
};
|
||||
|
||||
declare_local(bcx,
|
||||
argument_ident,
|
||||
path1.node,
|
||||
llarg.ty,
|
||||
scope_metadata,
|
||||
DirectVariable { alloca: llarg.val },
|
||||
|
|
@ -3237,10 +3235,9 @@ fn populate_scope_map(cx: &CrateContext,
|
|||
// Push argument identifiers onto the stack so arguments integrate nicely
|
||||
// with variable shadowing.
|
||||
for &arg_pat in arg_pats.iter() {
|
||||
pat_util::pat_bindings(def_map, &*arg_pat, |_, _, _, path_ref| {
|
||||
let ident = ast_util::path_to_ident(path_ref);
|
||||
pat_util::pat_bindings(def_map, &*arg_pat, |_, _, _, path1| {
|
||||
scope_stack.push(ScopeStackEntry { scope_metadata: fn_metadata,
|
||||
ident: Some(ident) });
|
||||
ident: Some(path1.node) });
|
||||
})
|
||||
}
|
||||
|
||||
|
|
@ -3348,13 +3345,13 @@ fn populate_scope_map(cx: &CrateContext,
|
|||
// ast_util::walk_pat() here because we have to visit *all* nodes in
|
||||
// order to put them into the scope map. The above functions don't do that.
|
||||
match pat.node {
|
||||
ast::PatIdent(_, ref path_ref, ref sub_pat_opt) => {
|
||||
ast::PatIdent(_, ref path1, ref sub_pat_opt) => {
|
||||
|
||||
// Check if this is a binding. If so we need to put it on the
|
||||
// scope stack and maybe introduce an artificial scope
|
||||
if pat_util::pat_is_binding(def_map, &*pat) {
|
||||
|
||||
let ident = ast_util::path_to_ident(path_ref);
|
||||
let ident = path1.node;
|
||||
|
||||
// LLVM does not properly generate 'DW_AT_start_scope' fields
|
||||
// for variable DIEs. For this reason we have to introduce
|
||||
|
|
|
|||
|
|
@ -2771,8 +2771,8 @@ pub fn local_var_name_str(cx: &ctxt, id: NodeId) -> InternedString {
|
|||
match cx.map.find(id) {
|
||||
Some(ast_map::NodeLocal(pat)) => {
|
||||
match pat.node {
|
||||
ast::PatIdent(_, ref path, _) => {
|
||||
token::get_ident(ast_util::path_to_ident(path))
|
||||
ast::PatIdent(_, ref path1, _) => {
|
||||
token::get_ident(path1.node)
|
||||
}
|
||||
_ => {
|
||||
cx.sess.bug(
|
||||
|
|
|
|||
|
|
@ -485,7 +485,7 @@ pub fn check_pat(pcx: &pat_ctxt, pat: &ast::Pat, expected: ty::t) {
|
|||
demand::suptype(fcx, pat.span, expected, const_pty.ty);
|
||||
fcx.write_ty(pat.id, const_pty.ty);
|
||||
}
|
||||
ast::PatIdent(bm, ref name, sub) if pat_is_binding(&tcx.def_map, pat) => {
|
||||
ast::PatIdent(bm, ref path1, sub) if pat_is_binding(&tcx.def_map, pat) => {
|
||||
let typ = fcx.local_ty(pat.span, pat.id);
|
||||
|
||||
match bm {
|
||||
|
|
@ -507,7 +507,7 @@ pub fn check_pat(pcx: &pat_ctxt, pat: &ast::Pat, expected: ty::t) {
|
|||
}
|
||||
}
|
||||
|
||||
let canon_id = *pcx.map.get(&ast_util::path_to_ident(name));
|
||||
let canon_id = *pcx.map.get(&path1.node);
|
||||
if canon_id != pat.id {
|
||||
let ct = fcx.local_ty(pat.span, canon_id);
|
||||
demand::eqtype(fcx, pat.span, ct, typ);
|
||||
|
|
@ -521,8 +521,10 @@ pub fn check_pat(pcx: &pat_ctxt, pat: &ast::Pat, expected: ty::t) {
|
|||
_ => ()
|
||||
}
|
||||
}
|
||||
ast::PatIdent(_, ref path, _) => {
|
||||
check_pat_variant(pcx, pat, path, &Some(Vec::new()), expected);
|
||||
// it's not a binding, it's an enum in disguise:
|
||||
ast::PatIdent(_, ref path1, _) => {
|
||||
let path = ast_util::ident_to_path(path1.span,path1.node);
|
||||
check_pat_variant(pcx, pat, &path, &Some(Vec::new()), expected);
|
||||
}
|
||||
ast::PatEnum(ref path, ref subpats) => {
|
||||
check_pat_variant(pcx, pat, path, subpats, expected);
|
||||
|
|
|
|||
|
|
@ -406,11 +406,11 @@ impl<'a> Visitor<()> for GatherLocalsVisitor<'a> {
|
|||
// Add pattern bindings.
|
||||
fn visit_pat(&mut self, p: &ast::Pat, _: ()) {
|
||||
match p.node {
|
||||
ast::PatIdent(_, ref path, _)
|
||||
ast::PatIdent(_, ref path1, _)
|
||||
if pat_util::pat_is_binding(&self.fcx.ccx.tcx.def_map, p) => {
|
||||
self.assign(p.id, None);
|
||||
debug!("Pattern binding {} is assigned to {}",
|
||||
token::get_ident(path.segments.get(0).identifier),
|
||||
token::get_ident(path1.node),
|
||||
self.fcx.infcx().ty_to_str(
|
||||
self.fcx.inh.locals.borrow().get_copy(&p.id)));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -398,6 +398,9 @@ fn search_for_vtable(vcx: &VtableContext,
|
|||
// Resolve any sub bounds. Note that there still may be free
|
||||
// type variables in substs. This might still be OK: the
|
||||
// process of looking up bounds might constrain some of them.
|
||||
//
|
||||
// This does not check built-in traits because those are handled
|
||||
// later in the kind checking pass.
|
||||
let im_generics =
|
||||
ty::lookup_item_type(tcx, impl_did).generics;
|
||||
let subres = lookup_vtables(vcx,
|
||||
|
|
|
|||
|
|
@ -93,7 +93,7 @@ pub struct UnificationTable<K,V> {
|
|||
|
||||
/**
|
||||
* At any time, users may snapshot a unification table. The changes
|
||||
* made during the snapshot may either be *commited* or *rolled back*.
|
||||
* made during the snapshot may either be *committed* or *rolled back*.
|
||||
*/
|
||||
pub struct Snapshot<K> {
|
||||
// Ensure that this snapshot is keyed to the table type.
|
||||
|
|
@ -152,7 +152,7 @@ impl<V:PartialEq+Clone+Repr,K:UnifyKey<V>> UnificationTable<K,V> {
|
|||
|
||||
/**
|
||||
* Starts a new snapshot. Each snapshot must be either
|
||||
* rolled back or commited in a "LIFO" (stack) order.
|
||||
* rolled back or committed in a "LIFO" (stack) order.
|
||||
*/
|
||||
pub fn snapshot(&mut self) -> Snapshot<K> {
|
||||
let length = self.undo_log.len();
|
||||
|
|
@ -188,12 +188,12 @@ impl<V:PartialEq+Clone+Repr,K:UnifyKey<V>> UnificationTable<K,V> {
|
|||
match self.undo_log.pop().unwrap() {
|
||||
OpenSnapshot => {
|
||||
// This indicates a failure to obey the stack discipline.
|
||||
tcx.sess.bug("Cannot rollback an uncommited snapshot");
|
||||
tcx.sess.bug("Cannot rollback an uncommitted snapshot");
|
||||
}
|
||||
|
||||
CommittedSnapshot => {
|
||||
// This occurs when there are nested snapshots and
|
||||
// the inner is commited but outer is rolled back.
|
||||
// the inner is committed but outer is rolled back.
|
||||
}
|
||||
|
||||
NewVar(i) => {
|
||||
|
|
|
|||
|
|
@ -216,9 +216,9 @@ pub type vtable_res = VecPerParamSpace<vtable_param_res>;
|
|||
#[deriving(Clone)]
|
||||
pub enum vtable_origin {
|
||||
/*
|
||||
Statically known vtable. def_id gives the class or impl item
|
||||
Statically known vtable. def_id gives the impl item
|
||||
from whence comes the vtable, and tys are the type substs.
|
||||
vtable_res is the vtable itself
|
||||
vtable_res is the vtable itself.
|
||||
*/
|
||||
vtable_static(ast::DefId, subst::Substs, vtable_res),
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue