re PR c++/83713 (ICE in do_narrow at gcc/convert.c:474)
authorRichard Biener <rguenther@suse.de>
Mon, 8 Jan 2018 13:24:38 +0000 (13:24 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Mon, 8 Jan 2018 13:24:38 +0000 (13:24 +0000)
2018-01-08  Richard Biener  <rguenther@suse.de>

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

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

From-SVN: r256341

gcc/ChangeLog
gcc/convert.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/torture/pr83713.C [new file with mode: 0644]

index cbd431a..b91925a 100644 (file)
@@ -1,5 +1,10 @@
 2018-01-08  Richard Biener  <rguenther@suse.de>
 
+       PR middle-end/83713
+       * convert.c (do_narrow): Properly guard TYPE_OVERFLOW_WRAPS checks.
+
+2018-01-08  Richard Biener  <rguenther@suse.de>
+
        PR tree-optimization/83685
        * tree-ssa-pre.c (create_expression_by_pieces): Do not insert
        references to abnormals.
index e168a26..8c8931f 100644 (file)
@@ -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 133e8e9..d5fd96d 100644 (file)
@@ -1,3 +1,8 @@
+2018-01-08  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/83713
+       * g++.dg/torture/pr83713.C: New testcase.
+
 2018-01-08  Tom de Vries  <tom@codesourcery.com>
 
        * gcc.dg/tree-ssa/ssa-dom-cse-2.c: Xfail scan for nvptx.
diff --git a/gcc/testsuite/g++.dg/torture/pr83713.C b/gcc/testsuite/g++.dg/torture/pr83713.C
new file mode 100644 (file)
index 0000000..ca6af04
--- /dev/null
@@ -0,0 +1,12 @@
+// { dg-do compile }
+
+class a
+{
+  char b;
+  void c ();
+};
+void
+a::c ()
+{
+  &b + ((long long) &b & 0);
+}