mirror of git://gcc.gnu.org/git/gcc.git
pt.c (reregister_specialization): Use htab_find instead of htab_find_slot with INSERT.
* pt.c (reregister_specialization): Use htab_find instead of htab_find_slot with INSERT. (maybe_process_partial_specialization, lookup_template_class_1): Change slot variable type to void ** to avoid aliasing problems. (register_specialization): Likewise. Use slot != NULL instead of more expensive !optimize_specialization_lookup_p (tmpl) test. Co-Authored-By: Diego Novillo <dnovillo@google.com> From-SVN: r179719
This commit is contained in:
parent
367f06ae31
commit
68e291ec19
|
|
@ -1,3 +1,13 @@
|
||||||
|
2011-10-09 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
Diego Novillo <dnovillo@google.com>
|
||||||
|
|
||||||
|
* pt.c (reregister_specialization): Use htab_find instead of
|
||||||
|
htab_find_slot with INSERT.
|
||||||
|
(maybe_process_partial_specialization, lookup_template_class_1): Change
|
||||||
|
slot variable type to void ** to avoid aliasing problems.
|
||||||
|
(register_specialization): Likewise. Use slot != NULL instead of
|
||||||
|
more expensive !optimize_specialization_lookup_p (tmpl) test.
|
||||||
|
|
||||||
2011-10-08 Paolo Carlini <paolo.carlini@oracle.com>
|
2011-10-08 Paolo Carlini <paolo.carlini@oracle.com>
|
||||||
|
|
||||||
PR c++/34927
|
PR c++/34927
|
||||||
|
|
|
||||||
45
gcc/cp/pt.c
45
gcc/cp/pt.c
|
|
@ -892,7 +892,8 @@ maybe_process_partial_specialization (tree type)
|
||||||
instantiation. Reassign it to the new member
|
instantiation. Reassign it to the new member
|
||||||
specialization template. */
|
specialization template. */
|
||||||
spec_entry elt;
|
spec_entry elt;
|
||||||
spec_entry **slot;
|
spec_entry *entry;
|
||||||
|
void **slot;
|
||||||
|
|
||||||
elt.tmpl = most_general_template (tmpl);
|
elt.tmpl = most_general_template (tmpl);
|
||||||
elt.args = CLASSTYPE_TI_ARGS (inst);
|
elt.args = CLASSTYPE_TI_ARGS (inst);
|
||||||
|
|
@ -903,10 +904,10 @@ maybe_process_partial_specialization (tree type)
|
||||||
elt.tmpl = tmpl;
|
elt.tmpl = tmpl;
|
||||||
elt.args = INNERMOST_TEMPLATE_ARGS (elt.args);
|
elt.args = INNERMOST_TEMPLATE_ARGS (elt.args);
|
||||||
|
|
||||||
slot = (spec_entry **)
|
slot = htab_find_slot (type_specializations, &elt, INSERT);
|
||||||
htab_find_slot (type_specializations, &elt, INSERT);
|
entry = ggc_alloc_spec_entry ();
|
||||||
*slot = ggc_alloc_spec_entry ();
|
*entry = elt;
|
||||||
**slot = elt;
|
*slot = entry;
|
||||||
}
|
}
|
||||||
else if (COMPLETE_OR_OPEN_TYPE_P (inst))
|
else if (COMPLETE_OR_OPEN_TYPE_P (inst))
|
||||||
/* But if we've had an implicit instantiation, that's a
|
/* But if we've had an implicit instantiation, that's a
|
||||||
|
|
@ -1294,7 +1295,7 @@ register_specialization (tree spec, tree tmpl, tree args, bool is_friend,
|
||||||
hashval_t hash)
|
hashval_t hash)
|
||||||
{
|
{
|
||||||
tree fn;
|
tree fn;
|
||||||
spec_entry **slot = NULL;
|
void **slot = NULL;
|
||||||
spec_entry elt;
|
spec_entry elt;
|
||||||
|
|
||||||
gcc_assert (TREE_CODE (tmpl) == TEMPLATE_DECL && DECL_P (spec));
|
gcc_assert (TREE_CODE (tmpl) == TEMPLATE_DECL && DECL_P (spec));
|
||||||
|
|
@ -1327,10 +1328,10 @@ register_specialization (tree spec, tree tmpl, tree args, bool is_friend,
|
||||||
if (hash == 0)
|
if (hash == 0)
|
||||||
hash = hash_specialization (&elt);
|
hash = hash_specialization (&elt);
|
||||||
|
|
||||||
slot = (spec_entry **)
|
slot =
|
||||||
htab_find_slot_with_hash (decl_specializations, &elt, hash, INSERT);
|
htab_find_slot_with_hash (decl_specializations, &elt, hash, INSERT);
|
||||||
if (*slot)
|
if (*slot)
|
||||||
fn = (*slot)->spec;
|
fn = ((spec_entry *) *slot)->spec;
|
||||||
else
|
else
|
||||||
fn = NULL_TREE;
|
fn = NULL_TREE;
|
||||||
}
|
}
|
||||||
|
|
@ -1423,11 +1424,12 @@ register_specialization (tree spec, tree tmpl, tree args, bool is_friend,
|
||||||
&& !check_specialization_namespace (tmpl))
|
&& !check_specialization_namespace (tmpl))
|
||||||
DECL_CONTEXT (spec) = DECL_CONTEXT (tmpl);
|
DECL_CONTEXT (spec) = DECL_CONTEXT (tmpl);
|
||||||
|
|
||||||
if (!optimize_specialization_lookup_p (tmpl))
|
if (slot != NULL /* !optimize_specialization_lookup_p (tmpl) */)
|
||||||
{
|
{
|
||||||
|
spec_entry *entry = ggc_alloc_spec_entry ();
|
||||||
gcc_assert (tmpl && args && spec);
|
gcc_assert (tmpl && args && spec);
|
||||||
*slot = ggc_alloc_spec_entry ();
|
*entry = elt;
|
||||||
**slot = elt;
|
*slot = entry;
|
||||||
if (TREE_CODE (spec) == FUNCTION_DECL && DECL_NAMESPACE_SCOPE_P (spec)
|
if (TREE_CODE (spec) == FUNCTION_DECL && DECL_NAMESPACE_SCOPE_P (spec)
|
||||||
&& PRIMARY_TEMPLATE_P (tmpl)
|
&& PRIMARY_TEMPLATE_P (tmpl)
|
||||||
&& DECL_SAVED_TREE (DECL_TEMPLATE_RESULT (tmpl)) == NULL_TREE)
|
&& DECL_SAVED_TREE (DECL_TEMPLATE_RESULT (tmpl)) == NULL_TREE)
|
||||||
|
|
@ -1639,19 +1641,19 @@ iterative_hash_template_arg (tree arg, hashval_t val)
|
||||||
bool
|
bool
|
||||||
reregister_specialization (tree spec, tree tinfo, tree new_spec)
|
reregister_specialization (tree spec, tree tinfo, tree new_spec)
|
||||||
{
|
{
|
||||||
spec_entry **slot;
|
spec_entry *entry;
|
||||||
spec_entry elt;
|
spec_entry elt;
|
||||||
|
|
||||||
elt.tmpl = most_general_template (TI_TEMPLATE (tinfo));
|
elt.tmpl = most_general_template (TI_TEMPLATE (tinfo));
|
||||||
elt.args = TI_ARGS (tinfo);
|
elt.args = TI_ARGS (tinfo);
|
||||||
elt.spec = NULL_TREE;
|
elt.spec = NULL_TREE;
|
||||||
|
|
||||||
slot = (spec_entry **) htab_find_slot (decl_specializations, &elt, INSERT);
|
entry = (spec_entry *) htab_find (decl_specializations, &elt);
|
||||||
if (*slot)
|
if (entry != NULL)
|
||||||
{
|
{
|
||||||
gcc_assert ((*slot)->spec == spec || (*slot)->spec == new_spec);
|
gcc_assert (entry->spec == spec || entry->spec == new_spec);
|
||||||
gcc_assert (new_spec != NULL_TREE);
|
gcc_assert (new_spec != NULL_TREE);
|
||||||
(*slot)->spec = new_spec;
|
entry->spec = new_spec;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -7042,7 +7044,7 @@ lookup_template_class_1 (tree d1, tree arglist, tree in_decl, tree context,
|
||||||
{
|
{
|
||||||
tree templ = NULL_TREE, parmlist;
|
tree templ = NULL_TREE, parmlist;
|
||||||
tree t;
|
tree t;
|
||||||
spec_entry **slot;
|
void **slot;
|
||||||
spec_entry *entry;
|
spec_entry *entry;
|
||||||
spec_entry elt;
|
spec_entry elt;
|
||||||
hashval_t hash;
|
hashval_t hash;
|
||||||
|
|
@ -7480,10 +7482,11 @@ lookup_template_class_1 (tree d1, tree arglist, tree in_decl, tree context,
|
||||||
SET_TYPE_TEMPLATE_INFO (t, build_template_info (found, arglist));
|
SET_TYPE_TEMPLATE_INFO (t, build_template_info (found, arglist));
|
||||||
|
|
||||||
elt.spec = t;
|
elt.spec = t;
|
||||||
slot = (spec_entry **) htab_find_slot_with_hash (type_specializations,
|
slot = htab_find_slot_with_hash (type_specializations,
|
||||||
&elt, hash, INSERT);
|
&elt, hash, INSERT);
|
||||||
*slot = ggc_alloc_spec_entry ();
|
entry = ggc_alloc_spec_entry ();
|
||||||
**slot = elt;
|
*entry = elt;
|
||||||
|
*slot = entry;
|
||||||
|
|
||||||
/* Note this use of the partial instantiation so we can check it
|
/* Note this use of the partial instantiation so we can check it
|
||||||
later in maybe_process_partial_specialization. */
|
later in maybe_process_partial_specialization. */
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue