<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Feb 25, 2015 at 6:39 PM, David Blaikie <span dir="ltr"><<a href="mailto:dblaikie@gmail.com" target="_blank">dblaikie@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote"><span class="">On Wed, Feb 25, 2015 at 6:40 AM, Alexander Kornienko <span dir="ltr"><<a href="mailto:alexfh@google.com" target="_blank">alexfh@google.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">Author: alexfh<br>
Date: Wed Feb 25 08:40:56 2015<br>
New Revision: 230495<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=230495&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=230495&view=rev</a><br>
Log:<br>
Add support for inserting ArrayRef<FixItHint> into DiagnosticBuilder.<br>
<br>
This is going to be needed in clang-tidy as more checks add complex fixits.<br>
<br>
Modified:<br>
    cfe/trunk/include/clang/Basic/Diagnostic.h<br>
    cfe/trunk/lib/Sema/SemaChecking.cpp<br>
<br>
Modified: cfe/trunk/include/clang/Basic/Diagnostic.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/Diagnostic.h?rev=230495&r1=230494&r2=230495&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/Diagnostic.h?rev=230495&r1=230494&r2=230495&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/include/clang/Basic/Diagnostic.h (original)<br>
+++ cfe/trunk/include/clang/Basic/Diagnostic.h Wed Feb 25 08:40:56 2015<br>
@@ -991,7 +991,8 @@ public:<br>
<br>
   void AddFixItHint(const FixItHint &Hint) const {<br>
     assert(isActive() && "Clients must not add to cleared diagnostic!");<br>
-    DiagObj->DiagFixItHints.push_back(Hint);<br>
+    if (!Hint.isNull())<br></blockquote></span><div><br>Why is this null check required/used? (it'd be nicer to hold the invariant that the FixItHints can't be null, if possible/reasonable)<br></div></div></div></div></blockquote><div><br></div><div>The check for isNull() in the operator<< was added in <a href="http://reviews.llvm.org/rL153122">r153122</a> "<span style="font-size:13px;color:rgb(0,0,0);font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;line-height:18.8500003814697px">Don't include FixIts with a null replacement range. Fixes rdar://problem/11040133".</span></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div><br>(also, if we do need FixItHints to have a null state, perhaps they should be boolean testable with an explicit operator bool)<br></div></div></div></div></blockquote><div><br></div><div>The FixItHint::isNull() method is used just a handful of times in the code. I don't know whether it makes sense to introduce a conversion to boolean to make these usages simpler.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div> </div><div><div class="h5"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
+      DiagObj->DiagFixItHints.push_back(Hint);<br>
   }<br>
<br>
   void addFlagValue(StringRef V) const { DiagObj->FlagValue = V; }<br>
@@ -1095,7 +1096,13 @@ inline const DiagnosticBuilder &operator<br>
<br>
 inline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB,<br>
                                            const FixItHint &Hint) {<br>
-  if (!Hint.isNull())<br>
+  DB.AddFixItHint(Hint);<br>
+  return DB;<br>
+}<br>
+<br>
+inline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB,<br>
+                                           ArrayRef<FixItHint> Hints) {<br>
+  for (const FixItHint &Hint : Hints)<br>
     DB.AddFixItHint(Hint);<br>
   return DB;<br>
 }<br>
<br>
Modified: cfe/trunk/lib/Sema/SemaChecking.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaChecking.cpp?rev=230495&r1=230494&r2=230495&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaChecking.cpp?rev=230495&r1=230494&r2=230495&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Sema/SemaChecking.cpp (original)<br>
+++ cfe/trunk/lib/Sema/SemaChecking.cpp Wed Feb 25 08:40:56 2015<br>
@@ -3152,10 +3152,7 @@ void CheckFormatHandler::EmitFormatDiagn<br>
   if (InFunctionCall) {<br>
     const Sema::SemaDiagnosticBuilder &D = S.Diag(Loc, PDiag);<br>
     D << StringRange;<br>
-    for (ArrayRef<FixItHint>::iterator I = FixIt.begin(), E = FixIt.end();<br>
-         I != E; ++I) {<br>
-      D << *I;<br>
-    }<br>
+    D << FixIt;<br>
   } else {<br>
     S.Diag(IsStringLocation ? ArgumentExpr->getExprLoc() : Loc, PDiag)<br>
       << ArgumentExpr->getSourceRange();<br>
@@ -3165,10 +3162,7 @@ void CheckFormatHandler::EmitFormatDiagn<br>
              diag::note_format_string_defined);<br>
<br>
     Note << StringRange;<br>
-    for (ArrayRef<FixItHint>::iterator I = FixIt.begin(), E = FixIt.end();<br>
-         I != E; ++I) {<br>
-      Note << *I;<br>
-    }<br>
+    Note << FixIt;<br>
   }<br>
 }<br>
<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu" target="_blank">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote></div></div></div></div></div></blockquote></div><br>
</div></div>