From 7592787111fedc16dbd9546502f5f3cfc31e0a0e Mon Sep 17 00:00:00 2001 From: Richard Trieu Date: Fri, 14 Sep 2018 01:15:28 +0000 Subject: [PATCH] [ODRHash] Fix early exit that skipped code. There is a bit of code at the end of AddDeclaration that should be run on every exit of the function. However, there was an early exit beforehand that could be triggered, which causes a small amount of data to skip the hashing, leading to false positive mismatch. Use a separate function so that this code is always run. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@342199 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/AST/ODRHash.h | 3 +++ lib/AST/ODRHash.cpp | 12 +++++++++--- test/Modules/Inputs/odr_hash-Unresolved/class.h | 1 + 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/include/clang/AST/ODRHash.h b/include/clang/AST/ODRHash.h index 0298887d1b..feaa83844a 100644 --- a/include/clang/AST/ODRHash.h +++ b/include/clang/AST/ODRHash.h @@ -91,6 +91,9 @@ public: void AddBoolean(bool value); static bool isWhitelistedDecl(const Decl* D, const DeclContext *Parent); + +private: + void AddDeclarationNameImpl(DeclarationName Name); }; } // end namespace clang diff --git a/lib/AST/ODRHash.cpp b/lib/AST/ODRHash.cpp index 1624468079..3aeb7e6fbb 100644 --- a/lib/AST/ODRHash.cpp +++ b/lib/AST/ODRHash.cpp @@ -34,8 +34,17 @@ void ODRHash::AddIdentifierInfo(const IdentifierInfo *II) { void ODRHash::AddDeclarationName(DeclarationName Name, bool TreatAsDecl) { if (TreatAsDecl) + // Matches the NamedDecl check in AddDecl AddBoolean(true); + AddDeclarationNameImpl(Name); + + if (TreatAsDecl) + // Matches the ClassTemplateSpecializationDecl check in AddDecl + AddBoolean(false); +} + +void ODRHash::AddDeclarationNameImpl(DeclarationName Name) { // Index all DeclarationName and use index numbers to refer to them. auto Result = DeclNameMap.insert(std::make_pair(Name, DeclNameMap.size())); ID.AddInteger(Result.first->second); @@ -91,9 +100,6 @@ void ODRHash::AddDeclarationName(DeclarationName Name, bool TreatAsDecl) { } } } - - if (TreatAsDecl) - AddBoolean(false); } void ODRHash::AddNestedNameSpecifier(const NestedNameSpecifier *NNS) { diff --git a/test/Modules/Inputs/odr_hash-Unresolved/class.h b/test/Modules/Inputs/odr_hash-Unresolved/class.h index fe3a7116f9..8a3c9f941f 100644 --- a/test/Modules/Inputs/odr_hash-Unresolved/class.h +++ b/test/Modules/Inputs/odr_hash-Unresolved/class.h @@ -6,6 +6,7 @@ class S { void run() { int x; A::Check(&Field, 1); + A::Check(&Field, 1); } }; #endif -- 2.40.0