[clang] 91c4b55 - [clang] Update NumFunctionDeclBits for FunctionDeclBitfields
via cfe-commits
cfe-commits at lists.llvm.org
Thu Aug 17 05:30:09 PDT 2023
Author: dingfei
Date: 2023-08-17T20:28:41+08:00
New Revision: 91c4b5550ecfbb7afe7275c341b73a6d3a1bbd78
URL: https://github.com/llvm/llvm-project/commit/91c4b5550ecfbb7afe7275c341b73a6d3a1bbd78
DIFF: https://github.com/llvm/llvm-project/commit/91c4b5550ecfbb7afe7275c341b73a6d3a1bbd78.diff
LOG: [clang] Update NumFunctionDeclBits for FunctionDeclBitfields
NumFunctionDeclBits is not updated when DeductionCandidateKind is
incremented.
Fixes https://github.com/llvm/llvm-project/issues/64171
Reviewed By: cor3ntin, balazske, aaron.ballman
Differential Revision: https://reviews.llvm.org/D158145
Added:
Modified:
clang/docs/ReleaseNotes.rst
clang/include/clang/AST/DeclBase.h
clang/lib/Serialization/ASTWriterDecl.cpp
clang/unittests/AST/ASTImporterTest.cpp
clang/unittests/AST/DeclTest.cpp
Removed:
################################################################################
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 064b4556f354a2..1bfca926bf92a9 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -177,6 +177,9 @@ Bug Fixes to C++ Support
requires-expression. This fixes:
(`#64138 <https://github.com/llvm/llvm-project/issues/64138>`_).
+- Update ``FunctionDeclBitfields.NumFunctionDeclBits``. This fixes:
+ (`#64171 <https://github.com/llvm/llvm-project/issues/64171>`_).
+
Bug Fixes to AST Handling
^^^^^^^^^^^^^^^^^^^^^^^^^
- Fixed an import failure of recursive friend class template.
diff --git a/clang/include/clang/AST/DeclBase.h b/clang/include/clang/AST/DeclBase.h
index 1b99709ca90d99..12137387b676a7 100644
--- a/clang/include/clang/AST/DeclBase.h
+++ b/clang/include/clang/AST/DeclBase.h
@@ -1702,7 +1702,7 @@ class DeclContext {
};
/// Number of non-inherited bits in FunctionDeclBitfields.
- enum { NumFunctionDeclBits = 30 };
+ enum { NumFunctionDeclBits = 31 };
/// Stores the bits used by CXXConstructorDecl. If modified
/// NumCXXConstructorDeclBits and the accessor
@@ -1714,12 +1714,12 @@ class DeclContext {
/// For the bits in FunctionDeclBitfields.
uint64_t : NumFunctionDeclBits;
- /// 21 bits to fit in the remaining available space.
+ /// 20 bits to fit in the remaining available space.
/// Note that this makes CXXConstructorDeclBitfields take
/// exactly 64 bits and thus the width of NumCtorInitializers
/// will need to be shrunk if some bit is added to NumDeclContextBitfields,
/// NumFunctionDeclBitfields or CXXConstructorDeclBitfields.
- uint64_t NumCtorInitializers : 18;
+ uint64_t NumCtorInitializers : 17;
uint64_t IsInheritingConstructor : 1;
/// Whether this constructor has a trail-allocated explicit specifier.
diff --git a/clang/lib/Serialization/ASTWriterDecl.cpp b/clang/lib/Serialization/ASTWriterDecl.cpp
index 59dbc36d24e8c9..8dd78152bd6870 100644
--- a/clang/lib/Serialization/ASTWriterDecl.cpp
+++ b/clang/lib/Serialization/ASTWriterDecl.cpp
@@ -580,7 +580,7 @@ void ASTDeclWriter::VisitDeclaratorDecl(DeclaratorDecl *D) {
}
void ASTDeclWriter::VisitFunctionDecl(FunctionDecl *D) {
- static_assert(DeclContext::NumFunctionDeclBits == 30,
+ static_assert(DeclContext::NumFunctionDeclBits == 31,
"You need to update the serializer after you change the "
"FunctionDeclBits");
@@ -1495,7 +1495,7 @@ void ASTDeclWriter::VisitCXXMethodDecl(CXXMethodDecl *D) {
}
void ASTDeclWriter::VisitCXXConstructorDecl(CXXConstructorDecl *D) {
- static_assert(DeclContext::NumCXXConstructorDeclBits == 21,
+ static_assert(DeclContext::NumCXXConstructorDeclBits == 20,
"You need to update the serializer after you change the "
"CXXConstructorDeclBits");
diff --git a/clang/unittests/AST/ASTImporterTest.cpp b/clang/unittests/AST/ASTImporterTest.cpp
index 06b64b9f8efb47..057701dea2c51d 100644
--- a/clang/unittests/AST/ASTImporterTest.cpp
+++ b/clang/unittests/AST/ASTImporterTest.cpp
@@ -7832,6 +7832,47 @@ TEST_P(ASTImporterOptionSpecificTestBase, ImportConstructorUsingShadow) {
CheckAST(ToTU, ToC);
}
+TEST_P(ASTImporterOptionSpecificTestBase,
+ ImportFunctionDeclBitShouldNotOverwriteCtorDeclBits) {
+ Decl *From, *To;
+ std::tie(From, To) = getImportedDecl(
+ R"s(
+ struct A {
+ A() : m() {}
+ int m;
+ };
+
+ A foo() { A a; return a; }
+ A bar() { return {}; }
+ )s",
+ Lang_CXX17,
+ R"s(
+ struct A {
+ A() : m() {}
+ int m;
+ };
+ A baz() { return {}; }
+ )s",
+ Lang_CXX17, "A");
+
+ auto HasCtorInit =
+ hasAnyConstructorInitializer(cxxCtorInitializer(isMemberInitializer()));
+ auto ImpMoveCtor =
+ cxxConstructorDecl(isMoveConstructor(), isImplicit(), HasCtorInit);
+
+ auto *FromImpMoveCtor = FirstDeclMatcher<CXXConstructorDecl>().match(
+ From, ImpMoveCtor);
+ auto *ToImpMoveCtor = FirstDeclMatcher<CXXConstructorDecl>().match(
+ To, ImpMoveCtor);
+
+ EXPECT_TRUE(FromImpMoveCtor->getNumCtorInitializers() == 1);
+ EXPECT_FALSE(FromImpMoveCtor->FriendConstraintRefersToEnclosingTemplate());
+
+ EXPECT_TRUE(ToImpMoveCtor->getNumCtorInitializers() == 1);
+ EXPECT_FALSE(ToImpMoveCtor->FriendConstraintRefersToEnclosingTemplate());
+ EXPECT_TRUE(*ToImpMoveCtor->init_begin());
+}
+
AST_MATCHER_P(UsingShadowDecl, hasIntroducerDecl, internal::Matcher<NamedDecl>,
InnerMatcher) {
return InnerMatcher.matches(*Node.getIntroducer(), Finder, Builder);
diff --git a/clang/unittests/AST/DeclTest.cpp b/clang/unittests/AST/DeclTest.cpp
index 2ed2ed750941c4..d2977b0cb55b64 100644
--- a/clang/unittests/AST/DeclTest.cpp
+++ b/clang/unittests/AST/DeclTest.cpp
@@ -353,6 +353,32 @@ TEST(Decl, FriendFunctionWithinClassInHeaderUnit) {
EXPECT_TRUE(getFooValue->isInlined());
}
+TEST(Decl, FunctionDeclBitsShouldNotOverlapWithCXXConstructorDeclBits) {
+ llvm::Annotations Code(R"(
+ struct A {
+ A() : m() {}
+ int m;
+ };
+
+ A f() { return A(); }
+ )");
+
+ auto AST = tooling::buildASTFromCodeWithArgs(Code.code(), {"-std=c++14"});
+ ASTContext &Ctx = AST->getASTContext();
+
+ auto HasCtorInit =
+ hasAnyConstructorInitializer(cxxCtorInitializer(isMemberInitializer()));
+ auto ImpMoveCtor =
+ cxxConstructorDecl(isMoveConstructor(), isImplicit(), HasCtorInit)
+ .bind("MoveCtor");
+
+ auto *ToImpMoveCtor =
+ selectFirst<CXXConstructorDecl>("MoveCtor", match(ImpMoveCtor, Ctx));
+
+ EXPECT_TRUE(ToImpMoveCtor->getNumCtorInitializers() == 1);
+ EXPECT_FALSE(ToImpMoveCtor->FriendConstraintRefersToEnclosingTemplate());
+}
+
TEST(Decl, NoProtoFunctionDeclAttributes) {
llvm::Annotations Code(R"(
void f();
More information about the cfe-commits
mailing list