summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorflywind <xzsflywind@gmail.com>2022-01-19 19:37:30 +0800
committerGitHub <noreply@github.com>2022-01-19 12:37:30 +0100
commit5d34e81f2363e1de97916ac60b028b9a8b287a4b (patch)
tree12424f719874f262a415263b859963fee30f55b8
parent23c4bbedcbf12a7ab87baefe589b472837d89dbf (diff)
downloadNim-5d34e81f2363e1de97916ac60b028b9a8b287a4b.tar.gz
fix term rewriting with sideeffect (#19410)
* fix term rewriting with sideeffect

fix #6217

* add tests

* Update tests/template/template_various.nim
-rw-r--r--compiler/parampatterns.nim7
-rw-r--r--tests/template/t6217.nim19
2 files changed, 24 insertions, 2 deletions
diff --git a/compiler/parampatterns.nim b/compiler/parampatterns.nim
index eb99004ab..bfbc72675 100644
--- a/compiler/parampatterns.nim
+++ b/compiler/parampatterns.nim
@@ -143,8 +143,11 @@ proc checkForSideEffects*(n: PNode): TSideEffectAnalysis =
       let s = op.sym
       if sfSideEffect in s.flags:
         return seSideEffect
-      # assume no side effect:
-      result = seNoSideEffect
+      elif tfNoSideEffect in op.typ.flags:
+        result = seNoSideEffect
+      else:
+        # assume side effect:
+        result = seSideEffect
     elif tfNoSideEffect in op.typ.flags:
       # indirect call without side effects:
       result = seNoSideEffect
diff --git a/tests/template/t6217.nim b/tests/template/t6217.nim
new file mode 100644
index 000000000..b27b61881
--- /dev/null
+++ b/tests/template/t6217.nim
@@ -0,0 +1,19 @@
+discard """
+  output: '''
+start
+side effect!
+end
+'''
+"""
+
+# bug #6217
+
+template optMul{`*`(a, 2)}(a: int{noSideEffect}): int = a+a
+
+proc f(): int =
+  echo "side effect!"
+  result = 55
+
+echo "start"
+doAssert f() * 2 == 110
+echo "end"