Lines Matching +full:msi +full:- +full:specifier
1 //===- Decl.cpp - Declaration AST Node Implementation ---------------------===//
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
11 //===----------------------------------------------------------------------===//
78 return D->getASTContext().getPrimaryMergedDecl(D); in getPrimaryMergedDecl()
82 SourceLocation Loc = this->Loc; in print()
83 if (!Loc.isValid() && TheDecl) Loc = TheDecl->getLocation(); in print()
92 ND->getNameForDiagnostic(OS, Context.getPrintingPolicy(), true); in print()
101 return !getLexicalDeclContext()->Equals(getDeclContext()); in isOutOfLine()
108 //===----------------------------------------------------------------------===//
110 //===----------------------------------------------------------------------===//
135 // 5. When computing the visibility of a non-type, including a
136 // non-type member of a class, only non-type visibility restrictions
137 // are considered: the 'visibility' attribute, global value-visibility
142 // the 'type_visibility' attribute and global type-visibility settings.
176 return D->getExplicitVisibility(kind.getExplicitVisibilityKind()); in getExplicitVisibility()
193 D->getMemberSpecializationInfo()) { in isExplicitMemberSpecialization()
194 return member->isExplicitSpecialization(); in isExplicitMemberSpecialization()
203 return D->isMemberSpecialization(); in isExplicitMemberSpecialization()
210 switch (attr->getVisibility()) { in getVisibilityFromAttr()
227 if (const auto *A = D->getAttr<TypeVisibilityAttr>()) { in getVisibilityOf()
233 if (const auto *A = D->getAttr<VisibilityAttr>()) { in getVisibilityOf()
259 // Non-type template parameters can be restricted by the value type, e.g. in getLVForTemplateParameterList()
264 // Handle the non-pack case first. in getLVForTemplateParameterList()
265 if (!NTTP->isExpandedParameterPack()) { in getLVForTemplateParameterList()
266 if (!NTTP->getType()->isDependentType()) { in getLVForTemplateParameterList()
267 LV.merge(getLVForType(*NTTP->getType(), computation)); in getLVForTemplateParameterList()
273 for (unsigned i = 0, n = NTTP->getNumExpansionTypes(); i != n; ++i) { in getLVForTemplateParameterList()
274 QualType type = NTTP->getExpansionType(i); in getLVForTemplateParameterList()
275 if (!type->isDependentType()) in getLVForTemplateParameterList()
285 // Handle the non-pack case first. in getLVForTemplateParameterList()
286 if (!TTP->isExpandedParameterPack()) { in getLVForTemplateParameterList()
287 LV.merge(getLVForTemplateParameterList(TTP->getTemplateParameters(), in getLVForTemplateParameterList()
293 for (unsigned i = 0, n = TTP->getNumExpansionTemplateParameters(); in getLVForTemplateParameterList()
296 TTP->getExpansionTemplateParameters(i), computation)); in getLVForTemplateParameterList()
305 const DeclContext *DC = D->getDeclContext(); in getOutermostFuncOrBlockContext()
306 while (DC->getDeclKind() != Decl::TranslationUnit) { in getOutermostFuncOrBlockContext()
309 DC = DC->getParent(); in getOutermostFuncOrBlockContext()
379 if (!specInfo->isExplicitInstantiationOrSpecialization()) in shouldConsiderTemplateVisibility()
382 return !fn->hasAttr<VisibilityAttr>(); in shouldConsiderTemplateVisibility()
385 /// Merge in template-related linkage and visibility for the given
399 FunctionTemplateDecl *temp = specInfo->getTemplate(); in mergeTemplateLV()
408 getLVForTemplateParameterList(temp->getTemplateParameters(), computation); in mergeTemplateLV()
412 const TemplateArgumentList &templateArgs = *specInfo->TemplateArguments; in mergeTemplateLV()
424 return (computation.isTypeVisibility() && D->hasAttr<TypeVisibilityAttr>()) || in hasDirectVisibilityAttribute()
425 D->hasAttr<VisibilityAttr>(); in hasDirectVisibilityAttribute()
444 // An explicit class specialization is an independent, top-level in shouldConsiderTemplateVisibility()
451 // specialization, we always want to consider template-related in shouldConsiderTemplateVisibility()
453 if (!spec->isExplicitInstantiationOrSpecialization()) in shouldConsiderTemplateVisibility()
457 if (spec->isExplicitSpecialization() && in shouldConsiderTemplateVisibility()
464 /// Merge in template-related linkage and visibility for the given
473 ClassTemplateDecl *temp = spec->getSpecializedTemplate(); in mergeTemplateLV()
481 getLVForTemplateParameterList(temp->getTemplateParameters(), computation); in mergeTemplateLV()
486 // template-argument visibility if we've got an explicit in mergeTemplateLV()
488 const TemplateArgumentList &templateArgs = spec->getTemplateArgs(); in mergeTemplateLV()
506 if (!spec->isExplicitInstantiationOrSpecialization()) in shouldConsiderTemplateVisibility()
509 // An explicit variable specialization is an independent, top-level in shouldConsiderTemplateVisibility()
513 if (spec->isExplicitSpecialization() && in shouldConsiderTemplateVisibility()
520 /// Merge in template-related linkage and visibility for the given
530 VarTemplateDecl *temp = spec->getSpecializedTemplate(); in mergeTemplateLV()
532 getLVForTemplateParameterList(temp->getTemplateParameters(), computation); in mergeTemplateLV()
537 // template-argument visibility if we've got an explicit in mergeTemplateLV()
539 const TemplateArgumentList &templateArgs = spec->getTemplateArgs(); in mergeTemplateLV()
547 // FIXME: we should warn if -fvisibility-inlines-hidden is used with c. in useInlineVisibilityHidden()
548 const LangOptions &Opts = D->getASTContext().getLangOpts(); in useInlineVisibilityHidden()
558 = FD->getTemplateSpecializationInfo()) { in useInlineVisibilityHidden()
559 TSK = spec->getTemplateSpecializationKind(); in useInlineVisibilityHidden()
560 } else if (MemberSpecializationInfo *MSI = in useInlineVisibilityHidden() local
561 FD->getMemberSpecializationInfo()) { in useInlineVisibilityHidden()
562 TSK = MSI->getTemplateSpecializationKind(); in useInlineVisibilityHidden()
571 FD->hasBody(Def) && Def->isInlined() && !Def->hasAttr<GNUInlineAttr>(); in useInlineVisibilityHidden()
575 const T *First = D->getFirstDecl(); in isFirstInExternCContext()
576 return First->isInExternCContext(); in isFirstInExternCContext()
581 if (!SD->hasBraces()) in isSingleLineLanguageLinkage()
587 if (auto *M = D->getOwningModule()) in isDeclaredInModuleInterfaceOrPartition()
588 return M->isInterfaceOrPartition(); in isDeclaredInModuleInterfaceOrPartition()
598 D = TD->getTemplatedDecl(); in getStorageClass()
601 return VD->getStorageClass(); in getStorageClass()
603 return FD->getStorageClass(); in getStorageClass()
612 assert(D->getDeclContext()->getRedeclContext()->isFileContext() && in getLVForNamespaceScopeDecl()
614 ASTContext &Context = D->getASTContext(); in getLVForNamespaceScopeDecl()
621 if ((getStorageClass(D->getCanonicalDecl()) == SC_Static) || in getLVForNamespaceScopeDecl()
622 (Context.getLangOpts().C23 && Var && Var->isConstexpr())) { in getLVForNamespaceScopeDecl()
623 // - a variable, variable template, function, or function template in getLVForNamespaceScopeDecl()
629 // an object contains any of the storage-class specifiers static or in getLVForNamespaceScopeDecl()
635 // - a non-template variable of non-volatile const-qualified type, unless in getLVForNamespaceScopeDecl()
636 // - it is explicitly declared extern, or in getLVForNamespaceScopeDecl()
637 // - it is declared in the purview of a module interface unit in getLVForNamespaceScopeDecl()
638 // (outside the private-module-fragment, if any) or module partition, or in getLVForNamespaceScopeDecl()
639 // - it is inline, or in getLVForNamespaceScopeDecl()
640 // - it was previously declared and the prior declaration did not have in getLVForNamespaceScopeDecl()
643 if (Context.getLangOpts().CPlusPlus && Var->getType().isConstQualified() && in getLVForNamespaceScopeDecl()
644 !Var->getType().isVolatileQualified() && !Var->isInline() && in getLVForNamespaceScopeDecl()
647 !Var->getDescribedVarTemplate()) { in getLVForNamespaceScopeDecl()
648 const VarDecl *PrevVar = Var->getPreviousDecl(); in getLVForNamespaceScopeDecl()
652 if (Var->getStorageClass() != SC_Extern && in getLVForNamespaceScopeDecl()
653 Var->getStorageClass() != SC_PrivateExtern && in getLVForNamespaceScopeDecl()
658 for (const VarDecl *PrevVar = Var->getPreviousDecl(); PrevVar; in getLVForNamespaceScopeDecl()
659 PrevVar = PrevVar->getPreviousDecl()) { in getLVForNamespaceScopeDecl()
660 if (PrevVar->getStorageClass() == SC_PrivateExtern && in getLVForNamespaceScopeDecl()
661 Var->getStorageClass() == SC_None) in getLVForNamespaceScopeDecl()
664 if (PrevVar->getStorageClass() == SC_Static) in getLVForNamespaceScopeDecl()
668 // - a data member of an anonymous union. in getLVForNamespaceScopeDecl()
669 const VarDecl *VD = IFD->getVarDecl(); in getLVForNamespaceScopeDecl()
677 if (D->isInAnonymousNamespace()) { in getLVForNamespaceScopeDecl()
681 // wording, but we retain it from the pre-DR1113 model to avoid breaking in getLVForNamespaceScopeDecl()
696 // scope and no storage-class specifier, its linkage is in getLVForNamespaceScopeDecl()
706 for (const DeclContext *DC = D->getDeclContext(); in getLVForNamespaceScopeDecl()
708 DC = DC->getParent()) { in getLVForNamespaceScopeDecl()
729 // -finline-visibility-hidden if this is an inline method. in getLVForNamespaceScopeDecl()
741 // - if the enclosing namespace has internal linkage, the name has in getLVForNamespaceScopeDecl()
743 // - otherwise, if the declaration of the name is attached to a named in getLVForNamespaceScopeDecl()
745 // - otherwise, the name has external linkage. in getLVForNamespaceScopeDecl()
750 // - a variable; or in getLVForNamespaceScopeDecl()
759 // - the entity has C language linkage, or in getLVForNamespaceScopeDecl()
760 // - the entity is declared within an unnamed namespace, or in getLVForNamespaceScopeDecl()
761 // - the entity is not used or is defined in the same in getLVForNamespaceScopeDecl()
771 // Note that we don't want to make the variable non-external in getLVForNamespaceScopeDecl()
772 // because of this, but unique-external linkage suits us. in getLVForNamespaceScopeDecl()
776 LinkageInfo TypeLV = getLVForType(*Var->getType(), computation); in getLVForNamespaceScopeDecl()
783 if (Var->getStorageClass() == SC_PrivateExtern) in getLVForNamespaceScopeDecl()
797 // - a function; or in getLVForNamespaceScopeDecl()
804 if (Function->getStorageClass() == SC_PrivateExtern) in getLVForNamespaceScopeDecl()
809 // functions as the host-callable kernel functions are emitted at codegen. in getLVForNamespaceScopeDecl()
822 // unique-external linkage, it's not legally usable from outside in getLVForNamespaceScopeDecl()
826 // Only look at the type-as-written. Otherwise, deducing the return type in getLVForNamespaceScopeDecl()
828 QualType TypeAsWritten = Function->getType(); in getLVForNamespaceScopeDecl()
829 if (TypeSourceInfo *TSI = Function->getTypeSourceInfo()) in getLVForNamespaceScopeDecl()
830 TypeAsWritten = TSI->getType(); in getLVForNamespaceScopeDecl()
831 if (!isExternallyVisible(TypeAsWritten->getLinkage())) in getLVForNamespaceScopeDecl()
839 = Function->getTemplateSpecializationInfo()) { in getLVForNamespaceScopeDecl()
843 // - a named class (Clause 9), or an unnamed class defined in a in getLVForNamespaceScopeDecl()
846 // - a named enumeration (7.2), or an unnamed enumeration in getLVForNamespaceScopeDecl()
851 if (!Tag->hasNameForLinkage()) in getLVForNamespaceScopeDecl()
862 // - an enumerator belonging to an enumeration with external linkage; or in getLVForNamespaceScopeDecl()
864 LinkageInfo EnumLV = getLVForDecl(cast<NamedDecl>(D->getDeclContext()), in getLVForNamespaceScopeDecl()
870 // - a template in getLVForNamespaceScopeDecl()
874 getLVForTemplateParameterList(temp->getTemplateParameters(), computation); in getLVForNamespaceScopeDecl()
885 // By extension, we assign external linkage to Objective-C in getLVForNamespaceScopeDecl()
893 if (!TD->getAnonDeclWithTypedefName(/*AnyRedecl*/true)) in getLVForNamespaceScopeDecl()
905 // If we ended up with non-externally-visible linkage, visibility should in getLVForNamespaceScopeDecl()
919 // purposes of calculating linkage of pointer-to-data-member in getLVForClassMember()
942 // -finline-visibility-hidden if this is an inline method. in getLVForClassMember()
958 getLVForDecl(cast<RecordDecl>(D->getDeclContext()), classComputation); in getLVForClassMember()
973 // Only look at the type-as-written. Otherwise, deducing the return type in getLVForClassMember()
975 QualType TypeAsWritten = MD->getType(); in getLVForClassMember()
976 if (TypeSourceInfo *TSI = MD->getTypeSourceInfo()) in getLVForClassMember()
977 TypeAsWritten = TSI->getType(); in getLVForClassMember()
978 if (!isExternallyVisible(TypeAsWritten->getLinkage())) in getLVForClassMember()
984 = MD->getTemplateSpecializationInfo()) { in getLVForClassMember()
986 if (spec->isExplicitSpecialization()) { in getLVForClassMember()
988 } else if (isExplicitMemberSpecialization(spec->getTemplate())) { in getLVForClassMember()
989 explicitSpecSuppressor = spec->getTemplate()->getTemplatedDecl(); in getLVForClassMember()
997 // functions as the host-callable kernel functions are emitted at codegen. in getLVForClassMember()
998 ASTContext &Context = D->getASTContext(); in getLVForClassMember()
1009 if (spec->isExplicitSpecialization()) { in getLVForClassMember()
1012 const ClassTemplateDecl *temp = spec->getSpecializedTemplate(); in getLVForClassMember()
1014 explicitSpecSuppressor = temp->getTemplatedDecl(); in getLVForClassMember()
1029 LinkageInfo typeLV = getLVForType(*VD->getType(), computation); in getLVForClassMember()
1048 getLVForTemplateParameterList(temp->getTemplateParameters(), computation); in getLVForClassMember()
1053 explicitSpecSuppressor = temp->getTemplatedDecl(); in getLVForClassMember()
1091 // A declaration is name-independent if its name is _ and it declares in isPlaceholderVar()
1092 // - a variable with automatic storage duration, in isPlaceholderVar()
1093 // - a structured binding not inhabiting a namespace scope, in isPlaceholderVar()
1094 // - the variable introduced by an init-capture in isPlaceholderVar()
1095 // - or a non-static data member. in isPlaceholderVar()
1098 !getIdentifier()->isPlaceholder()) in isPlaceholderVar()
1103 if (!getDeclContext()->isFunctionOrMethod() && in isPlaceholderVar()
1104 !getDeclContext()->isRecord()) in isPlaceholderVar()
1106 const VarDecl *VD = IFD->getVarDecl(); in isPlaceholderVar()
1107 return !VD || VD->getStorageDuration() == SD_Automatic; in isPlaceholderVar()
1113 if (VD->isInitCapture()) in isPlaceholderVar()
1115 return VD->getStorageDuration() == StorageDuration::SD_Automatic; in isPlaceholderVar()
1118 BD && getDeclContext()->isFunctionOrMethod()) { in isPlaceholderVar()
1119 const VarDecl *VD = BD->getHoldingVar(); in isPlaceholderVar()
1120 return !VD || VD->getStorageDuration() == StorageDuration::SD_Automatic; in isPlaceholderVar()
1134 ReservedIdentifierStatus Status = II->isReserved(LangOpts); in isReserved()
1148 const DeclContext *DC = getDeclContext()->getRedeclContext(); in isReserved()
1149 if (DC->isTranslationUnit()) in isReserved()
1152 if (VD->isExternC()) in isReserved()
1155 if (FD->isExternC()) in isReserved()
1186 switch (D->getModuleOwnershipKind()) { in isExportedFromModuleInterfaceUnit()
1193 return D->isInNamedModule(); in isExportedFromModuleInterfaceUnit()
1204 // - if the declaration of the name is attached to a named module and is not in getFormalLinkage()
1213 cast<NamedDecl>(this->getCanonicalDecl())) && in getFormalLinkage()
1228 assert(!IsMostRecent || ND == ND->getMostRecentDecl()); in getExplicitVisibilityAux()
1237 CXXRecordDecl *InstantiatedFrom = RD->getInstantiatedFromMemberClass(); in getExplicitVisibilityAux()
1248 const auto *TD = spec->getSpecializedTemplate()->getTemplatedDecl(); in getExplicitVisibilityAux()
1253 TD = TD->getPreviousDecl(); in getExplicitVisibilityAux()
1260 const NamedDecl *MostRecent = ND->getMostRecentDecl(); in getExplicitVisibilityAux()
1266 if (Var->isStaticDataMember()) { in getExplicitVisibilityAux()
1267 VarDecl *InstantiatedFrom = Var->getInstantiatedFromStaticDataMember(); in getExplicitVisibilityAux()
1273 return getVisibilityOf(VTSD->getSpecializedTemplate()->getTemplatedDecl(), in getExplicitVisibilityAux()
1283 = fn->getTemplateSpecializationInfo()) in getExplicitVisibilityAux()
1284 return getVisibilityOf(templateInfo->getTemplate()->getTemplatedDecl(), in getExplicitVisibilityAux()
1289 FunctionDecl *InstantiatedFrom = fn->getInstantiatedFromMemberFunction(); in getExplicitVisibilityAux()
1298 return getVisibilityOf(TD->getTemplatedDecl(), kind); in getExplicitVisibilityAux()
1317 dyn_cast<NamedDecl>(ContextDecl->getDeclContext()->getRedeclContext()); in getLVForClosure()
1321 Owner = dyn_cast<NamedDecl>(ContextDecl->getDeclContext()); in getLVForClosure()
1335 VD && VD->getType()->getContainedDeducedType() in getLVForClosure()
1350 if (Function->isInAnonymousNamespace() && in getLVForLocalDecl()
1355 if (Function->getCanonicalDecl()->getStorageClass() == SC_Static) in getLVForLocalDecl()
1373 if (Var->hasExternalStorage()) { in getLVForLocalDecl()
1374 if (Var->isInAnonymousNamespace() && !isFirstInExternCContext(Var)) in getLVForLocalDecl()
1378 if (Var->getStorageClass() == SC_PrivateExtern) in getLVForLocalDecl()
1386 if (const VarDecl *Prev = Var->getPreviousDecl()) { in getLVForLocalDecl()
1396 if (!Var->isStaticLocal()) in getLVForLocalDecl()
1400 ASTContext &Context = D->getASTContext(); in getLVForLocalDecl()
1405 if (!OuterD || OuterD->isInvalidDecl()) in getLVForLocalDecl()
1410 if (!BD->getBlockManglingNumber()) in getLVForLocalDecl()
1413 LV = getLVForClosure(BD->getDeclContext()->getRedeclContext(), in getLVForLocalDecl()
1414 BD->getBlockManglingContextDecl(), computation); in getLVForLocalDecl()
1417 if (!FD->isInlined() && in getLVForLocalDecl()
1418 !isTemplateInstantiation(FD->getTemplateSpecializationKind())) in getLVForLocalDecl()
1421 // If a function is hidden by -fvisibility-inlines-hidden option and in getLVForLocalDecl()
1428 assert(cast<VarDecl>(D)->isStaticLocal()); in getLVForLocalDecl()
1433 LV = getLVForDecl(MD->getParent(), computation); in getLVForLocalDecl()
1454 if (D->hasAttr<InternalLinkageAttr>()) in computeLVForDecl()
1457 // Objective-C: treat all Objective-C declarations as having external in computeLVForDecl()
1459 switch (D->getKind()) { in computeLVForDecl()
1481 if (D->getASTContext().getLangOpts().CPlusPlus) in computeLVForDecl()
1482 return getLVForDecl(cast<EnumDecl>(D->getDeclContext()), computation); in computeLVForDecl()
1490 ->getAnonDeclWithTypedefName(/*AnyRedecl*/true)) in computeLVForDecl()
1509 if (Record->isLambda()) { in computeLVForDecl()
1510 if (Record->hasKnownLambdaInternalLinkage() || in computeLVForDecl()
1511 !Record->getLambdaManglingNumber()) { in computeLVForDecl()
1517 Record->getDeclContext()->getRedeclContext(), in computeLVForDecl()
1518 Record->getLambdaContextDecl(), computation); in computeLVForDecl()
1528 LinkageInfo LV = getLVForType(*TPO->getType(), computation); in computeLVForDecl()
1529 LV.merge(getLVForValue(TPO->getValue(), computation)); in computeLVForDecl()
1534 // Handle linkage for namespace-scope names. in computeLVForDecl()
1535 if (D->getDeclContext()->getRedeclContext()->isFileContext()) in computeLVForDecl()
1541 // enumeration defined in a class-scope typedef declaration such in computeLVForDecl()
1545 if (D->getDeclContext()->isRecord()) in computeLVForDecl()
1556 // one such matching entity, the program is ill-formed. Otherwise, in computeLVForDecl()
1559 if (D->getDeclContext()->isFunctionOrMethod()) in computeLVForDecl()
1567 /// getLVForDecl - Get the linkage and visibility for the given declaration.
1571 if (D->hasAttr<InternalLinkageAttr>()) in getLVForDecl()
1574 if (computation.IgnoreAllVisibility && D->hasCachedLinkage()) in getLVForDecl()
1575 return LinkageInfo(D->getCachedLinkage(), DefaultVisibility, false); in getLVForDecl()
1581 if (D->hasCachedLinkage()) in getLVForDecl()
1582 assert(D->getCachedLinkage() == LV.getLinkage()); in getLVForDecl()
1584 D->setCachedLinkage(LV.getLinkage()); in getLVForDecl()
1591 const LangOptions &Opts = D->getASTContext().getLangOpts(); in getLVForDecl()
1599 for (auto *I : D->redecls()) { in getLVForDecl()
1603 if (!T->isInvalidDecl() && T->hasCachedLinkage()) { in getLVForDecl()
1608 assert(!Old || Old->getCachedLinkage() == D->getCachedLinkage()); in getLVForDecl()
1619 return getLVForDecl(D, D->getASTContext().getLangOpts().IgnoreXCOFFVisibility in getDeclLinkageAndVisibility()
1634 switch (M->Kind) { in getOwningModuleForLinkage()
1654 return M->Parent; in getOwningModuleForLinkage()
1681 if (getDeclContext()->isFunctionOrMethod()) { in printQualifiedName()
1713 if (auto *ID = MD->getClassInterface()) in printNestedNameSpecifier()
1716 if (auto *MD = PD->getGetterMethodDecl()) in printNestedNameSpecifier()
1717 if (auto *ID = MD->getClassInterface()) in printNestedNameSpecifier()
1720 if (auto *CI = ID->getContainingInterface()) in printNestedNameSpecifier()
1724 if (Ctx->isFunctionOrMethod()) in printNestedNameSpecifier()
1732 for (; Ctx; Ctx = Ctx->getParent()) { in printNestedNameSpecifier()
1735 cast<NamespaceDecl>(Ctx)->isAnonymousNamespace()) in printNestedNameSpecifier()
1739 if (P.SuppressInlineNamespace && Ctx->isInlineNamespace() && NameInScope && in printNestedNameSpecifier()
1740 cast<NamespaceDecl>(Ctx)->isRedundantInlineQualifierFor(NameInScope)) in printNestedNameSpecifier()
1743 // Skip non-named contexts such as linkage specifications and ExportDecls. in printNestedNameSpecifier()
1749 NameInScope = ND->getDeclName(); in printNestedNameSpecifier()
1754 OS << Spec->getName(); in printNestedNameSpecifier()
1755 const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs(); in printNestedNameSpecifier()
1758 Spec->getSpecializedTemplate()->getTemplateParameters()); in printNestedNameSpecifier()
1760 if (ND->isAnonymousNamespace()) { in printNestedNameSpecifier()
1767 if (!RD->getIdentifier()) in printNestedNameSpecifier()
1768 OS << "(anonymous " << RD->getKindName() << ')'; in printNestedNameSpecifier()
1773 if (FD->hasWrittenPrototype()) in printNestedNameSpecifier()
1774 FT = dyn_cast<FunctionProtoType>(FD->getType()->castAs<FunctionType>()); in printNestedNameSpecifier()
1778 unsigned NumParams = FD->getNumParams(); in printNestedNameSpecifier()
1782 OS << FD->getParamDecl(i)->getType().stream(P); in printNestedNameSpecifier()
1785 if (FT->isVariadic()) { in printNestedNameSpecifier()
1793 // C++ [dcl.enum]p10: Each enum-name and each unscoped in printNestedNameSpecifier()
1795 // the enum-specifier. Each scoped enumerator is declared in the in printNestedNameSpecifier()
1800 if (ED->isScoped()) in printNestedNameSpecifier()
1837 assert(getDeclName() == OldD->getDeclName() && "Declaration name mismatch"); in declarationReplaces()
1840 // when re-exporting. in declarationReplaces()
1841 if (OldD->isFromASTFile() && isFromASTFile()) in declarationReplaces()
1845 if (OldD->getKind() != getKind()) in declarationReplaces()
1853 // Objective-C) permitted as an extension. in declarationReplaces()
1860 if (!this->getDeclContext()->getRedeclContext()->Equals( in declarationReplaces()
1861 OldD->getDeclContext()->getRedeclContext())) in declarationReplaces()
1868 return Context.getCanonicalNestedNameSpecifier(UD->getQualifier()) == in declarationReplaces()
1870 cast<UsingDecl>(OldD)->getQualifier()); in declarationReplaces()
1874 return Context.getCanonicalNestedNameSpecifier(UUVD->getQualifier()) == in declarationReplaces()
1876 cast<UnresolvedUsingValueDecl>(OldD)->getQualifier()); in declarationReplaces()
1880 if (getCanonicalDecl() != OldD->getCanonicalDecl()) in declarationReplaces()
1897 if (D->isCanonicalDecl()) in declarationReplaces()
1922 llvm_unreachable("Non-formal linkage is not allowed here!"); in hasLinkage()
1933 ND = UD->getTargetDecl(); in getUnderlyingDeclImpl()
1936 return AD->getClassInterface(); in getUnderlyingDeclImpl()
1939 return AD->getNamespace(); in getUnderlyingDeclImpl()
1950 D = cast<UsingShadowDecl>(D)->getTargetDecl(); in isCXXInstanceMember()
1954 if (const auto *MD = dyn_cast_if_present<CXXMethodDecl>(D->getAsFunction())) in isCXXInstanceMember()
1955 return MD->isInstance(); in isCXXInstanceMember()
1959 //===----------------------------------------------------------------------===//
1961 //===----------------------------------------------------------------------===//
1965 if (decl->getNumTemplateParameterLists() > 0) in getTemplateOrInnerLocStart()
1966 return decl->getTemplateParameterList(0)->getTemplateLoc(); in getTemplateOrInnerLocStart()
1967 return decl->getInnerLocStart(); in getTemplateOrInnerLocStart()
1972 if (TSI) return TSI->getTypeLoc().getBeginLoc(); in getTypeSpecStartLoc()
1978 if (TSI) return TSI->getTypeLoc().getEndLoc(); in getTypeSpecEndLoc()
1986 // Save (non-extended) type source info pointer. in setQualifierInfo()
1991 getExtInfo()->TInfo = savedTInfo; in setQualifierInfo()
1994 getExtInfo()->QualifierLoc = QualifierLoc; in setQualifierInfo()
1997 getExtInfo()->QualifierLoc = QualifierLoc; in setQualifierInfo()
2005 // Save (non-extended) type source info pointer. in setTrailingRequiresClause()
2010 getExtInfo()->TInfo = savedTInfo; in setTrailingRequiresClause()
2013 getExtInfo()->TrailingRequiresClause = TrailingRequiresClause; in setTrailingRequiresClause()
2021 // Save (non-extended) type source info pointer. in setTemplateParameterListsInfo()
2026 getExtInfo()->TInfo = savedTInfo; in setTemplateParameterListsInfo()
2029 getExtInfo()->setTemplateParameterListsInfo(Context, TPLists); in setTemplateParameterListsInfo()
2041 switch (T->getTypeClass()) { in typeIsPostfix()
2045 QT = cast<PointerType>(T)->getPointeeType(); in typeIsPostfix()
2048 QT = cast<BlockPointerType>(T)->getPointeeType(); in typeIsPostfix()
2051 QT = cast<MemberPointerType>(T)->getPointeeType(); in typeIsPostfix()
2055 QT = cast<ReferenceType>(T)->getPointeeType(); in typeIsPostfix()
2058 QT = cast<PackExpansionType>(T)->getPattern(); in typeIsPostfix()
2077 if (!getDeclName() || typeIsPostfix(TInfo->getType())) in getSourceRange()
2078 RangeEnd = TInfo->getTypeLoc().getSourceRange().getEnd(); in getSourceRange()
2099 //===----------------------------------------------------------------------===//
2101 //===----------------------------------------------------------------------===//
2169 llvm_unreachable("Unknown thread storage class specifier!"); in getTLSKind()
2174 SourceLocation InitEnd = Init->getEndLoc(); in getSourceRange()
2199 if (DC->isRecord()) in getDeclLanguageLinkage()
2215 if (DC->isRecord()) { in isDeclExternC()
2232 return getLexicalDeclContext()->isExternCContext(); in isInExternCContext()
2236 return getLexicalDeclContext()->isExternCXXContext(); in isInExternCXXContext()
2248 // specifier or a linkage-specification and neither an initializer [...], in isThisDeclarationADefinition()
2249 // it declares a non-inline static data member in a class declaration [...], in isThisDeclarationADefinition()
2251 // was defined within the class with the constexpr specifier [...], in isThisDeclarationADefinition()
2261 !(getCanonicalDecl()->isInline() && in isThisDeclarationADefinition()
2262 getCanonicalDecl()->isConstexpr()) && in isThisDeclarationADefinition()
2264 // If the first declaration is out-of-line, this may be an in isThisDeclarationADefinition()
2265 // instantiation of an out-of-line partial specialization of a variable in isThisDeclarationADefinition()
2267 (getFirstDecl()->isOutOfLine() in isThisDeclarationADefinition()
2280 // Note: that applies for all non-file-scope objects. in isThisDeclarationADefinition()
2291 if (!SAA->isInherited()) in isThisDeclarationADefinition()
2298 if (VTSD->getTemplateSpecializationKind() != TSK_ExplicitSpecialization && in isThisDeclarationADefinition()
2300 !VTSD->IsCompleteDefinition) in isThisDeclarationADefinition()
2308 // A declaration directly contained in a linkage-specification is treated in isThisDeclarationADefinition()
2309 // as if it contains the extern specifier for the purpose of determining in isThisDeclarationADefinition()
2316 // and without a storage class specifier or the scs 'static', constitutes in isThisDeclarationADefinition()
2322 // What's left is (in C, block-scope) declarations without initializers or in isThisDeclarationADefinition()
2336 Decl = Decl->getPreviousDecl()) { in getActingDefinition()
2337 Kind = Decl->isThisDeclarationADefinition(); in getActingDefinition()
2350 for (auto *I : First->redecls()) { in getDefinition()
2351 if (I->isThisDeclarationADefinition(C) == Definition) in getDefinition()
2361 for (auto *I : First->redecls()) { in hasDefinition()
2362 Kind = std::max(Kind, I->isThisDeclarationADefinition(C)); in hasDefinition()
2372 if (auto Expr = I->getInit()) { in getAnyInitializer()
2382 if (P->hasUnparsedDefaultArg() || P->hasUninstantiatedDefaultArg()) in hasInit()
2386 return Eval->Value.isValid(); in hasInit()
2400 return cast<Expr>(Eval->Value.get( in getInit()
2401 Eval->Value.isOffset() ? getASTContext().getExternalSource() : nullptr)); in getInit()
2406 return ES->Value.getAddressOfPointer(getASTContext().getExternalSource()); in getInitAddress()
2414 if (I->hasInit()) in getInitializingDeclaration()
2417 if (I->isThisDeclarationADefinition()) { in getInitializingDeclaration()
2435 // out-of-line. in isOutOfLine()
2437 return VD->isOutOfLine(); in isOutOfLine()
2444 Eval->~EvaluatedStmt(); in setInit()
2469 if (Lang.CPlusPlus11 && getType()->isReferenceType()) in mightBeUsableInConstantExpressions()
2473 // not require the variable to be non-volatile, but we consider this to be a in mightBeUsableInConstantExpressions()
2478 // In C++, but not in C, const, non-volatile variables of integral or in mightBeUsableInConstantExpressions()
2480 if (getType()->isIntegralOrEnumerationType() && !Lang.C23) in mightBeUsableInConstantExpressions()
2485 // - declared with storage-class specifier constexpr and has an object type, in mightBeUsableInConstantExpressions()
2488 // Additionally, in C++11, non-volatile constexpr variables can be used in in mightBeUsableInConstantExpressions()
2499 if (!Init || Init->isValueDependent() || getType()->isDependentType()) in isUsableInConstantExpressions()
2502 // const-qualified integral or enumeration type, ... in isUsableInConstantExpressions()
2503 if (!DefVD->mightBeUsableInConstantExpressions(Context)) in isUsableInConstantExpressions()
2507 !DefVD->hasConstantInitialization()) in isUsableInConstantExpressions()
2510 // An integral constant-expression can involve only [...] const variables in isUsableInConstantExpressions()
2514 !Context.getLangOpts().CPlusPlus11 && !DefVD->hasICEInitializer(Context)) in isUsableInConstantExpressions()
2530 Eval->Value = Init.get<Stmt *>(); in ensureEvaluatedStmt()
2550 assert(!Init->isValueDependent()); in evaluateValueImpl()
2552 // We only produce notes indicating why an initializer is non-constant the in evaluateValueImpl()
2555 if (Eval->WasEvaluated) in evaluateValueImpl()
2556 return Eval->Evaluated.isAbsent() ? nullptr : &Eval->Evaluated; in evaluateValueImpl()
2558 if (Eval->IsEvaluating) { in evaluateValueImpl()
2559 // FIXME: Produce a diagnostic for self-initialization. in evaluateValueImpl()
2563 Eval->IsEvaluating = true; in evaluateValueImpl()
2566 bool Result = Init->EvaluateAsInitializer(Eval->Evaluated, Ctx, this, Notes, in evaluateValueImpl()
2583 Eval->Evaluated = APValue(); in evaluateValueImpl()
2584 else if (Eval->Evaluated.needsCleanup()) in evaluateValueImpl()
2585 Ctx.addDestruction(&Eval->Evaluated); in evaluateValueImpl()
2587 Eval->IsEvaluating = false; in evaluateValueImpl()
2588 Eval->WasEvaluated = true; in evaluateValueImpl()
2590 return Result ? &Eval->Evaluated : nullptr; in evaluateValueImpl()
2595 if (Eval->WasEvaluated) in getEvaluatedValue()
2596 return &Eval->Evaluated; in getEvaluatedValue()
2606 if (!Eval->CheckedForICEInit) { in hasICEInitializer()
2607 Eval->CheckedForICEInit = true; in hasICEInitializer()
2608 Eval->HasICEInit = Init->isIntegerConstantExpr(Context); in hasICEInitializer()
2610 return Eval->HasICEInit; in hasICEInitializer()
2624 return Eval->HasConstantInitialization; in hasConstantInitialization()
2635 assert(!Eval->WasEvaluated && in checkForConstantInitialization()
2641 assert(!getInit()->isValueDependent()); in checkForConstantInitialization()
2644 Eval->HasConstantInitialization = in checkForConstantInitialization()
2647 // If evaluation as a constant initializer failed, allow re-evaluation as a in checkForConstantInitialization()
2648 // non-constant initializer if we later find we want the value. in checkForConstantInitialization()
2649 if (!Eval->HasConstantInitialization) in checkForConstantInitialization()
2650 Eval->WasEvaluated = false; in checkForConstantInitialization()
2652 return Eval->HasConstantInitialization; in checkForConstantInitialization()
2662 if (auto *Def = D->getDefinition()) in getDefinitionOrSelf()
2677 return T->isDependentType() || T->isUndeducedType() || in hasDependentAlignment()
2679 return AA->isAlignmentDependent(); in hasDependentAlignment()
2688 if (MemberSpecializationInfo *MSInfo = VD->getMemberSpecializationInfo()) { in getTemplateInstantiationPattern()
2689 if (isTemplateInstantiation(MSInfo->getTemplateSpecializationKind())) { in getTemplateInstantiationPattern()
2690 VD = VD->getInstantiatedFromStaticDataMember(); in getTemplateInstantiationPattern()
2691 while (auto *NewVD = VD->getInstantiatedFromStaticDataMember()) in getTemplateInstantiationPattern()
2699 if (isTemplateInstantiation(VDTemplSpec->getTemplateSpecializationKind())) { in getTemplateInstantiationPattern()
2700 auto From = VDTemplSpec->getInstantiatedFrom(); in getTemplateInstantiationPattern()
2702 while (!VTD->isMemberSpecialization()) { in getTemplateInstantiationPattern()
2703 auto *NewVTD = VTD->getInstantiatedFromMemberTemplate(); in getTemplateInstantiationPattern()
2708 return getDefinitionOrSelf(VTD->getTemplatedDecl()); in getTemplateInstantiationPattern()
2712 while (!VTPSD->isMemberSpecialization()) { in getTemplateInstantiationPattern()
2713 auto *NewVTPSD = VTPSD->getInstantiatedFromMember(); in getTemplateInstantiationPattern()
2725 if (VarTemplateDecl *VarTemplate = VD->getDescribedVarTemplate()) { in getTemplateInstantiationPattern()
2726 while (!VarTemplate->isMemberSpecialization()) { in getTemplateInstantiationPattern()
2727 auto *NewVT = VarTemplate->getInstantiatedFromMemberTemplate(); in getTemplateInstantiationPattern()
2733 return getDefinitionOrSelf(VarTemplate->getTemplatedDecl()); in getTemplateInstantiationPattern()
2742 if (MemberSpecializationInfo *MSI = getMemberSpecializationInfo()) in getInstantiatedFromStaticDataMember() local
2743 return cast<VarDecl>(MSI->getInstantiatedFrom()); in getInstantiatedFromStaticDataMember()
2750 return Spec->getSpecializationKind(); in getTemplateSpecializationKind()
2752 if (MemberSpecializationInfo *MSI = getMemberSpecializationInfo()) in getTemplateSpecializationKind() local
2753 return MSI->getTemplateSpecializationKind(); in getTemplateSpecializationKind()
2760 if (MemberSpecializationInfo *MSI = getMemberSpecializationInfo()) in getTemplateSpecializationKindForInstantiation() local
2761 return MSI->getTemplateSpecializationKind(); in getTemplateSpecializationKindForInstantiation()
2764 return Spec->getSpecializationKind(); in getTemplateSpecializationKindForInstantiation()
2771 return Spec->getPointOfInstantiation(); in getPointOfInstantiation()
2773 if (MemberSpecializationInfo *MSI = getMemberSpecializationInfo()) in getPointOfInstantiation() local
2774 return MSI->getPointOfInstantiation(); in getPointOfInstantiation()
2814 if (Eval->HasConstantDestruction) in needsDestruction()
2825 auto *Ty = getType()->getAs<RecordType>(); in hasFlexibleArrayInit()
2826 if (!Ty || !Ty->getDecl()->hasFlexibleArrayMember()) in hasFlexibleArrayInit()
2828 auto *List = dyn_cast<InitListExpr>(getInit()->IgnoreParens()); in hasFlexibleArrayInit()
2831 const Expr *FlexibleInit = List->getInit(List->getNumInits() - 1); in hasFlexibleArrayInit()
2832 auto InitTy = Ctx.getAsConstantArrayType(FlexibleInit->getType()); in hasFlexibleArrayInit()
2835 return !InitTy->isZeroSize(); in hasFlexibleArrayInit()
2840 auto *Ty = getType()->getAs<RecordType>(); in getFlexibleArrayInitChars()
2841 if (!Ty || !Ty->getDecl()->hasFlexibleArrayMember()) in getFlexibleArrayInitChars()
2843 auto *List = dyn_cast<InitListExpr>(getInit()->IgnoreParens()); in getFlexibleArrayInitChars()
2844 if (!List || List->getNumInits() == 0) in getFlexibleArrayInitChars()
2846 const Expr *FlexibleInit = List->getInit(List->getNumInits() - 1); in getFlexibleArrayInitChars()
2847 auto InitTy = Ctx.getAsConstantArrayType(FlexibleInit->getType()); in getFlexibleArrayInitChars()
2851 const ASTRecordLayout &RL = Ctx.getASTRecordLayout(Ty->getDecl()); in getFlexibleArrayInitChars()
2853 Ctx.toCharUnitsFromBits(RL.getFieldOffset(RL.getFieldCount() - 1)); in getFlexibleArrayInitChars()
2856 return FlexibleArrayOffset + FlexibleArraySize - RL.getSize(); in getFlexibleArrayInitChars()
2876 Spec->setSpecializationKind(TSK); in setTemplateSpecializationKind()
2879 Spec->getPointOfInstantiation().isInvalid()) { in setTemplateSpecializationKind()
2880 Spec->setPointOfInstantiation(PointOfInstantiation); in setTemplateSpecializationKind()
2882 L->InstantiationRequested(this); in setTemplateSpecializationKind()
2884 } else if (MemberSpecializationInfo *MSI = getMemberSpecializationInfo()) { in setTemplateSpecializationKind() local
2885 MSI->setTemplateSpecializationKind(TSK); in setTemplateSpecializationKind()
2887 MSI->getPointOfInstantiation().isInvalid()) { in setTemplateSpecializationKind()
2888 MSI->setPointOfInstantiation(PointOfInstantiation); in setTemplateSpecializationKind()
2890 L->InstantiationRequested(this); in setTemplateSpecializationKind()
2903 //===----------------------------------------------------------------------===//
2905 //===----------------------------------------------------------------------===//
2918 QualType T = TSI ? TSI->getType() : getType(); in getOriginalType()
2920 return DT->getOriginalType(); in getOriginalType()
2952 const auto *RT = getType()->getAs<RecordType>(); in isDestroyedInCallee()
2953 if (RT && RT->getDecl()->isParamDestroyedInCallee() && in isDestroyedInCallee()
2967 return E->getSubExpr(); in getDefaultArg()
2985 return getUninstantiatedDefaultArg()->getSourceRange(); in getDefaultArgRange()
2989 return E->getSourceRange(); in getDefaultArgRange()
3025 //===----------------------------------------------------------------------===//
3027 //===----------------------------------------------------------------------===//
3040 assert(T.isNull() || T->isFunctionType()); in FunctionDecl()
3078 printTemplateArgumentList(OS, TemplateArgs->asArray(), Policy); in getNameForDiagnostic()
3082 if (const auto *FT = getType()->getAs<FunctionProtoType>()) in isVariadic()
3083 return FT->isVariadic(); in isVariadic()
3099 Info->NumLookups = Lookups.size(); in Create()
3100 Info->HasDeletedMessage = DeletedMessage != nullptr; in Create()
3103 Info->getTrailingObjects<DeclAccessPair>()); in Create()
3105 *Info->getTrailingObjects<StringLiteral *>() = DeletedMessage; in Create()
3124 DefaultedOrDeletedInfo->setDeletedMessage(Message); in setDeletedAsWritten()
3150 if (I->doesThisDeclarationHaveABody()) { in hasBody()
3167 if (isa<CompoundStmt>(S) && cast<CompoundStmt>(S)->body_empty()) in hasTrivialBody()
3180 return InstantiatedFrom->getFriendObjectKind() && in isThisDeclarationInstantiatedFromAFriendDefinition()
3181 InstantiatedFrom->isThisDeclarationADefinition(); in isThisDeclarationInstantiatedFromAFriendDefinition()
3187 Template->getInstantiatedFromMemberTemplate()) in isThisDeclarationInstantiatedFromAFriendDefinition()
3188 return InstantiatedFrom->getFriendObjectKind() && in isThisDeclarationInstantiatedFromAFriendDefinition()
3189 InstantiatedFrom->isThisDeclarationADefinition(); in isThisDeclarationInstantiatedFromAFriendDefinition()
3198 if (FD->isThisDeclarationADefinition()) { in isDefined()
3219 FD->isThisDeclarationInstantiatedFromAFriendDefinition()) { in isDefined()
3232 assert(!Definition->FunctionDeclBits.HasDefaultedOrDeletedInfo && in getBody()
3234 if (Definition->Body) in getBody()
3235 return Definition->Body.get(getASTContext().getExternalSource()); in getBody()
3244 EndRangeLoc = B->getEndLoc(); in setBody()
3251 Parent->markedVirtualFunctionPure(); in setIsPureVirtual()
3256 const IdentifierInfo *II = ND->getIdentifier(); in isNamed()
3257 return II && II->isStr(Str); in isNamed()
3262 // An immediate-escalating function is in isImmediateEscalating()
3263 // - the call operator of a lambda that is not declared with the consteval in isImmediateEscalating()
3264 // specifier, in isImmediateEscalating()
3267 // - a defaulted special member function that is not declared with the in isImmediateEscalating()
3268 // consteval specifier, in isImmediateEscalating()
3271 // - a function that results from the instantiation of a templated entity in isImmediateEscalating()
3272 // defined with the constexpr specifier. in isImmediateEscalating()
3283 // - declared with the consteval specifier in isImmediateFunction()
3286 // - an immediate-escalating function F whose function body contains an in isImmediateFunction()
3287 // immediate-escalating expression in isImmediateFunction()
3292 MD && MD->isLambdaStaticInvoker()) in isImmediateFunction()
3293 return MD->getParent()->getLambdaCallOperator()->isImmediateFunction(); in isImmediateFunction()
3300 dyn_cast<TranslationUnitDecl>(getDeclContext()->getRedeclContext()); in isMain()
3302 !tunit->getASTContext().getLangOpts().Freestanding && in isMain()
3308 dyn_cast<TranslationUnitDecl>(getDeclContext()->getRedeclContext()); in isMSVCRTEntryPoint()
3316 if (!TUnit->getASTContext().getTargetInfo().getTriple().isOSMSVCRT()) in isMSVCRTEntryPoint()
3342 if (!getDeclContext()->getRedeclContext()->isTranslationUnit()) in isReservedGlobalPlacementOperator()
3345 const auto *proto = getType()->castAs<FunctionProtoType>(); in isReservedGlobalPlacementOperator()
3346 if (proto->getNumParams() != 2 || proto->isVariadic()) in isReservedGlobalPlacementOperator()
3350 cast<TranslationUnitDecl>(getDeclContext()->getRedeclContext()) in isReservedGlobalPlacementOperator()
3351 ->getASTContext(); in isReservedGlobalPlacementOperator()
3355 return (proto->getParamType(1).getCanonicalType() == Context.VoidPtrTy); in isReservedGlobalPlacementOperator()
3372 if (!getDeclContext()->getRedeclContext()->isTranslationUnit()) in isReplaceableGlobalAllocationFunction()
3375 const auto *FPT = getType()->castAs<FunctionProtoType>(); in isReplaceableGlobalAllocationFunction()
3376 if (FPT->getNumParams() == 0 || FPT->getNumParams() > 4 || FPT->isVariadic()) in isReplaceableGlobalAllocationFunction()
3379 // If this is a single-parameter function, it must be a replaceable global in isReplaceableGlobalAllocationFunction()
3381 if (FPT->getNumParams() == 1) in isReplaceableGlobalAllocationFunction()
3385 QualType Ty = FPT->getParamType(Params); in isReplaceableGlobalAllocationFunction()
3390 Ty = Params < FPT->getNumParams() ? FPT->getParamType(Params) : QualType(); in isReplaceableGlobalAllocationFunction()
3405 if (Ctx.getLangOpts().AlignedAllocation && !Ty.isNull() && Ty->isAlignValT()) { in isReplaceableGlobalAllocationFunction()
3413 if (!IsSizedDelete && !Ty.isNull() && Ty->isReferenceType()) { in isReplaceableGlobalAllocationFunction()
3414 Ty = Ty->getPointeeType(); in isReplaceableGlobalAllocationFunction()
3417 if (Ty->isNothrowT()) { in isReplaceableGlobalAllocationFunction()
3428 if (!IsSizedDelete && !Ty.isNull() && Ty->isEnumeralType()) { in isReplaceableGlobalAllocationFunction()
3430 while (const auto *TD = T->getAs<TypedefType>()) in isReplaceableGlobalAllocationFunction()
3431 T = TD->getDecl()->getUnderlyingType(); in isReplaceableGlobalAllocationFunction()
3433 T->castAs<EnumType>()->getDecl()->getIdentifier(); in isReplaceableGlobalAllocationFunction()
3434 if (II && II->isStr("__hot_cold_t")) in isReplaceableGlobalAllocationFunction()
3438 return Params == FPT->getNumParams(); in isReplaceableGlobalAllocationFunction()
3449 if (!Definition->isInlineSpecified() || in isInlineBuiltinDeclaration()
3450 !Definition->hasAttr<AlwaysInlineAttr>()) in isInlineBuiltinDeclaration()
3475 auto *RD = getParamDecl(1)->getType()->getAsCXXRecordDecl(); in isDestroyingOperatorDelete()
3476 return RD && RD->isInStdNamespace() && RD->getIdentifier() && in isDestroyingOperatorDelete()
3477 RD->getIdentifier()->isStr("destroying_delete_t"); in isDestroyingOperatorDelete()
3491 return getLexicalDeclContext()->isExternCContext(); in isInExternCContext()
3495 return getLexicalDeclContext()->isExternCXXContext(); in isInExternCXXContext()
3500 return Method->isStatic(); in isGlobal()
3502 if (getCanonicalDecl()->getStorageClass() == SC_Static) in isGlobal()
3506 DC->isNamespace(); in isGlobal()
3507 DC = DC->getParent()) { in isGlobal()
3509 if (!Namespace->getDeclName()) in isGlobal()
3522 if (auto *FnTy = getType()->getAs<FunctionType>()) in isNoReturn()
3523 return FnTy->getNoReturnAttr(); in isNoReturn()
3530 // A non-template friend declaration with a requires-clause [or] in isMemberLikeConstrainedFriend()
3535 // If this isn't a friend then it's not a member-like constrained friend. in isMemberLikeConstrainedFriend()
3581 return getAttr<TargetAttr>()->isDefaultVersion(); in isTargetMultiVersionDefault()
3583 getAttr<TargetVersionAttr>()->isDefaultVersion(); in isTargetMultiVersionDefault()
3600 = PrevDecl? PrevDecl->getDescribedFunctionTemplate() : nullptr; in setPreviousDeclaration()
3602 FunTmpl->setPreviousDecl(PrevFunTmpl); in setPreviousDeclaration()
3605 if (PrevDecl && PrevDecl->isInlined()) in setPreviousDeclaration()
3614 /// The function corresponds to a built-in function if it is declared at
3618 /// target-independent range \c [1,Builtin::First), or a target-specific builtin
3628 BuiltinID = ABAA->getBuiltinName()->getBuiltinID(); in getBuiltinID()
3630 BuiltinID = BAA->getBuiltinName()->getBuiltinID(); in getBuiltinID()
3632 BuiltinID = A->getID(); in getBuiltinID()
3656 // OpenCL v1.2 s6.9.f - The library functions defined in in getBuiltinID()
3662 // CUDA does not have device-side standard library. printf and malloc are the in getBuiltinID()
3663 // only special cases that are supported by device-side runtime. in getBuiltinID()
3669 // As AMDGCN implementation of OpenMP does not have a device-side standard in getBuiltinID()
3681 /// getNumParams - Return the number of parameters this function must have
3685 const auto *FPT = getType()->getAs<FunctionProtoType>(); in getNumParams()
3686 return FPT ? FPT->getNumParams() : 0; in getNumParams()
3694 // Zero params -> null pointer. in setParams()
3701 /// getMinRequiredArguments - Returns the minimum number of arguments
3714 if (!Param->isParameterPack()) { in getMinRequiredArguments()
3716 if (!Param->hasDefaultArg()) in getMinRequiredArguments()
3724 return getNumParams() != 0 && getParamDecl(0)->isExplicitObjectParameter(); in hasCXXExplicitFunctionObjectParameter()
3728 return getNumParams() - in getNumNonObjectParams()
3733 return getMinRequiredArguments() - in getMinRequiredExplicitArguments()
3741 [](ParmVarDecl *P) { return P->hasDefaultArg(); })); in hasOneParamOrDefaultArgs()
3758 FD = FD->getPreviousDecl()) in isMSExternInline()
3759 if (!FD->isImplicit() && FD->getStorageClass() == SC_Extern) in isMSExternInline()
3766 if (Redecl->getStorageClass() != SC_Extern) in redeclForcesDefMSVC()
3769 for (const FunctionDecl *FD = Redecl->getPreviousDecl(); FD; in redeclForcesDefMSVC()
3770 FD = FD->getPreviousDecl()) in redeclForcesDefMSVC()
3771 if (!FD->isImplicit() && FD->getStorageClass() == SC_Extern) in redeclForcesDefMSVC()
3778 // Only consider file-scope declarations in this test. in RedeclForcesDefC99()
3779 if (!Redecl->getLexicalDeclContext()->isTranslationUnit()) in RedeclForcesDefC99()
3784 if (Redecl->isImplicit()) in RedeclForcesDefC99()
3787 if (!Redecl->isInlineSpecified() || Redecl->getStorageClass() == SC_Extern) in RedeclForcesDefC99()
3807 if (hasBody(Definition) && Definition->isInlined() && in doesDeclarationForceExternallyVisibleDefinition()
3826 while ((Prev = Prev->getPreviousDecl())) { in doesDeclarationForceExternallyVisibleDefinition()
3827 FoundBody |= Prev->doesThisDeclarationHaveABody(); in doesDeclarationForceExternallyVisibleDefinition()
3829 if (Prev->doesThisDeclarationHaveABody()) { in doesDeclarationForceExternallyVisibleDefinition()
3832 if (!Prev->isInlineSpecified() || in doesDeclarationForceExternallyVisibleDefinition()
3833 Prev->getStorageClass() != SC_Extern) in doesDeclarationForceExternallyVisibleDefinition()
3835 } else if (Prev->isInlineSpecified() && in doesDeclarationForceExternallyVisibleDefinition()
3836 Prev->getStorageClass() != SC_Extern) { in doesDeclarationForceExternallyVisibleDefinition()
3845 // translation unit include the inline function specifier without extern, in doesDeclarationForceExternallyVisibleDefinition()
3851 while ((Prev = Prev->getPreviousDecl())) { in doesDeclarationForceExternallyVisibleDefinition()
3852 FoundBody |= Prev->doesThisDeclarationHaveABody(); in doesDeclarationForceExternallyVisibleDefinition()
3861 return TSI ? TSI->getTypeLoc().IgnoreParens().getAs<FunctionTypeLoc>() in getFunctionTypeLoc()
3870 // Skip self-referential return types. in getReturnTypeSourceRange()
3889 NP > 0 ? ParamInfo[0]->getSourceRange().getBegin() : EllipsisLoc; in getParametersSourceRange()
3892 : ParamInfo[NP - 1]->getSourceRange().getEnd(); in getParametersSourceRange()
3911 /// if even one of the global-scope declarations is marked "extern inline", the
3941 if (Redecl->isInlineSpecified() && in isInlineDefinitionExternallyVisible()
3942 Redecl->getStorageClass() != SC_Extern) in isInlineDefinitionExternallyVisible()
3949 // The rest of this function is C-only. in isInlineDefinitionExternallyVisible()
3955 // translation unit include the inline function specifier without extern, in isInlineDefinitionExternallyVisible()
3969 /// getOverloadedOperator - Which C++ overloaded operator this
3977 /// getLiteralIdentifier - The literal suffix identifier this function
4008 return cast<FunctionDecl>(Info->getInstantiatedFrom()); in getInstantiatedFromMemberFunction()
4014 if (auto *MSI = in getMemberSpecializationInfo() local
4016 return MSI; in getMemberSpecializationInfo()
4019 return FTSI->getMemberSpecializationInfo(); in getMemberSpecializationInfo()
4086 HasPattern = PatternDecl->hasBody(PatternDecl); in isImplicitlyInstantiable()
4095 return PatternDecl->isInlined(); in isImplicitlyInstantiable()
4112 // (i.e. instantiated-from-member-template) to use as an instantiation in getTemplateInstantiationPattern()
4118 return getDefinitionOrSelf(getPrimaryTemplate()->getTemplatedDecl()); in getTemplateInstantiationPattern()
4127 if (MemberSpecializationInfo *Info = FD->getMemberSpecializationInfo()) { in getTemplateInstantiationPattern()
4129 !clang::isTemplateInstantiation(Info->getTemplateSpecializationKind())) in getTemplateInstantiationPattern()
4131 return getDefinitionOrSelf(cast<FunctionDecl>(Info->getInstantiatedFrom())); in getTemplateInstantiationPattern()
4141 while (!ForDefinition || !Primary->isMemberSpecialization()) { in getTemplateInstantiationPattern()
4142 auto *NewPrimary = Primary->getInstantiatedFromMemberTemplate(); in getTemplateInstantiationPattern()
4148 return getDefinitionOrSelf(Primary->getTemplatedDecl()); in getTemplateInstantiationPattern()
4158 return Info->getTemplate(); in getPrimaryTemplate()
4174 return Info->TemplateArguments; in getTemplateSpecializationArgs()
4184 return Info->TemplateArgumentsAsWritten; in getTemplateSpecializationArgsAsWritten()
4189 return Info->TemplateArgumentsAsWritten; in getTemplateSpecializationArgsAsWritten()
4215 Template->addSpecialization(Info, InsertPos); in setFunctionTemplateSpecialization()
4254 return cast<FunctionTemplateDecl>(ND->getUnderlyingDecl()); in DependentFunctionTemplateSpecializationInfo()
4264 return FTSInfo->getTemplateSpecializationKind(); in getTemplateSpecializationKind()
4268 return MSInfo->getTemplateSpecializationKind(); in getTemplateSpecializationKind()
4307 if (auto *MSInfo = FTSInfo->getMemberSpecializationInfo()) in getTemplateSpecializationKindForInstantiation()
4308 return MSInfo->getTemplateSpecializationKind(); in getTemplateSpecializationKindForInstantiation()
4309 return FTSInfo->getTemplateSpecializationKind(); in getTemplateSpecializationKindForInstantiation()
4314 return MSInfo->getTemplateSpecializationKind(); in getTemplateSpecializationKindForInstantiation()
4330 FTSInfo->setTemplateSpecializationKind(TSK); in setTemplateSpecializationKind()
4333 FTSInfo->getPointOfInstantiation().isInvalid()) { in setTemplateSpecializationKind()
4334 FTSInfo->setPointOfInstantiation(PointOfInstantiation); in setTemplateSpecializationKind()
4336 L->InstantiationRequested(this); in setTemplateSpecializationKind()
4340 MSInfo->setTemplateSpecializationKind(TSK); in setTemplateSpecializationKind()
4343 MSInfo->getPointOfInstantiation().isInvalid()) { in setTemplateSpecializationKind()
4344 MSInfo->setPointOfInstantiation(PointOfInstantiation); in setTemplateSpecializationKind()
4346 L->InstantiationRequested(this); in setTemplateSpecializationKind()
4356 return FTSInfo->getPointOfInstantiation(); in getPointOfInstantiation()
4359 return MSInfo->getPointOfInstantiation(); in getPointOfInstantiation()
4369 // class template, check whether that member function was defined out-of-line. in isOutOfLine()
4372 if (FD->hasBody(Definition)) in isOutOfLine()
4373 return Definition->isOutOfLine(); in isOutOfLine()
4377 // check whether that function template was defined out-of-line. in isOutOfLine()
4380 if (FunTmpl->getTemplatedDecl()->hasBody(Definition)) in isOutOfLine()
4381 return Definition->isOutOfLine(); in isOutOfLine()
4474 if (FnInfo->isStr("memset")) in getMemoryFunctionKind()
4476 if (FnInfo->isStr("memcpy")) in getMemoryFunctionKind()
4478 if (FnInfo->isStr("mempcpy")) in getMemoryFunctionKind()
4480 if (FnInfo->isStr("memmove")) in getMemoryFunctionKind()
4482 if (FnInfo->isStr("memcmp")) in getMemoryFunctionKind()
4484 if (FnInfo->isStr("bcmp")) in getMemoryFunctionKind()
4486 if (FnInfo->isStr("strncpy")) in getMemoryFunctionKind()
4488 if (FnInfo->isStr("strncmp")) in getMemoryFunctionKind()
4490 if (FnInfo->isStr("strncasecmp")) in getMemoryFunctionKind()
4492 if (FnInfo->isStr("strncat")) in getMemoryFunctionKind()
4494 if (FnInfo->isStr("strndup")) in getMemoryFunctionKind()
4496 if (FnInfo->isStr("strlen")) in getMemoryFunctionKind()
4498 if (FnInfo->isStr("bzero")) in getMemoryFunctionKind()
4500 if (FnInfo->isStr("bcopy")) in getMemoryFunctionKind()
4503 if (FnInfo->isStr("free")) in getMemoryFunctionKind()
4522 ODRHash = FT->getODRHash(); in getODRHash()
4533 //===----------------------------------------------------------------------===//
4535 //===----------------------------------------------------------------------===//
4556 if (const auto *Record = getType()->getAs<RecordType>()) in isAnonymousStructOrUnion()
4557 return Record->getDecl()->isAnonymousStructOrUnion(); in isAnonymousStructOrUnion()
4566 LazyDeclStmtPtr InitPtr = BitField ? InitAndBitWidth->Init : Init; in getInClassInitializer()
4579 InitAndBitWidth->Init = NewInit; in setLazyInClassInitializer()
4586 return getBitWidth()->EvaluateKnownConstInt(Ctx).getZExtValue(); in getBitWidthValue()
4590 return isUnnamedBitField() && !getBitWidth()->isValueDependent() && in isZeroLengthBitField()
4600 // -- is not a potentially-overlapping subobject, or in isZeroSize()
4604 // -- is not of class type, or in isZeroSize()
4605 const auto *RT = getType()->getAs<RecordType>(); in isZeroSize()
4608 const RecordDecl *RD = RT->getDecl()->getDefinition(); in isZeroSize()
4614 // -- [has] virtual member functions or virtual base classes, or in isZeroSize()
4615 // -- has subobjects of nonzero size or bit-fields of nonzero length in isZeroSize()
4617 if (!CXXRD->isEmpty()) in isZeroSize()
4621 // are implementation-defined. in isZeroSize()
4627 return !llvm::any_of(CXXRD->fields(), [](const FieldDecl *Field) { in isZeroSize()
4628 return Field->getType()->getAs<RecordType>(); in isZeroSize()
4633 return hasAttr<NoUniqueAddressAttr>() && getType()->getAsCXXRecordDecl(); in isPotentiallyOverlapping()
4639 return Canonical->getFieldIndex(); in getFieldIndex()
4641 if (CachedFieldIndex) return CachedFieldIndex - 1; in getFieldIndex()
4644 const RecordDecl *RD = getParent()->getDefinition(); in getFieldIndex()
4647 for (auto *Field : RD->fields()) { in getFieldIndex()
4648 Field->getCanonicalDecl()->CachedFieldIndex = Index + 1; in getFieldIndex()
4649 assert(Field->getCanonicalDecl()->CachedFieldIndex == Index + 1 && in getFieldIndex()
4655 return CachedFieldIndex - 1; in getFieldIndex()
4663 return SourceRange(getInnerLocStart(), FinalExpr->getEndLoc()); in getSourceRange()
4668 assert((getParent()->isLambda() || getParent()->isCapturedRecord()) && in setCapturedVLAType()
4669 "capturing type in non-lambda or captured record."); in setCapturedVLAType()
4671 "bit-field or field with default member initializer cannot capture " in setCapturedVLAType()
4680 this->getType().print(OS, Policy); in printName()
4687 //===----------------------------------------------------------------------===//
4689 //===----------------------------------------------------------------------===//
4724 assert(T->isLinkageValid()); in setTypedefNameForAnonDecl()
4736 cast<CXXRecordDecl>(I)->DefinitionData = Data; in startDefinition()
4742 cast<CXXRecordDecl>(this)->hasDefinition()) && in completeDefinition()
4749 L->CompletedTagDefinition(this); in completeDefinition()
4756 // If it's possible for us to have an out-of-date definition, check now. in getDefinition()
4759 if (II->isOutOfDate()) { in getDefinition()
4766 return CXXRD->getDefinition(); in getDefinition()
4769 if (R->isCompleteDefinition()) in getDefinition()
4781 getExtInfo()->QualifierLoc = QualifierLoc; in setQualifierInfo()
4785 if (getExtInfo()->NumTemplParamLists == 0) { in setQualifierInfo()
4790 getExtInfo()->QualifierLoc = QualifierLoc; in setQualifierInfo()
4820 getExtInfo()->setTemplateParameterListsInfo(Context, TPLists); in setTemplateParameterListsInfo()
4823 //===----------------------------------------------------------------------===//
4825 //===----------------------------------------------------------------------===//
4851 Enum->setMayHaveOutOfDateDef(C.getLangOpts().Modules); in Create()
4860 Enum->setMayHaveOutOfDateDef(C.getLangOpts().Modules); in CreateDeserialized()
4866 return TI->getTypeLoc().getSourceRange(); in getIntegerTypeRange()
4885 return A->getExtensibility() == EnumExtensibilityAttr::Closed; in isClosed()
4898 if (MemberSpecializationInfo *MSI = getMemberSpecializationInfo()) in getTemplateSpecializationKind() local
4899 return MSI->getTemplateSpecializationKind(); in getTemplateSpecializationKind()
4906 MemberSpecializationInfo *MSI = getMemberSpecializationInfo(); in setTemplateSpecializationKind() local
4907 assert(MSI && "Not an instantiated member enumeration?"); in setTemplateSpecializationKind()
4908 MSI->setTemplateSpecializationKind(TSK); in setTemplateSpecializationKind()
4911 MSI->getPointOfInstantiation().isInvalid()) in setTemplateSpecializationKind()
4912 MSI->setPointOfInstantiation(PointOfInstantiation); in setTemplateSpecializationKind()
4917 if (isTemplateInstantiation(MSInfo->getTemplateSpecializationKind())) { in getTemplateInstantiationPattern()
4919 while (auto *NewED = ED->getInstantiatedFromMemberEnum()) in getTemplateInstantiationPattern()
4932 return cast<EnumDecl>(SpecializationInfo->getInstantiatedFrom()); in getInstantiatedFromMemberEnum()
4956 // Set end-point to enum-base, e.g. enum foo : ^bar in getSourceRange()
4960 Res.setEnd(TSI->getTypeLoc().getEndLoc()); in getSourceRange()
4972 Max = llvm::APInt(Bitwidth, 1) << (NumBits - 1); in getValueRange()
4973 Min = -Max; in getValueRange()
4980 //===----------------------------------------------------------------------===//
4982 //===----------------------------------------------------------------------===//
5012 R->setMayHaveOutOfDateDef(C.getLangOpts().Modules); in Create()
5023 R->setMayHaveOutOfDateDef(C.getLangOpts().Modules); in CreateDeserialized()
5028 return isImplicit() && getDeclName() && getDeclContext()->isRecord() && in isInjectedClassName()
5029 cast<RecordDecl>(getDeclContext())->getDeclName() == getDeclName(); in isInjectedClassName()
5034 return RD->isLambda(); in isLambda()
5051 for (const FieldDecl *FD : Def->fields()) { in isOrContainsUnion()
5052 const RecordType *RT = FD->getType()->getAs<RecordType>(); in isOrContainsUnion()
5053 if (RT && RT->getDecl()->isOrContainsUnion()) in isOrContainsUnion()
5067 return D->field_begin(); in field_begin()
5071 /// completeDefinition - Notes that the definition of this type is now
5091 /// isMsStruct - Get whether or not this record uses ms_struct layout.
5093 /// -mms-bitfields command-line option.
5100 LastDecl->NextInContextAndBits.setPointer(nullptr); in reorderDecls()
5113 Source->FindExternalLexicalDecls(this, [](Decl::Kind K) { in LoadFieldsFromExternalStorage()
5129 ExternalLast->NextInContextAndBits.setPointer(FirstDecl); in LoadFieldsFromExternalStorage()
5144 int ReasonToReject = -1; in mayInsertExtraPadding()
5145 if (!CXXRD || CXXRD->isExternCContext()) in mayInsertExtraPadding()
5147 else if (CXXRD->hasAttr<PackedAttr>()) in mayInsertExtraPadding()
5149 else if (CXXRD->isUnion()) in mayInsertExtraPadding()
5151 else if (CXXRD->isTriviallyCopyable()) in mayInsertExtraPadding()
5153 else if (CXXRD->hasTrivialDestructor()) in mayInsertExtraPadding()
5155 else if (CXXRD->isStandardLayout()) in mayInsertExtraPadding()
5158 "field-padding")) in mayInsertExtraPadding()
5161 EnabledAsanMask, getQualifiedNameAsString(), "field-padding")) in mayInsertExtraPadding()
5181 if (I->getIdentifier()) in findFirstNamedDataMember()
5184 if (const auto *RT = I->getType()->getAs<RecordType>()) in findFirstNamedDataMember()
5186 RT->getDecl()->findFirstNamedDataMember()) in findFirstNamedDataMember()
5207 //===----------------------------------------------------------------------===//
5209 //===----------------------------------------------------------------------===//
5224 // Zero params -> null pointer. in setParams()
5234 this->setCapturesCXXThis(CapturesCXXThis); in setCaptures()
5235 this->NumCaptures = Captures.size(); in setCaptures()
5238 this->Captures = nullptr; in setCaptures()
5242 this->Captures = Captures.copy(Context).data(); in setCaptures()
5255 return SourceRange(getLocation(), Body ? Body->getEndLoc() : getLocation()); in getSourceRange()
5258 //===----------------------------------------------------------------------===//
5260 //===----------------------------------------------------------------------===//
5272 Listener->AddedAnonymousNamespace(this, D); in setAnonymousNamespace()
5285 memcpy(PCD->getTrailingObjects<char>(), Arg.data(), Arg.size()); in Create()
5286 PCD->getTrailingObjects<char>()[Arg.size()] = '\0'; in Create()
5307 memcpy(PDMD->getTrailingObjects<char>(), Name.data(), Name.size()); in Create()
5308 PDMD->getTrailingObjects<char>()[Name.size()] = '\0'; in Create()
5309 memcpy(PDMD->getTrailingObjects<char>() + ValueStart, Value.data(), in Create()
5311 PDMD->getTrailingObjects<char>()[ValueStart + Value.size()] = '\0'; in Create()
5359 return MostRecent->hasAttr<WeakAttr>() || in isWeak()
5360 MostRecent->hasAttr<WeakRefAttr>() || isWeakImported(); in isWeak()
5365 return Var->isInitCapture(); in isInitCapture()
5398 New->setHasWrittenPrototype(hasWrittenPrototype); in Create()
5489 End = Init->getEndLoc(); in getSourceRange()
5505 if (auto *TT = getTypeSourceInfo()->getType()->getAs<TagType>()) { in getAnonDeclWithTypedefName()
5506 auto *OwningTypedef = TT->getDecl()->getTypedefNameForAnonDecl(); in getAnonDeclWithTypedefName()
5509 OwningTypedef = OwningTypedef->getCanonicalDecl(); in getAnonDeclWithTypedefName()
5510 ThisTypedef = ThisTypedef->getCanonicalDecl(); in getAnonDeclWithTypedefName()
5513 return TT->getDecl(); in getAnonDeclWithTypedefName()
5521 if (auto *TT = getUnderlyingType()->getAs<TagType>()) { in isTransparentTagSlow()
5522 if (auto *TD = TT->getDecl()) { in isTransparentTagSlow()
5523 if (TD->getName() != getName()) in isTransparentTagSlow()
5526 SourceLocation TDLoc = TD->getLocation(); in isTransparentTagSlow()
5563 if (typeIsPostfix(TInfo->getType())) in getSourceRange()
5564 RangeEnd = TInfo->getTypeLoc().getSourceRange().getEnd(); in getSourceRange()
5572 RangeEnd = TInfo->getTypeLoc().getSourceRange().getEnd(); in getSourceRange()
5597 SourceLocation Loc = Statement ? Statement->getBeginLoc() : SourceLocation(); in Create()
5610 return SourceRange(getLocation(), Statement->getEndLoc()); in getSourceRange()
5616 setLocation(Statement->getBeginLoc()); in setStmt()
5651 // FIXME: support nested buffers if required for back-compat. in Create()
5664 //===----------------------------------------------------------------------===//
5666 //===----------------------------------------------------------------------===//
5672 while (Mod->Parent) { in getNumModuleIdentifiers()
5673 Mod = Mod->Parent; in getNumModuleIdentifiers()
5711 Import->setImplicit(); in CreateImplicit()
5737 //===----------------------------------------------------------------------===//
5739 //===----------------------------------------------------------------------===//
5755 if (FD->hasAttr<ArmLocallyStreamingAttr>()) in IsArmStreamingFunction()
5758 if (const Type *Ty = FD->getType().getTypePtrOrNull()) in IsArmStreamingFunction()
5759 if (const auto *FPT = Ty->getAs<FunctionProtoType>()) in IsArmStreamingFunction()
5760 if (FPT->getAArch64SMEAttributes() & in IsArmStreamingFunction()