llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: Maksim Ivanov (emaxx-google) <details> <summary>Changes</summary> This commit fixes the nondeterminism issue in C++ header module enabled builds which were observed after https://github.com/llvm/llvm-project/pull/132401. The issue was related to the fact that the hash set operation in MemberPointerType::Profile() was triggering getMostRecentDecl(). The root cause seems to be that the latter was leading to the reentrant modification of the hash set, with some probability (likely depending on the actual values of hashes). We haven't been able to come up with a deterministic regression test for this fix. --- Full diff: https://github.com/llvm/llvm-project/pull/137910.diff 2 Files Affected: - (modified) clang/include/clang/AST/Type.h (+2-1) - (modified) clang/lib/AST/Type.cpp (+7-3) ``````````diff diff --git a/clang/include/clang/AST/Type.h b/clang/include/clang/AST/Type.h index 3e1fb05ad537c..c93cbae767db8 100644 --- a/clang/include/clang/AST/Type.h +++ b/clang/include/clang/AST/Type.h @@ -3602,6 +3602,7 @@ class MemberPointerType : public Type, public llvm::FoldingSetNode { } NestedNameSpecifier *getQualifier() const { return Qualifier; } + CXXRecordDecl *getCXXRecordDecl() const; CXXRecordDecl *getMostRecentCXXRecordDecl() const; bool isSugared() const; @@ -3610,7 +3611,7 @@ class MemberPointerType : public Type, public llvm::FoldingSetNode { } void Profile(llvm::FoldingSetNodeID &ID) { - Profile(ID, getPointeeType(), getQualifier(), getMostRecentCXXRecordDecl()); + Profile(ID, getPointeeType(), getQualifier(), getCXXRecordDecl()); } static void Profile(llvm::FoldingSetNodeID &ID, QualType Pointee, diff --git a/clang/lib/AST/Type.cpp b/clang/lib/AST/Type.cpp index 111a642173418..a149eac7e4555 100644 --- a/clang/lib/AST/Type.cpp +++ b/clang/lib/AST/Type.cpp @@ -5275,10 +5275,14 @@ void MemberPointerType::Profile(llvm::FoldingSetNodeID &ID, QualType Pointee, ID.AddPointer(Cls->getCanonicalDecl()); } +CXXRecordDecl *MemberPointerType::getCXXRecordDecl() const { + return dyn_cast<MemberPointerType>(getCanonicalTypeInternal()) + ->getQualifier() + ->getAsRecordDecl(); +} + CXXRecordDecl *MemberPointerType::getMostRecentCXXRecordDecl() const { - auto *RD = dyn_cast<MemberPointerType>(getCanonicalTypeInternal()) - ->getQualifier() - ->getAsRecordDecl(); + auto *RD = getCXXRecordDecl(); if (!RD) return nullptr; return RD->getMostRecentNonInjectedDecl(); `````````` </details> https://github.com/llvm/llvm-project/pull/137910 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits