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.
>
> 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?
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
|