[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
This commit is contained in:
Richard Smith 2015-02-13 22:43:51 +00:00
parent a7e79c1b44
commit 4ab3dbd916
1 changed files with 11 additions and 0 deletions

View File

@ -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