diff options
| author | Alex Crichton <alex@alexcrichton.com> | 2017-08-25 07:15:12 -0700 |
|---|---|---|
| committer | Alex Crichton <alex@alexcrichton.com> | 2017-08-25 07:15:12 -0700 |
| commit | c872f4727697327550d43d106f5dddd735c41e5f (patch) | |
| tree | e9b63fc7d07b2608cac0c00c1e06ef2e33017b0a /src/libsyntax/parse | |
| parent | b44e51cd62a982c8ab97b1b794ada57bdda44e85 (diff) | |
| parent | ba65645c78a87f1fa5c6d7132130bb3175fbe68b (diff) | |
| download | rust-c872f4727697327550d43d106f5dddd735c41e5f.tar.gz rust-c872f4727697327550d43d106f5dddd735c41e5f.zip | |
Merge remote-tracking branch 'origin/master' into gen
Diffstat (limited to 'src/libsyntax/parse')
| -rw-r--r-- | src/libsyntax/parse/parser.rs | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index ef811abc159..d2bf943ec17 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -1776,7 +1776,13 @@ impl<'a> Parser<'a> { pub fn parse_path_common(&mut self, style: PathStyle, enable_warning: bool) -> PResult<'a, ast::Path> { - maybe_whole!(self, NtPath, |x| x); + maybe_whole!(self, NtPath, |path| { + if style == PathStyle::Mod && + path.segments.iter().any(|segment| segment.parameters.is_some()) { + self.diagnostic().span_err(path.span, "unexpected generic arguments in path"); + } + path + }); let lo = self.meta_var_span.unwrap_or(self.span); let mut segments = Vec::new(); @@ -2973,6 +2979,18 @@ impl<'a> Parser<'a> { } let lo = self.prev_span; let cond = self.parse_expr_res(RESTRICTION_NO_STRUCT_LITERAL, None)?; + + // Verify that the parsed `if` condition makes sense as a condition. If it is a block, then + // verify that the last statement is either an implicit return (no `;`) or an explicit + // return. This won't catch blocks with an explicit `return`, but that would be caught by + // the dead code lint. + if self.eat_keyword(keywords::Else) || !cond.returns() { + let sp = lo.next_point(); + let mut err = self.diagnostic() + .struct_span_err(sp, "missing condition for `if` statemement"); + err.span_label(sp, "expected if condition here"); + return Err(err) + } let thn = self.parse_block()?; let mut els: Option<P<Expr>> = None; let mut hi = thn.span; |
