summaryrefslogtreecommitdiff
path: root/compilerplugins/clang/plugin.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'compilerplugins/clang/plugin.cxx')
-rw-r--r--compilerplugins/clang/plugin.cxx26
1 files changed, 21 insertions, 5 deletions
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();