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