Index: lib/Parse/ParseExprCXX.cpp =================================================================== --- lib/Parse/ParseExprCXX.cpp +++ lib/Parse/ParseExprCXX.cpp @@ -1745,6 +1745,11 @@ case ConditionOrInitStatement::Expression: { ProhibitAttributes(attrs); + // We can have an empty expression here. + // if (; true); + if (TryConsumeToken(tok::semi)) + return ParseCXXCondition(nullptr, Loc, CK); + // Parse the expression. ExprResult Expr = ParseExpression(); // expression if (Expr.isInvalid()) Index: test/CXX/stmt.stmt/stmt.select/p3.cpp =================================================================== --- test/CXX/stmt.stmt/stmt.select/p3.cpp +++ test/CXX/stmt.stmt/stmt.select/p3.cpp @@ -1,4 +1,5 @@ // RUN: %clang_cc1 -fsyntax-only -verify %s +// RUN: %clang_cc1 -fsyntax-only -std=c++1z -verify %s -DCXX17 int f(); @@ -10,10 +11,41 @@ } } - void h() { if (int x = f()) // expected-note 2{{previous definition}} int x; // expected-error{{redefinition of 'x'}} else int x; // expected-error{{redefinition of 'x'}} } + +#ifdef CXX17 +int ifInitStatement() { + if (int I = 0; ++I == 1) + return I; + + int Var = 0; + if (Var + Var; Var == 0) + return Var; + + if (; true) + return 1; +} + +int switchInitStatement() { + switch (int I = 1; I) { + case 1: + return I; + } + + int Var = 0; + switch (Var + Var; Var) { + case 0: + return Var; + } + + switch (; 0) { + case 0: + return 0; + } +} +#endif