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:
parent
7d2a845248
commit
5b1cbe1453
@ -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
|
||||
|
@ -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
|
||||
|
25
gcc/testsuite/g++.dg/template/instantiate11.C
Normal file
25
gcc/testsuite/g++.dg/template/instantiate11.C
Normal 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" } }
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user