diff mbox series

Fix PR83713

Message ID alpine.LSU.2.20.1801081420200.32271@zhemvz.fhfr.qr
State New
Headers show
Series Fix PR83713 | expand

Commit Message

Richard Biener Jan. 8, 2018, 1:21 p.m. UTC
Bootstrapped and tested on x86_64-unknown-linux-gnu, applied to trunk 
sofar.

Richard.

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.
diff mbox series

Patch

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);
+}