http://llvm.org/bugs/show_bug.cgi?id=13517
Richard Smith <[email protected]> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|NEW |RESOLVED Resolution| |INVALID --- Comment #5 from Richard Smith <[email protected]> 2013-01-08 16:55:33 CST --- (In reply to comment #0) > [...] when I make the class A, a template like this: [...] > Clang crashes I cannot reproduce this with Clang trunk; I assume it has been fixed. > if I change the definition line for F to this: [...] > 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(); > ^ This error is correct. 'constexpr' and 'auto' are red herrings here. Reduced testcase: template<class X> struct A { static int F; }; template<class X> decltype(A<X>::F) A<X>::F; Per C++11 [temp.type]p2, "If an expression e involves a template parameter, decltype(e) denotes a unique dependent type." Therefore the type of A<X>::F does not match the type in the template. > 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. static const integral members work just like static constexpr members in this regard. In either case, you must provide a definition outside the class if the data member is odr-used (more-or-less, if its address is used, not just its value). -- 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
