re PR c++/67980 (left shift count is negative [-Wshift-count-negative] generated...
authorPaolo Carlini <paolo.carlini@oracle.com>
Fri, 4 Nov 2016 18:58:53 +0000 (18:58 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Fri, 4 Nov 2016 18:58:53 +0000 (18:58 +0000)
/cp
2016-11-04  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/67980
* pt.c (tsubst_expr, case IF_STMT): Use fold_non_dependent_expr
to suppress unwanted warnings.

/testsuite
2016-11-04  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/67980
* g++.dg/cpp1y/pr67980.C: New.

From-SVN: r241858

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp1y/pr67980.C [new file with mode: 0644]

index 544de43..e567fef 100644 (file)
@@ -1,3 +1,9 @@
+2016-11-04  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/67980
+       * pt.c (tsubst_expr, case IF_STMT): Use fold_non_dependent_expr
+       to suppress unwanted warnings.
+
 2016-11-03  Jason Merrill  <jason@redhat.com>
 
        PR c++/78198
index e513448..c8d4a06 100644 (file)
@@ -15437,15 +15437,27 @@ tsubst_expr (tree t, tree args, tsubst_flags_t complain, tree in_decl,
       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))
        /* 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 910b8d2..eae75f1 100644 (file)
@@ -1,3 +1,8 @@
+2016-11-04  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/67980
+       * g++.dg/cpp1y/pr67980.C: New.
+
 2016-11-04  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
 
        * gcc.target/powerpc/fold-vec-add-1.c: New.
diff --git a/gcc/testsuite/g++.dg/cpp1y/pr67980.C b/gcc/testsuite/g++.dg/cpp1y/pr67980.C
new file mode 100644 (file)
index 0000000..1b81545
--- /dev/null
@@ -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);
+}