1d9063658SJonas Devlieghere /* Compile with: 2d9063658SJonas Devlieghere for FILE in `seq 3`; do 3d9063658SJonas Devlieghere clang -g -c X86/odr-fwd-declaration2.cpp -DFILE$FILE -o Inputs/odr-fwd-declaration2/$FILE.o 4d9063658SJonas Devlieghere done 5d9063658SJonas Devlieghere */ 6d9063658SJonas Devlieghere 7*a6ef1abcSJonas Devlieghere // 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 8d9063658SJonas Devlieghere 9d9063658SJonas Devlieghere #ifdef FILE1 10d9063658SJonas Devlieghere # 1 "Header.h" 1 11d9063658SJonas Devlieghere struct A { 12d9063658SJonas Devlieghere struct B; 13d9063658SJonas Devlieghere B *bPtr; 14d9063658SJonas Devlieghere B &bRef; 15d9063658SJonas Devlieghere int B::*bPtrToField; 16d9063658SJonas Devlieghere }; 17d9063658SJonas Devlieghere # 3 "Source1.cpp" 2 foo()18d9063658SJonas Devliegherevoid foo() { 19d9063658SJonas Devlieghere A *ptr1 = 0; 20d9063658SJonas Devlieghere } 21d9063658SJonas Devlieghere 22d9063658SJonas Devlieghere // First we confirm that bPtr, bRef and bPtrToField reference the forward 23d9063658SJonas Devlieghere // declaration of the struct B. 24d9063658SJonas Devlieghere // 25d9063658SJonas Devlieghere // CHECK: DW_TAG_member 26d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}} 27d9063658SJonas Devlieghere // CHECK: AT_name{{.*}} "bPtr" 28d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}} 29d9063658SJonas Devlieghere // CHECK: AT_type{{.*}}0x{{0*}}[[PTR1:[a-f0-9]*]] 30d9063658SJonas Devlieghere // 31d9063658SJonas Devlieghere // CHECK: [[STRUCT1:[a-f0-9]*]]:{{.*}}TAG_structure_type 32d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}} 33d9063658SJonas Devlieghere // CHECK: AT_name{{.*}} "B" 34d9063658SJonas Devlieghere // CHECK-NOT: AT_byte_size 35d9063658SJonas Devlieghere // CHECK: DW_AT_declaration 36d9063658SJonas Devlieghere // 37d9063658SJonas Devlieghere // CHECK: DW_TAG_member 38d9063658SJonas Devlieghere // CHECK: AT_name{{.*}} "bRef" 39d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}} 40d9063658SJonas Devlieghere // CHECK: AT_type{{.*}}0x{{0*}}[[REF1:[a-f0-9]*]] 41d9063658SJonas Devlieghere // 42d9063658SJonas Devlieghere // CHECK: TAG_member 43d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}} 44d9063658SJonas Devlieghere // CHECK: AT_name{{.*}} "bPtrToField" 45d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}} 46d9063658SJonas Devlieghere // CHECK: AT_type{{.*}}0x{{0*}}[[PTRTOMEMBER1:[a-f0-9]*]] 47d9063658SJonas Devlieghere // 48d9063658SJonas Devlieghere // CHECK: [[PTR1]]:{{.*}}TAG_pointer_type 49d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}} 50d9063658SJonas Devlieghere // CHECK: AT_type{{.*}}0x{{0*}}[[STRUCT1]] 51d9063658SJonas Devlieghere // 52d9063658SJonas Devlieghere // CHECK: [[REF1]]:{{.*}}TAG_reference_type 53d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}} 54d9063658SJonas Devlieghere // CHECK: AT_type{{.*}}0x{{0*}}[[STRUCT1]] 55d9063658SJonas Devlieghere // 56d9063658SJonas Devlieghere // CHECK: [[PTRTOMEMBER1]]:{{.*}}TAG_ptr_to_member_type 57d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}} 58d9063658SJonas Devlieghere // CHECK: AT_containing_type{{.*}}0x{{0*}}[[STRUCT1]] 59d9063658SJonas Devlieghere 60d9063658SJonas Devlieghere #elif defined(FILE2) 61d9063658SJonas Devlieghere # 1 "Header.h" 1 62d9063658SJonas Devlieghere struct A { 63d9063658SJonas Devlieghere struct B; 64d9063658SJonas Devlieghere B *bPtr; 65d9063658SJonas Devlieghere B &bRef; 66d9063658SJonas Devlieghere int B::*bPtrToField; 67d9063658SJonas Devlieghere }; 68d9063658SJonas Devlieghere # 3 "Source2.cpp" 2 69d9063658SJonas Devlieghere struct A::B { 70d9063658SJonas Devlieghere int x; 71d9063658SJonas Devlieghere }; bar()72d9063658SJonas Devliegherevoid bar() { 73d9063658SJonas Devlieghere A *ptr2 = 0; 74d9063658SJonas Devlieghere } 75d9063658SJonas Devlieghere 76d9063658SJonas Devlieghere // Next we confirm that bPtr, bRef and bPtrToField reference the definition of 77d9063658SJonas Devlieghere // B, rather than its declaration. 78d9063658SJonas Devlieghere // 79d9063658SJonas Devlieghere // CHECK: [[STRUCTA:[a-f0-9]*]]:{{.*}}TAG_structure_type 80d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}} 81d9063658SJonas Devlieghere // CHECK: AT_name{{.*}} "A" 82d9063658SJonas Devlieghere // CHECK-NOT: AT_byte_size 83d9063658SJonas Devlieghere // CHECK: DW_AT_byte_size 84d9063658SJonas Devlieghere // 85d9063658SJonas Devlieghere // CHECK: DW_TAG_member 86d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}} 87d9063658SJonas Devlieghere // CHECK: AT_name{{.*}} "bPtr" 88d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}} 89d9063658SJonas Devlieghere // CHECK: AT_type{{.*}}0x{{0*}}[[PTR2:[a-f0-9]*]] 90d9063658SJonas Devlieghere // 91d9063658SJonas Devlieghere // CHECK: [[STRUCT2:[a-f0-9]*]]:{{.*}}TAG_structure_type 92d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}} 93d9063658SJonas Devlieghere // CHECK: AT_name{{.*}} "B" 94d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}} 95d9063658SJonas Devlieghere // CHECK: DW_AT_byte_size 96d9063658SJonas Devlieghere // 97d9063658SJonas Devlieghere // CHECK: DW_TAG_member 98d9063658SJonas Devlieghere // CHECK: AT_name{{.*}} "bRef" 99d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}} 100d9063658SJonas Devlieghere // CHECK: AT_type{{.*}}0x{{0*}}[[REF2:[a-f0-9]*]] 101d9063658SJonas Devlieghere // 102d9063658SJonas Devlieghere // CHECK: TAG_member 103d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}} 104d9063658SJonas Devlieghere // CHECK: AT_name{{.*}} "bPtrToField" 105d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}} 106d9063658SJonas Devlieghere // CHECK: AT_type{{.*}}0x{{0*}}[[PTRTOMEMBER2:[a-f0-9]*]] 107d9063658SJonas Devlieghere // 108d9063658SJonas Devlieghere // CHECK: [[PTR2]]:{{.*}}TAG_pointer_type 109d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}} 110d9063658SJonas Devlieghere // CHECK: AT_type{{.*}}0x{{0*}}[[STRUCT2]] 111d9063658SJonas Devlieghere // 112d9063658SJonas Devlieghere // CHECK: [[REF2]]:{{.*}}TAG_reference_type 113d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}} 114d9063658SJonas Devlieghere // CHECK: AT_type{{.*}}0x{{0*}}[[STRUCT2]] 115d9063658SJonas Devlieghere // 116d9063658SJonas Devlieghere // CHECK: [[PTRTOMEMBER2]]:{{.*}}TAG_ptr_to_member_type 117d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}} 118d9063658SJonas Devlieghere // CHECK: AT_containing_type{{.*}}0x{{0*}}[[STRUCT2:[a-f0-9]*]] 119d9063658SJonas Devlieghere 120d9063658SJonas Devlieghere #elif defined(FILE3) 121d9063658SJonas Devlieghere # 1 "Header.h" 1 122d9063658SJonas Devlieghere struct A { 123d9063658SJonas Devlieghere struct B; 124d9063658SJonas Devlieghere B *bPtr; 125d9063658SJonas Devlieghere B &bRef; 126d9063658SJonas Devlieghere int B::*bPtrToField; 127d9063658SJonas Devlieghere }; 128d9063658SJonas Devlieghere # 3 "Source2.cpp" 2 129d9063658SJonas Devlieghere struct A::B { 130d9063658SJonas Devlieghere int x; 131d9063658SJonas Devlieghere }; bar()132d9063658SJonas Devliegherevoid bar() { 133d9063658SJonas Devlieghere A *ptr2 = 0; 134d9063658SJonas Devlieghere } 135d9063658SJonas Devlieghere 136d9063658SJonas Devlieghere // Finally we confirm that uniquing isn't broken by checking that further 137d9063658SJonas Devlieghere // references to 'struct A' point to its now complete definition. 138d9063658SJonas Devlieghere // 139d9063658SJonas Devlieghere // CHECK: TAG_variable 140d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}} 141d9063658SJonas Devlieghere // CHECK: AT_name{{.*}} "ptr2" 142d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}} 143d9063658SJonas Devlieghere // CHECK: AT_type{{.*}}0x{{0*}}[[PTR3:[a-f0-9]*]] 144d9063658SJonas Devlieghere // 145d9063658SJonas Devlieghere // CHECK: [[PTR3]]:{{.*}}TAG_pointer_type 146d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}} 147d9063658SJonas Devlieghere // CHECK: AT_type{{.*}}0x{{0*}}[[STRUCTA]] 148d9063658SJonas Devlieghere 149d9063658SJonas Devlieghere #else 150d9063658SJonas Devlieghere #error "You must define which file you generate" 151d9063658SJonas Devlieghere #endif 152