This patch limits constexpr folding for -Wsign-compare to only cases that we
would warn for without considering constant values, avoiding the folding in
the testcase in question.

Tested x86_64-pc-linux-gnu, applying to trunk.

gcc/c-family/
        * c-warn.c (warn_for_sign_compare): Call fold_for_warn.
gcc/cp/
        * typeck.c (cp_build_binary_op): Don't fold for -Wsign-compare.
---
 gcc/c-family/c-warn.c               | 3 +++
 gcc/cp/typeck.c                     | 9 +--------
 gcc/testsuite/g++.target/i386/mv1.C | 2 +-
 gcc/c-family/ChangeLog              | 5 +++++
 gcc/cp/ChangeLog                    | 3 +++
 5 files changed, 13 insertions(+), 9 deletions(-)

diff --git a/gcc/c-family/c-warn.c b/gcc/c-family/c-warn.c
index d775ff80b45..4785887c1de 100644
--- a/gcc/c-family/c-warn.c
+++ b/gcc/c-family/c-warn.c
@@ -2073,6 +2073,9 @@ warn_for_sign_compare (location_t location,
       else
        sop = orig_op1, uop = orig_op0;
 
+      sop = fold_for_warn (sop);
+      uop = fold_for_warn (uop);
+
       STRIP_TYPE_NOPS (sop);
       STRIP_TYPE_NOPS (uop);
       base_type = (TREE_CODE (result_type) == COMPLEX_TYPE
diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c
index 56def144a3e..03b14024738 100644
--- a/gcc/cp/typeck.c
+++ b/gcc/cp/typeck.c
@@ -5486,14 +5486,7 @@ cp_build_binary_op (const op_location_t &location,
          && !enum_cast_to_int (orig_op0)
          && !enum_cast_to_int (orig_op1))
        {
-         tree oop0 = maybe_constant_value (orig_op0);
-         tree oop1 = maybe_constant_value (orig_op1);
-
-         if (TREE_CODE (oop0) != INTEGER_CST)
-           oop0 = cp_fully_fold (orig_op0);
-         if (TREE_CODE (oop1) != INTEGER_CST)
-           oop1 = cp_fully_fold (orig_op1);
-         warn_for_sign_compare (location, oop0, oop1, op0, op1, 
+         warn_for_sign_compare (location, orig_op0, orig_op1, op0, op1,
                                 result_type, resultcode);
        }
     }
diff --git a/gcc/testsuite/g++.target/i386/mv1.C 
b/gcc/testsuite/g++.target/i386/mv1.C
index fc713477c1e..9e368506196 100644
--- a/gcc/testsuite/g++.target/i386/mv1.C
+++ b/gcc/testsuite/g++.target/i386/mv1.C
@@ -1,7 +1,7 @@
 /* Test case to check if Multiversioning works.  */
 /* { dg-do run } */
 /* { dg-require-ifunc "" }  */
-/* { dg-options "-O2 -fPIC" } */
+/* { dg-options "-O2 -fPIC -fcompare-debug=-Wsign-compare" } */
 
 #include <assert.h>
 
diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog
index cf73a1cad1c..ae6b8a7094d 100644
--- a/gcc/c-family/ChangeLog
+++ b/gcc/c-family/ChangeLog
@@ -1,3 +1,8 @@
+2019-04-03  Jason Merrill  <ja...@redhat.com>
+
+       PR c++/86586 - -fcompare-debug=-Wsign-compare.
+       * c-warn.c (warn_for_sign_compare): Call fold_for_warn.
+
 2019-04-01  Martin Sebor  <mse...@redhat.com>
 
        PR c/89685
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index a224517b566..91d14311f18 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,8 @@
 2019-04-03  Jason Merrill  <ja...@redhat.com>
 
+       PR c++/86586 - -fcompare-debug=-Wsign-compare.
+       * typeck.c (cp_build_binary_op): Don't fold for -Wsign-compare.
+
        PR c++/89331 - ICE with offsetof in incomplete class.
        * semantics.c (finish_offsetof): Handle error_mark_node.
        * typeck.c (build_class_member_access_expr): Call

base-commit: 4c246688d98b0acfd6bf8579026e3cc79eae1951
-- 
2.20.1

Reply via email to