Skip to content

Commit bfc4b41

Browse files
committed
Fix minor parser problems
1 parent 3812721 commit bfc4b41

File tree

3 files changed

+15
-12
lines changed

3 files changed

+15
-12
lines changed

src/librustdoc/clean/mod.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -1089,9 +1089,9 @@ fn external_generic_args(cx: &DocContext, trait_did: Option<DefId>, has_self: bo
10891089
match trait_did {
10901090
// Attempt to sugar an external path like Fn<(A, B,), C> to Fn(A, B) -> C
10911091
Some(did) if cx.tcx.lang_items().fn_trait_kind(did).is_some() => {
1092-
assert_eq!(types.len(), 1);
1093-
let inputs = match types[0].sty {
1094-
ty::Tuple(ref tys) => tys.iter().map(|t| t.clean(cx)).collect(),
1092+
assert!(first_ty_sty.is_some());
1093+
let inputs = match first_ty_sty {
1094+
Some(ty::Tuple(ref tys)) => tys.iter().map(|t| t.clean(cx)).collect(),
10951095
_ => return GenericArgs::AngleBracketed { args, bindings },
10961096
};
10971097
let output = None;

src/libsyntax/parse/parser.rs

+6-9
Original file line numberDiff line numberDiff line change
@@ -5067,6 +5067,7 @@ impl<'a> Parser<'a> {
50675067
crate fn parse_generic_params(&mut self) -> PResult<'a, Vec<ast::GenericParam>> {
50685068
let mut params = vec![];
50695069
let mut max_param = None;
5070+
// TODO(const_generics): move parameter order enforcement to AST.
50705071
fn enforce_param_order(parser: &Parser,
50715072
max_param: &mut Option<ParamKindOrd>,
50725073
param_ord: ParamKindOrd) {
@@ -5111,9 +5112,6 @@ impl<'a> Parser<'a> {
51115112
if let Some(max_param) = max_param {
51125113
self.span_err(attrs[0].span,
51135114
&format!("trailing attribute after {} parameters", max_param));
5114-
} else {
5115-
self.span_err(attrs[0].span,
5116-
"leading attribute before generic parameters");
51175115
}
51185116
}
51195117
break
@@ -5202,7 +5200,7 @@ impl<'a> Parser<'a> {
52025200
let lit = self.parse_lit()?;
52035201
self.mk_expr(lit.span, ExprKind::Lit(P(lit)), ThinVec::new())
52045202
} else {
5205-
unreachable!()
5203+
unreachable!() // TODO(const_generics): handle this case
52065204
};
52075205
debug!("const arg: expr={:?}", expr);
52085206
let value = AnonConst {
@@ -5253,7 +5251,7 @@ impl<'a> Parser<'a> {
52535251
// We are considering adding generics to the `where` keyword as an alternative higher-rank
52545252
// parameter syntax (as in `where<'a>` or `where<T>`. To avoid that being a breaking
52555253
// change we parse those generics now, but report an error.
5256-
if self.choose_generics_over_qpath(false) {
5254+
if self.choose_generics_over_qpath() {
52575255
let generics = self.parse_generics()?;
52585256
self.span_err(generics.span,
52595257
"generic parameters on `where` clauses are reserved for future use");
@@ -5827,7 +5825,7 @@ impl<'a> Parser<'a> {
58275825
}
58285826
}
58295827

5830-
fn choose_generics_over_qpath(&self, param: bool) -> bool {
5828+
fn choose_generics_over_qpath(&self) -> bool {
58315829
// There's an ambiguity between generic parameters and qualified paths in impls.
58325830
// If we see `<` it may start both, so we have to inspect some following tokens.
58335831
// The following combinations can only start generics,
@@ -5849,8 +5847,7 @@ impl<'a> Parser<'a> {
58495847
self.look_ahead(1, |t| t.is_lifetime() || t.is_ident()) &&
58505848
self.look_ahead(2, |t| t == &token::Gt || t == &token::Comma ||
58515849
t == &token::Colon || t == &token::Eq) ||
5852-
param && self.look_ahead(1, |t| t.is_keyword(keywords::Const) &&
5853-
self.look_ahead(2, |t| t.is_ident())))
5850+
self.look_ahead(1, |t| t.is_keyword(keywords::Const)))
58545851
}
58555852

58565853
fn parse_impl_body(&mut self) -> PResult<'a, (Vec<ImplItem>, Vec<Attribute>)> {
@@ -5883,7 +5880,7 @@ impl<'a> Parser<'a> {
58835880
fn parse_item_impl(&mut self, unsafety: Unsafety, defaultness: Defaultness)
58845881
-> PResult<'a, ItemInfo> {
58855882
// First, parse generic parameters if necessary.
5886-
let mut generics = if self.choose_generics_over_qpath(true) {
5883+
let mut generics = if self.choose_generics_over_qpath() {
58875884
self.parse_generics()?
58885885
} else {
58895886
ast::Generics::default()

src/libsyntax/parse/token.rs

+6
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,12 @@ impl Token {
284284
pub fn can_begin_const_arg(&self) -> bool {
285285
match self {
286286
OpenDelim(Brace) => true,
287+
Interpolated(ref nt) => match nt.0 {
288+
NtExpr(..) => true,
289+
NtBlock(..) => true,
290+
NtLiteral(..) => true,
291+
_ => false,
292+
}
287293
_ => self.can_begin_literal_or_bool(),
288294
}
289295
}

0 commit comments

Comments
 (0)