Commit 0dbc5cd3 by Mark Mitchell Committed by Mark Mitchell

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
parent 48f2318c
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.
......
......@@ -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;
......
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
......
......@@ -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++;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment