diff options
author | Paolo Carlini <paolo.carlini@oracle.com> | 2014-11-11 17:34:12 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2014-11-11 17:34:12 +0000 |
commit | 50457b9e2151e9cc3d11da733bd885cf148a29a3 (patch) | |
tree | cda7a230e439ff04b7348e7945373732943c8a19 | |
parent | 3f3f5af032269366dcf58626a6c3037f37de138d (diff) | |
download | gcc-50457b9e2151e9cc3d11da733bd885cf148a29a3.zip gcc-50457b9e2151e9cc3d11da733bd885cf148a29a3.tar.gz gcc-50457b9e2151e9cc3d11da733bd885cf148a29a3.tar.bz2 |
re PR c++/63265 (Constexpr variables can trigger spurious compiler warnings)
/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
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/pt.c | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/constexpr-63265.C | 19 |
4 files changed, 35 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 9420908..a5513b6 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -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. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index fa9652f..21d4039 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -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 { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3ffd69a..b301e05 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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 index 0000000..aa0ce5e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-63265.C @@ -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"); |