dynmaic_cast in uninstantiated function templates

Hi list,

the code below compiles on gcc and icc, but not on clang with the error:

source_file.cpp:14:16: error: 'B' is an incomplete type
  if (auto b = dynamic_cast<B*>(a))

However fn is an uninstantiated function template.
Is this a glitch in clang or is clang the only one right here?

Best Olaf

---begin code ---
#include <ostream>
#include <iostream>

class A {};
class B;

void foo(B* b)
{ }

template<class T>
void fn(A* a, T& x)
{
  if (auto b = dynamic_cast<B*>(a))
  {
    foo(b);
  }
}

int main()
{
  std::cout << "Hello World\n";
}

All three compilers are correct here, as far as the standard is
concerned. The code is ill-formed, but implementations are not
required to diagnose this kind of error. There is no type T that could
produce a well-formed instantiation of fn.

Thanks for the clarification. So a solution could be a template make_dependent

template<class X, class Y>
struct make_dependent
{
  typedef X type;
};

template<class T>
void fn(A* a, T& x)
{
  dynamic_cast<typename make_dependent<B*, T>::type>(a);
}

The standard doesn't supply any similar, does it?

Best Olaf