From 498a01534a4ffe825f84fd1b6aecbde5f5fde09c Mon Sep 17 00:00:00 2001 From: _ov4 Date: Thu, 22 Oct 2026 15:04:13 +0000 Subject: fix(codegen): compare BOOLEAN and CHAR values as unsigned Co-Authored-By: Claude Sonnet 5.5 --- lib/CodeGen/ArithmeticHandler.cc | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) (limited to 'lib') diff --git a/lib/CodeGen/ArithmeticHandler.cc b/lib/CodeGen/ArithmeticHandler.cc index 6c7a7ff..3044687 100644 --- a/lib/CodeGen/ArithmeticHandler.cc +++ b/lib/CodeGen/ArithmeticHandler.cc @@ -100,6 +100,9 @@ Value *ArithmeticHandler::emitBinaryOp(int Op, Value *LHS, Value *RHS, int Line) HadError = true; return nullptr; } + // BOOLEAN (i1) and CHAR (i8) are unsigned: FALSE < TRUE and + // CHR(200) > CHR(65), which signed predicates would invert. + bool Unsigned = L->getType()->isIntegerTy(1) || L->getType()->isIntegerTy(8); switch (Op) { case '+': return Builder.CreateAdd(L, R, "addtmp"); case '-': return Builder.CreateSub(L, R, "subtmp"); @@ -107,10 +110,10 @@ Value *ArithmeticHandler::emitBinaryOp(int Op, Value *LHS, Value *RHS, int Line) case tok_eq: return Builder.CreateICmpEQ(L, R, "eqtmp"); case tok_ne: return Builder.CreateICmpNE(L, R, "netmp"); - case '<': return Builder.CreateICmpSLT(L, R, "slttmp"); - case '>': return Builder.CreateICmpSGT(L, R, "sgttmp"); - case tok_le: return Builder.CreateICmpSLE(L, R, "sletmp"); - case tok_ge: return Builder.CreateICmpSGE(L, R, "sgetmp"); + case '<': return Unsigned ? Builder.CreateICmpULT(L, R, "ulttmp") : Builder.CreateICmpSLT(L, R, "slttmp"); + case '>': return Unsigned ? Builder.CreateICmpUGT(L, R, "ugttmp") : Builder.CreateICmpSGT(L, R, "sgttmp"); + case tok_le: return Unsigned ? Builder.CreateICmpULE(L, R, "uletmp") : Builder.CreateICmpSLE(L, R, "sletmp"); + case tok_ge: return Unsigned ? Builder.CreateICmpUGE(L, R, "ugetmp") : Builder.CreateICmpSGE(L, R, "sgetmp"); } } -- cgit v1.3.1-4-g156e