rsmith requested changes to this revision. rsmith added a comment. This revision now requires changes to proceed.
The proposal has changed since the pre-meeting mailing, and now covers `switch` as well as `if`. You also need to handle the //expression-statement// form of //init-statement//. As it happens, I've also been working on this proposal, and the bit that you're getting wrong here (the parsing side) is the part that I've finished. I've committed that as r274169; if you rebase your Sema changes on top of that (and add support for `switch`), we can get this change committed to finish off the implementation. We'll also need some tests before this can be committed. Thank you! ================ Comment at: lib/Parse/ParseStmt.cpp:1062-1075 @@ -1060,1 +1061,16 @@ + if (CK == Sema::ConditionKind::IfWithInit && + isForInitDeclarationWithSemi()) { // if (int X = 4; + // Parse declaration, which eats the ';'. + ParsedAttributesWithRange attrs(AttrFactory); + MaybeParseCXX11Attributes(attrs); + + SourceLocation DeclStart = Tok.getLocation(), DeclEnd; + DeclGroupPtrTy DG = ParseSimpleDeclaration( + Declarator::ForContext, DeclEnd, attrs, false, nullptr); + StmtResult InitStmt = Actions.ActOnDeclStmt(DG, DeclStart, Tok.getLocation()); + if (Init) *Init = InitStmt.get(); + + ConsumeToken(); // Consume semi + } + ---------------- We should try to only walk over the tokens once to identify whether this is a //condition// declaration, a //simple-declaration// of an //init-statement//, or an //expression//. ================ Comment at: lib/Parse/ParseTentative.cpp:77-79 @@ +76,5 @@ + TentativeParsingAction PA(*this); + TPResult TPR = TryParseSimpleDeclaration(false); + if (Tok.isNot(tok::semi)) + TPR = TPResult::False; + PA.Revert(); ---------------- This is not correct; `TryParseSimpleDeclaration` usually stops long before it reaches the end of the //simple-declaration//, so this will give false negatives in lots of cases. http://reviews.llvm.org/D21834 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits