================ @@ -2260,6 +2260,37 @@ static bool neverReturns(const CFGBlock *B) { return false; } +template <typename AttrT> +static SmallVector<const Expr *> collectAttrArgs(const FunctionDecl *FD) { + SmallVector<const Expr *> Args; + for (const AttrT *A : FD->specific_attrs<AttrT>()) { + for (const Expr *E : A->args()) + Args.push_back(E); + } + + return Args; +} + +static void diagnoseMismatchedFunctionAttrs(const FunctionDecl *FD, + ThreadSafetyHandler &Handler) { + assert(FD); + FD = FD->getDefinition(); + assert(FD); + auto FDArgs = collectAttrArgs<RequiresCapabilityAttr>(FD); + + for (const FunctionDecl *D = FD->getPreviousDecl(); D; + D = D->getPreviousDecl()) { + auto DArgs = collectAttrArgs<RequiresCapabilityAttr>(D); ---------------- aaronpuchert wrote:
I don't see why we should restrict this to `requires_capability`. I think pretty much all attributes should be visible to callers except `no_thread_safety_analysis`. This is also [documented](https://clang.llvm.org/docs/ThreadSafetyAnalysis.html): > Q. Should I put attributes in the header file, or in the .cc/.cpp/.cxx file? > > (A) Attributes are part of the formal interface of a function, and should > always go in the header, where they are visible to anything that includes the > header. Attributes in the .cpp file are not visible outside of the immediate > translation unit, which leads to false negatives and false positives. And later: > Unlike the other attributes, `NO_THREAD_SAFETY_ANALYSIS` is not part of the > interface of a function, and should thus be placed on the function definition > (in the `.cc` or `.cpp` file) rather than on the function declaration (in the > header). https://github.com/llvm/llvm-project/pull/67520 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits