fix the easy features in libsyntax

This commit is contained in:
ubsan 2017-05-03 10:54:03 -07:00
parent 8305394b4c
commit 0be875827f
6 changed files with 30 additions and 31 deletions

2
src/Cargo.lock generated
View File

@ -858,8 +858,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
name = "syntax"
version = "0.0.0"
dependencies = [
"bitflags 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)",
"log 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
"rustc_bitflags 0.0.0",
"rustc_data_structures 0.0.0",
"rustc_errors 0.0.0",
"serialize 0.0.0",

View File

@ -11,7 +11,7 @@ crate-type = ["dylib"]
[dependencies]
serialize = { path = "../libserialize" }
log = "0.3"
rustc_bitflags = { path = "../librustc_bitflags" }
bitflags = "0.8"
syntax_pos = { path = "../libsyntax_pos" }
rustc_errors = { path = "../librustc_errors" }
rustc_data_structures = { path = "../librustc_data_structures" }

View File

@ -24,20 +24,15 @@
test(attr(deny(warnings))))]
#![deny(warnings)]
#![feature(associated_consts)]
#![feature(const_fn)]
#![feature(optin_builtin_traits)]
#![feature(rustc_private)]
#![feature(staged_api)]
#![feature(str_escape)]
#![feature(unicode)]
#![feature(rustc_diagnostic_macros)]
#![feature(specialization)]
#![feature(i128_type)]
extern crate serialize;
#[macro_use] extern crate log;
#[macro_use] #[no_link] extern crate rustc_bitflags;
#[macro_use] extern crate bitflags;
extern crate std_unicode;
pub extern crate rustc_errors as errors;
extern crate syntax_pos;

View File

