summaryrefslogtreecommitdiffstats
path: root/clang/lib/Serialization
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2015-02-13 22:43:51 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2015-02-13 22:43:51 +0000
commit4ab3dbd91680508fac75fa5df894c89abf83d5b5 (patch)
tree3e5f7ea046b958c0d21cd70a8b70440504a283c5 /clang/lib/Serialization
parenta7e79c1b448ff7ec90b1fee27e7e148275a2fd94 (diff)
downloadbcm5719-llvm-4ab3dbd91680508fac75fa5df894c89abf83d5b5.tar.gz
bcm5719-llvm-4ab3dbd91680508fac75fa5df894c89abf83d5b5.zip
[modules] Guard against recursively re-entering diagnosing ODR violations while
in the middle of emitting an ODR violation diagnostic. I don't yet have a reduced testcase for this issue, working on it... llvm-svn: 229167
Diffstat (limited to 'clang/lib/Serialization')
-rw-r--r--clang/lib/Serialization/ASTReader.cpp11
1 files changed, 11 insertions, 0 deletions
diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp
index 7c211e41a18..a0cb7b506bd 100644
--- a/clang/lib/Serialization/ASTReader.cpp
+++ b/clang/lib/Serialization/ASTReader.cpp
@@ -8475,6 +8475,10 @@ void ASTReader::diagnoseOdrViolations() {
// completed. We only really need to mark FieldDecls as invalid here.
if (!isa<TagDecl>(D))
D->setInvalidDecl();
+
+ // Ensure we don't accidentally recursively enter deserialization while
+ // we're producing our diagnostic.
+ Deserializing RecursionGuard(this);
std::string CanonDefModule =
getOwningModuleNameForDiagnostic(cast<Decl>(CanonDef));
@@ -8496,6 +8500,13 @@ void ASTReader::diagnoseOdrViolations() {
}
}
+ if (OdrMergeFailures.empty())
+ return;
+
+ // Ensure we don't accidentally recursively enter deserialization while
+ // we're producing our diagnostics.
+ Deserializing RecursionGuard(this);
+
// Issue any pending ODR-failure diagnostics.
for (auto &Merge : OdrMergeFailures) {
// If we've already pointed out a specific problem with this class, don't
OpenPOWER on IntegriCloud