aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarek Polacek <polacek@redhat.com>2018-05-08 19:30:57 +0000
committerMarek Polacek <mpolacek@gcc.gnu.org>2018-05-08 19:30:57 +0000
commit0e45c664e3f08eac144e82918a38174873ec176d (patch)
treeb53531e258523915480e137a1f73e3191a7d8627
parent3b275e65cbe1b290605df43cb10be797f2c9fb99 (diff)
downloadgcc-0e45c664e3f08eac144e82918a38174873ec176d.zip
gcc-0e45c664e3f08eac144e82918a38174873ec176d.tar.gz
gcc-0e45c664e3f08eac144e82918a38174873ec176d.tar.bz2
re PR c++/85695 (if constexpr misevaluates typedefed type value)
PR c++/85695 * semantics.c (finish_if_stmt_cond): See through typedefs. * g++.dg/cpp1z/constexpr-if22.C: New test. From-SVN: r260049
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/semantics.c2
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/cpp1z/constexpr-if22.C21
4 files changed, 32 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 6599115..d80c15d 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,8 @@
+2018-05-08 Marek Polacek <polacek@redhat.com>
+
+ PR c++/85695
+ * semantics.c (finish_if_stmt_cond): See through typedefs.
+
2018-05-07 Jason Merrill <jason@redhat.com>
PR c++/85646 - lambda visibility.
diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
index 2b2b51b..195286c 100644
--- a/gcc/cp/semantics.c
+++ b/gcc/cp/semantics.c
@@ -736,7 +736,7 @@ finish_if_stmt_cond (tree cond, tree if_stmt)
&& !instantiation_dependent_expression_p (cond)
/* Wait until instantiation time, since only then COND has been
converted to bool. */
- && TREE_TYPE (cond) == boolean_type_node)
+ && TYPE_MAIN_VARIANT (TREE_TYPE (cond)) == boolean_type_node)
{
cond = instantiate_non_dependent_expr (cond);
cond = cxx_constant_value (cond, NULL_TREE);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index dc19677..3bfeb89 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2018-05-08 Marek Polacek <polacek@redhat.com>
+
+ PR c++/85695
+ * g++.dg/cpp1z/constexpr-if22.C: New test.
+
2018-05-08 Uros Bizjak <ubizjak@gmail.com>
PR target/85693
diff --git a/gcc/testsuite/g++.dg/cpp1z/constexpr-if22.C b/gcc/testsuite/g++.dg/cpp1z/constexpr-if22.C
new file mode 100644
index 0000000..76f0c73
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1z/constexpr-if22.C
@@ -0,0 +1,21 @@
+// PR c++/85695
+// { dg-options -std=c++17 }
+
+template <typename T, T v>
+struct integral_constant {
+ using value_type = T;
+ static constexpr const value_type value = v;
+ constexpr operator value_type (void) const { return value; }
+};
+template <typename T> struct is_trivial
+ : public integral_constant<bool, __is_trivial(T)> {};
+
+template <typename T>
+T clone_object (const T& p)
+{
+ if constexpr (is_trivial<T>::value)
+ return p;
+ else
+ return p.clone();
+}
+int main (void) { return clone_object(0); }