Potential bug in class template argument deduction

template<typename T>
class Base { };

class Derived: public Base<int> { };

int main() {
    Derived d;
    Base b(d);
    return 0;
}

Clang rejects that code, saying it can’t deduce the template parameters for Base.
However I think that code is valid; it’s accepted by GCC.
Is this a Clang bug?

template<typename T>
class Base { };

class Derived: public Base<int> { };

int main() {
   Derived d;
   Base b(d);
   return 0;
}

Clang rejects that code, saying it can’t deduce the template parameters for Base.
However I think that code is valid; it’s accepted by GCC.

Not here, with gcc 6.4.0:

$ g++ -c test.cpp
test.cpp: In function 'int main()':
test.cpp:8:9: error: missing template arguments before 'b'
    Base b(d);
         ^

The declaration should use Base<int> instead.

Is this a Clang bug?

No, though clang's error message is substantially more confusing, in my opinion:

$ clang++ -c test.cpp
test.cpp:8:4: error: unknown type name 'Base'; did you mean 'Derived::Base'?
   Base b(d);
   ^~~~
   Derived::Base
test.cpp:2:7: note: 'Derived::Base' declared here
class Base { };
      ^

It should give a similar suggestion as gcc does.

-Dimitry

Sorry, I should’ve been more clear. I’m talking about C++17 class template argument deduction.

If you pass “-std=c++17” to GCC, then it compiles the code fine. However Clang still rejects it.

(Sending again because I forgot to reply all)

Hm, it appears to depend on the gcc version:

$ g++6 -std=c++17 test.cpp
test.cpp: In function 'int main()':
test.cpp:8:9: error: missing template arguments before 'b'
    Base b(d);
         ^

However, gcc 7.1.1 does accept it. So maybe this is something very new?

-Dimitry

The GCC C++ status page (https://gcc.gnu.org/projects/cxx-status.html) shows that class template argument deduction wasn’t implemented until GCC-7.

However Clang’s status page also reports it as implemented (in SVN builds), but Clang built from SVN trunk rejects that code.

The GCC C++ status page (https://gcc.gnu.org/projects/cxx-status.html) shows that class template argument deduction wasn’t implemented until GCC-7.

However Clang’s status page also reports it as implemented (in SVN builds), but Clang built from SVN trunk rejects that code.

The template-argument inference logic in the proposed standard has undergone repeated late revisions; I expect that both GCC and Clang implement some intermediate version that isn’t quite fully what’s specified in the current draft. Of course that’s something we should fix. Please file a bug on bugs.llvm.org and we’ll take a look.

John.

Hi John,

I’ve filed a bug here: https://bugs.llvm.org/show_bug.cgi?id=34195