I am having an issue with code failing to compile for an external library I am using. I believe that library compiles fine with gcc, but it fails to compile for me with clang.
I can recreate the issue as follows
template <class T>
class A {
public:
struct B {
int a;
};
void test();
private:
T _t;
};
template <class T>
void A<T>::test()
{
printf("Result %d", std::numeric_limits<decltype(B::a)>::max());
}
int main(int argc, char** argv)
{
auto t = A<int>();
t.test();
return 0;
}
This fails to compile on clang with the following error
error: invalid use of non-static data member 'a' printf("Result %d", std::numeric_limits<decltype(B::a)>::max());
My questions are as follows:
What is the expected behavior?
decltype on non-static members was added in c++11. Does this apply to those declared in template classes?
Is this a compiler bug? Or an example of non-conformant code working with gcc?
It was a bug in old version of Clang, and fixed in Clang 3.9.0: https://godbolt.org/g/zqFxL2
Normative Standarteese:
8.2.3: In some contexts, unevaluated operands appear ([expr.prim.req], [expr.typeid], [expr.sizeof], [expr.unary.noexcept], [dcl.type.simple], [temp]). An unevaluated operand is not evaluated. [ Note: In an unevaluated operand, a non-static class member may be named ([expr.prim]) and naming of objects or functions does not, by itself, require that a definition be provided ([basic.def.odr]). An unevaluated operand is considered a full-expression. — end note ]
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With