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

Reply via email to