From 8c8b42cf72f677e004909b2ab3b3f12353fb94d5 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Thu, 21 Mar 2019 23:03:07 +0100 Subject: [PATCH] re PR c++/71446 (Incorrect overload resolution when using designated initializers) PR c++/71446 * call.c (filed_in_pset): Change pset from hash_set * to hash_set &, adjust uses accordingly. (build_aggr_conv): Change pset from hash_set * to hash_set. Replace goto fail; with return NULL;, adjust pset uses. From-SVN: r269861 --- gcc/cp/ChangeLog | 7 +++++++ gcc/cp/call.c | 29 ++++++++++------------------- 2 files changed, 17 insertions(+), 19 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 741ad48..61cf384 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,12 @@ 2019-03-21 Jakub Jelinek + PR c++/71446 + * call.c (filed_in_pset): Change pset from hash_set * to + hash_set &, adjust uses accordingly. + (build_aggr_conv): Change pset from hash_set * + to hash_set. Replace goto fail; with return NULL;, + adjust pset uses. + PR c++/89767 * parser.c (cp_parser_lambda_introducer): Add ids and first_capture_id variables, check for duplicates in this function. diff --git a/gcc/cp/call.c b/gcc/cp/call.c index d1f5055..a4adab2 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -907,9 +907,9 @@ can_convert_array (tree atype, tree ctor, int flags, tsubst_flags_t complain) is in PSET. */ static bool -field_in_pset (hash_set *pset, tree field) +field_in_pset (hash_set &pset, tree field) { - if (pset->contains (field)) + if (pset.contains (field)) return true; if (ANON_AGGR_TYPE_P (TREE_TYPE (field))) for (field = TYPE_FIELDS (TREE_TYPE (field)); @@ -934,7 +934,7 @@ build_aggr_conv (tree type, tree ctor, int flags, tsubst_flags_t complain) conversion *c; tree field = next_initializable_field (TYPE_FIELDS (type)); tree empty_ctor = NULL_TREE; - hash_set *pset = NULL; + hash_set pset; /* We already called reshape_init in implicit_conversion. */ @@ -964,7 +964,7 @@ build_aggr_conv (tree type, tree ctor, int flags, tsubst_flags_t complain) complain); if (!ok) - goto fail; + return NULL; /* For unions, there should be just one initializer. */ if (TREE_CODE (type) == UNION_TYPE) { @@ -972,12 +972,10 @@ build_aggr_conv (tree type, tree ctor, int flags, tsubst_flags_t complain) i = 1; break; } - if (pset == NULL) - pset = new hash_set; - pset->add (idx); + pset.add (idx); } else - goto fail; + return NULL; } } @@ -987,7 +985,7 @@ build_aggr_conv (tree type, tree ctor, int flags, tsubst_flags_t complain) tree val; bool ok; - if (pset && field_in_pset (pset, field)) + if (pset.elements () && field_in_pset (pset, field)) continue; if (i < CONSTRUCTOR_NELTS (ctor)) { @@ -998,7 +996,7 @@ build_aggr_conv (tree type, tree ctor, int flags, tsubst_flags_t complain) val = get_nsdmi (field, /*ctor*/false, complain); else if (TYPE_REF_P (ftype)) /* Value-initialization of reference is ill-formed. */ - goto fail; + return NULL; else { if (empty_ctor == NULL_TREE) @@ -1014,22 +1012,15 @@ build_aggr_conv (tree type, tree ctor, int flags, tsubst_flags_t complain) complain); if (!ok) - goto fail; + return NULL; if (TREE_CODE (type) == UNION_TYPE) break; } if (i < CONSTRUCTOR_NELTS (ctor)) - { - fail: - if (pset) - delete pset; - return NULL; - } + return NULL; - if (pset) - delete pset; c = alloc_conversion (ck_aggr); c->type = type; c->rank = cr_exact; -- 2.7.4