From 5326f06d7f73eae07a3c8825873f7a2358dfa0e2 Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Mon, 1 Feb 1999 17:25:51 +0000 Subject: [PATCH] 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 --- gcc/cp/ChangeLog | 5 +++++ gcc/cp/pt.c | 3 ++- gcc/testsuite/g++.old-deja/g++.pt/spec28.C | 25 ++++++++++++++++++++++ 3 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.old-deja/g++.pt/spec28.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 7c283874e97..d74c484dc5e 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +1999-02-01 Mark Mitchell + + * 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 * input.c (inline): Don't define, its handled by system.h. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 1db903dadc8..901005b7cf9 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 00000000000..d63e7967672 --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.pt/spec28.C @@ -0,0 +1,25 @@ +// Build don't link: + +template +struct S1 { + friend bool f<>(const S1&); + typedef T X; +}; + +template +struct S2 { +}; + +template +struct S2 > { + typedef typename S1::X Y; +}; + +template +bool f(T); + +template +typename S2 >::Y +f(const S1&); + +template struct S1;