diff --git a/samples/Fibonacci.Loop/Fibonacci.Loop.tdl b/samples/Fibonacci.Loop/Fibonacci.Loop.tdl
index 35d9491..0800e79 100644
--- a/samples/Fibonacci.Loop/Fibonacci.Loop.tdl
+++ b/samples/Fibonacci.Loop/Fibonacci.Loop.tdl
@@ -13,8 +13,7 @@ int fibonacci(int i) {
let a = 1;
let b = 1;
- while i > 2 {
- --i
+ while i-- > 2 {
const c = a + b;
a = b;
b = c;
diff --git a/samples/Fibonacci.Loop/Fibonacci.Loop.tdlproj b/samples/Fibonacci.Loop/Fibonacci.Loop.tdlproj
index a69c6ed..dd4b568 100644
--- a/samples/Fibonacci.Loop/Fibonacci.Loop.tdlproj
+++ b/samples/Fibonacci.Loop/Fibonacci.Loop.tdlproj
@@ -1,6 +1,6 @@
Exe
- net6.0
+ net8.0
diff --git a/src/Todl.Compiler.Tests/TestUtils.cs b/src/Todl.Compiler.Tests/TestUtils.cs
index 10e840b..0c42891 100644
--- a/src/Todl.Compiler.Tests/TestUtils.cs
+++ b/src/Todl.Compiler.Tests/TestUtils.cs
@@ -52,11 +52,11 @@ internal static TBoundMember BindMember(
internal static void EmitExpressionAndVerify(string input, params TestInstruction[] expectedInstructions)
{
- var boundExpression = BindExpression(input);
- boundExpression.GetDiagnostics().Should().BeEmpty();
+ var boundExpressionStatement = BindStatement(input);
+ boundExpressionStatement.GetDiagnostics().Should().BeEmpty();
var emitter = new TestEmitter();
- emitter.EmitExpression(boundExpression);
+ emitter.EmitStatement(boundExpressionStatement);
emitter.Emit();
emitter.ILProcessor.Body.Instructions.ShouldHaveExactInstructionSequence(expectedInstructions);
diff --git a/src/Todl.Compiler/CodeGeneration/Emitter.Expressions.cs b/src/Todl.Compiler/CodeGeneration/Emitter.Expressions.cs
index ffd6eeb..6feb468 100644
--- a/src/Todl.Compiler/CodeGeneration/Emitter.Expressions.cs
+++ b/src/Todl.Compiler/CodeGeneration/Emitter.Expressions.cs
@@ -20,7 +20,7 @@ internal partial class InstructionEmitter
&& m.GetParameters().Length == 2
&& m.GetParameters()[0].ParameterType.Equals(typeof(string)));
- public void EmitExpression(BoundExpression boundExpression, bool emitSideEffect = false)
+ public void EmitExpression(BoundExpression boundExpression)
{
switch (boundExpression)
{
@@ -37,7 +37,7 @@ public void EmitExpression(BoundExpression boundExpression, bool emitSideEffect
EmitTodlFunctionCallExpression(boundTodlFunctionCallExpression);
return;
case BoundUnaryExpression boundUnaryExpression:
- EmitUnaryExpression(boundUnaryExpression, emitSideEffect);
+ EmitUnaryExpression(boundUnaryExpression, true);
return;
case BoundBinaryExpression boundBinaryExpression:
EmitBinaryExpression(boundBinaryExpression);
@@ -274,7 +274,7 @@ private void EmitTodlFunctionCallExpression(BoundTodlFunctionCallExpression boun
{
foreach (var argument in boundTodlFunctionCallExpression.BoundArguments.Values)
{
- EmitExpression(argument, true);
+ EmitExpression(argument);
}
var methodReference = ResolveMethodReference(boundTodlFunctionCallExpression);
@@ -418,7 +418,7 @@ private void EmitStore(BoundExpression left, Action assignmentAction)
if (left is BoundMemberAccessExpression boundMemberAccessExpression
&& !boundMemberAccessExpression.IsStatic)
{
- EmitExpression(boundMemberAccessExpression.BoundBaseExpression, true);
+ EmitExpression(boundMemberAccessExpression.BoundBaseExpression);
}
assignmentAction();
@@ -489,7 +489,7 @@ private void EmitAssignmentExpression(BoundAssignmentExpression boundAssignmentE
{
EmitStore(boundAssignmentExpression.Left, () =>
{
- EmitExpression(boundAssignmentExpression.Right, true);
+ EmitExpression(boundAssignmentExpression.Right);
switch (boundAssignmentExpression.Operator.BoundAssignmentOperatorKind)
{
diff --git a/src/Todl.Compiler/CodeGeneration/Emitter.Statements.cs b/src/Todl.Compiler/CodeGeneration/Emitter.Statements.cs
index ea4f51d..9473dd7 100644
--- a/src/Todl.Compiler/CodeGeneration/Emitter.Statements.cs
+++ b/src/Todl.Compiler/CodeGeneration/Emitter.Statements.cs
@@ -19,7 +19,7 @@ public void EmitStatement(BoundStatement boundStatement)
EmitReturnStatement(boundReturnStatement);
return;
case BoundExpressionStatement boundExpressionStatement:
- EmitExpression(boundExpressionStatement.Expression);
+ EmitExpressionStatement(boundExpressionStatement);
return;
case BoundConditionalStatement boundConditionalStatement:
EmitConditionalStatement(boundConditionalStatement);
@@ -35,6 +35,18 @@ public void EmitStatement(BoundStatement boundStatement)
}
}
+ private void EmitExpressionStatement(BoundExpressionStatement boundExpressionStatement)
+ {
+ // standalone a++ shouldn't trigger side effect
+ if (boundExpressionStatement.Expression is BoundUnaryExpression boundUnaryExpression)
+ {
+ EmitUnaryExpression(boundUnaryExpression, false);
+ return;
+ }
+
+ EmitExpression(boundExpressionStatement.Expression);
+ }
+
private void EmitBlockStatement(BoundBlockStatement boundBlockStatement)
{
foreach (var statement in boundBlockStatement.Statements)
@@ -84,7 +96,7 @@ private void EmitVariableDeclarationStatement(BoundVariableDeclarationStatement
if (boundVariableDeclarationStatement.InitializerExpression is not null)
{
- EmitExpression(boundVariableDeclarationStatement.InitializerExpression, true);
+ EmitExpression(boundVariableDeclarationStatement.InitializerExpression);
EmitLocalStore(variableDefinition);
}
}