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
This commit is contained in:
parent
00e6c25ac8
commit
8a29084dea
3 changed files with 34 additions and 3 deletions
|
@ -1,5 +1,8 @@
|
|||
2016-03-24 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/70386
|
||||
* constexpr.c (cxx_eval_bare_aggregate): Handle PMFs.
|
||||
|
||||
PR c++/70323
|
||||
* constexpr.c (cxx_eval_call_expression): Don't cache result if
|
||||
*overflow_p.
|
||||
|
|
|
@ -2268,8 +2268,19 @@ cxx_eval_bare_aggregate (const constexpr_ctx *ctx, tree t,
|
|||
vec<constructor_elt, va_gc> *v = CONSTRUCTOR_ELTS (t);
|
||||
bool changed = false;
|
||||
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_alloc (*p, vec_safe_length (v));
|
||||
|
||||
|
@ -2280,7 +2291,6 @@ cxx_eval_bare_aggregate (const constexpr_ctx *ctx, tree t,
|
|||
FOR_EACH_CONSTRUCTOR_ELT (v, i, index, value)
|
||||
{
|
||||
tree orig_value = value;
|
||||
constexpr_ctx new_ctx;
|
||||
init_subob_ctx (ctx, new_ctx, index, value);
|
||||
if (new_ctx.ctor != ctx->ctor)
|
||||
/* 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,
|
|||
CONSTRUCTOR_NO_IMPLICIT_ZERO (t) = false;
|
||||
TREE_CONSTANT (t) = constant_p;
|
||||
TREE_SIDE_EFFECTS (t) = side_effects_p;
|
||||
if (VECTOR_TYPE_P (TREE_TYPE (t)))
|
||||
if (VECTOR_TYPE_P (type))
|
||||
t = fold (t);
|
||||
return t;
|
||||
}
|
||||
|
|
18
gcc/testsuite/g++.dg/expr/pmf-2.C
Normal file
18
gcc/testsuite/g++.dg/expr/pmf-2.C
Normal file
|
@ -0,0 +1,18 @@
|
|||
// 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);
|
||||
}
|
Loading…
Add table
Reference in a new issue