C++ PATCH for typename
Mark Mitchell
mark@codesourcery.com
Fri Apr 16 18:06:00 GMT 1999
Here's another typename patch, this time for the non-implicit variety.
--
Mark Mitchell mark@codesourcery.com
CodeSourcery, LLC http://www.codesourcery.com
1999-04-16 Mark Mitchell <mark@codesourcery.com>
* class.c (finish_struct): Remove unused variable.
(pushclass): Likewise.
(invalidate_class_lookup_cache): Likewise.
* cp-tree.def (TYPENAME_TYPE): Improve documentation.
* decl.c (build_typename_type): Make sure TYPENAME_TYPE_FULLNAME
doesn't get obliterated.
(make_typename_type): Handle template classes correctly.
Index: testsuite/g++.old-deja/g++.pt/typename22.C
===================================================================
RCS file: typename22.C
diff -N typename22.C
--- /dev/null Sat Dec 5 20:30:03 1998
+++ typename22.C Fri Apr 16 17:53:38 1999
@@ -0,0 +1,17 @@
+// Build don't link:
+// Origin: Mark Mitchell <mark@codesourcery.com>
+
+template <class T>
+struct S {
+ template <class U>
+ struct I {
+ typedef U X;
+
+ X f();
+ };
+};
+
+
+template <class T>
+template <class U>
+typename S<T>::I<U>::X S<T>::I<U>::f() {}
Index: cp/class.c
===================================================================
RCS file: /egcs/carton/cvsfiles/egcs/gcc/cp/class.c,v
retrieving revision 1.148
diff -u -p -r1.148 class.c
--- class.c 1999/04/16 13:16:45 1.148
+++ class.c 1999/04/17 00:53:42
@@ -4160,7 +4160,6 @@ finish_struct (t, attributes, warn_anon)
int warn_anon;
{
tree name = TYPE_NAME (t);
- tree x;
if (TREE_CODE (name) == TYPE_DECL)
{
@@ -4481,8 +4480,6 @@ pushclass (type, modify)
if (modify)
{
- tree tags;
-
if (type != previous_class_type || current_class_depth > 1)
push_class_decls (type);
else
@@ -4519,7 +4516,6 @@ pushclass (type, modify)
void
invalidate_class_lookup_cache ()
{
- tree tags = CLASSTYPE_TAGS (previous_class_type);
tree t;
/* This code can be seen as a cache miss. When we've cached a
Index: cp/cp-tree.def
===================================================================
RCS file: /egcs/carton/cvsfiles/egcs/gcc/cp/cp-tree.def,v
retrieving revision 1.26
diff -u -p -r1.26 cp-tree.def
--- cp-tree.def 1999/04/02 15:35:58 1.26
+++ cp-tree.def 1999/04/17 00:53:42
@@ -144,9 +144,11 @@ DEFTREECODE (TEMPLATE_TYPE_PARM, "templa
DEFTREECODE (TEMPLATE_TEMPLATE_PARM, "template_template_parm", 't', 0)
/* A type designated by `typename T::t'. TYPE_CONTEXT is `T',
- TYPE_NAME is a TYPE_DECL for `t'. If TREE_TYPE is present, this
- type was generated by the implicit typename extension, and the
- TREE_TYPE is a _TYPE from a baseclass of `T'. */
+ TYPE_NAME is an IDENTIFIER_NODE for `t'. If the type was named via
+ template-id, TYPENAME_TYPE_FULLNAME will hold the TEMPLATE_ID_EXPR.
+ If TREE_TYPE is present, this type was generated by the implicit
+ typename extension, and the TREE_TYPE is a _TYPE from a baseclass
+ of `T'. */
DEFTREECODE (TYPENAME_TYPE, "typename_type", 't', 0)
/* A type designated by `__typeof (expr)'. TYPE_FIELDS is the
Index: cp/decl.c
===================================================================
RCS file: /egcs/carton/cvsfiles/egcs/gcc/cp/decl.c,v
retrieving revision 1.346
diff -u -p -r1.346 decl.c
--- decl.c 1999/04/16 13:16:47 1.346
+++ decl.c 1999/04/17 00:53:51
@@ -5302,6 +5302,11 @@ build_typename_type (context, name, full
&typename_compare))
fatal ("virtual memory exhausted");
+ /* The FULLNAME needs to exist for the life of the hash table, i.e.,
+ for the entire compilation. */
+ if (!TREE_PERMANENT (fullname))
+ fullname = copy_to_permanent (fullname);
+
/* Build the TYPENAME_TYPE. */
t = make_lang_type (TYPENAME_TYPE);
TYPE_CONTEXT (t) = FROB_CONTEXT (context);
@@ -5341,7 +5346,17 @@ make_typename_type (context, name)
tree fullname;
if (TREE_CODE_CLASS (TREE_CODE (name)) == 't')
- name = TYPE_IDENTIFIER (name);
+ {
+ if (!(TYPE_LANG_SPECIFIC (name)
+ && (CLASSTYPE_IS_TEMPLATE (name)
+ || CLASSTYPE_USE_TEMPLATE (name))))
+ name = TYPE_IDENTIFIER (name);
+ else
+ /* Create a TEMPLATE_ID_EXPR for the type. */
+ name = build_nt (TEMPLATE_ID_EXPR,
+ CLASSTYPE_TI_TEMPLATE (name),
+ CLASSTYPE_TI_ARGS (name));
+ }
else if (TREE_CODE (name) == TYPE_DECL)
name = DECL_NAME (name);
More information about the Gcc-patches
mailing list