@ -261,10 +261,14 @@ pub fn char_lit(lit: &str) -> (char, isize) {
}
}
pub fn escape_default(s: &str) -> String {
s.chars().map(char::escape_default).flat_map(|x| x).collect()
}
/// Parse a string representing a string literal into its final form. Does
/// unescaping.
pub fn str_lit(lit: &str) -> String {
debug!("parse_str_lit: given {}", lit.escape_default());
debug!("parse_str_lit: given {}", escape_default(lit));
let mut res = String::with_capacity(lit.len());
// FIXME #8372: This could be a for-loop if it didn't borrow the iterator
@ -339,7 +343,7 @@ fn eat<'a>(it: &mut iter::Peekable<str::CharIndices<'a>>) {
/// Parse a string representing a raw string literal into its final form. The
/// only operation this does is convert embedded CRLF into a single LF.
pub fn raw_str_lit(lit: &str) -> String {
debug!("raw_str_lit: given {}", lit.escape_default());
debug!("raw_str_lit: given {}", escape_default(lit));
let mut res = String::with_capacity(lit.len());
// FIXME #8372: This could be a for-loop if it didn't borrow the iterator

View File

@ -64,7 +64,7 @@
use std::slice;
bitflags! {
flags Restrictions: u8 {
pub flags Restrictions: u8 {
const RESTRICTION_STMT_EXPR = 1 << 0,
const RESTRICTION_NO_STRUCT_LITERAL = 1 << 1,
}
@ -2291,7 +2291,7 @@ fn parse_bottom_expr(&mut self) -> PResult<'a, P<Expr>> {
let e = if self.token.can_begin_expr()
&& !(self.token == token::OpenDelim(token::Brace)
&& self.restrictions.contains(
Restrictions::RESTRICTION_NO_STRUCT_LITERAL)) {
RESTRICTION_NO_STRUCT_LITERAL)) {
Some(self.parse_expr()?)
} else {
None
@ -2318,7 +2318,7 @@ fn parse_bottom_expr(&mut self) -> PResult<'a, P<Expr>> {
// This is a struct literal, unless we're prohibited
// from parsing struct literals here.
let prohibited = self.restrictions.contains(
Restrictions::RESTRICTION_NO_STRUCT_LITERAL
RESTRICTION_NO_STRUCT_LITERAL
);
if !prohibited {
return self.parse_struct_expr(lo, pth, attrs);
@ -2722,7 +2722,7 @@ pub fn parse_prefix_expr(&mut self,
token::Ident(..) if self.token.is_keyword(keywords::In) => {
self.bump();
let place = self.parse_expr_res(
Restrictions::RESTRICTION_NO_STRUCT_LITERAL,
RESTRICTION_NO_STRUCT_LITERAL,
None,
)?;
let blk = self.parse_block()?;
@ -2785,7 +2785,7 @@ pub fn parse_assoc_expr_with(&mut self,
let cur_op_span = self.span;
let restrictions = if op.is_assign_like() {
self.restrictions & Restrictions::RESTRICTION_NO_STRUCT_LITERAL
self.restrictions & RESTRICTION_NO_STRUCT_LITERAL
} else {
self.restrictions
};
@ -2835,13 +2835,13 @@ pub fn parse_assoc_expr_with(&mut self,
let rhs = match op.fixity() {
Fixity::Right => self.with_res(
restrictions - Restrictions::RESTRICTION_STMT_EXPR,
restrictions - RESTRICTION_STMT_EXPR,
|this| {
this.parse_assoc_expr_with(op.precedence(),
LhsExpr::NotYetParsed)
}),
Fixity::Left => self.with_res(
restrictions - Restrictions::RESTRICTION_STMT_EXPR,
restrictions - RESTRICTION_STMT_EXPR,
|this| {
this.parse_assoc_expr_with(op.precedence() + 1,
LhsExpr::NotYetParsed)
@ -2849,7 +2849,7 @@ pub fn parse_assoc_expr_with(&mut self,
// We currently have no non-associative operators that are not handled above by
// the special cases. The code is here only for future convenience.
Fixity::None => self.with_res(
restrictions - Restrictions::RESTRICTION_STMT_EXPR,
restrictions - RESTRICTION_STMT_EXPR,
|this| {
this.parse_assoc_expr_with(op.precedence() + 1,
LhsExpr::NotYetParsed)
@ -2959,7 +2959,7 @@ fn is_at_start_of_range_notation_rhs(&self) -> bool {
if self.token.can_begin_expr() {
// parse `for i in 1.. { }` as infinite loop, not as `for i in (1..{})`.
if self.token == token::OpenDelim(token::Brace) {
return !self.restrictions.contains(Restrictions::RESTRICTION_NO_STRUCT_LITERAL);
return !self.restrictions.contains(RESTRICTION_NO_STRUCT_LITERAL);
}
true
} else {
@ -2973,7 +2973,7 @@ pub fn parse_if_expr(&mut self, attrs: ThinVec<Attribute>) -> PResult<'a, P<Expr
return self.parse_if_let_expr(attrs);
}
let lo = self.prev_span;
let cond = self.parse_expr_res(Restrictions::RESTRICTION_NO_STRUCT_LITERAL, None)?;
let cond = self.parse_expr_res(RESTRICTION_NO_STRUCT_LITERAL, None)?;
let thn = self.parse_block()?;
let mut els: Option<P<Expr>> = None;
let mut hi = thn.span;
@ -2992,7 +2992,7 @@ pub fn parse_if_let_expr(&mut self, attrs: ThinVec<Attribute>)
self.expect_keyword(keywords::Let)?;
let pat = self.parse_pat()?;
self.expect(&token::Eq)?;
let expr = self.parse_expr_res(Restrictions::RESTRICTION_NO_STRUCT_LITERAL, None)?;
let expr = self.parse_expr_res(RESTRICTION_NO_STRUCT_LITERAL, None)?;
let thn = self.parse_block()?;
let (hi, els) = if self.eat_keyword(keywords::Else) {
let expr = self.parse_else_expr()?;
@ -3046,7 +3046,7 @@ pub fn parse_for_expr(&mut self, opt_ident: Option<ast::SpannedIdent>,
let pat = self.parse_pat()?;
self.expect_keyword(keywords::In)?;
let expr = self.parse_expr_res(Restrictions::RESTRICTION_NO_STRUCT_LITERAL, None)?;
let expr = self.parse_expr_res(RESTRICTION_NO_STRUCT_LITERAL, None)?;
let (iattrs, loop_block) = self.parse_inner_attrs_and_block()?;
attrs.extend(iattrs);
@ -3061,7 +3061,7 @@ pub fn parse_while_expr(&mut self, opt_ident: Option<ast::SpannedIdent>,
if self.token.is_keyword(keywords::Let) {
return self.parse_while_let_expr(opt_ident, span_lo, attrs);
}
let cond = self.parse_expr_res(Restrictions::RESTRICTION_NO_STRUCT_LITERAL, None)?;
let cond = self.parse_expr_res(RESTRICTION_NO_STRUCT_LITERAL, None)?;
let (iattrs, body) = self.parse_inner_attrs_and_block()?;
attrs.extend(iattrs);
let span = span_lo.to(body.span);
@ -3075,7 +3075,7 @@ pub fn parse_while_let_expr(&mut self, opt_ident: Option<ast::SpannedIdent>,
self.expect_keyword(keywords::Let)?;
let pat = self.parse_pat()?;
self.expect(&token::Eq)?;
let expr = self.parse_expr_res(Restrictions::RESTRICTION_NO_STRUCT_LITERAL, None)?;
let expr = self.parse_expr_res(RESTRICTION_NO_STRUCT_LITERAL, None)?;
let (iattrs, body) = self.parse_inner_attrs_and_block()?;
attrs.extend(iattrs);
let span = span_lo.to(body.span);
@ -3105,7 +3105,7 @@ pub fn parse_catch_expr(&mut self, span_lo: Span, mut attrs: ThinVec<Attribute>)
fn parse_match_expr(&mut self, mut attrs: ThinVec<Attribute>) -> PResult<'a, P<Expr>> {
let match_span = self.prev_span;
let lo = self.prev_span;
let discriminant = self.parse_expr_res(Restrictions::RESTRICTION_NO_STRUCT_LITERAL,
let discriminant = self.parse_expr_res(RESTRICTION_NO_STRUCT_LITERAL,
None)?;
if let Err(mut e) = self.expect(&token::OpenDelim(token::Brace)) {
if self.token == token::Token::Semi {
@ -3146,7 +3146,7 @@ pub fn parse_arm(&mut self) -> PResult<'a, Arm> {
guard = Some(self.parse_expr()?);
}
self.expect(&token::FatArrow)?;
let expr = self.parse_expr_res(Restrictions::RESTRICTION_STMT_EXPR, None)?;
let expr = self.parse_expr_res(RESTRICTION_STMT_EXPR, None)?;
let require_comma =
!classify::expr_is_simple_block(&expr)
@ -3727,7 +3727,7 @@ fn is_catch_expr(&mut self) -> bool {
self.look_ahead(2, |t| *t == token::OpenDelim(token::Brace)) &&
// prevent `while catch {} {}`, `if catch {} {} else {}`, etc.
!self.restrictions.contains(Restrictions::RESTRICTION_NO_STRUCT_LITERAL)
!self.restrictions.contains(RESTRICTION_NO_STRUCT_LITERAL)
}
fn is_union_item(&self) -> bool {
@ -3799,7 +3799,7 @@ fn parse_stmt_without_recovery(&mut self,
self.mk_expr(lo.to(hi), ExprKind::Path(None, pth), ThinVec::new())
};
let expr = self.with_res(Restrictions::RESTRICTION_STMT_EXPR, |this| {
let expr = self.with_res(RESTRICTION_STMT_EXPR, |this| {
let expr = this.parse_dot_or_call_expr_with(expr, lo, attrs.into())?;
this.parse_assoc_expr_with(0, LhsExpr::AlreadyParsed(expr))
})?;
@ -3939,7 +3939,7 @@ fn parse_stmt_without_recovery(&mut self,
// Remainder are line-expr stmts.
let e = self.parse_expr_res(
Restrictions::RESTRICTION_STMT_EXPR, Some(attrs.into()))?;
RESTRICTION_STMT_EXPR, Some(attrs.into()))?;
Stmt {
id: ast::DUMMY_NODE_ID,
span: lo.to(e.span),
@ -3952,7 +3952,7 @@ fn parse_stmt_without_recovery(&mut self,
/// Is this expression a successfully-parsed statement?
fn expr_is_complete(&mut self, e: &Expr) -> bool {
self.restrictions.contains(Restrictions::RESTRICTION_STMT_EXPR) &&
self.restrictions.contains(RESTRICTION_STMT_EXPR) &&
!classify::expr_requires_semi_to_be_stmt(e)
}

View File

@ -677,7 +677,7 @@ fn print_string(&mut self, st: &str,
style: ast::StrStyle) -> io::Result<()> {
let st = match style {
ast::StrStyle::Cooked => {
(format!("\"{}\"", st.escape_default()))
(format!("\"{}\"", parse::escape_default(st)))
}
ast::StrStyle::Raw(n) => {
(format!("r{delim}\"{string}\"{delim}",