diff options
| author | Al Viro <viro@ftp.linux.org.uk> | 2009-03-09 07:12:18 +0000 |
|---|---|---|
| committer | Christopher Li <sparse@chrisli.org> | 2009-07-17 23:06:23 +0000 |
| commit | 319206abe1f2b2981f0912336a2859039bea0e2c (patch) | |
| tree | 5e056496be0660cd3ac84a9833ef02e9ec1e77df /validation | |
| parent | 9abb0964fc1963b6ab3d7580c43078648519368f (diff) | |
| download | sparse-dev-319206abe1f2b2981f0912336a2859039bea0e2c.tar.gz | |
Rewrite and fix specifiers handling
Make sure that we accept the right set; kill ad-hackery around checks
for banned combinations. Instead of that we keep a bitmap describing
what we'd already seen (with several extra bits for 'long long' and
for keeping track of can't-combine-with-anything stuff), check and
update it using the values in ..._op and keep track of size modifiers
more or less explicitly.
Testcases added. A _lot_ of that used to be done wrong.
Note that __attribute__((mode(...))) got more broken by this one;
the next several changesets will take care of that.
One more thing: we are -><- close to getting rid of MOD_SPECIFIER bits
for good.
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Christopher Li <sparse@chrisli.org>
Diffstat (limited to 'validation')
| -rw-r--r-- | validation/specifiers1.c | 101 | ||||
| -rw-r--r-- | validation/specifiers2.c | 152 |
2 files changed, 253 insertions, 0 deletions
diff --git a/validation/specifiers1.c b/validation/specifiers1.c new file mode 100644 index 00000000..86db45dc --- /dev/null +++ b/validation/specifiers1.c @@ -0,0 +1,101 @@ +static void OK(void) +{ +#define TEST(x) { T a; x *b = &a; } +#define TEST2(x, y) TEST(x y) TEST(y x) +#define TEST3(x, y, z) TEST(x y z) TEST(x z y) TEST(y x z) \ + TEST(y z x) TEST(z x y) TEST(z y x) +#define TEST4(x, y, z, w) TEST2(x y, z w) TEST2(x y, w z) \ + TEST2(y x, z w) TEST2(y x, w z) \ + TEST2(x z, y w) TEST2(x z, w y) \ + TEST2(z x, y w) TEST2(z x, w y) \ + TEST2(x w, y z) TEST2(x w, z y) \ + TEST2(w x, y z) TEST2(w x, z y) + + +#define T char +TEST(char) +#undef T + +#define T signed char +TEST2(char, signed) +#undef T + +#define T unsigned char +TEST2(char, unsigned) +#undef T + +#define T short +TEST(short) +TEST2(int, short) +#undef T + +#define T int +TEST(int) +#undef T + +#define T long +TEST(long) +TEST2(int, long) +#undef T + +#define T long long +TEST2(long, long) +TEST3(int, long, long) +#undef T + +#define T signed short +TEST2(short, signed) +TEST3(int, short, signed) +#undef T + +#define T signed +TEST(signed) +TEST2(int, signed) +#undef T + +#define T signed long +TEST2(long, signed) +TEST3(int, long, signed) +#undef T + +#define T signed long long +TEST3(long, long, signed) +TEST4(int, long, long, signed) +#undef T + +#define T unsigned short +TEST2(short, unsigned) +TEST3(int, short, unsigned) +#undef T + +#define T unsigned +TEST(unsigned) +TEST2(int, unsigned) +#undef T + +#define T unsigned long +TEST2(long, unsigned) +TEST3(int, long, unsigned) +#undef T + +#define T unsigned long long +TEST3(long, long, unsigned) +TEST4(int, long, long, unsigned) +#undef T + +#define T float +TEST(float) +#undef T + +#define T double +TEST(double) +#undef T + +#define T long double +TEST2(double, long) +#undef T +} +/* + * check-name: valid specifier combinations + * check-command: sparse -Wall $file + */ diff --git a/validation/specifiers2.c b/validation/specifiers2.c new file mode 100644 index 00000000..d5be118b --- /dev/null +++ b/validation/specifiers2.c @@ -0,0 +1,152 @@ +typedef int T; +void BAD( +char char, +char int, +char double, +char float, +char long, +char short, +int char, +int int, +int double, +int float, +double char, +double int, +double double, +double float, +double short, +double signed, +double unsigned, +float char, +float int, +float double, +float float, +float short, +float long, +float signed, +float unsigned, +short char, +short double, +short float, +short short, +short long, +long char, +long float, +long short, +signed double, +signed float, +signed signed, +signed unsigned, +unsigned double, +unsigned float, +unsigned signed, +unsigned unsigned, +unsigned signed, +long long long, +long double long, +long long double, +double long long, +T char, +T int, +T double, +T float, +T short, +T long, +T signed, +T unsigned, +T void, +void char, +void int, +void double, +void float, +void short, +void long, +void signed, +void unsigned, +char void, +int void, +double void, +float void, +short void, +long void, +signed void, +unsigned void, +void void +); +/* + * check-name: invalid specifier combinations + * check-error-start +specifiers2.c:3:6: error: two or more data types in declaration specifiers +specifiers2.c:4:6: error: two or more data types in declaration specifiers +specifiers2.c:5:6: error: two or more data types in declaration specifiers +specifiers2.c:6:6: error: two or more data types in declaration specifiers +specifiers2.c:7:6: error: impossible combination of type specifiers: char long +specifiers2.c:8:6: error: impossible combination of type specifiers: char short +specifiers2.c:9:5: error: two or more data types in declaration specifiers +specifiers2.c:10:5: error: two or more data types in declaration specifiers +specifiers2.c:11:5: error: two or more data types in declaration specifiers +specifiers2.c:12:5: error: two or more data types in declaration specifiers +specifiers2.c:13:8: error: two or more data types in declaration specifiers +specifiers2.c:14:8: error: two or more data types in declaration specifiers +specifiers2.c:15:8: error: two or more data types in declaration specifiers +specifiers2.c:16:8: error: two or more data types in declaration specifiers +specifiers2.c:17:8: error: impossible combination of type specifiers: double short +specifiers2.c:18:8: error: impossible combination of type specifiers: double signed +specifiers2.c:19:8: error: impossible combination of type specifiers: double unsigned +specifiers2.c:20:7: error: two or more data types in declaration specifiers +specifiers2.c:21:7: error: two or more data types in declaration specifiers +specifiers2.c:22:7: error: two or more data types in declaration specifiers +specifiers2.c:23:7: error: two or more data types in declaration specifiers +specifiers2.c:24:7: error: impossible combination of type specifiers: float short +specifiers2.c:25:7: error: impossible combination of type specifiers: float long +specifiers2.c:26:7: error: impossible combination of type specifiers: float signed +specifiers2.c:27:7: error: impossible combination of type specifiers: float unsigned +specifiers2.c:28:7: error: impossible combination of type specifiers: short char +specifiers2.c:29:7: error: impossible combination of type specifiers: short double +specifiers2.c:30:7: error: impossible combination of type specifiers: short float +specifiers2.c:31:7: error: impossible combination of type specifiers: short short +specifiers2.c:32:7: error: impossible combination of type specifiers: short long +specifiers2.c:33:6: error: impossible combination of type specifiers: long char +specifiers2.c:34:6: error: impossible combination of type specifiers: long float +specifiers2.c:35:6: error: impossible combination of type specifiers: long short +specifiers2.c:36:8: error: impossible combination of type specifiers: signed double +specifiers2.c:37:8: error: impossible combination of type specifiers: signed float +specifiers2.c:38:8: error: impossible combination of type specifiers: signed signed +specifiers2.c:39:8: error: impossible combination of type specifiers: signed unsigned +specifiers2.c:40:10: error: impossible combination of type specifiers: unsigned double +specifiers2.c:41:10: error: impossible combination of type specifiers: unsigned float +specifiers2.c:42:10: error: impossible combination of type specifiers: unsigned signed +specifiers2.c:43:10: error: impossible combination of type specifiers: unsigned unsigned +specifiers2.c:44:10: error: impossible combination of type specifiers: unsigned signed +specifiers2.c:45:11: error: impossible combination of type specifiers: long long long +specifiers2.c:46:13: error: impossible combination of type specifiers: long long double +specifiers2.c:47:11: error: impossible combination of type specifiers: long long double +specifiers2.c:48:13: error: impossible combination of type specifiers: long long double +specifiers2.c:49:3: error: two or more data types in declaration specifiers +specifiers2.c:50:3: error: two or more data types in declaration specifiers +specifiers2.c:51:3: error: two or more data types in declaration specifiers +specifiers2.c:52:3: error: two or more data types in declaration specifiers +specifiers2.c:53:3: error: two or more data types in declaration specifiers +specifiers2.c:54:3: error: two or more data types in declaration specifiers +specifiers2.c:55:3: error: two or more data types in declaration specifiers +specifiers2.c:56:3: error: two or more data types in declaration specifiers +specifiers2.c:57:3: error: two or more data types in declaration specifiers +specifiers2.c:58:6: error: two or more data types in declaration specifiers +specifiers2.c:59:6: error: two or more data types in declaration specifiers +specifiers2.c:60:6: error: two or more data types in declaration specifiers +specifiers2.c:61:6: error: two or more data types in declaration specifiers +specifiers2.c:62:6: error: two or more data types in declaration specifiers +specifiers2.c:63:6: error: two or more data types in declaration specifiers +specifiers2.c:64:6: error: two or more data types in declaration specifiers +specifiers2.c:65:6: error: two or more data types in declaration specifiers +specifiers2.c:66:6: error: two or more data types in declaration specifiers +specifiers2.c:67:5: error: two or more data types in declaration specifiers +specifiers2.c:68:8: error: two or more data types in declaration specifiers +specifiers2.c:69:7: error: two or more data types in declaration specifiers +specifiers2.c:70:7: error: impossible combination of type specifiers: short void +specifiers2.c:71:6: error: impossible combination of type specifiers: long void +specifiers2.c:72:8: error: impossible combination of type specifiers: signed void +specifiers2.c:73:10: error: impossible combination of type specifiers: unsigned void +specifiers2.c:74:6: error: two or more data types in declaration specifiers + * check-error-end + */ |
