fix term rewriting with sideeffect (#19410)

* fix term rewriting with sideeffect

fix #6217

* add tests

* Update tests/template/template_various.nim
This commit is contained in:
flywind 2022-01-19 19:37:30 +08:00 • committed by GitHub
commit 5d34e81f23
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 24 additions and 2 deletions

View file

@ -143,8 +143,11 @@ proc checkForSideEffects*(n: PNode): TSideEffectAnalysis =
let s = op.sym let s = op.sym
if sfSideEffect in s.flags: if sfSideEffect in s.flags:
return seSideEffect return seSideEffect
# assume no side effect: elif tfNoSideEffect in op.typ.flags:
result = seNoSideEffect result = seNoSideEffect
else:
# assume side effect:
result = seSideEffect
elif tfNoSideEffect in op.typ.flags: elif tfNoSideEffect in op.typ.flags:
# indirect call without side effects: # indirect call without side effects:
result = seNoSideEffect result = seNoSideEffect

19
tests/template/t6217.nim Normal file
View file

@ -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"