aboutsummaryrefslogtreecommitdiff
path: root/gcc/d/decl.cc
diff options
context:
space:
mode:
authorIain Buclaw <ibuclaw@gdcproject.org>2021-04-13 16:19:03 +0200
committerIain Buclaw <ibuclaw@gdcproject.org>2021-04-14 14:43:38 +0200
commit5b63eb17d863ac080cf3c7df08233054b09d3747 (patch)
treeab6c28abef05e7db0ae4185b7e8dbe320e9a91e4 /gcc/d/decl.cc
parent3785d2b207f1958f31a79fbbb5705b261551950d (diff)
downloadgcc-5b63eb17d863ac080cf3c7df08233054b09d3747.zip
gcc-5b63eb17d863ac080cf3c7df08233054b09d3747.tar.gz
gcc-5b63eb17d863ac080cf3c7df08233054b09d3747.tar.bz2
d: Move call to set_linkage_for_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). 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.
Diffstat (limited to 'gcc/d/decl.cc')
-rw-r--r--gcc/d/decl.cc6
1 files changed, 2 insertions, 4 deletions
diff --git a/gcc/d/decl.cc b/gcc/d/decl.cc
index b07068e..8948e40 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))
{