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