| // RUN: %clang_cc1 -S -emit-llvm -debug-info-kind=limited %s -o - | FileCheck %s |
| |
| // Checks debug info for properties from class extensions for a few cases. |
| |
| |
| // Readonly property in interface made readwrite in a category, with @impl |
| // The interesting bit is that when the ivar debug info is generated, the corresponding |
| // property is looked up and also gets debug info. If the debug info from the interface's |
| // declaration and from the ivar doesn't match, this will end up with two DIObjCProperty |
| // entries which would be bad. |
| @interface FooROWithImpl |
| // CHECK-NOT: !DIObjCProperty(name: "evolvingpropwithimpl"{{.*}}line: [[@LINE+1]] |
| @property (readonly) int evolvingpropwithimpl; |
| @end |
| @interface FooROWithImpl () |
| // CHECK: !DIObjCProperty(name: "evolvingpropwithimpl"{{.*}}line: [[@LINE+1]] |
| @property int evolvingpropwithimpl; |
| @end |
| @implementation FooROWithImpl |
| @synthesize evolvingpropwithimpl = _evolvingpropwithimpl; |
| @end |
| |
| |
| // Simple property from a class extension: |
| @interface Foo |
| @end |
| @interface Foo() |
| // CHECK: !DIObjCProperty(name: "myprop"{{.*}}line: [[@LINE+1]] |
| @property int myprop; |
| @end |
| // There's intentionally no @implementation for Foo, because that would |
| // generate debug info for the property via the backing ivar. |
| |
| |
| // Readonly property in interface made readwrite in a category: |
| @interface FooRO |
| // Shouldn't be here but in the class extension below. |
| // CHECK-NOT: !DIObjCProperty(name: "evolvingprop"{{.*}}line: [[@LINE+1]] |
| @property (readonly) int evolvingprop; |
| @end |
| @interface FooRO () |
| // CHECK: !DIObjCProperty(name: "evolvingprop"{{.*}}line: [[@LINE+1]] |
| @property int evolvingprop; |
| @end |
| |
| |
| // This references types in this file to force emission of their debug info. |
| void foo(Foo *f, FooRO *g, FooROWithImpl* h) { } |