================ @@ -11792,6 +11792,26 @@ static bool CheckMultiVersionFunction(Sema &S, FunctionDecl *NewFD, OldDecl, Previous); } +static void CheckFunctionDeclarationAttributesUsage(Sema &S, + FunctionDecl *NewFD) { + bool IsPure = NewFD->hasAttr<PureAttr>(); + bool IsConst = NewFD->hasAttr<ConstAttr>(); + + if (IsPure && IsConst) { + S.Diag(NewFD->getLocation(), diag::warn_const_attr_with_pure_attr); + NewFD->dropAttr<PureAttr>(); + } + if (IsPure || IsConst) { + // constructors and destructors also functions which returns void + if (NewFD->getReturnType()->isVoidType()) { + S.Diag(NewFD->getLocation(), diag::warn_pure_function_returns_void) + << IsConst; + NewFD->dropAttr<PureAttr>(); + NewFD->dropAttr<ConstAttr>(); ---------------- erichkeane wrote:
There is perhaps use in changing `dropAttr` to be a variadic template, and dropping a bunch at once. I realize 'N' is small here, but turns from O(2N) to O(N). So in DeclBase.h: ``` template <typename ...Ts> void dropAttr() { if (!HasAttrs) return; AttrVec &Vec = getAttrs(); llvm::erase_if(Vec, [](Attr *A) { return isa<Ts...>(A) ; }); if (Vec.empty()) HasAttrs = false; } }; ``` WDYT Aaron? Is this something we'd use? https://github.com/llvm/llvm-project/pull/78200 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits