aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMark Mitchell <mark@markmitchell.com>1999-02-01 17:25:51 +0000
committerMark Mitchell <mmitchel@gcc.gnu.org>1999-02-01 17:25:51 +0000
commit5326f06d7f73eae07a3c8825873f7a2358dfa0e2 (patch)
tree308c8cc2b06d72347ff273085f88ed308474a783 /gcc
parent1328d92f8159120827a74b3488d845dc36de9d9b (diff)
downloadgcc-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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/pt.c3
-rw-r--r--gcc/testsuite/g++.old-deja/g++.pt/spec28.C25
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>;