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