Both do the exact same operation, just on different AST nodes.

gcc/d/ChangeLog:

        * d-codegen.cc (d_nested_class): Rename to ...
        (get_outer_function): ... this.  Handle all aggregate declarations.
        (d_nested_struct): Remove.
        (find_this_tree): Use get_outer_function.
        (get_framedecl): Likewise.
---
 gcc/d/d-codegen.cc | 54 ++++++++++++----------------------------------
 1 file changed, 14 insertions(+), 40 deletions(-)

diff --git a/gcc/d/d-codegen.cc b/gcc/d/d-codegen.cc
index f35de90b54c..fe2ad98e60a 100644
--- a/gcc/d/d-codegen.cc
+++ b/gcc/d/d-codegen.cc
@@ -2354,41 +2354,24 @@ get_frame_for_symbol (Dsymbol *sym)
   return null_pointer_node;
 }
 
-/* Return the parent function of a nested class CD.  */
+/* Return the parent function of a nested class or struct AD.  */
 
 static FuncDeclaration *
-d_nested_class (ClassDeclaration *cd)
+get_outer_function (AggregateDeclaration *ad)
 {
   FuncDeclaration *fd = NULL;
-  while (cd && cd->isNested ())
+  while (ad && ad->isNested ())
     {
-      Dsymbol *dsym = cd->toParent2 ();
+      Dsymbol *dsym = ad->toParent2 ();
       if ((fd = dsym->isFuncDeclaration ()))
        return fd;
       else
-       cd = dsym->isClassDeclaration ();
+       ad = dsym->isAggregateDeclaration ();
     }
-  return NULL;
-}
-
-/* Return the parent function of a nested struct SD.  */
 
-static FuncDeclaration *
-d_nested_struct (StructDeclaration *sd)
-{
-  FuncDeclaration *fd = NULL;
-  while (sd && sd->isNested ())
-    {
-      Dsymbol *dsym = sd->toParent2 ();
-      if ((fd = dsym->isFuncDeclaration ()))
-       return fd;
-      else
-       sd = dsym->isStructDeclaration ();
-    }
   return NULL;
 }
 
-
 /* Starting from the current function FD, try to find a suitable value of
    `this' in nested function instances.  A suitable `this' value is an
    instance of OCD or a class that has OCD as a base.  */
@@ -2411,18 +2394,17 @@ find_this_tree (ClassDeclaration *ocd)
            return convert_expr (get_decl_tree (fd->vthis),
                                 cd->type, ocd->type);
 
-         fd = d_nested_class (cd);
+         fd = get_outer_function (cd);
+         continue;
        }
-      else
-       {
-         if (fd->isNested ())
-           {
-             fd = fd->toParent2 ()->isFuncDeclaration ();
-             continue;
-           }
 
-         fd = NULL;
+      if (fd->isNested ())
+       {
+         fd = fd->toParent2 ()->isFuncDeclaration ();
+         continue;
        }
+
+      fd = NULL;
     }
 
   return NULL_TREE;
@@ -2760,10 +2742,6 @@ get_framedecl (FuncDeclaration *inner, FuncDeclaration 
*outer)
 
   while (fd && fd != outer)
     {
-      AggregateDeclaration *ad;
-      ClassDeclaration *cd;
-      StructDeclaration *sd;
-
       /* Parent frame link is the first field.  */
       if (FRAMEINFO_CREATES_FRAME (get_frameinfo (fd)))
        result = indirect_ref (ptr_type_node, result);
@@ -2773,12 +2751,8 @@ get_framedecl (FuncDeclaration *inner, FuncDeclaration 
*outer)
       /* The frame/closure record always points to the outer function's
         frame, even if there are intervening nested classes or structs.
         So, we can just skip over these.  */
-      else if ((ad = fd->isThis ()) && (cd = ad->isClassDeclaration ()))
-       fd = d_nested_class (cd);
-      else if ((ad = fd->isThis ()) && (sd = ad->isStructDeclaration ()))
-       fd = d_nested_struct (sd);
       else
-       break;
+       fd = get_outer_function (fd->isThis ());
     }
 
   if (fd != outer)
-- 
2.30.2

Reply via email to