public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH, committed] Fix casting non-"int" to bool.
@ 2014-12-19 20:46 David Malcolm
  0 siblings, 0 replies; only message in thread
From: David Malcolm @ 2014-12-19 20:46 UTC (permalink / raw)
  To: gcc-patches, jit; +Cc: David Malcolm

Attempts to use gcc_jit_context_new_cast on an rvalue with non-"int"
numeric type, with "bool" as the desired type would lead to an ICE
when the context was compiled.

Fix it.

Brings jit.sum from:
  # of expected passes		4888
to:
  # of expected passes		5008

Committed to trunk as r218977.

gcc/jit/ChangeLog:
	* jit-playback.c (gcc::jit::playback::context::build_cast): In
	case BOOLEAN_TYPE, don't assume that the source expression is
	of type "int".

gcc/testsuite/ChangeLog:
	* jit.dg/test-expressions.c (make_tests_of_casts): Add tests of
	casting between "long" and "bool".
	(verify_casts): Verify these new test cases.
---
 gcc/jit/jit-playback.c                  |  3 ++-
 gcc/testsuite/jit.dg/test-expressions.c | 38 +++++++++++++++++++++++++++++++++
 2 files changed, 40 insertions(+), 1 deletion(-)

diff --git a/gcc/jit/jit-playback.c b/gcc/jit/jit-playback.c
index 57ff50e..3667d1a 100644
--- a/gcc/jit/jit-playback.c
+++ b/gcc/jit/jit-playback.c
@@ -875,7 +875,8 @@ playback::context::build_cast (playback::location *loc,
 	 c_common_truthvalue_conversion. */
       /* For now, convert to: (t_expr != 0)  */
       t_ret = build2 (NE_EXPR, t_dst_type,
-		      t_expr, integer_zero_node);
+		      t_expr,
+		      build_int_cst (TREE_TYPE (t_expr), 0));
       goto maybe_fold;
 
     case REAL_TYPE:
diff --git a/gcc/testsuite/jit.dg/test-expressions.c b/gcc/testsuite/jit.dg/test-expressions.c
index eb986f3..87abb76 100644
--- a/gcc/testsuite/jit.dg/test-expressions.c
+++ b/gcc/testsuite/jit.dg/test-expressions.c
@@ -543,6 +543,8 @@ make_tests_of_casts (gcc_jit_context *ctxt)
 {
   gcc_jit_type *int_type =
     gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_INT);
+  gcc_jit_type *long_type =
+    gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_LONG);
   gcc_jit_type *float_type =
     gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_FLOAT);
   gcc_jit_type *bool_type =
@@ -582,6 +584,20 @@ make_tests_of_casts (gcc_jit_context *ctxt)
 		       "test_cast_from_int_to_bool"),
     "(bool)a");
 
+  /* bool/long conversions */
+  CHECK_STRING_VALUE (
+    make_test_of_cast (ctxt,
+		       bool_type,
+		       long_type,
+		       "test_cast_from_bool_to_long"),
+    "(long)a");
+  CHECK_STRING_VALUE (
+    make_test_of_cast (ctxt,
+		       long_type,
+		       bool_type,
+		       "test_cast_from_long_to_bool"),
+    "(bool)a");
+
   /* array/ptr conversions */
   {
     gcc_jit_function *test_fn =
@@ -701,6 +717,28 @@ verify_casts (gcc_jit_result *result)
     CHECK_VALUE (test_cast_from_int_to_bool (1), 1);
   }
 
+  /* bool to long */
+  {
+    typedef long (*fn_type) (bool);
+    fn_type test_cast_from_bool_to_long =
+      (fn_type)gcc_jit_result_get_code (result,
+					"test_cast_from_bool_to_long");
+    CHECK_NON_NULL (test_cast_from_bool_to_long);
+    CHECK_VALUE (test_cast_from_bool_to_long (0), 0);
+    CHECK_VALUE (test_cast_from_bool_to_long (1), 1);
+  }
+
+  /* long to bool */
+  {
+    typedef bool (*fn_type) (long);
+    fn_type test_cast_from_long_to_bool =
+      (fn_type)gcc_jit_result_get_code (result,
+					"test_cast_from_long_to_bool");
+    CHECK_NON_NULL (test_cast_from_long_to_bool);
+    CHECK_VALUE (test_cast_from_long_to_bool (0), 0);
+    CHECK_VALUE (test_cast_from_long_to_bool (1), 1);
+  }
+
   /* array to ptr */
   {
     typedef int (*fn_type) (void);
-- 
1.8.5.3

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2014-12-19 20:40 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-12-19 20:46 [PATCH, committed] Fix casting non-"int" to bool David Malcolm

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).