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
This commit is contained in:
Jakub Jelinek 2010-01-14 23:41:02 +01:00 committed by Jakub Jelinek
parent 7d2a845248
commit 5b1cbe1453
4 changed files with 44 additions and 1 deletions

View File

@ -1,3 +1,11 @@
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>
* var-tracking.c (var_reg_delete): Don't delete the association

View File

@ -1,3 +1,8 @@
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>
PR c++/42701

View File

@ -0,0 +1,25 @@
// 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" } }

View File

@ -2337,13 +2337,15 @@ assemble_external (tree decl ATTRIBUTE_UNUSED)
/* We want to output annotation for weak and external symbols at
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
generally the right test for whether an entity has been
locally emitted, inlined or otherwise not-really-extern, but
for declarations that can be weak, it happens to be
match. */
&& !TREE_STATIC (decl)
&& lookup_attribute ("weak", DECL_ATTRIBUTES (decl))
&& value_member (decl, weak_decls) == NULL_TREE)
weak_decls = tree_cons (NULL, decl, weak_decls);
@ -5227,6 +5229,9 @@ declare_weak (tree decl)
warning (0, "weak declaration of %q+D not supported", 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