49 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Objective-C
		
	
	
	
			
		
		
	
	
			49 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Objective-C
		
	
	
	
| // 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) { }
 |