[PATCH] D40445: [C++17] Allow an empty expression in an if init statement

Richard Smith - zygoloid via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Thu Jan 4 15:32:55 PST 2018

rsmith added inline comments.

Comment at: lib/Parse/ParseExprCXX.cpp:1760
+    if (InitStmt && TryConsumeToken(tok::semi)) {
+      WarnOnInit();
+      return ParseCXXCondition(nullptr, Loc, CK);
Please create a NullStmt here (`Actions.ActOnNullStmt`), rather than producing an AST that's indistinguishable from one where the init statement was omitted.

Comment at: lib/Parse/ParseExprCXX.cpp:1780-1783
     Diag(Tok.getLocation(), getLangOpts().CPlusPlus17
                                 ? diag::warn_cxx14_compat_init_statement
                                 : diag::ext_init_statement)
         << (CK == Sema::ConditionKind::Switch);
Use `WarnOnInit()` here.

Comment at: test/CXX/stmt.stmt/stmt.select/p3.cpp:70-71
+// TODO: This is needed because clang can't seem to diagnose invalid syntax after the
+// last loop above. It would be nice to remove this.
+void whileInitStatement2() {
I think error recovery thought that a `)` was omitted before the `;`, so it imagined we had:

  while (Var + Var); Var--) {}

Then it thought that a `;` was omitted before the `)`, so it imagined we had:

  while (Var + Var); Var--; ) {}

Then it saw a statement beginning with a `)`, and decided to skip to the next statement, which would skip past the `)`, the `{`, the `}`, and whatever statement you put next in the function.

Maybe we should parse as if an //init-statement// were permitted on a `while` loop (and produce an error after the fact if there's one present). But that should be done in a separate patch if you're interested in working on it.


More information about the cfe-commits mailing list