diff options
| author | Adrian Prantl <aprantl@apple.com> | 2013-05-10 21:08:31 +0000 |
|---|---|---|
| committer | Adrian Prantl <aprantl@apple.com> | 2013-05-10 21:08:31 +0000 |
| commit | 7bec903850806b942967ba3a5eaa37cb4629cf62 (patch) | |
| tree | 95289048bf74ab305e74c0fd65d7e569a9fa129f | |
| parent | 438cec566b97e8815a26ebd8bbe56c64a8bca687 (diff) | |
| download | bcm5719-llvm-7bec903850806b942967ba3a5eaa37cb4629cf62.tar.gz bcm5719-llvm-7bec903850806b942967ba3a5eaa37cb4629cf62.zip | |
ObjC debug info: Substitute the class type for methods that return
a related type (e.g., if they use the instancetype keyword).
rdar://problem/13359718
llvm-svn: 181629
| -rw-r--r-- | clang/lib/CodeGen/CGDebugInfo.cpp | 5 | ||||
| -rw-r--r-- | clang/test/CodeGenObjC/debug-info-instancetype.m | 27 |
2 files changed, 31 insertions, 1 deletions
diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp index 6678aa7198b..d9ab0902e35 100644 --- a/clang/lib/CodeGen/CGDebugInfo.cpp +++ b/clang/lib/CodeGen/CGDebugInfo.cpp @@ -2154,7 +2154,10 @@ llvm::DIType CGDebugInfo::getOrCreateFunctionType(const Decl *D, SmallVector<llvm::Value *, 16> Elts; // First element is always return type. For 'void' functions it is NULL. - Elts.push_back(getOrCreateType(OMethod->getResultType(), F)); + QualType ResultTy = OMethod->hasRelatedResultType() + ? QualType(OMethod->getClassInterface()->getTypeForDecl(), 0) + : OMethod->getResultType(); + Elts.push_back(getOrCreateType(ResultTy, F)); // "self" pointer is always first argument. QualType SelfDeclTy = OMethod->getSelfDecl()->getType(); llvm::DIType SelfTy = getOrCreateType(SelfDeclTy, F); diff --git a/clang/test/CodeGenObjC/debug-info-instancetype.m b/clang/test/CodeGenObjC/debug-info-instancetype.m new file mode 100644 index 00000000000..7275b63d17a --- /dev/null +++ b/clang/test/CodeGenObjC/debug-info-instancetype.m @@ -0,0 +1,27 @@ +// RUN: %clang_cc1 -emit-llvm -g -triple x86_64-apple-darwin10 %s -o - | FileCheck %s +// rdar://problem/13359718 +// Substitute the actual type for a method returning instancetype. +@interface NSObject ++ (id)alloc; +- (id)init; +- (id)retain; +@end + +@interface Foo : NSObject ++ (instancetype)defaultFoo; +@end + +@implementation Foo ++(instancetype)defaultFoo {return 0;} +// CHECK: ![[FOO:[0-9]+]] = metadata {{.*}}; [ DW_TAG_structure_type ] [Foo] +// CHECK: metadata !"+[Foo defaultFoo]", metadata !"", i32 [[@LINE-2]], metadata ![[TYPE:[0-9]+]] +// CHECK: ![[TYPE]] = {{.*}} metadata ![[RESULT:[0-9]+]], i32 {{.*}}, i32 {{.*}}} ; [ DW_TAG_subroutine_type ] +// CHECK: ![[RESULT]] = metadata !{metadata ![[FOO]], +@end + + +int main (int argc, const char *argv[]) +{ + Foo *foo = [Foo defaultFoo]; + return 0; +} |

