diff options
| author | Ramsay Jones <ramsay@ramsayjones.plus.com> | 2017-07-19 21:05:18 +0100 |
|---|---|---|
| committer | Christopher Li <sparse@chrisli.org> | 2017-08-09 21:56:31 -0400 |
| commit | 2927c4a4f9b1e8f439679f8741b0411c0f22b419 (patch) | |
| tree | b67eb1840b7852e0d049c5402b73dc3c3f8b2daa | |
| parent | b1bcf2a5b9f43450bcb6055374c258c9de988502 (diff) | |
| download | sparse-dev-2927c4a4f9b1e8f439679f8741b0411c0f22b419.tar.gz | |
lib: workaround the 'redeclared with different type' errors
The 'selfcheck' make target issues sparse errors for function symbols
'error_die' and 'die', like so:
CHECK lib.c
lib.c:194:6: error: symbol 'error_die' redeclared with different type \
(originally declared at lib.h:98) - different modifiers
lib.c:203:6: error: symbol 'die' redeclared with different type \
(originally declared at lib.h:94) - different modifiers
This is caused by the 'noreturn' attribute being treated similar to a
type qualifier and insisting that, not only the declaration and the
definition of the function have the 'noreturn', but that they have the
attribute in the same position.
In order to suppress the error, move the attribute(s) to the beginning
of the declaration, in the header file, and add an 'noreturn' attribute
at the beginning of the definition (in lib.c).
Signed-off-by: Ramsay Jones <ramsay@ramsayjones.plus.com>
Signed-off-by: Christopher Li <sparse@chrisli.org>
| -rw-r--r-- | lib.c | 2 | ||||
| -rw-r--r-- | lib.h | 9 |
2 files changed, 9 insertions, 2 deletions
@@ -191,6 +191,7 @@ void expression_error(struct expression *expr, const char *fmt, ...) expr->ctype = &bad_ctype; } +NORETURN_ATTR void error_die(struct position pos, const char * fmt, ...) { va_list args; @@ -200,6 +201,7 @@ void error_die(struct position pos, const char * fmt, ...) exit(1); } +NORETURN_ATTR void die(const char *fmt, ...) { va_list args; @@ -91,11 +91,16 @@ struct token *expect(struct token *, int, const char *); #define NORETURN_ATTR #define SENTINEL_ATTR #endif -extern void die(const char *, ...) FORMAT_ATTR(1) NORETURN_ATTR; + +FORMAT_ATTR(1) NORETURN_ATTR +extern void die(const char *, ...); + +FORMAT_ATTR(2) NORETURN_ATTR +extern void error_die(struct position, const char *, ...); + extern void info(struct position, const char *, ...) FORMAT_ATTR(2); extern void warning(struct position, const char *, ...) FORMAT_ATTR(2); extern void sparse_error(struct position, const char *, ...) FORMAT_ATTR(2); -extern void error_die(struct position, const char *, ...) FORMAT_ATTR(2) NORETURN_ATTR; extern void expression_error(struct expression *, const char *, ...) FORMAT_ATTR(2); #define ERROR_CURR_PHASE (1 << 0) |
