<div dir="ltr"><div>This is my first patch. It's targeted at the parser/diagnostics.</div><div><br></div><div>The goal of the patch is to anticipate missing commas in initializer lists and report them appropriately as errors, instead of the current "expected '}' to match '}'" errors.</div><div><br></div><div>In summary, It detects missing commas only when successfully parsing the next element in the list.</div><div><br></div><div>An example input/output pair are also attached for your convenience.</div><div><br></div><div>Please inform me of any requested changes.</div><div><br></div><div><div>Index: include/clang/Basic/DiagnosticParseKinds.td</div><div>===================================================================</div><div>--- include/clang/Basic/DiagnosticParseKinds.td<span class="gmail-Apple-tab-span" style="white-space:pre">        </span>(revision 301985)</div><div>+++ include/clang/Basic/DiagnosticParseKinds.td<span class="gmail-Apple-tab-span" style="white-space:pre">       </span>(working copy)</div><div>@@ -164,6 +164,7 @@</div><div> def err_at_defs_cxx : Error<"@defs is not supported in Objective-C++">;</div><div> def err_at_in_class : Error<"unexpected '@' in member specification">;</div><div> def err_unexpected_semi : Error<"unexpected ';' before %0">;</div><div>+def err_expected_comma : Error<"expected ',' before initializer">;</div><div> </div><div> def err_expected_fn_body : Error<</div><div>   "expected function body after function declarator">;</div><div>Index: include/clang/Parse/RAIIObjectsForParser.h</div><div>===================================================================</div><div>--- include/clang/Parse/RAIIObjectsForParser.h<span class="gmail-Apple-tab-span" style="white-space:pre">      </span>(revision 301985)</div><div>+++ include/clang/Parse/RAIIObjectsForParser.h<span class="gmail-Apple-tab-span" style="white-space:pre">        </span>(working copy)</div><div>@@ -440,6 +440,13 @@</div><div>       </div><div>       return diagnoseMissingClose();</div><div>     }</div><div>+</div><div>+    bool willClose(){</div><div>+      if (<a href="http://P.Tok.is">P.Tok.is</a>(Close))</div><div>+        return false;</div><div>+      return true;</div><div>+    }</div><div>+</div><div>     void skipToEnd();</div><div>   };</div><div> </div><div>Index: lib/Parse/ParseInit.cpp</div><div>===================================================================</div><div>--- lib/Parse/ParseInit.cpp<span class="gmail-Apple-tab-span" style="white-space:pre">      </span>(revision 301985)</div><div>+++ lib/Parse/ParseInit.cpp<span class="gmail-Apple-tab-span" style="white-space:pre">   </span>(working copy)</div><div>@@ -409,6 +409,8 @@</div><div>       Actions, EnterExpressionEvaluationContext::InitList);</div><div> </div><div>   bool InitExprsOk = true;</div><div>+  bool maybeMissingComma = false;</div><div>+  Token startOfNextIni;</div><div> </div><div>   while (1) {</div><div>     // Handle Microsoft __if_exists/if_not_exists if necessary.</div><div>@@ -427,6 +429,8 @@</div><div>     // If we know that this cannot be a designation, just parse the nested</div><div>     // initializer directly.</div><div>     ExprResult SubElt;</div><div>+    startOfNextIni = Tok;</div><div>+</div><div>     if (MayBeDesignationStart())</div><div>       SubElt = ParseInitializerWithPotentialDesignator();</div><div>     else</div><div>@@ -457,9 +461,25 @@</div><div>       }</div><div>     }</div><div> </div><div>-    // If we don't have a comma continued list, we're done.</div><div>-    if (Tok.isNot(tok::comma)) break;</div><div>+    if(maybeMissingComma){</div><div>+      //Here we would have checked if InitExprsOk is true,</div><div>+      //but it's implied to be ok because of the previous break</div><div>+      //Now we know the compilee  very likely forgot the comma</div><div>+      Diag(startOfNextIni.getLocation(), diag::err_expected_comma)</div><div>+           << FixItHint::CreateInsertion(startOfNextIni.getLocation().getLocWithOffset(-1), ",");</div><div>+      maybeMissingComma = false;</div><div>+    }</div><div> </div><div>+    // If we don't have a comma continued list, we're done (maybe).</div><div>+    if (Tok.isNot(tok::comma)){</div><div>+      if(!T.willClose()){</div><div>+        //This is a ok list, no missing commas.</div><div>+        break;</div><div>+      }</div><div>+      maybeMissingComma = true;</div><div>+      continue;</div><div>+    }</div><div>+</div><div>     // TODO: save comma locations if some client cares.</div><div>     ConsumeToken();</div><div> </div></div><div><br></div></div>