diff options
| author | Luc Van Oostenryck <luc.vanoostenryck@gmail.com> | 2016-11-02 18:13:49 +0100 |
|---|---|---|
| committer | Christopher Li <sparse@chrisli.org> | 2017-01-27 08:53:08 -0800 |
| commit | c917c64e0eb61aa88e6257004be1849121b054ba (patch) | |
| tree | a12cdd11900b1ef48e01d5a63aaaf228b7df26ea /validation | |
| parent | 82d573cb15e33fd843ecf20ad559b1eb227ffc01 (diff) | |
| download | sparse-dev-c917c64e0eb61aa88e6257004be1849121b054ba.tar.gz | |
Fix type checking of variadic functions
When doing a type comparison between functions, in the varidicity part,
the base type of these functions (= their return type) is
wrongly used intead of their own type.
Fix this and add some tests showing this and others cases are
now OK
Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
CC: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Christopher Li <sparse@chrisli.org>
Diffstat (limited to 'validation')
| -rw-r--r-- | validation/function-redecl.c | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/validation/function-redecl.c b/validation/function-redecl.c new file mode 100644 index 00000000..7fbceb43 --- /dev/null +++ b/validation/function-redecl.c @@ -0,0 +1,62 @@ +#define __user __attribute__((address_space(1))) + + +int ret_type(void); +void ret_type(void) { } /* check-should-fail */ + + +int ret_const(void); +int const ret_const(void) { return 0; } /* check-should-fail */ + + +void *ret_as(void); +void __user *ret_as(void) { return 0; } /* check-should-fail */ + + +void *ret_mod(void); +void const *ret_mod(void) { return 0; } /* check-should-fail */ + + +void arg_type(int a); +void arg_type(void *a) { } /* check-should-fail */ + + +void arg_const(int a); +void arg_const(const int a) { } /* OK */ + + +void arg_as(void *a); +void arg_as(void __user *a) { } /* check-should-fail */ + + +void arg_mod(void *); +void arg_mod(void const *a) { } /* check-should-fail */ + + +void arg_more_arg(int a); +void arg_more_arg(int a, int b) { } /* check-should-fail */ + + +void arg_less_arg(int a, int b); +void arg_less_arg(int a) { } /* check-should-fail */ + + +void arg_vararg(int a); +void arg_vararg(int a, ...) { } /* check-should-fail */ + +/* + * check-name: function-redecl + * + * check-error-start +function-redecl.c:5:6: error: symbol 'ret_type' redeclared with different type (originally declared at function-redecl.c:4) - different base types +function-redecl.c:9:11: error: symbol 'ret_const' redeclared with different type (originally declared at function-redecl.c:8) - different modifiers +function-redecl.c:13:13: error: symbol 'ret_as' redeclared with different type (originally declared at function-redecl.c:12) - different address spaces +function-redecl.c:17:12: error: symbol 'ret_mod' redeclared with different type (originally declared at function-redecl.c:16) - different modifiers +function-redecl.c:21:6: error: symbol 'arg_type' redeclared with different type (originally declared at function-redecl.c:20) - incompatible argument 1 (different base types) +function-redecl.c:29:6: error: symbol 'arg_as' redeclared with different type (originally declared at function-redecl.c:28) - incompatible argument 1 (different address spaces) +function-redecl.c:33:6: error: symbol 'arg_mod' redeclared with different type (originally declared at function-redecl.c:32) - incompatible argument 1 (different modifiers) +function-redecl.c:37:6: error: symbol 'arg_more_arg' redeclared with different type (originally declared at function-redecl.c:36) - different argument counts +function-redecl.c:41:6: error: symbol 'arg_less_arg' redeclared with different type (originally declared at function-redecl.c:40) - different argument counts +function-redecl.c:45:6: error: symbol 'arg_vararg' redeclared with different type (originally declared at function-redecl.c:44) - incompatible variadic arguments + * check-error-end + */ |
