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