mirror of git://gcc.gnu.org/git/gcc.git
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:
parent
635c1074be
commit
8a61db89b2
|
|
@ -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
|
||||||
|
|
|
||||||
25
gcc/cp/pt.c
25
gcc/cp/pt.c
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
};
|
||||||
Loading…
Reference in New Issue