From c65a66ddfe5b3a51055bb5d3050d022976ba3cf2 Mon Sep 17 00:00:00 2001 From: Justin Bogner Date: Thu, 22 May 2014 06:04:59 +0000 Subject: [PATCH] Frontend: Propagate ASTReaderListener API in ChainedASTReaderListener ASTReaderListener's documentation states that visitInputFile will be called based on the return values of needsInputFileVisitation and needsSystemInputFileVisitation, but ChainedASTReaderListener may call these methods on a child listener based on the values returned by the other child. Even worse, the calls to visitInputFile may be short-circuited due to the use of the boolean or, so the calls to visit may not occur at all for the second listener. This updates ChainedASTReaderListener::visitInputFile to propagate the ASTReaderListener behaviour to both children. llvm-svn: 209394 --- clang/lib/Serialization/ASTReader.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index 4de9919c88a1..143a7386ff2f 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -135,8 +135,14 @@ void ChainedASTReaderListener::visitModuleFile(StringRef Filename) { bool ChainedASTReaderListener::visitInputFile(StringRef Filename, bool isSystem, bool isOverridden) { - return First->visitInputFile(Filename, isSystem, isOverridden) || - Second->visitInputFile(Filename, isSystem, isOverridden); + bool Continue = false; + if (First->needsInputFileVisitation() && + (!isSystem || First->needsSystemInputFileVisitation())) + Continue |= First->visitInputFile(Filename, isSystem, isOverridden); + if (Second->needsInputFileVisitation() && + (!isSystem || Second->needsSystemInputFileVisitation())) + Continue |= Second->visitInputFile(Filename, isSystem, isOverridden); + return Continue; } //===----------------------------------------------------------------------===//