From 2db613e5d3a2698fcd32460ad23b0c1b8ae31c7a Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Tue, 4 Oct 2016 17:14:18 -0400 Subject: PR c++/77775 - misoptimization of PMF comparison * constexpr.c (cxx_eval_component_reference): Use name matching for PMFs. From-SVN: r240757 --- gcc/cp/constexpr.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'gcc/cp/constexpr.c') diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c index 2db13d2e187..4acbb2600b4 100644 --- a/gcc/cp/constexpr.c +++ b/gcc/cp/constexpr.c @@ -2315,9 +2315,13 @@ cxx_eval_component_reference (const constexpr_ctx *ctx, tree t, } if (*non_constant_p) return t; + bool pmf = TYPE_PTRMEMFUNC_P (TREE_TYPE (whole)); FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (whole), i, field, value) { - if (field == part) + /* Use name match for PMF fields, as a variant will have a + different FIELD_DECL with a different type. */ + if (pmf ? DECL_NAME (field) == DECL_NAME (part) + : field == part) { if (value) return value; @@ -2342,6 +2346,8 @@ cxx_eval_component_reference (const constexpr_ctx *ctx, tree t, if (is_really_empty_class (TREE_TYPE (t))) return build_constructor (TREE_TYPE (t), NULL); + gcc_assert (DECL_CONTEXT (part) == TYPE_MAIN_VARIANT (TREE_TYPE (whole))); + if (CONSTRUCTOR_NO_IMPLICIT_ZERO (whole)) { /* 'whole' is part of the aggregate initializer we're currently -- cgit v1.2.1