fix(ir): %= bileşik atama IR üretiminde eksikti (B8)
Teşhis (a): Sadece %= unutulmuş — +=, -=, *=, /= doğru çalışıyordu. PERCENT_EQUAL MOD opcode'una yönlendirildi; sıfıra mod runtime hatası zaten interpreter'da mevcut, yeni kod gerekmedi. CMakeLists.txt'e .runtime_error uzantısı eklendi (çalışma zamanı hatası golden testleri için; aynı run_golden_error.cmake altyapısı). Testler: compound_mod (17%5=2 zinciri) + mod_by_zero (runtime hata). 21/21 geçti. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
e5e0cdb2b3
commit
636bfcc6d5
|
|
@ -101,4 +101,18 @@ foreach(SQT_FILE ${ALL_GOLDEN_SQT})
|
|||
-P "${CMAKE_SOURCE_DIR}/cmake/run_golden_error.cmake"
|
||||
)
|
||||
endif()
|
||||
|
||||
# Negatif test: .runtime_error — çalışma zamanı hatası beklenen golden testler.
|
||||
# Aynı altyapı: exit code != 0 + stderr içeriği kontrolü.
|
||||
set(RUNTIME_ERROR_EXPECTED "${CMAKE_SOURCE_DIR}/tests/golden/${BASE}.runtime_error")
|
||||
if(EXISTS "${RUNTIME_ERROR_EXPECTED}")
|
||||
add_test(
|
||||
NAME "golden_${TNAME}_runtime_error"
|
||||
COMMAND ${CMAKE_COMMAND}
|
||||
-DBINARY=${SAQUT_BINARY}
|
||||
-DSOURCE=${SQT_FILE}
|
||||
-DEXPECTED=${RUNTIME_ERROR_EXPECTED}
|
||||
-P "${CMAKE_SOURCE_DIR}/cmake/run_golden_error.cmake"
|
||||
)
|
||||
endif()
|
||||
endforeach()
|
||||
|
|
|
|||
|
|
@ -376,12 +376,13 @@ int IRGenerator::generateExpression(ASTNode* node) {
|
|||
return varSlot;
|
||||
}
|
||||
|
||||
// Birleşik atama: += -= *= /=
|
||||
// x += y ≡ x = x + y
|
||||
if (bin->Operator == TokenType::PLUS_EQUAL ||
|
||||
bin->Operator == TokenType::MINUS_EQUAL ||
|
||||
bin->Operator == TokenType::STAR_EQUAL ||
|
||||
bin->Operator == TokenType::SLASH_EQUAL) {
|
||||
// Birleşik atama: += -= *= /= %=
|
||||
// x OP= y ≡ x = x OP y
|
||||
if (bin->Operator == TokenType::PLUS_EQUAL ||
|
||||
bin->Operator == TokenType::MINUS_EQUAL ||
|
||||
bin->Operator == TokenType::STAR_EQUAL ||
|
||||
bin->Operator == TokenType::SLASH_EQUAL ||
|
||||
bin->Operator == TokenType::PERCENT_EQUAL) {
|
||||
|
||||
auto* lhsId = (IdentifierNode*)bin->Left;
|
||||
std::string varName = lhsId->parserToken.token->token;
|
||||
|
|
@ -389,9 +390,10 @@ int IRGenerator::generateExpression(ASTNode* node) {
|
|||
int rhsSlot = generateExpression(bin->Right);
|
||||
|
||||
Opcode arithOp = Opcode::ADD;
|
||||
if (bin->Operator == TokenType::MINUS_EQUAL) arithOp = Opcode::SUB;
|
||||
else if (bin->Operator == TokenType::STAR_EQUAL) arithOp = Opcode::MUL;
|
||||
else if (bin->Operator == TokenType::SLASH_EQUAL) arithOp = Opcode::DIV;
|
||||
if (bin->Operator == TokenType::MINUS_EQUAL) arithOp = Opcode::SUB;
|
||||
else if (bin->Operator == TokenType::STAR_EQUAL) arithOp = Opcode::MUL;
|
||||
else if (bin->Operator == TokenType::SLASH_EQUAL) arithOp = Opcode::DIV;
|
||||
else if (bin->Operator == TokenType::PERCENT_EQUAL) arithOp = Opcode::MOD;
|
||||
|
||||
int resultSlot = freshSlot();
|
||||
emitBinaryOp(arithOp, resultSlot, varSlot, rhsSlot);
|
||||
|
|
|
|||
|
|
@ -0,0 +1,4 @@
|
|||
2
|
||||
1
|
||||
0
|
||||
2
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
// B8: %= bileşik atama doğru IR üretmeli.
|
||||
// Elle hesap: 17%5=2, 10%3=1, 0%4=0, zincir: 20+5=25-3=22*2=44/4=11%3=2
|
||||
|
||||
int main() {
|
||||
int a = 17;
|
||||
a %= 5;
|
||||
print(a); // 2
|
||||
|
||||
int b = 10;
|
||||
b %= 3;
|
||||
print(b); // 1
|
||||
|
||||
int c = 0;
|
||||
c %= 4;
|
||||
print(c); // 0
|
||||
|
||||
// Tüm bileşik atamalar zinciri (regresyon)
|
||||
int x = 20;
|
||||
x += 5; // 25
|
||||
x -= 3; // 22
|
||||
x *= 2; // 44
|
||||
x /= 4; // 11
|
||||
x %= 3; // 2
|
||||
print(x); // 2
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -0,0 +1 @@
|
|||
sıfıra bölme \(mod\)
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
// Runtime test: a %= 0 → çalışma zamanı sıfıra bölme hatası vermeli.
|
||||
|
||||
int main() {
|
||||
int a = 7;
|
||||
a %= 0;
|
||||
print(a);
|
||||
return 0;
|
||||
}
|
||||
Loading…
Reference in New Issue