152 lines
3.7 KiB
C++
152 lines
3.7 KiB
C++
|
/* Compile with:
|
||
|
for FILE in `seq 3`; do
|
||
|
clang -g -c X86/odr-fwd-declaration2.cpp -DFILE$FILE -o Inputs/odr-fwd-declaration2/$FILE.o
|
||
|
done
|
||
|
*/
|
||
|
|
||
|
// RUN: dsymutil -f -oso-prepend-path=%p/../Inputs/odr-fwd-declaration2 -y %p/dummy-debug-map.map -o - | llvm-dwarfdump -v -debug-info - | FileCheck %s
|
||
|
|
||
|
#ifdef FILE1
|
||
|
# 1 "Header.h" 1
|
||
|
struct A {
|
||
|
struct B;
|
||
|
B *bPtr;
|
||
|
B &bRef;
|
||
|
int B::*bPtrToField;
|
||
|
};
|
||
|
# 3 "Source1.cpp" 2
|
||
|
void foo() {
|
||
|
A *ptr1 = 0;
|
||
|
}
|
||
|
|
||
|
// First we confirm that bPtr, bRef and bPtrToField reference the forward
|
||
|
// declaration of the struct B.
|
||
|
//
|
||
|
// CHECK: DW_TAG_member
|
||
|
// CHECK-NOT: {{DW_TAG|NULL}}
|
||
|
// CHECK: AT_name{{.*}} "bPtr"
|
||
|
// CHECK-NOT: {{DW_TAG|NULL}}
|
||
|
// CHECK: AT_type{{.*}}0x{{0*}}[[PTR1:[a-f0-9]*]]
|
||
|
//
|
||
|
// CHECK: [[STRUCT1:[a-f0-9]*]]:{{.*}}TAG_structure_type
|
||
|
// CHECK-NOT: {{DW_TAG|NULL}}
|
||
|
// CHECK: AT_name{{.*}} "B"
|
||
|
// CHECK-NOT: AT_byte_size
|
||
|
// CHECK: DW_AT_declaration
|
||
|
//
|
||
|
// CHECK: DW_TAG_member
|
||
|
// CHECK: AT_name{{.*}} "bRef"
|
||
|
// CHECK-NOT: {{DW_TAG|NULL}}
|
||
|
// CHECK: AT_type{{.*}}0x{{0*}}[[REF1:[a-f0-9]*]]
|
||
|
//
|
||
|
// CHECK: TAG_member
|
||
|
// CHECK-NOT: {{DW_TAG|NULL}}
|
||
|
// CHECK: AT_name{{.*}} "bPtrToField"
|
||
|
// CHECK-NOT: {{DW_TAG|NULL}}
|
||
|
// CHECK: AT_type{{.*}}0x{{0*}}[[PTRTOMEMBER1:[a-f0-9]*]]
|
||
|
//
|
||
|
// CHECK: [[PTR1]]:{{.*}}TAG_pointer_type
|
||
|
// CHECK-NOT: {{DW_TAG|NULL}}
|
||
|
// CHECK: AT_type{{.*}}0x{{0*}}[[STRUCT1]]
|
||
|
//
|
||
|
// CHECK: [[REF1]]:{{.*}}TAG_reference_type
|
||
|
// CHECK-NOT: {{DW_TAG|NULL}}
|
||
|
// CHECK: AT_type{{.*}}0x{{0*}}[[STRUCT1]]
|
||
|
//
|
||
|
// CHECK: [[PTRTOMEMBER1]]:{{.*}}TAG_ptr_to_member_type
|
||
|
// CHECK-NOT: {{DW_TAG|NULL}}
|
||
|
// CHECK: AT_containing_type{{.*}}0x{{0*}}[[STRUCT1]]
|
||
|
|
||
|
#elif defined(FILE2)
|
||
|
# 1 "Header.h" 1
|
||
|
struct A {
|
||
|
struct B;
|
||
|
B *bPtr;
|
||
|
B &bRef;
|
||
|
int B::*bPtrToField;
|
||
|
};
|
||
|
# 3 "Source2.cpp" 2
|
||
|
struct A::B {
|
||
|
int x;
|
||
|
};
|
||
|
void bar() {
|
||
|
A *ptr2 = 0;
|
||
|
}
|
||
|
|
||
|
// Next we confirm that bPtr, bRef and bPtrToField reference the definition of
|
||
|
// B, rather than its declaration.
|
||
|
//
|
||
|
// CHECK: [[STRUCTA:[a-f0-9]*]]:{{.*}}TAG_structure_type
|
||
|
// CHECK-NOT: {{DW_TAG|NULL}}
|
||
|
// CHECK: AT_name{{.*}} "A"
|
||
|
// CHECK-NOT: AT_byte_size
|
||
|
// CHECK: DW_AT_byte_size
|
||
|
//
|
||
|
// CHECK: DW_TAG_member
|
||
|
// CHECK-NOT: {{DW_TAG|NULL}}
|
||
|
// CHECK: AT_name{{.*}} "bPtr"
|
||
|
// CHECK-NOT: {{DW_TAG|NULL}}
|
||
|
// CHECK: AT_type{{.*}}0x{{0*}}[[PTR2:[a-f0-9]*]]
|
||
|
//
|
||
|
// CHECK: [[STRUCT2:[a-f0-9]*]]:{{.*}}TAG_structure_type
|
||
|
// CHECK-NOT: {{DW_TAG|NULL}}
|
||
|
// CHECK: AT_name{{.*}} "B"
|
||
|
// CHECK-NOT: {{DW_TAG|NULL}}
|
||
|
// CHECK: DW_AT_byte_size
|
||
|
//
|
||
|
// CHECK: DW_TAG_member
|
||
|
// CHECK: AT_name{{.*}} "bRef"
|
||
|
// CHECK-NOT: {{DW_TAG|NULL}}
|
||
|
// CHECK: AT_type{{.*}}0x{{0*}}[[REF2:[a-f0-9]*]]
|
||
|
//
|
||
|
// CHECK: TAG_member
|
||
|
// CHECK-NOT: {{DW_TAG|NULL}}
|
||
|
// CHECK: AT_name{{.*}} "bPtrToField"
|
||
|
// CHECK-NOT: {{DW_TAG|NULL}}
|
||
|
// CHECK: AT_type{{.*}}0x{{0*}}[[PTRTOMEMBER2:[a-f0-9]*]]
|
||
|
//
|
||
|
// CHECK: [[PTR2]]:{{.*}}TAG_pointer_type
|
||
|
// CHECK-NOT: {{DW_TAG|NULL}}
|
||
|
// CHECK: AT_type{{.*}}0x{{0*}}[[STRUCT2]]
|
||
|
//
|
||
|
// CHECK: [[REF2]]:{{.*}}TAG_reference_type
|
||
|
// CHECK-NOT: {{DW_TAG|NULL}}
|
||
|
// CHECK: AT_type{{.*}}0x{{0*}}[[STRUCT2]]
|
||
|
//
|
||
|
// CHECK: [[PTRTOMEMBER2]]:{{.*}}TAG_ptr_to_member_type
|
||
|
// CHECK-NOT: {{DW_TAG|NULL}}
|
||
|
// CHECK: AT_containing_type{{.*}}0x{{0*}}[[STRUCT2:[a-f0-9]*]]
|
||
|
|
||
|
#elif defined(FILE3)
|
||
|
# 1 "Header.h" 1
|
||
|
struct A {
|
||
|
struct B;
|
||
|
B *bPtr;
|
||
|
B &bRef;
|
||
|
int B::*bPtrToField;
|
||
|
};
|
||
|
# 3 "Source2.cpp" 2
|
||
|
struct A::B {
|
||
|
int x;
|
||
|
};
|
||
|
void bar() {
|
||
|
A *ptr2 = 0;
|
||
|
}
|
||
|
|
||
|
// Finally we confirm that uniquing isn't broken by checking that further
|
||
|
// references to 'struct A' point to its now complete definition.
|
||
|
//
|
||
|
// CHECK: TAG_variable
|
||
|
// CHECK-NOT: {{DW_TAG|NULL}}
|
||
|
// CHECK: AT_name{{.*}} "ptr2"
|
||
|
// CHECK-NOT: {{DW_TAG|NULL}}
|
||
|
// CHECK: AT_type{{.*}}0x{{0*}}[[PTR3:[a-f0-9]*]]
|
||
|
//
|
||
|
// CHECK: [[PTR3]]:{{.*}}TAG_pointer_type
|
||
|
// CHECK-NOT: {{DW_TAG|NULL}}
|
||
|
// CHECK: AT_type{{.*}}0x{{0*}}[[STRUCTA]]
|
||
|
|
||
|
#else
|
||
|
#error "You must define which file you generate"
|
||
|
#endif
|