aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMark Mitchell <mark@codesourcery.com>2001-06-06 07:03:03 +0000
committerMark Mitchell <mmitchel@gcc.gnu.org>2001-06-06 07:03:03 +0000
commit47ee89044df766137024667ede685dd31e395164 (patch)
tree998675f5fec8669765dfc87eb49169b66b42f636 /gcc
parent1b577f5a5837afa14a231a94161fb3d9a83e9a46 (diff)
downloadgcc-47ee89044df766137024667ede685dd31e395164.zip
gcc-47ee89044df766137024667ede685dd31e395164.tar.gz
gcc-47ee89044df766137024667ede685dd31e395164.tar.bz2
* semantics.c (begin_class_definition): Robustify.
From-SVN: r42937
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog2
-rw-r--r--gcc/cp/semantics.c25
-rw-r--r--gcc/testsuite/g++.old-deja/g++.pt/memtemp99.C10
3 files changed, 30 insertions, 7 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 7c0ebc5..829c4da 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,7 @@
2001-06-05 Mark Mitchell <mark@codesourcery.com>
+ * semantics.c (begin_class_definition): Robustify.
+
* pt.c (instantiate_decl): Tell the repository code about the
clones, not the cloned functions.
* repo.c (repo_template_used): Explicitly instantiate the cloned
diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
index b30c80e..f1a9e77 100644
--- a/gcc/cp/semantics.c
+++ b/gcc/cp/semantics.c
@@ -1724,18 +1724,29 @@ begin_class_definition (t)
cp_error ("definition of `%#T' inside template parameter list", t);
return error_mark_node;
}
- if (t == error_mark_node
- || ! IS_AGGR_TYPE (t))
+
+ /* In a definition of a member class template, we will get here with
+ an implicit typename. */
+ if (IMPLICIT_TYPENAME_P (t))
+ t = TREE_TYPE (t);
+ /* A non-implicit typename comes from code like:
+
+ template <typename T> struct A {
+ template <typename U> struct A<T>::B ...
+
+ This is erroneous. */
+ else if (TREE_CODE (t) == TYPENAME_TYPE)
+ {
+ cp_error ("invalid definition of qualified type `%T'", t);
+ t = error_mark_node;
+ }
+
+ if (t == error_mark_node || ! IS_AGGR_TYPE (t))
{
t = make_aggr_type (RECORD_TYPE);
pushtag (make_anon_name (), t, 0);
}
- /* In a definition of a member class template, we will get here with an
- implicit typename, a TYPENAME_TYPE with a type. */
- if (TREE_CODE (t) == TYPENAME_TYPE)
- t = TREE_TYPE (t);
-
/* If we generated a partial instantiation of this type, but now
we're seeing a real definition, we're actually looking at a
partial specialization. Consider:
diff --git a/gcc/testsuite/g++.old-deja/g++.pt/memtemp99.C b/gcc/testsuite/g++.old-deja/g++.pt/memtemp99.C
new file mode 100644
index 0000000..2295bea
--- /dev/null
+++ b/gcc/testsuite/g++.old-deja/g++.pt/memtemp99.C
@@ -0,0 +1,10 @@
+// Build don't link:
+// Origin: bitti@cs.tut.fi
+
+template<typename T, unsigned int N>
+class Vector
+{
+public:
+ template<unsigned int I>
+ class Vector<T,N>::CommaInit { }; // ERROR - invalid definition
+};