aboutsummaryrefslogtreecommitdiff
path: root/contrib/bmake/unit-tests/directive-for-break.mk
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/bmake/unit-tests/directive-for-break.mk')
-rw-r--r--contrib/bmake/unit-tests/directive-for-break.mk66
1 files changed, 66 insertions, 0 deletions
diff --git a/contrib/bmake/unit-tests/directive-for-break.mk b/contrib/bmake/unit-tests/directive-for-break.mk
new file mode 100644
index 000000000000..d9290d38c215
--- /dev/null
+++ b/contrib/bmake/unit-tests/directive-for-break.mk
@@ -0,0 +1,66 @@
+# $NetBSD: directive-for-break.mk,v 1.5 2023/06/01 20:56:35 rillig Exp $
+#
+# Tests for .break in .for loops, which immediately terminates processing of
+# the surrounding .for loop.
+
+
+# .break terminates the loop early.
+# This is usually done within a conditional.
+.for i in 1 2 3 4 5 6 7 8
+. if $i == 3
+I= $i
+. break
+I= unreached
+. endif
+.endfor
+.if $I != "3"
+. error
+.endif
+
+
+# The .break only breaks out of the immediately surrounding .for loop, any
+# other .for loops are continued normally.
+.for outer in o1 o2 o3
+. for inner in i1 i2 i3
+. if ${outer} == o2 && ${inner} == i2
+. break
+. endif
+COMBINED+= ${outer}-${inner}
+. endfor
+.endfor
+# Only o2-i2 and o2-i3 are missing.
+.if ${COMBINED} != "o1-i1 o1-i2 o1-i3 o2-i1 o3-i1 o3-i2 o3-i3"
+. error
+.endif
+
+
+# A .break outside the context of a .for loop is an error.
+.if $I == 0
+# No parse error, even though the .break occurs outside a .for loop, since
+# lines from inactive branches are only parsed as far as necessary to see
+# whether they belong to an .if/.elif/.else/.endif chain.
+. break
+.else
+# expect+1: break outside of for loop
+. break
+.endif
+
+
+# Since cond.c 1.335 from 2022-09-02 and before cond.c 1.338 from 2022-09-23,
+# the following paragraph generated the wrong error message '4294967294 open
+# conditionals'.
+.if 1
+. if 2
+. for var in value
+. if 3
+. break
+. endif
+. endfor
+. endif
+.endif
+
+
+.for i in 1
+# expect+1: The .break directive does not take arguments
+. break 1
+.endfor