Commit 8a29084d by Jason Merrill Committed by Jason Merrill

re PR c++/70386 (ICE with -Wall on valid code on x86_64-linux-gnu in…

re PR c++/70386 (ICE with -Wall on valid code on x86_64-linux-gnu in verify_ctor_sanity, at cp/constexpr.c:2232)

	PR c++/70386

	* constexpr.c (cxx_eval_bare_aggregate): Handle PMFs.

From-SVN: r234469
parent 00e6c25a
2016-03-24 Jason Merrill <jason@redhat.com> 2016-03-24 Jason Merrill <jason@redhat.com>
PR c++/70386
* constexpr.c (cxx_eval_bare_aggregate): Handle PMFs.
PR c++/70323 PR c++/70323
* constexpr.c (cxx_eval_call_expression): Don't cache result if * constexpr.c (cxx_eval_call_expression): Don't cache result if
*overflow_p. *overflow_p.
......
...@@ -2268,8 +2268,19 @@ cxx_eval_bare_aggregate (const constexpr_ctx *ctx, tree t, ...@@ -2268,8 +2268,19 @@ cxx_eval_bare_aggregate (const constexpr_ctx *ctx, tree t,
vec<constructor_elt, va_gc> *v = CONSTRUCTOR_ELTS (t); vec<constructor_elt, va_gc> *v = CONSTRUCTOR_ELTS (t);
bool changed = false; bool changed = false;
gcc_assert (!BRACE_ENCLOSED_INITIALIZER_P (t)); gcc_assert (!BRACE_ENCLOSED_INITIALIZER_P (t));
tree type = TREE_TYPE (t);
verify_ctor_sanity (ctx, TREE_TYPE (t)); constexpr_ctx new_ctx;
if (TYPE_PTRMEMFUNC_P (type))
{
/* We don't really need the ctx->ctor business for a PMF, but it's
simpler to use the same code. */
new_ctx = *ctx;
new_ctx.ctor = build_constructor (type, NULL);
new_ctx.object = NULL_TREE;
ctx = &new_ctx;
};
verify_ctor_sanity (ctx, type);
vec<constructor_elt, va_gc> **p = &CONSTRUCTOR_ELTS (ctx->ctor); vec<constructor_elt, va_gc> **p = &CONSTRUCTOR_ELTS (ctx->ctor);
vec_alloc (*p, vec_safe_length (v)); vec_alloc (*p, vec_safe_length (v));
...@@ -2280,7 +2291,6 @@ cxx_eval_bare_aggregate (const constexpr_ctx *ctx, tree t, ...@@ -2280,7 +2291,6 @@ cxx_eval_bare_aggregate (const constexpr_ctx *ctx, tree t,
FOR_EACH_CONSTRUCTOR_ELT (v, i, index, value) FOR_EACH_CONSTRUCTOR_ELT (v, i, index, value)
{ {
tree orig_value = value; tree orig_value = value;
constexpr_ctx new_ctx;
init_subob_ctx (ctx, new_ctx, index, value); init_subob_ctx (ctx, new_ctx, index, value);
if (new_ctx.ctor != ctx->ctor) if (new_ctx.ctor != ctx->ctor)
/* If we built a new CONSTRUCTOR, attach it now so that other /* If we built a new CONSTRUCTOR, attach it now so that other
...@@ -2334,7 +2344,7 @@ cxx_eval_bare_aggregate (const constexpr_ctx *ctx, tree t, ...@@ -2334,7 +2344,7 @@ cxx_eval_bare_aggregate (const constexpr_ctx *ctx, tree t,
CONSTRUCTOR_NO_IMPLICIT_ZERO (t) = false; CONSTRUCTOR_NO_IMPLICIT_ZERO (t) = false;
TREE_CONSTANT (t) = constant_p; TREE_CONSTANT (t) = constant_p;
TREE_SIDE_EFFECTS (t) = side_effects_p; TREE_SIDE_EFFECTS (t) = side_effects_p;
if (VECTOR_TYPE_P (TREE_TYPE (t))) if (VECTOR_TYPE_P (type))
t = fold (t); t = fold (t);
return t; return t;
} }
......
// PR c++/70386
// { dg-options "-Wall" }
struct A { void f () {} };
struct B : public A {};
struct C : public A {};
struct D : public B, public C {};
typedef void (C::*cp) ();
typedef void (D::*dp) ();
int
main ()
{
cp c = &A::f;
dp d = c;
return (cp () == d);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment