Nico Weber | 7123bca | 2015-12-04 19:14:14 +0000 | [diff] [blame] | 1 | // RUN: %clang_cc1 -S -emit-llvm -debug-info-kind=limited %s -o - | FileCheck %s |
| 2 | |
| 3 | // Checks debug info for properties from class extensions for a few cases. |
| 4 | |
| 5 | |
| 6 | // Readonly property in interface made readwrite in a category, with @impl |
| 7 | // The interesting bit is that when the ivar debug info is generated, the corresponding |
| 8 | // property is looked up and also gets debug info. If the debug info from the interface's |
| 9 | // declaration and from the ivar doesn't match, this will end up with two DIObjCProperty |
| 10 | // entries which would be bad. |
| 11 | @interface FooROWithImpl |
| 12 | // CHECK-NOT: !DIObjCProperty(name: "evolvingpropwithimpl"{{.*}}line: [[@LINE+1]] |
| 13 | @property (readonly) int evolvingpropwithimpl; |
| 14 | @end |
| 15 | @interface FooROWithImpl () |
| 16 | // CHECK: !DIObjCProperty(name: "evolvingpropwithimpl"{{.*}}line: [[@LINE+1]] |
| 17 | @property int evolvingpropwithimpl; |
| 18 | @end |
| 19 | @implementation FooROWithImpl |
| 20 | @synthesize evolvingpropwithimpl = _evolvingpropwithimpl; |
| 21 | @end |
| 22 | |
| 23 | |
| 24 | // Simple property from a class extension: |
| 25 | @interface Foo |
| 26 | @end |
| 27 | @interface Foo() |
| 28 | // CHECK: !DIObjCProperty(name: "myprop"{{.*}}line: [[@LINE+1]] |
| 29 | @property int myprop; |
| 30 | @end |
| 31 | // There's intentionally no @implementation for Foo, because that would |
| 32 | // generate debug info for the property via the backing ivar. |
| 33 | |
| 34 | |
| 35 | // Readonly property in interface made readwrite in a category: |
| 36 | @interface FooRO |
| 37 | // Shouldn't be here but in the class extension below. |
| 38 | // CHECK-NOT: !DIObjCProperty(name: "evolvingprop"{{.*}}line: [[@LINE+1]] |
| 39 | @property (readonly) int evolvingprop; |
| 40 | @end |
| 41 | @interface FooRO () |
| 42 | // CHECK: !DIObjCProperty(name: "evolvingprop"{{.*}}line: [[@LINE+1]] |
| 43 | @property int evolvingprop; |
| 44 | @end |
| 45 | |
| 46 | |
| 47 | // This references types in this file to force emission of their debug info. |
| 48 | void foo(Foo *f, FooRO *g, FooROWithImpl* h) { } |