about summary refs log tree commit diff
path: root/src/libsyntax/parse/parser.rs
diff options
context:
space:
mode:
authorEsteban Küber <esteban@kuber.com.ar>2017-08-17 16:51:52 -0700
committerEsteban Küber <esteban@kuber.com.ar>2017-08-17 20:25:46 -0700
commitf06323337dd0cf748e8a0ca49d91dac2eae6b4a9 (patch)
treed54890bcfaf44fe77098b6de042892eefba586b2 /src/libsyntax/parse/parser.rs
parent20a2716206ca879ad9848cbb4ac9fcc739dd3f77 (diff)
downloadrust-f06323337dd0cf748e8a0ca49d91dac2eae6b4a9.tar.gz
rust-f06323337dd0cf748e8a0ca49d91dac2eae6b4a9.zip
Verify that an `if` condition block returns a value
Diffstat (limited to 'src/libsyntax/parse/parser.rs')
-rw-r--r--src/libsyntax/parse/parser.rs7
1 files changed, 6 insertions, 1 deletions
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs
index 22999afb48e..85d2a485bfa 100644
--- a/src/libsyntax/parse/parser.rs
+++ b/src/libsyntax/parse/parser.rs
@@ -2968,7 +2968,12 @@ impl<'a> Parser<'a> {
         }
         let lo = self.prev_span;
         let cond = self.parse_expr_res(RESTRICTION_NO_STRUCT_LITERAL, None)?;
-        if self.eat_keyword(keywords::Else) {
+
+        // 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");