aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarek Polacek <polacek@redhat.com>2016-01-27 16:46:40 +0000
committerMarek Polacek <mpolacek@gcc.gnu.org>2016-01-27 16:46:40 +0000
commit05bf54c3c3cc7f13823ae787f21c36d3cee53265 (patch)
tree8d32eb826765bdbd9a3d6e26ef93d3f91b6727ef
parent60214d0d65c94912906108d2a1e6d04423528afc (diff)
downloadgcc-05bf54c3c3cc7f13823ae787f21c36d3cee53265.zip
gcc-05bf54c3c3cc7f13823ae787f21c36d3cee53265.tar.gz
gcc-05bf54c3c3cc7f13823ae787f21c36d3cee53265.tar.bz2
re PR c++/69379 (ICE in fold_convert_loc, at fold-const.c:2366)
PR c++/69379 * constexpr.c (cxx_eval_constant_expression): Handle PTRMEM_CSTs wrapped in NOP_EXPRs. * g++.dg/pr69379.C: New test. From-SVN: r232882
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/constexpr.c14
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/pr69379.C20
4 files changed, 45 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 6aa2176..c8653c4 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2016-01-27 Marek Polacek <polacek@redhat.com>
+
+ PR c++/69379
+ * constexpr.c (cxx_eval_constant_expression): Handle PTRMEM_CSTs
+ wrapped in NOP_EXPRs.
+
2016-01-27 Martin Sebor <msebor@redhat.com>
PR c++/69317
diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c
index fd80000..57595a4 100644
--- a/gcc/cp/constexpr.c
+++ b/gcc/cp/constexpr.c
@@ -3659,6 +3659,20 @@ cxx_eval_constant_expression (const constexpr_ctx *ctx, tree t,
if (TREE_CODE (op) == PTRMEM_CST
&& !TYPE_PTRMEM_P (type))
op = cplus_expand_constant (op);
+ if (TREE_CODE (op) == PTRMEM_CST && tcode == NOP_EXPR)
+ {
+ if (same_type_ignoring_top_level_qualifiers_p (type,
+ TREE_TYPE (op)))
+ STRIP_NOPS (t);
+ else
+ {
+ if (!ctx->quiet)
+ error_at (EXPR_LOC_OR_LOC (t, input_location),
+ "a reinterpret_cast is not a constant-expression");
+ *non_constant_p = true;
+ return t;
+ }
+ }
if (POINTER_TYPE_P (type)
&& TREE_CODE (op) == INTEGER_CST
&& !integer_zerop (op))
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index ad97714..40aa9c3 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2016-01-27 Marek Polacek <polacek@redhat.com>
+
+ PR c++/69379
+ * g++.dg/pr69379.C: New test.
+
2016-01-27 Martin Sebor <msebor@redhat.com>
PR c++/69317
diff --git a/gcc/testsuite/g++.dg/pr69379.C b/gcc/testsuite/g++.dg/pr69379.C
new file mode 100644
index 0000000..249ad00
--- /dev/null
+++ b/gcc/testsuite/g++.dg/pr69379.C
@@ -0,0 +1,20 @@
+// PR c++/69379
+// { dg-do compile }
+// { dg-options "-Wformat" }
+
+typedef int T;
+class A {
+public:
+ template <class D> A(const char *, D);
+ template <class Fn, class A1, class A2>
+ void m_fn1(const char *, Fn, A1 const &, A2);
+};
+struct Dict {
+ void m_fn2();
+};
+void fn1() {
+ A a("", "");
+ typedef void *Get;
+ typedef void (Dict::*d)(T);
+ a.m_fn1("", Get(), d(&Dict::m_fn2), "");
+}