aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2019-03-21 23:03:07 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2019-03-21 23:03:07 +0100
commit8c8b42cf72f677e004909b2ab3b3f12353fb94d5 (patch)
tree6f6420ed0bc94abda56c58b3cdb96da5edc89d8c
parent152d47df7f625885ae972386c759330cea6b169e (diff)
downloadgcc-8c8b42cf72f677e004909b2ab3b3f12353fb94d5.zip
gcc-8c8b42cf72f677e004909b2ab3b3f12353fb94d5.tar.gz
gcc-8c8b42cf72f677e004909b2ab3b3f12353fb94d5.tar.bz2
re PR c++/71446 (Incorrect overload resolution when using designated initializers)
PR c++/71446 * call.c (filed_in_pset): Change pset from hash_set<tree> * to hash_set<tree, true> &, adjust uses accordingly. (build_aggr_conv): Change pset from hash_set<tree> * to hash_set<tree, true>. Replace goto fail; with return NULL;, adjust pset uses. From-SVN: r269861
-rw-r--r--gcc/cp/ChangeLog7
-rw-r--r--gcc/cp/call.c29
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 <jakub@redhat.com>
+ PR c++/71446
+ * call.c (filed_in_pset): Change pset from hash_set<tree> * to
+ hash_set<tree, true> &, adjust uses accordingly.
+ (build_aggr_conv): Change pset from hash_set<tree> *
+ to hash_set<tree, true>. 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<tree> *pset, tree field)
+field_in_pset (hash_set<tree, true> &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<tree> *pset = NULL;
+ hash_set<tree, true> 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<tree>;
- 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;