diff mbox series

[committed] d: Move call to set_linkage_for_decl to declare_extern_var.

Message ID 20210414124650.400420-1-ibuclaw@gdcproject.org
State New
Headers show
Series [committed] d: Move call to set_linkage_for_decl to declare_extern_var. | expand

Commit Message

Iain Buclaw April 14, 2021, 12:46 p.m. UTC
Hi,

This patch moves the call to the newly introduced set_linkage_for_decl
in the D front-end from d_finish_decl to declare_extern_var.

This both prevents against it being called twice for declarations that
are defined, and fixes an issue where variables defined in the
compilation get one kind of linkage (weak), and the same variables
declared via declare_extern_var get another (extern).

Bootstrapped and regression tested on x86_64-linux-gnu/-m32/-mx32, as
well as testing on port of x86_64-mingw32.  Committed to mainline.

Regards,
Iain.

---
gcc/d/ChangeLog:

	PR d/99914
	* decl.cc (DeclVisitor::visit (StructDeclaration *)): Don't set
	DECL_INSTANTIATED on static initializer declarations.
	(DeclVisitor::visit (ClassDeclaration *)): Likewise.
	(DeclVisitor::visit (EnumDeclaration *)): Likewise.
	(d_finish_decl): Move call to set_linkage_for_decl to...
	(declare_extern_var): ...here.
---
 gcc/d/decl.cc | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)
diff mbox series

Patch

diff --git a/gcc/d/decl.cc b/gcc/d/decl.cc
index b07068ed6ca..8948e40e902 100644
--- a/gcc/d/decl.cc
+++ b/gcc/d/decl.cc
@@ -387,7 +387,6 @@  public:
     /* Generate static initializer.  */
     d->sinit = aggregate_initializer_decl (d);
     DECL_INITIAL (d->sinit) = layout_struct_initializer (d);
-    DECL_INSTANTIATED (d->sinit) = (d->isInstantiated () != NULL);
     d_finish_decl (d->sinit);
 
     /* Put out the members.  There might be static constructors in the members
@@ -500,7 +499,6 @@  public:
 
     /* Generate static initializer.  */
     DECL_INITIAL (d->sinit) = layout_class_initializer (d);
-    DECL_INSTANTIATED (d->sinit) = (d->isInstantiated () != NULL);
     d_finish_decl (d->sinit);
 
     /* Put out the TypeInfo.  */
@@ -611,7 +609,6 @@  public:
 	/* Generate static initializer.  */
 	d->sinit = enum_initializer_decl (d);
 	DECL_INITIAL (d->sinit) = build_expr (tc->sym->defaultval, true);
-	DECL_INSTANTIATED (d->sinit) = (d->isInstantiated () != NULL);
 	d_finish_decl (d->sinit);
       }
 
@@ -1379,6 +1376,8 @@  declare_extern_var (tree ident, tree type)
   /* The decl has not been defined -- yet.  */
   DECL_EXTERNAL (decl) = 1;
 
+  set_linkage_for_decl (decl);
+
   return decl;
 }
 
@@ -1540,7 +1539,6 @@  d_finish_decl (tree decl)
     set_decl_tls_model (decl, decl_default_tls_model (decl));
 
   relayout_decl (decl);
-  set_linkage_for_decl (decl);
 
   if (flag_checking && DECL_INITIAL (decl))
     {