]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
class.c (finish_struct): Remove unused variable.
authorMark Mitchell <mark@codesourcery.com>
Fri, 16 Apr 1999 18:06:34 +0000 (18:06 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Fri, 16 Apr 1999 18:06:34 +0000 (18:06 +0000)
* 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.

From-SVN: r26507

gcc/cp/ChangeLog
gcc/cp/class.c
gcc/cp/cp-tree.def
gcc/cp/decl.c
gcc/testsuite/g++.old-deja/g++.pt/typename22.C [new file with mode: 0644]

index b7b3a85d98042b3d62be0097e7342b705913f851..67cc7e1f019f249d2436e81002ab0a618c9696b5 100644 (file)
@@ -1,5 +1,13 @@
 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.
+
        * cp-tree.h (TREE_NONLOCAL_FLAG): Remove.
        (storetags): Declare.
        * class.c (finish_struct): Don't use TREE_NONLOCAL_FLAG.
index cc23b29cc134e2282b0e0d0947223ecc271401b0..ac762b5b64b99b730724c30e6b707a3df8587c00 100644 (file)
@@ -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 090d83724aca727bd728c3aab4f72dd0cc4972ea..da0f1642fd85a9822935bf815d57f350e4171bde 100644 (file)
@@ -144,9 +144,11 @@ DEFTREECODE (TEMPLATE_TYPE_PARM, "template_type_parm", 't', 0)
 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 d1f722cdb1965f79b9c7f94141a4ed9723d78c6c..5730719c89b449a31e225cd7186afa04b97e804c 100644 (file)
@@ -5302,6 +5302,11 @@ build_typename_type (context, name, fullname, base_type)
                           &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);
 
diff --git a/gcc/testsuite/g++.old-deja/g++.pt/typename22.C b/gcc/testsuite/g++.old-deja/g++.pt/typename22.C
new file mode 100644 (file)
index 0000000..86a82df
--- /dev/null
@@ -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() {}