Martin Sebor wrote: > >Travis Vitek wrote: >> I'm porting the traits to the EDG compiler, and I'm running into >> failures in the test suite. Here is a simple testcase to >> illustrate... >> >> $ cat t.cpp && eccp t.cpp >> template <int N> >> struct S >> { >> }; >> >> const bool a = __has_trivial_constructor( S<1> ); >> "t.cpp", line 6: error: an incomplete class type is not allowed >> const bool a = __has_trivial_constructor( S<1> ); >> ^ >> >> "t.cpp", line 6: warning: variable "a" was declared but never >> referenced >> const bool a = __has_trivial_constructor( S<1> ); >> ^ >> >> 1 error detected in the compilation of "t.cpp". >> >> The problem is that the template (S<1> in this case) has not >> been instantiated, and the compiler chokes trying to use the >> helper because the type is not 'complete'. It seems like that >> is a bug and that referring to S<1> here should result in the >> type being instantiated if the compiler requires it. > >I agree. I just sent EDG an email with your test case and CC'd >you on it.
Thank you for reviewing and submitting. >> >> The problem is that many of the trait tests do this type of >> thing. I can work around this pretty easily by explicitly >> instantating each template in each test, but this is tedious >> (there are many). > >I'm not sure I understand why you are even considering working >around it. Doesn't the bug make the built-in traits pretty much >unusable in generic code? Not always. If the template is instantiated the error would not be seen. > >Martin > >> >> I was thinking about doing something like this... >> >> #define _INSTANTIATE(T) \ >> typedef typename \ >> __rw_conditional<__rw_is_class_or_union<T>::value, \ >> T::type, \ >> void>::type _RWSTD_PASTE(dummy, __LINE__); >> >> And then sneaking a void typedef into each of my user >defined types, and >> then using this macro in the TEST () macro that I use all over the >> tests. Is there a better way? >> >> Travis > >