[cfe-dev] #pragma weak handling
Abramo Bagnara
abramo.bagnara at gmail.com
Wed Nov 25 14:11:14 PST 2009
struct in6_addr
{
union
{
unsigned char __u6_addr8[16];
unsigned short __u6_addr16[8];
unsigned int __u6_addr32[4];
} __in6_u;
};
extern const struct in6_addr in6addr_any;
static const struct in6_addr local_in6addr_any = { { {
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } } };
#pragma weak in6addr_any = local_in6addr_any
Examining the ast generated for this snippet I note two problems:
1) the extra declaration generated by #pragma has the following form:
static const struct in6_addr in6addr_any __attribute__ ((weak))
__attribute__ ((alias("local_in6addr_any")));
The problem I see is that "static" should be replaced by "extern".
I think that the bug is in Sema::DeclClonePragmaWeak(NamedDecl *ND,
IdentifierInfo *II) where it is copied also the storage class of VarDecl.
2) the extra declaration generated by #pragma seems to be not linked to
other declarations for the same object and then getCanonicalDecl does
not work as expected.
I'd like to know if this analysis is correct and if yes, what's the
suggested way to fix point 2 (I think that the fix to point 1 is rather
obvious).
More information about the cfe-dev
mailing list