From 077e16888454e79469490c84f2fffeda65612bbd Mon Sep 17 00:00:00 2001 From: flywind Date: Tue, 18 Jan 2022 20:01:43 +0800 Subject: [PATCH 1/3] fix term rewriting with sideeffect fix #6217 --- compiler/parampatterns.nim | 7 +++++-- tests/template/template_various.nim | 8 ++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/compiler/parampatterns.nim b/compiler/parampatterns.nim index eb99004ab3c1..bfbc7267588f 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/template_various.nim b/tests/template/template_various.nim index e7a2be748df7..2b900e27f531 100644 --- a/tests/template/template_various.nim +++ b/tests/template/template_various.nim @@ -145,8 +145,16 @@ block pattern_with_converter: doAssert floatDouble(5) == 10.0 +block pattern_with_sideeffect: + template optMul{`*`(a, 2)}(a: int{noSideEffect}): int = a+a + var i = 0 + proc f(): int = + i += 1 + result = 55 + doAssert f() * 2 == 110 + doAssert i == 1 block procparshadow: template something(name: untyped) = From ca5718d200e83211b4e4ead150dc4fe867a40a5c Mon Sep 17 00:00:00 2001 From: flywind Date: Tue, 18 Jan 2022 20:08:13 +0800 Subject: [PATCH 2/3] add tests --- tests/template/t6217.nim | 19 +++++++++++++++++++ tests/template/template_various.nim | 11 ----------- 2 files changed, 19 insertions(+), 11 deletions(-) create mode 100644 tests/template/t6217.nim diff --git a/tests/template/t6217.nim b/tests/template/t6217.nim new file mode 100644 index 000000000000..b27b61881dea --- /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" diff --git a/tests/template/template_various.nim b/tests/template/template_various.nim index 2b900e27f531..5b99eec9c86a 100644 --- a/tests/template/template_various.nim +++ b/tests/template/template_various.nim @@ -145,17 +145,6 @@ block pattern_with_converter: doAssert floatDouble(5) == 10.0 -block pattern_with_sideeffect: - template optMul{`*`(a, 2)}(a: int{noSideEffect}): int = a+a - - var i = 0 - proc f(): int = - i += 1 - result = 55 - - doAssert f() * 2 == 110 - doAssert i == 1 - block procparshadow: template something(name: untyped) = proc name(x: int) = From ab12de4314d887a5aafd6787e6d5f55921230812 Mon Sep 17 00:00:00 2001 From: flywind Date: Tue, 18 Jan 2022 20:10:23 +0800 Subject: [PATCH 3/3] Update tests/template/template_various.nim --- tests/template/template_various.nim | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/template/template_various.nim b/tests/template/template_various.nim index 5b99eec9c86a..e7a2be748df7 100644 --- a/tests/template/template_various.nim +++ b/tests/template/template_various.nim @@ -145,6 +145,9 @@ block pattern_with_converter: doAssert floatDouble(5) == 10.0 + + + block procparshadow: template something(name: untyped) = proc name(x: int) =