[cfe-commits] [PATCH] Correct first-line indentation in preprocessor output

Eli Friedman eli.friedman at gmail.com
Wed Jan 9 14:40:18 PST 2013


On Wed, Jan 9, 2013 at 2:20 PM, Hal Finkel <hfinkel at anl.gov> 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




More information about the cfe-commits mailing list