make the preprocessor listen to linemarker directives in -E mode,

PR6101.  This is based on a patch and testcase by Jordy Rose!

llvm-svn: 101097
This commit is contained in:
Chris Lattner 2010-04-13 00:01:41 +00:00
parent d75c8a0813
commit 5dbefc6697
2 changed files with 85 additions and 10 deletions

View File

@ -118,7 +118,11 @@ public:
bool HandleFirstTokOnLine(Token &Tok);
bool MoveToLine(SourceLocation Loc);
bool MoveToLine(SourceLocation Loc) {
return MoveToLine(PP.getSourceManager().getPresumedLoc(Loc).getLine());
}
bool MoveToLine(unsigned LineNo);
bool AvoidConcat(const Token &PrevTok, const Token &Tok) {
return ConcatInfo.AvoidConcat(PrevTok, Tok);
}
@ -166,9 +170,7 @@ void PrintPPOutputPPCallbacks::WriteLineInfo(unsigned LineNo,
/// object. We can do this by emitting some number of \n's, or be emitting a
/// #line directive. This returns false if already at the specified line, true
/// if some newlines were emitted.
bool PrintPPOutputPPCallbacks::MoveToLine(SourceLocation Loc) {
unsigned LineNo = PP.getSourceManager().getInstantiationLineNumber(Loc);
bool PrintPPOutputPPCallbacks::MoveToLine(unsigned LineNo) {
if (DisableLineMarkers) {
if (LineNo == CurLine) return false;
@ -212,26 +214,28 @@ void PrintPPOutputPPCallbacks::FileChanged(SourceLocation Loc,
// Unless we are exiting a #include, make sure to skip ahead to the line the
// #include directive was at.
SourceManager &SourceMgr = PP.getSourceManager();
PresumedLoc UserLoc = SourceMgr.getPresumedLoc(Loc);
unsigned NewLine = UserLoc.getLine()+1;
if (Reason == PPCallbacks::EnterFile) {
SourceLocation IncludeLoc = SourceMgr.getPresumedLoc(Loc).getIncludeLoc();
if (IncludeLoc.isValid())
MoveToLine(IncludeLoc);
} else if (Reason == PPCallbacks::SystemHeaderPragma) {
MoveToLine(Loc);
MoveToLine(NewLine);
// TODO GCC emits the # directive for this directive on the line AFTER the
// directive and emits a bunch of spaces that aren't needed. Emulate this
// strange behavior.
}
Loc = SourceMgr.getInstantiationLoc(Loc);
// FIXME: Should use presumed line #!
CurLine = SourceMgr.getInstantiationLineNumber(Loc);
CurLine = NewLine;
if (DisableLineMarkers) return;
CurFilename.clear();
CurFilename += SourceMgr.getPresumedLoc(Loc).getFilename();
CurFilename += UserLoc.getFilename();
Lexer::Stringify(CurFilename);
FileType = NewFileType;

View File

@ -0,0 +1,71 @@
// RUN: %clang_cc1 -E %s 2>&1 | FileCheck %s -strict-whitespace
// PR6101
int a;
// CHECK: # 2 "{{.*}}line-directive-output.c"
// CHECK: int a;
// CHECK-NEXT: # 50 "{{.*}}line-directive-output.c"
// CHECK-NEXT: int b;
#line 50
int b;
// CHECK: # 13 "{{.*}}line-directive-output.c"
// CHECK-NEXT: int c;
# 13
int c;
// CHECK-NEXT: # 1 "A.c"
#line 1 "A.c"
// CHECK-NEXT: # 2 "A.c"
#line 2
// CHECK-NEXT: # 1 "B.c"
#line 1 "B.c"
// CHECK-NEXT: # 1000 "A.c"
#line 1000 "A.c"
int y;
// CHECK: # 1010 "A.c"
int z;
extern int x;
# 3 "temp2.h" 1
extern int y;
# 7 "A.c" 2
extern int z;
// CHECK: # 25 "A.c"
// CHECK: # 50 "C.c" 1
# 50 "C.c" 1
// CHECK-NEXT: # 2000 "A.c" 2
# 2000 "A.c" 2
# 42 "A.c"
# 44 "A.c"
# 49 "A.c"