http://llvm.org/bugs/show_bug.cgi?id=13517
Bug #: 13517
Summary: Static constexpr definitions used inside template
Product: clang
Version: unspecified
Platform: All
OS/Version: All
Status: NEW
Severity: normal
Priority: P
Component: C++11
AssignedTo: [email protected]
ReportedBy: [email protected]
CC: [email protected], [email protected]
Classification: Unclassified
When I define a static member using auto and constepxr like this:
struct L
{
void operator()() const
{}
};
struct A
{
static constexpr auto F = L();
};
constexpr decltype(A::F) A::F;
int main()
{
A::F();
return 0;
}
This compiles fine, but when I make the class A, a template like this:
struct L
{
void operator()() const
{}
};
template<class X>
struct A
{
static constexpr auto F = L();
};
template<class X>
constexpr decltype(A<X>::F) A<X>::F;
int main()
{
A<void>::F();
return 0;
}
Clang crashes, if I change the definition line for F to this:
template<class X>
constexpr typename std::remove_const<decltype(A<X>::F)>::type A<X>::F;
Then clang produces this error:
error: redefinition of 'F' with a different type
constexpr typename std::remove_const<decltype(A<X>::F)>::type A<X>::F;
^
note: previous definition is here
static constexpr auto F = L();
^
It seems that clang thinks that this is a declaration instead of a definition.
Also, does C++ require the definition outside of the class? It would be nicer
when using constexpr and auto, just to have the the static member defined at
the point of declaration.(like it is for integers), but perhaps that is not
conformant with C++11.
--
Configure bugmail: http://llvm.org/bugs/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.
_______________________________________________
LLVMbugs mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/llvmbugs