Author: Richard Howell Date: 2022-09-26T09:48:54-07:00 New Revision: 1f451a8bd6f32465b6ff26c30ba7fb6fc7e0e689
URL: https://github.com/llvm/llvm-project/commit/1f451a8bd6f32465b6ff26c30ba7fb6fc7e0e689 DIFF: https://github.com/llvm/llvm-project/commit/1f451a8bd6f32465b6ff26c30ba7fb6fc7e0e689.diff LOG: [clang] initialize type qualifiers for FunctionNoProtoType When initializing FunctionNoProtoType types, zero out the type qualifiers. This will ensure the ODR hash remains stable as it hashes the values for these qualifiers for all function types. Reviewed By: aaron.ballman Differential Revision: https://reviews.llvm.org/D133586 Added: Modified: clang/include/clang/AST/Type.h clang/unittests/AST/DeclTest.cpp Removed: ################################################################################ diff --git a/clang/include/clang/AST/Type.h b/clang/include/clang/AST/Type.h index 347088780e4b8..507f72e62988e 100644 --- a/clang/include/clang/AST/Type.h +++ b/clang/include/clang/AST/Type.h @@ -3892,7 +3892,10 @@ class FunctionType : public Type { } Qualifiers getFastTypeQuals() const { - return Qualifiers::fromFastMask(FunctionTypeBits.FastTypeQuals); + if (isFunctionProtoType()) + return Qualifiers::fromFastMask(FunctionTypeBits.FastTypeQuals); + + return Qualifiers(); } public: diff --git a/clang/unittests/AST/DeclTest.cpp b/clang/unittests/AST/DeclTest.cpp index 43a3798867f49..8d55f13e1f5c3 100644 --- a/clang/unittests/AST/DeclTest.cpp +++ b/clang/unittests/AST/DeclTest.cpp @@ -354,3 +354,25 @@ TEST(Decl, FriendFunctionWithinClassInHeaderUnit) { EXPECT_TRUE(getFooValue->isInlined()); } + +TEST(Decl, NoProtoFunctionDeclAttributes) { + llvm::Annotations Code(R"( + void f(); + )"); + + auto AST = tooling::buildASTFromCodeWithArgs( + Code.code(), + /*Args=*/{"-target", "i386-apple-darwin", "-x", "objective-c", + "-std=c89"}); + ASTContext &Ctx = AST->getASTContext(); + + auto *f = selectFirst<FunctionDecl>( + "f", match(functionDecl(hasName("f")).bind("f"), Ctx)); + + const auto *FPT = f->getType()->getAs<FunctionNoProtoType>(); + + // Functions without prototypes always have 0 initialized qualifiers + EXPECT_FALSE(FPT->isConst()); + EXPECT_FALSE(FPT->isVolatile()); + EXPECT_FALSE(FPT->isRestrict()); +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits