aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2019-12-21 00:10:28 +0100
committerLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2020-02-06 22:15:53 +0100
commita606990219d5a278cd3cda97d1e95b9728069098 (patch)
tree9911ca0216e5e80e8e2742a51cab21635c7272e0
parent100509c0789f1176fc5881da45917e9af77597ca (diff)
downloadsparse-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.h6
-rw-r--r--validation/c11-atomic.c58
-rw-r--r--validation/typeof-mods.c2
3 files changed, 41 insertions, 25 deletions
diff --git a/symbol.h b/symbol.h
index 9ef5a886..2b8aa2d8 100644
--- a/symbol.h
+++ b/symbol.h
@@ -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;