diff options
| author | Xavier ASUS <xavi92psx@gmail.com> | 2019-10-18 00:31:54 +0200 |
|---|---|---|
| committer | Xavier ASUS <xavi92psx@gmail.com> | 2019-10-18 00:31:54 +0200 |
| commit | 268a53de823a6750d6256ee1fb1e7707b4b45740 (patch) | |
| tree | 42c1799a9a82b2f7d9790ee9fe181d72a7274751 /support/regression/tests/const.c | |
| download | sdcc-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.c | 52 |
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); +} |
