Intel® C++ Compiler
Community support and assistance for creating C++ code that runs on platforms based on Intel® processors.

Friend declaration doesn't apply to partial specializations in icc v.13.0.089


If someone has access to some more official bug reporting mechanism, I'd appreciate if you filed a bug report about this: (using Intel C++ Composer XE 2013 [v.13.0.089] on Windows)


#include <type_traits>

template <typename T, int guid, typename Enable = void>
struct has_type_guid
    : std::false_type

template <typename T, int guid>
struct has_type_guid< T, guid, typename std::enable_if<T::_type_guid == guid>::type>
    : std::true_type

struct MyStruct
    template <typename T, int guid, typename Enable>
    friend struct has_type_guid;

    enum { _type_guid = 42 };

int main()
    static_assert(has_type_guid<MyStruct, 42>::value, "");
    return 0;

// Test.cpp(30): error : static assertion failed with ""
// static_assert(has_type_guid<MyStruct, 42>::value, "");
// ^



Although, I'm not so sure anymore that this is a bug, since GCC 4.7.1 doesn't compile the code either (complaining that "MyStruct::_type_guid is private"). Microsoft Visual C++ 11.0 compiles it just fine though.

0 Kudos
2 Replies
Hi, This actually has to with our support for SFINAE (Substitution Failure Is Not An Error) in microsoft emulation mode. It turns out the Microsoft compiler does not do access checking in SFINAE contexts, and in addition, does not do access checking during the partial instantiation of a function template. In addition, access errors that occur during the partial instantiation of a function template are ignored in the Microsoft compiler. You'll notice that MSVC++ 2010 doesn't complain even if you remove the friend declaration. So we needed to emulate this behaviour in our Windows based compiler. We have implemented this and you should see the fix in the next 13.0 update. You'll note that the GNU compiler (and our Linux based compiler) will give an error. thank you for reporting it. Judy
0 Kudos
Oh by the way this is being tracked/fix in our internal bug database under the number DPD200178656.
0 Kudos