re PR c++/29105 (segfault in add_candidates with a non template base class and a template member function)

PR c++/29105
	* pt.c (tsubst_baselink): Substituteinto the qualifying scope.
	* semantics.c (baselink_for_fns): Build a baselink, even when
	processing a template.
	PR c++/29105
	* g++.dg/template/member6.C: New test.
	* g++.dg/parse/typename7.C: Adjust error markers.

From-SVN: r117361
This commit is contained in:
Mark Mitchell 2006-10-02 04:12:51 +00:00
parent 297d410513
commit 51a203d95e
4 changed files with 25 additions and 10 deletions

View File

@ -7779,15 +7779,15 @@ tsubst_baselink (tree baselink, tree object_type,
tree template_args = 0;
bool template_id_p = false;
/* A baselink indicates a function from a base class. The
BASELINK_ACCESS_BINFO and BASELINK_BINFO are going to have
non-dependent types; otherwise, the lookup could not have
succeeded. However, they may indicate bases of the template
class, rather than the instantiated class.
In addition, lookups that were not ambiguous before may be
ambiguous now. Therefore, we perform the lookup again. */
/* A baselink indicates a function from a base class. Both the
BASELINK_ACCESS_BINFO and the base class referenced may
indicate bases of the template class, rather than the
instantiated class. In addition, lookups that were not
ambiguous before may be ambiguous now. Therefore, we perform
the lookup again. */
qualifying_scope = BINFO_TYPE (BASELINK_ACCESS_BINFO (baselink));
qualifying_scope = tsubst (qualifying_scope, args,
complain, in_decl);
fns = BASELINK_FUNCTIONS (baselink);
optype = BASELINK_OPTYPE (baselink);
if (TREE_CODE (fns) == TEMPLATE_ID_EXPR)

View File

@ -2400,7 +2400,6 @@ baselink_for_fns (tree fns)
tree cl;
if (BASELINK_P (fns)
|| processing_template_decl
|| error_operand_p (fns))
return fns;

View File

@ -11,7 +11,7 @@ struct A
template<typename T> void bar(T t) {
this->foo<typename T>(t); } // { dg-error "expected|parse error|no matching" }
template<typename T> void bad(T t) {
foo<typename T>(t); } // { dg-error "expected|parse error" }
foo<typename T>(t); } // { dg-error "expected|parse error|no matching" }
};
template <typename T>

View File

@ -0,0 +1,16 @@
// PR c++/29105
struct Observer
{
template < typename T > void observeComponent ();
};
template < typename T >
struct TagFilter : Observer
{
TagFilter ()
{
observeComponent < int > ();
}
};