[cfe-dev] Potential bug in class template argument deduction

Hamza Sood via cfe-dev cfe-dev at lists.llvm.org
Tue Aug 15 03:46:49 PDT 2017


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)

>> On 15 Aug 2017, at 11:40, Dimitry Andric wrote:
>> 
>> On 15 Aug 2017, at 12:04, Hamza Sood via cfe-dev <cfe-dev at lists.llvm.org> wrote:
>> 
>> 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
> 



More information about the cfe-dev mailing list