]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
d: Use semanticRun to prevent declaration pass from running multiple times.
authorIain Buclaw <ibuclaw@gdcproject.org>
Sun, 21 Apr 2019 07:03:32 +0000 (07:03 +0000)
committerIain Buclaw <ibuclaw@gcc.gnu.org>
Sun, 21 Apr 2019 07:03:32 +0000 (07:03 +0000)
This shouldn't happen during normal traversal of the AST provided from
the front-end, however as there are some cases where declarations need
to be visited out of order, such as what is being done in PR d/89017, it
then becomes necessary to guard against this.

gcc/d/ChangeLog:

2019-04-21  Iain Buclaw  <ibuclaw@gdcproject.org>

* decl.cc (DeclVisitor::visit(Import)): Set semanticRun after
completion, guard against being called more than once.
(DeclVisitor::visit(StructDeclaration)): Likewise.
(DeclVisitor::visit(ClassDeclaration)): Likewise.
(DeclVisitor::visit(InterfaceDeclaration)): Likewise.
(DeclVisitor::visit(VarDeclaration)): Likewise.
(DeclVisitor::visit(TypeInfoDeclaration)): Likewise.

From-SVN: r270478

gcc/d/ChangeLog
gcc/d/decl.cc

index 48fc9c69b4f352f855eb9fcffc1ba30380577b76..7629c9608f815bb7fdb8c692eb0ec9a7bde49820 100644 (file)
@@ -1,3 +1,13 @@
+2019-04-21  Iain Buclaw  <ibuclaw@gdcproject.org>
+
+       * decl.cc (DeclVisitor::visit(Import)): Set semanticRun after
+       completion, guard against being called more than once.
+       (DeclVisitor::visit(StructDeclaration)): Likewise.
+       (DeclVisitor::visit(ClassDeclaration)): Likewise.
+       (DeclVisitor::visit(InterfaceDeclaration)): Likewise.
+       (DeclVisitor::visit(VarDeclaration)): Likewise.
+       (DeclVisitor::visit(TypeInfoDeclaration)): Likewise.
+
 2019-04-21  Iain Buclaw  <ibuclaw@gdcproject.org>
 
        * modules.cc (register_module_decl): Don't register unittests against
index f6c863988e31b7201c5b4e6be7cec8744d08f883..26de272455b4f2d545a5c5f71954be5f55ef1ab2 100644 (file)
@@ -152,6 +152,9 @@ public:
 
   void visit (Import *d)
   {
+    if (d->semanticRun >= PASSobj)
+      return;
+
     /* Implements import declarations by telling the debug back-end we are
        importing the NAMESPACE_DECL of the module or IMPORTED_DECL of the
        declaration into the current lexical scope CONTEXT.  NAME is set if
@@ -193,6 +196,8 @@ public:
        debug_hooks->imported_module_or_decl (decl, name, context,
                                              false, false);
       }
+
+    d->semanticRun = PASSobj;
   }
 
   /* Expand any local variables found in tuples.  */
@@ -349,6 +354,9 @@ public:
 
   void visit (StructDeclaration *d)
   {
+    if (d->semanticRun >= PASSobj)
+      return;
+
     if (d->type->ty == Terror)
       {
        error_at (make_location_t (d->loc),
@@ -400,6 +408,8 @@ public:
 
     if (d->xhash)
       d->xhash->accept (this);
+
+    d->semanticRun = PASSobj;
   }
 
   /* Finish semantic analysis of functions in vtbl for class CD.  */
@@ -477,6 +487,9 @@ public:
 
   void visit (ClassDeclaration *d)
   {
+    if (d->semanticRun >= PASSobj)
+      return;
+
     if (d->type->ty == Terror)
       {
        error_at (make_location_t (d->loc),
@@ -542,6 +555,8 @@ public:
     tree ctype = TREE_TYPE (build_ctype (d->type));
     if (TYPE_NAME (ctype))
       d_pushdecl (TYPE_NAME (ctype));
+
+    d->semanticRun = PASSobj;
   }
 
   /* Write out compiler generated TypeInfo and vtables for the given interface
@@ -549,6 +564,9 @@ public:
 
   void visit (InterfaceDeclaration *d)
   {
+    if (d->semanticRun >= PASSobj)
+      return;
+
     if (d->type->ty == Terror)
       {
        error_at (make_location_t (d->loc),
@@ -581,6 +599,8 @@ public:
     tree ctype = TREE_TYPE (build_ctype (d->type));
     if (TYPE_NAME (ctype))
       d_pushdecl (TYPE_NAME (ctype));
+
+    d->semanticRun = PASSobj;
   }
 
   /* Write out compiler generated TypeInfo and initializer for the given
@@ -630,6 +650,9 @@ public:
 
   void visit (VarDeclaration *d)
   {
+    if (d->semanticRun >= PASSobj)
+      return;
+
     if (d->type->ty == Terror)
       {
        error_at (make_location_t (d->loc),
@@ -755,6 +778,8 @@ public:
              }
          }
       }
+
+    d->semanticRun = PASSobj;
   }
 
   /* Generate and compile a static TypeInfo declaration, but only if it is
@@ -762,12 +787,16 @@ public:
 
   void visit (TypeInfoDeclaration *d)
   {
+    if (d->semanticRun >= PASSobj)
+      return;
+
     if (speculative_type_p (d->tinfo))
       return;
 
     tree t = get_typeinfo_decl (d);
     DECL_INITIAL (t) = layout_typeinfo (d);
     d_finish_decl (t);
+    d->semanticRun = PASSobj;
   }
 
   /* Finish up a function declaration and compile it all the way