-
Notifications
You must be signed in to change notification settings - Fork 14.8k
Open
Labels
bugzillaIssues migrated from bugzillaIssues migrated from bugzillac++clang:codegenIR generation bugs: mangling, exceptions, etc.IR generation bugs: mangling, exceptions, etc.confirmedVerified by a second partyVerified by a second party
Description
| Bugzilla Link | 26006 |
| Version | trunk |
| OS | Linux |
| Attachments | Test program to reproduce |
| Reporter | LLVM Bugzilla Contributor |
| CC | @DougGregor,@zahiraam |
Extended Description
The below program (also attached) produces an undefined reference to Foo::Bar<int>::m when m is declared as const. Just compile it with clang++ test.cpp. It does not compile with the latest clang from the trunk, nor with clang 3.5.
However, when m does not have any additional qualifiers or when m is declared as const volatile, then the program compiles, links, and runs. You can verify this by defining QUALS as empty or as const volatile.
GCC compiles and links the program fine.
This code was distilled from xulrunner 24.8.0.
#define QUALS const
//#define QUALS const volatile
//#define QUALS
class Foo {
public:
template <typename T>
struct Bar {
static QUALS long m;
};
static QUALS long& getter() { return Bar<int>::m; }
static int f();
};
template <typename T>
QUALS long Foo::Bar<T>::m = 1;
int Foo::f()
{
return getter();
}
int main()
{
return Foo::f();
}Metadata
Metadata
Assignees
Labels
bugzillaIssues migrated from bugzillaIssues migrated from bugzillac++clang:codegenIR generation bugs: mangling, exceptions, etc.IR generation bugs: mangling, exceptions, etc.confirmedVerified by a second partyVerified by a second party