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

Hamza Sood via cfe-dev cfe-dev at lists.llvm.org
Tue Aug 15 04:00:25 PDT 2017


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.

> On 15 Aug 2017, at 11:53, Dimitry Andric wrote:
> 
> 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
> 
>> On 15 Aug 2017, at 12:46, Hamza Sood <hamza_sood at me.com> wrote:
>> 
>> 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
>>> 
> 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20170815/57c3ae85/attachment.html>


More information about the cfe-dev mailing list