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,6 +21728,7 @@ most_specialized_instantiation (tree templates) ...@@ -21728,6 +21728,7 @@ 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)); int fate = more_specialized_inst (TREE_VALUE (champ), TREE_VALUE (fn));
if (fate == -1) if (fate == -1)
...@@ -21746,13 +21747,13 @@ most_specialized_instantiation (tree templates) ...@@ -21746,13 +21747,13 @@ most_specialized_instantiation (tree templates)
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; champ = NULL_TREE;
break; 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