Lines Matching +full:expand +full:- +full:brackets
1 //===--- MacroExpansion.cpp - Top level Macro Expansion -------------------===//
8 //===----------------------------------------------------------------------===//
13 //===----------------------------------------------------------------------===//
28 #include "llvm/Config/llvm-config.h"
38 if (!II->hadMacroDefinition()) in getLocalMacroDirectiveHistory()
40 auto Pos = CurSubmoduleState->Macros.find(II); in getLocalMacroDirectiveHistory()
41 return Pos == CurSubmoduleState->Macros.end() ? nullptr in getLocalMacroDirectiveHistory()
42 : Pos->second.getLatest(); in getLocalMacroDirectiveHistory()
46 assert(MD && "MacroDirective should be non-zero!"); in appendMacroDirective()
47 assert(!MD->getPrevious() && "Already attached to a MacroDirective history."); in appendMacroDirective()
49 MacroState &StoredMD = CurSubmoduleState->Macros[II]; in appendMacroDirective()
51 MD->setPrevious(OldMD); in appendMacroDirective()
63 II->setHasMacroDefinition(true); in appendMacroDirective()
64 if (!MD->isDefined() && LeafModuleMacros.find(II) == LeafModuleMacros.end()) in appendMacroDirective()
65 II->setHasMacroDefinition(false); in appendMacroDirective()
66 if (II->isFromAST()) in appendMacroDirective()
67 II->setChangedSinceDeserialization(); in appendMacroDirective()
73 MacroState &StoredMD = CurSubmoduleState->Macros[II]; in setLoadedMacroDirective()
78 II->setHasMacroDefinition(true); in setLoadedMacroDirective()
79 if (!MD->isDefined() && LeafModuleMacros.find(II) == LeafModuleMacros.end()) in setLoadedMacroDirective()
80 II->setHasMacroDefinition(false); in setLoadedMacroDirective()
102 HidAny |= (O->NumOverriddenBy == 0); in addModuleMacro()
103 ++O->NumOverriddenBy; in addModuleMacro()
111 return MM->NumOverriddenBy != 0; in addModuleMacro()
119 II->setHasMacroDefinition(true); in addModuleMacro()
136 CurSubmoduleState->VisibleModules.getGeneration() && in updateModuleMacroInfo()
139 CurSubmoduleState->VisibleModules.getGeneration(); in updateModuleMacroInfo()
152 NumHiddenOverrides[O] = -1; in updateModuleMacroInfo()
156 for (auto *LeafMM : Leaf->second) { in updateModuleMacroInfo()
157 assert(LeafMM->getNumOverridingMacros() == 0 && "leaf macro overridden"); in updateModuleMacroInfo()
163 if (CurSubmoduleState->VisibleModules.isVisible(MM->getOwningModule())) { in updateModuleMacroInfo()
166 if (MM->getMacroInfo()) in updateModuleMacroInfo()
169 for (auto *O : MM->overrides()) in updateModuleMacroInfo()
170 if ((unsigned)++NumHiddenOverrides[O] == O->getNumOverridingMacros()) in updateModuleMacroInfo()
183 MD = MD->getPrevious(); in updateModuleMacroInfo()
185 MI = DMD->getInfo(); in updateModuleMacroInfo()
186 IsSystemMacro &= SourceMgr.isInSystemHeader(DMD->getLocation()); in updateModuleMacroInfo()
190 auto *NewMI = Active->getMacroInfo(); in updateModuleMacroInfo()
199 // FIXME: Remove the defined-in-system-headers check. clang's limits.h in updateModuleMacroInfo()
202 !MI->isIdenticalTo(*NewMI, *this, /*Syntactically=*/true)) in updateModuleMacroInfo()
204 IsSystemMacro &= Active->getOwningModule()->IsSystem || in updateModuleMacroInfo()
205 SourceMgr.isInSystemHeader(NewMI->getDefinitionLoc()); in updateModuleMacroInfo()
215 Leaf = LeafIt->second; in dumpMacroInfo()
217 auto Pos = CurSubmoduleState->Macros.find(II); in dumpMacroInfo()
218 if (Pos != CurSubmoduleState->Macros.end()) in dumpMacroInfo()
219 State = &Pos->second; in dumpMacroInfo()
221 llvm::errs() << "MacroState " << State << " " << II->getNameStart(); in dumpMacroInfo()
222 if (State && State->isAmbiguous(*this, II)) in dumpMacroInfo()
224 if (State && !State->getOverriddenMacros().empty()) { in dumpMacroInfo()
226 for (auto *O : State->getOverriddenMacros()) in dumpMacroInfo()
227 llvm::errs() << " " << O->getOwningModule()->getFullModuleName(); in dumpMacroInfo()
232 for (auto *MD = State ? State->getLatest() : nullptr; MD; in dumpMacroInfo()
233 MD = MD->getPrevious()) { in dumpMacroInfo()
235 MD->dump(); in dumpMacroInfo()
240 for (auto *MM : State ? State->getActiveModuleMacros(*this, II) : None) in dumpMacroInfo()
247 << MM->getOwningModule()->getFullModuleName(); in dumpMacroInfo()
248 if (!MM->getMacroInfo()) in dumpMacroInfo()
253 else if (!CurSubmoduleState->VisibleModules.isVisible( in dumpMacroInfo()
254 MM->getOwningModule())) in dumpMacroInfo()
256 else if (MM->getMacroInfo()) in dumpMacroInfo()
259 if (!MM->overrides().empty()) { in dumpMacroInfo()
261 for (auto *O : MM->overrides()) { in dumpMacroInfo()
262 llvm::errs() << " " << O->getOwningModule()->getFullModuleName(); in dumpMacroInfo()
268 if (auto *MI = MM->getMacroInfo()) { in dumpMacroInfo()
270 MI->dump(); in dumpMacroInfo()
276 /// RegisterBuiltinMacro - Register the specified identifier in the identifier
284 MI->setIsBuiltinMacro(); in RegisterBuiltinMacro()
290 /// RegisterBuiltinMacros - Register builtin macros, such as __LINE__ with the
340 /// isTrivialSingleTokenExpansion - Return true if MI, which has a single token
345 IdentifierInfo *II = MI->getReplacementToken(0).getIdentifierInfo(); in isTrivialSingleTokenExpansion()
352 if (II->isOutOfDate()) in isTrivialSingleTokenExpansion()
353 PP.getExternalSource()->updateOutOfDateIdentifier(*II); in isTrivialSingleTokenExpansion()
358 if (ExpansionMI->isEnabled() && in isTrivialSingleTokenExpansion()
363 // If this is an object-like macro invocation, it is safe to trivially expand in isTrivialSingleTokenExpansion()
365 if (MI->isObjectLike()) return true; in isTrivialSingleTokenExpansion()
367 // If this is a function-like macro invocation, it's safe to trivially expand in isTrivialSingleTokenExpansion()
369 return std::find(MI->arg_begin(), MI->arg_end(), II) == MI->arg_end(); in isTrivialSingleTokenExpansion()
374 /// isNextPPTokenLParen - Determine whether the next preprocessor token to be
376 /// method should have no observable side-effect on the lexed tokens.
381 Val = CurLexer->isNextPPTokenLParen(); in isNextPPTokenLParen()
383 Val = CurPTHLexer->isNextPPTokenLParen(); in isNextPPTokenLParen()
385 Val = CurTokenLexer->isNextTokenLParen(); in isNextPPTokenLParen()
393 for (unsigned i = IncludeMacroStack.size(); i != 0; --i) { in isNextPPTokenLParen()
394 IncludeStackInfo &Entry = IncludeMacroStack[i-1]; in isNextPPTokenLParen()
396 Val = Entry.TheLexer->isNextPPTokenLParen(); in isNextPPTokenLParen()
398 Val = Entry.ThePTHLexer->isNextPPTokenLParen(); in isNextPPTokenLParen()
400 Val = Entry.TheTokenLexer->isNextTokenLParen(); in isNextPPTokenLParen()
417 /// HandleMacroExpandedIdentifier - If an identifier token is read that is to be
424 // then the macro could expand to different things in other contexts, we need in HandleMacroExpandedIdentifier()
426 if (CurPPLexer) CurPPLexer->MIOpt.ExpandedMacro(); in HandleMacroExpandedIdentifier()
429 if (MI->isBuiltinMacro()) { in HandleMacroExpandedIdentifier()
431 Callbacks->MacroExpands(Identifier, M, Identifier.getLocation(), in HandleMacroExpandedIdentifier()
437 /// Args - If this is a function-like macro expansion, this contains, in HandleMacroExpandedIdentifier()
442 // Remember where the end of the expansion occurred. For an object-like in HandleMacroExpandedIdentifier()
443 // macro, this is the identifier. For a function-like macro, this is the ')'. in HandleMacroExpandedIdentifier()
446 // If this is a function-like macro, read the arguments. in HandleMacroExpandedIdentifier()
447 if (MI->isFunctionLike()) { in HandleMacroExpandedIdentifier()
481 Callbacks->MacroExpands(Identifier, M, ExpansionRange, Args); in HandleMacroExpandedIdentifier()
486 Callbacks->MacroExpands(Info.Tok, Info.MD, Info.Range, in HandleMacroExpandedIdentifier()
498 Diag(MI->getDefinitionLoc(), diag::note_pp_ambiguous_macro_chosen) in HandleMacroExpandedIdentifier()
502 Diag(OtherMI->getDefinitionLoc(), diag::note_pp_ambiguous_macro_other) in HandleMacroExpandedIdentifier()
511 if (MI->getNumTokens() == 0) { in HandleMacroExpandedIdentifier()
513 if (Args) Args->destroy(*this); in HandleMacroExpandedIdentifier()
521 } else if (MI->getNumTokens() == 1 && in HandleMacroExpandedIdentifier()
524 // Otherwise, if this macro expands into a single trivially-expanded in HandleMacroExpandedIdentifier()
525 // token: expand it now. This handles common cases like in HandleMacroExpandedIdentifier()
529 if (Args) Args->destroy(*this); in HandleMacroExpandedIdentifier()
537 Identifier = MI->getReplacementToken(0); in HandleMacroExpandedIdentifier()
554 if (!NewMI->isEnabled() || NewMI == MI) { in HandleMacroExpandedIdentifier()
558 if (NewMI != MI || MI->isFunctionLike()) in HandleMacroExpandedIdentifier()
579 /// CheckMatchedBrackets - Returns true if the braces and parentheses in the
582 SmallVector<Bracket, 8> Brackets; in CheckMatchedBrackets() local
586 if (I->is(tok::l_paren)) { in CheckMatchedBrackets()
587 Brackets.push_back(Paren); in CheckMatchedBrackets()
588 } else if (I->is(tok::r_paren)) { in CheckMatchedBrackets()
589 if (Brackets.empty() || Brackets.back() == Brace) in CheckMatchedBrackets()
591 Brackets.pop_back(); in CheckMatchedBrackets()
592 } else if (I->is(tok::l_brace)) { in CheckMatchedBrackets()
593 Brackets.push_back(Brace); in CheckMatchedBrackets()
594 } else if (I->is(tok::r_brace)) { in CheckMatchedBrackets()
595 if (Brackets.empty() || Brackets.back() == Paren) in CheckMatchedBrackets()
597 Brackets.pop_back(); in CheckMatchedBrackets()
600 return Brackets.empty(); in CheckMatchedBrackets()
603 /// GenerateNewArgTokens - Returns true if OldTokens can be converted to a new
619 // Once it is known that the brackets are matched, only a simple count of the in GenerateNewArgTokens()
638 if (I->is(tok::l_brace)) { in GenerateNewArgTokens()
640 } else if (I->is(tok::r_brace)) { in GenerateNewArgTokens()
641 --Braces; in GenerateNewArgTokens()
644 } else if (I->is(tok::eof)) { in GenerateNewArgTokens()
650 I->setKind(tok::comma); in GenerateNewArgTokens()
651 I->setLength(1); in GenerateNewArgTokens()
658 if (FoundSeparatorToken && ArgStartIterator->is(tok::l_brace)) { in GenerateNewArgTokens()
660 SourceRange(ArgStartIterator->getLocation(), in GenerateNewArgTokens()
661 PP.getLocForEndOfToken(ClosingBrace->getLocation()))); in GenerateNewArgTokens()
669 TempToken.setLocation(ArgStartIterator->getLocation()); in GenerateNewArgTokens()
679 SourceLocation Loc = PP.getLocForEndOfToken((I - 1)->getLocation()); in GenerateNewArgTokens()
685 ParenHints.push_back(SourceRange(ArgStartIterator->getLocation(), in GenerateNewArgTokens()
702 /// ReadFunctionLikeMacroArgs - After reading "MACRO" and knowing that the next
710 unsigned NumFixedArgsLeft = MI->getNumArgs(); in ReadFunctionLikeMacroArgs()
711 bool isVariadic = MI->isVariadic(); in ReadFunctionLikeMacroArgs()
717 // an argument value in a macro could expand to ',' or '(' or ')'. in ReadFunctionLikeMacroArgs()
719 assert(Tok.is(tok::l_paren) && "Error computing l-paren-ness?"); in ReadFunctionLikeMacroArgs()
721 // ArgTokens - Build up a list of tokens that make up each argument. Each in ReadFunctionLikeMacroArgs()
747 // an argument value in a macro could expand to ',' or '(' or ')'. in ReadFunctionLikeMacroArgs()
753 Diag(MI->getDefinitionLoc(), diag::note_macro_here) in ReadFunctionLikeMacroArgs()
766 if (NumParens-- == 0) { in ReadFunctionLikeMacroArgs()
778 // In Microsoft-compatibility mode, single commas from nested macro in ReadFunctionLikeMacroArgs()
790 // -C mode (not -CC mode), discard the comment. in ReadFunctionLikeMacroArgs()
800 if (!MI->isEnabled()) in ReadFunctionLikeMacroArgs()
805 CodeComplete->CodeCompleteMacroArgument(MacroName.getIdentifierInfo(), in ReadFunctionLikeMacroArgs()
807 // Don't mark that we reached the code-completion point because the in ReadFunctionLikeMacroArgs()
809 // code-completion callback. in ReadFunctionLikeMacroArgs()
845 --NumFixedArgsLeft; in ReadFunctionLikeMacroArgs()
850 unsigned MinArgsExpected = MI->getNumArgs(); in ReadFunctionLikeMacroArgs()
859 Diag(MI->getDefinitionLoc(), diag::note_macro_here) in ReadFunctionLikeMacroArgs()
864 // TODO: See if this can be generalized to angle brackets for templates in ReadFunctionLikeMacroArgs()
897 // Recover from not-fully-formed macro invocation during code-completion. in ReadFunctionLikeMacroArgs()
910 // #define A(X) or #define A(...) ---> A() in ReadFunctionLikeMacroArgs()
915 isVarargsElided = MI->isVariadic(); in ReadFunctionLikeMacroArgs()
916 } else if ((FoundElidedComma || MI->isVariadic()) && in ReadFunctionLikeMacroArgs()
917 (NumActuals+1 == MinArgsExpected || // A(x, ...) -> A(X) in ReadFunctionLikeMacroArgs()
918 (NumActuals == 0 && MinArgsExpected == 2))) {// A(x,...) -> A() in ReadFunctionLikeMacroArgs()
925 if (!MI->hasCommaPasting()) { in ReadFunctionLikeMacroArgs()
927 Diag(MI->getDefinitionLoc(), diag::note_macro_here) in ReadFunctionLikeMacroArgs()
941 Diag(MI->getDefinitionLoc(), diag::note_macro_here) in ReadFunctionLikeMacroArgs()
958 } else if (NumActuals > MinArgsExpected && !MI->isVariadic() && in ReadFunctionLikeMacroArgs()
963 Diag(MI->getDefinitionLoc(), diag::note_macro_here) in ReadFunctionLikeMacroArgs()
984 MacroExpandedTokens.capacity()-MacroExpandedTokens.size(); in cacheMacroExpandedTokens()
994 prevLexer->Tokens = MacroExpandedTokens.data() + tokIndex; in cacheMacroExpandedTokens()
1011 /// ComputeDATE_TIME - Compute the current time, enter it into the specified
1026 TmpStream << llvm::format("\"%s %2d %4d\"", Months[TM->tm_mon], in ComputeDATE_TIME()
1027 TM->tm_mday, TM->tm_year + 1900); in ComputeDATE_TIME()
1038 TM->tm_hour, TM->tm_min, TM->tm_sec); in ComputeDATE_TIME()
1047 /// HasFeature - Return true if we recognize and implement the feature
1054 Feature = Feature.substr(2, Feature.size() - 4); in HasFeature()
1098 // Objective-C features in HasFeature()
1225 /// HasExtension - Return true if we recognize and implement the feature
1243 Extension = Extension.substr(2, Extension.size() - 4); in HasExtension()
1274 /// EvaluateHasIncludeCommon - Process a '__has_include("path")'
1287 PP.Diag(LParenLoc, diag::err_pp_directive_required) << II->getName(); in EvaluateHasIncludeCommon()
1313 PP.getCurrentLexer()->LexIncludeFilename(Tok); in EvaluateHasIncludeCommon()
1385 /// EvaluateHasInclude - Process a '__has_include("path")' expression.
1392 /// EvaluateHasIncludeNext - Process '__has_include_next("path")' expression.
1410 LookupFromFile = PP.getCurrentLexer()->getFileEntry(); in EvaluateHasIncludeNext()
1422 /// \brief Process single-argument builtin feature-like macros that return
1481 if (--ParenDepth > 0) in EvaluateFeatureLikeBuiltinMacro()
1538 /// ExpandBuiltinMacro - If an identifier token is read that is to be expanded
1545 // If this is an _Pragma or Microsoft __pragma directive, expand it, in ExpandBuiltinMacro()
1549 else if (II == Ident__pragma) // in non-MS mode this is null in ExpandBuiltinMacro()
1572 // a macro expansion. This doesn't matter for object-like macros, but in ExpandBuiltinMacro()
1573 // can matter for a function-like macro that expands to contain __LINE__. in ExpandBuiltinMacro()
1600 // Escape this filename. Turn '\' -> '\\' '"' -> '\"' in ExpandBuiltinMacro()
1654 CurFile = SourceMgr.getFileEntryForID(TheLexer->getFileID()); in ExpandBuiltinMacro()
1658 time_t TT = CurFile->getModificationTime(); in ExpandBuiltinMacro()
1673 [this](Token &Tok, bool &HasLexedNextToken) -> int { in ExpandBuiltinMacro()
1676 return II && HasFeature(*this, II->getName()); in ExpandBuiltinMacro()
1680 [this](Token &Tok, bool &HasLexedNextToken) -> int { in ExpandBuiltinMacro()
1683 return II && HasExtension(*this, II->getName()); in ExpandBuiltinMacro()
1687 [this](Token &Tok, bool &HasLexedNextToken) -> int { in ExpandBuiltinMacro()
1692 else if (II->getBuiltinID() != 0) in ExpandBuiltinMacro()
1696 return llvm::StringSwitch<bool>(II->getName()) in ExpandBuiltinMacro()
1704 [](Token &Tok, bool &HasLexedNextToken) -> int { in ExpandBuiltinMacro()
1709 [this](Token &Tok, bool &HasLexedNextToken) -> int { in ExpandBuiltinMacro()
1717 [this](Token &Tok, bool &HasLexedNextToken) -> int { in ExpandBuiltinMacro()
1725 [this](Token &Tok, bool &HasLexedNextToken) -> int { in ExpandBuiltinMacro()
1750 // file name string literal using angle brackets (<>) or in ExpandBuiltinMacro()
1751 // double-quotes (""). in ExpandBuiltinMacro()
1765 [this](Token &Tok, bool &HasLexedNextToken) -> int { in ExpandBuiltinMacro()
1774 // FIXME: Should we accept "-R..." flags here, or should that be in ExpandBuiltinMacro()
1776 if (WarningName.size() < 3 || WarningName[0] != '-' || in ExpandBuiltinMacro()
1787 return !getDiagnostics().getDiagnosticIDs()-> in ExpandBuiltinMacro()
1796 [this](Token &Tok, bool &HasLexedNextToken) -> int { in ExpandBuiltinMacro()
1800 (II->getName() == getLangOpts().CurrentModule); in ExpandBuiltinMacro()
1807 Tok.setKind(ModuleII->getTokenID()); in ExpandBuiltinMacro()
1854 // remove its SourceLocation from the warn-for-unused-macro locations. in markMacroAsUsed()
1855 if (MI->isWarnIfUnused() && !MI->isUsed()) in markMacroAsUsed()
1856 WarnUnusedMacroLocs.erase(MI->getDefinitionLoc()); in markMacroAsUsed()
1857 MI->setIsUsed(true); in markMacroAsUsed()