summaryrefslogtreecommitdiff
path: root/support/regression/tests/const.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/const.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/const.c')
-rw-r--r--support/regression/tests/const.c52
1 files changed, 52 insertions, 0 deletions
diff --git a/support/regression/tests/const.c b/support/regression/tests/const.c
new file mode 100644
index 0000000..90470f1
--- /dev/null
+++ b/support/regression/tests/const.c
@@ -0,0 +1,52 @@
+/* Tests usage of const qualifier.
+ */
+#include <testfwk.h>
+
+char k; /* char */
+const char const_char = 123; /* constant char */
+const char * const_char_ptr; /* pointer to constant char */
+char * const char_ptr_const = &k; /* constant pointer to char */
+const char * const const_char_ptr_const = &const_char;
+ /* constant pointer to constant char */
+char char_array[3]; /* array of char */
+const char const_char_array[] = {1,2,3}; /* array of constant char */
+const char ** const_char_ptr_ptr; /* pointer to pointer to constant char */
+
+char
+ident(char x)
+{
+ return x;
+}
+
+void
+testConst(void)
+{
+ /* Since const_char_ptr is in itself not constant, we can change it */
+ const_char_ptr = const_char_array;
+ const_char_ptr++;
+ ASSERT(*const_char_ptr == 2);
+
+ /* Check for bug #621531 */
+ const_char_ptr = const_char_array;
+ ASSERT(const_char_ptr[0] == 1);
+ const_char_ptr++;
+
+ /* Since char_ptr_const is constant, we cannot change it. However, */
+ /* we can change the object that it points to. */
+ *char_ptr_const = 5;
+ ASSERT(ident(*char_ptr_const)==5);
+ (*char_ptr_const)++;
+ ASSERT(ident(*char_ptr_const)==6);
+
+ /* We can't modify const_char_ptr_const or the object that it points */
+ /* to. Unfortunately, we can't test that compiler enforces these */
+ /* restriction, so just verify its initialization. */
+ ASSERT(*const_char_ptr_const == const_char);
+
+ /* We can change const_char_ptr_ptr or the object that it points to. */
+ const_char_ptr = const_char_array;
+ const_char_ptr_ptr = &const_char_ptr;
+ ASSERT(ident(**const_char_ptr_ptr)==1);
+ (*const_char_ptr_ptr)++;
+ ASSERT(ident(**const_char_ptr_ptr)==2);
+}