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/valdiag/tests | |
| 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/valdiag/tests')
| -rw-r--r-- | support/valdiag/tests/bug-2773.c | 17 | ||||
| -rw-r--r-- | support/valdiag/tests/bug-895992.c | 34 | ||||
| -rw-r--r-- | support/valdiag/tests/bug-971834.c | 49 | ||||
| -rw-r--r-- | support/valdiag/tests/cflow.c | 26 | ||||
| -rw-r--r-- | support/valdiag/tests/const.c | 21 | ||||
| -rw-r--r-- | support/valdiag/tests/constantRange.c | 267 | ||||
| -rw-r--r-- | support/valdiag/tests/declafterstmt.c | 45 | ||||
| -rw-r--r-- | support/valdiag/tests/enum.c | 89 | ||||
| -rw-r--r-- | support/valdiag/tests/funcdec.c | 48 | ||||
| -rw-r--r-- | support/valdiag/tests/overflow.c | 61 | ||||
| -rw-r--r-- | support/valdiag/tests/pointers.c | 21 | ||||
| -rw-r--r-- | support/valdiag/tests/primtypes.c | 100 | ||||
| -rw-r--r-- | support/valdiag/tests/restrict.c | 63 | ||||
| -rw-r--r-- | support/valdiag/tests/static_assert.c | 19 | ||||
| -rw-r--r-- | support/valdiag/tests/struct.c | 115 | ||||
| -rw-r--r-- | support/valdiag/tests/structflexiblearray.c | 24 | ||||
| -rw-r--r-- | support/valdiag/tests/switch.c | 158 | ||||
| -rw-r--r-- | support/valdiag/tests/tentdecl.c | 127 | ||||
| -rw-r--r-- | support/valdiag/tests/typedef.c | 45 |
19 files changed, 1329 insertions, 0 deletions
diff --git a/support/valdiag/tests/bug-2773.c b/support/valdiag/tests/bug-2773.c new file mode 100644 index 0000000..7ccf7ab --- /dev/null +++ b/support/valdiag/tests/bug-2773.c @@ -0,0 +1,17 @@ +/* bug-2773.c + + Missing diagnostic on duplicate paramter name + */ + +#ifdef TEST1 +extern void *h2 (int g2, int g2); /* ERROR */ +#endif + +#ifdef TEST2 +int i; + +extern void *h (int g, int g) { /* ERROR */ + i = g; +} +#endif + diff --git a/support/valdiag/tests/bug-895992.c b/support/valdiag/tests/bug-895992.c new file mode 100644 index 0000000..24bf327 --- /dev/null +++ b/support/valdiag/tests/bug-895992.c @@ -0,0 +1,34 @@ + +/* bug-895992.c + + Life Range problem with + - uninitialized variable + - loop + - conditional block + */ + +#ifdef TEST1 +char p0; + +void wait (void); + +void foo(void) +{ + unsigned char number; + unsigned char start = 1; + unsigned char i; + + do + { + for (i = 1; i > 0 ; i--) + wait(); + if (start) + { + number = p0; + start = 0; + } + number--; /* WARNING(SDCC) */ + } + while (number != 0); +} +#endif diff --git a/support/valdiag/tests/bug-971834.c b/support/valdiag/tests/bug-971834.c new file mode 100644 index 0000000..27df123 --- /dev/null +++ b/support/valdiag/tests/bug-971834.c @@ -0,0 +1,49 @@ + +/* bug-971834.c + + Life Range problem with + - uninitialized variable + - loop + */ + +#ifdef TEST1 +unsigned char ttt = 2; + +short foo (void) +{ + unsigned short a; + a |= ttt; /* WARNING(SDCC || GCC) */ + return a; +} +#endif + + +#ifdef TEST2 +unsigned char ttt[] = {0xff, 1}; + +char foo (void) +{ + unsigned char a, i; + for (i = 0; i < sizeof(ttt); i++) + a |= ttt[i]; /* WARNING(SDCC) */ + return a; +} +#endif + +#ifdef TEST3 +unsigned char ttt[] = {0xff, 1}; +unsigned char b; + +char foo (void) +{ + unsigned char i, j; + unsigned char a; + for (j = 0; j < sizeof(ttt); j++) { + for (i = 0; i < sizeof(ttt); i++) { + a |= ttt[i]; /* WARNING(SDCC) */ + b = a; + } + } + return b; +} +#endif diff --git a/support/valdiag/tests/cflow.c b/support/valdiag/tests/cflow.c new file mode 100644 index 0000000..b584550 --- /dev/null +++ b/support/valdiag/tests/cflow.c @@ -0,0 +1,26 @@ + +int x; + +#ifdef TEST0 +void foo(void) +{ + while (1) ; +} +#endif + +#ifdef TEST1 +void foo(void) +{ + while (1) ; + x++; /* WARNING(SDCC) */ +} +#endif + +#ifdef TEST2 +void foo(void) +{ + int y=1; + while (y) ; /* WARNING(SDCC) */ + x++; /* WARNING(SDCC) */ +} +#endif diff --git a/support/valdiag/tests/const.c b/support/valdiag/tests/const.c new file mode 100644 index 0000000..5082081 --- /dev/null +++ b/support/valdiag/tests/const.c @@ -0,0 +1,21 @@ + +char a; +const char ca=2; +const char *pca; +char * const cpa=&a; + +void test(void) +{ + a = 1; +#ifdef TEST1 + ca = a; /* ERROR */ +#endif +#ifdef TEST2 + pca = &a; + *pca = 2; /* ERROR */ +#endif +#ifdef TEST3 + *cpa = 3; + cpa = &ca; /* ERROR */ +#endif +} diff --git a/support/valdiag/tests/constantRange.c b/support/valdiag/tests/constantRange.c new file mode 100644 index 0000000..8e4c793 --- /dev/null +++ b/support/valdiag/tests/constantRange.c @@ -0,0 +1,267 @@ +#include <stdint.h> + +volatile int8_t c; + +/* sorry about the uggly source, + but this way it can be the same as in the regression tests */ +#define ASSERT(x) c = (x) + + int8_t s8; +uint8_t u8; + + int16_t s16; +uint16_t u16; + + int32_t s32; +uint32_t u32; + +#ifdef TEST1 +void foo(void) +{ + ASSERT (! (INT8_MIN - 1 == s8)); /* WARNING */ + ASSERT (! (INT8_MAX + 1 == s8)); /* WARNING */ + ASSERT ( (INT8_MIN - 1 != s8)); /* WARNING */ + ASSERT ( (INT8_MAX + 1 != s8)); /* WARNING */ + ASSERT ( (INT8_MIN - 1 < s8)); /* WARNING */ + ASSERT (! (INT8_MAX < s8)); /* WARNING */ + ASSERT ( (INT8_MIN <= s8)); /* WARNING */ + ASSERT (! (INT8_MAX + 1 <= s8)); /* WARNING */ + ASSERT (! (INT8_MIN > s8)); /* WARNING */ + ASSERT ( (INT8_MAX + 1 > s8)); /* WARNING */ + ASSERT (! (INT8_MIN - 1 >= s8)); /* WARNING */ + ASSERT ( (INT8_MAX >= s8)); /* WARNING */ + + ASSERT (! ( 0 - 1 == u8)); /* WARNING */ + ASSERT (! (UINT8_MAX + 1 == u8)); /* WARNING */ + ASSERT ( ( 0 - 1 != u8)); /* WARNING */ + ASSERT ( (UINT8_MAX + 1 != u8)); /* WARNING */ + ASSERT ( ( 0 - 1 < u8)); /* WARNING */ + ASSERT (! (UINT8_MAX < u8)); /* WARNING */ + ASSERT ( ( 0 <= u8)); /* WARNING */ + ASSERT (! (UINT8_MAX + 1 <= u8)); /* WARNING */ + ASSERT (! ( 0 > u8)); /* WARNING */ + ASSERT ( (UINT8_MAX + 1 > u8)); /* WARNING */ + ASSERT (! ( 0 - 1 >= u8)); /* WARNING */ + ASSERT ( (UINT8_MAX >= u8)); /* WARNING */ + + /* force extension to long to avoid int (16 bit) overflow */ + ASSERT (! (INT16_MIN - 1L == s16)); /* WARNING */ + ASSERT (! (INT16_MAX + 1L == s16)); /* WARNING */ + ASSERT ( (INT16_MIN - 1L != s16)); /* WARNING */ + ASSERT ( (INT16_MAX + 1L != s16)); /* WARNING */ + ASSERT ( (INT16_MIN - 1L < s16)); /* WARNING */ + ASSERT (! (INT16_MAX < s16)); /* WARNING */ + ASSERT ( (INT16_MIN <= s16)); /* WARNING */ + ASSERT (! (INT16_MAX + 1L <= s16)); /* WARNING */ + ASSERT (! (INT16_MIN > s16)); /* WARNING */ + ASSERT ( (INT16_MAX + 1L > s16)); /* WARNING */ + ASSERT (! (INT16_MIN - 1L >= s16)); /* WARNING */ + ASSERT ( (INT16_MAX >= s16)); /* WARNING */ + + ASSERT (! ( 0 - 1L == u16)); /* WARNING */ + ASSERT (! (UINT16_MAX + 1L == u16)); /* WARNING */ + ASSERT ( ( 0 - 1L != u16)); /* WARNING */ + ASSERT ( (UINT16_MAX + 1L != u16)); /* WARNING */ + ASSERT ( ( 0 - 1L < u16)); /* WARNING */ + ASSERT (! (UINT16_MAX < u16)); /* WARNING */ + ASSERT ( ( 0 <= u16)); /* WARNING */ + ASSERT (! (UINT16_MAX + 1L <= u16)); /* WARNING */ + ASSERT (! ( 0 > u16)); /* WARNING */ + ASSERT ( (UINT16_MAX + 1L > u16)); /* WARNING */ + ASSERT (! ( 0 - 1L >= u16)); /* WARNING */ + ASSERT ( (UINT16_MAX >= u16)); /* WARNING */ + + /* sdcc can't hold a number (INT32_MIN - 1) or (INT32_MAX + 1), + there's no 'double' or 'long long' */ +/* ASSERT (! (INT32_MIN - 1 == s32)); */ +/* ASSERT (! (INT32_MAX + 1 == s32)); */ +/* ASSERT ( (INT32_MIN - 1 != s32)); */ +/* ASSERT ( (INT32_MAX + 1 != s32)); */ +/* ASSERT ( (INT32_MIN - 1 < s32)); */ + ASSERT (! (INT32_MAX < s32)); /* WARNING(SDCC) */ + ASSERT ( (INT32_MIN <= s32)); /* WARNING(SDCC) */ +/* ASSERT (! (INT32_MAX + 1 <= s32)); */ + ASSERT (! (INT32_MIN > s32)); /* WARNING(SDCC) */ +/* ASSERT ( (INT32_MAX + 1 > s32)); */ +/* ASSERT (! (INT32_MIN - 1 >= s32)); */ + ASSERT ( (INT32_MAX >= s32)); /* WARNING(SDCC) */ + + /* (0 - 1) wraps around to UINT32_MAX -> untestable */ +/* ASSERT (! ( 0 - 1 == u32)); */ +/* ASSERT (! (UINT32_MAX + 1 == u32)); */ +/* ASSERT ( ( 0 - 1 != u32)); */ +/* ASSERT ( (UINT32_MAX + 1 != u32)); */ +/* ASSERT ( ( 0 - 1 < u32)); */ + ASSERT (! (UINT32_MAX < u32)); /* WARNING(SDCC) */ + ASSERT ( ( 0 <= u32)); /* WARNING(SDCC) */ +/* ASSERT (! (UINT32_MAX + 1 <= u32)); */ + ASSERT (! ( 0 > u32)); /* WARNING(SDCC) */ +/* ASSERT ( (UINT32_MAX + 1 > u32)); */ +/* ASSERT (! ( 0 - 1 >= u32)); */ + ASSERT ( (UINT32_MAX >= u32)); /* WARNING(SDCC) */ +} +#endif + +#ifdef TEST2 +void foo(void) +{ + s8 = -129; /* WARNING */ + s8 = INT8_MIN; + s8 = UINT8_MAX; /* WARNING */ + s8 = 256; /* WARNING */ + + s8 = -129; /* WARNING */ + u8 = INT8_MIN; /* WARNING */ + u8 = UINT8_MAX; + u8 = 256; /* WARNING */ + + s16 = -32769L; /* WARNING */ + s16 = INT16_MIN; + s16 = UINT16_MAX; /* WARNING */ + s16 = 65536L; /* WARNING */ + + s16 = -32769L; /* WARNING */ + u16 = INT16_MIN; /* WARNING */ + u16 = UINT16_MAX; + u16 = 65536L; /* WARNING */ + + /* sdcc can't hold a number (INT32_MIN - 1) or (INT32_MAX + 1), + there's no 'double' or 'long long' */ + s32 = INT32_MIN; + s32 = UINT32_MAX; /* WARNING */ + + u32 = INT32_MIN; /* WARNING */ + u32 = UINT32_MAX; +} +#endif + +/* This test has been disabled. I don't think that signed/unsigned bool */ +/* is a valid type. -- EEP */ +#ifdef TEST3_DISABLED +#include <stdbool.h> + +void foo(void) +{ +#if defined(PORT_HOST) + volatile bool sb, ub; +#else + volatile signed bool sb; + volatile unsigned bool ub; +#endif + + sb = -2; + sb = -1; + sb = 0; + sb = 1; + + ub = -1; + ub = 0; + ub = 1; + ub = 2; + + ASSERT (! (-2 == sb)); /* WARNING(SDCC_mcs51|SDCC_ds390) */ + ASSERT ( (-1 == sb)); + ASSERT ( ( 0 == sb)); + ASSERT (! ( 1 == sb)); /* WARNING(SDCC_mcs51|SDCC_ds390) */ + + ASSERT ( (-2 != sb)); /* WARNING(SDCC_mcs51|SDCC_ds390) */ + ASSERT ( (-1 != sb)); + ASSERT ( ( 0 != sb)); + ASSERT ( ( 1 != sb)); /* WARNING(SDCC_mcs51|SDCC_ds390) */ + + ASSERT ( (-2 < sb)); /* WARNING(SDCC_mcs51|SDCC_ds390) */ + ASSERT ( (-1 < sb)); + ASSERT (! ( 0 < sb)); /* WARNING(SDCC_mcs51|SDCC_ds390) */ + + ASSERT ( (-1 <= sb)); /* WARNING(SDCC_mcs51|SDCC_ds390) */ + ASSERT ( ( 0 <= sb)); + ASSERT (! ( 1 <= sb)); /* WARNING(SDCC_mcs51|SDCC_ds390) */ + + ASSERT (! (-1 > sb)); /* WARNING(SDCC_mcs51|SDCC_ds390) */ + ASSERT ( ( 0 > sb)); + ASSERT ( ( 1 > sb)); /* WARNING(SDCC_mcs51|SDCC_ds390) */ + + ASSERT (! (-2 >= sb)); /* WARNING(SDCC_mcs51|SDCC_ds390) */ + ASSERT ( (-1 >= sb)); + ASSERT ( ( 0 >= sb)); /* WARNING(SDCC_mcs51|SDCC_ds390) */ + + + ASSERT (! (-1 == ub)); /* WARNING(SDCC) */ + ASSERT ( ( 0 == ub)); + ASSERT ( ( 1 == ub)); + ASSERT (! ( 2 == ub)); /* WARNING(SDCC_mcs51|SDCC_ds390) */ + + ASSERT ( (-1 != ub)); /* WARNING(SDCC) */ + ASSERT ( ( 0 != ub)); + ASSERT ( ( 1 != ub)); + ASSERT ( ( 2 != ub)); /* WARNING(SDCC_mcs51|SDCC_ds390) */ + + ASSERT ( (-1 < ub)); /* WARNING(SDCC) */ + ASSERT ( ( 0 < ub)); + ASSERT (! ( 1 < ub)); /* WARNING(SDCC_mcs51|SDCC_ds390) */ + + ASSERT ( ( 0 <= ub)); /* WARNING(SDCC) */ + ASSERT ( ( 1 <= ub)); + ASSERT (! ( 2 <= ub)); /* WARNING(SDCC_mcs51|SDCC_ds390) */ + + ASSERT (! ( 0 > ub)); /* WARNING(SDCC) */ + ASSERT ( ( 1 > ub)); + ASSERT ( ( 2 > ub)); /* WARNING(SDCC_mcs51|SDCC_ds390) */ + + ASSERT (! (-1 >= ub)); /* WARNING(SDCC) */ + ASSERT ( ( 0 >= ub)); + ASSERT ( ( 1 >= ub)); /* WARNING(SDCC_mcs51|SDCC_ds390) */ +} +#endif + +#ifdef TEST4 +void foo(void) +{ + volatile struct { + signed sb1:1; + signed sb3:3; + unsigned ub1:1; + unsigned ub3:3; + } str; + + str.sb1 = -2; /* WARNING */ + str.sb1 = -1; + str.sb1 = 1; /* WARNING */ + str.sb1 = 2; /* WARNING */ + + str.ub1 = -2; /* WARNING */ + str.ub1 = -1; /* WARNING */ + str.ub1 = 1; + str.ub1 = 2; /* WARNING */ + + str.sb3 = -5; /* WARNING */ + str.sb3 = -4; + str.sb3 = 7; /* WARNING */ + str.sb3 = 8; /* WARNING */ + + str.ub3 = -5; /* WARNING */ + str.ub3 = -4; /* WARNING */ + str.ub3 = 7; + str.ub3 = 8; /* WARNING */ + + ASSERT (! (-2 == str.sb1)); /* WARNING */ + ASSERT ( (-1 == str.sb1)); + ASSERT ( ( 0 == str.sb1)); + ASSERT (! ( 1 == str.sb1)); /* WARNING */ + + ASSERT (! (-1 == str.ub1)); /* WARNING(SDCC) */ + ASSERT ( ( 0 == str.ub1)); + ASSERT ( ( 1 == str.ub1)); + ASSERT (! ( 2 == str.ub1)); /* WARNING(SDCC) */ + + ASSERT (! (-5 == str.sb3)); /* WARNING */ + ASSERT ( (-4 == str.sb3)); + ASSERT ( ( 3 == str.sb3)); + ASSERT (! ( 4 == str.sb3)); /* WARNING */ + + ASSERT (! (-1 == str.ub3)); /* WARNING(SDCC) */ + ASSERT ( ( 0 == str.ub3)); + ASSERT ( ( 7 == str.ub3)); + ASSERT (! ( 8 == str.ub3)); /* WARNING(SDCC) */ +} +#endif diff --git a/support/valdiag/tests/declafterstmt.c b/support/valdiag/tests/declafterstmt.c new file mode 100644 index 0000000..51ce7ca --- /dev/null +++ b/support/valdiag/tests/declafterstmt.c @@ -0,0 +1,45 @@ +/* we are testing a C99 feature */ +#pragma std_c99 + +/* we do not care about unreferenced variables */ +#pragma disable_warning 85 + +#ifdef TEST1 +#pragma std_c89 +void test(void) +{ + int a = 0; + a++; + int b; +} /* ERROR */ /* declaration after statement within this block */ +#endif + +#ifdef TEST2 +void test(void) +{ + int a = 0; + a++; + int b; +} +#endif + +#ifdef TEST3 +void test(void) +{ + int a = 0; /* ERROR */ /* previously defined here */ + a++; + int a; /* ERROR */ /* duplicate symbol */ +} +#endif + +#ifdef TEST4 +void test(void) +{ + int a = 0; + a++; + int b; + { + int a; + } +} +#endif diff --git a/support/valdiag/tests/enum.c b/support/valdiag/tests/enum.c new file mode 100644 index 0000000..ac50ca1 --- /dev/null +++ b/support/valdiag/tests/enum.c @@ -0,0 +1,89 @@ + +#ifdef TEST1 +enum tag +{ + first, + second, + third +}; +#endif + +#ifdef TEST2 +enum tag +{ + first, /* IGNORE */ + second, + third, + first, /* ERROR */ + fourth +}; +#endif + + +#ifdef TEST3 +enum +{ + first, /* IGNORE */ + second, + third, + first, /* ERROR */ + fourth +}; +#endif + + +#ifdef TEST4 +enum +{ + first=1, + second, + third, +}; +#endif + + +#ifdef TEST5 +enum +{ + first=1.1, /* ERROR */ + second, + third, +}; +#endif + +#ifdef TEST6 +int second; /* IGNORE */ + +enum tag +{ + first, + second, /* ERROR */ + third +}; +#endif + +#ifdef TEST7 +enum tag /* IGNORE */ +{ + first, + second, + third +}; + +enum tag { /* ERROR */ + fourth, + fifth, + sixth +}; +#endif + +#ifdef TEST8 +enum tag x; /* IGNORE(GCC) */ + +enum tag +{ + first, + second, + third +}; +#endif diff --git a/support/valdiag/tests/funcdec.c b/support/valdiag/tests/funcdec.c new file mode 100644 index 0000000..c2e10bb --- /dev/null +++ b/support/valdiag/tests/funcdec.c @@ -0,0 +1,48 @@ + +#ifdef TEST1 +void foo(void); /* IGNORE */ +int foo(void) { } /* ERROR */ +#endif + +#ifdef TEST2 +void foo(void); /* IGNORE */ +void foo(int a) {a; } /* ERROR */ +#endif + + +#ifdef TEST3 +void foo(int); /* IGNORE */ +void foo(int a, int b) {a;b; } /* ERROR */ +#endif + +#ifdef TEST4 +void foo(int, int); /* IGNORE */ +void foo(int a) {a; } /* ERROR */ +#endif + +#if defined(__SDCC) && defined(__has_reentrant) +#define REENTRANT __reentrant +#define HAS_REENTRANT 1 +#else +#define REENTRANT +#define HAS_REENTRANT 0 +#endif + +#ifdef TEST5 +void foo(int, int) REENTRANT; /* IGNORE */ +#if HAS_REENTRANT +void foo(int a, int b) {a; b;} /* ERROR(SDCC && __has_reentrant && !SDCC_STACK_AUTO) */ +#endif +#endif + +#ifdef TEST6 +void foo(int a=1) /* ERROR */ +{ +} +#endif + +#ifdef TEST7 +void foo(static int a) /* ERROR */ +{ +} +#endif diff --git a/support/valdiag/tests/overflow.c b/support/valdiag/tests/overflow.c new file mode 100644 index 0000000..39ecbd3 --- /dev/null +++ b/support/valdiag/tests/overflow.c @@ -0,0 +1,61 @@ +volatile char c; +volatile unsigned char uc; +volatile int i; +volatile unsigned u; +volatile long l; +volatile unsigned long ul; + +#ifdef TEST0 +void foo(void) +{ + i = 10000 * 10000; /* WARNING(SDCC) */ + i = 0x4000 * 0x4000; /* WARNING(SDCC) */ +} +#endif + +#ifdef TEST1 +void foo(void) +{ + uc = 1 << 7; /* IGNORE(SDCC) */ // Gives a false warning (bug #2733) + + i = c << 10; + i = 1 << 10; + i = c << 16; /* WARNING(SDCC) */ + i = 1 << 16; /* WARNING(SDCC) */ + i = uc << 16; /* WARNING(SDCC) */ + + l = l << 31; + l = l << 32; /* WARNING(SDCC) */ /* IGNORE(GCC) */ + l = ul << 32; /* WARNING(SDCC) */ /* IGNORE(GCC) */ +} +#endif + + +#ifdef TEST2 +void foo(void) +{ + i = 1 >> 40; /* IGNORE(SDCC) */ /* WARNING(GCC) */ // Warning missing (bug #2734) + + i = uc >> 7; + i = 1 >> 7; + i = uc >> 8; /* WARNING(SDCC) */ +#if 0 + i = 1 >> 8; /* WARN___(SDCC) */ +#endif + +#if 0 + i = i >> 40; /* WARN___(GCC) */ +#endif + + i = u >> 15; + i = u >> 16; /* WARNING(SDCC) */ + +#if 0 + i = l >> 40; /* WARN___(GCC) */ +#endif + + i = ul >> 31; + i = ul >> 32; /* WARNING(SDCC) */ /* IGNORE(GCC) */ +} +#endif + diff --git a/support/valdiag/tests/pointers.c b/support/valdiag/tests/pointers.c new file mode 100644 index 0000000..16d71b1 --- /dev/null +++ b/support/valdiag/tests/pointers.c @@ -0,0 +1,21 @@ + +#ifdef TEST0 + +typedef void (*fptr1_t)(void); +typedef void (*fptr2_t)(int); + +fptr1_t fptr1; +fptr2_t fptr2; + +void *vp = 0; + +void testPtr(void) +{ + fptr1 = vp; /* WARNING */ + fptr2 = fptr1; /* IGNORE(GCC) */ + vp = fptr1; /* WARNING */ + fptr1 = (void *)0; +} + +#endif + diff --git a/support/valdiag/tests/primtypes.c b/support/valdiag/tests/primtypes.c new file mode 100644 index 0000000..c6dac5c --- /dev/null +++ b/support/valdiag/tests/primtypes.c @@ -0,0 +1,100 @@ +#ifdef TESTchar +char a; +#endif + +#ifdef TESTint +int a; +#endif + +#ifdef TESTlong +long a; +#endif + +#ifdef TESTshort +short a; +#endif + +#ifdef TESTintlong +long int a; +#endif + +#ifdef TESTintshort +short int a; +#endif + +#ifdef TESTsigned +signed a; +#endif + +#ifdef TESTunsigned +unsigned a; +#endif + +#ifdef TESTintsigned +signed int a; +#endif + +#ifdef TESTintunsigned +unsigned int a; +#endif + +#ifdef TESTfloat +float a; +#endif + +#ifdef TESTfloatsigned +signed float a; /* ERROR */ +#endif + +#ifdef TESTfloatunsigned +unsigned float a; /* ERROR */ +#endif + +#ifdef TESTfloatshort +short float a; /* ERROR */ +#endif + +#ifdef TESTfloatlong +long float a; /* ERROR */ +#endif + +#ifdef TESTdouble +double a; /* WARNING(SDCC) */ +#endif + +#ifdef TESTdoubleshort +short double a; /* ERROR */ +#endif + +#ifdef TESTdoublelong +long double a; /* WARNING(SDCC) */ +#endif + +#ifdef TESTdoublesigned +signed double a; /* ERROR */ +#endif + +#ifdef TESTdoubleunsigned +unsigned double a; /* ERROR */ +#endif + +#ifdef TESTbit +__bit a; /* ERROR(!__has_bit) */ +#endif + +#ifdef TESTsu1 +signed unsigned int a; /* ERROR */ +#endif + +#ifdef TESTsu2 +unsigned signed int a; /* ERROR */ +#endif + +#ifdef TESTsu3 +unsigned signed a; /* ERROR */ +#endif + +#ifdef TESTsu4 +signed unsigned a; /* ERROR */ +#endif + diff --git a/support/valdiag/tests/restrict.c b/support/valdiag/tests/restrict.c new file mode 100644 index 0000000..3dbcee3 --- /dev/null +++ b/support/valdiag/tests/restrict.c @@ -0,0 +1,63 @@ + +/* The restrict keyword can only qualify pointers to objects */ + +#ifdef TEST1_C99 +restrict a; /* ERROR */ +#endif + +#ifdef TEST2_C99 +restrict int a; /* ERROR */ +#endif + +#ifdef TEST3_C99 +restrict int a[10]; /* ERROR */ +#endif + +#ifdef TEST4_C99 +restrict int * a; /* ERROR */ +#endif + +#ifdef TEST5_C99 +restrict struct + { + int a; + int b; + } x; /* ERROR */ +#endif + +#ifdef TEST6_C99 +restrict int func(void) { /* ERROR */ + return 0; +} +#endif + +#ifdef TEST7_C99 +void func(restrict int x) { /* ERROR */ + x; /* IGNORE */ +} +#endif + +#ifdef TEST8_C99 +void func(void (*restrict p)(void)) { /* ERROR */ + p(); /* IGNORE */ +} +#endif + + +#ifdef TEST_GOOD1_C99 +int * restrict a; +#endif + +#ifdef TEST_GOOD2_C99 +int * func(int * restrict x) +{ + return x; +} +#endif + +#ifdef TEST_GOOD3_C99 +void func(int * restrict x) +{ + x; /* IGNORE */ +} +#endif diff --git a/support/valdiag/tests/static_assert.c b/support/valdiag/tests/static_assert.c new file mode 100644 index 0000000..c4a6254 --- /dev/null +++ b/support/valdiag/tests/static_assert.c @@ -0,0 +1,19 @@ +#pragma std_c11 + +#include <assert.h> + +/* C11 static_assert */ +#ifdef TEST1 +#pragma std_c11 +static_assert (1, "text"); +static_assert (0, "test"); /* WARNING */ +static_assert (1); /* ERROR */ +#endif + +/* C2X static_assert */ +#ifdef TEST2 +#pragma std_c2x +static_assert (1); +static_assert (0); /* WARNING */ +#endif + diff --git a/support/valdiag/tests/struct.c b/support/valdiag/tests/struct.c new file mode 100644 index 0000000..c7f4938 --- /dev/null +++ b/support/valdiag/tests/struct.c @@ -0,0 +1,115 @@ + +#ifdef TEST1 +struct tag { + int good1; + register int bad; /* ERROR */ + int good2; +} badstruct; /* IGNORE */ +#endif + +#ifdef TEST2 +struct tag { + int good1; + int bad; /* IGNORE */ + int bad; /* ERROR */ + int good2; +} badstruct; +#endif + +#ifdef TEST3a +struct tag { + int good1; + int bad:255; /* ERROR */ + int good2; +} badstruct; +#endif + +#ifdef TEST3b +struct tag { + int good1; + float badtype1 : 5; /* ERROR */ + int good2; + _Bool badwidth2 : 2; /* ERROR */ + int good3; + int badwidth2 : 17; /* ERROR */ + int good4; +} badstruct; +#endif + +#ifdef TEST4 +struct tag { + int good1; + int good2; +} goodstruct1; + +struct tag goodstruct2; +#endif + +#ifdef TEST5a +struct tag { + int good1; + int good2; +} goodstruct1; + +union tag badunion; /* ERROR */ +#endif + +#ifdef TEST5b +union tag { + int good1; + int good2; +} goodunion1; + +struct tag badstruct; /* ERROR */ +#endif + + +#ifdef TEST6 +struct linklist { + struct linklist *prev; + struct linklist *next; + int x; +} ll; +#endif + +#ifdef TEST7a +union tag { + struct tag *next; /* ERROR */ + int x; +} ll; +#endif + +#ifdef TEST7b +struct tag { + union tag *next; /* ERROR */ + int x; +} ll; +#endif + +#ifdef TEST8a +struct tag { + int a; /* IGNORE */ + struct { + int a; /* ERROR(SDCC) */ /* IGNORE(GCC) */ + int b; + }; +} ll; +#endif + +#ifdef TEST8b +struct tag { + int a; + struct { + int b; + int c; + }; +} ll; + +void test(void) +{ + ll.a = 1; + ll.b = 2; + ll.c = 3; +} + +#endif diff --git a/support/valdiag/tests/structflexiblearray.c b/support/valdiag/tests/structflexiblearray.c new file mode 100644 index 0000000..9f1c8e3 --- /dev/null +++ b/support/valdiag/tests/structflexiblearray.c @@ -0,0 +1,24 @@ + +#ifdef TEST1 +struct tag { + int good1; + int flex[]; /* ERROR */ + int good2; +} badstruct; +#endif + +#ifdef TEST2 +struct tag { + int flex[]; /* ERROR */ +} badstruct; +#endif + +#ifdef TEST3 +struct tag { + int good1; + struct tag2 { + int good2; + int flex[]; + } nestedstruct; /* ERROR(SDCC) */ +} badstruct; +#endif diff --git a/support/valdiag/tests/switch.c b/support/valdiag/tests/switch.c new file mode 100644 index 0000000..b9acd42 --- /dev/null +++ b/support/valdiag/tests/switch.c @@ -0,0 +1,158 @@ + +char x; + +/* Valid switch statement */ +#ifdef TEST1 +char foo(void) +{ + switch(x) + { + char y; + + case 0: + return 0; + case 1: + return 1; + default: + y = x+1; + return y; + } +} +#endif + +/* Error, duplicate cases */ +#ifdef TEST2 +char foo(void) +{ + switch(x) + { + char y; + + case 0: /* IGNORE */ + return 0; + case 1: + return 1; + case 0: /* ERROR */ + return 0; + default: + y = x; + return y; + } +} +#endif + +/* Error, more than one default */ +#ifdef TEST3 +char foo(void) +{ + switch(x) + { + char y; + + case 0: + return 0; + case 1: + return 1; + default: /* IGNORE */ + y = x; + return y; + default: /* ERROR */ + return 2; + } +} +#endif + +/* Warn about unreachable code */ +#ifdef TEST4 +char foo(void) +{ + switch(x) + { + char y; /* IGNORE */ + x++; /* WARNING(SDCC) */ + + case 0: + return 0; + case 1: + return 1; + default: + y = x; + return x; + } +} +#endif + +/* Warn about unreachable initializer */ +#ifdef TEST5 +char foo(void) +{ + switch(x) + { + char y=1; /* WARNING(SDCC) */ + + case 0: + return 0; + case 1: + return 1; + default: + return y; /* IGNORE */ + } +} +#endif + +/* Error, missing switch */ +#ifdef TEST6 +char foo(void) +{ + { + case 0: /* ERROR */ + return 0; + case 1: /* ERROR */ + return 1; + default: /* ERROR */ + return x; + } +} +#endif + +/* Error, switch condition must be integral */ +#ifdef TEST7 +char foo(void) +{ + float f; /* IGNORE */ + f=x; + switch(f) /* ERROR */ + { + char y; /* IGNORE */ + + case 0: + return 0; + case 1: + return 1; + default: + y = x; + return x; + } + return 0; +} +#endif + +/* Error, cases must be integral */ +#ifdef TEST8 +char foo(void) +{ + switch(x) + { + char y; /* IGNORE */ + + case 0.0: /* ERROR */ + return 0; + case 1: + return 1; + default: + y = x; + return x; + } +} +#endif + diff --git a/support/valdiag/tests/tentdecl.c b/support/valdiag/tests/tentdecl.c new file mode 100644 index 0000000..8b8e6b7 --- /dev/null +++ b/support/valdiag/tests/tentdecl.c @@ -0,0 +1,127 @@ + +#ifdef TEST0 +int a; +int a; +#endif + +#ifdef TEST1 +int a; /* IGNORE */ +char a; /* ERROR */ +#endif + +#ifdef TEST2 +int a; /* IGNORE */ +int *a; /* ERROR */ +#endif + +#ifdef TEST3 +int *a; /* IGNORE */ +int a[5]; /* ERROR */ +#endif + +/* array size must match */ + +#ifdef TEST4 +int a[4]; /* IGNORE */ +int a[5]; /* ERROR */ +#endif + +/* but it is legal to clarify */ +/* an incomplete type */ + +#ifdef TEST4b +int a[]; +int a[5]; +#endif + +/* type qualifier must match */ + +#ifdef TEST5 +int a; /* IGNORE */ +volatile int a; /* ERROR */ +#endif + +#ifdef TEST6 +int a; /* IGNORE */ +const int a; /* ERROR */ +#endif + +#ifdef TEST7 +int a=1; /* IGNORE */ +int a=2; /* ERROR */ +#endif + +#ifdef TEST7a +int a=1; +int a; +#endif + +#ifdef TEST8 +int a=1; /* IGNORE */ +int a=1; /* ERROR */ +#endif + +#if defined(__SDCC) +#define AT(x) __at x +#else +#define AT(x) +#endif + +#if defined(__has_xdata) +#define XDATA __xdata +#define DATA __data +#else +#define XDATA +#define DATA +#endif + +#ifdef TEST9 +#ifdef __SDCC +XDATA int a; /* IGNORE */ +DATA int a; /* IGNORE(SDCC && __has_xdata) */ // Should be error, see bug #2735. +#endif +#endif + +#ifdef TEST9b +#ifdef __SDCC +DATA int a; /* IGNORE */ +XDATA int a; /* ERROR(SDCC && __has_xdata) */ +#endif +#endif + +#ifdef TEST9c +#ifdef __SDCC +extern DATA int a; +DATA int a; +#endif +#endif + +#ifdef TEST9d +#ifdef __SDCC +extern XDATA int a; +XDATA int a; +#endif +#endif + +#ifdef TEST9e +#ifdef __SDCC +extern XDATA int a; /* IGNORE */ +DATA int a; /* ERROR(SDCC && __has_xdata) */ +#endif +#endif + +#ifdef TEST9f +#ifdef __SDCC +extern DATA int a; /* IGNORE */ +XDATA int a; /* ERROR(SDCC && __has_xdata) */ +#endif +#endif + +#ifdef TEST10 +#if defined(__SDCC) && defined(__has_xdata) +extern volatile XDATA AT(0) int a; /* IGNORE */ +volatile XDATA int a; /* ERROR(SDCC && __has_xdata) */ +#endif +#endif + +int validDeclaraction; /* to make sure this is never an empty source file */ diff --git a/support/valdiag/tests/typedef.c b/support/valdiag/tests/typedef.c new file mode 100644 index 0000000..a24cbcc --- /dev/null +++ b/support/valdiag/tests/typedef.c @@ -0,0 +1,45 @@ + +#ifdef TEST1 +typedef union { + long l; + float f; +} floatlong; + +char func(char floatlong) +{ + return floatlong; +} +#endif + +#ifdef TEST2 +typedef union { + long l; + float f; +} floatlong; + +long func(float x) +{ + typedef union { + float f2; + long l2; + char c[4]; + } floatlong; + floatlong fl; + + fl.f2=x; + return fl.l2; +} +#endif + +/* This is no longer an error in C11, so test with earlier standard. */ +/* Unfortunately, GCC seems to accept this regardless. */ +#ifdef TEST3_C99 +typedef int I; /* IGNORE */ +typedef int I; /* ERROR(SDCC) */ +#endif + +#ifdef TEST4 +typedef int I; /* IGNORE */ +typedef char I; /* ERROR */ +#endif + |
