<table><tr><td style="">thomassc created this revision.<br />Herald added a project: KDevelop.<br />Herald added a subscriber: kdevelop-devel.<br />thomassc requested review of this revision.
</td><a style="text-decoration: none; padding: 4px 8px; margin: 0 8px 8px; float: right; color: #464C5C; font-weight: bold; border-radius: 3px; background-color: #F7F7F9; background-image: linear-gradient(to bottom,#fff,#f1f0f1); display: inline-block; border: 1px solid rgba(71,87,120,.2);" href="https://phabricator.kde.org/D18224">View Revision</a></tr></table><br /><div><strong>REVISION SUMMARY</strong><div><p>Consider the following piece of faulty code:</p>

<p>struct A {};</p>

<p>template <typename T><br />
T AddObjects(const T& a, const T& b) {</p>

<div class="remarkup-code-block" style="margin: 12px 0;" data-code-lang="text" data-sigil="remarkup-code-block"><pre class="remarkup-code" style="font: 11px/15px "Menlo", "Consolas", "Monaco", monospace; padding: 12px; margin: 0; background: rgba(71, 87, 120, 0.08);">return a + b;</pre></div>

<p>}</p>

<p>int main(int /*argc*/, char* /*argv*/[]) {</p>

<div class="remarkup-code-block" style="margin: 12px 0;" data-code-lang="text" data-sigil="remarkup-code-block"><pre class="remarkup-code" style="font: 11px/15px "Menlo", "Consolas", "Monaco", monospace; padding: 12px; margin: 0; background: rgba(71, 87, 120, 0.08);">A a, b;
AddObjects(a, b);

return 0;</pre></div>

<p>}</p>

<p>This fails since struct A does not have an operator +. The actual error could be either in function AddObjects()<br />
(since it adds two objects that should not be added) or in the call to AddObjects (since it might be called<br />
with a type that it does not support). For the code above, KDevelop will however only report an error inside the template<br />
function. Now, consider that the template function is in an external library, and the fault is it being called with<br />
wrong arguments. This way, no error will be visible to the user at all, despite the error being within the user's code.<br />
This is for example commonly the case when using the "Eigen" linear algebra library and trying to add incompatible matrices.</p>

<p>The diff proposed here creates ClangProblems for certain diagnostics that are located in included files, if there is<br />
a child diagnostic in the current file that ends on "requested here". This would error-highlight the call in the example<br />
above when the template function is in an external header.</p>

<p>In addition, the existing code which creates ClangProblems already included missing-include errors in the error list of the parsed file with the intention<br />
to make them visible to the user. However, it seems that this was not actually the case, since the problem reporter plugin<br />
by default filters those errors out, since their finalLocation is in another file. Thus, the proposed diff also treats those<br />
errors in a similar way as the "requested here" errors to make them show up.</p>

<p>Note 1: In case the template function and the call are located in the same file, KDevelop will still only report the error<br />
within the template function with this patch applied. Similarly, if there is a chain of multiple template functions within<br />
the same file that call each other and finally cause an error in an external template function, the "requested here" error<br />
highlight will only be generated for the first one and not for the others.</p>

<p>Note 2: While testing, I noticed some inconsistencies in which errors are detected upon different actions: pressing <a href="https://phabricator.kde.org/F5" style="background-color: #e7e7e7;
          border-color: #e7e7e7;
          border-radius: 3px;
          padding: 0 4px;
          font-weight: bold;
          color: black;text-decoration: none;">F5</a>,<br />
modifying the source file, or modifying the header. Not sure what the cause for this is. Sometimes the errors in<br />
included files only seem to be reported for the include files themselves and not for the source files.</p></div></div><br /><div><strong>TEST PLAN</strong><div><p>Did short manual testing. Trying to add incompatible Eigen matrices is reported as an error now and underlined red.</p></div></div><br /><div><strong>REPOSITORY</strong><div><div>R32 KDevelop</div></div></div><br /><div><strong>BRANCH</strong><div><div>report_some_problems_from_other_files (branched from master)</div></div></div><br /><div><strong>REVISION DETAIL</strong><div><a href="https://phabricator.kde.org/D18224">https://phabricator.kde.org/D18224</a></div></div><br /><div><strong>AFFECTED FILES</strong><div><div>plugins/clang/duchain/clangproblem.cpp<br />
plugins/clang/duchain/clangproblem.h<br />
plugins/clang/duchain/parsesession.cpp</div></div></div><br /><div><strong>To: </strong>thomassc<br /><strong>Cc: </strong>kdevelop-devel, glebaccon, hase, antismap, iodelay, geetamc, Pilzschaf, akshaydeo, surgenight, arrowd<br /></div>