llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: None (yronglin) <details> <summary>Changes</summary> --- Full diff: https://github.com/llvm/llvm-project/pull/184014.diff 3 Files Affected: - (modified) clang/include/clang/Lex/Preprocessor.h (+7-2) - (modified) clang/lib/Lex/PPDirectives.cpp (+10-63) - (modified) clang/lib/Lex/Preprocessor.cpp (+32-2) ``````````diff diff --git a/clang/include/clang/Lex/Preprocessor.h b/clang/include/clang/Lex/Preprocessor.h index b6e42a6151ac3..c97187a1a244f 100644 --- a/clang/include/clang/Lex/Preprocessor.h +++ b/clang/include/clang/Lex/Preprocessor.h @@ -1833,8 +1833,13 @@ class Preprocessor { bool LexModuleNameContinue(Token &Tok, SourceLocation UseLoc, SmallVectorImpl<Token> &Suffix, SmallVectorImpl<IdentifierLoc> &Path, - bool AllowMacroExpansion = true, - bool IsPartition = false); + bool IsPartition = false, + bool AllowMacroExpansion = true); + bool HandleModuleName(StringRef DirType, SourceLocation UseLoc, Token &Tok, + SmallVectorImpl<IdentifierLoc> &Path, + SmallVectorImpl<Token> &DirToks, + bool IsPartition = false, + bool AllowMacroExpansion = true); void EnterModuleSuffixTokenStream(ArrayRef<Token> Toks); void HandleCXXImportDirective(Token Import); void HandleCXXModuleDirective(Token Module); diff --git a/clang/lib/Lex/PPDirectives.cpp b/clang/lib/Lex/PPDirectives.cpp index 4a854c213926b..66990454f7ea4 100644 --- a/clang/lib/Lex/PPDirectives.cpp +++ b/clang/lib/Lex/PPDirectives.cpp @@ -4207,7 +4207,7 @@ void Preprocessor::HandleCXXImportDirective(Token ImportTok) { SmallVector<IdentifierLoc, 2> Path; bool ImportingHeader = false; bool IsPartition = false; - std::string FlatName; + switch (Tok.getKind()) { case tok::header_name: ImportingHeader = true; @@ -4221,27 +4221,11 @@ void Preprocessor::HandleCXXImportDirective(Token ImportTok) { Lex(Tok); [[fallthrough]]; case tok::identifier: { - bool LeadingSpace = Tok.hasLeadingSpace(); - unsigned NumToksInDirective = DirToks.size(); - if (LexModuleNameContinue(Tok, UseLoc, DirToks, Path)) { - if (Tok.isNot(tok::eod)) - CheckEndOfDirective(ImportTok.getIdentifierInfo()->getName(), - /*EnableMacros=*/false, &DirToks); - EnterModuleSuffixTokenStream(DirToks); + if (HandleModuleName(ImportTok.getIdentifierInfo()->getName(), UseLoc, Tok, + Path, DirToks, IsPartition)) return; - } - - // Clean the module-name tokens and replace these tokens with - // annot_module_name. - DirToks.resize(NumToksInDirective); - ModuleNameLoc *NameLoc = ModuleNameLoc::Create(*this, Path); - DirToks.emplace_back(); - DirToks.back().setKind(tok::annot_module_name); - DirToks.back().setAnnotationRange(NameLoc->getRange()); - DirToks.back().setAnnotationValue(static_cast<void *>(NameLoc)); - DirToks.back().setFlagValue(Token::LeadingSpace, LeadingSpace); - DirToks.push_back(Tok); + std::string FlatName; bool IsValid = (IsPartition && ModuleDeclState.isNamedModule()) || !IsPartition; if (Callbacks && IsValid) { @@ -4382,57 +4366,20 @@ void Preprocessor::HandleCXXModuleDirective(Token ModuleTok) { DirToks.push_back(Tok); break; case tok::identifier: { - bool LeadingSpace = Tok.hasLeadingSpace(); - unsigned NumToksInDirective = DirToks.size(); - - // C++ [cpp.module]p3: Any preprocessing tokens after the module - // preprocessing token in the module directive are processed just as in - // normal text. - // - // P3034R1 Module Declarations Shouldn’t be Macros. - if (LexModuleNameContinue(Tok, UseLoc, DirToks, Path, - /*AllowMacroExpansion=*/false)) { - if (Tok.isNot(tok::eod)) - CheckEndOfDirective(ModuleTok.getIdentifierInfo()->getName(), - /*EnableMacros=*/false, &DirToks); - EnterModuleSuffixTokenStream(DirToks); + if (HandleModuleName(ModuleTok.getIdentifierInfo()->getName(), UseLoc, Tok, + Path, DirToks, /*IsPartition=*/false, + /*AllowMacroExpansion=*/false)) return; - } - - ModuleNameLoc *NameLoc = ModuleNameLoc::Create(*this, Path); - DirToks.resize(NumToksInDirective); - DirToks.emplace_back(); - DirToks.back().setKind(tok::annot_module_name); - DirToks.back().setAnnotationRange(NameLoc->getRange()); - DirToks.back().setAnnotationValue(static_cast<void *>(NameLoc)); - DirToks.back().setFlagValue(Token::LeadingSpace, LeadingSpace); - DirToks.push_back(Tok); // C++20 [cpp.module]p // The pp-tokens, if any, of a pp-module shall be of the form: // pp-module-name pp-module-partition[opt] pp-tokens[opt] if (Tok.is(tok::colon)) { - NumToksInDirective = DirToks.size(); LexUnexpandedToken(Tok); - LeadingSpace = Tok.hasLeadingSpace(); - if (LexModuleNameContinue(Tok, UseLoc, DirToks, Partition, - /*AllowMacroExpansion=*/false, - /*IsPartition=*/true)) { - if (Tok.isNot(tok::eod)) - CheckEndOfDirective(ModuleTok.getIdentifierInfo()->getName(), - /*EnableMacros=*/false, &DirToks); - EnterModuleSuffixTokenStream(DirToks); + if (HandleModuleName(ModuleTok.getIdentifierInfo()->getName(), UseLoc, + Tok, Partition, DirToks, /*IsPartition=*/true, + /*AllowMacroExpansion=*/false)) return; - } - - ModuleNameLoc *PartitionLoc = ModuleNameLoc::Create(*this, Partition); - DirToks.resize(NumToksInDirective); - DirToks.emplace_back(); - DirToks.back().setKind(tok::annot_module_name); - DirToks.back().setAnnotationRange(NameLoc->getRange()); - DirToks.back().setAnnotationValue(static_cast<void *>(PartitionLoc)); - DirToks.back().setFlagValue(Token::LeadingSpace, LeadingSpace); - DirToks.push_back(Tok); } // If the current token is a macro definition, put it back to token stream diff --git a/clang/lib/Lex/Preprocessor.cpp b/clang/lib/Lex/Preprocessor.cpp index a531f51408dae..44d4471015dd4 100644 --- a/clang/lib/Lex/Preprocessor.cpp +++ b/clang/lib/Lex/Preprocessor.cpp @@ -1205,8 +1205,8 @@ ModuleNameLoc *ModuleNameLoc::Create(Preprocessor &PP, ModuleIdPath Path) { bool Preprocessor::LexModuleNameContinue(Token &Tok, SourceLocation UseLoc, SmallVectorImpl<Token> &Suffix, SmallVectorImpl<IdentifierLoc> &Path, - bool AllowMacroExpansion, - bool IsPartition) { + bool IsPartition, + bool AllowMacroExpansion) { auto ConsumeToken = [&]() { if (AllowMacroExpansion) Lex(Tok); @@ -1250,6 +1250,36 @@ bool Preprocessor::LexModuleNameContinue(Token &Tok, SourceLocation UseLoc, } } +bool Preprocessor::HandleModuleName(StringRef DirType, SourceLocation UseLoc, + Token &Tok, + SmallVectorImpl<IdentifierLoc> &Path, + SmallVectorImpl<Token> &DirToks, + bool IsPartition, + bool AllowMacroExpansion) { + bool LeadingSpace = Tok.hasLeadingSpace(); + unsigned NumToksInDirective = DirToks.size(); + if (LexModuleNameContinue(Tok, UseLoc, DirToks, Path, IsPartition, + AllowMacroExpansion)) { + if (Tok.isNot(tok::eod)) + CheckEndOfDirective(DirType, + /*EnableMacros=*/false, &DirToks); + EnterModuleSuffixTokenStream(DirToks); + return true; + } + + // Clean the module-name tokens and replace these tokens with + // annot_module_name. + DirToks.resize(NumToksInDirective); + ModuleNameLoc *NameLoc = ModuleNameLoc::Create(*this, Path); + DirToks.emplace_back(); + DirToks.back().setKind(tok::annot_module_name); + DirToks.back().setAnnotationRange(NameLoc->getRange()); + DirToks.back().setAnnotationValue(static_cast<void *>(NameLoc)); + DirToks.back().setFlagValue(Token::LeadingSpace, LeadingSpace); + DirToks.push_back(Tok); + return false; +} + /// [cpp.pre]/p2: /// A preprocessing directive consists of a sequence of preprocessing tokens /// that satisfies the following constraints: At the start of translation phase `````````` </details> https://github.com/llvm/llvm-project/pull/184014 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
