================ @@ -1632,21 +1632,34 @@ QualType CallExpr::getCallReturnType(const ASTContext &Ctx) const { std::pair<const NamedDecl *, const WarnUnusedResultAttr *> Expr::getUnusedResultAttrImpl(const Decl *Callee, QualType ReturnType) { - // If the callee is marked nodiscard, return that attribute - if (Callee != nullptr) + // If the callee is marked nodiscard, return that attribute for the + // diagnostic. If the callee is marked candiscard, do not diagnose. + // If seen on the same level, candiscard beats nodiscard. + if (Callee != nullptr) { + if (const auto *A = Callee->getAttr<CanDiscardAttr>()) + return {nullptr, nullptr}; if (const auto *A = Callee->getAttr<WarnUnusedResultAttr>()) return {nullptr, A}; + } - // If the return type is a struct, union, or enum that is marked nodiscard, - // then return the return type attribute. - if (const TagDecl *TD = ReturnType->getAsTagDecl()) - if (const auto *A = TD->getAttr<WarnUnusedResultAttr>()) - return {TD, A}; - + // Walk the return type's (chain of) type aliases. The first alias + // that is marked either nodiscard or candiscard ends the walk. for (const auto *TD = ReturnType->getAs<TypedefType>(); TD; - TD = TD->desugar()->getAs<TypedefType>()) + TD = TD->desugar()->getAs<TypedefType>()) { ---------------- halbi2 wrote:
Bug #68456 prevents these attributes from working on alias templates https://github.com/llvm/llvm-project/pull/154943 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits