Fix Plugin::containsPreprocessingConditionalInclusion

...which had been broken since dfc0dc4801
"loplugin:casttovoid: fix containsPreprocessingConditionalInclusion()", and,
when range.getEnd() was a macro loc, would typically have wandered off past
the end of the intended range, until it would have encountered some #if etc.
and erroneously returned true.  Fixed the fallout across the code base.

While at it, added a clarifying comment and made the "lexing fails" cases that
should never happen fail with a fatal error in debug mode.

Change-Id: Ieff44548384426d7716b6fc6c836c9069d878729
Reviewed-on: https://gerrit.libreoffice.org/81721
Tested-by: Jenkins
Reviewed-by: Stephan Bergmann <sbergman@redhat.com>
This commit is contained in:
Stephan Bergmann
2019-10-29 22:53:33 +01:00
parent b5d8a5f830
commit 1136ed6c51
3 changed files with 23 additions and 9 deletions

View File

@@ -285,6 +285,8 @@ bool Plugin::isUnitTestMode()
bool Plugin::containsPreprocessingConditionalInclusion(SourceRange range)
{
// Preprocessing directives (other than _Pragma, which is not relevant here) cannot appear in
// macro expansions, so it is safe to just consider the range of expansion locations:
auto const begin = compiler.getSourceManager().getExpansionLoc(
range.getBegin());
auto const end = compiler.getSourceManager().getExpansionLoc(
@@ -294,8 +296,15 @@ bool Plugin::containsPreprocessingConditionalInclusion(SourceRange range)
|| compiler.getSourceManager().isBeforeInTranslationUnit(
begin, end)))
{
// Conservatively assume "yes" if lexing fails (e.g., due to
// macros):
if (isDebugMode()) {
report(
DiagnosticsEngine::Fatal,
("unexpected broken range for Plugin::containsPreprocessingConditionalInclusion,"
" case 1"),
range.getBegin())
<< range;
}
// Conservatively assume "yes" if lexing fails:
return true;
}
auto hash = false;
@@ -305,8 +314,15 @@ bool Plugin::containsPreprocessingConditionalInclusion(SourceRange range)
loc, tok, compiler.getSourceManager(),
compiler.getLangOpts(), true))
{
// Conservatively assume "yes" if lexing fails (e.g., due to
// macros):
if (isDebugMode()) {
report(
DiagnosticsEngine::Fatal,
("unexpected broken range for"
" Plugin::containsPreprocessingConditionalInclusion, case 2"),
loc)
<< range;
}
// Conservatively assume "yes" if lexing fails:
return true;
}
if (hash && tok.is(tok::raw_identifier)) {
@@ -317,7 +333,7 @@ bool Plugin::containsPreprocessingConditionalInclusion(SourceRange range)
return true;
}
}
if (loc == range.getEnd()) {
if (loc == end) {
break;
}
hash = tok.is(tok::hash) && tok.isAtStartOfLine();