1d9063658SJonas Devlieghere /* Compile with: 2d9063658SJonas Devlieghere for FILE in `seq 3`; do 3d9063658SJonas Devlieghere clang -g -c X86/odr-fwd-declaration.cpp -DFILE$FILE -o Inputs/odr-fwd-declaration/$FILE.o 4d9063658SJonas Devlieghere done 5d9063658SJonas Devlieghere */ 6d9063658SJonas Devlieghere 7a6ef1abcSJonas Devlieghere // 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 8d9063658SJonas Devlieghere 9d9063658SJonas Devlieghere #ifdef FILE1 10d9063658SJonas Devlieghere # 1 "Header.h" 1 11d9063658SJonas Devlieghere typedef struct S *Sptr; 12d9063658SJonas Devlieghere typedef Sptr *Sptrptr; 13d9063658SJonas Devlieghere # 3 "Source1.cpp" 2 foo()14d9063658SJonas Devliegherevoid foo() { 15d9063658SJonas Devlieghere Sptrptr ptr1 = 0; 16d9063658SJonas Devlieghere } 17d9063658SJonas Devlieghere 18d9063658SJonas Devlieghere // First we confirm that the typedefs reference the forward declaration of the 19d9063658SJonas Devlieghere // struct S. 20d9063658SJonas Devlieghere // 21d9063658SJonas Devlieghere // CHECK: TAG_variable 22d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}} 23d9063658SJonas Devlieghere // CHECK: AT_name{{.*}} "ptr1" 24d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}} 25d9063658SJonas Devlieghere // CHECK: AT_type{{.*}}0x{{0*}}[[TYPEDEF1:[a-f0-9]*]] 26d9063658SJonas Devlieghere // 27d9063658SJonas Devlieghere // CHECK: [[TYPEDEF1]]:{{.*}}TAG_typedef 28d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}} 29d9063658SJonas Devlieghere // CHECK: AT_type{{.*}}0x{{0*}}[[PTR1:[a-f0-9]*]] 30d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}} 31d9063658SJonas Devlieghere // CHECK: AT_name{{.*}} "Sptrptr" 32d9063658SJonas Devlieghere // 33d9063658SJonas Devlieghere // CHECK: [[PTR1]]:{{.*}}TAG_pointer_type 34d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}} 35d9063658SJonas Devlieghere // CHECK: AT_type{{.*}}0x{{0*}}[[TYPEDEF2:[a-f0-9]*]] 36d9063658SJonas Devlieghere // 37d9063658SJonas Devlieghere // CHECK: [[TYPEDEF2]]:{{.*}}TAG_typedef 38d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}} 39d9063658SJonas Devlieghere // CHECK: AT_type{{.*}}0x{{0*}}[[PTR2:[a-f0-9]*]] 40d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}} 41d9063658SJonas Devlieghere // CHECK: AT_name{{.*}} "Sptr" 42d9063658SJonas Devlieghere // 43d9063658SJonas Devlieghere // CHECK: [[PTR2]]:{{.*}}TAG_pointer_type 44d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}} 45d9063658SJonas Devlieghere // CHECK: AT_type{{.*}}0x{{0*}}[[FWDSTRUCT:[a-f0-9]*]] 46d9063658SJonas Devlieghere // 47d9063658SJonas Devlieghere // CHECK: [[FWDSTRUCT]]:{{.*}}TAG_structure_type 48d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}} 49d9063658SJonas Devlieghere // CHECK: AT_name{{.*}} "S" 50d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}} 51d9063658SJonas Devlieghere // CHECK: AT_declaration 52*8bd441afSArtem Dergachev // CHECK-NOT: AT_byte_size 53d9063658SJonas Devlieghere 54d9063658SJonas Devlieghere #elif defined(FILE2) 55d9063658SJonas Devlieghere # 1 "Header.h" 1 56d9063658SJonas Devlieghere typedef struct S *Sptr; 57d9063658SJonas Devlieghere typedef Sptr *Sptrptr; 58d9063658SJonas Devlieghere # 3 "Source2.cpp" 2 59d9063658SJonas Devlieghere struct S { 60d9063658SJonas Devlieghere int field; 61d9063658SJonas Devlieghere }; bar()62d9063658SJonas Devliegherevoid bar() { 63d9063658SJonas Devlieghere Sptrptr ptr2 = 0; 64d9063658SJonas Devlieghere } 65d9063658SJonas Devlieghere 66d9063658SJonas Devlieghere // Next we confirm that the typedefs reference the definition rather than the 67d9063658SJonas Devlieghere // previous declaration of S. 68d9063658SJonas Devlieghere // 69d9063658SJonas Devlieghere // CHECK: TAG_variable 70d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}} 71d9063658SJonas Devlieghere // CHECK: AT_name{{.*}} "ptr2" 72d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}} 73d9063658SJonas Devlieghere // CHECK: AT_type{{.*}}0x{{0*}}[[TYPEDEF3:[a-f0-9]*]] 74d9063658SJonas Devlieghere // 75d9063658SJonas Devlieghere // CHECK: [[TYPEDEF3]]:{{.*}}TAG_typedef 76d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}} 77d9063658SJonas Devlieghere // CHECK: AT_type{{.*}}0x{{0*}}[[PTR3:[a-f0-9]*]] 78d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}} 79d9063658SJonas Devlieghere // CHECK: AT_name{{.*}} "Sptrptr" 80d9063658SJonas Devlieghere // 81d9063658SJonas Devlieghere // CHECK: [[PTR3]]:{{.*}}TAG_pointer_type 82d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}} 83d9063658SJonas Devlieghere // CHECK: AT_type{{.*}}0x{{0*}}[[TYPEDEF4:[a-f0-9]*]] 84d9063658SJonas Devlieghere // 85d9063658SJonas Devlieghere // CHECK: [[TYPEDEF4]]:{{.*}}TAG_typedef 86d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}} 87d9063658SJonas Devlieghere // CHECK: AT_type{{.*}}0x{{0*}}[[PTR4:[a-f0-9]*]] 88d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}} 89d9063658SJonas Devlieghere // CHECK: AT_name{{.*}} "Sptr" 90d9063658SJonas Devlieghere // 91d9063658SJonas Devlieghere // CHECK: [[PTR4]]:{{.*}}TAG_pointer_type 92d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}} 93d9063658SJonas Devlieghere // CHECK: AT_type{{.*}}0x{{0*}}[[STRUCT:[a-f0-9]*]] 94d9063658SJonas Devlieghere // 95d9063658SJonas Devlieghere // CHECK: [[STRUCT]]:{{.*}}TAG_structure_type 96d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}} 97d9063658SJonas Devlieghere // CHECK: AT_name{{.*}} "S" 98d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}} 99d9063658SJonas Devlieghere // CHECK-NOT: AT_declaration 100d9063658SJonas Devlieghere // CHECK: AT_byte_size 101d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}} 102d9063658SJonas Devlieghere // CHECK: TAG_member 103d9063658SJonas Devlieghere 104d9063658SJonas Devlieghere #elif defined(FILE3) 105d9063658SJonas Devlieghere # 1 "Header.h" 1 106d9063658SJonas Devlieghere typedef struct S *Sptr; 107d9063658SJonas Devlieghere typedef Sptr *Sptrptr; 108d9063658SJonas Devlieghere # 3 "Source1.cpp" 2 foo()109d9063658SJonas Devliegherevoid foo() { 110d9063658SJonas Devlieghere Sptrptr ptr1 = 0; 111d9063658SJonas Devlieghere } 112d9063658SJonas Devlieghere 113d9063658SJonas Devlieghere // Finally we confirm that uniquing is not broken and the same typedef is 114d9063658SJonas Devlieghere // referenced by ptr1. 115d9063658SJonas Devlieghere // 116d9063658SJonas Devlieghere // CHECK: TAG_variable 117d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}} 118d9063658SJonas Devlieghere // CHECK: AT_name{{.*}} "ptr1" 119d9063658SJonas Devlieghere // CHECK-NOT: {{DW_TAG|NULL}} 120d9063658SJonas Devlieghere // CHECK: AT_type{{.*}}0x{{0*}}[[TYPEDEF3]] 121d9063658SJonas Devlieghere // CHECK-NOT: TAG_typedef 122d9063658SJonas Devlieghere // CHECK-NOT: TAG_pointer 123d9063658SJonas Devlieghere // CHECK-NOT: TAG_structure_type 124d9063658SJonas Devlieghere 125d9063658SJonas Devlieghere #else 126d9063658SJonas Devlieghere #error "You must define which file you generate" 127d9063658SJonas Devlieghere #endif 128