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> 2003-04-27 Mark Mitchell <mark@codesourcery.com>
* decl.c (maybe_commonize_var): Fix thinko in last patch. * decl.c (maybe_commonize_var): Fix thinko in last patch.
......
...@@ -7346,34 +7346,34 @@ maybe_commonize_var (tree decl) ...@@ -7346,34 +7346,34 @@ maybe_commonize_var (tree decl)
|| DECL_TEMPLATE_INSTANTIATION (DECL_CONTEXT (decl))) || DECL_TEMPLATE_INSTANTIATION (DECL_CONTEXT (decl)))
&& TREE_PUBLIC (DECL_CONTEXT (decl))))) && TREE_PUBLIC (DECL_CONTEXT (decl)))))
{ {
/* If flag_weak, we don't need to mess with this, as we can just if (flag_weak)
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 (DECL_INTERFACE_KNOWN (current_function_decl)) /* With weak symbols, we simply make the variable COMDAT;
{ that will cause copies in multiple translations units to
TREE_PUBLIC (decl) = 1; be merged. */
DECL_EXTERNAL (decl) = DECL_EXTERNAL (current_function_decl); comdat_linkage (decl);
} }
else if (DECL_INITIAL (decl) == NULL_TREE else
|| DECL_INITIAL (decl) == error_mark_node) {
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; TREE_PUBLIC (decl) = 1;
DECL_COMMON (decl) = 1; DECL_COMMON (decl) = 1;
} }
/* else we lose. We can only do this if we can use common, else
which we can't if it has been initialized. */
if (!TREE_PUBLIC (decl))
{ {
/* 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 ("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); 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)) else if (DECL_LANG_SPECIFIC (decl) && DECL_COMDAT (decl))
/* Set it up again; we might have set DECL_INITIAL since the last /* Set it up again; we might have set DECL_INITIAL since the last
...@@ -7551,11 +7551,24 @@ reshape_init (tree type, tree *initp) ...@@ -7551,11 +7551,24 @@ reshape_init (tree type, tree *initp)
{ {
/* Loop through the initializable fields, gathering /* Loop through the initializable fields, gathering
initializers. */ initializers. */
/* FIXME support non-trivial labeled initializers. */ while (*initp)
while (*initp && field)
{ {
tree field_init; 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); field_init = reshape_init (TREE_TYPE (field), initp);
TREE_CHAIN (field_init) = CONSTRUCTOR_ELTS (new_init); TREE_CHAIN (field_init) = CONSTRUCTOR_ELTS (new_init);
CONSTRUCTOR_ELTS (new_init) = field_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> 2003-04-28 Mark Mitchell <mark@codesourcery.com>
PR c++/10180 PR c++/10180
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
template <typename T> int Foo (T const *ptr) template <typename T> int Foo (T const *ptr)
{ {
static int count = 0; static int count;
printf ("%s\n", __PRETTY_FUNCTION__); printf ("%s\n", __PRETTY_FUNCTION__);
count++; 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