Bootstrapped and tested on x86_64-unknown-linux-gnu, applied to trunk 
sofar.

Richard.

2018-01-08  Richard Biener  <rguent...@suse.de>

        PR middle-end/83713
        * convert.c (do_narrow): Properly guard TYPE_OVERFLOW_WRAPS checks.

        * g++.dg/torture/pr83713.C: New testcase.

Index: gcc/convert.c
===================================================================
--- gcc/convert.c       (revision 256329)
+++ gcc/convert.c       (working copy)
@@ -471,8 +471,10 @@ do_narrow (location_t loc,
             type in case the operation in outprec precision
             could overflow.  Otherwise, we would introduce
             signed-overflow undefinedness.  */
-         || ((!TYPE_OVERFLOW_WRAPS (TREE_TYPE (arg0))
-              || !TYPE_OVERFLOW_WRAPS (TREE_TYPE (arg1)))
+         || ((!(INTEGRAL_TYPE_P (TREE_TYPE (arg0))
+                && TYPE_OVERFLOW_WRAPS (TREE_TYPE (arg0)))
+              || !(INTEGRAL_TYPE_P (TREE_TYPE (arg1))
+                   && TYPE_OVERFLOW_WRAPS (TREE_TYPE (arg1))))
              && ((TYPE_PRECISION (TREE_TYPE (arg0)) * 2u
                   > outprec)
                  || (TYPE_PRECISION (TREE_TYPE (arg1)) * 2u
Index: gcc/testsuite/g++.dg/torture/pr83713.C
===================================================================
--- gcc/testsuite/g++.dg/torture/pr83713.C      (nonexistent)
+++ gcc/testsuite/g++.dg/torture/pr83713.C      (working copy)
@@ -0,0 +1,12 @@
+// { dg-do compile }
+
+class a
+{
+  char b;
+  void c ();
+};
+void
+a::c ()
+{
+  &b + ((long long) &b & 0);
+}

Reply via email to