diff --git a/clang/include/clang/AST/Type.h b/clang/include/clang/AST/Type.h --- a/clang/include/clang/AST/Type.h +++ b/clang/include/clang/AST/Type.h @@ -1647,6 +1647,7 @@ /// Only common bits are stored here. Additional uncommon bits are stored /// in a trailing object after FunctionProtoType. class FunctionTypeBitfields { + friend class FunctionNoProtoType; friend class FunctionProtoType; friend class FunctionType; @@ -3942,7 +3943,9 @@ Result->getDependence() & ~(TypeDependence::DependentInstantiation | TypeDependence::UnexpandedPack), - Info) {} + Info) { + FunctionTypeBits.FastTypeQuals = 0; + } public: // No additional state past what FunctionType provides. diff --git a/clang/unittests/AST/DeclTest.cpp b/clang/unittests/AST/DeclTest.cpp --- a/clang/unittests/AST/DeclTest.cpp +++ b/clang/unittests/AST/DeclTest.cpp @@ -354,3 +354,24 @@ 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"}); + ASTContext &Ctx = AST->getASTContext(); + + auto *f = selectFirst( + "f", match(functionDecl(hasName("f")).bind("f"), Ctx)); + + const auto *FPT = f->getType()->getAs(); + + // Functions without prototypes always have 0 initialized qualifiers + EXPECT_FALSE(FPT->isConst()); + EXPECT_FALSE(FPT->isVolatile()); + EXPECT_FALSE(FPT->isRestrict()); +}