diff options
author | Luc Van Oostenryck <luc.vanoostenryck@gmail.com> | 2019-12-21 00:10:28 +0100 |
---|---|---|
committer | Luc Van Oostenryck <luc.vanoostenryck@gmail.com> | 2020-02-06 22:15:53 +0100 |
commit | a606990219d5a278cd3cda97d1e95b9728069098 (patch) | |
tree | 9911ca0216e5e80e8e2742a51cab21635c7272e0 | |
parent | 100509c0789f1176fc5881da45917e9af77597ca (diff) | |
download | sparse-a606990219d5a278cd3cda97d1e95b9728069098.tar.gz |
fix type compatibility of _Atomic
When _Atomic was introduced, it was treated, for most purposes,
like the other qualifiers.
However, it's best to consider _Atomic as an qualifier only for
syntaxic reasons. In particular, an _Atomic type may have different
size and alignment that its corresponding unqualified type.
Also, an _Atomic type is never compatible with its corresponding
unqualified type, and thus, for type checking, this qualifier must
never be ignored.
Fix this by removing MOD_ATOMIC from MOD_QUALIFIER. This,
essentially, has the effect to stop to ignore MOD_ATOMIC when
comparing types.
Fixes: ffe9f9fef003d29b65d29b8da5416aff72baff5a
Repoted-by: Ramsay Jones <ramsay@ramsayjones.plus.com>
Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
-rw-r--r-- | symbol.h | 6 | ||||
-rw-r--r-- | validation/c11-atomic.c | 58 | ||||
-rw-r--r-- | validation/typeof-mods.c | 2 |
3 files changed, 41 insertions, 25 deletions
@@ -248,10 +248,10 @@ struct symbol { #define MOD_SIGNEDNESS (MOD_SIGNED | MOD_UNSIGNED | MOD_EXPLICITLY_SIGNED) #define MOD_SPECIFIER MOD_SIGNEDNESS #define MOD_IGNORE (MOD_STORAGE | MOD_ACCESS | MOD_USERTYPE | MOD_EXPLICITLY_SIGNED | MOD_EXT_VISIBLE) -#define MOD_QUALIFIER (MOD_CONST | MOD_VOLATILE | MOD_RESTRICT | MOD_ATOMIC) -#define MOD_PTRINHERIT (MOD_QUALIFIER | MOD_NODEREF | MOD_NORETURN | MOD_NOCAST) +#define MOD_QUALIFIER (MOD_CONST | MOD_VOLATILE | MOD_RESTRICT) +#define MOD_PTRINHERIT (MOD_QUALIFIER | MOD_ATOMIC | MOD_NODEREF | MOD_NORETURN | MOD_NOCAST) /* modifiers preserved by typeof() operator */ -#define MOD_TYPEOF (MOD_QUALIFIER | MOD_NOCAST | MOD_SPECIFIER) +#define MOD_TYPEOF (MOD_QUALIFIER | MOD_ATOMIC | MOD_NOCAST | MOD_SPECIFIER) /* modifiers for function attributes */ #define MOD_FUN_ATTR (MOD_PURE|MOD_NORETURN) /* like cvr-qualifiers but 'reversed' (OK: source <= target) */ diff --git a/validation/c11-atomic.c b/validation/c11-atomic.c index 17720861..85461f64 100644 --- a/validation/c11-atomic.c +++ b/validation/c11-atomic.c @@ -6,7 +6,7 @@ void f03(int _Atomic *dst); int _Atomic qo; int uo; -void f00(int dst) { } /* check-should-pass */ +void f00(int dst) { } /* check-should-fail */ void f01(typeof(&qo) dst) { } /* check-should-pass */ void f02(int *dst) { } /* check-should-fail */ void f03(typeof(&uo) dst) { } /* check-should-fail */ @@ -21,12 +21,12 @@ void ref(void) { const int qo; int uo; - extern const int *pqo; - extern int *puo; + const int *pqo; + int *puo; pqo = &qo; /* check-should-pass */ pqo = &uo; /* check-should-pass */ - pqo = puo; + pqo = puo; /* check-should-pass */ puo = &uo; /* check-should-pass */ @@ -36,12 +36,12 @@ void ref(void) void bar(void) { - extern int _Atomic *pqo; - extern int *puo; + int _Atomic *pqo; + int *puo; pqo = &qo; /* check-should-pass */ - pqo = &uo; /* check-should-pass */ - pqo = puo; + pqo = &uo; /* check-should-fail */ + pqo = puo; /* check-should-fail */ puo = &uo; /* check-should-pass */ @@ -51,12 +51,12 @@ void bar(void) void baz(void) { - extern typeof(&qo) pqo; - extern typeof(&uo) puo; + typeof(&qo) pqo; + typeof(&uo) puo; pqo = &qo; /* check-should-pass */ - pqo = &uo; /* check-should-pass */ - pqo = puo; + pqo = &uo; /* check-should-fail*/ + pqo = puo; /* check-should-fail */ puo = &uo; /* check-should-pass */ @@ -69,6 +69,10 @@ void baz(void) * check-command: sparse -Wno-decl $file * * check-error-start +c11-atomic.c:9:6: error: symbol 'f00' redeclared with different type (incompatible argument 1 (different modifiers)): +c11-atomic.c:9:6: void extern [addressable] [toplevel] f00( ... ) +c11-atomic.c:1:6: note: previously declared as: +c11-atomic.c:1:6: void extern [addressable] [toplevel] f00( ... ) 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: @@ -78,22 +82,34 @@ 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: expected int *[assigned] puo c11-atomic.c:33:13: got int const * c11-atomic.c:34:13: warning: incorrect type in assignment (different modifiers) -c11-atomic.c:34:13: expected int *extern [assigned] puo -c11-atomic.c:34:13: got int const *extern [assigned] pqo +c11-atomic.c:34:13: expected int *[assigned] puo +c11-atomic.c:34:13: got int const *[assigned] pqo +c11-atomic.c:43:13: warning: incorrect type in assignment (different modifiers) +c11-atomic.c:43:13: expected int [atomic] *[assigned] pqo +c11-atomic.c:43:13: got int * +c11-atomic.c:44:13: warning: incorrect type in assignment (different modifiers) +c11-atomic.c:44:13: expected int [atomic] *[assigned] pqo +c11-atomic.c:44:13: got int *puo c11-atomic.c:48:13: warning: incorrect type in assignment (different modifiers) -c11-atomic.c:48:13: expected int *extern [assigned] puo +c11-atomic.c:48:13: expected int *[assigned] puo c11-atomic.c:48:13: got int [atomic] * c11-atomic.c:49:13: warning: incorrect type in assignment (different modifiers) -c11-atomic.c:49:13: expected int *extern [assigned] puo -c11-atomic.c:49:13: got int [atomic] *extern [assigned] pqo +c11-atomic.c:49:13: expected int *[assigned] puo +c11-atomic.c:49:13: got int [atomic] *[assigned] pqo +c11-atomic.c:58:13: warning: incorrect type in assignment (different modifiers) +c11-atomic.c:58:13: expected int [atomic] *[assigned] pqo +c11-atomic.c:58:13: got int * +c11-atomic.c:59:13: warning: incorrect type in assignment (different modifiers) +c11-atomic.c:59:13: expected int [atomic] *[assigned] pqo +c11-atomic.c:59:13: got int *puo c11-atomic.c:63:13: warning: incorrect type in assignment (different modifiers) -c11-atomic.c:63:13: expected int *extern [assigned] puo +c11-atomic.c:63:13: expected int *[assigned] puo c11-atomic.c:63:13: got int [atomic] * c11-atomic.c:64:13: warning: incorrect type in assignment (different modifiers) -c11-atomic.c:64:13: expected int *extern [assigned] puo -c11-atomic.c:64:13: got int [atomic] *extern [assigned] pqo +c11-atomic.c:64:13: expected int *[assigned] puo +c11-atomic.c:64:13: got int [atomic] *[assigned] pqo * check-error-end */ diff --git a/validation/typeof-mods.c b/validation/typeof-mods.c index aa880f37..117269c0 100644 --- a/validation/typeof-mods.c +++ b/validation/typeof-mods.c @@ -102,7 +102,7 @@ static void test_static(void) static void test_tls(void) { - __thread int obj, *ptr; + static __thread int obj, *ptr; typeof(obj) var = obj; typeof(ptr) ptr2 = ptr; typeof(*ptr) var2 = obj; |