aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
authorLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2017-03-11 14:48:44 +0100
committerLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2017-03-27 16:12:27 +0200
commite6f52d5bb67d6941b985a45b08bf87c305e3ba5b (patch)
tree896dbc0df199cbe13c9bc49b2cbb2fcd06334939
parentc1a53a868ebafd1d134e4a77c86074b9d07e4281 (diff)
downloadsparse-dev-e6f52d5bb67d6941b985a45b08bf87c305e3ba5b.tar.gz
fix cast to pointer to floating-point
By mistake, a cast to floating-pointer pointer was created as OP_FPCAST instead of OP_PTRCAST. Fix this by adding the missing 'else'. Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
-rw-r--r--linearize.c3
-rw-r--r--validation/fp-vs-ptrcast.c13
2 files changed, 14 insertions, 2 deletions
diff --git a/linearize.c b/linearize.c
index 5199b6b0..ae8640a9 100644
--- a/linearize.c
+++ b/linearize.c
@@ -1118,8 +1118,7 @@ static struct instruction *alloc_cast_instruction(struct symbol *src, struct sym
base = base->ctype.base_type;
if (base != &void_ctype)
opcode = OP_PTRCAST;
- }
- if (base->ctype.base_type == &fp_type)
+ } else if (base->ctype.base_type == &fp_type)
opcode = OP_FPCAST;
return alloc_typed_instruction(opcode, ctype);
}
diff --git a/validation/fp-vs-ptrcast.c b/validation/fp-vs-ptrcast.c
new file mode 100644
index 00000000..817aee5c
--- /dev/null
+++ b/validation/fp-vs-ptrcast.c
@@ -0,0 +1,13 @@
+float *f01(void* p)
+{
+ return p;
+}
+
+/*
+ * check-name: fp-vs-ptrcast
+ * check-command: test-linearize -Wno-decl $file
+ * check-output-ignore
+ *
+ * check-output-excludes: fpcast
+ * check-output-contains: ptrcast
+ */