On Wed, Jan 9, 2013 at 2:20 PM, Hal Finkel <[email protected]> wrote:
> Currently, the -E output from clang does not produce the correct indentation 
> on the first line. This is because MoveToLine returns false, and when this 
> happens, the regular process for producing initial indentation is skipped. 
> This patch makes sure this does not happen on the first line -- it is not 
> clear to me whether there are other circumstances where the current logic 
> could be problematic.
>
> It looks like calling SourceManager::getPresumedLoc is a relatively expensive 
> operation, so however this is fixed, I assume that we want to minimize calls 
> to that function.
>
> Please review.

--- a/lib/Frontend/PrintPreprocessedOutput.cpp
+++ b/lib/Frontend/PrintPreprocessedOutput.cpp
@@ -139,10 +139,13 @@ public:
                                 diag::Mapping Map, StringRef Str);

   bool HandleFirstTokOnLine(Token &Tok);
-  bool MoveToLine(SourceLocation Loc) {
+  bool MoveToLine(SourceLocation Loc, bool *FirstLine = 0) {
     PresumedLoc PLoc = SM.getPresumedLoc(Loc);
-    if (PLoc.isInvalid())
+    if (PLoc.isInvalid()) {
+      if (FirstLine) *FirstLine = false;
       return false;
+    }
+    if (FirstLine) *FirstLine = PLoc.getLine() == 1;
     return MoveToLine(PLoc.getLine());
   }
   bool MoveToLine(unsigned LineNo);

There is precisely one user of the return value of MoveToLine: the one
you're modifying.  Why do we need an extra out parameter?

-Eli

_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to