|
| 1 | +// Test that synthesized accessors get treated like regular method declarations/definitions. |
| 2 | +// I.e.: |
| 3 | +// 1. explicitly passed parameter are not marked artificial. |
| 4 | +// 2. Each property accessor has a method declaration and definition. |
| 5 | + |
| 6 | +// RUN: %clang_cc1 -triple %itanium_abi_triple -emit-llvm -dwarf-version=5 -debug-info-kind=limited %s -o - | FileCheck %s --implicit-check-not "DIFlagArtificial" |
| 7 | + |
| 8 | +@interface Foo |
| 9 | +@property int p1; |
| 10 | +@end |
| 11 | + |
| 12 | +@implementation Foo |
| 13 | +@end |
| 14 | + |
| 15 | +int main(void) { |
| 16 | + Foo *f; |
| 17 | + f.p1 = 2; |
| 18 | + return f.p1; |
| 19 | +} |
| 20 | + |
| 21 | +// CHECK: ![[P1_TYPE:[0-9]+]] = !DIBasicType(name: "int" |
| 22 | +// CHECK: ![[GETTER_DECL:[0-9]+]] = !DISubprogram(name: "-[Foo p1]" |
| 23 | +// CHECK-SAME: type: ![[GETTER_TYPE:[0-9]+]] |
| 24 | +// CHECK-SAME: flags: DIFlagArtificial | DIFlagPrototyped |
| 25 | +// CHECK-SAME: spFlags: DISPFlagLocalToUnit) |
| 26 | + |
| 27 | +// CHECK: ![[GETTER_TYPE]] = !DISubroutineType(types: ![[GETTER_PARAMS:[0-9]+]]) |
| 28 | +// CHECK: ![[GETTER_PARAMS]] = !{![[P1_TYPE]], ![[ID_TYPE:[0-9]+]], ![[SEL_TYPE:[0-9]+]]} |
| 29 | +// CHECK: ![[ID_TYPE]] = !DIDerivedType(tag: DW_TAG_pointer_type |
| 30 | +// CHECK-SAME: flags: DIFlagArtificial | DIFlagObjectPointer) |
| 31 | +// CHECK: ![[SEL_TYPE]] = !DIDerivedType(tag: DW_TAG_typedef, name: "SEL" |
| 32 | +// CHECK-SAME: flags: DIFlagArtificial) |
| 33 | + |
| 34 | +// CHECK: ![[SETTER_DECL:[0-9]+]] = !DISubprogram(name: "-[Foo setP1:]" |
| 35 | +// CHECK-SAME: type: ![[SETTER_TYPE:[0-9]+]] |
| 36 | +// CHECK-SAME: flags: DIFlagArtificial | DIFlagPrototyped |
| 37 | +// CHECK-SAME: spFlags: DISPFlagLocalToUnit) |
| 38 | +// CHECK: ![[SETTER_TYPE]] = !DISubroutineType(types: ![[SETTER_PARAMS:[0-9]+]]) |
| 39 | +// CHECK: ![[SETTER_PARAMS]] = !{null, ![[ID_TYPE]], ![[SEL_TYPE]], ![[P1_TYPE]]} |
| 40 | + |
| 41 | +// CHECK: ![[GETTER_DEF:[0-9]+]] = distinct !DISubprogram(name: "-[Foo p1]" |
| 42 | +// CHECK-SAME: type: ![[GETTER_TYPE]] |
| 43 | +// CHECK-SAME: flags: DIFlagArtificial | DIFlagPrototyped |
| 44 | +// CHECK-SAME: spFlags: DISPFlagLocalToUnit | DISPFlagDefinition |
| 45 | +// CHECK-SAME: declaration: ![[GETTER_DECL]] |
| 46 | + |
| 47 | +// CHECK: !DILocalVariable(name: "self", arg: 1, scope: ![[GETTER_DEF]] |
| 48 | +// CHECK-SAME: flags: DIFlagArtificial | DIFlagObjectPointer) |
| 49 | +// |
| 50 | +// CHECK: !DILocalVariable(name: "_cmd", arg: 2, scope: ![[GETTER_DEF]], |
| 51 | +// CHECK-SAME: flags: DIFlagArtificial) |
| 52 | + |
| 53 | +// CHECK: ![[SETTER_DEF:[0-9]+]] = distinct !DISubprogram(name: "-[Foo setP1:]", |
| 54 | +// CHECK-SAME: type: ![[SETTER_TYPE]] |
| 55 | +// CHECK-SAME: flags: DIFlagArtificial | DIFlagPrototyped |
| 56 | +// CHECK-SAME: spFlags: DISPFlagLocalToUnit | DISPFlagDefinition |
| 57 | +// CHECK-SAME: declaration: ![[SETTER_DECL]] |
| 58 | + |
| 59 | +// CHECK: !DILocalVariable(name: "self", arg: 1, scope: ![[SETTER_DEF]] |
| 60 | +// CHECK-SAME: flags: DIFlagArtificial | DIFlagObjectPointer |
| 61 | +// CHECK: !DILocalVariable(name: "_cmd", arg: 2, scope: ![[SETTER_DEF]] |
| 62 | +// CHECK-SAME: flags: DIFlagArtificial |
| 63 | +// CHECK: !DILocalVariable(name: "p1", arg: 3, scope: ![[SETTER_DEF]] |
0 commit comments