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:
@@ -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);
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user