diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/pt.c | 3 | ||||
-rw-r--r-- | gcc/testsuite/g++.old-deja/g++.pt/spec28.C | 25 |
3 files changed, 32 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 7c28387..d74c484 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -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> * input.c (inline): Don't define, its handled by system.h. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 1db903d..901005b 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -6083,7 +6083,8 @@ tsubst (t, args, in_decl) But, such constructs have already been resolved by this point, so here CTX really should have complete type, unless it's a partial instantiation. */ - if (!uses_template_parms (ctx) + if (!uses_template_parms (ctx) + && !TYPE_BEING_DEFINED (ctx) && !complete_type_or_else (ctx)) return error_mark_node; diff --git a/gcc/testsuite/g++.old-deja/g++.pt/spec28.C b/gcc/testsuite/g++.old-deja/g++.pt/spec28.C new file mode 100644 index 0000000..d63e796 --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.pt/spec28.C @@ -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>; |