Commit 5b1cbe14 by Jakub Jelinek Committed by Jakub Jelinek

re PR c++/42608 (Undefined reference not reported in case of explicit template instantiation)

	PR c++/42608
	* varasm.c (declare_weak): Add weak attribute to decl if it
	doesn't have one already.
	(assemble_external): Only add decls to weak_decls if they also
	have weak attribute.

	* g++.dg/template/instantiate11.C: New test.

From-SVN: r155919
parent 7d2a8452
2010-01-14 Jakub Jelinek <jakub@redhat.com>
PR c++/42608
* varasm.c (declare_weak): Add weak attribute to decl if it
doesn't have one already.
(assemble_external): Only add decls to weak_decls if they also
have weak attribute.
2010-01-14 Alexandre Oliva <aoliva@redhat.com> 2010-01-14 Alexandre Oliva <aoliva@redhat.com>
* var-tracking.c (var_reg_delete): Don't delete the association * var-tracking.c (var_reg_delete): Don't delete the association
......
2010-01-14 Jakub Jelinek <jakub@redhat.com>
PR c++/42608
* g++.dg/template/instantiate11.C: New test.
2010-01-14 Jason Merrill <jason@redhat.com> 2010-01-14 Jason Merrill <jason@redhat.com>
PR c++/42701 PR c++/42701
......
// PR c++/42608
// { dg-do compile }
template <class U, class V>
struct A;
template <class V>
struct A<int, V>
{
void f ();
};
template struct A<int, int>;
int
main ()
{
A<int, int> a;
a.f ();
return 0;
}
// Make sure we get undefined reference error if
// A<int, int>::f () isn't instantiated elsewhere.
// { dg-final { scan-assembler-not "weak\[\n\t\]*_ZN1AIiiE1fEv" } }
...@@ -2337,13 +2337,15 @@ assemble_external (tree decl ATTRIBUTE_UNUSED) ...@@ -2337,13 +2337,15 @@ assemble_external (tree decl ATTRIBUTE_UNUSED)
/* We want to output annotation for weak and external symbols at /* We want to output annotation for weak and external symbols at
very last to check if they are references or not. */ very last to check if they are references or not. */
if (SUPPORTS_WEAK && DECL_WEAK (decl) if (SUPPORTS_WEAK
&& DECL_WEAK (decl)
/* TREE_STATIC is a weird and abused creature which is not /* TREE_STATIC is a weird and abused creature which is not
generally the right test for whether an entity has been generally the right test for whether an entity has been
locally emitted, inlined or otherwise not-really-extern, but locally emitted, inlined or otherwise not-really-extern, but
for declarations that can be weak, it happens to be for declarations that can be weak, it happens to be
match. */ match. */
&& !TREE_STATIC (decl) && !TREE_STATIC (decl)
&& lookup_attribute ("weak", DECL_ATTRIBUTES (decl))
&& value_member (decl, weak_decls) == NULL_TREE) && value_member (decl, weak_decls) == NULL_TREE)
weak_decls = tree_cons (NULL, decl, weak_decls); weak_decls = tree_cons (NULL, decl, weak_decls);
...@@ -5227,6 +5229,9 @@ declare_weak (tree decl) ...@@ -5227,6 +5229,9 @@ declare_weak (tree decl)
warning (0, "weak declaration of %q+D not supported", decl); warning (0, "weak declaration of %q+D not supported", decl);
mark_weak (decl); mark_weak (decl);
if (!lookup_attribute ("weak", DECL_ATTRIBUTES (decl)))
DECL_ATTRIBUTES (decl)
= tree_cons (get_identifier ("weak"), NULL, DECL_ATTRIBUTES (decl));
} }
static void static void
......
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