Home | History | Annotate | Download | only in CodeGenObjC
      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) { }
     49