forked from OSchip/llvm-project
objective-C modern translator. Generate #line
info in the translated code under -g only. // rdar://13138170 llvm-svn: 174684
This commit is contained in:
parent
f5f9452808
commit
e4c7e855f1
|
@ -35,7 +35,8 @@ ASTConsumer *CreateModernObjCRewriter(const std::string &InFile,
|
|||
raw_ostream *OS,
|
||||
DiagnosticsEngine &Diags,
|
||||
const LangOptions &LOpts,
|
||||
bool SilenceRewriteMacroWarning);
|
||||
bool SilenceRewriteMacroWarning,
|
||||
bool LineInfo);
|
||||
|
||||
/// CreateHTMLPrinter - Create an AST consumer which rewrites source code to
|
||||
/// HTML with syntax highlighting suitable for viewing in a web-browser.
|
||||
|
|
|
@ -158,7 +158,9 @@ ASTConsumer *RewriteObjCAction::CreateASTConsumer(CompilerInstance &CI,
|
|||
if (CI.getLangOpts().ObjCRuntime.isNonFragile())
|
||||
return CreateModernObjCRewriter(InFile, OS,
|
||||
CI.getDiagnostics(), CI.getLangOpts(),
|
||||
CI.getDiagnosticOpts().NoRewriteMacros);
|
||||
CI.getDiagnosticOpts().NoRewriteMacros,
|
||||
(CI.getCodeGenOpts().getDebugInfo() !=
|
||||
CodeGenOptions::NoDebugInfo));
|
||||
return CreateObjCRewriter(InFile, OS,
|
||||
CI.getDiagnostics(), CI.getLangOpts(),
|
||||
CI.getDiagnosticOpts().NoRewriteMacros);
|
||||
|
|
|
@ -163,6 +163,7 @@ namespace {
|
|||
// Needed for header files being rewritten
|
||||
bool IsHeader;
|
||||
bool SilenceRewriteMacroWarning;
|
||||
bool GenerateLineInfo;
|
||||
bool objc_impl_method;
|
||||
|
||||
bool DisableReplaceStmt;
|
||||
|
@ -224,7 +225,7 @@ namespace {
|
|||
void HandleDeclInMainFile(Decl *D);
|
||||
RewriteModernObjC(std::string inFile, raw_ostream *OS,
|
||||
DiagnosticsEngine &D, const LangOptions &LOpts,
|
||||
bool silenceMacroWarn);
|
||||
bool silenceMacroWarn, bool LineInfo);
|
||||
|
||||
~RewriteModernObjC() {}
|
||||
|
||||
|
@ -633,9 +634,10 @@ static bool IsHeaderFile(const std::string &Filename) {
|
|||
|
||||
RewriteModernObjC::RewriteModernObjC(std::string inFile, raw_ostream* OS,
|
||||
DiagnosticsEngine &D, const LangOptions &LOpts,
|
||||
bool silenceMacroWarn)
|
||||
bool silenceMacroWarn,
|
||||
bool LineInfo)
|
||||
: Diags(D), LangOpts(LOpts), InFileName(inFile), OutFile(OS),
|
||||
SilenceRewriteMacroWarning(silenceMacroWarn) {
|
||||
SilenceRewriteMacroWarning(silenceMacroWarn), GenerateLineInfo(LineInfo) {
|
||||
IsHeader = IsHeaderFile(inFile);
|
||||
RewriteFailedDiag = Diags.getCustomDiagID(DiagnosticsEngine::Warning,
|
||||
"rewriting sub-expression within a macro (may not be correct)");
|
||||
|
@ -654,8 +656,10 @@ ASTConsumer *clang::CreateModernObjCRewriter(const std::string& InFile,
|
|||
raw_ostream* OS,
|
||||
DiagnosticsEngine &Diags,
|
||||
const LangOptions &LOpts,
|
||||
bool SilenceRewriteMacroWarning) {
|
||||
return new RewriteModernObjC(InFile, OS, Diags, LOpts, SilenceRewriteMacroWarning);
|
||||
bool SilenceRewriteMacroWarning,
|
||||
bool LineInfo) {
|
||||
return new RewriteModernObjC(InFile, OS, Diags, LOpts,
|
||||
SilenceRewriteMacroWarning, LineInfo);
|
||||
}
|
||||
|
||||
void RewriteModernObjC::InitializeCommon(ASTContext &context) {
|
||||
|
@ -1654,7 +1658,7 @@ Stmt *RewriteModernObjC::RewriteBreakStmt(BreakStmt *S) {
|
|||
void RewriteModernObjC::ConvertSourceLocationToLineDirective(
|
||||
SourceLocation Loc,
|
||||
std::string &LineString) {
|
||||
if (Loc.isFileID()) {
|
||||
if (Loc.isFileID() && GenerateLineInfo) {
|
||||
LineString += "\n#line ";
|
||||
PresumedLoc PLoc = SM->getPresumedLoc(Loc);
|
||||
LineString += utostr(PLoc.getLine());
|
||||
|
@ -3147,7 +3151,7 @@ void RewriteModernObjC::RewriteLineDirective(const Decl *D) {
|
|||
|
||||
SourceLocation Location = D->getLocation();
|
||||
|
||||
if (Location.isFileID()) {
|
||||
if (Location.isFileID() && GenerateLineInfo) {
|
||||
std::string LineString("\n#line ");
|
||||
PresumedLoc PLoc = SM->getPresumedLoc(Location);
|
||||
LineString += utostr(PLoc.getLine());
|
||||
|
|
|
@ -0,0 +1,40 @@
|
|||
// RUN: %clang_cc1 -E %s -o %t.mm
|
||||
// RUN: %clang_cc1 -fms-extensions -rewrite-objc -g %t.mm -o %t-rw.cpp
|
||||
// RUN: FileCheck -check-prefix LINE --input-file=%t-rw.cpp %s
|
||||
// RUN: %clang_cc1 -fms-extensions -rewrite-objc %t.mm -o %t-rwnog.cpp
|
||||
// RUN: FileCheck -check-prefix NOLINE --input-file=%t-rwnog.cpp %s
|
||||
// rdar://13138170
|
||||
|
||||
__attribute__((objc_root_class)) @interface MyObject {
|
||||
@public
|
||||
id _myMaster;
|
||||
id _isTickledPink;
|
||||
}
|
||||
@property(retain) id myMaster;
|
||||
@property(assign) id isTickledPink;
|
||||
@end
|
||||
|
||||
@implementation MyObject
|
||||
|
||||
@synthesize myMaster = _myMaster;
|
||||
@synthesize isTickledPink = _isTickledPink;
|
||||
|
||||
- (void) doSomething {
|
||||
_myMaster = _isTickledPink;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
MyObject * foo ()
|
||||
{
|
||||
MyObject* p;
|
||||
p.isTickledPink = p.myMaster; // ok
|
||||
p->_isTickledPink = p->_myMaster;
|
||||
return p->_isTickledPink;
|
||||
}
|
||||
|
||||
// CHECK-LINE: #line 22
|
||||
// CHECK-LINE: #line 28
|
||||
// CHECK-NOLINE-NOT: #line 22
|
||||
// CHECK-NOLINE-NOT: #line 28
|
||||
|
Loading…
Reference in New Issue