Author: yronglin Date: 2025-06-26T01:38:37+08:00 New Revision: 585ed213a8594c15324ea4bffc3ea2128eac50c8
URL: https://github.com/llvm/llvm-project/commit/585ed213a8594c15324ea4bffc3ea2128eac50c8 DIFF: https://github.com/llvm/llvm-project/commit/585ed213a8594c15324ea4bffc3ea2128eac50c8.diff LOG: [NFC][Clang][Preprocessor] Refine the implementation of isNextPPTokenOneOf (#145546) This PR follow the suggestion(https://github.com/llvm/llvm-project/pull/143898#discussion_r2164253141) to refine the implementation of `Preprocessor::isNextPPToken`, also use C++ fold expression to refine `Token::isOneOf`. We don't need `bool isOneOf(tok::TokenKind K1, tok::TokenKind K2) const` anymore. In order to reduce the impact, specificed `TokenKind` is still passed to `Token::isOneOf` and `Preprocessor::isNextPPTokenOneOf` as function parameters. --------- Signed-off-by: yronglin <yronglin...@gmail.com> Added: Modified: clang/include/clang/Lex/Preprocessor.h clang/include/clang/Lex/Token.h clang/lib/Lex/PPDirectives.cpp clang/lib/Lex/Preprocessor.cpp Removed: ################################################################################ diff --git a/clang/include/clang/Lex/Preprocessor.h b/clang/include/clang/Lex/Preprocessor.h index 0ec1cb4d0c5d8..dae12a6015439 100644 --- a/clang/include/clang/Lex/Preprocessor.h +++ b/clang/include/clang/Lex/Preprocessor.h @@ -2304,7 +2304,9 @@ class Preprocessor { /// Check whether the next pp-token is one of the specificed token kind. this /// method should have no observable side-effect on the lexed tokens. - template <tok::TokenKind K, tok::TokenKind... Ks> bool isNextPPTokenOneOf() { + template <typename... Ts> bool isNextPPTokenOneOf(Ts... Ks) { + static_assert(sizeof...(Ts) > 0, + "requires at least one tok::TokenKind specified"); // Do some quick tests for rejection cases. std::optional<Token> Val; if (CurLexer) @@ -2335,7 +2337,7 @@ class Preprocessor { // Okay, we found the token and return. Otherwise we found the end of the // translation unit. - return Val->is(K) || (... || Val->is(Ks)); + return Val->isOneOf(Ks...); } private: diff --git a/clang/include/clang/Lex/Token.h b/clang/include/clang/Lex/Token.h index d4dfd7b44d9af..fc43e72593b94 100644 --- a/clang/include/clang/Lex/Token.h +++ b/clang/include/clang/Lex/Token.h @@ -101,11 +101,10 @@ class Token { /// "if (Tok.is(tok::l_brace)) {...}". bool is(tok::TokenKind K) const { return Kind == K; } bool isNot(tok::TokenKind K) const { return Kind != K; } - bool isOneOf(tok::TokenKind K1, tok::TokenKind K2) const { - return is(K1) || is(K2); - } - template <typename... Ts> bool isOneOf(tok::TokenKind K1, Ts... Ks) const { - return is(K1) || isOneOf(Ks...); + template <typename... Ts> bool isOneOf(Ts... Ks) const { + static_assert(sizeof...(Ts) > 0, + "requires at least one tok::TokenKind specified"); + return (is(Ks) || ...); } /// Return true if this is a raw identifier (when lexing diff --git a/clang/lib/Lex/PPDirectives.cpp b/clang/lib/Lex/PPDirectives.cpp index c8974e5a3528c..b88624b22e622 100644 --- a/clang/lib/Lex/PPDirectives.cpp +++ b/clang/lib/Lex/PPDirectives.cpp @@ -183,9 +183,9 @@ static bool isReservedCXXAttributeName(Preprocessor &PP, IdentifierInfo *II) { AttributeCommonInfo::AttrArgsInfo AttrArgsInfo = AttributeCommonInfo::getCXX11AttrArgsInfo(II); if (AttrArgsInfo == AttributeCommonInfo::AttrArgsInfo::Required) - return PP.isNextPPTokenOneOf<tok::l_paren>(); + return PP.isNextPPTokenOneOf(tok::l_paren); - return !PP.isNextPPTokenOneOf<tok::l_paren>() || + return !PP.isNextPPTokenOneOf(tok::l_paren) || AttrArgsInfo == AttributeCommonInfo::AttrArgsInfo::Optional; } return false; diff --git a/clang/lib/Lex/Preprocessor.cpp b/clang/lib/Lex/Preprocessor.cpp index 7fecbe9eee53c..500cf6f8400e0 100644 --- a/clang/lib/Lex/Preprocessor.cpp +++ b/clang/lib/Lex/Preprocessor.cpp @@ -813,14 +813,14 @@ bool Preprocessor::HandleIdentifier(Token &Identifier) { if (!Identifier.isExpandDisabled() && MI->isEnabled()) { // C99 6.10.3p10: If the preprocessing token immediately after the // macro name isn't a '(', this macro should not be expanded. - if (!MI->isFunctionLike() || isNextPPTokenOneOf<tok::l_paren>()) + if (!MI->isFunctionLike() || isNextPPTokenOneOf(tok::l_paren)) return HandleMacroExpandedIdentifier(Identifier, MD); } else { // C99 6.10.3.4p2 says that a disabled macro may never again be // expanded, even if it's in a context where it could be expanded in the // future. Identifier.setFlag(Token::DisableExpand); - if (MI->isObjectLike() || isNextPPTokenOneOf<tok::l_paren>()) + if (MI->isObjectLike() || isNextPPTokenOneOf(tok::l_paren)) Diag(Identifier, diag::pp_disabled_macro_expansion); } } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits