[cfe-dev] [ycm-dev] libclang: diagnostics not reported for template instantiations

Manuel Klimek via cfe-dev cfe-dev at lists.llvm.org
Sun Nov 1 09:11:08 PST 2015


+Benjamin

On Tue, Oct 27, 2015 at 5:15 PM Val Markovic <val at markovic.io> wrote:

> +klimek
>
> On Mon, Oct 26, 2015 at 3:09 PM, Ben Jackson <puremourning at gmail.com>
> wrote:
>
>> Hi there,
>>
>> An issue was raised against ycmd that we were not reporting errors as a
>> result of failed template instantiations. This is because, seemingly,
>> libclang does not report diagnostics for template instantiations where
>> instantiation fails (in the sense that the generated code is not valid).
>>
>> A fairly canonical test case is as follows:
>>
>>     template<typename T>
>>     void get_size(const T& t)
>>     {
>>         return t.size();
>>     }
>>
>>     struct Test
>>     {
>>         void not_size() const;
>>     };
>>
>>     int run_test()
>>     {
>>         Test t;
>>
>>         get_size(t);
>>
>>         return "not_an_int";
>>     }
>>
>> Expected: a diagnostic reported at the line ‘get_size(t)’ as struct Test
>> does not have a size()const method. However, no diagnostic is reported.
>>
>> The ‘return “not_an_int”’ is just to prove that diagnostics reporting is
>> working in general in the test case.
>>
>> When running the above with ‘c-index-test -index-file’, grepping for
>> ‘[diagnostic]’, the result is :
>>
>>     $ ./bin/c-index-test -index-file
>> ../llvm/tools/clang/test/Index/diagnostics-template-instantiation.cpp  |
>> grep '\[diagnostic\]'
>>
>> ../llvm/tools/clang/test/Index/diagnostics-template-instantiation.cpp:18:12:
>> error: cannot initialize return object of type 'int' with an lvalue of type
>> 'const char [11]'
>> [diagnostic]:
>> ../llvm/tools/clang/test/Index/diagnostics-template-instantiation.cpp:18:12:
>> error: cannot initialize return object of type ‘int' with an lvalue of type
>> 'const char [11]'
>>
>> However, when running clang directly, we get the diagnostic for
>> get_size(t):
>>
>>      clang++
>> ../llvm/tools/clang/test/Index/diagnostics-template-instantiation.cpp
>>
>> ../llvm/tools/clang/test/Index/diagnostics-template-instantiation.cpp:18:12:
>> error: cannot initialize return object of type 'int' with an lvalue of type
>> 'const char [11]'
>>         return "not_an_int";
>>            ^~~~~~~~~~~~
>>
>> ../llvm/tools/clang/test/Index/diagnostics-template-instantiation.cpp:4:14:
>> error: no member named 'size' in 'Test'
>>         return t.size();
>>            ~ ^
>>
>> ../llvm/tools/clang/test/Index/diagnostics-template-instantiation.cpp:16:5:
>> note: in instantiation of function template specialization 'get_size<Test>'
>> requested here
>>         get_size(t);
>>     ^
>>     2 errors generated.
>>
>> Is this a bug or simply a limitation of the libclang interface? Or is
>> there something required to get these diagnostics to report. Apologies, I
>> must confess I have not looked into this in detail within clang.
>>
>
I'd expect there to be a way to drive libclang to get those diagnostics. On
the other hand, it would probably mean a significant slow-down, because
template instantiation can be a significant amount of the parse time.


>
>> Many thanks and kind regards,
>> Ben
>>
>> --
>> You received this message because you are subscribed to the Google Groups
>> "ycm-dev" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to ycm-dev+unsubscribe at googlegroups.com.
>> To post to this group, send email to ycm-dev at googlegroups.com.
>> To view this discussion on the web visit
>> https://groups.google.com/d/msgid/ycm-dev/41DF481E-282F-4C3D-A4F8-19CC9C706AE0%40gmail.com
>> .
>> For more options, visit https://groups.google.com/d/optout.
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20151101/b4ddaa84/attachment.html>


More information about the cfe-dev mailing list