diff options
author | Luc Van Oostenryck <luc.vanoostenryck@gmail.com> | 2019-12-17 01:13:53 +0100 |
---|---|---|
committer | Luc Van Oostenryck <luc.vanoostenryck@gmail.com> | 2019-12-17 01:13:53 +0100 |
commit | 341daf20fd91d57fa7c5c2a49a1a9f01dc0fe7e6 (patch) | |
tree | 32c0f48fe0df8fb67c3406e15189af07a9c9b49b | |
parent | 3f90fa99393dd2b16eea3eaabe48e3e644890728 (diff) | |
parent | 2094267c7d36d8696897c509558fc63e8a695765 (diff) | |
download | sparse-341daf20fd91d57fa7c5c2a49a1a9f01dc0fe7e6.tar.gz |
Merge branch 'msg-wrong-redecl' into next
* improve diagnostic message about wrong redeclaration
-rw-r--r-- | evaluate.c | 8 | ||||
-rw-r--r-- | validation/c11-atomic.c | 10 | ||||
-rw-r--r-- | validation/function-redecl.c | 50 | ||||
-rw-r--r-- | validation/restrict.c | 10 | ||||
-rw-r--r-- | validation/typedef-redef.c | 5 |
5 files changed, 65 insertions, 18 deletions
@@ -3390,9 +3390,11 @@ void check_duplicates(struct symbol *sym) declared++; typediff = type_difference(&sym->ctype, &next->ctype, 0, 0); if (typediff) { - sparse_error(sym->pos, "symbol '%s' redeclared with different type (originally declared at %s:%d) - %s", - show_ident(sym->ident), - stream_name(next->pos.stream), next->pos.line, typediff); + sparse_error(sym->pos, "symbol '%s' redeclared with different type (%s):", + show_ident(sym->ident), typediff); + info(sym->pos, " %s", show_typename(sym)); + info(next->pos, "note: previously declared as:"); + info(next->pos, " %s", show_typename(next)); return; } } diff --git a/validation/c11-atomic.c b/validation/c11-atomic.c index fc2c27ae..17720861 100644 --- a/validation/c11-atomic.c +++ b/validation/c11-atomic.c @@ -69,8 +69,14 @@ void baz(void) * check-command: sparse -Wno-decl $file * * check-error-start -c11-atomic.c:11:6: error: symbol 'f02' redeclared with different type (originally declared at c11-atomic.c:3) - incompatible argument 1 (different modifiers) -c11-atomic.c:12:6: error: symbol 'f03' redeclared with different type (originally declared at c11-atomic.c:4) - incompatible argument 1 (different modifiers) +c11-atomic.c:11:6: error: symbol 'f02' redeclared with different type (incompatible argument 1 (different modifiers)): +c11-atomic.c:11:6: void extern [addressable] [toplevel] f02( ... ) +c11-atomic.c:3:6: note: previously declared as: +c11-atomic.c:3:6: void extern [addressable] [toplevel] f02( ... ) +c11-atomic.c:12:6: error: symbol 'f03' redeclared with different type (incompatible argument 1 (different modifiers)): +c11-atomic.c:12:6: void extern [addressable] [toplevel] f03( ... ) +c11-atomic.c:4:6: note: previously declared as: +c11-atomic.c:4:6: void extern [addressable] [toplevel] f03( ... ) c11-atomic.c:33:13: warning: incorrect type in assignment (different modifiers) c11-atomic.c:33:13: expected int *extern [assigned] puo c11-atomic.c:33:13: got int const * diff --git a/validation/function-redecl.c b/validation/function-redecl.c index 475f18e7..03151359 100644 --- a/validation/function-redecl.c +++ b/validation/function-redecl.c @@ -48,15 +48,45 @@ 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 +function-redecl.c:5:6: error: symbol 'ret_type' redeclared with different type (different base types): +function-redecl.c:5:6: void extern [addressable] [toplevel] ret_type( ... ) +function-redecl.c:4:5: note: previously declared as: +function-redecl.c:4:5: int extern [signed] [addressable] [toplevel] ret_type( ... ) +function-redecl.c:9:11: error: symbol 'ret_const' redeclared with different type (different modifiers): +function-redecl.c:9:11: int extern const [signed] [addressable] [toplevel] ret_const( ... ) +function-redecl.c:8:5: note: previously declared as: +function-redecl.c:8:5: int extern [signed] [addressable] [toplevel] ret_const( ... ) +function-redecl.c:13:13: error: symbol 'ret_as' redeclared with different type (different address spaces): +function-redecl.c:13:13: void <asn:1> *extern [addressable] [toplevel] ret_as( ... ) +function-redecl.c:12:6: note: previously declared as: +function-redecl.c:12:6: void *extern [addressable] [toplevel] ret_as( ... ) +function-redecl.c:17:12: error: symbol 'ret_mod' redeclared with different type (different modifiers): +function-redecl.c:17:12: void const *extern [addressable] [toplevel] ret_mod( ... ) +function-redecl.c:16:6: note: previously declared as: +function-redecl.c:16:6: void *extern [addressable] [toplevel] ret_mod( ... ) +function-redecl.c:21:6: error: symbol 'arg_type' redeclared with different type (incompatible argument 1 (different base types)): +function-redecl.c:21:6: void extern [addressable] [toplevel] arg_type( ... ) +function-redecl.c:20:6: note: previously declared as: +function-redecl.c:20:6: void extern [addressable] [toplevel] arg_type( ... ) +function-redecl.c:29:6: error: symbol 'arg_as' redeclared with different type (incompatible argument 1 (different address spaces)): +function-redecl.c:29:6: void extern [addressable] [toplevel] arg_as( ... ) +function-redecl.c:28:6: note: previously declared as: +function-redecl.c:28:6: void extern [addressable] [toplevel] arg_as( ... ) +function-redecl.c:33:6: error: symbol 'arg_mod' redeclared with different type (incompatible argument 1 (different modifiers)): +function-redecl.c:33:6: void extern [addressable] [toplevel] arg_mod( ... ) +function-redecl.c:32:6: note: previously declared as: +function-redecl.c:32:6: void extern [addressable] [toplevel] arg_mod( ... ) +function-redecl.c:37:6: error: symbol 'arg_more_arg' redeclared with different type (different argument counts): +function-redecl.c:37:6: void extern [addressable] [toplevel] arg_more_arg( ... ) +function-redecl.c:36:6: note: previously declared as: +function-redecl.c:36:6: void extern [addressable] [toplevel] arg_more_arg( ... ) +function-redecl.c:41:6: error: symbol 'arg_less_arg' redeclared with different type (different argument counts): +function-redecl.c:41:6: void extern [addressable] [toplevel] arg_less_arg( ... ) +function-redecl.c:40:6: note: previously declared as: +function-redecl.c:40:6: void extern [addressable] [toplevel] arg_less_arg( ... ) +function-redecl.c:45:6: error: symbol 'arg_vararg' redeclared with different type (incompatible variadic arguments): +function-redecl.c:45:6: void extern [addressable] [toplevel] arg_vararg( ... ) +function-redecl.c:44:6: note: previously declared as: +function-redecl.c:44:6: void extern [addressable] [toplevel] arg_vararg( ... ) * check-error-end */ diff --git a/validation/restrict.c b/validation/restrict.c index 80c437b0..d7cd8ad9 100644 --- a/validation/restrict.c +++ b/validation/restrict.c @@ -69,8 +69,14 @@ void baz(void) * check-command: sparse -Wno-decl $file * * check-error-start -restrict.c:11:6: error: symbol 'f02' redeclared with different type (originally declared at restrict.c:3) - incompatible argument 1 (different modifiers) -restrict.c:12:6: error: symbol 'f03' redeclared with different type (originally declared at restrict.c:4) - incompatible argument 1 (different modifiers) +restrict.c:11:6: error: symbol 'f02' redeclared with different type (incompatible argument 1 (different modifiers)): +restrict.c:11:6: void extern [addressable] [toplevel] f02( ... ) +restrict.c:3:6: note: previously declared as: +restrict.c:3:6: void extern [addressable] [toplevel] f02( ... ) +restrict.c:12:6: error: symbol 'f03' redeclared with different type (incompatible argument 1 (different modifiers)): +restrict.c:12:6: void extern [addressable] [toplevel] f03( ... ) +restrict.c:4:6: note: previously declared as: +restrict.c:4:6: void extern [addressable] [toplevel] f03( ... ) restrict.c:33:13: warning: incorrect type in assignment (different modifiers) restrict.c:33:13: expected void **extern [assigned] pup restrict.c:33:13: got void *const * diff --git a/validation/typedef-redef.c b/validation/typedef-redef.c index 3a60a773..f90f266a 100644 --- a/validation/typedef-redef.c +++ b/validation/typedef-redef.c @@ -8,6 +8,9 @@ typedef long ko_t; * check-name: typedef-redef * * check-error-start -typedef-redef.c:5:14: error: symbol 'ko_t' redeclared with different type (originally declared at typedef-redef.c:4) - different type sizes +typedef-redef.c:5:14: error: symbol 'ko_t' redeclared with different type (different type sizes): +typedef-redef.c:5:14: long [usertype] ko_t +typedef-redef.c:4:14: note: previously declared as: +typedef-redef.c:4:14: int [usertype] ko_t * check-error-end */ |