Merge remote-tracking branch 'nrc/sized-2' into rollup

Conflicts:
	src/liballoc/boxed.rs
	src/libcollections/btree/map.rs
	src/libcollections/slice.rs
	src/libcore/borrow.rs
	src/libcore/cmp.rs
	src/libcore/ops.rs
	src/libstd/c_str.rs
	src/libstd/collections/hash/map.rs
	src/libsyntax/parse/obsolete.rs
	src/test/compile-fail/unboxed-closure-sugar-default.rs
	src/test/compile-fail/unboxed-closure-sugar-equiv.rs
	src/test/compile-fail/unboxed-closure-sugar-lifetime-elision.rs
	src/test/compile-fail/unboxed-closure-sugar-region.rs
	src/test/compile-fail/unsized3.rs
	src/test/run-pass/associated-types-conditional-dispatch.rs
This commit is contained in:
Alex Crichton
2015-01-05 18:55:41 -08:00
64 changed files with 251 additions and 245 deletions

View File

@@ -13,8 +13,6 @@
//!
//! Obsolete syntax that becomes too hard to parse can be removed.
pub use self::ObsoleteSyntax::*;
use ast::{Expr, ExprTup};
use codemap::Span;
use parse::parser;
@@ -24,18 +22,19 @@ use ptr::P;
/// The specific types of unsupported syntax
#[derive(Copy, PartialEq, Eq, Hash)]
pub enum ObsoleteSyntax {
ObsoleteForSized,
ObsoleteOwnedType,
ObsoleteOwnedExpr,
ObsoleteOwnedPattern,
ObsoleteOwnedVector,
ObsoleteOwnedSelf,
ObsoleteImportRenaming,
ObsoleteSubsliceMatch,
ObsoleteExternCrateRenaming,
ObsoleteProcType,
ObsoleteProcExpr,
ObsoleteClosureType,
Sized,
ForSized,
OwnedType,
OwnedExpr,
OwnedPattern,
OwnedVector,
OwnedSelf,
ImportRenaming,
SubsliceMatch,
ExternCrateRenaming,
ProcType,
ProcExpr,
ClosureType,
}
pub trait ParserObsoleteMethods {
@@ -57,55 +56,59 @@ impl<'a> ParserObsoleteMethods for parser::Parser<'a> {
/// Reports an obsolete syntax non-fatal error.
fn obsolete(&mut self, sp: Span, kind: ObsoleteSyntax) {
let (kind_str, desc) = match kind {
ObsoleteForSized => (
ObsoleteSyntax::ForSized => (
"for Sized?",
"no longer required. Traits (and their `Self` type) do not have the `Sized` bound \
by default",
),
ObsoleteProcType => (
ObsoleteSyntax::ProcType => (
"the `proc` type",
"use unboxed closures instead",
),
ObsoleteProcExpr => (
ObsoleteSyntax::ProcExpr => (
"`proc` expression",
"use a `move ||` expression instead",
),
ObsoleteOwnedType => (
ObsoleteSyntax::OwnedType => (
"`~` notation for owned pointers",
"use `Box<T>` in `std::owned` instead"
),
ObsoleteOwnedExpr => (
ObsoleteSyntax::OwnedExpr => (
"`~` notation for owned pointer allocation",
"use the `box` operator instead of `~`"
),
ObsoleteOwnedPattern => (
ObsoleteSyntax::OwnedPattern => (
"`~` notation for owned pointer patterns",
"use the `box` operator instead of `~`"
),
ObsoleteOwnedVector => (
ObsoleteSyntax::OwnedVector => (
"`~[T]` is no longer a type",
"use the `Vec` type instead"
),
ObsoleteOwnedSelf => (
ObsoleteSyntax::OwnedSelf => (
"`~self` is no longer supported",
"write `self: Box<Self>` instead"
),
ObsoleteImportRenaming => (
ObsoleteSyntax::ImportRenaming => (
"`use foo = bar` syntax",
"write `use bar as foo` instead"
),
ObsoleteSubsliceMatch => (
ObsoleteSyntax::SubsliceMatch => (
"subslice match syntax",
"instead of `..xs`, write `xs..` in a pattern"
),
ObsoleteExternCrateRenaming => (
ObsoleteSyntax::ExternCrateRenaming => (
"`extern crate foo = bar` syntax",
"write `extern crate bar as foo` instead"
),
ObsoleteClosureType => (
ObsoleteSyntax::ClosureType => (
"`|uint| -> bool` closure type syntax",
"use unboxed closures instead, no type annotation needed"
)
),
ObsoleteSyntax::Sized => (
"`Sized? T` syntax for removing the `Sized` bound",
"write `T: ?Sized` instead"
),
};
self.report(sp, kind, kind_str, desc);

View File

@@ -1155,7 +1155,7 @@ impl<'a> Parser<'a> {
let _ = self.parse_colon_then_ty_param_bounds(BoundParsingMode::Bare);
let _ = self.parse_ret_ty();
self.obsolete(proc_span, ObsoleteProcType);
self.obsolete(proc_span, ObsoleteSyntax::ProcType);
TyInfer
}
@@ -1511,8 +1511,10 @@ impl<'a> Parser<'a> {
self.bump();
let last_span = self.last_span;
match self.token {
token::OpenDelim(token::Bracket) => self.obsolete(last_span, ObsoleteOwnedVector),
_ => self.obsolete(last_span, ObsoleteOwnedType)
token::OpenDelim(token::Bracket) => {
self.obsolete(last_span, ObsoleteSyntax::OwnedVector)
}
_ => self.obsolete(last_span, ObsoleteSyntax::OwnedType)
}
TyTup(vec![self.parse_ty()])
} else if self.check(&token::BinOp(token::Star)) {
@@ -2275,7 +2277,7 @@ impl<'a> Parser<'a> {
let span = self.last_span;
let _ = self.parse_proc_decl();
let _ = self.parse_expr();
return self.obsolete_expr(span, ObsoleteProcExpr);
return self.obsolete_expr(span, ObsoleteSyntax::ProcExpr);
}
if self.eat_keyword(keywords::If) {
return self.parse_if_expr();
@@ -2850,9 +2852,9 @@ impl<'a> Parser<'a> {
let last_span = self.last_span;
match self.token {
token::OpenDelim(token::Bracket) => {
self.obsolete(last_span, ObsoleteOwnedVector)
self.obsolete(last_span, ObsoleteSyntax::OwnedVector)
},
_ => self.obsolete(last_span, ObsoleteOwnedExpr)
_ => self.obsolete(last_span, ObsoleteSyntax::OwnedExpr)
}
let e = self.parse_prefix_expr();
@@ -3227,7 +3229,7 @@ impl<'a> Parser<'a> {
} else {
let _ = self.parse_pat();
let span = self.span;
self.obsolete(span, ObsoleteSubsliceMatch);
self.obsolete(span, ObsoleteSyntax::SubsliceMatch);
}
continue
}
@@ -3343,7 +3345,7 @@ impl<'a> Parser<'a> {
pat = PatBox(sub);
let last_span = self.last_span;
hi = last_span.hi;
self.obsolete(last_span, ObsoleteOwnedPattern);
self.obsolete(last_span, ObsoleteSyntax::OwnedPattern);
return P(ast::Pat {
id: ast::DUMMY_NODE_ID,
node: pat,
@@ -4090,8 +4092,8 @@ impl<'a> Parser<'a> {
// unbound, and it may only be `Sized`. To avoid backtracking and other
// complications, we parse an ident, then check for `?`. If we find it,
// we use the ident as the unbound, otherwise, we use it as the name of
// type param. Even worse, for now, we need to check for `?` before or
// after the bound.
// type param. Even worse, we need to check for `?` before or after the
// bound.
let mut span = self.span;
let mut ident = self.parse_ident();
let mut unbound = None;
@@ -4100,6 +4102,7 @@ impl<'a> Parser<'a> {
unbound = Some(tref);
span = self.span;
ident = self.parse_ident();
self.obsolete(span, ObsoleteSyntax::Sized);
}
let mut bounds = self.parse_colon_then_ty_param_bounds(BoundParsingMode::Modified);
@@ -4463,7 +4466,7 @@ impl<'a> Parser<'a> {
self.bump();
drop(self.expect_self_ident());
let last_span = self.last_span;
self.obsolete(last_span, ObsoleteOwnedSelf)
self.obsolete(last_span, ObsoleteSyntax::OwnedSelf)
}
SelfStatic
}
@@ -4514,7 +4517,7 @@ impl<'a> Parser<'a> {
self.bump();
drop(self.expect_self_ident());
let last_span = self.last_span;
self.obsolete(last_span, ObsoleteOwnedSelf);
self.obsolete(last_span, ObsoleteSyntax::OwnedSelf);
SelfStatic
} else {
SelfStatic
@@ -5396,7 +5399,7 @@ impl<'a> Parser<'a> {
self.bump();
let path = self.parse_str();
let span = self.span;
self.obsolete(span, ObsoleteExternCrateRenaming);
self.obsolete(span, ObsoleteSyntax::ExternCrateRenaming);
Some(path)
} else if self.eat_keyword(keywords::As) {
// skip the ident if there is one
@@ -6053,7 +6056,7 @@ impl<'a> Parser<'a> {
path.push(id);
}
let span = mk_sp(path_lo, self.span.hi);
self.obsolete(span, ObsoleteImportRenaming);
self.obsolete(span, ObsoleteSyntax::ImportRenaming);
let path = ast::Path {
span: span,
global: false,