diff options
author | Justin Bogner <mail@justinbogner.com> | 2014-05-22 06:04:59 +0000 |
---|---|---|
committer | Justin Bogner <mail@justinbogner.com> | 2014-05-22 06:04:59 +0000 |
commit | c65a66ddfe5b3a51055bb5d3050d022976ba3cf2 (patch) | |
tree | 0362db8045455ec0204263f5396e8f2a3f25d353 | |
parent | 9dd60cfb64c1f409fcbcfe5e5ba94c5d2d21b162 (diff) | |
download | bcm5719-llvm-c65a66ddfe5b3a51055bb5d3050d022976ba3cf2.tar.gz bcm5719-llvm-c65a66ddfe5b3a51055bb5d3050d022976ba3cf2.zip |
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
-rw-r--r-- | clang/lib/Serialization/ASTReader.cpp | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index 4de9919c88a..143a7386ff2 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; } //===----------------------------------------------------------------------===// |