diff --git a/.run/spice.run.xml b/.run/spice.run.xml index 3b09fbe29..19b93f127 100644 --- a/.run/spice.run.xml +++ b/.run/spice.run.xml @@ -1,5 +1,5 @@ - + diff --git a/src/typechecker/TypeCheckerImplicit.cpp b/src/typechecker/TypeCheckerImplicit.cpp index 9944af524..4af0e6642 100644 --- a/src/typechecker/TypeCheckerImplicit.cpp +++ b/src/typechecker/TypeCheckerImplicit.cpp @@ -275,7 +275,11 @@ void TypeChecker::implicitlyCallStructDtor(SymbolTableEntry *entry, StmtLstNode void TypeChecker::doScopeCleanup(StmtLstNode *node) { // Get all variables, that are approved for deallocation std::vector vars = currentScope->getVarsGoingOutOfScope(); - for (SymbolTableEntry *var : std::ranges::reverse_view(vars)) { + // Sort by reverse declaration order + auto lambda = [](const SymbolTableEntry *a, const SymbolTableEntry *b) { return a->declNode->codeLoc > b->declNode->codeLoc; }; + std::ranges::sort(vars, lambda); + // Call dtor for each variable. We call the dtor in reverse declaration order + for (SymbolTableEntry *var : vars) { // Only generate dtor call for structs and if not omitted if (!var->getType().is(TY_STRUCT) || var->omitDtorCall) continue; diff --git a/test/test-files/irgenerator/lambdas/success-function-lambda/ir-code.ll b/test/test-files/irgenerator/lambdas/success-function-lambda/ir-code.ll index 9d98b59b5..a59dde611 100644 --- a/test/test-files/irgenerator/lambdas/success-function-lambda/ir-code.ll +++ b/test/test-files/irgenerator/lambdas/success-function-lambda/ir-code.ll @@ -59,8 +59,8 @@ define dso_local i32 @main() #0 { %18 = icmp eq i32 %17, 1 %19 = select i1 %18, i32 9, i32 12 %20 = call i32 (ptr, ...) @printf(ptr noundef @printf.str.4, i32 %19) - call void @_ZN6String4dtorEv(ptr %1) call void @_ZN6String4dtorEv(ptr %2) + call void @_ZN6String4dtorEv(ptr %1) %21 = load i32, ptr %result, align 4 ret i32 %21 } diff --git a/test/test-files/irgenerator/lambdas/success-procedure-lambda/ir-code.ll b/test/test-files/irgenerator/lambdas/success-procedure-lambda/ir-code.ll index 1ec173ca2..280fcc99d 100644 --- a/test/test-files/irgenerator/lambdas/success-procedure-lambda/ir-code.ll +++ b/test/test-files/irgenerator/lambdas/success-procedure-lambda/ir-code.ll @@ -47,8 +47,8 @@ define dso_local i32 @main() #0 { %9 = load %struct.String, ptr %2, align 8 %fct4 = load ptr, ptr %callbackWithArgs2, align 8 call void %fct4(%struct.String %9, i1 false) - call void @_ZN6String4dtorEv(ptr %1) call void @_ZN6String4dtorEv(ptr %2) + call void @_ZN6String4dtorEv(ptr %1) %10 = load i32, ptr %result, align 4 ret i32 %10 }