aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
-rw-r--r--evaluate.c2
-rw-r--r--validation/bitwise-cast.c44
2 files changed, 45 insertions, 1 deletions
diff --git a/evaluate.c b/evaluate.c
index 6ab39ed7..47eeaef2 100644
--- a/evaluate.c
+++ b/evaluate.c
@@ -2805,7 +2805,7 @@ static struct symbol *evaluate_cast(struct expression *expr)
t2 = unfoul(t2);
if (t1 != t2) {
- if (class1 & TYPE_RESTRICT)
+ if ((class1 & TYPE_RESTRICT) && restricted_value(target, t1))
warning(expr->pos, "cast to %s",
show_typename(t1));
if (class2 & TYPE_RESTRICT)
diff --git a/validation/bitwise-cast.c b/validation/bitwise-cast.c
new file mode 100644
index 00000000..baeca29e
--- /dev/null
+++ b/validation/bitwise-cast.c
@@ -0,0 +1,44 @@
+typedef unsigned int u32;
+typedef u32 __attribute__((bitwise)) __be32;
+
+/* Implicit casts of 0, legal */
+static __be32 foo(void)
+{
+ __be32 x = 0;
+
+ return 0;
+}
+
+/* Explicit cast of 0, legal */
+static __be32 bar(void)
+{
+ return (__be32)0;
+}
+
+/* Implicit casts of nonzero, bad */
+static __be32 baz(void)
+{
+ __be32 x = 0x2a;
+
+ return 99;
+}
+
+/* Explicit cast of nonzero, bad */
+static __be32 quux(void)
+{
+ return (__be32)1729;
+}
+
+/*
+ * check-name: conversions to bitwise types
+ * check-command: sparse -Wbitwise $file
+ * check-error-start
+bitwise-cast.c:21:20: warning: incorrect type in initializer (different base types)
+bitwise-cast.c:21:20: expected restricted __be32 [usertype] x
+bitwise-cast.c:21:20: got int
+bitwise-cast.c:23:16: warning: incorrect type in return expression (different base types)
+bitwise-cast.c:23:16: expected restricted __be32
+bitwise-cast.c:23:16: got int
+bitwise-cast.c:29:17: warning: cast to restricted __be32
+ * check-error-end
+ */