diff options
author | Mark Mitchell <mark@codesourcery.com> | 2001-06-06 07:03:03 +0000 |
---|---|---|
committer | Mark Mitchell <mmitchel@gcc.gnu.org> | 2001-06-06 07:03:03 +0000 |
commit | 47ee89044df766137024667ede685dd31e395164 (patch) | |
tree | 998675f5fec8669765dfc87eb49169b66b42f636 /gcc | |
parent | 1b577f5a5837afa14a231a94161fb3d9a83e9a46 (diff) | |
download | gcc-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/ChangeLog | 2 | ||||
-rw-r--r-- | gcc/cp/semantics.c | 25 | ||||
-rw-r--r-- | gcc/testsuite/g++.old-deja/g++.pt/memtemp99.C | 10 |
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 +}; |