summaryrefslogtreecommitdiff
path: root/support/regression/tests/switch.c
diff options
context:
space:
mode:
authorXavier ASUS <xavi92psx@gmail.com>2019-10-18 00:31:54 +0200
committerXavier ASUS <xavi92psx@gmail.com>2019-10-18 00:31:54 +0200
commit268a53de823a6750d6256ee1fb1e7707b4b45740 (patch)
tree42c1799a9a82b2f7d9790ee9fe181d72a7274751 /support/regression/tests/switch.c
downloadsdcc-gas-268a53de823a6750d6256ee1fb1e7707b4b45740.tar.gz
sdcc-3.9.0 fork implementing GNU assembler syntax
This fork aims to provide better support for stm8-binutils
Diffstat (limited to 'support/regression/tests/switch.c')
-rw-r--r--support/regression/tests/switch.c154
1 files changed, 154 insertions, 0 deletions
diff --git a/support/regression/tests/switch.c b/support/regression/tests/switch.c
new file mode 100644
index 0000000..ec46204
--- /dev/null
+++ b/support/regression/tests/switch.c
@@ -0,0 +1,154 @@
+/* Test the types of switch statement.
+
+ type: char, int, long
+ sign: signed, unsigned
+ storage: static,
+ attr: volatile
+ */
+#include <testfwk.h>
+
+{sign} {type}
+sparseSwitch({sign} {type} val)
+{
+ {sign} {type} ret;
+ {storage} {attr} {sign} {type} local;
+
+ local = val;
+
+ switch (local) {
+ case 1:
+ ret = 7;
+ break;
+ case 4:
+ ret = 12;
+ break;
+ case 6:
+ ret = 13;
+ /* Fall through */
+ case 12:
+ ret = 14;
+ break;
+ case 13:
+ case 14:
+ case 15:
+ ret = 19;
+ break;
+ default:
+ ret = 30;
+ }
+
+ return ret;
+}
+
+void
+testSparseSwitch(void)
+{
+ ASSERT(sparseSwitch(1) == 7);
+ ASSERT(sparseSwitch(4) == 12);
+ ASSERT(sparseSwitch(6) == 14);
+ ASSERT(sparseSwitch(12) == 14);
+ ASSERT(sparseSwitch(13) == 19);
+#ifndef __SDCC_pdk14 // Lack of memory
+ ASSERT(sparseSwitch(14) == 19);
+ ASSERT(sparseSwitch(15) == 19);
+ ASSERT(sparseSwitch(19) == 30);
+ ASSERT(sparseSwitch(0) == 30);
+#endif
+}
+
+#ifndef __SDCC_pdk14 // Lack of memory
+{sign} {type}
+denseSwitch({sign} {type} val)
+{
+ {sign} {type} ret;
+ {storage} {attr} {sign} {type} local;
+
+ local = val;
+ ret = 12;
+
+ switch (local) {
+ case 0:
+ ret = 1;
+ break;
+ case 1:
+ ret = 14;
+ break;
+ case 2:
+ ret = 15;
+ break;
+ case 3:
+ ret = 34;
+ break;
+ case 4:
+ ret = 17;
+ break;
+ /* No default */
+ }
+
+ return ret;
+}
+#endif
+
+void
+testDenseSwitch(void)
+{
+#ifndef __SDCC_pdk14 // Lack of memory
+ ASSERT(denseSwitch(0) == 1);
+ ASSERT(denseSwitch(1) == 14);
+ ASSERT(denseSwitch(2) == 15);
+ ASSERT(denseSwitch(3) == 34);
+ ASSERT(denseSwitch(4) == 17);
+ ASSERT(denseSwitch(5) == 12);
+ ASSERT(denseSwitch(100) == 12);
+#endif
+}
+
+void
+testDenseIntSwitch(void)
+{
+#ifndef __SDCC_pdk14 // Lack of memory
+ volatile int val = 1000;
+ volatile int ret = 0;
+
+ switch (val) {
+ case 999:
+ ret = 5;
+ break;
+ case 1000:
+ ret = 6;
+ break;
+ case 1001:
+ ret = 7;
+ break;
+ case 1002:
+ ret = 12;
+ break;
+ case 1003:
+ ret = 14;
+ break;
+ }
+
+ ASSERT(ret == 6);
+
+ val = 129;
+
+ switch (val) {
+ case 126:
+ ret = 5;
+ break;
+ case 127:
+ ret = 6;
+ break;
+ case 128:
+ ret = 7;
+ break;
+ case 129:
+ ret = 8;
+ break;
+ default:
+ ret = 9;
+ }
+
+ ASSERT(ret == 8);
+#endif
+}