From 1136ed6c5112018af08f8ac703070cc195389b40 Mon Sep 17 00:00:00 2001 From: Stephan Bergmann Date: Tue, 29 Oct 2019 22:53:33 +0100 Subject: Fix Plugin::containsPreprocessingConditionalInclusion ...which had been broken since dfc0dc4801707b2d8080af1540625b43bd463e17 "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 --- compilerplugins/clang/plugin.cxx | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) (limited to 'compilerplugins') diff --git a/compilerplugins/clang/plugin.cxx b/compilerplugins/clang/plugin.cxx index 6839fec0a836..01484bddc432 100644 --- a/compilerplugins/clang/plugin.cxx +++ b/compilerplugins/clang/plugin.cxx @@ -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(); -- cgit v1.2.3