decl.c (maybe_commonize_var): Further tweak support for systems without weak symbols.

* decl.c (maybe_commonize_var): Further tweak support for systems
	without weak symbols.

	* g++.old-deja/g++.pt/deduct5.C: Remove unnecessary initializer.

From-SVN: r66205
This commit is contained in:
Mark Mitchell 2003-04-29 07:13:33 +00:00 committed by Mark Mitchell
parent 48f2318c45
commit 0dbc5cd368
4 changed files with 43 additions and 21 deletions

View File

@ -1,3 +1,8 @@
2003-04-29 Mark Mitchell <mark@codesourcery.com>
* decl.c (maybe_commonize_var): Further tweak support for systems
without weak symbols.
2003-04-27 Mark Mitchell <mark@codesourcery.com>
* decl.c (maybe_commonize_var): Fix thinko in last patch.

View File

@ -7346,34 +7346,34 @@ maybe_commonize_var (tree decl)
|| DECL_TEMPLATE_INSTANTIATION (DECL_CONTEXT (decl)))
&& TREE_PUBLIC (DECL_CONTEXT (decl)))))
{
/* If flag_weak, we don't need to mess with this, as we can just
make the function weak, and let it refer to its unique local
copy. This works because we don't allow the function to be
inlined. */
if (! flag_weak)
if (flag_weak)
{
if (DECL_INTERFACE_KNOWN (current_function_decl))
{
TREE_PUBLIC (decl) = 1;
DECL_EXTERNAL (decl) = DECL_EXTERNAL (current_function_decl);
}
else if (DECL_INITIAL (decl) == NULL_TREE
|| DECL_INITIAL (decl) == error_mark_node)
/* With weak symbols, we simply make the variable COMDAT;
that will cause copies in multiple translations units to
be merged. */
comdat_linkage (decl);
}
else
{
if (DECL_INITIAL (decl) == NULL_TREE
|| DECL_INITIAL (decl) == error_mark_node)
{
/* Without weak symbols, we can use COMMON to merge
uninitialized variables. */
TREE_PUBLIC (decl) = 1;
DECL_COMMON (decl) = 1;
}
/* else we lose. We can only do this if we can use common,
which we can't if it has been initialized. */
if (!TREE_PUBLIC (decl))
else
{
/* While for initialized variables, we must use internal
linkage -- which means that multiple copies will not
be merged. */
TREE_PUBLIC (decl) = 0;
DECL_COMMON (decl) = 0;
cp_warning_at ("sorry: semantics of inline function static data `%#D' are wrong (you'll wind up with multiple copies)", decl);
cp_warning_at (" you can work around this by removing the initializer", decl);
}
}
else
comdat_linkage (decl);
}
else if (DECL_LANG_SPECIFIC (decl) && DECL_COMDAT (decl))
/* Set it up again; we might have set DECL_INITIAL since the last
@ -7551,11 +7551,24 @@ reshape_init (tree type, tree *initp)
{
/* Loop through the initializable fields, gathering
initializers. */
/* FIXME support non-trivial labeled initializers. */
while (*initp && field)
while (*initp)
{
tree field_init;
/* Handle designated initializers, as an extension. */
if (TREE_PURPOSE (*initp))
{
if (pedantic)
pedwarn ("ISO C++ does not allow designated initializers");
field = lookup_field_1 (type, TREE_PURPOSE (*initp),
/*want_type=*/false);
if (!field || TREE_CODE (field) != FIELD_DECL)
error ("`%T' has no non-static data member named `%D'",
type, TREE_PURPOSE (*initp));
}
if (!field)
break;
field_init = reshape_init (TREE_TYPE (field), initp);
TREE_CHAIN (field_init) = CONSTRUCTOR_ELTS (new_init);
CONSTRUCTOR_ELTS (new_init) = field_init;

View File

@ -1,3 +1,7 @@
2003-04-29 Mark Mitchell <mark@codesourcery.com>
* g++.old-deja/g++.pt/deduct5.C: Remove unnecessary initializer.
2003-04-28 Mark Mitchell <mark@codesourcery.com>
PR c++/10180

View File

@ -7,7 +7,7 @@
template <typename T> int Foo (T const *ptr)
{
static int count = 0;
static int count;
printf ("%s\n", __PRETTY_FUNCTION__);
count++;