aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
authorRamsay Jones <ramsay@ramsayjones.plus.com>2017-07-19 21:05:18 +0100
committerChristopher Li <sparse@chrisli.org>2017-08-09 21:56:31 -0400
commit2927c4a4f9b1e8f439679f8741b0411c0f22b419 (patch)
treeb67eb1840b7852e0d049c5402b73dc3c3f8b2daa
parentb1bcf2a5b9f43450bcb6055374c258c9de988502 (diff)
downloadsparse-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.c2
-rw-r--r--lib.h9
2 files changed, 9 insertions, 2 deletions
diff --git a/lib.c b/lib.c
index ce66a814..73e9a2fe 100644
--- a/lib.c
+++ b/lib.c
@@ -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;
diff --git a/lib.h b/lib.h
index c90e0e32..307ccaeb 100644
--- a/lib.h
+++ b/lib.h
@@ -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)