incubator-stdcxx-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Travis Vitek" <Travis.Vi...@roguewave.com>
Subject RE: Potential eccp-3.9 bug
Date Fri, 11 Jul 2008 00:40:26 GMT
 

Martin Sebor wrote:
>
>Travis Vitek wrote:
>>  
>> 
>> Not always. If the template is instantiated the error would 
>> not be seen.
>
>The reason I ask is because I couldn't get even a simple SFINAE
>test program to compile. I think the program is well-formed even
>though gcc 4.3.0 chokes on too (albeit for a different reason --
>see http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36797)
>

Hah, I was just filing a nearly identical bug with gcc when I got this
message.

I happened to be playing around with this a little bit earlier today.
You might find this interesting. If I use the pseudo-function
__is_empty() directly, the error message says there is no matching
function, but if I wrap it in a template, I get multiple matches (after
the incomplete class type message I complained about earlier).

This all seems to work when using the trait with a non-template type. If
you want to use a template, it has to be instantiated first. I think I'm
going to put the Edison compiler port on hold for now.

$ cat t.cpp

template <bool B, class T = void>
struct enable_if {
    typedef T type;
};

template <class T>
struct enable_if<false, T> {
};

#ifdef _TEMPLATE

template <class T>
struct is_empty {
    enum { val = __is_empty(T) };
};

template <class T>
int enabled_if_empty (typename enable_if< is_empty<T>::val>::type* = 0)
{
    return 1;
}

template <class T>
int enabled_if_empty (typename enable_if<!is_empty<T>::val>::type* = 0)
{
    return 0;
}

#else // !_TEMPLATE

template <class T>
int enabled_if_empty (typename enable_if< __is_empty(T)>::type* = 0) {
    return 1;
}

template <class T>
int enabled_if_empty (typename enable_if<!__is_empty(T)>::type* = 0) {
    return 0;
}

#endif // !_TEMPLATE

template <int> struct S { };

#include <assert.h>

//template struct S<1>;

int main () {

    assert (0 == enabled_if_empty< S<1> >());
    assert (1 == enabled_if_empty< long >());

    return 0;
}

$ eccp -A t.cpp
"t.cpp", line 50: error: no instance of overloaded function
"enabled_if_empty"
          matches the argument list
      assert (0 == enabled_if_empty< S<1> >());
      ^

1 error detected in the compilation of "t.cpp".
$ eccp -A -D_TEMPLATE t.cpp
"t.cpp", line 15: error: an incomplete class type is not allowed
      enum { val = __is_empty(T) };
                   ^
          detected during instantiation of class "is_empty<T> [with
T=S<1>]"
                    at line 50

"t.cpp", line 50: error: more than one instance of overloaded function
          "enabled_if_empty" matches the argument list:
            function template "int
                      enabled_if_empty<T>(enable_if<is_empty<T>::val,
                      void>::type *)"
            function template "int
enabled_if_empty<T>(enable_if<<expression>,
                      void>::type *)"
      assert (0 == enabled_if_empty< S<1> >());
      ^

2 errors detected in the compilation of "t.cpp".

>

Mime
View raw message