diff options
author | Mark Mitchell <mark@markmitchell.com> | 1999-02-01 17:25:51 +0000 |
---|---|---|
committer | Mark Mitchell <mmitchel@gcc.gnu.org> | 1999-02-01 17:25:51 +0000 |
commit | 5326f06d7f73eae07a3c8825873f7a2358dfa0e2 (patch) | |
tree | 308c8cc2b06d72347ff273085f88ed308474a783 | |
parent | 1328d92f8159120827a74b3488d845dc36de9d9b (diff) | |
download | gcc-5326f06d7f73eae07a3c8825873f7a2358dfa0e2.zip gcc-5326f06d7f73eae07a3c8825873f7a2358dfa0e2.tar.gz gcc-5326f06d7f73eae07a3c8825873f7a2358dfa0e2.tar.bz2 |
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
-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>; |