Frontend: Propagate ASTReaderListener API in ChainedASTReaderListener
authorJustin Bogner <mail@justinbogner.com>
Thu, 22 May 2014 06:04:59 +0000 (06:04 +0000)
committerJustin Bogner <mail@justinbogner.com>
Thu, 22 May 2014 06:04:59 +0000 (06:04 +0000)
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

index 4de9919..143a738 100644 (file)
@@ -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;
 }
 
 //===----------------------------------------------------------------------===//