diff options
author | flywind <xzsflywind@gmail.com> | 2022-01-19 19:37:30 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-01-19 12:37:30 +0100 |
commit | 5d34e81f2363e1de97916ac60b028b9a8b287a4b (patch) | |
tree | 12424f719874f262a415263b859963fee30f55b8 | |
parent | 23c4bbedcbf12a7ab87baefe589b472837d89dbf (diff) | |
download | Nim-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.nim | 7 | ||||
-rw-r--r-- | tests/template/t6217.nim | 19 |
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" |