[committed] d: Set up input_location before lowering Dsymbol AST

Message ID 20200602105556.5923-1-ibuclaw@gdcproject.org
State New
Headers show
Series
  • [committed] d: Set up input_location before lowering Dsymbol AST
Related show

Commit Message

Kewen.Lin via Gcc-patches June 2, 2020, 10:55 a.m.
Hi,

Like a similarly named function in the visitor class for statements,
this ensures that the current input_location is set to the correct
source file location of the decl.

It is likely that there are a number of cases where declarations have
ended up with no location without this.

Bootstrapped and regression tested on x86_64-linux-gnu, and committed to
mainline.

Regards
Iain


gcc/d/ChangeLog:

	* decl.cc (DeclVisitor::build_dsymbol): New function.
	(DeclVisitor::visit (TupleDeclaration *)): Use build_dsymbol to
	traverse AST instead of accept.
	(DeclVisitor::visit (AttribDeclaration *)): Likewise.
	(DeclVisitor::visit (Nspace *)): Likewise.
	(DeclVisitor::visit (TemplateDeclaration *)): Likewise.
	(DeclVisitor::visit (TemplateInstance *)): Likewise.
	(DeclVisitor::visit (TemplateMixin *)): Likewise.
	(DeclVisitor::visit (StructDeclaration *)): Likewise.
	(DeclVisitor::visit (ClassDeclaration *)): Likewise.
	(DeclVisitor::visit (InterfaceDeclaration *)): Likewise.
	(DeclVisitor::visit (VarDeclaration *)): Likewise.
	(build_decl_tree): Likewise.
---
 gcc/d/decl.cc | 67 +++++++++++++++++++++------------------------------
 1 file changed, 28 insertions(+), 39 deletions(-)

-- 
2.20.1

Patch

diff --git a/gcc/d/decl.cc b/gcc/d/decl.cc
index 845fc5cf877..7dab5c7e88c 100644
--- a/gcc/d/decl.cc
+++ b/gcc/d/decl.cc
@@ -131,6 +131,17 @@  public:
     this->in_version_unittest_ = false;
   }
 
+  /* Helper for generating code for the dsymbol AST class D.
+     Sets up the location of the symbol before lowering.  */
+
+  void build_dsymbol (Dsymbol *d)
+  {
+    location_t saved_location = input_location;
+    input_location = make_location_t (d->loc);
+    d->accept (this);
+    input_location = saved_location;
+  }
+
   /* This should be overridden by each declaration class.  */
 
   void visit (Dsymbol *)
@@ -212,7 +223,7 @@  public:
 	  {
 	    Declaration *d = ((DsymbolExp *) o)->s->isDeclaration ();
 	    if (d)
-	      d->accept (this);
+	      this->build_dsymbol (d);
 	  }
       }
   }
@@ -227,10 +238,7 @@  public:
       return;
 
     for (size_t i = 0; i < ds->dim; i++)
-      {
-	Dsymbol *s = (*ds)[i];
-	s->accept (this);
-      }
+      this->build_dsymbol ((*ds)[i]);
   }
 
   /* Pragmas are a way to pass special information to the compiler and to add
@@ -278,10 +286,7 @@  public:
       return;
 
     for (size_t i = 0; i < d->members->dim; i++)
-      {
-	Dsymbol *s = (*d->members)[i];
-	s->accept (this);
-      }
+      this->build_dsymbol ((*d->members)[i]);
   }
 
   /* Templates are D's approach to generic programming.  They have no members
@@ -315,7 +320,7 @@  public:
     /* Return type is instantiated from this template declaration, walk over
        all members of the instance.  */
     if (ti && ti->tempdecl == d)
-      ti->accept (this);
+      this->build_dsymbol (ti);
   }
 
   /* Walk over all members in the instantiated template.  */
@@ -329,10 +334,7 @@  public:
       return;
 
     for (size_t i = 0; i < d->members->dim; i++)
-      {
-	Dsymbol *s = (*d->members)[i];
-	s->accept (this);
-      }
+      this->build_dsymbol ((*d->members)[i]);
   }
 
   /* Walk over all members in the mixin template scope.  */
@@ -343,10 +345,7 @@  public:
       return;
 
     for (size_t i = 0; i < d->members->dim; i++)
-      {
-	Dsymbol *s = (*d->members)[i];
-	s->accept (this);
-      }
+      this->build_dsymbol ((*d->members)[i]);
   }
 
   /* Write out compiler generated TypeInfo, initializer and functions for the
@@ -391,24 +390,20 @@  public:
 
     d_finish_decl (d->sinit);
 
-    /* Put out the members.  */
+    /* Put out the members.  There might be static constructors in the members
+       list, and they cannot be put in separate object files.  */
     for (size_t i = 0; i < d->members->dim; i++)
-      {
-	Dsymbol *member = (*d->members)[i];
-	/* There might be static ctors in the members, and they cannot
-	   be put in separate object files.  */
-	member->accept (this);
-      }
+      this->build_dsymbol ((*d->members)[i]);
 
     /* Put out xopEquals, xopCmp and xopHash.  */
     if (d->xeq && d->xeq != d->xerreq)
-      d->xeq->accept (this);
+      this->build_dsymbol (d->xeq);
 
     if (d->xcmp && d->xcmp != d->xerrcmp)
-      d->xcmp->accept (this);
+      this->build_dsymbol (d->xcmp);
 
     if (d->xhash)
-      d->xhash->accept (this);
+      this->build_dsymbol (d->xhash);
 
     d->semanticRun = PASSobj;
   }
@@ -503,10 +498,7 @@  public:
 
     /* Put out the members.  */
     for (size_t i = 0; i < d->members->dim; i++)
-      {
-	Dsymbol *member = (*d->members)[i];
-	member->accept (this);
-      }
+      this->build_dsymbol ((*d->members)[i]);
 
     /* If something goes wrong during final semantic pass, don't bother with
        the rest as we may have incomplete info.  */
@@ -582,10 +574,7 @@  public:
 
     /* Put out the members.  */
     for (size_t i = 0; i < d->members->dim; i++)
-      {
-	Dsymbol *member = (*d->members)[i];
-	member->accept (this);
-      }
+      this->build_dsymbol ((*d->members)[i]);
 
     /* Generate C symbols.  */
     d->csym = get_classinfo_decl (d);
@@ -594,7 +583,7 @@  public:
     if (have_typeinfo_p (Type::dtypeinfo))
       {
 	create_typeinfo (d->type, NULL);
-	d->type->vtinfo->accept (this);
+	this->build_dsymbol (d->type->vtinfo);
       }
 
     DECL_INITIAL (d->csym) = layout_classinfo (d);
@@ -669,7 +658,7 @@  public:
 
     if (d->aliassym)
       {
-	d->toAlias ()->accept (this);
+	this->build_dsymbol (d->toAlias ());
 	return;
       }
 
@@ -1044,7 +1033,7 @@  build_decl_tree (Dsymbol *d)
     input_location = make_location_t (Loc ("<no_file>", 1, 0));
 
   DeclVisitor v = DeclVisitor ();
-  d->accept (&v);
+  v.build_dsymbol (d);
 
   input_location = saved_location;
 }