1 // RUN: %clang_cc1 -emit-llvm -debug-info-kind=limited -triple x86_64-apple-darwin -std=c++11 %s -o - | FileCheck %s 2 3 enum class A { A1=1 }; // underlying type is int by default 4 enum class B: unsigned long { B1=1 }; // underlying type is unsigned long 5 enum C { C1 = 1 }; 6 enum D : short; // enum forward declaration 7 enum Z : int; 8 A a; 9 B b; 10 C c; 11 D d; 12 13 // CHECK: !DICompositeType(tag: DW_TAG_enumeration_type, name: "A" 14 // CHECK-SAME: line: 3 15 // CHECK-SAME: baseType: ![[INT:[0-9]+]] 16 // CHECK-SAME: size: 32 17 // CHECK-NOT: offset: 18 // CHECK-SAME: flags: DIFlagEnumClass 19 // CHECK-SAME: ){{$}} 20 // CHECK: ![[INT]] = !DIBasicType(name: "int" 21 // CHECK: !DICompositeType(tag: DW_TAG_enumeration_type, name: "B" 22 // CHECK-SAME: line: 4 23 // CHECK-SAME: baseType: ![[ULONG:[0-9]+]] 24 // CHECK-SAME: size: 64 25 // CHECK-NOT: offset: 26 // CHECK-SAME: flags: DIFlagEnumClass 27 // CHECK-SAME: ){{$}} 28 // CHECK: ![[ULONG]] = !DIBasicType(name: "unsigned long" 29 // CHECK: !DICompositeType(tag: DW_TAG_enumeration_type, name: "C" 30 // CHECK-SAME: line: 5 31 // CHECK-SAME: baseType: ![[ULONG:[0-9]+]] 32 // CHECK-SAME: size: 32 33 // CHECK-NOT: offset: 34 // CHECK-NOT: flags: 35 // CHECK-SAME: ){{$}} 36 37 namespace PR14029 { 38 // Make sure this doesn't crash/assert. 39 template <typename T> struct Test { 40 enum class Tag { 41 test = 0 42 }; 43 Test() { 44 auto t = Tag::test; 45 } 46 Tag tag() const { return static_cast<Tag>(1); } 47 }; 48 Test<int> t; 49 } 50 51 namespace test2 { 52 // FIXME: this should just be a declaration under -fno-standalone-debug 53 // CHECK: !DICompositeType(tag: DW_TAG_enumeration_type, name: "E" 54 // CHECK-SAME: scope: [[TEST2:![0-9]+]] 55 // CHECK-NOT: DIFlagEnumClass 56 // CHECK-SAME: elements: [[TEST_ENUMS:![0-9]+]] 57 // CHECK-SAME: identifier: "_ZTSN5test21EE" 58 // CHECK: [[TEST2]] = !DINamespace(name: "test2" 59 // CHECK: [[TEST_ENUMS]] = !{[[TEST_E:![0-9]*]]} 60 // CHECK: [[TEST_E]] = !DIEnumerator(name: "e", value: 0) 61 enum E : int; 62 void func(E *) { 63 } 64 enum E : int { e }; 65 } 66 67 namespace test3 { 68 // FIXME: this should just be a declaration under -fno-standalone-debug 69 // CHECK: !DICompositeType(tag: DW_TAG_enumeration_type, name: "E" 70 // CHECK-SAME: scope: [[TEST3:![0-9]+]] 71 // CHECK-NOT: DIFlagEnumClass 72 // CHECK-SAME: elements: [[TEST_ENUMS]] 73 // CHECK-SAME: identifier: "_ZTSN5test31EE" 74 // CHECK: [[TEST3]] = !DINamespace(name: "test3" 75 enum E : int { e }; 76 void func(E *) { 77 } 78 } 79 80 namespace test4 { 81 // CHECK: !DICompositeType(tag: DW_TAG_enumeration_type, name: "E" 82 // CHECK-SAME: scope: [[TEST4:![0-9]+]] 83 // CHECK-NOT: DIFlagEnumClass 84 // CHECK-SAME: elements: [[TEST_ENUMS]] 85 // CHECK-SAME: identifier: "_ZTSN5test41EE" 86 // CHECK: [[TEST4]] = !DINamespace(name: "test4" 87 enum E : int; 88 void f1(E *) { 89 } 90 enum E : int { e }; 91 void f2(E) { 92 } 93 } 94 95 // CHECK: !DICompositeType(tag: DW_TAG_enumeration_type, name: "D" 96 // CHECK-SAME: line: 6 97 // CHECK-SAME: size: 16 98 // CHECK-NOT: offset: 99 // CHECK-SAME: flags: DIFlagFwdDecl 100 101 // CHECK: !DICompositeType(tag: DW_TAG_enumeration_type, name: "Z" 102 // CHECK-NOT: scope: 103 // CHECK-SAME: flags: DIFlagFwdDecl 104 void fz() { Z z; } 105 106 namespace test5 { 107 // CHECK: [[TEST5:![0-9]+]] = !DINamespace(name: "test5" 108 // CHECK: !DICompositeType(tag: DW_TAG_enumeration_type, name: "E" 109 // CHECK-SAME: scope: [[TEST5]] 110 // CHECK-SAME: flags: DIFlagFwdDecl 111 // CHECK-SAME: identifier: "_ZTSN5test51EE" 112 enum E : int; 113 void f1(E *) { 114 } 115 } 116 117 namespace test6 { 118 // Ensure typedef'd enums aren't manifest by debug info generation. 119 // This could cause "typedef changes linkage of anonymous type, but linkage was 120 // already computed" errors. 121 // CHECK-NOT: test6 122 typedef enum { 123 } E; 124 } 125