re PR c++/63265 (Constexpr variables can trigger spurious compiler warnings)
authorPaolo Carlini <paolo.carlini@oracle.com>
Tue, 11 Nov 2014 17:34:12 +0000 (17:34 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Tue, 11 Nov 2014 17:34:12 +0000 (17:34 +0000)
/cp
2014-11-11  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/63265
* pt.c (tsubst_copy_and_build, case COND_EXPR): Maybe fold to
constant the condition.

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

PR c++/63265
* g++.dg/cpp0x/constexpr-63265.C: New.

From-SVN: r217361

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/constexpr-63265.C [new file with mode: 0644]

index 9420908683d09396f926fe5153b1916952765b45..a5513b6cf45e18681cca3ca33c1f13e465aee9ae 100644 (file)
@@ -1,3 +1,9 @@
+2014-11-11  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/63265
+       * pt.c (tsubst_copy_and_build, case COND_EXPR): Maybe fold to
+       constant the condition.
+
 2014-11-10  Andi Kleen  <ak@linux.intel.com>
 
        * semantics.c (finish_goto_stmt): Call check_no_cilk.
index fa9652f748c2b7f5744692c1e53624540ed8680a..21d4039b62332c214453e90c23180452c9d56da3 100644 (file)
@@ -15138,11 +15138,13 @@ tsubst_copy_and_build (tree t,
     case COND_EXPR:
       {
        tree cond = RECUR (TREE_OPERAND (t, 0));
+       tree folded_cond = (maybe_constant_value
+                           (fold_non_dependent_expr_sfinae (cond, tf_none)));
        tree exp1, exp2;
 
-       if (TREE_CODE (cond) == INTEGER_CST)
+       if (TREE_CODE (folded_cond) == INTEGER_CST)
          {
-           if (integer_zerop (cond))
+           if (integer_zerop (folded_cond))
              {
                ++c_inhibit_evaluation_warnings;
                exp1 = RECUR (TREE_OPERAND (t, 1));
@@ -15156,6 +15158,7 @@ tsubst_copy_and_build (tree t,
                exp2 = RECUR (TREE_OPERAND (t, 2));
                --c_inhibit_evaluation_warnings;
              }
+           cond = folded_cond;
          }
        else
          {
index 3ffd69ae1fce393294f6c0331dcaf77b5c34985a..b301e055908c8a97114d91ce8fb70e2f045eef65 100644 (file)
@@ -1,3 +1,8 @@
+2014-11-11  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/63265
+       * g++.dg/cpp0x/constexpr-63265.C: New.
+
 2014-11-11  Evgeny Stupachenko  <evstupac@gmail.com>
 
        * gcc.target/i386/pr52252-atom-1.c: New.
diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-63265.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-63265.C
new file mode 100644 (file)
index 0000000..aa0ce5e
--- /dev/null
@@ -0,0 +1,19 @@
+// PR c++/63265
+// { dg-do compile { target c++11 } }
+
+#define LSHIFT (sizeof(unsigned int) * __CHAR_BIT__)
+
+template <int lshift>
+struct SpuriouslyWarns1 {
+    static constexpr unsigned int v = lshift < LSHIFT ? 1U << lshift : 0;
+};
+
+static_assert(SpuriouslyWarns1<LSHIFT>::v == 0, "Impossible occurred");
+
+template <int lshift>
+struct SpuriouslyWarns2 {
+    static constexpr bool okay = lshift < LSHIFT;
+    static constexpr unsigned int v = okay ? 1U << lshift : 0;
+};
+
+static_assert(SpuriouslyWarns2<LSHIFT>::v == 0, "Impossible occurred");