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 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) {
|
bool AvoidConcat(const Token &PrevTok, const Token &Tok) {
|
||||||
return ConcatInfo.AvoidConcat(PrevTok, 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
|
/// 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
|
/// #line directive. This returns false if already at the specified line, true
|
||||||
/// if some newlines were emitted.
|
/// if some newlines were emitted.
|
||||||
bool PrintPPOutputPPCallbacks::MoveToLine(SourceLocation Loc) {
|
bool PrintPPOutputPPCallbacks::MoveToLine(unsigned LineNo) {
|
||||||
unsigned LineNo = PP.getSourceManager().getInstantiationLineNumber(Loc);
|
|
||||||
|
|
||||||
if (DisableLineMarkers) {
|
if (DisableLineMarkers) {
|
||||||
if (LineNo == CurLine) return false;
|
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
|
// Unless we are exiting a #include, make sure to skip ahead to the line the
|
||||||
// #include directive was at.
|
// #include directive was at.
|
||||||
SourceManager &SourceMgr = PP.getSourceManager();
|
SourceManager &SourceMgr = PP.getSourceManager();
|
||||||
|
|
||||||
|
PresumedLoc UserLoc = SourceMgr.getPresumedLoc(Loc);
|
||||||
|
unsigned NewLine = UserLoc.getLine()+1;
|
||||||
|
|
||||||
if (Reason == PPCallbacks::EnterFile) {
|
if (Reason == PPCallbacks::EnterFile) {
|
||||||
SourceLocation IncludeLoc = SourceMgr.getPresumedLoc(Loc).getIncludeLoc();
|
SourceLocation IncludeLoc = SourceMgr.getPresumedLoc(Loc).getIncludeLoc();
|
||||||
if (IncludeLoc.isValid())
|
if (IncludeLoc.isValid())
|
||||||
MoveToLine(IncludeLoc);
|
MoveToLine(IncludeLoc);
|
||||||
} else if (Reason == PPCallbacks::SystemHeaderPragma) {
|
} else if (Reason == PPCallbacks::SystemHeaderPragma) {
|
||||||
MoveToLine(Loc);
|
MoveToLine(NewLine);
|
||||||
|
|
||||||
// TODO GCC emits the # directive for this directive on the line AFTER the
|
// 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
|
// directive and emits a bunch of spaces that aren't needed. Emulate this
|
||||||
// strange behavior.
|
// strange behavior.
|
||||||
}
|
}
|
||||||
|
|
||||||
Loc = SourceMgr.getInstantiationLoc(Loc);
|
CurLine = NewLine;
|
||||||
// FIXME: Should use presumed line #!
|
|
||||||
CurLine = SourceMgr.getInstantiationLineNumber(Loc);
|
|
||||||
|
|
||||||
if (DisableLineMarkers) return;
|
if (DisableLineMarkers) return;
|
||||||
|
|
||||||
CurFilename.clear();
|
CurFilename.clear();
|
||||||
CurFilename += SourceMgr.getPresumedLoc(Loc).getFilename();
|
CurFilename += UserLoc.getFilename();
|
||||||
Lexer::Stringify(CurFilename);
|
Lexer::Stringify(CurFilename);
|
||||||
FileType = NewFileType;
|
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