| /* Compile with: |
| for FILE in `seq 3`; do |
| clang -g -c X86/odr-fwd-declaration.cpp -DFILE$FILE -o Inputs/odr-fwd-declaration/$FILE.o |
| done |
| */ |
| |
| // RUN: dsymutil -f -oso-prepend-path=%p/../Inputs/odr-fwd-declaration -y %p/dummy-debug-map.map -o - | llvm-dwarfdump -v -debug-info - | FileCheck %s |
| |
| #ifdef FILE1 |
| # 1 "Header.h" 1 |
| typedef struct S *Sptr; |
| typedef Sptr *Sptrptr; |
| # 3 "Source1.cpp" 2 |
| void foo() { |
| Sptrptr ptr1 = 0; |
| } |
| |
| // First we confirm that the typedefs reference the forward declaration of the |
| // struct S. |
| // |
| // CHECK: TAG_variable |
| // CHECK-NOT: {{DW_TAG|NULL}} |
| // CHECK: AT_name{{.*}} "ptr1" |
| // CHECK-NOT: {{DW_TAG|NULL}} |
| // CHECK: AT_type{{.*}}0x{{0*}}[[TYPEDEF1:[a-f0-9]*]] |
| // |
| // CHECK: [[TYPEDEF1]]:{{.*}}TAG_typedef |
| // CHECK-NOT: {{DW_TAG|NULL}} |
| // CHECK: AT_type{{.*}}0x{{0*}}[[PTR1:[a-f0-9]*]] |
| // CHECK-NOT: {{DW_TAG|NULL}} |
| // CHECK: AT_name{{.*}} "Sptrptr" |
| // |
| // CHECK: [[PTR1]]:{{.*}}TAG_pointer_type |
| // CHECK-NOT: {{DW_TAG|NULL}} |
| // CHECK: AT_type{{.*}}0x{{0*}}[[TYPEDEF2:[a-f0-9]*]] |
| // |
| // CHECK: [[TYPEDEF2]]:{{.*}}TAG_typedef |
| // CHECK-NOT: {{DW_TAG|NULL}} |
| // CHECK: AT_type{{.*}}0x{{0*}}[[PTR2:[a-f0-9]*]] |
| // CHECK-NOT: {{DW_TAG|NULL}} |
| // CHECK: AT_name{{.*}} "Sptr" |
| // |
| // CHECK: [[PTR2]]:{{.*}}TAG_pointer_type |
| // CHECK-NOT: {{DW_TAG|NULL}} |
| // CHECK: AT_type{{.*}}0x{{0*}}[[FWDSTRUCT:[a-f0-9]*]] |
| // |
| // CHECK: [[FWDSTRUCT]]:{{.*}}TAG_structure_type |
| // CHECK-NOT: {{DW_TAG|NULL}} |
| // CHECK: AT_name{{.*}} "S" |
| // CHECK-NOT: {{DW_TAG|NULL}} |
| // CHECK: AT_declaration |
| // CHECK-NOT: AT_byte_size |
| |
| #elif defined(FILE2) |
| # 1 "Header.h" 1 |
| typedef struct S *Sptr; |
| typedef Sptr *Sptrptr; |
| # 3 "Source2.cpp" 2 |
| struct S { |
| int field; |
| }; |
| void bar() { |
| Sptrptr ptr2 = 0; |
| } |
| |
| // Next we confirm that the typedefs reference the definition rather than the |
| // previous declaration of S. |
| // |
| // CHECK: TAG_variable |
| // CHECK-NOT: {{DW_TAG|NULL}} |
| // CHECK: AT_name{{.*}} "ptr2" |
| // CHECK-NOT: {{DW_TAG|NULL}} |
| // CHECK: AT_type{{.*}}0x{{0*}}[[TYPEDEF3:[a-f0-9]*]] |
| // |
| // CHECK: [[TYPEDEF3]]:{{.*}}TAG_typedef |
| // CHECK-NOT: {{DW_TAG|NULL}} |
| // CHECK: AT_type{{.*}}0x{{0*}}[[PTR3:[a-f0-9]*]] |
| // CHECK-NOT: {{DW_TAG|NULL}} |
| // CHECK: AT_name{{.*}} "Sptrptr" |
| // |
| // CHECK: [[PTR3]]:{{.*}}TAG_pointer_type |
| // CHECK-NOT: {{DW_TAG|NULL}} |
| // CHECK: AT_type{{.*}}0x{{0*}}[[TYPEDEF4:[a-f0-9]*]] |
| // |
| // CHECK: [[TYPEDEF4]]:{{.*}}TAG_typedef |
| // CHECK-NOT: {{DW_TAG|NULL}} |
| // CHECK: AT_type{{.*}}0x{{0*}}[[PTR4:[a-f0-9]*]] |
| // CHECK-NOT: {{DW_TAG|NULL}} |
| // CHECK: AT_name{{.*}} "Sptr" |
| // |
| // CHECK: [[PTR4]]:{{.*}}TAG_pointer_type |
| // CHECK-NOT: {{DW_TAG|NULL}} |
| // CHECK: AT_type{{.*}}0x{{0*}}[[STRUCT:[a-f0-9]*]] |
| // |
| // CHECK: [[STRUCT]]:{{.*}}TAG_structure_type |
| // CHECK-NOT: {{DW_TAG|NULL}} |
| // CHECK: AT_name{{.*}} "S" |
| // CHECK-NOT: {{DW_TAG|NULL}} |
| // CHECK-NOT: AT_declaration |
| // CHECK: AT_byte_size |
| // CHECK-NOT: {{DW_TAG|NULL}} |
| // CHECK: TAG_member |
| |
| #elif defined(FILE3) |
| # 1 "Header.h" 1 |
| typedef struct S *Sptr; |
| typedef Sptr *Sptrptr; |
| # 3 "Source1.cpp" 2 |
| void foo() { |
| Sptrptr ptr1 = 0; |
| } |
| |
| // Finally we confirm that uniquing is not broken and the same typedef is |
| // referenced by ptr1. |
| // |
| // CHECK: TAG_variable |
| // CHECK-NOT: {{DW_TAG|NULL}} |
| // CHECK: AT_name{{.*}} "ptr1" |
| // CHECK-NOT: {{DW_TAG|NULL}} |
| // CHECK: AT_type{{.*}}0x{{0*}}[[TYPEDEF3]] |
| // CHECK-NOT: TAG_typedef |
| // CHECK-NOT: TAG_pointer |
| // CHECK-NOT: TAG_structure_type |
| |
| #else |
| #error "You must define which file you generate" |
| #endif |