Skip to content

Commit 4590322

Browse files
committed
[CIR]#163601: Handle enum type
1 parent 5157ed5 commit 4590322

File tree

2 files changed

+49
-2
lines changed

2 files changed

+49
-2
lines changed

clang/lib/CIR/CodeGen/CIRGenItaniumCXXABI.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -950,8 +950,7 @@ const char *vTableClassNameForType(const CIRGenModule &cgm, const Type *ty) {
950950
break;
951951

952952
case Type::Enum:
953-
cgm.errorNYI("VTableClassNameForType: Enum");
954-
break;
953+
return "_ZTVN10__cxxabiv116__enum_type_infoE";
955954

956955
case Type::Record: {
957956
const auto *rd = cast<CXXRecordDecl>(cast<RecordType>(ty)->getDecl())

clang/test/CIR/CodeGen/throws.cpp

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,3 +196,51 @@ void throw_ext_vector_type() {
196196
// OGCG: store <4 x i32> %[[TMP_A]], ptr %[[EXCEPTION_ADDR]], align 16
197197
// OGCG: call void @__cxa_throw(ptr %[[EXCEPTION_ADDR]], ptr @_ZTIDv4_i, ptr null)
198198
// OGCG: unreachable
199+
200+
void throw_enum_expr() {
201+
enum Test {
202+
TestA,
203+
TestB
204+
};
205+
throw Test::TestA;
206+
}
207+
208+
//CIR: %[[EXCEPTION_ADDR:.*]] = cir.alloc.exception 4 -> !cir.ptr<!u32i>
209+
//CIR: %[[EXCEPTION_VALUE:.*]] = cir.const #cir.int<0> : !u32i
210+
//CIR: cir.store{{.*}} %[[EXCEPTION_VALUE]], %[[EXCEPTION_ADDR]] : !u32i, !cir.ptr<!u32i>
211+
//CIR: cir.throw %[[EXCEPTION_ADDR]] : !cir.ptr<!u32i>, @_ZTIZ15throw_enum_exprvE4Test
212+
//CIR: cir.unreachable
213+
214+
//LLVM: %[[EXCEPTION_ADDR:.*]] = call ptr @__cxa_allocate_exception(i64 4)
215+
//LLVM: store i32 0, ptr %[[EXCEPTION_ADDR]], align 16
216+
//LLVM: call void @__cxa_throw(ptr %[[EXCEPTION_ADDR]], ptr @_ZTIZ15throw_enum_exprvE4Test, ptr null)
217+
//LLVM: unreachable
218+
219+
//OGCG: %[[EXCEPTION_ADDR:.*]] = call ptr @__cxa_allocate_exception(i64 4)
220+
//OGCG: store i32 0, ptr %[[EXCEPTION_ADDR]], align 16
221+
//OGCG: call void @__cxa_throw(ptr %[[EXCEPTION_ADDR]], ptr @_ZTIZ15throw_enum_exprvE4Test, ptr null)
222+
//OGCG: unreachable
223+
224+
void throw_enum_class_expr() {
225+
enum class Test {
226+
TestA,
227+
TestB
228+
};
229+
throw Test::TestA;
230+
}
231+
232+
//CIR: %[[EXCEPTION_ADDR:.*]] = cir.alloc.exception 4 -> !cir.ptr<!s32i>
233+
//CIR: %[[EXCEPTION_VALUE:.*]] = cir.const #cir.int<0> : !s32i
234+
//CIR: cir.store{{.*}} %[[EXCEPTION_VALUE]], %[[EXCEPTION_ADDR]] : !s32i, !cir.ptr<!s32i>
235+
//CIR: cir.throw %[[EXCEPTION_ADDR]] : !cir.ptr<!s32i>, @_ZTIZ21throw_enum_class_exprvE4Test
236+
//CIR: cir.unreachable
237+
238+
//LLVM: %[[EXCEPTION_ADDR:.*]] = call ptr @__cxa_allocate_exception(i64 4)
239+
//LLVM: store i32 0, ptr %[[EXCEPTION_ADDR]], align 16
240+
//LLVM: call void @__cxa_throw(ptr %[[EXCEPTION_ADDR]], ptr @_ZTIZ21throw_enum_class_exprvE4Test, ptr null)
241+
//LLVM: unreachable
242+
243+
//OGCG: %[[EXCEPTION_ADDR:.*]] = call ptr @__cxa_allocate_exception(i64 4)
244+
//OGCG: store i32 0, ptr %[[EXCEPTION_ADDR]], align 16
245+
//OGCG: call void @__cxa_throw(ptr %[[EXCEPTION_ADDR]], ptr @_ZTIZ21throw_enum_class_exprvE4Test, ptr null)
246+
//OGCG: unreachable

0 commit comments

Comments
 (0)