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

Val Markovic via cfe-dev cfe-dev at lists.llvm.org
Tue Oct 27 17:15:12 PDT 2015


+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.
>
> 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/20151027/359959a2/attachment.html>


More information about the cfe-dev mailing list