aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2016-07-21 02:05:33 -0400
committerJason Merrill <jason@gcc.gnu.org>2016-07-21 02:05:33 -0400
commite96fe88c518ddc2d8917355d1781de3f8714c348 (patch)
treea8b779241c8a5d8a3a432003db368fcc95be87ff
parentf078dc7d269d8afd2874476181ee61662a16a3d0 (diff)
downloadgcc-e96fe88c518ddc2d8917355d1781de3f8714c348.zip
gcc-e96fe88c518ddc2d8917355d1781de3f8714c348.tar.gz
gcc-e96fe88c518ddc2d8917355d1781de3f8714c348.tar.bz2
PR c++/71121 - -Waddress, constexpr, and PMFs.
* cp-gimplify.c (cp_fully_fold): First call maybe_constant_value. From-SVN: r238559
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/cp-gimplify.c5
-rw-r--r--gcc/testsuite/g++.dg/warn/Waddress-4.C15
-rw-r--r--gcc/testsuite/g++.dg/warn/overflow-warn-7.C17
4 files changed, 25 insertions, 17 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 87dcaa8..8ff7f75 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,8 @@
+2016-07-21 Jason Merrill <jason@redhat.com>
+
+ PR c++/71121
+ * cp-gimplify.c (cp_fully_fold): First call maybe_constant_value.
+
2016-07-21 Andrew Sutton <andrew.n.sutton@gmail.com>
Jason Merrill <jason@redhat.com>
diff --git a/gcc/cp/cp-gimplify.c b/gcc/cp/cp-gimplify.c
index 41ab35f..ee28ba5 100644
--- a/gcc/cp/cp-gimplify.c
+++ b/gcc/cp/cp-gimplify.c
@@ -1954,6 +1954,11 @@ cxx_omp_disregard_value_expr (tree decl, bool shared)
tree
cp_fully_fold (tree x)
{
+ if (processing_template_decl)
+ return x;
+ /* FIXME cp_fold ought to be a superset of maybe_constant_value so we don't
+ have to call both. */
+ x = maybe_constant_value (x);
return cp_fold (x);
}
diff --git a/gcc/testsuite/g++.dg/warn/Waddress-4.C b/gcc/testsuite/g++.dg/warn/Waddress-4.C
new file mode 100644
index 0000000..a9fdfc4
--- /dev/null
+++ b/gcc/testsuite/g++.dg/warn/Waddress-4.C
@@ -0,0 +1,15 @@
+// PR c++/71121
+// { dg-do compile { target c++14 } }
+// { dg-options -Waddress }
+
+struct CC { void mbr(); };
+
+constexpr auto getFunc() {
+ return &CC::mbr;
+}
+
+constexpr bool xxx(void (CC::*_a)())
+{
+ constexpr auto f = getFunc();
+ return (f == _a);
+}
diff --git a/gcc/testsuite/g++.dg/warn/overflow-warn-7.C b/gcc/testsuite/g++.dg/warn/overflow-warn-7.C
deleted file mode 100644
index b536563..0000000
--- a/gcc/testsuite/g++.dg/warn/overflow-warn-7.C
+++ /dev/null
@@ -1,17 +0,0 @@
-// PR c/62096 - unexpected warning overflow in implicit constant conversion
-// { dg-do compile { target c++11 } }
-
-enum E {
- E_val = 1,
-};
-
-inline constexpr E operator~(E e)
-{
- return E(~static_cast<int>(e));
-}
-
-int main()
-{
- int val = ~E_val; // { dg-bogus "overflow in implicit constant conversion" }
- (void) val;
-}