Commit 8a61db89 by Jason Merrill Committed by Jason Merrill

PR c++/71515 - typename in partial specialization

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

From-SVN: r238696
parent 635c1074
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
......
...@@ -23678,29 +23678,26 @@ resolve_typename_type (tree type, bool only_current_p) ...@@ -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
......
// PR c++/71515
template < typename, typename = int > struct A;
template < typename T > struct A < T, typename A < T >::type >
{
A < int > *a;
};
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