diff options
| -rw-r--r-- | clang/lib/CodeGen/CGDebugInfo.cpp | 7 | ||||
| -rw-r--r-- | clang/test/CodeGenObjC/debuginfo-properties.m | 35 |
2 files changed, 42 insertions, 0 deletions
diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp index 14c92e6669b..a0187186ff8 100644 --- a/clang/lib/CodeGen/CGDebugInfo.cpp +++ b/clang/lib/CodeGen/CGDebugInfo.cpp @@ -161,6 +161,13 @@ StringRef CGDebugInfo::getObjCMethodName(const ObjCMethodDecl *OMD) { dyn_cast<const ObjCCategoryImplDecl>(DC)){ OS << ((const NamedDecl *)OCD)->getIdentifier()->getNameStart() << '(' << OCD->getIdentifier()->getNameStart() << ')'; + } else if (isa<const ObjCProtocolDecl>(DC)) { + // We can extract the type of the class from the self pointer. + if (ImplicitParamDecl* SelfDecl = OMD->getSelfDecl()) { + QualType ClassTy = + cast<ObjCObjectPointerType>(SelfDecl->getType())->getPointeeType(); + ClassTy.print(OS, PrintingPolicy(LangOptions())); + } } OS << ' ' << OMD->getSelector().getAsString() << ']'; diff --git a/clang/test/CodeGenObjC/debuginfo-properties.m b/clang/test/CodeGenObjC/debuginfo-properties.m new file mode 100644 index 00000000000..9a357145830 --- /dev/null +++ b/clang/test/CodeGenObjC/debuginfo-properties.m @@ -0,0 +1,35 @@ +// RUN: %clang_cc1 -g -emit-llvm -triple x86_64-apple-darwin -o - %s | FileCheck %s +// Check that we emit the correct method names for properties from a protocol. +// rdar://problem/13798000 +@protocol NSObject +- (id)init; +@end +@interface NSObject <NSObject> {} +@end + +@class Selection; + +@protocol HasASelection <NSObject> +@property (nonatomic, retain) Selection* selection; +// CHECK: [ DW_TAG_subprogram ] [line [[@LINE-1]]] [local] [def] [-[MyClass selection]] +// CHECK: [ DW_TAG_subprogram ] [line [[@LINE-2]]] [local] [def] [-[MyClass setSelection:]] +// CHECK: [ DW_TAG_subprogram ] [line [[@LINE-3]]] [local] [def] [-[OtherClass selection]] +// CHECK: [ DW_TAG_subprogram ] [line [[@LINE-4]]] [local] [def] [-[OtherClass setSelection:]] +@end + +@interface MyClass : NSObject <HasASelection> { + Selection *_selection; +} +@end + +@implementation MyClass +@synthesize selection = _selection; +@end + +@interface OtherClass : NSObject <HasASelection> { + Selection *_selection; +} +@end +@implementation OtherClass +@synthesize selection = _selection; +@end |

