... sorry, what I sent earlier in fact causes a regression in the libstdc++-v3 testsuite: 23_containers/list/61347.cc.

Thus, I'm back to one of my first tries earlier today: a much more conservative change which uses fold_non_dependent_expr only for the purpose of suppressing the unwanted warnings, see the below.

Thanks,
Paolo.

///////////////////
Index: cp/pt.c
===================================================================
--- cp/pt.c     (revision 241313)
+++ cp/pt.c     (working copy)
@@ -15410,7 +15410,14 @@
       if (IF_STMT_CONSTEXPR_P (t) && integer_zerop (tmp))
        /* Don't instantiate the THEN_CLAUSE. */;
       else
-       RECUR (THEN_CLAUSE (t));
+       {
+         bool inhibit = integer_zerop (fold_non_dependent_expr (tmp));
+         if (inhibit)
+           ++c_inhibit_evaluation_warnings;
+         RECUR (THEN_CLAUSE (t));
+         if (inhibit)
+           --c_inhibit_evaluation_warnings;
+       }
       finish_then_clause (stmt);
 
       if (IF_STMT_CONSTEXPR_P (t) && integer_nonzerop (tmp))
@@ -15417,8 +15424,13 @@
        /* Don't instantiate the ELSE_CLAUSE. */;
       else if (ELSE_CLAUSE (t))
        {
+         bool inhibit = integer_nonzerop (fold_non_dependent_expr (tmp));
          begin_else_clause (stmt);
+         if (inhibit)
+           ++c_inhibit_evaluation_warnings;
          RECUR (ELSE_CLAUSE (t));
+         if (inhibit)
+           --c_inhibit_evaluation_warnings;
          finish_else_clause (stmt);
        }
 
Index: testsuite/g++.dg/cpp1y/pr67980.C
===================================================================
--- testsuite/g++.dg/cpp1y/pr67980.C    (revision 0)
+++ testsuite/g++.dg/cpp1y/pr67980.C    (working copy)
@@ -0,0 +1,23 @@
+// { dg-do compile { target c++14 } }
+
+template <int Y, class T>
+constexpr T cpp14_constexpr_then(T value) {
+  if (Y < 0)
+    return (value << -Y);
+  else
+    return 0;
+}
+
+template <int Y, class T>
+constexpr T cpp14_constexpr_else(T value) {
+  if (Y > 0)
+    return 0;
+  else
+    return (value << -Y);
+}
+
+int main()
+{
+  cpp14_constexpr_then<1>(0);
+  cpp14_constexpr_else<1>(0);
+}

Reply via email to