summaryrefslogtreecommitdiff
path: root/support/regression/tests/bug-2807.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/bug-2807.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/bug-2807.c')
-rw-r--r--support/regression/tests/bug-2807.c73
1 files changed, 73 insertions, 0 deletions
diff --git a/support/regression/tests/bug-2807.c b/support/regression/tests/bug-2807.c
new file mode 100644
index 0000000..a2e61a8
--- /dev/null
+++ b/support/regression/tests/bug-2807.c
@@ -0,0 +1,73 @@
+/* bug-2807.c
+ Overwritten operand in code generation for division.
+ */
+
+#include <testfwk.h>
+
+#include <stdint.h>
+
+typedef struct
+{
+ uint8_t interval;
+ uint8_t duration;
+}
+Buzzer_request;
+
+typedef struct
+{
+ const Buzzer_request* request;
+ uint8_t state;
+}
+Buzzer;
+
+int f(const char *c)
+{
+ static int truecount;
+
+ if(*c == 't')
+ truecount++;
+
+ ASSERT(truecount <= 1);
+
+ return (0);
+}
+
+void Buzzer_tick(Buzzer* const self)
+{
+ const Buzzer_request* const request = self->request;
+
+ const uint8_t state = self->state + 1U;
+
+ self->state = state;
+
+ if(request->duration && (state < request->duration))
+ {
+ f("stop\n");
+ }
+ else if (request->interval)
+ {
+ if ((state % request->interval) == 0U)
+ {
+ // This if statement is always true due to overwritten request->interval.
+ if((state / request->interval) % 2U)
+ {
+ f("true\n");
+ }
+ else
+ {
+ f("false\n");
+ }
+ }
+ }
+}
+
+
+void testBuzzer(void)
+{
+ Buzzer_request request = { 1, 0 };
+ Buzzer buzzer = { &request, 0 };
+
+ Buzzer_tick(&buzzer);
+ Buzzer_tick(&buzzer);
+}
+