PR c++/71515 - typename in partial specialization

* pt.c (resolve_typename_type): Try to avoid calling
	currently_open_class.

From-SVN: r238696
This commit is contained in:
Jason Merrill 2016-07-24 19:40:05 -04:00 committed by Jason Merrill
parent 635c1074be
commit 8a61db89b2
3 changed files with 25 additions and 14 deletions

View File

@ -1,3 +1,9 @@
2016-07-24 Jason Merrill <jason@redhat.com>
PR c++/71515
* pt.c (resolve_typename_type): Try to avoid calling
currently_open_class.
2016-07-23 Jason Merrill <jason@redhat.com> 2016-07-23 Jason Merrill <jason@redhat.com>
PR c++/66617 PR c++/66617

View File

@ -23678,29 +23678,26 @@ resolve_typename_type (tree type, bool only_current_p)
} }
/* If we don't know what SCOPE refers to, then we cannot resolve the /* If we don't know what SCOPE refers to, then we cannot resolve the
TYPENAME_TYPE. */ TYPENAME_TYPE. */
if (TREE_CODE (scope) == TYPENAME_TYPE) if (!CLASS_TYPE_P (scope))
return type;
/* If the SCOPE is a template type parameter, we have no way of
resolving the name. */
if (TREE_CODE (scope) == TEMPLATE_TYPE_PARM)
return type;
/* If the SCOPE is not the current instantiation, there's no reason
to look inside it. */
if (only_current_p && !currently_open_class (scope))
return type; return type;
/* If this is a typedef, we don't want to look inside (c++/11987). */ /* If this is a typedef, we don't want to look inside (c++/11987). */
if (typedef_variant_p (type)) if (typedef_variant_p (type))
return type; return type;
/* If SCOPE isn't the template itself, it will not have a valid /* If SCOPE isn't the template itself, it will not have a valid
TYPE_FIELDS list. */ TYPE_FIELDS list. */
if (CLASS_TYPE_P (scope) if (same_type_p (scope, CLASSTYPE_PRIMARY_TEMPLATE_TYPE (scope)))
&& same_type_p (scope, CLASSTYPE_PRIMARY_TEMPLATE_TYPE (scope)))
/* scope is either the template itself or a compatible instantiation /* scope is either the template itself or a compatible instantiation
like X<T>, so look up the name in the original template. */ like X<T>, so look up the name in the original template. */
scope = CLASSTYPE_PRIMARY_TEMPLATE_TYPE (scope); scope = CLASSTYPE_PRIMARY_TEMPLATE_TYPE (scope);
else /* We shouldn't have built a TYPENAME_TYPE with a non-dependent scope. */
/* scope is a partial instantiation, so we can't do the lookup or we gcc_checking_assert (uses_template_parms (scope));
will lose the template arguments. */ /* If scope has no fields, it can't be a current instantiation. Check this
before currently_open_class to avoid infinite recursion (71515). */
if (!TYPE_FIELDS (scope))
return type;
/* If the SCOPE is not the current instantiation, there's no reason
to look inside it. */
if (only_current_p && !currently_open_class (scope))
return type; return type;
/* Enter the SCOPE so that name lookup will be resolved as if we /* Enter the SCOPE so that name lookup will be resolved as if we
were in the class definition. In particular, SCOPE will no were in the class definition. In particular, SCOPE will no

View File

@ -0,0 +1,8 @@
// PR c++/71515
template < typename, typename = int > struct A;
template < typename T > struct A < T, typename A < T >::type >
{
A < int > *a;
};