Fix casting non-"int" to bool.
authorDavid Malcolm <dmalcolm@redhat.com>
Fri, 19 Dec 2014 20:34:39 +0000 (20:34 +0000)
committerDavid Malcolm <dmalcolm@gcc.gnu.org>
Fri, 19 Dec 2014 20:34:39 +0000 (20:34 +0000)
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.

From-SVN: r218977

gcc/jit/ChangeLog
gcc/jit/jit-playback.c
gcc/testsuite/ChangeLog
gcc/testsuite/jit.dg/test-expressions.c

index 8f3f412126e97f16301dbf97437888819b26d2d9..09e5c8a1defff90cad02e340774a5ca1e590c70c 100644 (file)
@@ -1,3 +1,9 @@
+2014-12-19  David Malcolm  <dmalcolm@redhat.com>
+
+       * jit-playback.c (gcc::jit::playback::context::build_cast): In
+       case BOOLEAN_TYPE, don't assume that the source expression is
+       of type "int".
+
 2014-12-19  David Malcolm  <dmalcolm@redhat.com>
 
        * jit-recording.c (gcc::jit::recording::context::context): When
index 57ff50efa65edd6033a0156e3e7d01c3e764f3c7..3667d1a466169356921d2376c167bc10207cdf9b 100644 (file)
@@ -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:
index d00b5d772f57a1a2c0e281cc5516f4eafc772dea..ad7acfba947d0857762fb2e55c10dcc8995052c1 100644 (file)
@@ -1,3 +1,9 @@
+2014-12-19  David Malcolm  <dmalcolm@redhat.com>
+
+       * jit.dg/test-expressions.c (make_tests_of_casts): Add tests of
+       casting between "long" and "bool".
+       (verify_casts): Verify these new test cases.
+
 2014-12-19  Matthew Fortune  <matthew.fortune@imgtec.com>
 
        * gcc.target/mips/pr37362.c: Skip for mips-img-elf.
index eb986f38e253cb88e43bc5e9bd74652b1f95ee8f..87abb768706f239692ec294e8bd77b7919c7f8e1 100644 (file)
@@ -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);