[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