From 14f8dfc5a83df6f884e64eea89aa68a6b97e9e64 Mon Sep 17 00:00:00 2001
From: Rafael Ravedutti <rafael.r.ravedutti@fau.de>
Date: Mon, 3 Feb 2025 18:38:43 +0100
Subject: [PATCH] Fix issue with AugAssign

Signed-off-by: Rafael Ravedutti <rafael.r.ravedutti@fau.de>
---
 src/pairs/mapping/funcs.py | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/src/pairs/mapping/funcs.py b/src/pairs/mapping/funcs.py
index 6258aa1..16abbab 100644
--- a/src/pairs/mapping/funcs.py
+++ b/src/pairs/mapping/funcs.py
@@ -91,7 +91,6 @@ class BuildParticleIR(ast.NodeVisitor):
         self.ctx_symbols.update(symbols)
 
     def visit_Assign(self, node):
-        #print(ast.dump(node))
         assert len(node.targets) == 1, "Only one target is allowed on assignments!"
         lhs = self.visit(node.targets[0])
         rhs = self.visit(node.value)
@@ -104,15 +103,16 @@ class BuildParticleIR(ast.NodeVisitor):
 
     def visit_AugAssign(self, node):
         lhs = self.visit(node.target)
+        # We need a copy of the target object so it is properly visited during
+        # compiler analyses and transformations
+        lhs_copy = self.visit(node.target)
         rhs = self.visit(node.value)
         op_class = OperatorClass.from_type_list([lhs.type(), rhs.type()])
-        bin_op = op_class(self.sim, lhs, rhs, BuildParticleIR.get_binary_op(node.op))
+        bin_op = op_class(self.sim, lhs_copy, rhs, BuildParticleIR.get_binary_op(node.op))
 
-        if isinstance(lhs, UndefinedSymbol):
-            self.add_symbols({lhs.symbol_id: bin_op})
-            rhs.set_label(lhs.symbol_id)
-        else:
-            Assign(self.sim, lhs, bin_op)
+        assert not isinstance(lhs, UndefinedSymbol), \
+            f"Invalid AugAssign: symbol {lhs} not defined yet!"
+        Assign(self.sim, lhs, bin_op)
 
     def visit_BinOp(self, node):
         #print(ast.dump(node))
-- 
GitLab