Commit e514ab0c by Nathan Sidwell Committed by Nathan Sidwell

PR c++/80891 (#1)

	PR c++/80891 (#1)
	* pt.c (most_specialized_instantiation): Cope with duplicate
	instantiations.

	PR c++/80891 (#1)
	* g++.dg/lookup/pr80891-1.C: New.

From-SVN: r248573
parent 58dec010
2017-05-29 Nathan Sidwell <nathan@acm.org> 2017-05-29 Nathan Sidwell <nathan@acm.org>
PR c++/80891 (#1)
* pt.c (most_specialized_instantiation): Cope with duplicate
instantiations.
PR c++/80891 (#3) PR c++/80891 (#3)
* cp-tree.h (build_min_nt_call_vec): Declare. * cp-tree.h (build_min_nt_call_vec): Declare.
* decl.c (build_offset_ref_call_from_tree): Call it. * decl.c (build_offset_ref_call_from_tree): Call it.
......
...@@ -21728,31 +21728,32 @@ most_specialized_instantiation (tree templates) ...@@ -21728,31 +21728,32 @@ most_specialized_instantiation (tree templates)
champ = templates; champ = templates;
for (fn = TREE_CHAIN (templates); fn; fn = TREE_CHAIN (fn)) for (fn = TREE_CHAIN (templates); fn; fn = TREE_CHAIN (fn))
{ if (TREE_VALUE (champ) != TREE_VALUE (fn))
int fate = more_specialized_inst (TREE_VALUE (champ), TREE_VALUE (fn)); {
if (fate == -1) int fate = more_specialized_inst (TREE_VALUE (champ), TREE_VALUE (fn));
champ = fn; if (fate == -1)
else if (!fate)
{
/* Equally specialized, move to next function. If there
is no next function, nothing's most specialized. */
fn = TREE_CHAIN (fn);
champ = fn; champ = fn;
if (!fn) else if (!fate)
break; {
} /* Equally specialized, move to next function. If there
} is no next function, nothing's most specialized. */
fn = TREE_CHAIN (fn);
champ = fn;
if (!fn)
break;
}
}
if (champ) if (champ)
/* Now verify that champ is better than everything earlier in the /* Now verify that champ is better than everything earlier in the
instantiation list. */ instantiation list. */
for (fn = templates; fn != champ; fn = TREE_CHAIN (fn)) { for (fn = templates; fn != champ; fn = TREE_CHAIN (fn))
if (more_specialized_inst (TREE_VALUE (champ), TREE_VALUE (fn)) != 1) if (TREE_VALUE (champ) != TREE_VALUE (fn)
{ && more_specialized_inst (TREE_VALUE (champ), TREE_VALUE (fn)) != 1)
champ = NULL_TREE; {
break; champ = NULL_TREE;
} break;
} }
processing_template_decl--; processing_template_decl--;
......
2017-05-29 Nathan Sidwell <nathan@acm.org> 2017-05-29 Nathan Sidwell <nathan@acm.org>
PR c++/80891 (#1)
* g++.dg/lookup/pr80891-1.C: New.
PR c++/80891 (#3) PR c++/80891 (#3)
* g++.dg/lookup/pr80891-3.C: New. * g++.dg/lookup/pr80891-3.C: New.
......
// PR c++/80891 part 1
// std::endl is found via two paths and most_specialized_instantiation
// gets confused.
namespace std {
struct A {
void operator<<(A(A));
};
template <typename _CharT, typename _Traits> _CharT endl(_Traits);
A a;
}
using std::endl;
void chi_squared_sample_sized()
{
using namespace std;
a << endl;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment