diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2015-02-13 22:43:51 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2015-02-13 22:43:51 +0000 |
commit | 4ab3dbd91680508fac75fa5df894c89abf83d5b5 (patch) | |
tree | 3e5f7ea046b958c0d21cd70a8b70440504a283c5 /clang/lib/Serialization | |
parent | a7e79c1b448ff7ec90b1fee27e7e148275a2fd94 (diff) | |
download | bcm5719-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.cpp | 11 |
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 |