forked from OSchip/llvm-project
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:
parent
d75c8a0813
commit
5dbefc6697
|
@ -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;
|
||||
|
||||
|
|
|
@ -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"
|
Loading…
Reference in New Issue