1*67e74705SXin Li// RUN: %clang_cc1 -debug-info-kind=limited -emit-llvm -o - %s | FileCheck %s 2*67e74705SXin Li// The DWARF standard says the underlying data type of an enum may be 3*67e74705SXin Li// stored in an DW_AT_type entry in the enum DIE. This is useful to have 4*67e74705SXin Li// so the debugger knows about the signedness of the underlying type. 5*67e74705SXin Li 6*67e74705SXin Litypedef long NSInteger; 7*67e74705SXin Li#define NS_ENUM(_type, _name) enum _name : _type _name; enum _name : _type 8*67e74705SXin Li 9*67e74705SXin Li// Enum with no specified underlying type 10*67e74705SXin Litypedef enum { 11*67e74705SXin Li Enum0One, 12*67e74705SXin Li Enum0Two 13*67e74705SXin Li} Enum0; 14*67e74705SXin Li 15*67e74705SXin Li// Enum declared with the NS_ENUM macro 16*67e74705SXin Litypedef NS_ENUM(NSInteger, Enum1) { 17*67e74705SXin Li Enum1One = -1, 18*67e74705SXin Li Enum1Two 19*67e74705SXin Li}; 20*67e74705SXin Li 21*67e74705SXin Li// Enum declared with a fixed underlying type 22*67e74705SXin Litypedef enum : NSInteger { 23*67e74705SXin Li Enum2One = -1, 24*67e74705SXin Li Enum2Two 25*67e74705SXin Li} Enum2; 26*67e74705SXin Li 27*67e74705SXin Li// Typedef and declaration separately 28*67e74705SXin Lienum : NSInteger 29*67e74705SXin Li{ 30*67e74705SXin Li Enum3One = -1, 31*67e74705SXin Li Enum3Two 32*67e74705SXin Li}; 33*67e74705SXin Litypedef NSInteger Enum3; 34*67e74705SXin Li 35*67e74705SXin Liint main() { 36*67e74705SXin Li Enum0 e0 = Enum0One; 37*67e74705SXin Li // CHECK: call void @llvm.dbg.declare(metadata {{.*}}, metadata ![[ENUM0:[0-9]+]], metadata !{{.*}}) 38*67e74705SXin Li Enum1 e1 = Enum1One; 39*67e74705SXin Li // CHECK: call void @llvm.dbg.declare(metadata {{.*}}, metadata ![[ENUM1:[0-9]+]], metadata !{{.*}}) 40*67e74705SXin Li Enum2 e2 = Enum2One; 41*67e74705SXin Li // CHECK: call void @llvm.dbg.declare(metadata {{.*}}, metadata ![[ENUM2:[0-9]+]], metadata !{{.*}}) 42*67e74705SXin Li Enum3 e3 = Enum3One; 43*67e74705SXin Li // CHECK: call void @llvm.dbg.declare(metadata {{.*}}, metadata ![[ENUM3:[0-9]+]], metadata !{{.*}}) 44*67e74705SXin Li 45*67e74705SXin Li // -Werror and the following line ensures that these enums are not 46*67e74705SXin Li // -treated as C++11 strongly typed enums. 47*67e74705SXin Li return e0 != e1 && e1 == e2 && e2 == e3; 48*67e74705SXin Li} 49*67e74705SXin Li// CHECK: ![[ENUMERATOR0:[0-9]+]] = !DICompositeType(tag: DW_TAG_enumeration_type 50*67e74705SXin Li// CHECK-SAME: line: 10, 51*67e74705SXin Li// CHECK: ![[ENUMERATOR1:[0-9]+]] = !DICompositeType(tag: DW_TAG_enumeration_type, name: "Enum1" 52*67e74705SXin Li// CHECK-SAME: line: 16 53*67e74705SXin Li// CHECK-SAME: baseType: ![[ENUMERATOR3:[0-9]+]] 54*67e74705SXin Li// CHECK: ![[ENUMERATOR3]] = !DIDerivedType(tag: DW_TAG_typedef, name: "NSInteger" 55*67e74705SXin Li// CHECK-SAME: line: 6 56*67e74705SXin Li// CHECK-SAME: baseType: ![[LONGINT:[0-9]+]] 57*67e74705SXin Li// CHECK: ![[LONGINT]] = !DIBasicType(name: "long int" 58*67e74705SXin Li// CHECK: ![[ENUMERATOR2:[0-9]+]] = !DICompositeType(tag: DW_TAG_enumeration_type, 59*67e74705SXin Li// CHECK-SAME: line: 22 60*67e74705SXin Li// CHECK-SAME: baseType: ![[ENUMERATOR3]] 61*67e74705SXin Li 62*67e74705SXin Li// CHECK: ![[ENUM0]] = !DILocalVariable(name: "e0" 63*67e74705SXin Li// CHECK-SAME: type: ![[TYPE0:[0-9]+]] 64*67e74705SXin Li// CHECK: ![[TYPE0]] = !DIDerivedType(tag: DW_TAG_typedef, name: "Enum0", 65*67e74705SXin Li// CHECK-SAME: baseType: ![[ENUMERATOR0]] 66*67e74705SXin Li 67*67e74705SXin Li// CHECK: ![[ENUM1]] = !DILocalVariable(name: "e1" 68*67e74705SXin Li// CHECK-SAME: type: ![[TYPE1:[0-9]+]] 69*67e74705SXin Li// CHECK: ![[TYPE1]] = !DIDerivedType(tag: DW_TAG_typedef, name: "Enum1" 70*67e74705SXin Li// CHECK-SAME: baseType: ![[ENUMERATOR1]] 71*67e74705SXin Li 72*67e74705SXin Li// CHECK: ![[ENUM2]] = !DILocalVariable(name: "e2" 73*67e74705SXin Li// CHECK-SAME: type: ![[TYPE2:[0-9]+]] 74*67e74705SXin Li// CHECK: ![[TYPE2]] = !DIDerivedType(tag: DW_TAG_typedef, name: "Enum2" 75*67e74705SXin Li// CHECK-SAME: baseType: ![[ENUMERATOR2]] 76*67e74705SXin Li 77*67e74705SXin Li// CHECK: ![[ENUM3]] = !DILocalVariable(name: "e3" 78*67e74705SXin Li// CHECK-SAME: type: ![[TYPE3:[0-9]+]] 79*67e74705SXin Li// CHECK: ![[TYPE3]] = !DIDerivedType(tag: DW_TAG_typedef, name: "Enum3" 80*67e74705SXin Li// CHECK-SAME: baseType: ![[ENUMERATOR3]] 81