pt.c (tsubst, [...]): Check TYPE_BEING_DEFINED before calling complete_type_or_else.

* pt.c (tsubst, case TYPENAME_TYPE): Check TYPE_BEING_DEFINED
	before calling complete_type_or_else.

From-SVN: r24958
This commit is contained in:
Mark Mitchell 1999-02-01 17:25:51 +00:00 committed by Mark Mitchell
parent 1328d92f81
commit 5326f06d7f
3 changed files with 32 additions and 1 deletions

View File

@ -1,3 +1,8 @@
1999-02-01 Mark Mitchell <mark@markmitchell.com>
* pt.c (tsubst, case TYPENAME_TYPE): Check TYPE_BEING_DEFINED
before calling complete_type_or_else.
Mon Feb 1 09:49:52 1999 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> Mon Feb 1 09:49:52 1999 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* input.c (inline): Don't define, its handled by system.h. * input.c (inline): Don't define, its handled by system.h.

View File

@ -6083,7 +6083,8 @@ tsubst (t, args, in_decl)
But, such constructs have already been resolved by this But, such constructs have already been resolved by this
point, so here CTX really should have complete type, unless point, so here CTX really should have complete type, unless
it's a partial instantiation. */ it's a partial instantiation. */
if (!uses_template_parms (ctx) if (!uses_template_parms (ctx)
&& !TYPE_BEING_DEFINED (ctx)
&& !complete_type_or_else (ctx)) && !complete_type_or_else (ctx))
return error_mark_node; return error_mark_node;

View File

@ -0,0 +1,25 @@
// Build don't link:
template <class T>
struct S1 {
friend bool f<>(const S1&);
typedef T X;
};
template <class T>
struct S2 {
};
template <class T>
struct S2<S1<T> > {
typedef typename S1<T>::X Y;
};
template <class T>
bool f(T);
template <class T>
typename S2<S1<T> >::Y
f(const S1<T>&);
template struct S1<int>;