Author: Sam McCall Date: 2021-08-12T23:47:01+02:00 New Revision: 3b99acbff2504d9f056c6bb76974286322e60382
URL: https://github.com/llvm/llvm-project/commit/3b99acbff2504d9f056c6bb76974286322e60382 DIFF: https://github.com/llvm/llvm-project/commit/3b99acbff2504d9f056c6bb76974286322e60382.diff LOG: [Attributes]: refactor to expose ParsedAttrInfo::acceptsLangOpts. NFC We will use this function to filter code completion of attributes. Differential Revision: https://reviews.llvm.org/D107836 Added: Modified: clang/docs/ReleaseNotes.rst clang/include/clang/Sema/ParsedAttr.h clang/lib/Sema/ParsedAttr.cpp clang/utils/TableGen/ClangAttrEmitter.cpp Removed: ################################################################################ diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index d20c08dbffa53..7604df7482c76 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -86,7 +86,13 @@ New Pragmas in Clang Attribute Changes in Clang -------------------------- -- ... +- Attributes loaded as clang plugins which are sensitive to LangOpts must + now override ``acceptsLangOpts`` instead of ``diagLangOpts``. + Returning false will produce a generic "attribute ignored" diagnostic, as + with clang's built-in attributes. + If plugins want to provide richer diagnostics, they can do so when the + attribute is handled instead, e.g. in ``handleDeclAttribute``. + (This was changed in order to better support attributes in code completion). Windows Support --------------- diff --git a/clang/include/clang/Sema/ParsedAttr.h b/clang/include/clang/Sema/ParsedAttr.h index f47f557adeb10..e3b910060231d 100644 --- a/clang/include/clang/Sema/ParsedAttr.h +++ b/clang/include/clang/Sema/ParsedAttr.h @@ -92,11 +92,9 @@ struct ParsedAttrInfo { const Decl *D) const { return true; } - /// Check if this attribute is allowed by the language we are compiling, and - /// issue a diagnostic if not. - virtual bool diagLangOpts(Sema &S, const ParsedAttr &Attr) const { - return true; - } + /// Check if this attribute is allowed by the language we are compiling. + virtual bool acceptsLangOpts(const LangOptions &LO) const { return true; } + /// Check if this attribute is allowed when compiling for the given target. virtual bool existsInTarget(const TargetInfo &Target) const { return true; diff --git a/clang/lib/Sema/ParsedAttr.cpp b/clang/lib/Sema/ParsedAttr.cpp index ed03b0c7f688b..cba49d7116b02 100644 --- a/clang/lib/Sema/ParsedAttr.cpp +++ b/clang/lib/Sema/ParsedAttr.cpp @@ -180,7 +180,10 @@ void ParsedAttr::getMatchRules( } bool ParsedAttr::diagnoseLangOpts(Sema &S) const { - return getInfo().diagLangOpts(S, *this); + if (getInfo().acceptsLangOpts(S.getLangOpts())) + return true; + S.Diag(getLoc(), diag::warn_attribute_ignored) << *this; + return false; } bool ParsedAttr::isTargetSpecificAttr() const { diff --git a/clang/utils/TableGen/ClangAttrEmitter.cpp b/clang/utils/TableGen/ClangAttrEmitter.cpp index 5fc2d50f65fa8..345b13692b5ca 100644 --- a/clang/utils/TableGen/ClangAttrEmitter.cpp +++ b/clang/utils/TableGen/ClangAttrEmitter.cpp @@ -3803,14 +3803,8 @@ static void GenerateLangOptRequirements(const Record &R, if (LangOpts.empty()) return; - OS << "bool diagLangOpts(Sema &S, const ParsedAttr &Attr) "; - OS << "const override {\n"; - OS << " auto &LangOpts = S.LangOpts;\n"; - OS << " if (" << GenerateTestExpression(LangOpts) << ")\n"; - OS << " return true;\n\n"; - OS << " S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) "; - OS << "<< Attr;\n"; - OS << " return false;\n"; + OS << "bool acceptsLangOpts(const LangOptions &LangOpts) const override {\n"; + OS << " return " << GenerateTestExpression(LangOpts) << ";\n"; OS << "}\n\n"; } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits