Skip to content

Undefined references to static const members of class templates (but not when const is omitted) #26380

@llvmbot

Description

@llvmbot
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

No one assigned

    Labels

    bugzillaIssues migrated from bugzillac++clang:codegenIR generation bugs: mangling, exceptions, etc.confirmedVerified by a second party

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions