diff --git a/clang/lib/CIR/CodeGen/CIRGenExprScalar.cpp b/clang/lib/CIR/CodeGen/CIRGenExprScalar.cpp index 30d231e2c61de..998bb29da8b08 100644 --- a/clang/lib/CIR/CodeGen/CIRGenExprScalar.cpp +++ b/clang/lib/CIR/CodeGen/CIRGenExprScalar.cpp @@ -162,6 +162,12 @@ class ScalarExprEmitter : public StmtVisitor { builder.getAttr(type, e->getValue())); } + mlir::Value VisitCharacterLiteral(const CharacterLiteral *e) { + mlir::Type ty = cgf.convertType(e->getType()); + auto init = cir::IntAttr::get(ty, e->getValue()); + return builder.create(cgf.getLoc(e->getExprLoc()), init); + } + mlir::Value VisitCXXBoolLiteralExpr(const CXXBoolLiteralExpr *e) { return builder.getBool(e->getValue(), cgf.getLoc(e->getExprLoc())); } diff --git a/clang/test/CIR/CodeGen/basic.c b/clang/test/CIR/CodeGen/basic.c index abc1a45fd433f..7ff73ee95f799 100644 --- a/clang/test/CIR/CodeGen/basic.c +++ b/clang/test/CIR/CodeGen/basic.c @@ -309,3 +309,17 @@ size_type max_size(void) { // CHECK: %6 = cir.load{{.*}} %0 : !cir.ptr, !u64i // CHECK: cir.return %6 : !u64i // CHECK: } + +void test_char_literal() { + char c; + c = 'X'; +} + +// CIR: cir.func @test_char_literal +// CIR: cir.const #cir.int<88> + +// LLVM: define void @test_char_literal() +// LLVM: store i8 88, ptr %{{.*}}, align 1 + +// OGCG: define{{.*}} void @test_char_literal() +// OGCG: store i8 88, ptr %{{.*}}, align 1