57#include "llvm/ADT/ArrayRef.h"
58#include "llvm/ADT/DenseMap.h"
59#include "llvm/ADT/STLExtras.h"
60#include "llvm/ADT/ScopeExit.h"
61#include "llvm/ADT/SmallVector.h"
62#include "llvm/Support/ErrorHandling.h"
63#include "llvm/Support/MemoryBuffer.h"
74 using llvm::make_error;
89 return "NameConflict";
91 return "UnsupportedConstruct";
93 return "Unknown error";
95 llvm_unreachable(
"Invalid error code.");
96 return "Invalid error code.";
102 llvm_unreachable(
"Function not implemented.");
113 Redecls.push_back(R);
116 std::reverse(Redecls.begin(), Redecls.end());
121 if (
auto *FD = dyn_cast<FunctionDecl>(D))
123 if (
auto *VD = dyn_cast<VarDecl>(D))
125 if (
auto *TD = dyn_cast<TagDecl>(D))
127 llvm_unreachable(
"Bad declaration kind");
148 bool const IgnoreChildErrors;
152 : FromDC(FromDC), IgnoreChildErrors(!
isa<
TagDecl>(FromDC)) {}
162 if (ChildErr && !IgnoreChildErrors)
163 ResultErr = joinErrors(std::move(ResultErr), std::move(ChildErr));
165 consumeError(std::move(ChildErr));
171 if (!IgnoreChildErrors || !FromDC)
173 return FromDC->containsDecl(FromChildD);
179 public StmtVisitor<ASTNodeImporter, ExpectedStmt> {
183 template <
typename ImportT>
184 [[nodiscard]]
Error importInto(ImportT &To,
const ImportT &From) {
185 return Importer.importInto(To, From);
189 template <
typename ImportT>
190 [[nodiscard]]
Error importInto(ImportT *&To, ImportT *From) {
191 auto ToOrErr = Importer.Import(From);
193 To = cast_or_null<ImportT>(*ToOrErr);
194 return ToOrErr.takeError();
199 template <
typename T>
203 auto ToOrErr = Importer.Import(From);
205 return ToOrErr.takeError();
206 return cast_or_null<T>(*ToOrErr);
209 template <
typename T>
210 auto import(
const T *From) {
211 return import(
const_cast<T *
>(From));
215 template <
typename T>
217 return Importer.Import(From);
221 template <
typename T>
225 return import(*From);
232 template <
typename ToDeclT>
struct CallOverloadedCreateFun {
233 template <
typename... Args>
decltype(
auto)
operator()(Args &&... args) {
234 return ToDeclT::Create(std::forward<Args>(args)...);
244 template <
typename ToDeclT,
typename FromDeclT,
typename... Args>
245 [[nodiscard]]
bool GetImportedOrCreateDecl(ToDeclT *&ToD, FromDeclT *FromD,
250 CallOverloadedCreateFun<ToDeclT> OC;
251 return GetImportedOrCreateSpecialDecl(ToD, OC, FromD,
252 std::forward<Args>(args)...);
259 template <
typename NewDeclT,
typename ToDeclT,
typename FromDeclT,
261 [[nodiscard]]
bool GetImportedOrCreateDecl(ToDeclT *&ToD, FromDeclT *FromD,
263 CallOverloadedCreateFun<NewDeclT> OC;
264 return GetImportedOrCreateSpecialDecl(ToD, OC, FromD,
265 std::forward<Args>(args)...);
269 template <
typename ToDeclT,
typename CreateFunT,
typename FromDeclT,
272 GetImportedOrCreateSpecialDecl(ToDeclT *&ToD, CreateFunT CreateFun,
273 FromDeclT *FromD, Args &&...args) {
274 if (Importer.getImportDeclErrorIfAny(FromD)) {
278 ToD = cast_or_null<ToDeclT>(Importer.GetAlreadyImportedOrNull(FromD));
281 ToD = CreateFun(std::forward<Args>(args)...);
283 Importer.RegisterImportedDecl(FromD, ToD);
284 Importer.SharedState->markAsNewDecl(ToD);
285 InitializeImportedDecl(FromD, ToD);
289 void InitializeImportedDecl(
Decl *FromD,
Decl *ToD) {
293 if (FromD->isImplicit())
307 void addDeclToContexts(
Decl *FromD,
Decl *ToD) {
308 if (Importer.isMinimalImport()) {
312 if (!FromD->getDescribedTemplate() &&
319 DeclContext *FromLexicalDC = FromD->getLexicalDeclContext();
323 bool Visible =
false;
336 if (
auto *FromNamed = dyn_cast<NamedDecl>(FromD)) {
339 FromDC->
lookup(FromNamed->getDeclName());
340 if (llvm::is_contained(FromLookup, FromNamed))
353 LT->update(TP, OldDC);
357 updateLookupTableForTemplateParameters(
358 Params, Importer.getToContext().getTranslationUnitDecl());
361 template <
typename TemplateParmDeclT>
362 Error importTemplateParameterDefaultArgument(
const TemplateParmDeclT *D,
363 TemplateParmDeclT *ToD) {
364 if (D->hasDefaultArgument()) {
365 if (D->defaultArgumentWasInherited()) {
367 import(D->getDefaultArgStorage().getInheritedFrom());
368 if (!ToInheritedFromOrErr)
369 return ToInheritedFromOrErr.takeError();
370 TemplateParmDeclT *ToInheritedFrom = *ToInheritedFromOrErr;
371 if (!ToInheritedFrom->hasDefaultArgument()) {
375 import(D->getDefaultArgStorage()
377 ->getDefaultArgument());
378 if (!ToInheritedDefaultArgOrErr)
379 return ToInheritedDefaultArgOrErr.takeError();
380 ToInheritedFrom->setDefaultArgument(Importer.getToContext(),
381 *ToInheritedDefaultArgOrErr);
383 ToD->setInheritedDefaultArgument(ToD->getASTContext(),
387 import(D->getDefaultArgument());
388 if (!ToDefaultArgOrErr)
389 return ToDefaultArgOrErr.takeError();
392 if (!ToD->hasDefaultArgument())
393 ToD->setDefaultArgument(Importer.getToContext(),
397 return Error::success();
409#define TYPE(Class, Base) \
410 ExpectedType Visit##Class##Type(const Class##Type *T);
411#include "clang/AST/TypeNodes.inc"
448 (IDK ==
IDK_Default && !Importer.isMinimalImport());
469 template <
typename InContainerTy>
473 template<
typename InContainerTy>
480 std::tuple<FunctionTemplateDecl *, TemplateArgsTy>;
485 template <
typename DeclTy>
509 template <
typename T>
513 bool IgnoreTemplateParmDepth =
false);
710 Err = MaybeVal.takeError();
716 template<
typename IIter,
typename OIter>
718 using ItemT = std::remove_reference_t<
decltype(*Obegin)>;
719 for (; Ibegin != Iend; ++Ibegin, ++Obegin) {
722 return ToOrErr.takeError();
725 return Error::success();
732 template<
typename InContainerTy,
typename OutContainerTy>
734 const InContainerTy &InContainer, OutContainerTy &OutContainer) {
736 InContainer.begin(), InContainer.end(), OutContainer.begin());
739 template<
typename InContainerTy,
typename OIter>
756template <
typename InContainerTy>
760 auto ToLAngleLocOrErr =
import(FromLAngleLoc);
761 if (!ToLAngleLocOrErr)
762 return ToLAngleLocOrErr.takeError();
763 auto ToRAngleLocOrErr =
import(FromRAngleLoc);
764 if (!ToRAngleLocOrErr)
765 return ToRAngleLocOrErr.takeError();
771 return Error::success();
787 From.LAngleLoc, From.RAngleLoc, From.arguments(),
Result);
799 if (
Error Err = importInto(std::get<0>(
Result), FTSInfo->getTemplate()))
800 return std::move(Err);
805 return std::move(Err);
815 return std::move(Err);
818 if (!ToRequiresClause)
819 return ToRequiresClause.takeError();
822 if (!ToTemplateLocOrErr)
823 return ToTemplateLocOrErr.takeError();
825 if (!ToLAngleLocOrErr)
826 return ToLAngleLocOrErr.takeError();
828 if (!ToRAngleLocOrErr)
829 return ToRAngleLocOrErr.takeError();
832 Importer.getToContext(),
850 return ToTypeOrErr.takeError();
858 return ToTypeOrErr.takeError();
865 return ToOrErr.takeError();
868 return ToTypeOrErr.takeError();
869 return TemplateArgument(dyn_cast<ValueDecl>((*ToOrErr)->getCanonicalDecl()),
876 return ToTypeOrErr.takeError();
884 return ToTypeOrErr.takeError();
887 return ToValueOrErr.takeError();
894 if (!ToTemplateOrErr)
895 return ToTemplateOrErr.takeError();
903 if (!ToTemplateOrErr)
904 return ToTemplateOrErr.takeError();
915 return ToExpr.takeError();
921 return std::move(Err);
927 llvm_unreachable(
"Invalid template argument kind");
935 return ArgOrErr.takeError();
944 return E.takeError();
950 return TSIOrErr.takeError();
953 if (!ToTemplateKWLocOrErr)
954 return ToTemplateKWLocOrErr.takeError();
956 if (!ToTemplateQualifierLocOrErr)
957 return ToTemplateQualifierLocOrErr.takeError();
959 if (!ToTemplateNameLocOrErr)
960 return ToTemplateNameLocOrErr.takeError();
961 auto ToTemplateEllipsisLocOrErr =
963 if (!ToTemplateEllipsisLocOrErr)
964 return ToTemplateEllipsisLocOrErr.takeError();
966 Importer.getToContext(), *ToTemplateKWLocOrErr,
967 *ToTemplateQualifierLocOrErr, *ToTemplateNameLocOrErr,
968 *ToTemplateEllipsisLocOrErr);
978 size_t NumDecls = DG.
end() - DG.
begin();
980 ToDecls.reserve(NumDecls);
981 for (
Decl *FromD : DG) {
982 if (
auto ToDOrErr =
import(FromD))
983 ToDecls.push_back(*ToDOrErr);
985 return ToDOrErr.takeError();
1000 return ToDotLocOrErr.takeError();
1003 if (!ToFieldLocOrErr)
1004 return ToFieldLocOrErr.takeError();
1007 ToFieldName, *ToDotLocOrErr, *ToFieldLocOrErr);
1011 if (!ToLBracketLocOrErr)
1012 return ToLBracketLocOrErr.takeError();
1015 if (!ToRBracketLocOrErr)
1016 return ToRBracketLocOrErr.takeError();
1020 *ToLBracketLocOrErr,
1021 *ToRBracketLocOrErr);
1024 if (!ToEllipsisLocOrErr)
1025 return ToEllipsisLocOrErr.takeError();
1029 D.
getArrayIndex(), *ToLBracketLocOrErr, *ToEllipsisLocOrErr,
1030 *ToRBracketLocOrErr);
1035 Error Err = Error::success();
1038 auto ToConceptNameLoc =
1044 return std::move(Err);
1047 if (ASTTemplateArgs)
1049 return std::move(Err);
1051 Importer.getToContext(), ToNNS, ToTemplateKWLoc,
1055 Importer.getToContext(), ToTAInfo)
1061 char *ToStore =
new (Importer.getToContext())
char[FromStr.size()];
1062 std::copy(FromStr.begin(), FromStr.end(), ToStore);
1063 return StringRef(ToStore, FromStr.size());
1075 return ToSecondExpr.takeError();
1076 ToSat.
Details.emplace_back(ToSecondExpr.get());
1083 return ToPairFirst.takeError();
1085 ToSat.
Details.emplace_back(
new (Importer.getToContext())
1087 ToPairFirst.get(), ToPairSecond});
1091 return Error::success();
1096ASTNodeImporter::import(
1101 return ToLoc.takeError();
1103 return new (Importer.getToContext())
1115 return DiagOrErr.takeError();
1116 return new (Importer.getToContext()) TypeRequirement(*DiagOrErr);
1120 return ToType.takeError();
1121 return new (Importer.getToContext()) TypeRequirement(*ToType);
1129 bool IsRKSimple = From->
getKind() == Requirement::RK_Simple;
1132 std::optional<ExprRequirement::ReturnTypeRequirement> Req;
1138 const ExprRequirement::ReturnTypeRequirement &FromTypeRequirement =
1141 if (FromTypeRequirement.isTypeConstraint()) {
1142 const bool IsDependent = FromTypeRequirement.isDependent();
1144 import(FromTypeRequirement.getTypeConstraintTemplateParameterList());
1146 return ParamsOrErr.takeError();
1147 if (Status >= ExprRequirement::SS_ConstraintsNotSatisfied) {
1148 auto SubstConstraintExprOrErr =
1150 if (!SubstConstraintExprOrErr)
1151 return SubstConstraintExprOrErr.takeError();
1152 SubstitutedConstraintExpr = SubstConstraintExprOrErr.get();
1154 Req.emplace(ParamsOrErr.get(), IsDependent);
1155 }
else if (FromTypeRequirement.isSubstitutionFailure()) {
1156 auto DiagOrErr =
import(FromTypeRequirement.getSubstitutionDiagnostic());
1158 return DiagOrErr.takeError();
1159 Req.emplace(DiagOrErr.get());
1166 if (!NoexceptLocOrErr)
1167 return NoexceptLocOrErr.takeError();
1169 if (Status == ExprRequirement::SS_ExprSubstitutionFailure) {
1172 return DiagOrErr.takeError();
1173 return new (Importer.getToContext()) ExprRequirement(
1174 *DiagOrErr, IsRKSimple, *NoexceptLocOrErr, std::move(*Req));
1178 return ExprOrErr.takeError();
1180 *ExprOrErr, IsRKSimple, *NoexceptLocOrErr, std::move(*Req), Status,
1181 SubstitutedConstraintExpr);
1196 return new (Importer.getToContext())
1197 NestedRequirement(ToEntity, ToSatisfaction);
1201 return ToExpr.takeError();
1202 if (ToExpr.get()->isInstantiationDependent()) {
1203 return new (Importer.getToContext()) NestedRequirement(ToExpr.get());
1208 return std::move(Err);
1209 return new (Importer.getToContext()) NestedRequirement(
1210 Importer.getToContext(), ToExpr.get(), Satisfaction);
1218 switch (FromRequire->
getKind()) {
1228 llvm_unreachable(
"Unhandled requirement kind");
1238 return VarOrErr.takeError();
1243 return LocationOrErr.takeError();
1248 return std::move(Err);
1255template <
typename T>
1257 if (
Found->getLinkageInternal() != From->getLinkageInternal())
1260 if (From->hasExternalFormalLinkage())
1261 return Found->hasExternalFormalLinkage();
1262 if (Importer.GetFromTU(
Found) != From->getTranslationUnitDecl())
1264 if (From->isInAnonymousNamespace())
1265 return Found->isInAnonymousNamespace();
1267 return !
Found->isInAnonymousNamespace() &&
1268 !
Found->hasExternalFormalLinkage();
1288using namespace clang;
1291 Importer.FromDiag(
SourceLocation(), diag::err_unsupported_ast_node)
1292 <<
T->getTypeClassName();
1297 ExpectedType UnderlyingTypeOrErr =
import(
T->getValueType());
1298 if (!UnderlyingTypeOrErr)
1299 return UnderlyingTypeOrErr.takeError();
1305 switch (
T->getKind()) {
1306#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
1307 case BuiltinType::Id: \
1308 return Importer.getToContext().SingletonId;
1309#include "clang/Basic/OpenCLImageTypes.def"
1310#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
1311 case BuiltinType::Id: \
1312 return Importer.getToContext().Id##Ty;
1313#include "clang/Basic/OpenCLExtensionTypes.def"
1314#define SVE_TYPE(Name, Id, SingletonId) \
1315 case BuiltinType::Id: \
1316 return Importer.getToContext().SingletonId;
1317#include "clang/Basic/AArch64ACLETypes.def"
1318#define PPC_VECTOR_TYPE(Name, Id, Size) \
1319 case BuiltinType::Id: \
1320 return Importer.getToContext().Id##Ty;
1321#include "clang/Basic/PPCTypes.def"
1322#define RVV_TYPE(Name, Id, SingletonId) \
1323 case BuiltinType::Id: \
1324 return Importer.getToContext().SingletonId;
1325#include "clang/Basic/RISCVVTypes.def"
1326#define WASM_TYPE(Name, Id, SingletonId) \
1327 case BuiltinType::Id: \
1328 return Importer.getToContext().SingletonId;
1329#include "clang/Basic/WebAssemblyReferenceTypes.def"
1330#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) \
1331 case BuiltinType::Id: \
1332 return Importer.getToContext().SingletonId;
1333#include "clang/Basic/AMDGPUTypes.def"
1334#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \
1335 case BuiltinType::Id: \
1336 return Importer.getToContext().SingletonId;
1337#include "clang/Basic/HLSLIntangibleTypes.def"
1338#define SHARED_SINGLETON_TYPE(Expansion)
1339#define BUILTIN_TYPE(Id, SingletonId) \
1340 case BuiltinType::Id: return Importer.getToContext().SingletonId;
1341#include "clang/AST/BuiltinTypes.def"
1349 case BuiltinType::Char_U:
1358 case BuiltinType::Char_S:
1367 case BuiltinType::WChar_S:
1368 case BuiltinType::WChar_U:
1374 llvm_unreachable(
"Invalid BuiltinType Kind!");
1378 ExpectedType ToOriginalTypeOrErr =
import(
T->getOriginalType());
1379 if (!ToOriginalTypeOrErr)
1380 return ToOriginalTypeOrErr.takeError();
1382 return Importer.getToContext().getDecayedType(*ToOriginalTypeOrErr);
1386 ExpectedType ToElementTypeOrErr =
import(
T->getElementType());
1387 if (!ToElementTypeOrErr)
1388 return ToElementTypeOrErr.takeError();
1390 return Importer.getToContext().getComplexType(*ToElementTypeOrErr);
1395 if (!ToPointeeTypeOrErr)
1396 return ToPointeeTypeOrErr.takeError();
1398 return Importer.getToContext().getPointerType(*ToPointeeTypeOrErr);
1404 if (!ToPointeeTypeOrErr)
1405 return ToPointeeTypeOrErr.takeError();
1407 return Importer.getToContext().getBlockPointerType(*ToPointeeTypeOrErr);
1413 ExpectedType ToPointeeTypeOrErr =
import(
T->getPointeeTypeAsWritten());
1414 if (!ToPointeeTypeOrErr)
1415 return ToPointeeTypeOrErr.takeError();
1417 return Importer.getToContext().getLValueReferenceType(*ToPointeeTypeOrErr);
1423 ExpectedType ToPointeeTypeOrErr =
import(
T->getPointeeTypeAsWritten());
1424 if (!ToPointeeTypeOrErr)
1425 return ToPointeeTypeOrErr.takeError();
1427 return Importer.getToContext().getRValueReferenceType(*ToPointeeTypeOrErr);
1434 if (!ToPointeeTypeOrErr)
1435 return ToPointeeTypeOrErr.takeError();
1437 auto QualifierOrErr =
import(
T->getQualifier());
1438 if (!QualifierOrErr)
1439 return QualifierOrErr.takeError();
1441 auto ClsOrErr =
import(
T->getMostRecentCXXRecordDecl());
1443 return ClsOrErr.takeError();
1445 return Importer.getToContext().getMemberPointerType(
1446 *ToPointeeTypeOrErr, *QualifierOrErr, *ClsOrErr);
1451 Error Err = Error::success();
1455 return std::move(Err);
1457 return Importer.getToContext().getConstantArrayType(
1458 ToElementType,
T->getSize(), ToSizeExpr,
T->getSizeModifier(),
1459 T->getIndexTypeCVRQualifiers());
1465 if (!ToArrayTypeOrErr)
1466 return ToArrayTypeOrErr.takeError();
1468 return Importer.getToContext().getArrayParameterType(*ToArrayTypeOrErr);
1473 ExpectedType ToElementTypeOrErr =
import(
T->getElementType());
1474 if (!ToElementTypeOrErr)
1475 return ToElementTypeOrErr.takeError();
1477 return Importer.getToContext().getIncompleteArrayType(*ToElementTypeOrErr,
1478 T->getSizeModifier(),
1479 T->getIndexTypeCVRQualifiers());
1484 Error Err = Error::success();
1485 QualType ToElementType =
importChecked(Err,
T->getElementType());
1488 return std::move(Err);
1489 return Importer.getToContext().getVariableArrayType(
1490 ToElementType, ToSizeExpr,
T->getSizeModifier(),
1491 T->getIndexTypeCVRQualifiers());
1494ExpectedType ASTNodeImporter::VisitDependentSizedArrayType(
1496 Error Err = Error::success();
1497 QualType ToElementType =
importChecked(Err,
T->getElementType());
1500 return std::move(Err);
1504 return Importer.getToContext().getDependentSizedArrayType(
1505 ToElementType, ToSizeExpr,
T->getSizeModifier(),
1506 T->getIndexTypeCVRQualifiers());
1509ExpectedType ASTNodeImporter::VisitDependentSizedExtVectorType(
1511 Error Err = Error::success();
1512 QualType ToElementType =
importChecked(Err,
T->getElementType());
1514 SourceLocation ToAttrLoc =
importChecked(Err,
T->getAttributeLoc());
1516 return std::move(Err);
1517 return Importer.getToContext().getDependentSizedExtVectorType(
1518 ToElementType, ToSizeExpr, ToAttrLoc);
1522 ExpectedType ToElementTypeOrErr =
import(
T->getElementType());
1523 if (!ToElementTypeOrErr)
1524 return ToElementTypeOrErr.takeError();
1526 return Importer.getToContext().getVectorType(*ToElementTypeOrErr,
1527 T->getNumElements(),
1528 T->getVectorKind());
1532 ExpectedType ToElementTypeOrErr =
import(
T->getElementType());
1533 if (!ToElementTypeOrErr)
1534 return ToElementTypeOrErr.takeError();
1536 return Importer.getToContext().getExtVectorType(*ToElementTypeOrErr,
1537 T->getNumElements());
1545 if (!ToReturnTypeOrErr)
1546 return ToReturnTypeOrErr.takeError();
1548 return Importer.getToContext().getFunctionNoProtoType(*ToReturnTypeOrErr,
1555 if (!ToReturnTypeOrErr)
1556 return ToReturnTypeOrErr.takeError();
1559 SmallVector<QualType, 4> ArgTypes;
1563 return TyOrErr.takeError();
1564 ArgTypes.push_back(*TyOrErr);
1568 SmallVector<QualType, 4> ExceptionTypes;
1572 return TyOrErr.takeError();
1573 ExceptionTypes.push_back(*TyOrErr);
1577 Error Err = Error::success();
1578 FunctionProtoType::ExtProtoInfo ToEPI;
1594 return std::move(Err);
1596 return Importer.getToContext().getFunctionType(
1597 *ToReturnTypeOrErr, ArgTypes, ToEPI);
1602 Error Err = Error::success();
1606 return std::move(Err);
1609 return Importer.getToContext().getCanonicalUnresolvedUsingType(ToD);
1610 return Importer.getToContext().getUnresolvedUsingType(
T->getKeyword(),
1616 if (!ToInnerTypeOrErr)
1617 return ToInnerTypeOrErr.takeError();
1619 return Importer.getToContext().getParenType(*ToInnerTypeOrErr);
1623ASTNodeImporter::VisitPackIndexingType(clang::PackIndexingType
const *
T) {
1627 return Pattern.takeError();
1630 return Index.takeError();
1631 return Importer.getToContext().getPackIndexingType(*Pattern, *Index);
1635 Expected<TypedefNameDecl *> ToDeclOrErr =
import(
T->getDecl());
1637 return ToDeclOrErr.takeError();
1639 auto ToQualifierOrErr =
import(
T->getQualifier());
1640 if (!ToQualifierOrErr)
1641 return ToQualifierOrErr.takeError();
1644 T->typeMatchesDecl() ? QualType() : import(
T->desugar());
1645 if (!ToUnderlyingTypeOrErr)
1646 return ToUnderlyingTypeOrErr.takeError();
1648 return Importer.getToContext().getTypedefType(
1649 T->getKeyword(), *ToQualifierOrErr, *ToDeclOrErr, *ToUnderlyingTypeOrErr);
1655 return ToExprOrErr.takeError();
1656 return Importer.getToContext().getTypeOfExprType(*ToExprOrErr,
T->getKind());
1659ExpectedType ASTNodeImporter::VisitTypeOfType(
const TypeOfType *
T) {
1660 ExpectedType ToUnderlyingTypeOrErr =
import(
T->getUnmodifiedType());
1661 if (!ToUnderlyingTypeOrErr)
1662 return ToUnderlyingTypeOrErr.takeError();
1663 return Importer.getToContext().getTypeOfType(*ToUnderlyingTypeOrErr,
1668 Error Err = Error::success();
1673 return std::move(Err);
1674 return Importer.getToContext().getUsingType(
T->getKeyword(), ToQualifier, ToD,
1678ExpectedType ASTNodeImporter::VisitDecltypeType(
const DecltypeType *
T) {
1682 return ToExprOrErr.takeError();
1684 ExpectedType ToUnderlyingTypeOrErr =
import(
T->getUnderlyingType());
1685 if (!ToUnderlyingTypeOrErr)
1686 return ToUnderlyingTypeOrErr.takeError();
1688 return Importer.getToContext().getDecltypeType(
1689 *ToExprOrErr, *ToUnderlyingTypeOrErr);
1693ASTNodeImporter::VisitUnaryTransformType(
const UnaryTransformType *
T) {
1695 if (!ToBaseTypeOrErr)
1696 return ToBaseTypeOrErr.takeError();
1698 ExpectedType ToUnderlyingTypeOrErr =
import(
T->getUnderlyingType());
1699 if (!ToUnderlyingTypeOrErr)
1700 return ToUnderlyingTypeOrErr.takeError();
1702 return Importer.getToContext().getUnaryTransformType(
1703 *ToBaseTypeOrErr, *ToUnderlyingTypeOrErr,
T->getUTTKind());
1706ExpectedType ASTNodeImporter::VisitAutoType(
const AutoType *
T) {
1708 ExpectedType ToDeducedTypeOrErr =
import(
T->getDeducedType());
1709 if (!ToDeducedTypeOrErr)
1710 return ToDeducedTypeOrErr.takeError();
1712 ExpectedDecl ToTypeConstraintConcept =
import(
T->getTypeConstraintConcept());
1713 if (!ToTypeConstraintConcept)
1714 return ToTypeConstraintConcept.takeError();
1716 SmallVector<TemplateArgument, 2> ToTemplateArgs;
1719 return std::move(Err);
1721 return Importer.getToContext().getAutoType(
1722 *ToDeducedTypeOrErr,
T->getKeyword(),
false,
1723 false, cast_or_null<ConceptDecl>(*ToTypeConstraintConcept),
1727ExpectedType ASTNodeImporter::VisitDeducedTemplateSpecializationType(
1728 const DeducedTemplateSpecializationType *
T) {
1730 Expected<TemplateName> ToTemplateNameOrErr =
import(
T->getTemplateName());
1731 if (!ToTemplateNameOrErr)
1732 return ToTemplateNameOrErr.takeError();
1733 ExpectedType ToDeducedTypeOrErr =
import(
T->getDeducedType());
1734 if (!ToDeducedTypeOrErr)
1735 return ToDeducedTypeOrErr.takeError();
1737 return Importer.getToContext().getDeducedTemplateSpecializationType(
1738 T->getKeyword(), *ToTemplateNameOrErr, *ToDeducedTypeOrErr,
1742ExpectedType ASTNodeImporter::VisitTagType(
const TagType *
T) {
1743 TagDecl *DeclForType =
T->getDecl();
1744 Expected<TagDecl *> ToDeclOrErr =
import(DeclForType);
1746 return ToDeclOrErr.takeError();
1752 Expected<TagDecl *> ToDefDeclOrErr =
import(DeclForType->
getDefinition());
1753 if (!ToDefDeclOrErr)
1754 return ToDefDeclOrErr.takeError();
1757 return Importer.getToContext().getCanonicalTagType(*ToDeclOrErr);
1759 auto ToQualifierOrErr =
import(
T->getQualifier());
1760 if (!ToQualifierOrErr)
1761 return ToQualifierOrErr.takeError();
1763 return Importer.getToContext().getTagType(
T->getKeyword(), *ToQualifierOrErr,
1764 *ToDeclOrErr,
T->isTagOwned());
1767ExpectedType ASTNodeImporter::VisitEnumType(
const EnumType *
T) {
1768 return VisitTagType(
T);
1771ExpectedType ASTNodeImporter::VisitRecordType(
const RecordType *
T) {
1772 return VisitTagType(
T);
1776ASTNodeImporter::VisitInjectedClassNameType(
const InjectedClassNameType *
T) {
1777 return VisitTagType(
T);
1780ExpectedType ASTNodeImporter::VisitAttributedType(
const AttributedType *
T) {
1781 ExpectedType ToModifiedTypeOrErr =
import(
T->getModifiedType());
1782 if (!ToModifiedTypeOrErr)
1783 return ToModifiedTypeOrErr.takeError();
1784 ExpectedType ToEquivalentTypeOrErr =
import(
T->getEquivalentType());
1785 if (!ToEquivalentTypeOrErr)
1786 return ToEquivalentTypeOrErr.takeError();
1788 return Importer.getToContext().getAttributedType(
1789 T->getAttrKind(), *ToModifiedTypeOrErr, *ToEquivalentTypeOrErr,
1796 if (!ToWrappedTypeOrErr)
1797 return ToWrappedTypeOrErr.takeError();
1799 Error Err = Error::success();
1802 SmallVector<TypeCoupledDeclRefInfo, 1> CoupledDecls;
1803 for (
const TypeCoupledDeclRefInfo &TI :
T->dependent_decls()) {
1804 Expected<ValueDecl *> ToDeclOrErr =
import(TI.getDecl());
1806 return ToDeclOrErr.takeError();
1807 CoupledDecls.emplace_back(*ToDeclOrErr, TI.isDeref());
1810 return Importer.getToContext().getCountAttributedType(
1811 *ToWrappedTypeOrErr, CountExpr,
T->isCountInBytes(),
T->isOrNull(),
1812 ArrayRef(CoupledDecls));
1815ExpectedType ASTNodeImporter::VisitTemplateTypeParmType(
1816 const TemplateTypeParmType *
T) {
1817 Expected<TemplateTypeParmDecl *> ToDeclOrErr =
import(
T->getDecl());
1819 return ToDeclOrErr.takeError();
1821 return Importer.getToContext().getTemplateTypeParmType(
1822 T->getDepth(),
T->getIndex(),
T->isParameterPack(), *ToDeclOrErr);
1825ExpectedType ASTNodeImporter::VisitSubstTemplateTypeParmType(
1826 const SubstTemplateTypeParmType *
T) {
1827 Expected<Decl *> ReplacedOrErr =
import(
T->getAssociatedDecl());
1829 return ReplacedOrErr.takeError();
1831 ExpectedType ToReplacementTypeOrErr =
import(
T->getReplacementType());
1832 if (!ToReplacementTypeOrErr)
1833 return ToReplacementTypeOrErr.takeError();
1835 return Importer.getToContext().getSubstTemplateTypeParmType(
1836 *ToReplacementTypeOrErr, *ReplacedOrErr,
T->getIndex(),
T->getPackIndex(),
1840ExpectedType ASTNodeImporter::VisitSubstTemplateTypeParmPackType(
1841 const SubstTemplateTypeParmPackType *
T) {
1842 Expected<Decl *> ReplacedOrErr =
import(
T->getAssociatedDecl());
1844 return ReplacedOrErr.takeError();
1846 Expected<TemplateArgument> ToArgumentPack =
import(
T->getArgumentPack());
1847 if (!ToArgumentPack)
1848 return ToArgumentPack.takeError();
1850 return Importer.getToContext().getSubstTemplateTypeParmPackType(
1851 *ReplacedOrErr,
T->getIndex(),
T->getFinal(), *ToArgumentPack);
1854ExpectedType ASTNodeImporter::VisitSubstBuiltinTemplatePackType(
1855 const SubstBuiltinTemplatePackType *
T) {
1856 Expected<TemplateArgument> ToArgumentPack =
import(
T->getArgumentPack());
1857 if (!ToArgumentPack)
1858 return ToArgumentPack.takeError();
1859 return Importer.getToContext().getSubstBuiltinTemplatePack(*ToArgumentPack);
1862ExpectedType ASTNodeImporter::VisitTemplateSpecializationType(
1863 const TemplateSpecializationType *
T) {
1864 auto ToTemplateOrErr =
import(
T->getTemplateName());
1865 if (!ToTemplateOrErr)
1866 return ToTemplateOrErr.takeError();
1868 SmallVector<TemplateArgument, 2> ToTemplateArgs;
1871 return std::move(Err);
1875 if (!ToUnderlyingOrErr)
1876 return ToUnderlyingOrErr.takeError();
1877 return Importer.getToContext().getTemplateSpecializationType(
1878 T->getKeyword(), *ToTemplateOrErr, ToTemplateArgs, {},
1879 *ToUnderlyingOrErr);
1883ASTNodeImporter::VisitPackExpansionType(
const PackExpansionType *
T) {
1885 if (!ToPatternOrErr)
1886 return ToPatternOrErr.takeError();
1888 return Importer.getToContext().getPackExpansionType(*ToPatternOrErr,
1889 T->getNumExpansions(),
1894ASTNodeImporter::VisitDependentNameType(
const DependentNameType *
T) {
1895 auto ToQualifierOrErr =
import(
T->getQualifier());
1896 if (!ToQualifierOrErr)
1897 return ToQualifierOrErr.takeError();
1899 IdentifierInfo *Name = Importer.Import(
T->getIdentifier());
1900 return Importer.getToContext().getDependentNameType(
T->getKeyword(),
1901 *ToQualifierOrErr, Name);
1906 Expected<ObjCInterfaceDecl *> ToDeclOrErr =
import(
T->getDecl());
1908 return ToDeclOrErr.takeError();
1910 return Importer.getToContext().getObjCInterfaceType(*ToDeclOrErr);
1913ExpectedType ASTNodeImporter::VisitObjCObjectType(
const ObjCObjectType *
T) {
1915 if (!ToBaseTypeOrErr)
1916 return ToBaseTypeOrErr.takeError();
1918 SmallVector<QualType, 4> TypeArgs;
1919 for (
auto TypeArg :
T->getTypeArgsAsWritten()) {
1921 TypeArgs.push_back(*TyOrErr);
1923 return TyOrErr.takeError();
1926 SmallVector<ObjCProtocolDecl *, 4> Protocols;
1927 for (
auto *
P :
T->quals()) {
1928 if (Expected<ObjCProtocolDecl *> ProtocolOrErr =
import(
P))
1929 Protocols.push_back(*ProtocolOrErr);
1931 return ProtocolOrErr.takeError();
1935 return Importer.getToContext().getObjCObjectType(*ToBaseTypeOrErr, TypeArgs,
1937 T->isKindOfTypeAsWritten());
1943 if (!ToPointeeTypeOrErr)
1944 return ToPointeeTypeOrErr.takeError();
1946 return Importer.getToContext().getObjCObjectPointerType(*ToPointeeTypeOrErr);
1951 ExpectedType ToUnderlyingTypeOrErr =
import(
T->getUnderlyingType());
1952 if (!ToUnderlyingTypeOrErr)
1953 return ToUnderlyingTypeOrErr.takeError();
1955 IdentifierInfo *ToIdentifier = Importer.Import(
T->getMacroIdentifier());
1956 return Importer.getToContext().getMacroQualifiedType(*ToUnderlyingTypeOrErr,
1961 Error Err = Error::success();
1962 QualType ToOriginalType = importChecked(Err,
T->getOriginalType());
1963 QualType ToAdjustedType = importChecked(Err,
T->getAdjustedType());
1965 return std::move(Err);
1967 return Importer.getToContext().getAdjustedType(ToOriginalType,
1972 return Importer.getToContext().getBitIntType(
T->isUnsigned(),
1976ExpectedType clang::ASTNodeImporter::VisitBTFTagAttributedType(
1977 const clang::BTFTagAttributedType *
T) {
1978 Error Err = Error::success();
1979 const BTFTypeTagAttr *ToBTFAttr = importChecked(Err,
T->getAttr());
1980 QualType ToWrappedType = importChecked(Err,
T->getWrappedType());
1982 return std::move(Err);
1984 return Importer.getToContext().getBTFTagAttributedType(ToBTFAttr,
1988ExpectedType clang::ASTNodeImporter::VisitHLSLAttributedResourceType(
1989 const clang::HLSLAttributedResourceType *
T) {
1990 Error Err = Error::success();
1991 const HLSLAttributedResourceType::Attributes &ToAttrs =
T->getAttrs();
1992 QualType ToWrappedType = importChecked(Err,
T->getWrappedType());
1993 QualType ToContainedType = importChecked(Err,
T->getContainedType());
1995 return std::move(Err);
1997 return Importer.getToContext().getHLSLAttributedResourceType(
1998 ToWrappedType, ToContainedType, ToAttrs);
2001ExpectedType clang::ASTNodeImporter::VisitHLSLInlineSpirvType(
2002 const clang::HLSLInlineSpirvType *
T) {
2003 Error Err = Error::success();
2007 uint32_t ToAlignment =
T->getAlignment();
2011 for (
auto &Operand :
T->getOperands()) {
2012 using SpirvOperandKind = SpirvOperand::SpirvOperandKind;
2015 case SpirvOperandKind::ConstantId:
2016 ToOperands.push_back(SpirvOperand::createConstant(
2017 importChecked(Err,
Operand.getResultType()),
Operand.getValue()));
2019 case SpirvOperandKind::Literal:
2020 ToOperands.push_back(SpirvOperand::createLiteral(
Operand.getValue()));
2022 case SpirvOperandKind::TypeId:
2023 ToOperands.push_back(SpirvOperand::createType(
2024 importChecked(Err,
Operand.getResultType())));
2027 llvm_unreachable(
"Invalid SpirvOperand kind");
2031 return std::move(Err);
2034 return Importer.getToContext().getHLSLInlineSpirvType(
2035 ToOpcode, ToSize, ToAlignment, ToOperands);
2038ExpectedType clang::ASTNodeImporter::VisitConstantMatrixType(
2039 const clang::ConstantMatrixType *
T) {
2040 ExpectedType ToElementTypeOrErr =
import(
T->getElementType());
2041 if (!ToElementTypeOrErr)
2042 return ToElementTypeOrErr.takeError();
2044 return Importer.getToContext().getConstantMatrixType(
2045 *ToElementTypeOrErr,
T->getNumRows(),
T->getNumColumns());
2048ExpectedType clang::ASTNodeImporter::VisitDependentAddressSpaceType(
2049 const clang::DependentAddressSpaceType *
T) {
2050 Error Err = Error::success();
2051 QualType ToPointeeType = importChecked(Err,
T->getPointeeType());
2052 Expr *ToAddrSpaceExpr = importChecked(Err,
T->getAddrSpaceExpr());
2055 return std::move(Err);
2057 return Importer.getToContext().getDependentAddressSpaceType(
2058 ToPointeeType, ToAddrSpaceExpr, ToAttrLoc);
2061ExpectedType clang::ASTNodeImporter::VisitDependentBitIntType(
2062 const clang::DependentBitIntType *
T) {
2063 ExpectedExpr ToNumBitsExprOrErr =
import(
T->getNumBitsExpr());
2064 if (!ToNumBitsExprOrErr)
2065 return ToNumBitsExprOrErr.takeError();
2066 return Importer.getToContext().getDependentBitIntType(
T->isUnsigned(),
2067 *ToNumBitsExprOrErr);
2070ExpectedType clang::ASTNodeImporter::VisitPredefinedSugarType(
2071 const clang::PredefinedSugarType *
T) {
2072 return Importer.getToContext().getPredefinedSugarType(
T->getKind());
2075ExpectedType clang::ASTNodeImporter::VisitDependentSizedMatrixType(
2076 const clang::DependentSizedMatrixType *
T) {
2077 Error Err = Error::success();
2078 QualType ToElementType = importChecked(Err,
T->getElementType());
2079 Expr *ToRowExpr = importChecked(Err,
T->getRowExpr());
2080 Expr *ToColumnExpr = importChecked(Err,
T->getColumnExpr());
2083 return std::move(Err);
2085 return Importer.getToContext().getDependentSizedMatrixType(
2086 ToElementType, ToRowExpr, ToColumnExpr, ToAttrLoc);
2089ExpectedType clang::ASTNodeImporter::VisitDependentVectorType(
2090 const clang::DependentVectorType *
T) {
2091 Error Err = Error::success();
2092 QualType ToElementType = importChecked(Err,
T->getElementType());
2093 Expr *ToSizeExpr = importChecked(Err,
T->getSizeExpr());
2096 return std::move(Err);
2098 return Importer.getToContext().getDependentVectorType(
2099 ToElementType, ToSizeExpr, ToAttrLoc,
T->getVectorKind());
2102ExpectedType clang::ASTNodeImporter::VisitObjCTypeParamType(
2103 const clang::ObjCTypeParamType *
T) {
2106 return ToDeclOrErr.takeError();
2111 if (!ToProtocolOrErr)
2112 return ToProtocolOrErr.takeError();
2113 ToProtocols.push_back(*ToProtocolOrErr);
2116 return Importer.getToContext().getObjCTypeParamType(*ToDeclOrErr,
2120ExpectedType clang::ASTNodeImporter::VisitPipeType(
const clang::PipeType *
T) {
2121 ExpectedType ToElementTypeOrErr =
import(
T->getElementType());
2122 if (!ToElementTypeOrErr)
2123 return ToElementTypeOrErr.takeError();
2126 if (
T->isReadOnly())
2146 if (
isa<RecordDecl>(D) && (FunDecl = dyn_cast<FunctionDecl>(OrigDC)) &&
2148 auto getLeafPointeeType = [](
const Type *
T) {
2149 while (
T->isPointerType() ||
T->isArrayType()) {
2150 T =
T->getPointeeOrArrayElementType();
2156 getLeafPointeeType(
P->getType().getCanonicalType().getTypePtr());
2157 auto *RT = dyn_cast<RecordType>(LeafT);
2158 if (RT && RT->getDecl() == D) {
2159 Importer.FromDiag(D->
getLocation(), diag::err_unsupported_ast_node)
2178 ToD = cast_or_null<NamedDecl>(Importer.GetAlreadyImportedOrNull(D));
2183 return Error::success();
2197 ToD = cast_or_null<NamedDecl>(Importer.GetAlreadyImportedOrNull(D));
2202 return Error::success();
2207 return Error::success();
2210 if (
Error Err = importInto(ToD, FromD))
2213 if (
RecordDecl *FromRecord = dyn_cast<RecordDecl>(FromD)) {
2215 if (FromRecord->getDefinition() && FromRecord->isCompleteDefinition() &&
2216 !ToRecord->getDefinition()) {
2221 return Error::success();
2224 if (
EnumDecl *FromEnum = dyn_cast<EnumDecl>(FromD)) {
2226 if (FromEnum->getDefinition() && !ToEnum->getDefinition()) {
2231 return Error::success();
2234 return Error::success();
2249 return Error::success();
2255 return ToRangeOrErr.takeError();
2256 return Error::success();
2262 return LocOrErr.takeError();
2263 return Error::success();
2271 return ToTInfoOrErr.takeError();
2272 return Error::success();
2275 llvm_unreachable(
"Unknown name kind.");
2280 if (Importer.isMinimalImport() && !ForceImport) {
2281 auto ToDCOrErr = Importer.ImportContext(FromDC);
2282 return ToDCOrErr.takeError();
2296 auto MightNeedReordering = [](
const Decl *D) {
2301 Error ChildErrors = Error::success();
2302 for (
auto *From : FromDC->
decls()) {
2303 if (!MightNeedReordering(From))
2312 if (!ImportedOrErr) {
2314 ImportedOrErr.takeError());
2317 FieldDecl *FieldFrom = dyn_cast_or_null<FieldDecl>(From);
2318 Decl *ImportedDecl = *ImportedOrErr;
2319 FieldDecl *FieldTo = dyn_cast_or_null<FieldDecl>(ImportedDecl);
2320 if (FieldFrom && FieldTo) {
2350 auto ToDCOrErr = Importer.ImportContext(FromDC);
2352 consumeError(std::move(ChildErrors));
2353 return ToDCOrErr.takeError();
2356 if (
const auto *FromRD = dyn_cast<RecordDecl>(FromDC)) {
2360 for (
auto *D : FromRD->decls()) {
2361 if (!MightNeedReordering(D))
2364 assert(D &&
"DC contains a null decl");
2365 if (
Decl *ToD = Importer.GetAlreadyImportedOrNull(D)) {
2367 assert(ToDC == ToD->getLexicalDeclContext() && ToDC->
containsDecl(ToD));
2379 for (
auto *From : FromDC->
decls()) {
2380 if (MightNeedReordering(From))
2386 ImportedOrErr.takeError());
2406 if (!FromRecordDecl || !ToRecordDecl) {
2407 const RecordType *RecordFrom = FromType->
getAs<RecordType>();
2408 const RecordType *RecordTo = ToType->
getAs<RecordType>();
2410 if (RecordFrom && RecordTo) {
2411 FromRecordDecl = RecordFrom->getDecl();
2412 ToRecordDecl = RecordTo->getDecl();
2416 if (FromRecordDecl && ToRecordDecl) {
2422 return Error::success();
2427 auto ToDCOrErr = Importer.ImportContext(FromD->
getDeclContext());
2429 return ToDCOrErr.takeError();
2433 auto ToLexicalDCOrErr = Importer.ImportContext(
2435 if (!ToLexicalDCOrErr)
2436 return ToLexicalDCOrErr.takeError();
2437 ToLexicalDC = *ToLexicalDCOrErr;
2441 return Error::success();
2447 "Import implicit methods to or from non-definition");
2450 if (FromM->isImplicit()) {
2453 return ToMOrErr.takeError();
2456 return Error::success();
2465 return ToTypedefOrErr.takeError();
2467 return Error::success();
2472 auto DefinitionCompleter = [To]() {
2493 ToCaptures.reserve(FromCXXRD->capture_size());
2494 for (
const auto &FromCapture : FromCXXRD->captures()) {
2495 if (
auto ToCaptureOrErr =
import(FromCapture))
2496 ToCaptures.push_back(*ToCaptureOrErr);
2498 return ToCaptureOrErr.takeError();
2507 DefinitionCompleter();
2511 return Error::success();
2521 if (!Importer.isMinimalImport())
2526 auto DefinitionCompleterScopeExit =
2527 llvm::make_scope_exit(DefinitionCompleter);
2533 auto *ToCXX = dyn_cast<CXXRecordDecl>(To);
2534 auto *FromCXX = dyn_cast<CXXRecordDecl>(From);
2535 if (ToCXX && FromCXX && ToCXX->dataPtr() && FromCXX->dataPtr()) {
2537 struct CXXRecordDecl::DefinitionData &ToData = ToCXX->data();
2538 struct CXXRecordDecl::DefinitionData &FromData = FromCXX->data();
2540 #define FIELD(Name, Width, Merge) \
2541 ToData.Name = FromData.Name;
2542 #include "clang/AST/CXXRecordDeclDefinitionBits.def"
2545 ToCXX->setArgPassingRestrictions(FromCXX->getArgPassingRestrictions());
2548 for (
const auto &Base1 : FromCXX->bases()) {
2551 return TyOrErr.takeError();
2554 if (Base1.isPackExpansion()) {
2555 if (
ExpectedSLoc LocOrErr =
import(Base1.getEllipsisLoc()))
2556 EllipsisLoc = *LocOrErr;
2558 return LocOrErr.takeError();
2566 auto RangeOrErr =
import(Base1.getSourceRange());
2568 return RangeOrErr.takeError();
2570 auto TSIOrErr =
import(Base1.getTypeSourceInfo());
2572 return TSIOrErr.takeError();
2578 Base1.isBaseOfClass(),
2579 Base1.getAccessSpecifierAsWritten(),
2584 ToCXX->setBases(Bases.data(), Bases.size());
2592 return Error::success();
2597 return Error::success();
2601 return Error::success();
2605 return ToInitOrErr.takeError();
2616 return Error::success();
2624 return Error::success();
2633 import(
QualType(Importer.getFromContext().getCanonicalTagType(From)));
2635 return ToTypeOrErr.takeError();
2638 if (!ToPromotionTypeOrErr)
2639 return ToPromotionTypeOrErr.takeError();
2650 return Error::success();
2656 for (
const auto &Arg : FromArgs) {
2657 if (
auto ToOrErr =
import(Arg))
2658 ToArgs.push_back(*ToOrErr);
2660 return ToOrErr.takeError();
2663 return Error::success();
2669 return import(From);
2672template <
typename InContainerTy>
2675 for (
const auto &FromLoc : Container) {
2676 if (
auto ToLocOrErr =
import(FromLoc))
2679 return ToLocOrErr.takeError();
2681 return Error::success();
2691 bool IgnoreTemplateParmDepth) {
2694 Decl *ToOrigin = Importer.GetOriginalDecl(To);
2700 Importer.getToContext().getLangOpts(), Importer.getFromContext(),
2701 Importer.getToContext(), Importer.getNonEquivalentDecls(),
2703 false, Complain,
false,
2704 IgnoreTemplateParmDepth);
2709 Importer.FromDiag(D->
getLocation(), diag::err_unsupported_ast_node)
2715 Importer.FromDiag(D->
getLocation(), diag::err_unsupported_ast_node)
2724 return std::move(Err);
2729 return LocOrErr.takeError();
2732 if (GetImportedOrCreateDecl(ToD, D, Importer.getToContext(), DC, *LocOrErr))
2744 Importer.MapImported(D, ToD);
2755 return std::move(Err);
2760 if (GetImportedOrCreateDecl(ToD, D, Importer.getToContext(), DC, Loc,
2764 Error Err = Error::success();
2769 return std::move(Err);
2773 addDeclToContexts(D, ToD);
2781 return LocOrErr.takeError();
2784 return ColonLocOrErr.takeError();
2789 return DCOrErr.takeError();
2793 if (GetImportedOrCreateDecl(ToD, D, Importer.getToContext(), D->
getAccess(),
2794 DC, *LocOrErr, *ColonLocOrErr))
2808 return DCOrErr.takeError();
2812 Error Err = Error::success();
2818 return std::move(Err);
2821 if (GetImportedOrCreateDecl(
2822 ToD, D, Importer.getToContext(), DC, ToLocation, ToAssertExpr, ToMessage,
2838 return std::move(Err);
2847 if (
auto *TU = dyn_cast<TranslationUnitDecl>(EnclosingDC))
2850 MergeWithNamespace =
2854 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
2855 for (
auto *FoundDecl : FoundDecls) {
2859 if (
auto *FoundNS = dyn_cast<NamespaceDecl>(FoundDecl)) {
2860 MergeWithNamespace = FoundNS;
2861 ConflictingDecls.clear();
2865 ConflictingDecls.push_back(FoundDecl);
2868 if (!ConflictingDecls.empty()) {
2871 ConflictingDecls.size());
2873 Name = NameOrErr.get();
2875 return NameOrErr.takeError();
2881 return BeginLocOrErr.takeError();
2883 if (!RBraceLocOrErr)
2884 return RBraceLocOrErr.takeError();
2889 if (GetImportedOrCreateDecl(ToNamespace, D, Importer.getToContext(), DC,
2890 D->
isInline(), *BeginLocOrErr, Loc,
2901 if (
auto *TU = dyn_cast<TranslationUnitDecl>(DC))
2902 TU->setAnonymousNamespace(ToNamespace);
2907 Importer.MapImported(D, ToNamespace);
2910 return std::move(Err);
2922 return std::move(Err);
2928 Error Err = Error::success();
2935 return std::move(Err);
2940 if (GetImportedOrCreateDecl(
2941 ToD, D, Importer.getToContext(), DC, ToNamespaceLoc, ToAliasLoc,
2942 ToIdentifier, ToQualifierLoc, ToTargetNameLoc, ToNamespace))
2960 return std::move(Err);
2967 cast_or_null<DeclContext>(Importer.GetAlreadyImportedOrNull(
2979 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
2980 for (
auto *FoundDecl : FoundDecls) {
2981 if (!FoundDecl->isInIdentifierNamespace(IDNS))
2983 if (
auto *FoundTypedef = dyn_cast<TypedefNameDecl>(FoundDecl)) {
2988 QualType FoundUT = FoundTypedef->getUnderlyingType();
2989 if (Importer.IsStructurallyEquivalent(FromUT, FoundUT)) {
3002 if (FromR && FoundR &&
3009 return Importer.MapImported(D, FoundTypedef);
3013 ConflictingDecls.push_back(FoundDecl);
3018 if (!ConflictingDecls.empty()) {
3020 Name, DC, IDNS, ConflictingDecls.data(), ConflictingDecls.size());
3022 Name = NameOrErr.get();
3024 return NameOrErr.takeError();
3028 Error Err = Error::success();
3033 return std::move(Err);
3040 if (GetImportedOrCreateDecl<TypeAliasDecl>(
3041 ToTypedef, D, Importer.getToContext(), DC, ToBeginLoc, Loc,
3044 }
else if (GetImportedOrCreateDecl<TypedefDecl>(
3045 ToTypedef, D, Importer.getToContext(), DC, ToBeginLoc, Loc,
3051 return std::move(Err);
3055 Importer.AddToLookupTable(ToTypedef);
3083 return std::move(Err);
3093 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
3094 for (
auto *FoundDecl : FoundDecls) {
3095 if (!FoundDecl->isInIdentifierNamespace(IDNS))
3097 if (
auto *FoundAlias = dyn_cast<TypeAliasTemplateDecl>(FoundDecl)) {
3099 return Importer.MapImported(D, FoundAlias);
3100 ConflictingDecls.push_back(FoundDecl);
3104 if (!ConflictingDecls.empty()) {
3106 Name, DC, IDNS, ConflictingDecls.data(), ConflictingDecls.size());
3108 Name = NameOrErr.get();
3110 return NameOrErr.takeError();
3114 Error Err = Error::success();
3118 return std::move(Err);
3121 if (GetImportedOrCreateDecl(ToAlias, D, Importer.getToContext(), DC, Loc,
3122 Name, ToTemplateParameters, ToTemplatedDecl))
3125 ToTemplatedDecl->setDescribedAliasTemplate(ToAlias);
3130 if (DC != Importer.getToContext().getTranslationUnitDecl())
3131 updateLookupTableForTemplateParameters(*ToTemplateParameters);
3142 return std::move(Err);
3152 return BeginLocOrErr.takeError();
3153 if (GetImportedOrCreateDecl(ToLabel, D, Importer.getToContext(), DC, Loc,
3158 if (GetImportedOrCreateDecl(ToLabel, D, Importer.getToContext(), DC, Loc,
3166 return ToStmtOrErr.takeError();
3168 ToLabel->
setStmt(*ToStmtOrErr);
3181 return std::move(Err);
3189 if (
Error Err = importInto(
3191 return std::move(Err);
3193 }
else if (Importer.getToContext().getLangOpts().CPlusPlus)
3201 Importer.findDeclsInToCtx(DC, SearchName);
3202 for (
auto *FoundDecl : FoundDecls) {
3203 if (!FoundDecl->isInIdentifierNamespace(IDNS))
3206 if (
auto *
Typedef = dyn_cast<TypedefNameDecl>(FoundDecl)) {
3207 if (
const auto *Tag =
Typedef->getUnderlyingType()->getAs<TagType>())
3208 FoundDecl = Tag->getDecl();
3211 if (
auto *FoundEnum = dyn_cast<EnumDecl>(FoundDecl)) {
3217 return Importer.MapImported(D, FoundDef);
3221 ConflictingDecls.push_back(FoundDecl);
3230 if (SearchName && !ConflictingDecls.empty()) {
3232 SearchName, DC, IDNS, ConflictingDecls.data(),
3233 ConflictingDecls.size());
3235 Name = NameOrErr.get();
3237 return NameOrErr.takeError();
3241 Error Err = Error::success();
3247 return std::move(Err);
3251 if (GetImportedOrCreateDecl(
3252 D2, D, Importer.getToContext(), DC, ToBeginLoc,
3262 addDeclToContexts(D, D2);
3268 D2->setInstantiationOfMemberEnum(*ToInstOrErr, SK);
3270 return ToInstOrErr.takeError();
3271 if (
ExpectedSLoc POIOrErr =
import(MemberInfo->getPointOfInstantiation()))
3274 return POIOrErr.takeError();
3280 return std::move(Err);
3286 bool IsFriendTemplate =
false;
3287 if (
auto *DCXX = dyn_cast<CXXRecordDecl>(D)) {
3289 DCXX->getDescribedClassTemplate() &&
3290 DCXX->getDescribedClassTemplate()->getFriendObjectKind() !=
3300 return std::move(Err);
3308 if (
Error Err = importInto(
3310 return std::move(Err);
3312 }
else if (Importer.getToContext().getLangOpts().CPlusPlus)
3317 bool DependentFriend = IsFriendTemplate && IsDependentContext;
3324 Importer.findDeclsInToCtx(DC, SearchName);
3325 if (!FoundDecls.empty()) {
3332 for (
auto *FoundDecl : FoundDecls) {
3333 if (!FoundDecl->isInIdentifierNamespace(IDNS))
3337 if (
auto *
Typedef = dyn_cast<TypedefNameDecl>(
Found)) {
3338 if (
const auto *Tag =
Typedef->getUnderlyingType()->getAs<TagType>())
3339 Found = Tag->getDecl();
3342 if (
auto *FoundRecord = dyn_cast<RecordDecl>(
Found)) {
3364 Importer.MapImported(D, FoundDef);
3365 if (
const auto *DCXX = dyn_cast<CXXRecordDecl>(D)) {
3366 auto *FoundCXX = dyn_cast<CXXRecordDecl>(FoundDef);
3367 assert(FoundCXX &&
"Record type mismatch");
3369 if (!Importer.isMinimalImport())
3373 return std::move(Err);
3380 ConflictingDecls.push_back(FoundDecl);
3384 if (!ConflictingDecls.empty() && SearchName) {
3386 SearchName, DC, IDNS, ConflictingDecls.data(),
3387 ConflictingDecls.size());
3389 Name = NameOrErr.get();
3391 return NameOrErr.takeError();
3397 return BeginLocOrErr.takeError();
3402 if (
auto *DCXX = dyn_cast<CXXRecordDecl>(D)) {
3403 if (DCXX->isLambda()) {
3404 auto TInfoOrErr =
import(DCXX->getLambdaTypeInfo());
3406 return TInfoOrErr.takeError();
3407 if (GetImportedOrCreateSpecialDecl(
3409 DC, *TInfoOrErr, Loc, DCXX->getLambdaDependencyKind(),
3410 DCXX->isGenericLambda(), DCXX->getLambdaCaptureDefault()))
3415 return CDeclOrErr.takeError();
3419 if (GetImportedOrCreateDecl(D2CXX, D, Importer.getToContext(),
3422 cast_or_null<CXXRecordDecl>(PrevDecl)))
3429 addDeclToContexts(D, D2);
3432 DCXX->getDescribedClassTemplate()) {
3434 if (
Error Err = importInto(ToDescribed, FromDescribed))
3435 return std::move(Err);
3438 DCXX->getMemberSpecializationInfo()) {
3440 MemberInfo->getTemplateSpecializationKind();
3446 return ToInstOrErr.takeError();
3449 import(MemberInfo->getPointOfInstantiation()))
3453 return POIOrErr.takeError();
3457 if (GetImportedOrCreateDecl(D2, D, Importer.getToContext(),
3462 addDeclToContexts(D, D2);
3468 return BraceRangeOrErr.takeError();
3472 return QualifierLocOrErr.takeError();
3479 return std::move(Err);
3491 return std::move(Err);
3500 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
3501 for (
auto *FoundDecl : FoundDecls) {
3502 if (!FoundDecl->isInIdentifierNamespace(IDNS))
3505 if (
auto *FoundEnumConstant = dyn_cast<EnumConstantDecl>(FoundDecl)) {
3507 return Importer.MapImported(D, FoundEnumConstant);
3508 ConflictingDecls.push_back(FoundDecl);
3512 if (!ConflictingDecls.empty()) {
3514 Name, DC, IDNS, ConflictingDecls.data(), ConflictingDecls.size());
3516 Name = NameOrErr.get();
3518 return NameOrErr.takeError();
3524 return TypeOrErr.takeError();
3528 return InitOrErr.takeError();
3531 if (GetImportedOrCreateDecl(
3532 ToEnumerator, D, Importer.getToContext(),
cast<EnumDecl>(DC), Loc,
3534 return ToEnumerator;
3539 return ToEnumerator;
3542template <
typename DeclTy>
3545 unsigned int Num = FromD->getNumTemplateParameterLists();
3547 return Error::success();
3549 for (
unsigned int I = 0; I <
Num; ++I)
3551 import(FromD->getTemplateParameterList(I)))
3552 ToTPLists[I] = *ToTPListOrErr;
3554 return ToTPListOrErr.takeError();
3555 ToD->setTemplateParameterListsInfo(Importer.ToContext, ToTPLists);
3556 return Error::success();
3564 return Error::success();
3570 return Error::success();
3576 ToFD->setInstantiationOfMemberFunction(*InstFDOrErr, TSK);
3578 return InstFDOrErr.takeError();
3584 return POIOrErr.takeError();
3586 return Error::success();
3590 auto FunctionAndArgsOrErr =
3592 if (!FunctionAndArgsOrErr)
3593 return FunctionAndArgsOrErr.takeError();
3596 Importer.getToContext(), std::get<1>(*FunctionAndArgsOrErr));
3600 const auto *FromTAArgsAsWritten = FTSInfo->TemplateArgumentsAsWritten;
3601 if (FromTAArgsAsWritten)
3603 *FromTAArgsAsWritten, ToTAInfo))
3606 ExpectedSLoc POIOrErr =
import(FTSInfo->getPointOfInstantiation());
3608 return POIOrErr.takeError();
3614 ToFD->setFunctionTemplateSpecialization(
3615 std::get<0>(*FunctionAndArgsOrErr), ToTAList,
nullptr,
3616 TSK, FromTAArgsAsWritten ? &ToTAInfo :
nullptr, *POIOrErr);
3617 return Error::success();
3625 Candidates.
addDecl(*ToFTDOrErr);
3627 return ToFTDOrErr.takeError();
3632 const auto *FromTAArgsAsWritten = FromInfo->TemplateArgumentsAsWritten;
3633 if (FromTAArgsAsWritten)
3639 Importer.getToContext(), Candidates,
3640 FromTAArgsAsWritten ? &ToTAInfo :
nullptr);
3641 return Error::success();
3644 llvm_unreachable(
"All cases should be covered!");
3649 auto FunctionAndArgsOrErr =
3651 if (!FunctionAndArgsOrErr)
3652 return FunctionAndArgsOrErr.takeError();
3656 std::tie(
Template, ToTemplArgs) = *FunctionAndArgsOrErr;
3657 void *InsertPos =
nullptr;
3658 auto *FoundSpec =
Template->findSpecialization(ToTemplArgs, InsertPos);
3668 return ToBodyOrErr.takeError();
3670 return Error::success();
3676 const DeclContext *DCi = dyn_cast<DeclContext>(D);
3679 assert(DCi &&
"Declaration should have a context");
3693 ToProcess.push_back(S);
3694 while (!ToProcess.empty()) {
3695 const Stmt *CurrentS = ToProcess.pop_back_val();
3697 if (
const auto *DeclRef = dyn_cast<DeclRefExpr>(CurrentS)) {
3698 if (
const Decl *D = DeclRef->getDecl())
3701 }
else if (
const auto *E =
3702 dyn_cast_or_null<SubstNonTypeTemplateParmExpr>(CurrentS)) {
3703 if (
const Decl *D = E->getAssociatedDecl())
3736class IsTypeDeclaredInsideVisitor
3737 :
public TypeVisitor<IsTypeDeclaredInsideVisitor, std::optional<bool>> {
3739 IsTypeDeclaredInsideVisitor(
const FunctionDecl *ParentDC)
3740 : ParentDC(ParentDC) {}
3742 bool CheckType(QualType
T) {
3746 if (std::optional<bool> Res = Visit(
T.getTypePtr()))
3749 T.getSingleStepDesugaredType(ParentDC->getParentASTContext());
3751 if (std::optional<bool> Res = Visit(DsT.
getTypePtr()))
3754 DsT =
T.getSingleStepDesugaredType(ParentDC->getParentASTContext());
3759 std::optional<bool> VisitTagType(
const TagType *
T) {
3760 if (
auto *Spec = dyn_cast<ClassTemplateSpecializationDecl>(
T->getDecl()))
3761 for (
const auto &Arg : Spec->getTemplateArgs().asArray())
3762 if (checkTemplateArgument(Arg))
3767 std::optional<bool> VisitPointerType(
const PointerType *
T) {
3771 std::optional<bool> VisitReferenceType(
const ReferenceType *
T) {
3772 return CheckType(
T->getPointeeTypeAsWritten());
3775 std::optional<bool> VisitTypedefType(
const TypedefType *
T) {
3779 std::optional<bool> VisitUsingType(
const UsingType *
T) {
3784 VisitTemplateSpecializationType(
const TemplateSpecializationType *
T) {
3785 for (
const auto &Arg :
T->template_arguments())
3786 if (checkTemplateArgument(Arg))
3792 std::optional<bool> VisitUnaryTransformType(
const UnaryTransformType *
T) {
3793 return CheckType(
T->getBaseType());
3797 VisitSubstTemplateTypeParmType(
const SubstTemplateTypeParmType *
T) {
3804 std::optional<bool> VisitConstantArrayType(
const ConstantArrayType *
T) {
3808 return CheckType(
T->getElementType());
3811 std::optional<bool> VisitVariableArrayType(
const VariableArrayType *
T) {
3813 "Variable array should not occur in deduced return type of a function");
3816 std::optional<bool> VisitIncompleteArrayType(
const IncompleteArrayType *
T) {
3817 llvm_unreachable(
"Incomplete array should not occur in deduced return type "
3821 std::optional<bool> VisitDependentArrayType(
const IncompleteArrayType *
T) {
3822 llvm_unreachable(
"Dependent array should not occur in deduced return type "
3827 const DeclContext *
const ParentDC;
3829 bool checkTemplateArgument(
const TemplateArgument &Arg) {
3849 if (checkTemplateArgument(PackArg))
3861 llvm_unreachable(
"Unknown TemplateArgument::ArgKind enum");
3871 assert(FromFPT &&
"Must be called on FunctionProtoType");
3873 auto IsCXX11Lambda = [&]() {
3874 if (Importer.FromContext.getLangOpts().CPlusPlus14)
3880 QualType RetT = FromFPT->getReturnType();
3883 IsTypeDeclaredInsideVisitor Visitor(Def ? Def : D);
3884 return Visitor.CheckType(RetT);
3901 auto RedeclIt = Redecls.begin();
3904 for (; RedeclIt != Redecls.end() && *RedeclIt != D; ++RedeclIt) {
3907 return ToRedeclOrErr.takeError();
3909 assert(*RedeclIt == D);
3917 return std::move(Err);
3932 if (!FoundFunctionOrErr)
3933 return FoundFunctionOrErr.takeError();
3934 if (
FunctionDecl *FoundFunction = *FoundFunctionOrErr) {
3935 if (
Decl *Def = FindAndMapDefinition(D, FoundFunction))
3937 FoundByLookup = FoundFunction;
3945 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
3946 for (
auto *FoundDecl : FoundDecls) {
3947 if (!FoundDecl->isInIdentifierNamespace(IDNS))
3950 if (
auto *FoundFunction = dyn_cast<FunctionDecl>(FoundDecl)) {
3955 if (
Decl *Def = FindAndMapDefinition(D, FoundFunction))
3957 FoundByLookup = FoundFunction;
3964 if (Importer.getToContext().getLangOpts().CPlusPlus)
3968 Importer.ToDiag(Loc, diag::warn_odr_function_type_inconsistent)
3969 << Name << D->
getType() << FoundFunction->getType();
3970 Importer.ToDiag(FoundFunction->getLocation(), diag::note_odr_value_here)
3971 << FoundFunction->getType();
3972 ConflictingDecls.push_back(FoundDecl);
3976 if (!ConflictingDecls.empty()) {
3978 Name, DC, IDNS, ConflictingDecls.data(), ConflictingDecls.size());
3980 Name = NameOrErr.get();
3982 return NameOrErr.takeError();
3992 if (FoundByLookup) {
4002 "Templated function mapped to non-templated?");
4003 Importer.MapImported(DescribedD,
4006 return Importer.MapImported(D, FoundByLookup);
4018 return std::move(Err);
4029 bool UsedDifferentProtoType =
false;
4031 QualType FromReturnTy = FromFPT->getReturnType();
4038 FromReturnTy = Importer.getFromContext().VoidTy;
4039 UsedDifferentProtoType =
true;
4050 FromEPI = DefaultEPI;
4051 UsedDifferentProtoType =
true;
4053 FromTy = Importer.getFromContext().getFunctionType(
4054 FromReturnTy, FromFPT->getParamTypes(), FromEPI);
4055 FromTSI = Importer.getFromContext().getTrivialTypeSourceInfo(
4059 Error Err = Error::success();
4070 return std::move(Err);
4076 Parameters.push_back(*ToPOrErr);
4078 return ToPOrErr.takeError();
4083 if (
auto *FromConstructor = dyn_cast<CXXConstructorDecl>(D)) {
4085 importExplicitSpecifier(Err, FromConstructor->getExplicitSpecifier());
4087 return std::move(Err);
4089 if (FromConstructor->isInheritingConstructor()) {
4091 import(FromConstructor->getInheritedConstructor());
4092 if (!ImportedInheritedCtor)
4093 return ImportedInheritedCtor.takeError();
4094 ToInheritedConstructor = *ImportedInheritedCtor;
4096 if (GetImportedOrCreateDecl<CXXConstructorDecl>(
4098 ToInnerLocStart, NameInfo,
T, TInfo, ESpec, D->
UsesFPIntrin(),
4100 ToInheritedConstructor, TrailingRequiresClause))
4104 Error Err = Error::success();
4106 Err,
const_cast<FunctionDecl *
>(FromDtor->getOperatorDelete()));
4107 auto ToThisArg =
importChecked(Err, FromDtor->getOperatorDeleteThisArg());
4109 return std::move(Err);
4111 if (GetImportedOrCreateDecl<CXXDestructorDecl>(
4115 TrailingRequiresClause))
4122 dyn_cast<CXXConversionDecl>(D)) {
4124 importExplicitSpecifier(Err, FromConversion->getExplicitSpecifier());
4126 return std::move(Err);
4127 if (GetImportedOrCreateDecl<CXXConversionDecl>(
4133 }
else if (
auto *
Method = dyn_cast<CXXMethodDecl>(D)) {
4134 if (GetImportedOrCreateDecl<CXXMethodDecl>(
4136 ToInnerLocStart, NameInfo,
T, TInfo,
Method->getStorageClass(),
4140 }
else if (
auto *Guide = dyn_cast<CXXDeductionGuideDecl>(D)) {
4142 importExplicitSpecifier(Err, Guide->getExplicitSpecifier());
4148 return std::move(Err);
4149 if (GetImportedOrCreateDecl<CXXDeductionGuideDecl>(
4150 ToFunction, D, Importer.getToContext(), DC, ToInnerLocStart, ESpec,
4151 NameInfo,
T, TInfo, ToEndLoc, Ctor,
4152 Guide->getDeductionCandidateKind(), TrailingRequiresClause,
4156 if (GetImportedOrCreateDecl(
4157 ToFunction, D, Importer.getToContext(), DC, ToInnerLocStart,
4165 if (FoundByLookup) {
4178 auto Imported =
import(Msg);
4180 return Imported.takeError();
4204 Importer.getToContext(), {}, Msg));
4207 for (
auto *Param : Parameters) {
4208 Param->setOwningFunction(ToFunction);
4211 LT->update(Param, Importer.getToContext().getTranslationUnitDecl());
4213 ToFunction->setParams(Parameters);
4220 for (
unsigned I = 0, N = Parameters.size(); I != N; ++I)
4221 ProtoLoc.setParam(I, Parameters[I]);
4227 auto ToFTOrErr =
import(FromFT);
4229 return ToFTOrErr.takeError();
4233 if (
auto *FromConstructor = dyn_cast<CXXConstructorDecl>(D)) {
4234 if (
unsigned NumInitializers = FromConstructor->getNumCtorInitializers()) {
4238 FromConstructor->inits(), CtorInitializers))
4239 return std::move(Err);
4242 llvm::copy(CtorInitializers, Memory);
4244 ToCtor->setCtorInitializers(Memory);
4245 ToCtor->setNumCtorInitializers(NumInitializers);
4251 return std::move(Err);
4253 if (
auto *FromCXXMethod = dyn_cast<CXXMethodDecl>(D))
4256 return std::move(Err);
4262 return std::move(Err);
4266 if (UsedDifferentProtoType) {
4268 ToFunction->
setType(*TyOrErr);
4270 return TyOrErr.takeError();
4274 return TSIOrErr.takeError();
4279 addDeclToContexts(D, ToFunction);
4282 for (++RedeclIt; RedeclIt != Redecls.end(); ++RedeclIt) {
4285 return ToRedeclOrErr.takeError();
4319 return std::move(Err);
4324 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
4325 for (
auto *FoundDecl : FoundDecls) {
4326 if (
FieldDecl *FoundField = dyn_cast<FieldDecl>(FoundDecl)) {
4333 if (Importer.IsStructurallyEquivalent(D->
getType(),
4334 FoundField->getType())) {
4335 Importer.MapImported(D, FoundField);
4343 if (
ExpectedExpr ToInitializerOrErr =
import(FromInitializer)) {
4346 assert(FoundField->hasInClassInitializer() &&
4347 "Field should have an in-class initializer if it has an "
4348 "expression for it.");
4349 if (!FoundField->getInClassInitializer())
4350 FoundField->setInClassInitializer(*ToInitializerOrErr);
4352 return ToInitializerOrErr.takeError();
4359 Importer.ToDiag(Loc, diag::warn_odr_field_type_inconsistent)
4360 << Name << D->
getType() << FoundField->getType();
4361 Importer.ToDiag(FoundField->getLocation(), diag::note_odr_value_here)
4362 << FoundField->getType();
4368 Error Err = Error::success();
4374 return std::move(Err);
4375 const Type *ToCapturedVLAType =
nullptr;
4376 if (
Error Err = Importer.importInto(
4378 return std::move(Err);
4381 if (GetImportedOrCreateDecl(ToField, D, Importer.getToContext(), DC,
4383 ToType, ToTInfo, ToBitWidth, D->
isMutable(),
4390 if (ToCapturedVLAType)
4397 return std::move(Err);
4398 if (ToInitializer) {
4400 if (AlreadyImported)
4401 assert(ToInitializer == AlreadyImported &&
4402 "Duplicate import of in-class initializer.");
4417 return std::move(Err);
4422 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
4423 for (
unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
4424 if (
auto *FoundField = dyn_cast<IndirectFieldDecl>(FoundDecls[I])) {
4431 if (Importer.IsStructurallyEquivalent(D->
getType(),
4432 FoundField->getType(),
4434 Importer.MapImported(D, FoundField);
4439 if (!Name && I < N-1)
4443 Importer.ToDiag(Loc, diag::warn_odr_field_type_inconsistent)
4444 << Name << D->
getType() << FoundField->getType();
4445 Importer.ToDiag(FoundField->getLocation(), diag::note_odr_value_here)
4446 << FoundField->getType();
4453 auto TypeOrErr =
import(D->
getType());
4455 return TypeOrErr.takeError();
4461 for (
auto *PI : D->
chain())
4463 NamedChain[i++] = *ToD;
4465 return ToD.takeError();
4469 if (GetImportedOrCreateDecl(ToIndirectField, D, Importer.getToContext(), DC,
4472 return ToIndirectField;
4477 return ToIndirectField;
4508 unsigned int FriendCount = 0;
4512 for (
FriendDecl *FoundFriend : RD->friends()) {
4513 if (FoundFriend == FD) {
4514 FriendPosition = FriendCount;
4521 assert(FriendPosition &&
"Friend decl not found in own parent.");
4523 return {FriendCount, *FriendPosition};
4530 return std::move(Err);
4537 for (
FriendDecl *ImportedFriend : RD->friends())
4539 ImportedEquivalentFriends.push_back(ImportedFriend);
4544 assert(ImportedEquivalentFriends.size() <= CountAndPosition.
TotalCount &&
4545 "Class with non-matching friends is imported, ODR check wrong?");
4546 if (ImportedEquivalentFriends.size() == CountAndPosition.
TotalCount)
4547 return Importer.MapImported(
4548 D, ImportedEquivalentFriends[CountAndPosition.
IndexOfDecl]);
4555 if (
Error Err = importInto(ToFriendD, FriendD))
4556 return std::move(Err);
4567 return TSIOrErr.takeError();
4571 auto **FromTPLists = D->getTrailingObjects();
4572 for (
unsigned I = 0; I < D->NumTPLists; I++) {
4573 if (
auto ListOrErr =
import(FromTPLists[I]))
4574 ToTPLists[I] = *ListOrErr;
4576 return ListOrErr.takeError();
4581 return LocationOrErr.takeError();
4583 if (!FriendLocOrErr)
4584 return FriendLocOrErr.takeError();
4586 if (!EllipsisLocOrErr)
4587 return EllipsisLocOrErr.takeError();
4590 if (GetImportedOrCreateDecl(FrD, D, Importer.getToContext(), DC,
4591 *LocationOrErr, ToFU, *FriendLocOrErr,
4592 *EllipsisLocOrErr, ToTPLists))
4608 return std::move(Err);
4613 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
4614 for (
auto *FoundDecl : FoundDecls) {
4615 if (
ObjCIvarDecl *FoundIvar = dyn_cast<ObjCIvarDecl>(FoundDecl)) {
4616 if (Importer.IsStructurallyEquivalent(D->
getType(),
4617 FoundIvar->getType())) {
4618 Importer.MapImported(D, FoundIvar);
4622 Importer.ToDiag(Loc, diag::warn_odr_ivar_type_inconsistent)
4623 << Name << D->
getType() << FoundIvar->getType();
4624 Importer.ToDiag(FoundIvar->getLocation(), diag::note_odr_value_here)
4625 << FoundIvar->getType();
4631 Error Err = Error::success();
4637 return std::move(Err);
4640 if (GetImportedOrCreateDecl(
4643 ToType, ToTypeSourceInfo,
4655 auto RedeclIt = Redecls.begin();
4658 for (; RedeclIt != Redecls.end() && *RedeclIt != D; ++RedeclIt) {
4661 return RedeclOrErr.takeError();
4663 assert(*RedeclIt == D);
4671 return std::move(Err);
4677 VarDecl *FoundByLookup =
nullptr;
4681 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
4682 for (
auto *FoundDecl : FoundDecls) {
4683 if (!FoundDecl->isInIdentifierNamespace(IDNS))
4686 if (
auto *FoundVar = dyn_cast<VarDecl>(FoundDecl)) {
4689 if (Importer.IsStructurallyEquivalent(D->
getType(),
4690 FoundVar->getType())) {
4698 return Importer.MapImported(D, FoundDef);
4702 const VarDecl *FoundDInit =
nullptr;
4703 if (D->
getInit() && FoundVar->getAnyInitializer(FoundDInit))
4705 return Importer.MapImported(D,
const_cast<VarDecl*
>(FoundDInit));
4707 FoundByLookup = FoundVar;
4712 = Importer.getToContext().getAsArrayType(FoundVar->getType());
4714 = Importer.getToContext().getAsArrayType(D->
getType());
4715 if (FoundArray && TArray) {
4719 if (
auto TyOrErr =
import(D->
getType()))
4720 FoundVar->setType(*TyOrErr);
4722 return TyOrErr.takeError();
4724 FoundByLookup = FoundVar;
4728 FoundByLookup = FoundVar;
4733 Importer.ToDiag(Loc, diag::warn_odr_variable_type_inconsistent)
4734 << Name << D->
getType() << FoundVar->getType();
4735 Importer.ToDiag(FoundVar->getLocation(), diag::note_odr_value_here)
4736 << FoundVar->getType();
4737 ConflictingDecls.push_back(FoundDecl);
4741 if (!ConflictingDecls.empty()) {
4743 Name, DC, IDNS, ConflictingDecls.data(), ConflictingDecls.size());
4745 Name = NameOrErr.get();
4747 return NameOrErr.takeError();
4751 Error Err = Error::success();
4757 return std::move(Err);
4760 if (
auto *FromDecomp = dyn_cast<DecompositionDecl>(D)) {
4764 return std::move(Err);
4766 if (GetImportedOrCreateDecl(
4767 ToDecomp, FromDecomp, Importer.getToContext(), DC, ToInnerLocStart,
4773 if (GetImportedOrCreateDecl(ToVar, D, Importer.getToContext(), DC,
4774 ToInnerLocStart, Loc,
4789 if (FoundByLookup) {
4798 return ToVTOrErr.takeError();
4805 return ToInstOrErr.takeError();
4806 if (
ExpectedSLoc POIOrErr =
import(MSI->getPointOfInstantiation()))
4809 return POIOrErr.takeError();
4813 return std::move(Err);
4818 addDeclToContexts(D, ToVar);
4821 for (++RedeclIt; RedeclIt != Redecls.end(); ++RedeclIt) {
4824 return RedeclOrErr.takeError();
4833 DeclContext *DC = Importer.getToContext().getTranslationUnitDecl();
4835 Error Err = Error::success();
4840 return std::move(Err);
4844 if (GetImportedOrCreateDecl(ToParm, D, Importer.getToContext(), DC,
4845 ToLocation, ToDeclName.getAsIdentifierInfo(),
4857 return LocOrErr.takeError();
4866 return ToDefArgOrErr.takeError();
4870 if (
auto ToDefArgOrErr =
import(FromParam->
getDefaultArg()))
4873 return ToDefArgOrErr.takeError();
4876 return Error::success();
4881 Error Err = Error::success();
4886 return std::move(Err);
4893 DeclContext *DC = Importer.getToContext().getTranslationUnitDecl();
4895 Error Err = Error::success();
4902 return std::move(Err);
4905 if (GetImportedOrCreateDecl(ToParm, D, Importer.getToContext(), DC,
4906 ToInnerLocStart, ToLocation,
4907 ToDeclName.getAsIdentifierInfo(), ToType,
4916 return std::move(Err);
4936 return std::move(Err);
4940 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
4941 for (
auto *FoundDecl : FoundDecls) {
4942 if (
auto *FoundMethod = dyn_cast<ObjCMethodDecl>(FoundDecl)) {
4948 FoundMethod->getReturnType())) {
4949 Importer.ToDiag(Loc, diag::warn_odr_objc_method_result_type_inconsistent)
4951 << FoundMethod->getReturnType();
4952 Importer.ToDiag(FoundMethod->getLocation(),
4953 diag::note_odr_objc_method_here)
4960 if (D->
param_size() != FoundMethod->param_size()) {
4961 Importer.ToDiag(Loc, diag::warn_odr_objc_method_num_params_inconsistent)
4963 << D->
param_size() << FoundMethod->param_size();
4964 Importer.ToDiag(FoundMethod->getLocation(),
4965 diag::note_odr_objc_method_here)
4973 PEnd = D->
param_end(), FoundP = FoundMethod->param_begin();
4974 P != PEnd; ++
P, ++FoundP) {
4975 if (!Importer.IsStructurallyEquivalent((*P)->getType(),
4976 (*FoundP)->getType())) {
4977 Importer.FromDiag((*P)->getLocation(),
4978 diag::warn_odr_objc_method_param_type_inconsistent)
4980 << (*P)->getType() << (*FoundP)->getType();
4981 Importer.ToDiag((*FoundP)->getLocation(), diag::note_odr_value_here)
4982 << (*FoundP)->getType();
4990 if (D->
isVariadic() != FoundMethod->isVariadic()) {
4991 Importer.ToDiag(Loc, diag::warn_odr_objc_method_variadic_inconsistent)
4993 Importer.ToDiag(FoundMethod->getLocation(),
4994 diag::note_odr_objc_method_here)
5001 return Importer.MapImported(D, FoundMethod);
5005 Error Err = Error::success();
5008 auto ToReturnTypeSourceInfo =
5011 return std::move(Err);
5014 if (GetImportedOrCreateDecl(
5015 ToMethod, D, Importer.getToContext(), Loc, ToEndLoc,
5029 ToParams.push_back(*ToPOrErr);
5031 return ToPOrErr.takeError();
5035 for (
auto *ToParam : ToParams) {
5036 ToParam->setOwningFunction(ToMethod);
5044 return std::move(Err);
5046 ToMethod->
setMethodParams(Importer.getToContext(), ToParams, ToSelLocs);
5068 return std::move(Err);
5072 Error Err = Error::success();
5078 return std::move(Err);
5081 if (GetImportedOrCreateDecl(
5085 ToColonLoc, ToTypeSourceInfo))
5091 return std::move(Err);
5092 Result->setTypeForDecl(ToTypeForDecl);
5093 Result->setLexicalDeclContext(LexicalDC);
5104 return std::move(Err);
5110 return std::move(Err);
5118 Error Err = Error::success();
5124 return std::move(Err);
5126 if (GetImportedOrCreateDecl(ToCategory, D, Importer.getToContext(), DC,
5142 return PListOrErr.takeError();
5151 FromProto != FromProtoEnd;
5152 ++FromProto, ++FromProtoLoc) {
5154 Protocols.push_back(*ToProtoOrErr);
5156 return ToProtoOrErr.takeError();
5158 if (
ExpectedSLoc ToProtoLocOrErr =
import(*FromProtoLoc))
5159 ProtocolLocs.push_back(*ToProtoLocOrErr);
5161 return ToProtoLocOrErr.takeError();
5166 ProtocolLocs.data(), Importer.getToContext());
5169 Importer.MapImported(D, ToCategory);
5174 return std::move(Err);
5182 return ToImplOrErr.takeError();
5194 return Error::success();
5207 FromProto != FromProtoEnd;
5208 ++FromProto, ++FromProtoLoc) {
5210 Protocols.push_back(*ToProtoOrErr);
5212 return ToProtoOrErr.takeError();
5214 if (
ExpectedSLoc ToProtoLocOrErr =
import(*FromProtoLoc))
5215 ProtocolLocs.push_back(*ToProtoLocOrErr);
5217 return ToProtoLocOrErr.takeError();
5223 ProtocolLocs.data(), Importer.getToContext());
5230 return Error::success();
5240 return Importer.MapImported(D, *ImportedDefOrErr);
5242 return ImportedDefOrErr.takeError();
5251 return std::move(Err);
5256 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
5257 for (
auto *FoundDecl : FoundDecls) {
5261 if ((MergeWithProtocol = dyn_cast<ObjCProtocolDecl>(FoundDecl)))
5268 if (!ToAtBeginLocOrErr)
5269 return ToAtBeginLocOrErr.takeError();
5271 if (GetImportedOrCreateDecl(ToProto, D, Importer.getToContext(), DC,
5280 Importer.MapImported(D, ToProto);
5284 return std::move(Err);
5292 return std::move(Err);
5295 if (!ExternLocOrErr)
5296 return ExternLocOrErr.takeError();
5300 return LangLocOrErr.takeError();
5305 if (GetImportedOrCreateDecl(ToLinkageSpec, D, Importer.getToContext(), DC,
5306 *ExternLocOrErr, *LangLocOrErr,
5308 return ToLinkageSpec;
5312 if (!RBraceLocOrErr)
5313 return RBraceLocOrErr.takeError();
5320 return ToLinkageSpec;
5331 return ToShadowOrErr.takeError();
5342 return std::move(Err);
5346 Error Err = Error::success();
5351 return std::move(Err);
5355 return std::move(Err);
5358 if (GetImportedOrCreateDecl(ToUsing, D, Importer.getToContext(), DC,
5359 ToUsingLoc, ToQualifierLoc, NameInfo,
5367 Importer.getFromContext().getInstantiatedFromUsingDecl(D)) {
5369 Importer.getToContext().setInstantiatedFromUsingDecl(
5370 ToUsing, *ToPatternOrErr);
5372 return ToPatternOrErr.takeError();
5384 return std::move(Err);
5388 Error Err = Error::success();
5394 return std::move(Err);
5397 if (GetImportedOrCreateDecl(ToUsingEnum, D, Importer.getToContext(), DC,
5398 ToUsingLoc, ToEnumLoc, ToNameLoc, ToEnumType))
5405 Importer.getFromContext().getInstantiatedFromUsingEnumDecl(D)) {
5407 Importer.getToContext().setInstantiatedFromUsingEnumDecl(ToUsingEnum,
5410 return ToPatternOrErr.takeError();
5422 return std::move(Err);
5427 if (!ToIntroducerOrErr)
5428 return ToIntroducerOrErr.takeError();
5432 return ToTargetOrErr.takeError();
5435 if (
auto *FromConstructorUsingShadow =
5436 dyn_cast<ConstructorUsingShadowDecl>(D)) {
5437 Error Err = Error::success();
5439 Err, FromConstructorUsingShadow->getNominatedBaseClassShadowDecl());
5441 return std::move(Err);
5447 if (GetImportedOrCreateDecl<ConstructorUsingShadowDecl>(
5448 ToShadow, D, Importer.getToContext(), DC, Loc,
5450 Nominated ? Nominated : *ToTargetOrErr,
5451 FromConstructorUsingShadow->constructsVirtualBase()))
5454 if (GetImportedOrCreateDecl(ToShadow, D, Importer.getToContext(), DC, Loc,
5455 Name, *ToIntroducerOrErr, *ToTargetOrErr))
5463 Importer.getFromContext().getInstantiatedFromUsingShadowDecl(D)) {
5465 Importer.getToContext().setInstantiatedFromUsingShadowDecl(
5466 ToShadow, *ToPatternOrErr);
5470 return ToPatternOrErr.takeError();
5484 return std::move(Err);
5489 if (!ToComAncestorOrErr)
5490 return ToComAncestorOrErr.takeError();
5492 Error Err = Error::success();
5495 auto ToNamespaceKeyLocation =
5500 return std::move(Err);
5503 if (GetImportedOrCreateDecl(ToUsingDir, D, Importer.getToContext(), DC,
5505 ToNamespaceKeyLocation,
5508 ToNominatedNamespace, *ToComAncestorOrErr))
5523 return std::move(Err);
5527 auto ToInstantiatedFromUsingOrErr =
5529 if (!ToInstantiatedFromUsingOrErr)
5530 return ToInstantiatedFromUsingOrErr.takeError();
5533 return std::move(Err);
5536 if (GetImportedOrCreateDecl(ToUsingPack, D, Importer.getToContext(), DC,
5541 addDeclToContexts(D, ToUsingPack);
5553 return std::move(Err);
5557 Error Err = Error::success();
5563 return std::move(Err);
5567 return std::move(Err);
5570 if (GetImportedOrCreateDecl(ToUsingValue, D, Importer.getToContext(), DC,
5571 ToUsingLoc, ToQualifierLoc, NameInfo,
5573 return ToUsingValue;
5579 return ToUsingValue;
5589 return std::move(Err);
5593 Error Err = Error::success();
5599 return std::move(Err);
5602 if (GetImportedOrCreateDecl(ToUsing, D, Importer.getToContext(), DC,
5603 ToUsingLoc, ToTypenameLoc,
5604 ToQualifierLoc, Loc, Name, ToEllipsisLoc))
5615 Decl* ToD =
nullptr;
5617#define BuiltinTemplate(BTName) \
5618 case BuiltinTemplateKind::BTK##BTName: \
5619 ToD = Importer.getToContext().get##BTName##Decl(); \
5621#include "clang/Basic/BuiltinTemplates.inc"
5623 assert(ToD &&
"BuiltinTemplateDecl of unsupported kind!");
5624 Importer.MapImported(D, ToD);
5634 if (
auto FromSuperOrErr =
import(FromSuper))
5635 FromSuper = *FromSuperOrErr;
5637 return FromSuperOrErr.takeError();
5641 if ((
bool)FromSuper != (
bool)ToSuper ||
5644 diag::warn_odr_objc_superclass_inconsistent)
5651 diag::note_odr_objc_missing_superclass);
5654 diag::note_odr_objc_superclass)
5658 diag::note_odr_objc_missing_superclass);
5664 return Error::success();
5675 return SuperTInfoOrErr.takeError();
5686 FromProto != FromProtoEnd;
5687 ++FromProto, ++FromProtoLoc) {
5689 Protocols.push_back(*ToProtoOrErr);
5691 return ToProtoOrErr.takeError();
5693 if (
ExpectedSLoc ToProtoLocOrErr =
import(*FromProtoLoc))
5694 ProtocolLocs.push_back(*ToProtoLocOrErr);
5696 return ToProtoLocOrErr.takeError();
5702 ProtocolLocs.data(), Importer.getToContext());
5707 auto ToCatOrErr =
import(Cat);
5709 return ToCatOrErr.takeError();
5718 return ToImplOrErr.takeError();
5725 return Error::success();
5734 for (
auto *fromTypeParam : *list) {
5735 if (
auto toTypeParamOrErr =
import(fromTypeParam))
5736 toTypeParams.push_back(*toTypeParamOrErr);
5738 return toTypeParamOrErr.takeError();
5742 if (!LAngleLocOrErr)
5743 return LAngleLocOrErr.takeError();
5746 if (!RAngleLocOrErr)
5747 return RAngleLocOrErr.takeError();
5762 return Importer.MapImported(D, *ImportedDefOrErr);
5764 return ImportedDefOrErr.takeError();
5773 return std::move(Err);
5779 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
5780 for (
auto *FoundDecl : FoundDecls) {
5784 if ((MergeWithIface = dyn_cast<ObjCInterfaceDecl>(FoundDecl)))
5792 if (!AtBeginLocOrErr)
5793 return AtBeginLocOrErr.takeError();
5795 if (GetImportedOrCreateDecl(
5796 ToIface, D, Importer.getToContext(), DC,
5804 Importer.MapImported(D, ToIface);
5807 if (
auto ToPListOrErr =
5811 return ToPListOrErr.takeError();
5815 return std::move(Err);
5824 return std::move(Err);
5830 return std::move(Err);
5832 Error Err = Error::success();
5837 return std::move(Err);
5839 if (GetImportedOrCreateDecl(
5840 ToImpl, D, Importer.getToContext(), DC,
5841 Importer.Import(D->
getIdentifier()), Category->getClassInterface(),
5842 ToLocation, ToAtStartLoc, ToCategoryNameLoc))
5847 Category->setImplementation(ToImpl);
5850 Importer.MapImported(D, ToImpl);
5852 return std::move(Err);
5862 return std::move(Err);
5867 return std::move(Err);
5875 return std::move(Err);
5877 Error Err = Error::success();
5884 return std::move(Err);
5886 if (GetImportedOrCreateDecl(Impl, D, Importer.getToContext(),
5895 Impl->setLexicalDeclContext(LexicalDC);
5909 Importer.ToDiag(Impl->getLocation(),
5910 diag::warn_odr_objc_superclass_inconsistent)
5914 if (Impl->getSuperClass())
5915 Importer.ToDiag(Impl->getLocation(),
5916 diag::note_odr_objc_superclass)
5917 << Impl->getSuperClass()->getDeclName();
5919 Importer.ToDiag(Impl->getLocation(),
5920 diag::note_odr_objc_missing_superclass);
5923 diag::note_odr_objc_superclass)
5927 diag::note_odr_objc_missing_superclass);
5935 return std::move(Err);
5947 return std::move(Err);
5952 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
5953 for (
auto *FoundDecl : FoundDecls) {
5954 if (
auto *FoundProp = dyn_cast<ObjCPropertyDecl>(FoundDecl)) {
5961 if (!Importer.IsStructurallyEquivalent(D->
getType(),
5962 FoundProp->getType())) {
5963 Importer.ToDiag(Loc, diag::warn_odr_objc_property_type_inconsistent)
5964 << Name << D->
getType() << FoundProp->getType();
5965 Importer.ToDiag(FoundProp->getLocation(), diag::note_odr_value_here)
5966 << FoundProp->getType();
5974 Importer.MapImported(D, FoundProp);
5979 Error Err = Error::success();
5985 return std::move(Err);
5989 if (GetImportedOrCreateDecl(
5990 ToProperty, D, Importer.getToContext(), DC, Loc,
5992 ToLParenLoc, ToType,
6004 return std::move(Err);
6024 return std::move(Err);
6028 return std::move(Err);
6035 return std::move(Err);
6038 = InImpl->FindPropertyImplDecl(
Property->getIdentifier(),
6042 Error Err = Error::success();
6045 auto ToPropertyIvarDeclLoc =
6048 return std::move(Err);
6050 if (GetImportedOrCreateDecl(ToImpl, D, Importer.getToContext(), DC,
6054 ToPropertyIvarDeclLoc))
6064 diag::warn_odr_objc_property_impl_kind_inconsistent)
6069 diag::note_odr_objc_property_impl_kind)
6080 diag::warn_odr_objc_synthesize_ivar_inconsistent)
6085 diag::note_odr_objc_synthesize_ivar_here)
6092 Importer.MapImported(D, ToImpl);
6106 return BeginLocOrErr.takeError();
6110 return LocationOrErr.takeError();
6113 if (GetImportedOrCreateDecl(
6114 ToD, D, Importer.getToContext(),
6116 *BeginLocOrErr, *LocationOrErr,
6125 Error Err = Error::success();
6126 auto ToConceptRef =
importChecked(Err, TC->getConceptReference());
6127 auto ToIDC =
importChecked(Err, TC->getImmediatelyDeclaredConstraint());
6129 return std::move(Err);
6134 if (
Error Err = importTemplateParameterDefaultArgument(D, ToD))
6143 Error Err = Error::success();
6150 return std::move(Err);
6153 if (GetImportedOrCreateDecl(ToD, D, Importer.getToContext(),
6155 ToInnerLocStart, ToLocation, D->
getDepth(),
6157 ToDeclName.getAsIdentifierInfo(), ToType,
6161 Err = importTemplateParameterDefaultArgument(D, ToD);
6170 bool IsCanonical =
false;
6171 if (
auto *CanonD = Importer.getFromContext()
6172 .findCanonicalTemplateTemplateParmDeclInternal(D);
6179 return NameOrErr.takeError();
6184 return LocationOrErr.takeError();
6188 if (!TemplateParamsOrErr)
6189 return TemplateParamsOrErr.takeError();
6192 if (GetImportedOrCreateDecl(
6193 ToD, D, Importer.getToContext(),
6200 if (
Error Err = importTemplateParameterDefaultArgument(D, ToD))
6204 return Importer.getToContext()
6205 .insertCanonicalTemplateTemplateParmDeclInternal(ToD);
6213 assert(D->getTemplatedDecl() &&
"Should be called on templates only");
6214 auto *ToTemplatedDef = D->getTemplatedDecl()->getDefinition();
6215 if (!ToTemplatedDef)
6217 auto *TemplateWithDef = ToTemplatedDef->getDescribedTemplate();
6218 return cast_or_null<T>(TemplateWithDef);
6229 return std::move(Err);
6241 TD->getLexicalDeclContext()->isDependentContext();
6243 bool DependentFriend = IsDependentFriend(D);
6250 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
6251 for (
auto *FoundDecl : FoundDecls) {
6256 auto *FoundTemplate = dyn_cast<ClassTemplateDecl>(FoundDecl);
6257 if (FoundTemplate) {
6262 bool IgnoreTemplateParmDepth =
6266 IgnoreTemplateParmDepth)) {
6267 if (DependentFriend || IsDependentFriend(FoundTemplate))
6273 return Importer.MapImported(D, TemplateWithDef);
6275 FoundByLookup = FoundTemplate;
6293 ConflictingDecls.push_back(FoundDecl);
6297 if (!ConflictingDecls.empty()) {
6300 ConflictingDecls.size());
6302 Name = NameOrErr.get();
6304 return NameOrErr.takeError();
6311 if (!TemplateParamsOrErr)
6312 return TemplateParamsOrErr.takeError();
6316 if (
Error Err = importInto(ToTemplated, FromTemplated))
6317 return std::move(Err);
6321 if (GetImportedOrCreateDecl(D2, D, Importer.getToContext(), DC, Loc, Name,
6322 *TemplateParamsOrErr, ToTemplated))
6330 addDeclToContexts(D, D2);
6331 updateLookupTableForTemplateParameters(**TemplateParamsOrErr);
6333 if (FoundByLookup) {
6347 "Found decl must have its templated decl set");
6350 if (ToTemplated != PrevTemplated)
6364 return std::move(Err);
6369 return std::move(Err);
6375 return std::move(Err);
6378 void *InsertPos =
nullptr;
6381 dyn_cast<ClassTemplatePartialSpecializationDecl>(D);
6389 return ToTPListOrErr.takeError();
6390 ToTPList = *ToTPListOrErr;
6401 Importer.MapImported(D, PrevDefinition);
6404 for (
auto *FromField : D->
fields()) {
6405 auto ToOrErr =
import(FromField);
6407 return ToOrErr.takeError();
6413 auto ToOrErr =
import(FromM);
6415 return ToOrErr.takeError();
6423 return PrevDefinition;
6434 return BeginLocOrErr.takeError();
6437 return IdLocOrErr.takeError();
6443 return std::move(Err);
6449 if (GetImportedOrCreateDecl<ClassTemplatePartialSpecializationDecl>(
6450 D2, D, Importer.getToContext(), D->
getTagKind(), DC, *BeginLocOrErr,
6451 *IdLocOrErr, ToTPList, ClassTemplate,
ArrayRef(TemplateArgs),
6453 cast_or_null<ClassTemplatePartialSpecializationDecl>(PrevDecl)))
6465 PartSpec2->setInstantiatedFromMember(*ToInstOrErr);
6467 return ToInstOrErr.takeError();
6469 updateLookupTableForTemplateParameters(*ToTPList);
6471 if (GetImportedOrCreateDecl(D2, D, Importer.getToContext(), D->
getTagKind(),
6472 DC, *BeginLocOrErr, *IdLocOrErr, ClassTemplate,
6497 return BraceRangeOrErr.takeError();
6500 return std::move(Err);
6506 return LocOrErr.takeError();
6514 return LocOrErr.takeError();
6519 return LocOrErr.takeError();
6525 return POIOrErr.takeError();
6531 if (
auto *CTD = dyn_cast<ClassTemplateDecl *>(
P)) {
6532 if (
auto CTDorErr =
import(CTD))
6536 auto CTPSDOrErr =
import(CTPSD);
6538 return CTPSDOrErr.takeError();
6541 for (
unsigned I = 0; I < DArgs.
size(); ++I) {
6543 if (
auto ArgOrErr =
import(DArg))
6544 D2ArgsVec[I] = *ArgOrErr;
6546 return ArgOrErr.takeError();
6556 return std::move(Err);
6568 return std::move(Err);
6574 "Variable templates cannot be declared at function scope");
6577 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
6579 for (
auto *FoundDecl : FoundDecls) {
6583 if (
VarTemplateDecl *FoundTemplate = dyn_cast<VarTemplateDecl>(FoundDecl)) {
6593 assert(FoundTemplate->getDeclContext()->isRecord() &&
6594 "Member variable template imported as non-member, "
6595 "inconsistent imported AST?");
6597 return Importer.MapImported(D, FoundDef);
6599 return Importer.MapImported(D, FoundTemplate);
6602 return Importer.MapImported(D, FoundDef);
6604 FoundByLookup = FoundTemplate;
6607 ConflictingDecls.push_back(FoundDecl);
6611 if (!ConflictingDecls.empty()) {
6614 ConflictingDecls.size());
6616 Name = NameOrErr.get();
6618 return NameOrErr.takeError();
6627 return TypeOrErr.takeError();
6631 if (
Error Err = importInto(ToTemplated, DTemplated))
6632 return std::move(Err);
6636 if (!TemplateParamsOrErr)
6637 return TemplateParamsOrErr.takeError();
6640 if (GetImportedOrCreateDecl(ToVarTD, D, Importer.getToContext(), DC, Loc,
6641 Name, *TemplateParamsOrErr, ToTemplated))
6649 if (DC != Importer.getToContext().getTranslationUnitDecl())
6650 updateLookupTableForTemplateParameters(**TemplateParamsOrErr);
6652 if (FoundByLookup) {
6656 auto *PrevTemplated =
6658 if (ToTemplated != PrevTemplated)
6673 auto RedeclIt = Redecls.begin();
6676 for (; RedeclIt != Redecls.end() && *RedeclIt != D; ++RedeclIt) {
6679 return RedeclOrErr.takeError();
6681 assert(*RedeclIt == D);
6685 return std::move(Err);
6690 return std::move(Err);
6695 return BeginLocOrErr.takeError();
6699 return IdLocOrErr.takeError();
6705 return std::move(Err);
6708 void *InsertPos =
nullptr;
6710 VarTemplate->findSpecialization(TemplateArgs, InsertPos);
6711 if (FoundSpecialization) {
6719 "Member variable template specialization imported as non-member, "
6720 "inconsistent imported AST?");
6722 return Importer.MapImported(D, FoundDef);
6724 return Importer.MapImported(D, FoundSpecialization);
6729 return Importer.MapImported(D, FoundDef);
6741 return std::move(Err);
6746 if (
auto *FromPartial = dyn_cast<PartVarSpecDecl>(D)) {
6747 auto ToTPListOrErr =
import(FromPartial->getTemplateParameters());
6749 return ToTPListOrErr.takeError();
6751 PartVarSpecDecl *ToPartial;
6752 if (GetImportedOrCreateDecl(ToPartial, D, Importer.getToContext(), DC,
6753 *BeginLocOrErr, *IdLocOrErr, *ToTPListOrErr,
6759 import(FromPartial->getInstantiatedFromMember()))
6760 ToPartial->setInstantiatedFromMember(*ToInstOrErr);
6762 return ToInstOrErr.takeError();
6764 if (FromPartial->isMemberSpecialization())
6765 ToPartial->setMemberSpecialization();
6773 if (GetImportedOrCreateDecl(D2, D, Importer.getToContext(), DC,
6782 if (!
VarTemplate->findSpecialization(TemplateArgs, InsertPos))
6787 return std::move(Err);
6792 return TInfoOrErr.takeError();
6799 return POIOrErr.takeError();
6810 return LocOrErr.takeError();
6818 return std::move(Err);
6820 if (FoundSpecialization)
6823 addDeclToContexts(D, D2);
6826 for (++RedeclIt; RedeclIt != Redecls.end(); ++RedeclIt) {
6829 return RedeclOrErr.takeError();
6843 return std::move(Err);
6855 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
6856 for (
auto *FoundDecl : FoundDecls) {
6857 if (!FoundDecl->isInIdentifierNamespace(IDNS))
6860 if (
auto *FoundTemplate = dyn_cast<FunctionTemplateDecl>(FoundDecl)) {
6867 return Importer.MapImported(D, TemplateWithDef);
6869 FoundByLookup = FoundTemplate;
6879 return ParamsOrErr.takeError();
6884 return std::move(Err);
6901 OldParamDC.reserve(Params->
size());
6902 llvm::transform(*Params, std::back_inserter(OldParamDC),
6906 if (GetImportedOrCreateDecl(ToFunc, D, Importer.getToContext(), DC, Loc, Name,
6907 Params, TemplatedFD))
6921 ToFunc->setLexicalDeclContext(LexicalDC);
6922 addDeclToContexts(D, ToFunc);
6925 if (LT && !OldParamDC.empty()) {
6926 for (
unsigned int I = 0; I < OldParamDC.size(); ++I)
6927 LT->updateForced(Params->
getParam(I), OldParamDC[I]);
6930 if (FoundByLookup) {
6935 "Found decl must have its templated decl set");
6936 auto *PrevTemplated =
6938 if (TemplatedFD != PrevTemplated)
6955 return std::move(Err);
6958 if (GetImportedOrCreateDecl(To, D, Importer.getToContext(), DC, LocationOrErr,
6959 NameDeclOrErr, ToTemplateParameters,
6973 return std::move(Err);
6976 if (GetImportedOrCreateDecl(To, D, Importer.getToContext(), DC, RequiresLoc))
6989 return std::move(Err);
6993 return std::move(Err);
6996 if (GetImportedOrCreateDecl(To, D, Importer.getToContext(), DC, ToSL, ToArgs))
7008 Importer.FromDiag(S->
getBeginLoc(), diag::err_unsupported_ast_node)
7015 if (Importer.returnWithErrorInTest())
7022 Names.push_back(ToII);
7025 for (
unsigned I = 0, E = S->
getNumInputs(); I != E; I++) {
7029 Names.push_back(ToII);
7035 Clobbers.push_back(*ClobberOrErr);
7037 return ClobberOrErr.takeError();
7044 Constraints.push_back(*OutputOrErr);
7046 return OutputOrErr.takeError();
7049 for (
unsigned I = 0, E = S->
getNumInputs(); I != E; I++) {
7051 Constraints.push_back(*InputOrErr);
7053 return InputOrErr.takeError();
7059 return std::move(Err);
7063 return std::move(Err);
7067 return std::move(Err);
7071 return AsmLocOrErr.takeError();
7074 return AsmStrOrErr.takeError();
7076 if (!RParenLocOrErr)
7077 return RParenLocOrErr.takeError();
7079 return new (Importer.getToContext())
GCCAsmStmt(
7080 Importer.getToContext(),
7098 Error Err = Error::success();
7103 return std::move(Err);
7104 return new (Importer.getToContext())
DeclStmt(ToDG, ToBeginLoc, ToEndLoc);
7109 if (!ToSemiLocOrErr)
7110 return ToSemiLocOrErr.takeError();
7111 return new (Importer.getToContext())
NullStmt(
7119 return std::move(Err);
7122 if (!ToLBracLocOrErr)
7123 return ToLBracLocOrErr.takeError();
7126 if (!ToRBracLocOrErr)
7127 return ToRBracLocOrErr.takeError();
7132 *ToLBracLocOrErr, *ToRBracLocOrErr);
7137 Error Err = Error::success();
7145 return std::move(Err);
7148 ToCaseLoc, ToEllipsisLoc, ToColonLoc);
7149 ToStmt->setSubStmt(ToSubStmt);
7156 Error Err = Error::success();
7161 return std::move(Err);
7164 ToDefaultLoc, ToColonLoc, ToSubStmt);
7169 Error Err = Error::success();
7174 return std::move(Err);
7176 return new (Importer.getToContext())
LabelStmt(
7177 ToIdentLoc, ToLabelDecl, ToSubStmt);
7182 if (!ToAttrLocOrErr)
7183 return ToAttrLocOrErr.takeError();
7187 return std::move(Err);
7189 if (!ToSubStmtOrErr)
7190 return ToSubStmtOrErr.takeError();
7193 Importer.getToContext(), *ToAttrLocOrErr, ToAttrs, *ToSubStmtOrErr);
7198 Error Err = Error::success();
7209 return std::move(Err);
7212 ToInit, ToConditionVariable, ToCond, ToLParenLoc,
7213 ToRParenLoc, ToThen, ToElseLoc, ToElse);
7218 Error Err = Error::success();
7227 return std::move(Err);
7231 ToCond, ToLParenLoc, ToRParenLoc);
7232 ToStmt->setBody(ToBody);
7233 ToStmt->setSwitchLoc(ToSwitchLoc);
7241 return ToSCOrErr.takeError();
7242 if (LastChainedSwitchCase)
7245 ToStmt->setSwitchCaseList(*ToSCOrErr);
7246 LastChainedSwitchCase = *ToSCOrErr;
7254 Error Err = Error::success();
7262 return std::move(Err);
7265 ToBody, ToWhileLoc, ToLParenLoc, ToRParenLoc);
7270 Error Err = Error::success();
7277 return std::move(Err);
7279 return new (Importer.getToContext())
DoStmt(
7280 ToBody, ToCond, ToDoLoc, ToWhileLoc, ToRParenLoc);
7285 Error Err = Error::success();
7295 return std::move(Err);
7297 return new (Importer.getToContext())
ForStmt(
7298 Importer.getToContext(),
7299 ToInit, ToCond, ToConditionVariable, ToInc, ToBody, ToForLoc, ToLParenLoc,
7305 Error Err = Error::success();
7310 return std::move(Err);
7312 return new (Importer.getToContext())
GotoStmt(
7313 ToLabel, ToGotoLoc, ToLabelLoc);
7318 Error Err = Error::success();
7323 return std::move(Err);
7326 ToGotoLoc, ToStarLoc, ToTarget);
7329template <
typename StmtClass>
7332 Error Err = Error::success();
7333 auto ToLoc = NodeImporter.
importChecked(Err, S->getKwLoc());
7334 auto ToLabelLoc = S->hasLabelTarget()
7337 auto ToDecl = S->hasLabelTarget()
7341 return std::move(Err);
7342 return new (Importer.
getToContext()) StmtClass(ToLoc, ToLabelLoc, ToDecl);
7355 Error Err = Error::success();
7360 return std::move(Err);
7368 Error Err = Error::success();
7373 return std::move(Err);
7376 ToCatchLoc, ToExceptionDecl, ToHandlerBlock);
7382 return ToTryLocOrErr.takeError();
7385 if (!ToTryBlockOrErr)
7386 return ToTryBlockOrErr.takeError();
7389 for (
unsigned HI = 0, HE = S->
getNumHandlers(); HI != HE; ++HI) {
7391 if (
auto ToHandlerOrErr =
import(FromHandler))
7392 ToHandlers[HI] = *ToHandlerOrErr;
7394 return ToHandlerOrErr.takeError();
7403 Error Err = Error::success();
7417 return std::move(Err);
7420 ToInit, ToRangeStmt, ToBeginStmt, ToEndStmt, ToCond, ToInc, ToLoopVarStmt,
7421 ToBody, ToForLoc, ToCoawaitLoc, ToColonLoc, ToRParenLoc);
7426 Error Err = Error::success();
7433 return std::move(Err);
7444 Error Err = Error::success();
7450 return std::move(Err);
7453 ToAtCatchLoc, ToRParenLoc, ToCatchParamDecl, ToCatchBody);
7458 if (!ToAtFinallyLocOrErr)
7459 return ToAtFinallyLocOrErr.takeError();
7461 if (!ToAtFinallyStmtOrErr)
7462 return ToAtFinallyStmtOrErr.takeError();
7464 *ToAtFinallyStmtOrErr);
7469 Error Err = Error::success();
7474 return std::move(Err);
7479 if (
ExpectedStmt ToCatchStmtOrErr =
import(FromCatchStmt))
7480 ToCatchStmts[CI] = *ToCatchStmtOrErr;
7482 return ToCatchStmtOrErr.takeError();
7486 ToAtTryLoc, ToTryBody,
7487 ToCatchStmts.begin(), ToCatchStmts.size(),
7494 Error Err = Error::success();
7499 return std::move(Err);
7502 ToAtSynchronizedLoc, ToSynchExpr, ToSynchBody);
7507 if (!ToThrowLocOrErr)
7508 return ToThrowLocOrErr.takeError();
7510 if (!ToThrowExprOrErr)
7511 return ToThrowExprOrErr.takeError();
7513 *ToThrowLocOrErr, *ToThrowExprOrErr);
7520 return ToAtLocOrErr.takeError();
7522 if (!ToSubStmtOrErr)
7523 return ToSubStmtOrErr.takeError();
7532 Importer.FromDiag(E->
getBeginLoc(), diag::err_unsupported_ast_node)
7538 Error Err = Error::success();
7543 return std::move(Err);
7545 if (!ParentContextOrErr)
7546 return ParentContextOrErr.takeError();
7548 return new (Importer.getToContext())
7550 RParenLoc, *ParentContextOrErr);
7555 Error Err = Error::success();
7562 return std::move(Err);
7564 return new (Importer.getToContext())
VAArgExpr(
7565 ToBuiltinLoc, ToSubExpr, ToWrittenTypeInfo, ToRParenLoc, ToType,
7571 Error Err = Error::success();
7579 return std::move(Err);
7588 return new (Importer.getToContext())
7589 ChooseExpr(ToBuiltinLoc, ToCond, ToLHS, ToRHS, ToType,
VK, OK,
7590 ToRParenLoc, CondIsTrue);
7594 Error Err = Error::success();
7601 return std::move(Err);
7604 Importer.getToContext(), ToSrcExpr, ToTSI, ToType, E->
getValueKind(),
7610 Error Err = Error::success();
7618 ToSubExprs.resize(NumSubExprs);
7621 return std::move(Err);
7624 Importer.getToContext(), ToSubExprs, ToType, ToBeginLoc, ToRParenLoc);
7630 return TypeOrErr.takeError();
7634 return BeginLocOrErr.takeError();
7636 return new (Importer.getToContext())
GNUNullExpr(*TypeOrErr, *BeginLocOrErr);
7641 Error Err = Error::success();
7643 Expr *ToControllingExpr =
nullptr;
7649 assert((ToControllingExpr || ToControllingType) &&
7650 "Either the controlling expr or type must be nonnull");
7654 return std::move(Err);
7659 return std::move(Err);
7664 return std::move(Err);
7666 const ASTContext &ToCtx = Importer.getToContext();
7668 if (ToControllingExpr) {
7670 ToCtx, ToGenericLoc, ToControllingExpr,
ArrayRef(ToAssocTypes),
7671 ArrayRef(ToAssocExprs), ToDefaultLoc, ToRParenLoc,
7675 ToCtx, ToGenericLoc, ToControllingType,
ArrayRef(ToAssocTypes),
7676 ArrayRef(ToAssocExprs), ToDefaultLoc, ToRParenLoc,
7680 if (ToControllingExpr) {
7682 ToCtx, ToGenericLoc, ToControllingExpr,
ArrayRef(ToAssocTypes),
7683 ArrayRef(ToAssocExprs), ToDefaultLoc, ToRParenLoc,
7687 ToCtx, ToGenericLoc, ToControllingType,
ArrayRef(ToAssocTypes),
7688 ArrayRef(ToAssocExprs), ToDefaultLoc, ToRParenLoc,
7694 Error Err = Error::success();
7699 return std::move(Err);
7708 Error Err = Error::success();
7715 return std::move(Err);
7721 return FoundDOrErr.takeError();
7722 ToFoundD = *FoundDOrErr;
7731 return std::move(Err);
7732 ToResInfo = &ToTAInfo;
7736 Importer.getToContext(), ToQualifierLoc, ToTemplateKeywordLoc, ToDecl,
7740 ToE->setHadMultipleCandidates(
true);
7748 return TypeOrErr.takeError();
7756 return ToInitOrErr.takeError();
7759 if (!ToEqualOrColonLocOrErr)
7760 return ToEqualOrColonLocOrErr.takeError();
7766 ToIndexExprs[I - 1] = *ToArgOrErr;
7768 return ToArgOrErr.takeError();
7773 return std::move(Err);
7776 Importer.getToContext(), ToDesignators,
7777 ToIndexExprs, *ToEqualOrColonLocOrErr,
7785 return ToTypeOrErr.takeError();
7788 if (!ToLocationOrErr)
7789 return ToLocationOrErr.takeError();
7792 *ToTypeOrErr, *ToLocationOrErr);
7798 return ToTypeOrErr.takeError();
7801 if (!ToLocationOrErr)
7802 return ToLocationOrErr.takeError();
7805 Importer.getToContext(), E->
getValue(), *ToTypeOrErr, *ToLocationOrErr);
7812 return ToTypeOrErr.takeError();
7815 if (!ToLocationOrErr)
7816 return ToLocationOrErr.takeError();
7820 *ToTypeOrErr, *ToLocationOrErr);
7824 auto ToTypeOrErr =
import(E->
getType());
7826 return ToTypeOrErr.takeError();
7829 if (!ToSubExprOrErr)
7830 return ToSubExprOrErr.takeError();
7833 *ToSubExprOrErr, *ToTypeOrErr);
7837 auto ToTypeOrErr =
import(E->
getType());
7839 return ToTypeOrErr.takeError();
7842 if (!ToLocationOrErr)
7843 return ToLocationOrErr.takeError();
7846 Importer.getToContext(), E->
getValue(), *ToTypeOrErr, *ToLocationOrErr,
7847 Importer.getToContext().getFixedPointScale(*ToTypeOrErr));
7853 return ToTypeOrErr.takeError();
7856 if (!ToLocationOrErr)
7857 return ToLocationOrErr.takeError();
7866 return ToTypeOrErr.takeError();
7871 return std::move(Err);
7880 Error Err = Error::success();
7886 return std::move(Err);
7889 ToLParenLoc, ToTypeSourceInfo, ToType, E->
getValueKind(),
7895 Error Err = Error::success();
7900 return std::move(Err);
7906 return std::move(Err);
7908 return new (Importer.getToContext())
AtomicExpr(
7910 ToBuiltinLoc, ToExprs, ToType, E->
getOp(), ToRParenLoc);
7914 Error Err = Error::success();
7920 return std::move(Err);
7923 ToAmpAmpLoc, ToLabelLoc, ToLabel, ToType);
7926 Error Err = Error::success();
7930 return std::move(Err);
7935 Error Err = Error::success();
7940 return std::move(Err);
7942 return new (Importer.getToContext())
7943 ParenExpr(ToLParen, ToRParen, ToSubExpr);
7949 return std::move(Err);
7952 if (!ToLParenLocOrErr)
7953 return ToLParenLocOrErr.takeError();
7956 if (!ToRParenLocOrErr)
7957 return ToRParenLocOrErr.takeError();
7960 ToExprs, *ToRParenLocOrErr);
7964 Error Err = Error::success();
7970 return std::move(Err);
7972 return new (Importer.getToContext())
7973 StmtExpr(ToSubStmt, ToType, ToLParenLoc, ToRParenLoc,
7978 Error Err = Error::success();
7983 return std::move(Err);
7987 UO->setType(ToType);
7988 UO->setSubExpr(ToSubExpr);
7990 UO->setOperatorLoc(ToOperatorLoc);
8001 Error Err = Error::success();
8006 return std::move(Err);
8011 if (!ToArgumentTypeInfoOrErr)
8012 return ToArgumentTypeInfoOrErr.takeError();
8015 E->
getKind(), *ToArgumentTypeInfoOrErr, ToType, ToOperatorLoc,
8020 if (!ToArgumentExprOrErr)
8021 return ToArgumentExprOrErr.takeError();
8024 E->
getKind(), *ToArgumentExprOrErr, ToType, ToOperatorLoc, ToRParenLoc);
8028 Error Err = Error::success();
8034 return std::move(Err);
8037 Importer.getToContext(), ToLHS, ToRHS, E->
getOpcode(), ToType,
8043 Error Err = Error::success();
8051 return std::move(Err);
8054 ToCond, ToQuestionLoc, ToLHS, ToColonLoc, ToRHS, ToType,
8060 Error Err = Error::success();
8070 return std::move(Err);
8073 ToCommon, ToOpaqueValue, ToCond, ToTrueExpr, ToFalseExpr,
8080 Error Err = Error::success();
8083 return std::move(Err);
8085 return new (Importer.getToContext())
8090 Error Err = Error::success();
8092 auto ToQueriedTypeSourceInfo =
8098 return std::move(Err);
8102 ToDimensionExpression, ToEndLoc, ToType);
8106 Error Err = Error::success();
8112 return std::move(Err);
8120 Error Err = Error::success();
8125 return std::move(Err);
8132 Error Err = Error::success();
8138 return std::move(Err);
8147 Error Err = Error::success();
8152 auto ToComputationResultType =
8156 return std::move(Err);
8159 Importer.getToContext(), ToLHS, ToRHS, E->
getOpcode(), ToType,
8162 ToComputationLHSType, ToComputationResultType);
8169 if (
auto SpecOrErr =
import(*I))
8170 Path.push_back(*SpecOrErr);
8172 return SpecOrErr.takeError();
8180 return ToTypeOrErr.takeError();
8183 if (!ToSubExprOrErr)
8184 return ToSubExprOrErr.takeError();
8187 if (!ToBasePathOrErr)
8188 return ToBasePathOrErr.takeError();
8191 Importer.getToContext(), *ToTypeOrErr, E->
getCastKind(), *ToSubExprOrErr,
8196 Error Err = Error::success();
8201 return std::move(Err);
8204 if (!ToBasePathOrErr)
8205 return ToBasePathOrErr.takeError();
8209 case Stmt::CStyleCastExprClass: {
8211 ExpectedSLoc ToLParenLocOrErr =
import(CCE->getLParenLoc());
8212 if (!ToLParenLocOrErr)
8213 return ToLParenLocOrErr.takeError();
8214 ExpectedSLoc ToRParenLocOrErr =
import(CCE->getRParenLoc());
8215 if (!ToRParenLocOrErr)
8216 return ToRParenLocOrErr.takeError();
8219 ToSubExpr, ToBasePath, CCE->getFPFeatures(), ToTypeInfoAsWritten,
8220 *ToLParenLocOrErr, *ToRParenLocOrErr);
8223 case Stmt::CXXFunctionalCastExprClass: {
8225 ExpectedSLoc ToLParenLocOrErr =
import(FCE->getLParenLoc());
8226 if (!ToLParenLocOrErr)
8227 return ToLParenLocOrErr.takeError();
8228 ExpectedSLoc ToRParenLocOrErr =
import(FCE->getRParenLoc());
8229 if (!ToRParenLocOrErr)
8230 return ToRParenLocOrErr.takeError();
8232 Importer.getToContext(), ToType, E->
getValueKind(), ToTypeInfoAsWritten,
8233 E->
getCastKind(), ToSubExpr, ToBasePath, FCE->getFPFeatures(),
8234 *ToLParenLocOrErr, *ToRParenLocOrErr);
8237 case Stmt::ObjCBridgedCastExprClass: {
8239 ExpectedSLoc ToLParenLocOrErr =
import(OCE->getLParenLoc());
8240 if (!ToLParenLocOrErr)
8241 return ToLParenLocOrErr.takeError();
8242 ExpectedSLoc ToBridgeKeywordLocOrErr =
import(OCE->getBridgeKeywordLoc());
8243 if (!ToBridgeKeywordLocOrErr)
8244 return ToBridgeKeywordLocOrErr.takeError();
8246 *ToLParenLocOrErr, OCE->getBridgeKind(), E->
getCastKind(),
8247 *ToBridgeKeywordLocOrErr, ToTypeInfoAsWritten, ToSubExpr);
8249 case Stmt::BuiltinBitCastExprClass: {
8251 ExpectedSLoc ToKWLocOrErr =
import(BBC->getBeginLoc());
8253 return ToKWLocOrErr.takeError();
8254 ExpectedSLoc ToRParenLocOrErr =
import(BBC->getEndLoc());
8255 if (!ToRParenLocOrErr)
8256 return ToRParenLocOrErr.takeError();
8259 ToTypeInfoAsWritten, *ToKWLocOrErr, *ToRParenLocOrErr);
8262 llvm_unreachable(
"Cast expression of unsupported type!");
8275 Error Err = Error::success();
8279 return std::move(Err);
8288 auto ToBSOrErr =
import(FromNode.
getBase());
8290 return ToBSOrErr.takeError();
8295 auto ToFieldOrErr =
import(FromNode.
getField());
8297 return ToFieldOrErr.takeError();
8298 ToNodes.push_back(
OffsetOfNode(ToBeginLoc, *ToFieldOrErr, ToEndLoc));
8303 ToNodes.push_back(
OffsetOfNode(ToBeginLoc, ToII, ToEndLoc));
8312 if (!ToIndexExprOrErr)
8313 return ToIndexExprOrErr.takeError();
8314 ToExprs[I] = *ToIndexExprOrErr;
8317 Error Err = Error::success();
8323 return std::move(Err);
8326 Importer.getToContext(), ToType, ToOperatorLoc, ToTypeSourceInfo, ToNodes,
8327 ToExprs, ToRParenLoc);
8331 Error Err = Error::success();
8337 return std::move(Err);
8346 ToType, ToOperand, ToCanThrow, ToBeginLoc, ToEndLoc);
8350 Error Err = Error::success();
8355 return std::move(Err);
8363 if (!ToUsedLocOrErr)
8364 return ToUsedLocOrErr.takeError();
8366 auto ToParamOrErr =
import(E->
getParam());
8368 return ToParamOrErr.takeError();
8370 auto UsedContextOrErr = Importer.ImportContext(E->
getUsedContext());
8371 if (!UsedContextOrErr)
8372 return UsedContextOrErr.takeError();
8382 std::optional<ParmVarDecl *> FromParam =
8383 Importer.getImportedFromDecl(ToParam);
8384 assert(FromParam &&
"ParmVarDecl was not imported?");
8387 return std::move(Err);
8389 Expr *RewrittenInit =
nullptr;
8393 return ExprOrErr.takeError();
8394 RewrittenInit = ExprOrErr.get();
8397 *ToParamOrErr, RewrittenInit,
8403 Error Err = Error::success();
8408 return std::move(Err);
8411 ToType, ToTypeSourceInfo, ToRParenLoc);
8417 if (!ToSubExprOrErr)
8418 return ToSubExprOrErr.takeError();
8420 auto ToDtorOrErr =
import(E->
getTemporary()->getDestructor());
8422 return ToDtorOrErr.takeError();
8432 Error Err = Error::success();
8438 return std::move(Err);
8442 return std::move(Err);
8445 Importer.getToContext(), ToConstructor, ToType, ToTypeSourceInfo, ToArgs,
8455 return std::move(Err);
8457 Error Err = Error::success();
8461 return std::move(Err);
8465 if (GetImportedOrCreateDecl(To, D, Temporary, ExtendingDecl,
8476 Error Err = Error::success();
8480 auto ToMaterializedDecl =
8483 return std::move(Err);
8485 if (!ToTemporaryExpr)
8486 ToTemporaryExpr =
cast<Expr>(ToMaterializedDecl->getTemporaryExpr());
8490 ToMaterializedDecl);
8496 Error Err = Error::success();
8500 return std::move(Err);
8502 return new (Importer.getToContext())
8507 Error Err = Error::success();
8513 return std::move(Err);
8522 ToPartialArguments))
8523 return std::move(Err);
8527 Importer.getToContext(), ToOperatorLoc, ToPack, ToPackLoc, ToRParenLoc,
8528 Length, ToPartialArguments);
8533 Error Err = Error::success();
8540 auto ToAllocatedTypeSourceInfo =
8545 return std::move(Err);
8550 return std::move(Err);
8553 Importer.getToContext(), E->
isGlobalNew(), ToOperatorNew,
8557 ToAllocatedTypeSourceInfo, ToSourceRange, ToDirectInitRange);
8561 Error Err = Error::success();
8567 return std::move(Err);
8576 Error Err = Error::success();
8582 return std::move(Err);
8586 return std::move(Err);
8589 Importer.getToContext(), ToType, ToLocation, ToConstructor,
8593 ToParenOrBraceRange);
8600 if (!ToSubExprOrErr)
8601 return ToSubExprOrErr.takeError();
8605 return std::move(Err);
8613 Error Err = Error::success();
8618 return std::move(Err);
8622 return std::move(Err);
8632 return ToTypeOrErr.takeError();
8635 if (!ToLocationOrErr)
8636 return ToLocationOrErr.takeError();
8645 return ToTypeOrErr.takeError();
8648 if (!ToLocationOrErr)
8649 return ToLocationOrErr.takeError();
8652 *ToTypeOrErr, *ToLocationOrErr);
8656 Error Err = Error::success();
8667 return std::move(Err);
8679 return std::move(Err);
8680 ResInfo = &ToTAInfo;
8684 ToOperatorLoc, ToQualifierLoc, ToTemplateKeywordLoc,
8685 ToMemberDecl, ToFoundDecl, ToMemberNameInfo,
8692 Error Err = Error::success();
8700 return std::move(Err);
8706 if (!ToDestroyedTypeLocOrErr)
8707 return ToDestroyedTypeLocOrErr.takeError();
8713 return ToTIOrErr.takeError();
8717 Importer.getToContext(), ToBase, E->
isArrow(), ToOperatorLoc,
8718 ToQualifierLoc, ToScopeTypeInfo, ToColonColonLoc, ToTildeLoc, Storage);
8723 Error Err = Error::success();
8728 auto ToFirstQualifierFoundInScope =
8731 return std::move(Err);
8733 Expr *ToBase =
nullptr;
8736 ToBase = *ToBaseOrErr;
8738 return ToBaseOrErr.takeError();
8747 return std::move(Err);
8748 ResInfo = &ToTAInfo;
8753 return std::move(Err);
8759 return std::move(Err);
8762 Importer.getToContext(), ToBase, ToType, E->
isArrow(), ToOperatorLoc,
8763 ToQualifierLoc, ToTemplateKeywordLoc, ToFirstQualifierFoundInScope,
8764 ToMemberNameInfo, ResInfo);
8769 Error Err = Error::success();
8777 return std::move(Err);
8781 return std::move(Err);
8788 return std::move(Err);
8789 ResInfo = &ToTAInfo;
8793 Importer.getToContext(), ToQualifierLoc, ToTemplateKeywordLoc,
8794 ToNameInfo, ResInfo);
8799 Error Err = Error::success();
8805 return std::move(Err);
8810 return std::move(Err);
8813 Importer.getToContext(), ToType, ToTypeSourceInfo, ToLParenLoc,
8820 if (!ToNamingClassOrErr)
8821 return ToNamingClassOrErr.takeError();
8824 if (!ToQualifierLocOrErr)
8825 return ToQualifierLocOrErr.takeError();
8827 Error Err = Error::success();
8831 return std::move(Err);
8836 return std::move(Err);
8839 for (
auto *D : E->
decls())
8840 if (
auto ToDOrErr =
import(D))
8843 return ToDOrErr.takeError();
8850 return std::move(Err);
8853 if (!ToTemplateKeywordLocOrErr)
8854 return ToTemplateKeywordLocOrErr.takeError();
8856 const bool KnownDependent =
8858 ExprDependence::TypeValue;
8860 Importer.getToContext(), *ToNamingClassOrErr, *ToQualifierLocOrErr,
8861 *ToTemplateKeywordLocOrErr, ToNameInfo, E->
requiresADL(), &ToTAInfo,
8862 ToDecls.
begin(), ToDecls.
end(), KnownDependent,
8867 Importer.getToContext(), *ToNamingClassOrErr, *ToQualifierLocOrErr,
8875 Error Err = Error::success();
8883 return std::move(Err);
8888 return std::move(Err);
8892 if (
auto ToDOrErr =
import(D))
8895 return ToDOrErr.takeError();
8903 return std::move(Err);
8904 ResInfo = &ToTAInfo;
8907 Expr *ToBase =
nullptr;
8910 ToBase = *ToBaseOrErr;
8912 return ToBaseOrErr.takeError();
8917 E->
isArrow(), ToOperatorLoc, ToQualifierLoc, ToTemplateKeywordLoc,
8918 ToNameInfo, ResInfo, ToDecls.
begin(), ToDecls.
end());
8922 Error Err = Error::success();
8927 return std::move(Err);
8932 return std::move(Err);
8934 if (
const auto *OCE = dyn_cast<CXXOperatorCallExpr>(E)) {
8936 Importer.getToContext(), OCE->getOperator(), ToCallee, ToArgs, ToType,
8937 OCE->getValueKind(), ToRParenLoc, OCE->getFPFeatures(),
8938 OCE->getADLCallKind());
8948 auto ToClassOrErr =
import(FromClass);
8950 return ToClassOrErr.takeError();
8955 return ToCallOpOrErr.takeError();
8959 return std::move(Err);
8961 Error Err = Error::success();
8966 return std::move(Err);
8977 Error Err = Error::success();
8982 return std::move(Err);
8986 return std::move(Err);
8990 ToCtx, ToLBraceLoc, ToExprs, ToRBraceLoc);
8997 return ToFillerOrErr.takeError();
9001 if (
auto ToFDOrErr =
import(FromFD))
9004 return ToFDOrErr.takeError();
9008 if (
auto ToSyntFormOrErr =
import(SyntForm))
9011 return ToSyntFormOrErr.takeError();
9025 return ToTypeOrErr.takeError();
9028 if (!ToSubExprOrErr)
9029 return ToSubExprOrErr.takeError();
9032 *ToTypeOrErr, *ToSubExprOrErr);
9037 Error Err = Error::success();
9042 return std::move(Err);
9050 Error Err = Error::success();
9055 return std::move(Err);
9058 ToType, ToCommonExpr, ToSubExpr);
9064 return ToTypeOrErr.takeError();
9070 if (!ToBeginLocOrErr)
9071 return ToBeginLocOrErr.takeError();
9073 auto ToFieldOrErr =
import(E->
getField());
9075 return ToFieldOrErr.takeError();
9077 auto UsedContextOrErr = Importer.ImportContext(E->
getUsedContext());
9078 if (!UsedContextOrErr)
9079 return UsedContextOrErr.takeError();
9083 "Field should have in-class initializer if there is a default init "
9084 "expression that uses it.");
9089 auto ToInClassInitializerOrErr =
9090 import(E->
getField()->getInClassInitializer());
9091 if (!ToInClassInitializerOrErr)
9092 return ToInClassInitializerOrErr.takeError();
9096 Expr *RewrittenInit =
nullptr;
9100 return ExprOrErr.takeError();
9101 RewrittenInit = ExprOrErr.get();
9105 ToField, *UsedContextOrErr, RewrittenInit);
9109 Error Err = Error::success();
9117 return std::move(Err);
9122 if (!ToBasePathOrErr)
9123 return ToBasePathOrErr.takeError();
9125 if (
auto CCE = dyn_cast<CXXStaticCastExpr>(E)) {
9127 Importer.getToContext(), ToType,
VK, CK, ToSubExpr, &(*ToBasePathOrErr),
9128 ToTypeInfoAsWritten, CCE->getFPFeatures(), ToOperatorLoc, ToRParenLoc,
9132 Importer.getToContext(), ToType,
VK, CK, ToSubExpr, &(*ToBasePathOrErr),
9133 ToTypeInfoAsWritten, ToOperatorLoc, ToRParenLoc, ToAngleBrackets);
9136 Importer.getToContext(), ToType,
VK, CK, ToSubExpr, &(*ToBasePathOrErr),
9137 ToTypeInfoAsWritten, ToOperatorLoc, ToRParenLoc, ToAngleBrackets);
9140 Importer.getToContext(), ToType,
VK, ToSubExpr, ToTypeInfoAsWritten,
9141 ToOperatorLoc, ToRParenLoc, ToAngleBrackets);
9143 llvm_unreachable(
"Unknown cast type");
9144 return make_error<ASTImportError>();
9150 Error Err = Error::success();
9156 return std::move(Err);
9159 ToType, E->
getValueKind(), ToNameLoc, ToReplacement, ToAssociatedDecl,
9165 Error Err = Error::success();
9170 return std::move(Err);
9174 return std::move(Err);
9181 E->
getTrait(), ToArgs, ToEndLoc, ToValue);
9191 return ToTypeOrErr.takeError();
9194 if (!ToSourceRangeOrErr)
9195 return ToSourceRangeOrErr.takeError();
9200 *ToTypeOrErr, *ToTSIOrErr, *ToSourceRangeOrErr);
9202 return ToTSIOrErr.takeError();
9206 if (!ToExprOperandOrErr)
9207 return ToExprOperandOrErr.takeError();
9210 *ToTypeOrErr, *ToExprOperandOrErr, *ToSourceRangeOrErr);
9214 Error Err = Error::success();
9225 return std::move(Err);
9227 return new (Importer.getToContext())
9233 Error Err = Error::success();
9241 return std::move(Err);
9245 return std::move(Err);
9250 return std::move(Err);
9252 LParenLoc, LocalParameters, RParenLoc,
9253 Requirements, RBraceLoc);
9258 Error Err = Error::success();
9262 return std::move(Err);
9265 Importer.getToContext(),
CL,
9270 return std::move(Err);
9272 Importer.getToContext(),
CL,
9278 Error ImportErrors = Error::success();
9280 if (
auto ImportedOrErr =
import(FromOverriddenMethod))
9282 (*ImportedOrErr)->getCanonicalDecl()));
9285 joinErrors(std::move(ImportErrors), ImportedOrErr.takeError());
9287 return ImportErrors;
9293 std::shared_ptr<ASTImporterSharedState> SharedState)
9294 : SharedState(SharedState), ToContext(ToContext), FromContext(FromContext),
9295 ToFileManager(ToFileManager), FromFileManager(FromFileManager),
9300 this->SharedState = std::make_shared<ASTImporterSharedState>();
9303 ImportedDecls[FromContext.getTranslationUnitDecl()] =
9304 ToContext.getTranslationUnitDecl();
9311 "Try to get field index for non-field.");
9315 return std::nullopt;
9318 for (
const auto *D : Owner->decls()) {
9326 llvm_unreachable(
"Field was not found in its parent context.");
9328 return std::nullopt;
9331ASTImporter::FoundDeclsTy
9341 if (SharedState->getLookupTable()) {
9349 dyn_cast<NamespaceDecl>(ReDC));
9350 for (
auto *D : NSChain) {
9352 SharedState->getLookupTable()->lookup(dyn_cast<NamespaceDecl>(D),
9359 SharedState->getLookupTable()->lookup(ReDC, Name);
9360 return FoundDeclsTy(LookupResult.begin(), LookupResult.end());
9364 FoundDeclsTy
Result(NoloadLookupResult.
begin(), NoloadLookupResult.
end());
9381void ASTImporter::AddToLookupTable(
Decl *ToD) {
9382 SharedState->addDeclToLookup(ToD);
9388 return Importer.
Visit(FromD);
9412 llvm::DenseMap<const Type *, const Type *>::iterator Pos =
9413 ImportedTypes.find(FromT);
9414 if (Pos != ImportedTypes.end())
9421 return ToTOrErr.takeError();
9424 ImportedTypes[FromT] = ToTOrErr->getTypePtr();
9426 return ToTOrErr->getTypePtr();
9435 return ToTyOrErr.takeError();
9448 return TOrErr.takeError();
9451 return BeginLocOrErr.takeError();
9453 return ToContext.getTrivialTypeSourceInfo(*TOrErr, *BeginLocOrErr);
9460template <
typename T>
struct AttrArgImporter {
9461 AttrArgImporter(
const AttrArgImporter<T> &) =
delete;
9462 AttrArgImporter(AttrArgImporter<T> &&) =
default;
9463 AttrArgImporter<T> &operator=(
const AttrArgImporter<T> &) =
delete;
9464 AttrArgImporter<T> &operator=(AttrArgImporter<T> &&) =
default;
9467 : To(I.importChecked(Err, From)) {}
9469 const T &value() {
return To; }
9480template <
typename T>
struct AttrArgArrayImporter {
9481 AttrArgArrayImporter(
const AttrArgArrayImporter<T> &) =
delete;
9482 AttrArgArrayImporter(AttrArgArrayImporter<T> &&) =
default;
9483 AttrArgArrayImporter<T> &operator=(
const AttrArgArrayImporter<T> &) =
delete;
9484 AttrArgArrayImporter<T> &operator=(AttrArgArrayImporter<T> &&) =
default;
9486 AttrArgArrayImporter(ASTNodeImporter &I,
Error &Err,
9487 const llvm::iterator_range<T *> &From,
9488 unsigned ArraySize) {
9491 To.reserve(ArraySize);
9495 T *value() {
return To.data(); }
9498 llvm::SmallVector<T, 2> To;
9502 Error Err{Error::success()};
9503 Attr *ToAttr =
nullptr;
9504 ASTImporter &Importer;
9505 ASTNodeImporter NImporter;
9508 AttrImporter(ASTImporter &I) : Importer(I), NImporter(I) {}
9511 template <
typename T>
T *castAttrAs() {
return cast<T>(ToAttr); }
9512 template <
typename T>
const T *castAttrAs()
const {
return cast<T>(ToAttr); }
9517 template <
class T> AttrArgImporter<T> importArg(
const T &From) {
9518 return AttrArgImporter<T>(NImporter, Err, From);
9524 template <
typename T>
9525 AttrArgArrayImporter<T> importArrayArg(
const llvm::iterator_range<T *> &From,
9526 unsigned ArraySize) {
9527 return AttrArgArrayImporter<T>(NImporter, Err, From, ArraySize);
9538 template <
typename T,
typename... Arg>
9539 void importAttr(
const T *FromAttr, Arg &&...ImportedArg) {
9540 static_assert(std::is_base_of<Attr, T>::value,
9541 "T should be subclass of Attr.");
9542 assert(!ToAttr &&
"Use one AttrImporter to import one Attribute object.");
9544 const IdentifierInfo *ToAttrName = Importer.
Import(FromAttr->getAttrName());
9545 const IdentifierInfo *ToScopeName =
9546 Importer.
Import(FromAttr->getScopeName());
9547 SourceRange ToAttrRange =
9549 SourceLocation ToScopeLoc =
9555 AttributeCommonInfo ToI(
9556 ToAttrName, AttributeScopeInfo(ToScopeName, ToScopeLoc), ToAttrRange,
9557 FromAttr->getParsedKind(), FromAttr->getForm());
9561 std::forward<Arg>(ImportedArg)..., ToI);
9565 if (
auto *ToInheritableAttr = dyn_cast<InheritableAttr>(ToAttr))
9566 ToInheritableAttr->setInherited(FromAttr->isInherited());
9572 void cloneAttr(
const Attr *FromAttr) {
9573 assert(!ToAttr &&
"Use one AttrImporter to import one Attribute object.");
9585 llvm::Expected<Attr *> getResult() && {
9587 return std::move(Err);
9588 assert(ToAttr &&
"Attribute should be created.");
9595 AttrImporter AI(*
this);
9598 switch (FromAttr->
getKind()) {
9599 case attr::Aligned: {
9601 if (From->isAlignmentExpr())
9602 AI.importAttr(From,
true, AI.importArg(From->getAlignmentExpr()).value());
9604 AI.importAttr(From,
false,
9605 AI.importArg(From->getAlignmentType()).value());
9609 case attr::AlignValue: {
9611 AI.importAttr(From, AI.importArg(From->getAlignment()).value());
9615 case attr::Format: {
9617 AI.importAttr(From,
Import(From->getType()), From->getFormatIdx(),
9618 From->getFirstArg());
9622 case attr::EnableIf: {
9624 AI.importAttr(From, AI.importArg(From->getCond()).value(),
9625 From->getMessage());
9629 case attr::AssertCapability: {
9632 AI.importArrayArg(From->args(), From->args_size()).value(),
9636 case attr::AcquireCapability: {
9639 AI.importArrayArg(From->args(), From->args_size()).value(),
9643 case attr::TryAcquireCapability: {
9645 AI.importAttr(From, AI.importArg(From->getSuccessValue()).value(),
9646 AI.importArrayArg(From->args(), From->args_size()).value(),
9650 case attr::ReleaseCapability: {
9653 AI.importArrayArg(From->args(), From->args_size()).value(),
9657 case attr::RequiresCapability: {
9660 AI.importArrayArg(From->args(), From->args_size()).value(),
9664 case attr::GuardedBy: {
9666 AI.importAttr(From, AI.importArg(From->getArg()).value());
9669 case attr::PtGuardedBy: {
9671 AI.importAttr(From, AI.importArg(From->getArg()).value());
9674 case attr::AcquiredAfter: {
9677 AI.importArrayArg(From->args(), From->args_size()).value(),
9681 case attr::AcquiredBefore: {
9684 AI.importArrayArg(From->args(), From->args_size()).value(),
9688 case attr::LockReturned: {
9690 AI.importAttr(From, AI.importArg(From->getArg()).value());
9693 case attr::LocksExcluded: {
9696 AI.importArrayArg(From->args(), From->args_size()).value(),
9704 AI.cloneAttr(FromAttr);
9709 return std::move(AI).getResult();
9713 return ImportedDecls.lookup(FromD);
9717 auto FromDPos = ImportedFromDecls.find(ToD);
9718 if (FromDPos == ImportedFromDecls.end())
9728 ImportPath.push(FromD);
9729 auto ImportPathBuilder =
9730 llvm::make_scope_exit([
this]() { ImportPath.pop(); });
9735 return make_error<ASTImportError>(*
Error);
9741 if (
auto Error = SharedState->getImportDeclErrorIfAny(ToD)) {
9743 return make_error<ASTImportError>(*
Error);
9750 if (ImportPath.hasCycleAtBack())
9751 SavedImportPaths[FromD].push_back(ImportPath.copyCycleAtBack());
9760 auto Pos = ImportedDecls.find(FromD);
9761 if (Pos != ImportedDecls.end()) {
9764 auto *ToD = Pos->second;
9765 ImportedDecls.erase(Pos);
9777 auto PosF = ImportedFromDecls.find(ToD);
9778 if (PosF != ImportedFromDecls.end()) {
9783 SharedState->removeDeclFromLookup(ToD);
9784 ImportedFromDecls.erase(PosF);
9796 handleAllErrors(ToDOrErr.takeError(),
9800 if (Pos != ImportedDecls.end())
9801 SharedState->setImportDeclError(Pos->second, ErrOut);
9805 for (
const auto &Path : SavedImportPaths[FromD]) {
9808 Decl *PrevFromDi = FromD;
9809 for (
Decl *FromDi : Path) {
9811 if (FromDi == FromD)
9818 PrevFromDi = FromDi;
9822 auto Ii = ImportedDecls.find(FromDi);
9823 if (Ii != ImportedDecls.end())
9824 SharedState->setImportDeclError(Ii->second, ErrOut);
9829 SavedImportPaths.erase(FromD);
9832 return make_error<ASTImportError>(ErrOut);
9844 return make_error<ASTImportError>(*Err);
9850 if (
auto Error = SharedState->getImportDeclErrorIfAny(ToD)) {
9852 return make_error<ASTImportError>(*
Error);
9855 assert(ImportedDecls.count(FromD) != 0 &&
"Missing call to MapImported?");
9859 auto ToAttrOrErr =
Import(FromAttr);
9863 return ToAttrOrErr.takeError();
9870 SavedImportPaths.erase(FromD);
9885 return ToDCOrErr.takeError();
9890 if (
auto *ToRecord = dyn_cast<RecordDecl>(ToDC)) {
9892 if (ToRecord->isCompleteDefinition())
9900 if (FromRecord->getASTContext().getExternalSource() &&
9901 !FromRecord->isCompleteDefinition())
9902 FromRecord->getASTContext().getExternalSource()->CompleteType(FromRecord);
9904 if (FromRecord->isCompleteDefinition())
9907 return std::move(Err);
9908 }
else if (
auto *ToEnum = dyn_cast<EnumDecl>(ToDC)) {
9910 if (ToEnum->isCompleteDefinition()) {
9912 }
else if (FromEnum->isCompleteDefinition()) {
9915 return std::move(Err);
9919 }
else if (
auto *ToClass = dyn_cast<ObjCInterfaceDecl>(ToDC)) {
9921 if (ToClass->getDefinition()) {
9926 return std::move(Err);
9930 }
else if (
auto *ToProto = dyn_cast<ObjCProtocolDecl>(ToDC)) {
9932 if (ToProto->getDefinition()) {
9937 return std::move(Err);
9948 return cast_or_null<Expr>(*ToSOrErr);
9950 return ToSOrErr.takeError();
9958 llvm::DenseMap<Stmt *, Stmt *>::iterator Pos = ImportedStmts.find(FromS);
9959 if (Pos != ImportedStmts.end())
9968 if (
auto *ToE = dyn_cast<Expr>(*ToSOrErr)) {
9972 ToE->setValueKind(FromE->getValueKind());
9973 ToE->setObjectKind(FromE->getObjectKind());
9974 ToE->setDependence(FromE->getDependence());
9978 ImportedStmts[FromS] = *ToSOrErr;
9989 auto NSOrErr =
Import(Namespace);
9991 return NSOrErr.takeError();
9992 auto PrefixOrErr =
Import(Prefix);
9994 return PrefixOrErr.takeError();
10002 return RDOrErr.takeError();
10007 return TyOrErr.takeError();
10010 llvm_unreachable(
"Invalid nested name specifier kind");
10022 NestedNames.push_back(NNS);
10028 while (!NestedNames.empty()) {
10029 NNS = NestedNames.pop_back_val();
10032 return std::move(Err);
10039 return std::move(Err);
10043 return std::move(Err);
10049 ToLocalBeginLoc, ToLocalEndLoc);
10055 return std::move(Err);
10068 if (!ToSourceRangeOrErr)
10069 return ToSourceRangeOrErr.takeError();
10072 ToSourceRangeOrErr->getBegin(),
10073 ToSourceRangeOrErr->getEnd());
10077 llvm_unreachable(
"unexpected null nested name specifier");
10090 return ToTemplateOrErr.takeError();
10095 for (
auto *I : *FromStorage) {
10096 if (
auto ToOrErr =
Import(I))
10099 return ToOrErr.takeError();
10101 return ToContext.getOverloadedTemplateName(ToTemplates.
begin(),
10102 ToTemplates.
end());
10108 if (!DeclNameOrErr)
10109 return DeclNameOrErr.takeError();
10110 return ToContext.getAssumedTemplateName(*DeclNameOrErr);
10116 if (!QualifierOrErr)
10117 return QualifierOrErr.takeError();
10120 return TNOrErr.takeError();
10121 return ToContext.getQualifiedTemplateName(
10128 if (!QualifierOrErr)
10129 return QualifierOrErr.takeError();
10130 return ToContext.getDependentTemplateName(
10138 if (!ReplacementOrErr)
10139 return ReplacementOrErr.takeError();
10142 if (!AssociatedDeclOrErr)
10143 return AssociatedDeclOrErr.takeError();
10145 return ToContext.getSubstTemplateTemplateParm(
10146 *ReplacementOrErr, *AssociatedDeclOrErr, Subst->
getIndex(),
10154 auto ArgPackOrErr =
10157 return ArgPackOrErr.takeError();
10160 if (!AssociatedDeclOrErr)
10161 return AssociatedDeclOrErr.takeError();
10163 return ToContext.getSubstTemplateTemplateParmPack(
10164 *ArgPackOrErr, *AssociatedDeclOrErr, SubstPack->
getIndex(),
10170 return UsingOrError.takeError();
10174 llvm_unreachable(
"Unexpected DeducedTemplate");
10177 llvm_unreachable(
"Invalid template name kind");
10189 if (!ToFileIDOrErr)
10190 return ToFileIDOrErr.takeError();
10198 return std::move(Err);
10200 return std::move(Err);
10206 llvm::DenseMap<FileID, FileID>::iterator Pos = ImportedFileIDs.find(FromID);
10207 if (Pos != ImportedFileIDs.end())
10208 return Pos->second;
10220 return ToSpLoc.takeError();
10223 return ToExLocS.takeError();
10233 return ToExLocE.takeError();
10239 if (!IsBuiltin && !
Cache->BufferOverridden) {
10243 return ToIncludeLoc.takeError();
10254 if (
Cache->OrigEntry &&
Cache->OrigEntry->getDir()) {
10260 ToFileManager.getOptionalFileRef(
Cache->OrigEntry->getName());
10265 ToID = ToSM.
createFileID(*Entry, ToIncludeLocOrFakeLoc,
10272 std::optional<llvm::MemoryBufferRef> FromBuf =
10273 Cache->getBufferOrNone(FromContext.getDiagnostics(),
10278 std::unique_ptr<llvm::MemoryBuffer> ToBuf =
10279 llvm::MemoryBuffer::getMemBufferCopy(FromBuf->getBuffer(),
10280 FromBuf->getBufferIdentifier());
10286 assert(ToID.
isValid() &&
"Unexpected invalid fileID was created.");
10288 ImportedFileIDs[FromID] = ToID;
10295 return ToExprOrErr.takeError();
10298 if (!LParenLocOrErr)
10299 return LParenLocOrErr.takeError();
10302 if (!RParenLocOrErr)
10303 return RParenLocOrErr.takeError();
10308 return ToTInfoOrErr.takeError();
10313 return std::move(Err);
10316 ToContext, *ToTInfoOrErr, From->
isBaseVirtual(), *LParenLocOrErr,
10317 *ToExprOrErr, *RParenLocOrErr, EllipsisLoc);
10321 return ToFieldOrErr.takeError();
10324 if (!MemberLocOrErr)
10325 return MemberLocOrErr.takeError();
10328 ToContext, cast_or_null<FieldDecl>(*ToFieldOrErr), *MemberLocOrErr,
10329 *LParenLocOrErr, *ToExprOrErr, *RParenLocOrErr);
10332 if (!ToIFieldOrErr)
10333 return ToIFieldOrErr.takeError();
10336 if (!MemberLocOrErr)
10337 return MemberLocOrErr.takeError();
10340 ToContext, cast_or_null<IndirectFieldDecl>(*ToIFieldOrErr),
10341 *MemberLocOrErr, *LParenLocOrErr, *ToExprOrErr, *RParenLocOrErr);
10345 return ToTInfoOrErr.takeError();
10347 return new (ToContext)
10349 *ToExprOrErr, *RParenLocOrErr);
10352 return make_error<ASTImportError>();
10358 auto Pos = ImportedCXXBaseSpecifiers.find(BaseSpec);
10359 if (Pos != ImportedCXXBaseSpecifiers.end())
10360 return Pos->second;
10363 if (!ToSourceRange)
10364 return ToSourceRange.takeError();
10367 return ToTSI.takeError();
10369 if (!ToEllipsisLoc)
10370 return ToEllipsisLoc.takeError();
10374 ImportedCXXBaseSpecifiers[BaseSpec] =
Imported;
10386 return ToOrErr.takeError();
10387 Decl *To = *ToOrErr;
10392 if (
auto *ToRecord = dyn_cast<RecordDecl>(To)) {
10393 if (!ToRecord->getDefinition()) {
10400 if (
auto *ToEnum = dyn_cast<EnumDecl>(To)) {
10401 if (!ToEnum->getDefinition()) {
10407 if (
auto *ToIFace = dyn_cast<ObjCInterfaceDecl>(To)) {
10408 if (!ToIFace->getDefinition()) {
10415 if (
auto *ToProto = dyn_cast<ObjCProtocolDecl>(To)) {
10416 if (!ToProto->getDefinition()) {
10440 return ToSelOrErr.takeError();
10444 return ToContext.DeclarationNames.getCXXConstructorName(
10445 ToContext.getCanonicalType(*ToTyOrErr));
10447 return ToTyOrErr.takeError();
10452 return ToContext.DeclarationNames.getCXXDestructorName(
10453 ToContext.getCanonicalType(*ToTyOrErr));
10455 return ToTyOrErr.takeError();
10460 return ToContext.DeclarationNames.getCXXDeductionGuideName(
10463 return ToTemplateOrErr.takeError();
10468 return ToContext.DeclarationNames.getCXXConversionFunctionName(
10469 ToContext.getCanonicalType(*ToTyOrErr));
10471 return ToTyOrErr.takeError();
10475 return ToContext.DeclarationNames.getCXXOperatorName(
10479 return ToContext.DeclarationNames.getCXXLiteralOperatorName(
10487 llvm_unreachable(
"Invalid DeclarationName Kind!");
10515 for (
unsigned I = 1, N = FromSel.
getNumArgs(); I < N; ++I)
10517 return ToContext.Selectors.getSelector(FromSel.
getNumArgs(), Idents.data());
10523 llvm::Error Err = llvm::Error::success();
10524 auto ImportLoop = [&](
const APValue *From,
APValue *To,
unsigned Size) {
10525 for (
unsigned Idx = 0; Idx < Size; Idx++) {
10530 switch (FromValue.
getKind()) {
10544 ImportLoop(((
const APValue::Vec *)(
const char *)&FromValue.Data)->Elts,
10551 ImportLoop(((
const APValue::Arr *)(
const char *)&FromValue.Data)->Elts,
10552 ((
const APValue::Arr *)(
const char *)&
Result.Data)->Elts,
10559 ((
const APValue::StructData *)(
const char *)&FromValue.Data)->Elts,
10560 ((
const APValue::StructData *)(
const char *)&
Result.Data)->Elts,
10568 return std::move(Err);
10573 Result.MakeAddrLabelDiff();
10577 return std::move(Err);
10583 const Decl *ImpMemPtrDecl =
10586 return std::move(Err);
10588 Result.setMemberPointerUninit(
10597 return std::move(Err);
10607 "in C++20 dynamic allocation are transient so they shouldn't "
10608 "appear in the AST");
10610 if (
const auto *E =
10612 FromElemTy = E->getType();
10615 return std::move(Err);
10625 return std::move(Err);
10637 return std::move(Err);
10650 for (
unsigned LoopIdx = 0; LoopIdx < PathLength; LoopIdx++) {
10652 const Decl *FromDecl =
10653 FromPath[LoopIdx].getAsBaseOrMember().getPointer();
10656 return std::move(Err);
10657 if (
auto *RD = dyn_cast<CXXRecordDecl>(FromDecl))
10658 FromElemTy = Importer.FromContext.getCanonicalTagType(RD);
10662 ImpDecl, FromPath[LoopIdx].getAsBaseOrMember().getInt()));
10665 Importer.FromContext.getAsArrayType(FromElemTy)->getElementType();
10667 FromPath[LoopIdx].getAsArrayIndex());
10675 return std::move(Err);
10683 unsigned NumDecls) {
10693 if (LastDiagFromFrom)
10694 ToContext.getDiagnostics().notePriorDiagnosticFrom(
10695 FromContext.getDiagnostics());
10696 LastDiagFromFrom =
false;
10697 return ToContext.getDiagnostics().Report(Loc, DiagID);
10701 if (!LastDiagFromFrom)
10702 FromContext.getDiagnostics().notePriorDiagnosticFrom(
10703 ToContext.getDiagnostics());
10704 LastDiagFromFrom =
true;
10705 return FromContext.getDiagnostics().Report(Loc, DiagID);
10709 if (
auto *ID = dyn_cast<ObjCInterfaceDecl>(D)) {
10710 if (!ID->getDefinition())
10711 ID->startDefinition();
10713 else if (
auto *PD = dyn_cast<ObjCProtocolDecl>(D)) {
10714 if (!PD->getDefinition())
10715 PD->startDefinition();
10717 else if (
auto *TD = dyn_cast<TagDecl>(D)) {
10718 if (!TD->getDefinition() && !TD->isBeingDefined()) {
10719 TD->startDefinition();
10720 TD->setCompleteDefinition(
true);
10724 assert(0 &&
"CompleteDecl called on a Decl that can't be completed");
10729 auto [Pos, Inserted] = ImportedDecls.try_emplace(From, To);
10730 assert((Inserted || Pos->second == To) &&
10731 "Try to import an already imported Decl");
10733 return Pos->second;
10736 ImportedFromDecls[To] = From;
10741 AddToLookupTable(To);
10745std::optional<ASTImportError>
10747 auto Pos = ImportDeclErrors.find(FromD);
10748 if (Pos != ImportDeclErrors.end())
10749 return Pos->second;
10751 return std::nullopt;
10755 auto InsertRes = ImportDeclErrors.insert({From,
Error});
10759 assert(InsertRes.second || InsertRes.first->second.Error ==
Error.Error);
10764 llvm::DenseMap<const Type *, const Type *>::iterator Pos =
10766 if (Pos != ImportedTypes.end()) {
10768 if (ToContext.hasSameType(*ToFromOrErr, To))
10771 llvm::consumeError(ToFromOrErr.takeError());
10776 getToContext().getLangOpts(), FromContext, ToContext, NonEquivalentDecls,
Defines the clang::ASTContext interface.
static FriendCountAndPosition getFriendCountAndPosition(ASTImporter &Importer, FriendDecl *FD)
static bool IsEquivalentFriend(ASTImporter &Importer, FriendDecl *FD1, FriendDecl *FD2)
static ExpectedStmt ImportLoopControlStmt(ASTNodeImporter &NodeImporter, ASTImporter &Importer, StmtClass *S)
static auto getTemplateDefinition(T *D) -> T *
static bool isAncestorDeclContextOf(const DeclContext *DC, const Decl *D)
static Error setTypedefNameForAnonDecl(TagDecl *From, TagDecl *To, ASTImporter &Importer)
static StructuralEquivalenceKind getStructuralEquivalenceKind(const ASTImporter &Importer)
This file provides some common utility functions for processing Lambda related AST Constructs.
Defines enum values for all the target-independent builtin functions.
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
Defines the C++ template declaration subclasses.
Defines the ExceptionSpecificationType enumeration and various utility functions.
Defines the clang::Expr interface and subclasses for C++ expressions.
Defines the clang::FileManager interface and associated types.
Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
Defines the LambdaCapture class.
Defines the clang::LangOptions interface.
llvm::MachO::Record Record
llvm::SmallVector< std::pair< const MemRegion *, SVal >, 4 > Bindings
Defines the clang::SourceLocation class and associated facilities.
Defines the SourceManager interface.
Defines various enumerations that describe declaration and type specifiers.
Defines the Objective-C statement AST node classes.
Defines the clang::TypeLoc interface and its subclasses.
C Language Family Type Representation.
llvm::APInt getValue() const
unsigned getVersion() const
QualType getTypeInfoType() const
static LValueBase getTypeInfo(TypeInfoLValue LV, QualType TypeInfo)
unsigned getCallIndex() const
A non-discriminated union of a base, field, or array index.
static LValuePathEntry ArrayIndex(uint64_t Index)
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
const LValueBase getLValueBase() const
ArrayRef< LValuePathEntry > getLValuePath() const
const FieldDecl * getUnionField() const
unsigned getStructNumFields() const
llvm::PointerIntPair< const Decl *, 1, bool > BaseOrMemberType
A FieldDecl or CXXRecordDecl, along with a flag indicating whether we mean a virtual or non-virtual b...
ValueKind getKind() const
bool isLValueOnePastTheEnd() const
bool isMemberPointerToDerivedMember() const
unsigned getArrayInitializedElts() const
unsigned getStructNumBases() const
bool hasLValuePath() const
const ValueDecl * getMemberPointerDecl() const
APValue & getUnionValue()
const AddrLabelExpr * getAddrLabelDiffRHS() const
CharUnits & getLValueOffset()
unsigned getVectorLength() const
ArrayRef< const CXXRecordDecl * > getMemberPointerPath() const
unsigned getArraySize() const
@ Indeterminate
This object has an indeterminate value (C++ [basic.indet]).
@ None
There is no such object (it's outside its lifetime).
bool isNullPointer() const
const AddrLabelExpr * getAddrLabelDiffLHS() const
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
QualType getAtomicType(QualType T) const
Return the uniqued reference to the atomic type for the specified type.
QualType getReadPipeType(QualType T) const
Return a read_only pipe type for the specified type.
const LangOptions & getLangOpts() const
TypeSourceInfo * getTrivialTypeSourceInfo(QualType T, SourceLocation Loc=SourceLocation()) const
Allocate a TypeSourceInfo where all locations have been initialized to a given location,...
QualType getWritePipeType(QualType T) const
Return a write_only pipe type for the specified type.
CanQualType UnsignedCharTy
ExternalASTSource * getExternalSource() const
Retrieve a pointer to the external AST source associated with this AST context, if any.
std::error_code convertToErrorCode() const override
void log(llvm::raw_ostream &OS) const override
std::string toString() const
@ Unknown
Not supported node or case.
@ UnsupportedConstruct
Naming ambiguity (likely ODR violation).
Imports selected nodes from one AST context into another context, merging AST nodes where appropriate...
ASTContext & getToContext() const
Retrieve the context that AST nodes are being imported into.
DiagnosticBuilder ToDiag(SourceLocation Loc, unsigned DiagID)
Report a diagnostic in the "to" context.
Decl * MapImported(Decl *From, Decl *To)
Store and assign the imported declaration to its counterpart.
static UnsignedOrNone getFieldIndex(Decl *F)
Determine the index of a field in its parent record.
TranslationUnitDecl * GetFromTU(Decl *ToD)
Return the translation unit from where the declaration was imported.
llvm::Expected< DeclContext * > ImportContext(DeclContext *FromDC)
Import the given declaration context from the "from" AST context into the "to" AST context.
llvm::Error ImportDefinition(Decl *From)
Import the definition of the given declaration, including all of the declarations it contains.
virtual Expected< DeclarationName > HandleNameConflict(DeclarationName Name, DeclContext *DC, unsigned IDNS, NamedDecl **Decls, unsigned NumDecls)
Cope with a name conflict when importing a declaration into the given context.
void RegisterImportedDecl(Decl *FromD, Decl *ToD)
std::optional< ASTImportError > getImportDeclErrorIfAny(Decl *FromD) const
Return if import of the given declaration has failed and if yes the kind of the problem.
friend class ASTNodeImporter
llvm::Error importInto(ImportT &To, const ImportT &From)
Import the given object, returns the result.
virtual void Imported(Decl *From, Decl *To)
Subclasses can override this function to observe all of the From -> To declaration mappings as they a...
DiagnosticBuilder FromDiag(SourceLocation Loc, unsigned DiagID)
Report a diagnostic in the "from" context.
llvm::DenseSet< std::tuple< Decl *, Decl *, int > > NonEquivalentDeclSet
bool IsStructurallyEquivalent(QualType From, QualType To, bool Complain=true)
Determine whether the given types are structurally equivalent.
virtual Expected< Decl * > ImportImpl(Decl *From)
Can be overwritten by subclasses to implement their own import logic.
bool isMinimalImport() const
Whether the importer will perform a minimal import, creating to-be-completed forward declarations whe...
ASTImporter(ASTContext &ToContext, FileManager &ToFileManager, ASTContext &FromContext, FileManager &FromFileManager, bool MinimalImport, std::shared_ptr< ASTImporterSharedState > SharedState=nullptr)
llvm::Expected< ExprWithCleanups::CleanupObject > Import(ExprWithCleanups::CleanupObject From)
Import cleanup objects owned by ExprWithCleanup.
virtual void CompleteDecl(Decl *D)
Called for ObjCInterfaceDecl, ObjCProtocolDecl, and TagDecl.
Decl * GetAlreadyImportedOrNull(const Decl *FromD) const
Return the copy of the given declaration in the "to" context if it has already been imported from the...
void setImportDeclError(Decl *From, ASTImportError Error)
Mark (newly) imported declaration with error.
ExpectedDecl VisitObjCImplementationDecl(ObjCImplementationDecl *D)
ExpectedStmt VisitGenericSelectionExpr(GenericSelectionExpr *E)
ExpectedStmt VisitTypeTraitExpr(TypeTraitExpr *E)
ExpectedDecl VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D)
ExpectedDecl VisitObjCInterfaceDecl(ObjCInterfaceDecl *D)
ExpectedStmt VisitDeclRefExpr(DeclRefExpr *E)
ExpectedDecl VisitAccessSpecDecl(AccessSpecDecl *D)
ExpectedDecl VisitFunctionDecl(FunctionDecl *D)
ExpectedDecl VisitParmVarDecl(ParmVarDecl *D)
ExpectedStmt VisitImplicitValueInitExpr(ImplicitValueInitExpr *E)
ExpectedStmt VisitImplicitCastExpr(ImplicitCastExpr *E)
ExpectedDecl VisitCXXMethodDecl(CXXMethodDecl *D)
ExpectedDecl VisitUsingDecl(UsingDecl *D)
ExpectedDecl VisitObjCProtocolDecl(ObjCProtocolDecl *D)
ExpectedStmt VisitStmt(Stmt *S)
ExpectedDecl VisitTranslationUnitDecl(TranslationUnitDecl *D)
ExpectedDecl VisitFieldDecl(FieldDecl *D)
Error ImportFieldDeclDefinition(const FieldDecl *From, const FieldDecl *To)
Error ImportDefinitionIfNeeded(Decl *FromD, Decl *ToD=nullptr)
ExpectedStmt VisitCharacterLiteral(CharacterLiteral *E)
ExpectedStmt VisitCXXConstructExpr(CXXConstructExpr *E)
ExpectedStmt VisitObjCAtThrowStmt(ObjCAtThrowStmt *S)
ExpectedDecl VisitStaticAssertDecl(StaticAssertDecl *D)
ExpectedStmt VisitShuffleVectorExpr(ShuffleVectorExpr *E)
ExpectedDecl VisitObjCPropertyDecl(ObjCPropertyDecl *D)
ExpectedDecl VisitRecordDecl(RecordDecl *D)
ExpectedStmt VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E)
ExpectedDecl VisitUsingShadowDecl(UsingShadowDecl *D)
Error ImportArrayChecked(const InContainerTy &InContainer, OIter Obegin)
ExpectedStmt VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S)
StringRef ImportASTStringRef(StringRef FromStr)
T importChecked(Error &Err, const T &From)
ExpectedStmt VisitVAArgExpr(VAArgExpr *E)
ExpectedStmt VisitDefaultStmt(DefaultStmt *S)
ExpectedDecl VisitUnresolvedUsingTypenameDecl(UnresolvedUsingTypenameDecl *D)
ExpectedStmt VisitCXXThrowExpr(CXXThrowExpr *E)
ExpectedDecl VisitLabelDecl(LabelDecl *D)
ExpectedStmt VisitSizeOfPackExpr(SizeOfPackExpr *E)
ExpectedDecl VisitRequiresExprBodyDecl(RequiresExprBodyDecl *E)
ExpectedStmt VisitObjCAtTryStmt(ObjCAtTryStmt *S)
ExpectedStmt VisitUnaryOperator(UnaryOperator *E)
Error ImportTemplateParameterLists(const DeclTy *FromD, DeclTy *ToD)
Error ImportDeclContext(DeclContext *FromDC, bool ForceImport=false)
ExpectedStmt VisitRequiresExpr(RequiresExpr *E)
ExpectedDecl VisitImplicitConceptSpecializationDecl(ImplicitConceptSpecializationDecl *D)
ExpectedStmt VisitContinueStmt(ContinueStmt *S)
ExpectedStmt VisitCXXMemberCallExpr(CXXMemberCallExpr *E)
ExpectedDecl VisitVarDecl(VarDecl *D)
ExpectedStmt VisitCXXStdInitializerListExpr(CXXStdInitializerListExpr *E)
ExpectedDecl VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D)
Error ImportImplicitMethods(const CXXRecordDecl *From, CXXRecordDecl *To)
ExpectedStmt VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E)
ExpectedStmt VisitImaginaryLiteral(ImaginaryLiteral *E)
ExpectedDecl VisitConceptDecl(ConceptDecl *D)
ExpectedDecl VisitLinkageSpecDecl(LinkageSpecDecl *D)
ExpectedDecl VisitCXXDestructorDecl(CXXDestructorDecl *D)
ExpectedStmt VisitCXXNamedCastExpr(CXXNamedCastExpr *E)
ExpectedStmt VisitOffsetOfExpr(OffsetOfExpr *OE)
ExpectedStmt VisitExprWithCleanups(ExprWithCleanups *E)
ExpectedDecl VisitIndirectFieldDecl(IndirectFieldDecl *D)
ExpectedStmt VisitCXXFoldExpr(CXXFoldExpr *E)
ExpectedDecl VisitTypeAliasDecl(TypeAliasDecl *D)
Expected< InheritedConstructor > ImportInheritedConstructor(const InheritedConstructor &From)
ExpectedStmt VisitCXXNewExpr(CXXNewExpr *E)
Error ImportDeclParts(NamedDecl *D, DeclarationName &Name, NamedDecl *&ToD, SourceLocation &Loc)
Error ImportDefinition(RecordDecl *From, RecordDecl *To, ImportDefinitionKind Kind=IDK_Default)
ExpectedStmt VisitObjCAutoreleasePoolStmt(ObjCAutoreleasePoolStmt *S)
ExpectedStmt VisitConstantExpr(ConstantExpr *E)
ExpectedStmt VisitCompoundLiteralExpr(CompoundLiteralExpr *E)
ExpectedStmt VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E)
ExpectedDecl VisitDecl(Decl *D)
bool hasSameVisibilityContextAndLinkage(T *Found, T *From)
ExpectedStmt VisitParenExpr(ParenExpr *E)
ExpectedStmt VisitObjCForCollectionStmt(ObjCForCollectionStmt *S)
ExpectedStmt VisitSourceLocExpr(SourceLocExpr *E)
ExpectedStmt VisitInitListExpr(InitListExpr *E)
Expected< FunctionTemplateAndArgsTy > ImportFunctionTemplateWithTemplateArgsFromSpecialization(FunctionDecl *FromFD)
ExpectedStmt VisitReturnStmt(ReturnStmt *S)
SmallVector< TemplateArgument, 8 > TemplateArgsTy
ExpectedStmt VisitAtomicExpr(AtomicExpr *E)
ExpectedStmt VisitConditionalOperator(ConditionalOperator *E)
ExpectedStmt VisitChooseExpr(ChooseExpr *E)
ExpectedStmt VisitCompoundStmt(CompoundStmt *S)
Expected< TemplateArgument > ImportTemplateArgument(const TemplateArgument &From)
ExpectedStmt VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E)
ExpectedStmt VisitCaseStmt(CaseStmt *S)
ExpectedStmt VisitCXXRewrittenBinaryOperator(CXXRewrittenBinaryOperator *E)
ExpectedStmt VisitDesignatedInitExpr(DesignatedInitExpr *E)
ExpectedDecl VisitObjCTypeParamDecl(ObjCTypeParamDecl *D)
ExpectedStmt VisitCompoundAssignOperator(CompoundAssignOperator *E)
ExpectedStmt VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *E)
ExpectedStmt VisitLambdaExpr(LambdaExpr *LE)
ExpectedStmt VisitBinaryOperator(BinaryOperator *E)
ExpectedStmt VisitCallExpr(CallExpr *E)
ExpectedStmt VisitDeclStmt(DeclStmt *S)
ExpectedStmt VisitCXXDeleteExpr(CXXDeleteExpr *E)
ExpectedStmt VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *E)
Error ImportArrayChecked(IIter Ibegin, IIter Iend, OIter Obegin)
ExpectedDecl VisitClassTemplateDecl(ClassTemplateDecl *D)
ExpectedDecl VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D)
Expected< CXXCastPath > ImportCastPath(CastExpr *E)
Expected< APValue > ImportAPValue(const APValue &FromValue)
ExpectedDecl VisitFunctionTemplateDecl(FunctionTemplateDecl *D)
ExpectedStmt VisitGNUNullExpr(GNUNullExpr *E)
ExpectedDecl VisitClassTemplateSpecializationDecl(ClassTemplateSpecializationDecl *D)
ExpectedStmt VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E)
ExpectedDecl VisitLifetimeExtendedTemporaryDecl(LifetimeExtendedTemporaryDecl *D)
Expected< concepts::Requirement * > ImportNestedRequirement(concepts::NestedRequirement *From)
ExpectedDecl VisitTypedefNameDecl(TypedefNameDecl *D, bool IsAlias)
ExpectedDecl VisitCXXConstructorDecl(CXXConstructorDecl *D)
ExpectedDecl VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D)
ExpectedDecl VisitObjCIvarDecl(ObjCIvarDecl *D)
Expected< ObjCTypeParamList * > ImportObjCTypeParamList(ObjCTypeParamList *list)
ExpectedDecl VisitUsingPackDecl(UsingPackDecl *D)
ExpectedStmt VisitWhileStmt(WhileStmt *S)
ExpectedDecl VisitEnumConstantDecl(EnumConstantDecl *D)
ExpectedStmt VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E)
ExpectedStmt VisitCXXForRangeStmt(CXXForRangeStmt *S)
ExpectedDecl VisitFriendDecl(FriendDecl *D)
Error ImportContainerChecked(const InContainerTy &InContainer, OutContainerTy &OutContainer)
ExpectedStmt VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E)
ExpectedStmt VisitExpressionTraitExpr(ExpressionTraitExpr *E)
bool IsStructuralMatch(Decl *From, Decl *To, bool Complain=true, bool IgnoreTemplateParmDepth=false)
ExpectedStmt VisitFixedPointLiteral(FixedPointLiteral *E)
ExpectedStmt VisitForStmt(ForStmt *S)
ExpectedStmt VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E)
ExpectedDecl VisitEnumDecl(EnumDecl *D)
ExpectedDecl VisitObjCCategoryDecl(ObjCCategoryDecl *D)
ExpectedStmt VisitAddrLabelExpr(AddrLabelExpr *E)
ExpectedStmt VisitBinaryConditionalOperator(BinaryConditionalOperator *E)
ExpectedStmt VisitSwitchStmt(SwitchStmt *S)
ExpectedType VisitType(const Type *T)
ExpectedDecl VisitVarTemplateDecl(VarTemplateDecl *D)
ExpectedDecl ImportUsingShadowDecls(BaseUsingDecl *D, BaseUsingDecl *ToSI)
ExpectedStmt VisitPredefinedExpr(PredefinedExpr *E)
ExpectedStmt VisitOpaqueValueExpr(OpaqueValueExpr *E)
ExpectedDecl VisitNamespaceAliasDecl(NamespaceAliasDecl *D)
ExpectedStmt VisitCXXInheritedCtorInitExpr(CXXInheritedCtorInitExpr *E)
ExpectedDecl VisitVarTemplateSpecializationDecl(VarTemplateSpecializationDecl *D)
ExpectedStmt VisitPackExpansionExpr(PackExpansionExpr *E)
ExpectedStmt VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr *E)
ExpectedDecl VisitObjCMethodDecl(ObjCMethodDecl *D)
Error ImportTemplateArguments(ArrayRef< TemplateArgument > FromArgs, SmallVectorImpl< TemplateArgument > &ToArgs)
ExpectedDecl VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D)
ExpectedStmt VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E)
ExpectedDecl VisitImplicitParamDecl(ImplicitParamDecl *D)
ExpectedDecl VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D)
ExpectedStmt VisitExplicitCastExpr(ExplicitCastExpr *E)
ExpectedStmt VisitArrayInitIndexExpr(ArrayInitIndexExpr *E)
Error ImportTemplateArgumentListInfo(const InContainerTy &Container, TemplateArgumentListInfo &ToTAInfo)
ExpectedStmt VisitDoStmt(DoStmt *S)
ExpectedStmt VisitNullStmt(NullStmt *S)
ExpectedStmt VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E)
ExpectedDecl VisitBuiltinTemplateDecl(BuiltinTemplateDecl *D)
Error ImportOverriddenMethods(CXXMethodDecl *ToMethod, CXXMethodDecl *FromMethod)
ExpectedStmt VisitStringLiteral(StringLiteral *E)
Error ImportDeclarationNameLoc(const DeclarationNameInfo &From, DeclarationNameInfo &To)
ExpectedStmt VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E)
bool hasReturnTypeDeclaredInside(FunctionDecl *D)
This function checks if the given function has a return type that contains a reference (in any way) t...
ASTNodeImporter(ASTImporter &Importer)
ExpectedDecl VisitCXXDeductionGuideDecl(CXXDeductionGuideDecl *D)
ExpectedStmt VisitMemberExpr(MemberExpr *E)
ExpectedStmt VisitConceptSpecializationExpr(ConceptSpecializationExpr *E)
ExpectedStmt VisitCXXThisExpr(CXXThisExpr *E)
Error ImportInitializer(VarDecl *From, VarDecl *To)
ImportDefinitionKind
What we should import from the definition.
@ IDK_Everything
Import everything.
@ IDK_Default
Import the default subset of the definition, which might be nothing (if minimal import is set) or mig...
@ IDK_Basic
Import only the bare bones needed to establish a valid DeclContext.
ExpectedDecl VisitTypedefDecl(TypedefDecl *D)
ExpectedDecl VisitUsingDirectiveDecl(UsingDirectiveDecl *D)
ExpectedStmt VisitArrayTypeTraitExpr(ArrayTypeTraitExpr *E)
ExpectedDecl VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D)
Expected< concepts::Requirement * > ImportExprRequirement(concepts::ExprRequirement *From)
ExpectedStmt VisitFloatingLiteral(FloatingLiteral *E)
ExpectedStmt VisitIfStmt(IfStmt *S)
ExpectedStmt VisitLabelStmt(LabelStmt *S)
ExpectedStmt VisitCXXTypeidExpr(CXXTypeidExpr *E)
ExpectedStmt VisitConvertVectorExpr(ConvertVectorExpr *E)
ExpectedDecl VisitUsingEnumDecl(UsingEnumDecl *D)
ExpectedStmt VisitGotoStmt(GotoStmt *S)
ExpectedStmt VisitSubstNonTypeTemplateParmExpr(SubstNonTypeTemplateParmExpr *E)
ExpectedStmt VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *S)
ExpectedStmt VisitGCCAsmStmt(GCCAsmStmt *S)
ExpectedDecl VisitNamespaceDecl(NamespaceDecl *D)
ExpectedStmt VisitCXXTryStmt(CXXTryStmt *S)
Error ImportConstraintSatisfaction(const ASTConstraintSatisfaction &FromSat, ConstraintSatisfaction &ToSat)
ExpectedDecl VisitImportDecl(ImportDecl *D)
Error ImportFunctionDeclBody(FunctionDecl *FromFD, FunctionDecl *ToFD)
ExpectedStmt VisitArraySubscriptExpr(ArraySubscriptExpr *E)
Expected< concepts::Requirement * > ImportTypeRequirement(concepts::TypeRequirement *From)
ExpectedStmt VisitIntegerLiteral(IntegerLiteral *E)
ExpectedDecl VisitEmptyDecl(EmptyDecl *D)
ExpectedStmt VisitCXXNoexceptExpr(CXXNoexceptExpr *E)
ExpectedStmt VisitExpr(Expr *E)
Error ImportDefaultArgOfParmVarDecl(const ParmVarDecl *FromParam, ParmVarDecl *ToParam)
ExpectedStmt VisitArrayInitLoopExpr(ArrayInitLoopExpr *E)
ExpectedStmt VisitCXXCatchStmt(CXXCatchStmt *S)
ExpectedStmt VisitAttributedStmt(AttributedStmt *S)
ExpectedStmt VisitIndirectGotoStmt(IndirectGotoStmt *S)
ExpectedStmt VisitParenListExpr(ParenListExpr *E)
Expected< FunctionDecl * > FindFunctionTemplateSpecialization(FunctionDecl *FromFD)
ExpectedDecl VisitCXXConversionDecl(CXXConversionDecl *D)
ExpectedStmt VisitObjCAtCatchStmt(ObjCAtCatchStmt *S)
Error ImportTemplateInformation(FunctionDecl *FromFD, FunctionDecl *ToFD)
ExpectedStmt VisitStmtExpr(StmtExpr *E)
ExpectedStmt VisitCXXDefaultInitExpr(CXXDefaultInitExpr *E)
bool shouldForceImportDeclContext(ImportDefinitionKind IDK)
ExpectedDecl VisitBindingDecl(BindingDecl *D)
std::tuple< FunctionTemplateDecl *, TemplateArgsTy > FunctionTemplateAndArgsTy
ExpectedStmt VisitBreakStmt(BreakStmt *S)
DesignatedInitExpr::Designator Designator
SourceLocation getColonLoc() const
SourceLocation getQuestionLoc() const
Represents an access specifier followed by colon ':'.
SourceLocation getColonLoc() const
The location of the colon following the access specifier.
AddrLabelExpr - The GNU address of label extension, representing &&label.
SourceLocation getAmpAmpLoc() const
SourceLocation getLabelLoc() const
LabelDecl * getLabel() const
Represents a type which was implicitly adjusted by the semantic engine for arbitrary reasons.
Represents the index of the current element of an array being initialized by an ArrayInitLoopExpr.
Represents a loop initializing the elements of an array.
OpaqueValueExpr * getCommonExpr() const
Get the common subexpression shared by all initializations (the source array).
Expr * getSubExpr() const
Get the initializer to use for each array element.
Represents a constant array type that does not decay to a pointer when used as a function parameter.
ArraySubscriptExpr - [C99 6.5.2.1] Array Subscripting.
SourceLocation getRBracketLoc() const
Expr * getLHS()
An array access can be written A[4] or 4[A] (both are equivalent).
An Embarcadero array type trait, as used in the implementation of __array_rank and __array_extent.
uint64_t getValue() const
SourceLocation getEndLoc() const LLVM_READONLY
ArrayTypeTrait getTrait() const
Expr * getDimensionExpression() const
TypeSourceInfo * getQueriedTypeSourceInfo() const
SourceLocation getBeginLoc() const LLVM_READONLY
Represents an array type, per C99 6.7.5.2 - Array Declarators.
SourceLocation getAsmLoc() const
unsigned getNumClobbers() const
unsigned getNumOutputs() const
unsigned getNumInputs() const
A structure for storing the information associated with a name that has been assumed to be a template...
DeclarationName getDeclName() const
Get the name of the template.
AtomicExpr - Variadic atomic builtins: __atomic_exchange, __atomic_fetch_*, __atomic_load,...
SourceLocation getRParenLoc() const
static unsigned getNumSubExprs(AtomicOp Op)
Determine the number of arguments the specified atomic builtin should have.
SourceLocation getBuiltinLoc() const
Attr - This represents one attribute.
attr::Kind getKind() const
void setPackExpansion(bool PE)
Attr * clone(ASTContext &C) const
SourceRange getRange() const
void setRange(SourceRange R)
void setAttrName(const IdentifierInfo *AttrNameII)
const IdentifierInfo * getAttrName() const
Represents an attribute applied to a statement.
SourceLocation getAttrLoc() const
ArrayRef< const Attr * > getAttrs() const
static AttributedStmt * Create(const ASTContext &C, SourceLocation Loc, ArrayRef< const Attr * > Attrs, Stmt *SubStmt)
Represents a C++ declaration that introduces decls from somewhere else.
void addShadowDecl(UsingShadowDecl *S)
shadow_range shadows() const
BinaryConditionalOperator - The GNU extension to the conditional operator which allows the middle ope...
Expr * getFalseExpr() const
getFalseExpr - Return the subexpression which will be evaluated if the condition evaluates to false; ...
OpaqueValueExpr * getOpaqueValue() const
getOpaqueValue - Return the opaque value placeholder.
Expr * getCond() const
getCond - Return the condition expression; this is defined in terms of the opaque value.
Expr * getTrueExpr() const
getTrueExpr - Return the subexpression which will be evaluated if the condition evaluates to true; th...
Expr * getCommon() const
getCommon - Return the common expression, written to the left of the condition.
A builtin binary operation expression such as "x + y" or "x <= y".
SourceLocation getOperatorLoc() const
static BinaryOperator * Create(const ASTContext &C, Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy, ExprValueKind VK, ExprObjectKind OK, SourceLocation opLoc, FPOptionsOverride FPFeatures)
FPOptionsOverride getFPFeatures() const
A binding in a decomposition declaration.
ValueDecl * getDecomposedDecl() const
Get the decomposition declaration that this binding represents a decomposition of.
Expr * getBinding() const
Get the expression to which this declaration is bound.
void setBinding(QualType DeclaredType, Expr *Binding)
Set the binding for this BindingDecl, along with its declared type (which should be a possibly-cv-qua...
void setDecomposedDecl(ValueDecl *Decomposed)
Set the decomposed variable for this BindingDecl.
A fixed int type of a specified bitwidth.
BreakStmt - This represents a break.
Represents a C++2a __builtin_bit_cast(T, v) expression.
Represents the builtin template declaration which is used to implement __make_integer_seq and other b...
BuiltinTemplateKind getBuiltinTemplateKind() const
This class is used for builtin types like 'int'.
static CStyleCastExpr * Create(const ASTContext &Context, QualType T, ExprValueKind VK, CastKind K, Expr *Op, const CXXCastPath *BasePath, FPOptionsOverride FPO, TypeSourceInfo *WrittenTy, SourceLocation L, SourceLocation R)
Represents a base class of a C++ class.
AccessSpecifier getAccessSpecifierAsWritten() const
Retrieves the access specifier as written in the source code (which may mean that no access specifier...
SourceLocation getEllipsisLoc() const
For a pack expansion, determine the location of the ellipsis.
bool isVirtual() const
Determines whether the base class is a virtual base class (or not).
TypeSourceInfo * getTypeSourceInfo() const
Retrieves the type and source location of the base class.
bool isBaseOfClass() const
Determine whether this base class is a base of a class declared with the 'class' keyword (vs.
SourceRange getSourceRange() const LLVM_READONLY
Retrieves the source range that contains the entire base specifier.
Represents binding an expression to a temporary.
CXXTemporary * getTemporary()
static CXXBindTemporaryExpr * Create(const ASTContext &C, CXXTemporary *Temp, Expr *SubExpr)
const Expr * getSubExpr() const
A boolean literal, per ([C++ lex.bool] Boolean literals).
static CXXBoolLiteralExpr * Create(const ASTContext &C, bool Val, QualType Ty, SourceLocation Loc)
SourceLocation getLocation() const
CXXCatchStmt - This represents a C++ catch block.
SourceLocation getCatchLoc() const
Stmt * getHandlerBlock() const
VarDecl * getExceptionDecl() const
static CXXConstCastExpr * Create(const ASTContext &Context, QualType T, ExprValueKind VK, Expr *Op, TypeSourceInfo *WrittenTy, SourceLocation L, SourceLocation RParenLoc, SourceRange AngleBrackets)
Represents a call to a C++ constructor.
SourceRange getParenOrBraceRange() const
void setIsImmediateEscalating(bool Set)
bool isElidable() const
Whether this construction is elidable.
bool hadMultipleCandidates() const
Whether the referred constructor was resolved from an overloaded set having size greater than 1.
static CXXConstructExpr * Create(const ASTContext &Ctx, QualType Ty, SourceLocation Loc, CXXConstructorDecl *Ctor, bool Elidable, ArrayRef< Expr * > Args, bool HadMultipleCandidates, bool ListInitialization, bool StdInitListInitialization, bool ZeroInitialization, CXXConstructionKind ConstructKind, SourceRange ParenOrBraceRange)
Create a C++ construction expression.
bool isStdInitListInitialization() const
Whether this constructor call was written as list-initialization, but was interpreted as forming a st...
bool isImmediateEscalating() const
bool requiresZeroInitialization() const
Whether this construction first requires zero-initialization before the initializer is called.
SourceLocation getLocation() const
CXXConstructorDecl * getConstructor() const
Get the constructor that this expression will (ultimately) call.
bool isListInitialization() const
Whether this constructor call was written as list-initialization.
unsigned getNumArgs() const
Return the number of arguments to the constructor call.
CXXConstructionKind getConstructionKind() const
Determine whether this constructor is actually constructing a base class (rather than a complete obje...
Represents a C++ constructor within a class.
Represents a C++ conversion function within a class.
Represents a C++ base or member initializer.
FieldDecl * getMember() const
If this is a member initializer, returns the declaration of the non-static data member being initiali...
bool isDelegatingInitializer() const
Determine whether this initializer is creating a delegating constructor.
Expr * getInit() const
Get the initializer.
SourceLocation getRParenLoc() const
SourceLocation getEllipsisLoc() const
SourceLocation getLParenLoc() const
bool isPackExpansion() const
Determine whether this initializer is a pack expansion.
TypeSourceInfo * getTypeSourceInfo() const
Returns the declarator information for a base class or delegating initializer.
bool isMemberInitializer() const
Determine whether this initializer is initializing a non-static data member.
bool isBaseInitializer() const
Determine whether this initializer is initializing a base class.
bool isIndirectMemberInitializer() const
SourceLocation getMemberLocation() const
IndirectFieldDecl * getIndirectMember() const
bool isBaseVirtual() const
Returns whether the base is virtual or not.
Represents a C++ deduction guide declaration.
SourceDeductionGuideKind getSourceDeductionGuideKind() const
A default argument (C++ [dcl.fct.default]).
SourceLocation getUsedLocation() const
Retrieve the location where this default argument was actually used.
const ParmVarDecl * getParam() const
Expr * getRewrittenExpr()
const DeclContext * getUsedContext() const
static CXXDefaultArgExpr * Create(const ASTContext &C, SourceLocation Loc, ParmVarDecl *Param, Expr *RewrittenExpr, DeclContext *UsedContext)
bool hasRewrittenInit() const
A use of a default initializer in a constructor or in aggregate initialization.
static CXXDefaultInitExpr * Create(const ASTContext &Ctx, SourceLocation Loc, FieldDecl *Field, DeclContext *UsedContext, Expr *RewrittenInitExpr)
Field is the non-static data member whose default initializer is used by this expression.
const DeclContext * getUsedContext() const
const Expr * getRewrittenExpr() const
Retrieve the initializing expression with evaluated immediate calls, if any.
bool hasRewrittenInit() const
FieldDecl * getField()
Get the field whose initializer will be used.
SourceLocation getBeginLoc() const
Represents a delete expression for memory deallocation and destructor calls, e.g.
FunctionDecl * getOperatorDelete() const
SourceLocation getBeginLoc() const
bool isGlobalDelete() const
bool doesUsualArrayDeleteWantSize() const
Answers whether the usual array deallocation function for the allocated type expects the size of the ...
bool isArrayFormAsWritten() const
Represents a C++ member access expression where the actual member referenced could not be resolved be...
bool isArrow() const
Determine whether this member expression used the '->' operator; otherwise, it used the '.
SourceLocation getOperatorLoc() const
Retrieve the location of the '->' or '.' operator.
static CXXDependentScopeMemberExpr * Create(const ASTContext &Ctx, Expr *Base, QualType BaseType, bool IsArrow, SourceLocation OperatorLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc, NamedDecl *FirstQualifierFoundInScope, DeclarationNameInfo MemberNameInfo, const TemplateArgumentListInfo *TemplateArgs)
SourceLocation getLAngleLoc() const
Retrieve the location of the left angle bracket starting the explicit template argument list followin...
SourceLocation getTemplateKeywordLoc() const
Retrieve the location of the template keyword preceding the member name, if any.
const DeclarationNameInfo & getMemberNameInfo() const
Retrieve the name of the member that this expression refers to.
bool hasExplicitTemplateArgs() const
Determines whether this member expression actually had a C++ template argument list explicitly specif...
SourceLocation getMemberLoc() const
SourceLocation getRAngleLoc() const
Retrieve the location of the right angle bracket ending the explicit template argument list following...
DeclarationName getMember() const
Retrieve the name of the member that this expression refers to.
NamedDecl * getFirstQualifierFoundInScope() const
Retrieve the first part of the nested-name-specifier that was found in the scope of the member access...
Expr * getBase() const
Retrieve the base object of this member expressions, e.g., the x in x.m.
NestedNameSpecifierLoc getQualifierLoc() const
Retrieve the nested-name-specifier that qualifies the member name, with source location information.
bool isImplicitAccess() const
True if this is an implicit access, i.e.
ArrayRef< TemplateArgumentLoc > template_arguments() const
Represents a C++ destructor within a class.
void setOperatorDelete(FunctionDecl *OD, Expr *ThisArg)
static CXXDynamicCastExpr * Create(const ASTContext &Context, QualType T, ExprValueKind VK, CastKind Kind, Expr *Op, const CXXCastPath *Path, TypeSourceInfo *Written, SourceLocation L, SourceLocation RParenLoc, SourceRange AngleBrackets)
Represents a folding of a pack over an operator.
UnresolvedLookupExpr * getCallee() const
SourceLocation getLParenLoc() const
SourceLocation getEllipsisLoc() const
UnsignedOrNone getNumExpansions() const
SourceLocation getRParenLoc() const
BinaryOperatorKind getOperator() const
CXXForRangeStmt - This represents C++0x [stmt.ranged]'s ranged for statement, represented as 'for (ra...
DeclStmt * getBeginStmt()
DeclStmt * getLoopVarStmt()
SourceLocation getForLoc() const
DeclStmt * getRangeStmt()
SourceLocation getRParenLoc() const
SourceLocation getColonLoc() const
SourceLocation getCoawaitLoc() const
static CXXFunctionalCastExpr * Create(const ASTContext &Context, QualType T, ExprValueKind VK, TypeSourceInfo *Written, CastKind Kind, Expr *Op, const CXXCastPath *Path, FPOptionsOverride FPO, SourceLocation LPLoc, SourceLocation RPLoc)
Represents a call to an inherited base class constructor from an inheriting constructor.
bool constructsVBase() const
Determine whether this constructor is actually constructing a base class (rather than a complete obje...
CXXConstructorDecl * getConstructor() const
Get the constructor that this expression will call.
SourceLocation getLocation() const LLVM_READONLY
bool inheritedFromVBase() const
Determine whether the inherited constructor is inherited from a virtual base of the object we constru...
Represents a call to a member function that may be written either with member call syntax (e....
static CXXMemberCallExpr * Create(const ASTContext &Ctx, Expr *Fn, ArrayRef< Expr * > Args, QualType Ty, ExprValueKind VK, SourceLocation RP, FPOptionsOverride FPFeatures, unsigned MinNumArgs=0)
Represents a static or instance method of a struct/union/class.
void addOverriddenMethod(const CXXMethodDecl *MD)
overridden_method_range overridden_methods() const
CXXMethodDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Abstract class common to all of the C++ "named"/"keyword" casts.
SourceLocation getOperatorLoc() const
Retrieve the location of the cast operator keyword, e.g., static_cast.
SourceRange getAngleBrackets() const LLVM_READONLY
SourceLocation getRParenLoc() const
Retrieve the location of the closing parenthesis.
Represents a new-expression for memory allocation and constructor calls, e.g: "new CXXNewExpr(foo)".
static CXXNewExpr * Create(const ASTContext &Ctx, bool IsGlobalNew, FunctionDecl *OperatorNew, FunctionDecl *OperatorDelete, const ImplicitAllocationParameters &IAP, bool UsualArrayDeleteWantsSize, ArrayRef< Expr * > PlacementArgs, SourceRange TypeIdParens, std::optional< Expr * > ArraySize, CXXNewInitializationStyle InitializationStyle, Expr *Initializer, QualType Ty, TypeSourceInfo *AllocatedTypeInfo, SourceRange Range, SourceRange DirectInitRange)
Create a c++ new expression.
SourceRange getDirectInitRange() const
llvm::iterator_range< arg_iterator > placement_arguments()
std::optional< Expr * > getArraySize()
This might return std::nullopt even if isArray() returns true, since there might not be an array size...
CXXNewInitializationStyle getInitializationStyle() const
The kind of initializer this new-expression has.
ImplicitAllocationParameters implicitAllocationParameters() const
Provides the full set of information about expected implicit parameters in this call.
FunctionDecl * getOperatorDelete() const
unsigned getNumPlacementArgs() const
TypeSourceInfo * getAllocatedTypeSourceInfo() const
SourceRange getSourceRange() const
SourceRange getTypeIdParens() const
bool doesUsualArrayDeleteWantSize() const
Answers whether the usual array deallocation function for the allocated type expects the size of the ...
FunctionDecl * getOperatorNew() const
Expr * getInitializer()
The initializer of this new-expression.
Represents a C++11 noexcept expression (C++ [expr.unary.noexcept]).
SourceLocation getEndLoc() const
Expr * getOperand() const
SourceLocation getBeginLoc() const
The null pointer literal (C++11 [lex.nullptr])
SourceLocation getLocation() const
static CXXOperatorCallExpr * Create(const ASTContext &Ctx, OverloadedOperatorKind OpKind, Expr *Fn, ArrayRef< Expr * > Args, QualType Ty, ExprValueKind VK, SourceLocation OperatorLoc, FPOptionsOverride FPFeatures, ADLCallKind UsesADL=NotADL)
Represents a C++ pseudo-destructor (C++ [expr.pseudo]).
TypeSourceInfo * getDestroyedTypeInfo() const
Retrieve the source location information for the type being destroyed.
bool isArrow() const
Determine whether this pseudo-destructor expression was written using an '->' (otherwise,...
TypeSourceInfo * getScopeTypeInfo() const
Retrieve the scope type in a qualified pseudo-destructor expression.
SourceLocation getTildeLoc() const
Retrieve the location of the '~'.
NestedNameSpecifierLoc getQualifierLoc() const
Retrieves the nested-name-specifier that qualifies the type name, with source-location information.
SourceLocation getDestroyedTypeLoc() const
Retrieve the starting location of the type being destroyed.
SourceLocation getColonColonLoc() const
Retrieve the location of the '::' in a qualified pseudo-destructor expression.
SourceLocation getOperatorLoc() const
Retrieve the location of the '.' or '->' operator.
const IdentifierInfo * getDestroyedTypeIdentifier() const
In a dependent pseudo-destructor expression for which we do not have full type information on the des...
Represents a C++ struct/union/class.
CXXRecordDecl * getMostRecentDecl()
CXXRecordDecl * getInstantiatedFromMemberClass() const
If this record is an instantiation of a member class, retrieves the member class from which it was in...
method_range methods() const
CXXRecordDecl * getDefinition() const
static CXXRecordDecl * CreateLambda(const ASTContext &C, DeclContext *DC, TypeSourceInfo *Info, SourceLocation Loc, unsigned DependencyKind, bool IsGeneric, LambdaCaptureDefault CaptureDefault)
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine whether this particular class is a specialization or instantiation of a class template or m...
void setInstantiationOfMemberClass(CXXRecordDecl *RD, TemplateSpecializationKind TSK)
Specify that this record is an instantiation of the member class RD.
void setDescribedClassTemplate(ClassTemplateDecl *Template)
void setLambdaNumbering(LambdaNumbering Numbering)
Set the mangling numbers and context declaration for a lambda class.
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this class is an instantiation of a member class of a class template specialization,...
void setTemplateSpecializationKind(TemplateSpecializationKind TSK)
Set the kind of specialization or template instantiation this is.
CXXRecordDecl * getPreviousDecl()
static CXXReinterpretCastExpr * Create(const ASTContext &Context, QualType T, ExprValueKind VK, CastKind Kind, Expr *Op, const CXXCastPath *Path, TypeSourceInfo *WrittenTy, SourceLocation L, SourceLocation RParenLoc, SourceRange AngleBrackets)
A rewritten comparison expression that was originally written using operator syntax.
Expr * getSemanticForm()
Get an equivalent semantic form for this expression.
bool isReversed() const
Determine whether this expression was rewritten in reverse form.
An expression "T()" which creates an rvalue of a non-class type T.
TypeSourceInfo * getTypeSourceInfo() const
SourceLocation getRParenLoc() const
static CXXStaticCastExpr * Create(const ASTContext &Context, QualType T, ExprValueKind VK, CastKind K, Expr *Op, const CXXCastPath *Path, TypeSourceInfo *Written, FPOptionsOverride FPO, SourceLocation L, SourceLocation RParenLoc, SourceRange AngleBrackets)
Implicit construction of a std::initializer_list<T> object from an array temporary within list-initia...
Represents a C++ functional cast expression that builds a temporary object.
static CXXTemporaryObjectExpr * Create(const ASTContext &Ctx, CXXConstructorDecl *Cons, QualType Ty, TypeSourceInfo *TSI, ArrayRef< Expr * > Args, SourceRange ParenOrBraceRange, bool HadMultipleCandidates, bool ListInitialization, bool StdInitListInitialization, bool ZeroInitialization)
TypeSourceInfo * getTypeSourceInfo() const
Represents a C++ temporary.
static CXXTemporary * Create(const ASTContext &C, const CXXDestructorDecl *Destructor)
Represents the this expression in C++.
static CXXThisExpr * Create(const ASTContext &Ctx, SourceLocation L, QualType Ty, bool IsImplicit)
SourceLocation getLocation() const
A C++ throw-expression (C++ [except.throw]).
const Expr * getSubExpr() const
SourceLocation getThrowLoc() const
bool isThrownVariableInScope() const
Determines whether the variable thrown by this expression (if any!) is within the innermost try block...
CXXTryStmt - A C++ try block, including all handlers.
SourceLocation getTryLoc() const
CXXCatchStmt * getHandler(unsigned i)
unsigned getNumHandlers() const
static CXXTryStmt * Create(const ASTContext &C, SourceLocation tryLoc, CompoundStmt *tryBlock, ArrayRef< Stmt * > handlers)
CompoundStmt * getTryBlock()
A C++ typeid expression (C++ [expr.typeid]), which gets the type_info that corresponds to the supplie...
bool isTypeOperand() const
TypeSourceInfo * getTypeOperandSourceInfo() const
Retrieve source information for the type operand.
Expr * getExprOperand() const
SourceRange getSourceRange() const LLVM_READONLY
Describes an explicit type conversion that uses functional notion but could not be resolved because o...
SourceLocation getLParenLoc() const
Retrieve the location of the left parentheses ('(') that precedes the argument list.
bool isListInitialization() const
Determine whether this expression models list-initialization.
static CXXUnresolvedConstructExpr * Create(const ASTContext &Context, QualType T, TypeSourceInfo *TSI, SourceLocation LParenLoc, ArrayRef< Expr * > Args, SourceLocation RParenLoc, bool IsListInit)
TypeSourceInfo * getTypeSourceInfo() const
Retrieve the type source information for the type being constructed.
SourceLocation getRParenLoc() const
Retrieve the location of the right parentheses (')') that follows the argument list.
unsigned getNumArgs() const
Retrieve the number of arguments.
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
static CallExpr * Create(const ASTContext &Ctx, Expr *Fn, ArrayRef< Expr * > Args, QualType Ty, ExprValueKind VK, SourceLocation RParenLoc, FPOptionsOverride FPFeatures, unsigned MinNumArgs=0, ADLCallKind UsesADL=NotADL)
Create a call expression.
ADLCallKind getADLCallKind() const
FPOptionsOverride getFPFeatures() const
unsigned getNumArgs() const
getNumArgs - Return the number of actual arguments to this call.
SourceLocation getRParenLoc() const
CaseStmt - Represent a case statement.
SourceLocation getEllipsisLoc() const
Get the location of the ... in a case statement of the form LHS ... RHS.
static CaseStmt * Create(const ASTContext &Ctx, Expr *lhs, Expr *rhs, SourceLocation caseLoc, SourceLocation ellipsisLoc, SourceLocation colonLoc)
Build a case statement.
SourceLocation getCaseLoc() const
CastExpr - Base class for type casts, including both implicit casts (ImplicitCastExpr) and explicit c...
path_iterator path_begin()
CastKind getCastKind() const
FPOptionsOverride getFPFeatures() const
CharUnits - This is an opaque type for sizes expressed in character units.
SourceLocation getLocation() const
unsigned getValue() const
CharacterLiteralKind getKind() const
How to handle import errors that occur when import of a child declaration of a DeclContext fails.
bool ignoreChildErrorOnParent(Decl *FromChildD) const
Determine if import failure of a child does not cause import failure of its parent.
ChildErrorHandlingStrategy(const Decl *FromD)
void handleChildImportResult(Error &ResultErr, Error &&ChildErr)
Process the import result of a child (of the current declaration).
ChildErrorHandlingStrategy(const DeclContext *FromDC)
ChooseExpr - GNU builtin-in function __builtin_choose_expr.
SourceLocation getBuiltinLoc() const
bool isConditionDependent() const
bool isConditionTrue() const
isConditionTrue - Return whether the condition is true (i.e.
SourceLocation getRParenLoc() const
Declaration of a class template.
void AddPartialSpecialization(ClassTemplatePartialSpecializationDecl *D, void *InsertPos)
Insert the specified partial specialization knowing that it is not already in.
ClassTemplateDecl * getMostRecentDecl()
CXXRecordDecl * getTemplatedDecl() const
Get the underlying class declarations of the template.
ClassTemplatePartialSpecializationDecl * findPartialSpecialization(ArrayRef< TemplateArgument > Args, TemplateParameterList *TPL, void *&InsertPos)
Return the partial specialization with the provided arguments if it exists, otherwise return the inse...
bool isThisDeclarationADefinition() const
Returns whether this template declaration defines the primary class pattern.
void AddSpecialization(ClassTemplateSpecializationDecl *D, void *InsertPos)
Insert the specified specialization knowing that it is not already in.
ClassTemplateSpecializationDecl * findSpecialization(ArrayRef< TemplateArgument > Args, void *&InsertPos)
Return the specialization with the provided arguments if it exists, otherwise return the insertion po...
ClassTemplatePartialSpecializationDecl * getInstantiatedFromMember() const
Retrieve the member class template partial specialization from which this particular class template p...
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
Represents a class template specialization, which refers to a class template with a given set of temp...
TemplateSpecializationKind getSpecializationKind() const
Determine the kind of specialization that this declaration represents.
const ASTTemplateArgumentListInfo * getTemplateArgsAsWritten() const
Retrieve the template argument list as written in the sources, if any.
ClassTemplateDecl * getSpecializedTemplate() const
Retrieve the template that this specialization specializes.
void setPointOfInstantiation(SourceLocation Loc)
SourceLocation getPointOfInstantiation() const
Get the point of instantiation (if any), or null if none.
void setExternKeywordLoc(SourceLocation Loc)
Sets the location of the extern keyword.
void setSpecializationKind(TemplateSpecializationKind TSK)
const TemplateArgumentList & getTemplateArgs() const
Retrieve the template arguments of the class template specialization.
SourceLocation getExternKeywordLoc() const
Gets the location of the extern keyword, if present.
SourceLocation getTemplateKeywordLoc() const
Gets the location of the template keyword, if present.
void setTemplateKeywordLoc(SourceLocation Loc)
Sets the location of the template keyword.
const TemplateArgumentList & getTemplateInstantiationArgs() const
Retrieve the set of template arguments that should be used to instantiate members of the class templa...
llvm::PointerUnion< ClassTemplateDecl *, ClassTemplatePartialSpecializationDecl * > getInstantiatedFrom() const
If this class template specialization is an instantiation of a template (rather than an explicit spec...
bool hasStrictPackMatch() const
void setInstantiationOf(ClassTemplatePartialSpecializationDecl *PartialSpec, const TemplateArgumentList *TemplateArgs)
Note that this class template specialization is actually an instantiation of the given class template...
bool isExplicitInstantiationOrSpecialization() const
True if this declaration is an explicit specialization, explicit instantiation declaration,...
void setTemplateArgsAsWritten(const ASTTemplateArgumentListInfo *ArgsWritten)
Set the template argument list as written in the sources.
Complex values, per C99 6.2.5p11.
CompoundAssignOperator - For compound assignments (e.g.
QualType getComputationLHSType() const
static CompoundAssignOperator * Create(const ASTContext &C, Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy, ExprValueKind VK, ExprObjectKind OK, SourceLocation opLoc, FPOptionsOverride FPFeatures, QualType CompLHSType=QualType(), QualType CompResultType=QualType())
QualType getComputationResultType() const
CompoundLiteralExpr - [C99 6.5.2.5].
SourceLocation getLParenLoc() const
const Expr * getInitializer() const
TypeSourceInfo * getTypeSourceInfo() const
CompoundStmt - This represents a group of statements like { stmt stmt }.
FPOptionsOverride getStoredFPFeatures() const
Get FPOptionsOverride from trailing storage.
SourceLocation getLBracLoc() const
bool hasStoredFPFeatures() const
static CompoundStmt * Create(const ASTContext &C, ArrayRef< Stmt * > Stmts, FPOptionsOverride FPFeatures, SourceLocation LB, SourceLocation RB)
SourceLocation getRBracLoc() const
Declaration of a C++20 concept.
Expr * getConstraintExpr() const
A reference to a concept and its template args, as it appears in the code.
const NestedNameSpecifierLoc & getNestedNameSpecifierLoc() const
NamedDecl * getFoundDecl() const
const DeclarationNameInfo & getConceptNameInfo() const
const ASTTemplateArgumentListInfo * getTemplateArgsAsWritten() const
static ConceptReference * Create(const ASTContext &C, NestedNameSpecifierLoc NNS, SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo, NamedDecl *FoundDecl, TemplateDecl *NamedConcept, const ASTTemplateArgumentListInfo *ArgsAsWritten)
TemplateDecl * getNamedConcept() const
SourceLocation getTemplateKWLoc() const
Represents the specialization of a concept - evaluates to a prvalue of type bool.
static ConceptSpecializationExpr * Create(const ASTContext &C, ConceptReference *ConceptRef, ImplicitConceptSpecializationDecl *SpecDecl, const ConstraintSatisfaction *Satisfaction)
ConceptReference * getConceptReference() const
const ImplicitConceptSpecializationDecl * getSpecializationDecl() const
const ASTConstraintSatisfaction & getSatisfaction() const
Get elaborated satisfaction info about the template arguments' satisfaction of the named concept.
ConditionalOperator - The ?
Expr * getCond() const
getCond - Return the expression representing the condition for the ?
Represents the canonical version of C arrays with a specified constant size.
ConstantExpr - An expression that occurs in a constant context and optionally the result of evaluatin...
APValue getAPValueResult() const
static ConstantExpr * Create(const ASTContext &Context, Expr *E, const APValue &Result)
The result of a constraint satisfaction check, containing the necessary information to diagnose an un...
llvm::SmallVector< UnsatisfiedConstraintRecord, 4 > Details
The substituted constraint expr, if the template arguments could be substituted into them,...
Represents a shadow constructor declaration introduced into a class by a C++11 using-declaration that...
ContinueStmt - This represents a continue.
ConvertVectorExpr - Clang builtin function __builtin_convertvector This AST node provides support for...
FPOptionsOverride getStoredFPFeaturesOrDefault() const
Get the store FPOptionsOverride or default if not stored.
SourceLocation getRParenLoc() const
getRParenLoc - Return the location of final right parenthesis.
static ConvertVectorExpr * Create(const ASTContext &C, Expr *SrcExpr, TypeSourceInfo *TI, QualType DstType, ExprValueKind VK, ExprObjectKind OK, SourceLocation BuiltinLoc, SourceLocation RParenLoc, FPOptionsOverride FPFeatures)
SourceLocation getBuiltinLoc() const
getBuiltinLoc - Return the location of the __builtin_convertvector token.
TypeSourceInfo * getTypeSourceInfo() const
getTypeSourceInfo - Return the destination type.
Expr * getSrcExpr() const
getSrcExpr - Return the Expr to be converted.
Represents a sugar type with __counted_by or __sized_by annotations, including their _or_null variant...
Represents a pointer type decayed from an array or function type.
A POD class for pairing a NamedDecl* with an access specifier.
static DeclAccessPair make(NamedDecl *D, AccessSpecifier AS)
NamedDecl * getDecl() const
AccessSpecifier getAccess() const
The results of name lookup within a DeclContext.
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
DeclContext * getParent()
getParent - Returns the containing DeclContext.
void makeDeclVisibleInContext(NamedDecl *D)
Makes a declaration visible within this context.
DeclContextLookupResult lookup_result
bool isDependentContext() const
Determines whether this context is dependent on a template parameter.
lookup_result lookup(DeclarationName Name) const
lookup - Find the declarations (if any) with the given Name in this context.
DeclContext * getRedeclContext()
getRedeclContext - Retrieve the context in which an entity conflicts with other entities of the same ...
void addDeclInternal(Decl *D)
Add the declaration D into this context, but suppress searches for external declarations with the sam...
bool containsDeclAndLoad(Decl *D) const
Checks whether a declaration is in this context.
void removeDecl(Decl *D)
Removes a declaration from this context.
lookup_result noload_lookup(DeclarationName Name)
Find the declarations with the given name that are visible within this context; don't attempt to retr...
bool containsDecl(Decl *D) const
Checks whether a declaration is in this context.
bool hasExternalLexicalStorage() const
Whether this DeclContext has external storage containing additional declarations that are lexically i...
DeclContext * getEnclosingNamespaceContext()
Retrieve the nearest enclosing namespace context.
decl_range decls() const
decls_begin/decls_end - Iterate over the declarations stored in this context.
bool isFunctionOrMethod() const
void localUncachedLookup(DeclarationName Name, SmallVectorImpl< NamedDecl * > &Results)
A simplistic name lookup mechanism that performs name lookup into this declaration context without co...
static DeclGroupRef Create(ASTContext &C, Decl **Decls, unsigned NumDecls)
A reference to a declared variable, function, enum, etc.
NamedDecl * getFoundDecl()
Get the NamedDecl through which this reference occurred.
bool hasExplicitTemplateArgs() const
Determines whether this declaration reference was followed by an explicit template argument list.
bool refersToEnclosingVariableOrCapture() const
Does this DeclRefExpr refer to an enclosing local or a captured variable?
SourceLocation getTemplateKeywordLoc() const
Retrieve the location of the template keyword preceding this name, if any.
static DeclRefExpr * Create(const ASTContext &Context, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc, ValueDecl *D, bool RefersToEnclosingVariableOrCapture, SourceLocation NameLoc, QualType T, ExprValueKind VK, NamedDecl *FoundD=nullptr, const TemplateArgumentListInfo *TemplateArgs=nullptr, NonOdrUseReason NOUR=NOUR_None)
SourceLocation getLAngleLoc() const
Retrieve the location of the left angle bracket starting the explicit template argument list followin...
NestedNameSpecifierLoc getQualifierLoc() const
If the name was qualified, retrieves the nested-name-specifier that precedes the name,...
ArrayRef< TemplateArgumentLoc > template_arguments() const
NonOdrUseReason isNonOdrUse() const
Is this expression a non-odr-use reference, and if so, why?
bool hadMultipleCandidates() const
Returns true if this expression refers to a function that was resolved from an overloaded set having ...
SourceLocation getLocation() const
SourceLocation getRAngleLoc() const
Retrieve the location of the right angle bracket ending the explicit template argument list following...
bool isImmediateEscalating() const
DeclStmt - Adaptor class for mixing declarations with statements and expressions.
SourceLocation getEndLoc() const
const DeclGroupRef getDeclGroup() const
SourceLocation getBeginLoc() const LLVM_READONLY
A simple visitor class that helps create declaration visitors.
Decl - This represents one declaration (or definition), e.g.
SourceLocation getEndLoc() const LLVM_READONLY
TemplateDecl * getDescribedTemplate() const
If this is a declaration that describes some template, this method returns that template declaration.
FriendObjectKind getFriendObjectKind() const
Determines whether this declaration is the object of a friend declaration and, if so,...
ASTContext & getASTContext() const LLVM_READONLY
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
@ FOK_None
Not a friend object.
void setObjectOfFriendDecl(bool PerformFriendInjection=false)
Changes the namespace of this declaration to reflect that it's the object of a friend declaration.
void setAccess(AccessSpecifier AS)
SourceLocation getLocation() const
const char * getDeclKindName() const
IdentifierNamespace
IdentifierNamespace - The different namespaces in which declarations may appear.
@ IDNS_NonMemberOperator
This declaration is a C++ operator declared in a non-class context.
@ IDNS_TagFriend
This declaration is a friend class.
@ IDNS_Ordinary
Ordinary names.
@ IDNS_ObjCProtocol
Objective C @protocol.
@ IDNS_Namespace
Namespaces, declared with 'namespace foo {}'.
@ IDNS_OrdinaryFriend
This declaration is a friend function.
@ IDNS_Tag
Tags, declared with 'struct foo;' and referenced with 'struct foo'.
void setImplicit(bool I=true)
void setIsUsed()
Set whether the declaration is used, in the sense of odr-use.
bool isUsed(bool CheckUsedAttr=true) const
Whether any (re-)declaration of the entity was used, meaning that a definition is required.
DeclContext * getDeclContext()
AccessSpecifier getAccess() const
bool isInAnonymousNamespace() const
SourceLocation getBeginLoc() const LLVM_READONLY
TranslationUnitDecl * getTranslationUnitDecl()
void setDeclContext(DeclContext *DC)
setDeclContext - Set both the semantic and lexical DeclContext to DC.
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
void setLexicalDeclContext(DeclContext *DC)
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
The name of a declaration.
IdentifierInfo * getAsIdentifierInfo() const
Retrieve the IdentifierInfo * stored in this declaration name, or null if this declaration name isn't...
TemplateDecl * getCXXDeductionGuideTemplate() const
If this name is the name of a C++ deduction guide, return the template associated with that name.
const IdentifierInfo * getCXXLiteralIdentifier() const
If this name is the name of a literal operator, retrieve the identifier associated with it.
static DeclarationName getUsingDirectiveName()
Returns the name for all C++ using-directives.
OverloadedOperatorKind getCXXOverloadedOperator() const
If this name is the name of an overloadable operator in C++ (e.g., operator+), retrieve the kind of o...
@ CXXConversionFunctionName
QualType getCXXNameType() const
If this name is one of the C++ names (of a constructor, destructor, or conversion function),...
Selector getObjCSelector() const
Get the Objective-C selector stored in this declaration name.
NameKind getNameKind() const
Determine what kind of name this is.
bool isEmpty() const
Evaluates true when this declaration name is empty.
SourceLocation getInnerLocStart() const
Return start of source range ignoring outer template declarations.
SourceLocation getBeginLoc() const LLVM_READONLY
const AssociatedConstraint & getTrailingRequiresClause() const
Get the constraint-expression introduced by the trailing requires-clause in the function/member decla...
void setTypeSourceInfo(TypeSourceInfo *TI)
void setQualifierInfo(NestedNameSpecifierLoc QualifierLoc)
NestedNameSpecifierLoc getQualifierLoc() const
Retrieve the nested-name-specifier (with source-location information) that qualifies the name of this...
TypeSourceInfo * getTypeSourceInfo() const
A decomposition declaration.
SourceLocation getDefaultLoc() const
A qualified reference to a name whose declaration cannot yet be resolved.
static DependentScopeDeclRefExpr * Create(const ASTContext &Context, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc, const DeclarationNameInfo &NameInfo, const TemplateArgumentListInfo *TemplateArgs)
SourceLocation getRAngleLoc() const
Retrieve the location of the right angle bracket ending the explicit template argument list following...
NestedNameSpecifierLoc getQualifierLoc() const
Retrieve the nested-name-specifier that qualifies the name, with source location information.
SourceLocation getLAngleLoc() const
Retrieve the location of the left angle bracket starting the explicit template argument list followin...
ArrayRef< TemplateArgumentLoc > template_arguments() const
bool hasExplicitTemplateArgs() const
Determines whether this lookup had explicit template arguments.
SourceLocation getTemplateKeywordLoc() const
Retrieve the location of the template keyword preceding this name, if any.
DeclarationName getDeclName() const
Retrieve the name that this expression refers to.
const DeclarationNameInfo & getNameInfo() const
Retrieve the name that this expression refers to.
Represents an array type in C++ whose size is a value-dependent expression.
Represents an extended vector type where either the type or size is dependent.
IdentifierOrOverloadedOperator getName() const
NestedNameSpecifier getQualifier() const
Return the nested name specifier that qualifies this name.
bool hasTemplateKeyword() const
Was this template name was preceeded by the template keyword?
Represents a single C99 designator.
unsigned getArrayIndex() const
bool isFieldDesignator() const
static Designator CreateArrayRangeDesignator(unsigned Index, SourceLocation LBracketLoc, SourceLocation EllipsisLoc, SourceLocation RBracketLoc)
Creates a GNU array-range designator.
static Designator CreateFieldDesignator(const IdentifierInfo *FieldName, SourceLocation DotLoc, SourceLocation FieldLoc)
Creates a field designator.
bool isArrayRangeDesignator() const
static Designator CreateArrayDesignator(unsigned Index, SourceLocation LBracketLoc, SourceLocation RBracketLoc)
Creates an array designator.
bool isArrayDesignator() const
SourceLocation getFieldLoc() const
SourceLocation getRBracketLoc() const
const IdentifierInfo * getFieldName() const
SourceLocation getEllipsisLoc() const
SourceLocation getDotLoc() const
SourceLocation getLBracketLoc() const
Represents a C99 designated initializer expression.
Expr * getSubExpr(unsigned Idx) const
bool usesGNUSyntax() const
Determines whether this designated initializer used the deprecated GNU syntax for designated initiali...
MutableArrayRef< Designator > designators()
Expr * getInit() const
Retrieve the initializer value.
unsigned size() const
Returns the number of designators in this initializer.
SourceLocation getEqualOrColonLoc() const
Retrieve the location of the '=' that precedes the initializer value itself, if present.
unsigned getNumSubExprs() const
Retrieve the total number of subexpressions in this designated initializer expression,...
static DesignatedInitExpr * Create(const ASTContext &C, ArrayRef< Designator > Designators, ArrayRef< Expr * > IndexExprs, SourceLocation EqualOrColonLoc, bool GNUSyntax, Expr *Init)
A little helper class used to produce diagnostics.
DoStmt - This represents a 'do/while' stmt.
SourceLocation getWhileLoc() const
SourceLocation getDoLoc() const
SourceLocation getRParenLoc() const
Symbolic representation of a dynamic allocation.
Represents an empty-declaration.
An instance of this object exists for each enum constant that is defined.
llvm::APSInt getInitVal() const
const Expr * getInitExpr() const
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this enumeration is an instantiation of a member enumeration of a class template specialization,...
bool isScoped() const
Returns true if this is a C++11 scoped enumeration.
unsigned getNumNegativeBits() const
Returns the width in bits required to store all the negative enumerators of this enum.
bool isScopedUsingClassTag() const
Returns true if this is a C++11 scoped enumeration.
void setIntegerType(QualType T)
Set the underlying integer type.
EnumDecl * getMostRecentDecl()
bool isFixed() const
Returns true if this is an Objective-C, C++11, or Microsoft-style enumeration with a fixed underlying...
void completeDefinition(QualType NewType, QualType PromotionType, unsigned NumPositiveBits, unsigned NumNegativeBits)
When created, the EnumDecl corresponds to a forward-declared enum.
QualType getIntegerType() const
Return the integer type this enum decl corresponds to.
EnumDecl * getInstantiatedFromMemberEnum() const
Returns the enumeration (declared within the template) from which this enumeration type was instantia...
EnumDecl * getDefinition() const
unsigned getNumPositiveBits() const
Returns the width in bits required to store all the non-negative enumerators of this enum.
QualType getPromotionType() const
Return the integer type that enumerators should promote to.
ExplicitCastExpr - An explicit cast written in the source code.
TypeSourceInfo * getTypeInfoAsWritten() const
getTypeInfoAsWritten - Returns the type source info for the type that this expression is casting to.
Store information needed for an explicit specifier.
ExplicitSpecKind getKind() const
const Expr * getExpr() const
Represents an expression – generally a full-expression – that introduces cleanups to be run at the en...
bool cleanupsHaveSideEffects() const
ArrayRef< CleanupObject > getObjects() const
unsigned getNumObjects() const
llvm::PointerUnion< BlockDecl *, CompoundLiteralExpr * > CleanupObject
The type of objects that are kept in the cleanup.
static ExprWithCleanups * Create(const ASTContext &C, EmptyShell empty, unsigned numObjects)
This represents one expression.
bool isValueDependent() const
Determines whether the value of this expression depends on.
ExprValueKind getValueKind() const
getValueKind - The value kind that this expression produces.
bool isTypeDependent() const
Determines whether the type of this expression depends on.
bool containsUnexpandedParameterPack() const
Whether this expression contains an unexpanded parameter pack (for C++11 variadic templates).
ExprObjectKind getObjectKind() const
getObjectKind - The object kind that this expression produces.
bool isInstantiationDependent() const
Whether this expression is instantiation-dependent, meaning that it depends in some way on.
ExprDependence getDependence() const
An expression trait intrinsic.
SourceLocation getBeginLoc() const LLVM_READONLY
Expr * getQueriedExpression() const
ExpressionTrait getTrait() const
SourceLocation getEndLoc() const LLVM_READONLY
ExtVectorType - Extended vector type.
virtual void CompleteType(TagDecl *Tag)
Gives the external AST source an opportunity to complete an incomplete type.
Represents difference between two FPOptions values.
Represents a member of a struct/union/class.
bool isMutable() const
Determines whether this field is mutable (C++ only).
Expr * getInClassInitializer() const
Get the C++11 default member initializer for this member, or null if one has not been set.
bool hasInClassInitializer() const
Determine whether this member has a C++11 default member initializer.
InClassInitStyle getInClassInitStyle() const
Get the kind of (C++11) default member initializer that this field has.
void setInClassInitializer(Expr *NewInit)
Set the C++11 in-class initializer for this member.
Expr * getBitWidth() const
Returns the expression that represents the bit width, if this field is a bit field.
const VariableArrayType * getCapturedVLAType() const
Get the captured variable length array type.
void setCapturedVLAType(const VariableArrayType *VLAType)
Set the captured variable length array type for this field.
An opaque identifier used by SourceManager which refers to a source file (MemoryBuffer) along with it...
Implements support for file system lookup, file system caching, and directory search management.
SourceLocation getLocation() const
Retrieve the location of the literal.
llvm::APInt getValue() const
Returns an internal integer representation of the literal.
SourceLocation getLocation() const
static FloatingLiteral * Create(const ASTContext &C, const llvm::APFloat &V, bool isexact, QualType Type, SourceLocation L)
llvm::APFloat getValue() const
ForStmt - This represents a 'for (init;cond;inc)' stmt.
VarDecl * getConditionVariable() const
Retrieve the variable declared in this "for" statement, if any.
SourceLocation getRParenLoc() const
SourceLocation getForLoc() const
SourceLocation getLParenLoc() const
FriendDecl - Represents the declaration of a friend entity, which can be a function,...
llvm::PointerUnion< NamedDecl *, TypeSourceInfo * > FriendUnion
SourceLocation getFriendLoc() const
Retrieves the location of the 'friend' keyword.
SourceLocation getEllipsisLoc() const
Retrieves the location of the '...', if present.
NamedDecl * getFriendDecl() const
If this friend declaration doesn't name a type, return the inner declaration.
TypeSourceInfo * getFriendType() const
If this friend declaration names an (untemplated but possibly dependent) type, return the type; other...
const Expr * getSubExpr() const
static DefaultedOrDeletedFunctionInfo * Create(ASTContext &Context, ArrayRef< DeclAccessPair > Lookups, StringLiteral *DeletedMessage=nullptr)
Represents a function declaration or definition.
Stmt * getBody(const FunctionDecl *&Definition) const
Retrieve the body (definition) of the function.
ConstexprSpecKind getConstexprKind() const
void setDescribedFunctionTemplate(FunctionTemplateDecl *Template)
FunctionTemplateDecl * getDescribedFunctionTemplate() const
Retrieves the function template that is described by this function declaration.
void setIsPureVirtual(bool P=true)
void setDefaultedOrDeletedInfo(DefaultedOrDeletedFunctionInfo *Info)
void setFriendConstraintRefersToEnclosingTemplate(bool V=true)
bool isDestroyingOperatorDelete() const
Determine whether this is a destroying operator delete.
StringLiteral * getDeletedMessage() const
Get the message that indicates why this function was deleted.
bool UsesFPIntrin() const
Determine whether the function was declared in source context that requires constrained FP intrinsics...
SourceLocation getDefaultLoc() const
ArrayRef< ParmVarDecl * > parameters() const
bool isExplicitlyDefaulted() const
Whether this function is explicitly defaulted.
bool isTrivial() const
Whether this function is "trivial" in some specialized C++ senses.
bool hasWrittenPrototype() const
Whether this function has a written prototype.
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this function is an instantiation of a member function of a class template specialization,...
FunctionTemplateSpecializationInfo * getTemplateSpecializationInfo() const
If this function is actually a function template specialization, retrieve information about this func...
void setDefaultLoc(SourceLocation NewLoc)
bool doesThisDeclarationHaveABody() const
Returns whether this specific declaration of the function has a body.
DependentFunctionTemplateSpecializationInfo * getDependentSpecializationInfo() const
@ TK_MemberSpecialization
@ TK_DependentNonTemplate
@ TK_FunctionTemplateSpecialization
@ TK_DependentFunctionTemplateSpecialization
StorageClass getStorageClass() const
Returns the storage class as written in the source.
bool FriendConstraintRefersToEnclosingTemplate() const
TemplatedKind getTemplatedKind() const
What kind of templated function this is.
void setInstantiatedFromDecl(FunctionDecl *FD)
Specify that this function declaration was instantiated from a FunctionDecl FD.
bool isDeletedAsWritten() const
void setDependentTemplateSpecialization(ASTContext &Context, const UnresolvedSetImpl &Templates, const TemplateArgumentListInfo *TemplateArgs)
Specifies that this function declaration is actually a dependent function template specialization.
bool isPureVirtual() const
Whether this virtual function is pure, i.e.
FunctionDecl * getMostRecentDecl()
Returns the most recent (re)declaration of this declaration.
void setVirtualAsWritten(bool V)
State that this function is marked as virtual explicitly.
void setIsDestroyingOperatorDelete(bool IsDestroyingDelete)
FunctionDecl * getDefinition()
Get the definition for this declaration.
bool isTypeAwareOperatorNewOrDelete() const
Determine whether this is a type aware operator new or delete.
void setIsTypeAwareOperatorNewOrDelete(bool IsTypeAwareOperator=true)
void setRangeEnd(SourceLocation E)
bool isDefaulted() const
Whether this function is defaulted.
FunctionDecl * getInstantiatedFromDecl() const
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine what kind of template instantiation this function represents.
void setDefaulted(bool D=true)
bool isVirtualAsWritten() const
Whether this function is marked as virtual explicitly.
void setDeletedAsWritten(bool D=true, StringLiteral *Message=nullptr)
void setExplicitlyDefaulted(bool ED=true)
State that this function is explicitly defaulted.
FunctionDecl * getInstantiatedFromMemberFunction() const
If this function is an instantiation of a member function of a class template specialization,...
DeclarationNameInfo getNameInfo() const
bool hasBody(const FunctionDecl *&Definition) const
Returns true if the function has a body.
FunctionDecl * getPreviousDecl()
Return the previous declaration of this declaration or NULL if this is the first declaration.
bool isInlineSpecified() const
Determine whether the "inline" keyword was specified for this function.
Represents a K&R-style 'int foo()' function, which has no information available about its arguments.
Represents a prototype with parameter type info, e.g.
ExtProtoInfo getExtProtoInfo() const
ArrayRef< QualType > exceptions() const
ArrayRef< QualType > param_types() const
Declaration of a template function.
FunctionDecl * getTemplatedDecl() const
Get the underlying function declaration of the template.
bool isThisDeclarationADefinition() const
Returns whether this template declaration defines the primary pattern.
FunctionTemplateDecl * getMostRecentDecl()
ExtInfo getExtInfo() const
QualType getReturnType() const
This represents a GCC inline-assembly statement extension.
unsigned getNumLabels() const
SourceLocation getRParenLoc() const
IdentifierInfo * getInputIdentifier(unsigned i) const
const Expr * getOutputConstraintExpr(unsigned i) const
const Expr * getInputConstraintExpr(unsigned i) const
IdentifierInfo * getOutputIdentifier(unsigned i) const
const Expr * getAsmStringExpr() const
Expr * getClobberExpr(unsigned i)
GNUNullExpr - Implements the GNU __null extension, which is a name for a null pointer constant that h...
SourceLocation getBeginLoc() const LLVM_READONLY
Represents a C11 generic selection.
TypeSourceInfo * getControllingType()
Return the controlling type of this generic selection expression.
ArrayRef< Expr * > getAssocExprs() const
bool isExprPredicate() const
Whether this generic selection uses an expression as its controlling argument.
SourceLocation getGenericLoc() const
SourceLocation getRParenLoc() const
unsigned getResultIndex() const
The zero-based index of the result expression's generic association in the generic selection's associ...
SourceLocation getDefaultLoc() const
static GenericSelectionExpr * Create(const ASTContext &Context, SourceLocation GenericLoc, Expr *ControllingExpr, ArrayRef< TypeSourceInfo * > AssocTypes, ArrayRef< Expr * > AssocExprs, SourceLocation DefaultLoc, SourceLocation RParenLoc, bool ContainsUnexpandedParameterPack, unsigned ResultIndex)
Create a non-result-dependent generic selection expression accepting an expression predicate.
bool isResultDependent() const
Whether this generic selection is result-dependent.
Expr * getControllingExpr()
Return the controlling expression of this generic selection expression.
ArrayRef< TypeSourceInfo * > getAssocTypeSourceInfos() const
GotoStmt - This represents a direct goto.
SourceLocation getLabelLoc() const
SourceLocation getGotoLoc() const
LabelDecl * getLabel() const
One of these records is kept for each identifier that is lexed.
unsigned getBuiltinID() const
Return a value indicating whether this is a builtin function.
void setBuiltinID(unsigned ID)
StringRef getName() const
Return the actual identifier string.
IfStmt - This represents an if/then/else.
static IfStmt * Create(const ASTContext &Ctx, SourceLocation IL, IfStatementKind Kind, Stmt *Init, VarDecl *Var, Expr *Cond, SourceLocation LPL, SourceLocation RPL, Stmt *Then, SourceLocation EL=SourceLocation(), Stmt *Else=nullptr)
Create an IfStmt.
SourceLocation getIfLoc() const
IfStatementKind getStatementKind() const
SourceLocation getElseLoc() const
SourceLocation getLParenLoc() const
SourceLocation getRParenLoc() const
VarDecl * getConditionVariable()
Retrieve the variable declared in this "if" statement, if any.
ImaginaryLiteral - We support imaginary integer and floating point literals, like "1....
const Expr * getSubExpr() const
ImplicitCastExpr - Allows us to explicitly represent implicit type conversions, which have no direct ...
static ImplicitCastExpr * Create(const ASTContext &Context, QualType T, CastKind Kind, Expr *Operand, const CXXCastPath *BasePath, ExprValueKind Cat, FPOptionsOverride FPO)
ArrayRef< TemplateArgument > getTemplateArguments() const
ImplicitParamKind getParameterKind() const
Returns the implicit parameter kind.
Represents an implicitly-generated value initialization of an object of a given type.
Describes a module import declaration, which makes the contents of the named module visible in the cu...
Represents a C array with an unspecified size.
Represents a field injected from an anonymous union/struct into the parent scope.
unsigned getChainingSize() const
ArrayRef< NamedDecl * > chain() const
IndirectGotoStmt - This represents an indirect goto.
SourceLocation getGotoLoc() const
SourceLocation getStarLoc() const
Description of a constructor that was inherited from a base class.
CXXConstructorDecl * getConstructor() const
ConstructorUsingShadowDecl * getShadowDecl() const
Describes an C or C++ initializer list.
bool hasArrayFiller() const
Return true if this is an array initializer and its array "filler" has been set.
void setSyntacticForm(InitListExpr *Init)
FieldDecl * getInitializedFieldInUnion()
If this initializes a union, specifies which field in the union to initialize.
unsigned getNumInits() const
SourceLocation getLBraceLoc() const
void setArrayFiller(Expr *filler)
InitListExpr * getSyntacticForm() const
bool hadArrayRangeDesignator() const
Expr * getArrayFiller()
If this initializer list initializes an array with more elements than there are initializers in the l...
SourceLocation getRBraceLoc() const
void setInitializedFieldInUnion(FieldDecl *FD)
ArrayRef< Expr * > inits()
void sawArrayRangeDesignator(bool ARD=true)
static IntegerLiteral * Create(const ASTContext &C, const llvm::APInt &V, QualType type, SourceLocation l)
Returns a new integer literal with value 'V' and type 'type'.
SourceLocation getLocation() const
Retrieve the location of the literal.
An lvalue reference type, per C++11 [dcl.ref].
Represents the declaration of a label.
LabelStmt * getStmt() const
void setStmt(LabelStmt *T)
LabelStmt - Represents a label, which has a substatement.
LabelDecl * getDecl() const
SourceLocation getIdentLoc() const
Describes the capture of a variable or of this, or of a C++1y init-capture.
bool capturesVariable() const
Determine whether this capture handles a variable.
bool isPackExpansion() const
Determine whether this capture is a pack expansion, which captures a function parameter pack.
SourceLocation getEllipsisLoc() const
Retrieve the location of the ellipsis for a capture that is a pack expansion.
LambdaCaptureKind getCaptureKind() const
Determine the kind of capture.
ValueDecl * getCapturedVar() const
Retrieve the declaration of the local variable being captured.
bool isImplicit() const
Determine whether this was an implicit capture (not written between the square brackets introducing t...
SourceLocation getLocation() const
Retrieve the source location of the capture.
A C++ lambda expression, which produces a function object (of unspecified type) that can be invoked l...
static LambdaExpr * Create(const ASTContext &C, CXXRecordDecl *Class, SourceRange IntroducerRange, LambdaCaptureDefault CaptureDefault, SourceLocation CaptureDefaultLoc, bool ExplicitParams, bool ExplicitResultType, ArrayRef< Expr * > CaptureInits, SourceLocation ClosingBrace, bool ContainsUnexpandedParameterPack)
Construct a new lambda expression.
SourceLocation getEndLoc() const LLVM_READONLY
bool hasExplicitParameters() const
Determine whether this lambda has an explicit parameter list vs.
SourceRange getIntroducerRange() const
Retrieve the source range covering the lambda introducer, which contains the explicit capture list su...
unsigned capture_size() const
Determine the number of captures in this lambda.
CXXMethodDecl * getCallOperator() const
Retrieve the function call operator associated with this lambda expression.
bool hasExplicitResultType() const
Whether this lambda had its result type explicitly specified.
SourceLocation getCaptureDefaultLoc() const
Retrieve the location of this lambda's capture-default, if any.
llvm::iterator_range< capture_init_iterator > capture_inits()
Retrieve the initialization expressions for this lambda's captures.
LambdaCaptureDefault getCaptureDefault() const
Determine the default capture kind for this lambda.
CXXRecordDecl * getLambdaClass() const
Retrieve the class that corresponds to the lambda.
Implicit declaration of a temporary that was materialized by a MaterializeTemporaryExpr and lifetime-...
unsigned getManglingNumber() const
Expr * getTemporaryExpr()
Retrieve the expression to which the temporary materialization conversion was applied.
ValueDecl * getExtendingDecl()
Represents a linkage specification.
void setRBraceLoc(SourceLocation L)
LinkageSpecLanguageIDs getLanguage() const
Return the language specified by this linkage specification.
SourceLocation getExternLoc() const
SourceLocation getRBraceLoc() const
bool hasBraces() const
Determines whether this linkage specification had braces in its syntactic form.
Represents the results of name lookup.
Sugar type that represents a type that was qualified by a qualifier written as a macro invocation.
Represents a prvalue temporary that is written into memory so that a reference can bind to it.
Expr * getSubExpr() const
Retrieve the temporary-generating subexpression whose value will be materialized into a glvalue.
bool isBoundToLvalueReference() const
Determine whether this materialized temporary is bound to an lvalue reference; otherwise,...
LifetimeExtendedTemporaryDecl * getLifetimeExtendedTemporaryDecl()
MemberExpr - [C99 6.5.2.3] Structure and Union Members.
ArrayRef< TemplateArgumentLoc > template_arguments() const
SourceLocation getOperatorLoc() const
SourceLocation getTemplateKeywordLoc() const
Retrieve the location of the template keyword preceding the member name, if any.
NestedNameSpecifierLoc getQualifierLoc() const
If the member name was qualified, retrieves the nested-name-specifier that precedes the member name,...
ValueDecl * getMemberDecl() const
Retrieve the member declaration to which this expression refers.
bool hasExplicitTemplateArgs() const
Determines whether the member name was followed by an explicit template argument list.
NonOdrUseReason isNonOdrUse() const
Is this expression a non-odr-use reference, and if so, why?
static MemberExpr * Create(const ASTContext &C, Expr *Base, bool IsArrow, SourceLocation OperatorLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc, ValueDecl *MemberDecl, DeclAccessPair FoundDecl, DeclarationNameInfo MemberNameInfo, const TemplateArgumentListInfo *TemplateArgs, QualType T, ExprValueKind VK, ExprObjectKind OK, NonOdrUseReason NOUR)
SourceLocation getRAngleLoc() const
Retrieve the location of the right angle bracket ending the explicit template argument list following...
SourceLocation getLAngleLoc() const
Retrieve the location of the left angle bracket starting the explicit template argument list followin...
DeclarationNameInfo getMemberNameInfo() const
Retrieve the member declaration name info.
DeclAccessPair getFoundDecl() const
Retrieves the declaration found by lookup.
A pointer to member type per C++ 8.3.3 - Pointers to members.
Provides information a specialization of a member of a class template, which may be a member function...
SourceLocation getPointOfInstantiation() const
Retrieve the first point of instantiation of this member.
void setPointOfInstantiation(SourceLocation POI)
Set the first point of instantiation.
This represents a decl that may have a name.
Linkage getLinkageInternal() const
Determine what kind of linkage this entity has.
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
Represents a C++ namespace alias.
NestedNameSpecifierLoc getQualifierLoc() const
Retrieve the nested-name-specifier that qualifies the name of the namespace, with source-location inf...
SourceLocation getAliasLoc() const
Returns the location of the alias name, i.e.
SourceLocation getNamespaceLoc() const
Returns the location of the namespace keyword.
SourceLocation getTargetNameLoc() const
Returns the location of the identifier in the named namespace.
NamespaceDecl * getNamespace()
Retrieve the namespace declaration aliased by this directive.
Represent a C++ namespace.
SourceLocation getRBraceLoc() const
SourceLocation getBeginLoc() const LLVM_READONLY
bool isInline() const
Returns true if this is an inline namespace declaration.
NamespaceDecl * getAnonymousNamespace() const
Retrieve the anonymous namespace that inhabits this namespace, if any.
bool isNested() const
Returns true if this is a nested namespace declaration.
void setRBraceLoc(SourceLocation L)
Class that aids in the construction of nested-name-specifiers along with source-location information ...
NestedNameSpecifierLoc getWithLocInContext(ASTContext &Context) const
Retrieve a nested-name-specifier with location information, copied into the given AST context.
A C++ nested-name-specifier augmented with source location information.
NamespaceAndPrefixLoc getAsNamespaceAndPrefix() const
NestedNameSpecifier getNestedNameSpecifier() const
Retrieve the nested-name-specifier to which this instance refers.
SourceLocation getLocalEndLoc() const
Retrieve the location of the end of this component of the nested-name-specifier.
SourceRange getSourceRange() const LLVM_READONLY
Retrieve the source range covering the entirety of this nested-name-specifier.
TypeLoc castAsTypeLoc() const
For a nested-name-specifier that refers to a type, retrieve the type with source-location information...
SourceLocation getLocalBeginLoc() const
Retrieve the location of the beginning of this component of the nested-name-specifier.
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
CXXRecordDecl * getAsMicrosoftSuper() const
NamespaceAndPrefix getAsNamespaceAndPrefix() const
const Type * getAsType() const
Kind
The kind of specifier that completes this nested name specifier.
@ MicrosoftSuper
Microsoft's '__super' specifier, stored as a CXXRecordDecl* of the class it appeared in.
@ Global
The global specifier '::'. There is no stored value.
@ Type
A type, stored as a Type*.
@ Namespace
A namespace-like entity, stored as a NamespaceBaseDecl*.
NonTypeTemplateParmDecl - Declares a non-type template parameter, e.g., "Size" in.
unsigned getPosition() const
Get the position of the template parameter within its parameter list.
bool isParameterPack() const
Whether this parameter is a non-type template parameter pack.
unsigned getDepth() const
Get the nesting depth of the template parameter.
NullStmt - This is the null statement ";": C99 6.8.3p3.
bool hasLeadingEmptyMacro() const
SourceLocation getSemiLoc() const
Represents Objective-C's @catch statement.
const VarDecl * getCatchParamDecl() const
const Stmt * getCatchBody() const
SourceLocation getAtCatchLoc() const
SourceLocation getRParenLoc() const
Represents Objective-C's @finally statement.
const Stmt * getFinallyBody() const
SourceLocation getAtFinallyLoc() const
Represents Objective-C's @synchronized statement.
const Expr * getSynchExpr() const
const CompoundStmt * getSynchBody() const
SourceLocation getAtSynchronizedLoc() const
Represents Objective-C's @throw statement.
const Expr * getThrowExpr() const
SourceLocation getThrowLoc() const LLVM_READONLY
Represents Objective-C's @try ... @catch ... @finally statement.
const ObjCAtFinallyStmt * getFinallyStmt() const
Retrieve the @finally statement, if any.
static ObjCAtTryStmt * Create(const ASTContext &Context, SourceLocation atTryLoc, Stmt *atTryStmt, Stmt **CatchStmts, unsigned NumCatchStmts, Stmt *atFinallyStmt)
unsigned getNumCatchStmts() const
Retrieve the number of @catch statements in this try-catch-finally block.
const ObjCAtCatchStmt * getCatchStmt(unsigned I) const
Retrieve a @catch statement.
const Stmt * getTryBody() const
Retrieve the @try body.
SourceLocation getAtTryLoc() const
Retrieve the location of the @ in the @try.
Represents Objective-C's @autoreleasepool Statement.
SourceLocation getAtLoc() const
const Stmt * getSubStmt() const
An Objective-C "bridged" cast expression, which casts between Objective-C pointers and C pointers,...
ObjCCategoryDecl - Represents a category declaration.
void setTypeParamList(ObjCTypeParamList *TPL)
Set the type parameters of this category.
void setProtocolList(ObjCProtocolDecl *const *List, unsigned Num, const SourceLocation *Locs, ASTContext &C)
setProtocolList - Set the list of protocols that this interface implements.
ObjCCategoryImplDecl * getImplementation() const
ObjCInterfaceDecl * getClassInterface()
ObjCTypeParamList * getTypeParamList() const
Retrieve the type parameter list associated with this category or extension.
protocol_iterator protocol_end() const
ObjCProtocolList::loc_iterator protocol_loc_iterator
SourceLocation getIvarLBraceLoc() const
SourceLocation getIvarRBraceLoc() const
protocol_loc_iterator protocol_loc_begin() const
protocol_iterator protocol_begin() const
void setImplementation(ObjCCategoryImplDecl *ImplD)
ObjCProtocolList::iterator protocol_iterator
SourceLocation getCategoryNameLoc() const
ObjCCategoryImplDecl - An object of this class encapsulates a category @implementation declaration.
SourceLocation getCategoryNameLoc() const
ObjCCategoryDecl * getCategoryDecl() const
SourceLocation getAtStartLoc() const
Represents Objective-C's collection statement.
SourceLocation getForLoc() const
SourceLocation getRParenLoc() const
const ObjCInterfaceDecl * getClassInterface() const
ObjCImplementationDecl - Represents a class definition - this is where method definitions are specifi...
SourceLocation getIvarRBraceLoc() const
SourceLocation getSuperClassLoc() const
const ObjCInterfaceDecl * getSuperClass() const
SourceLocation getIvarLBraceLoc() const
Represents an ObjC class declaration.
void setProtocolList(ObjCProtocolDecl *const *List, unsigned Num, const SourceLocation *Locs, ASTContext &C)
setProtocolList - Set the list of protocols that this interface implements.
bool isImplicitInterfaceDecl() const
isImplicitInterfaceDecl - check that this is an implicitly declared ObjCInterfaceDecl node.
ObjCTypeParamList * getTypeParamListAsWritten() const
Retrieve the type parameters written on this particular declaration of the class.
ObjCCategoryDecl * FindCategoryDeclaration(const IdentifierInfo *CategoryId) const
FindCategoryDeclaration - Finds category declaration in the list of categories for this class and ret...
protocol_loc_iterator protocol_loc_begin() const
void setImplementation(ObjCImplementationDecl *ImplD)
known_categories_range known_categories() const
void setSuperClass(TypeSourceInfo *superClass)
protocol_iterator protocol_end() const
SourceLocation getSuperClassLoc() const
Retrieve the starting location of the superclass.
bool isThisDeclarationADefinition() const
Determine whether this particular declaration of this class is actually also a definition.
void setTypeParamList(ObjCTypeParamList *TPL)
Set the type parameters of this class.
ObjCProtocolList::iterator protocol_iterator
ObjCImplementationDecl * getImplementation() const
protocol_iterator protocol_begin() const
ObjCProtocolList::loc_iterator protocol_loc_iterator
void startDefinition()
Starts the definition of this Objective-C class, taking it from a forward declaration (@class) to a d...
ObjCInterfaceDecl * getCanonicalDecl() override
Retrieves the canonical declaration of this Objective-C class.
ObjCInterfaceDecl * getSuperClass() const
ObjCInterfaceDecl * getDefinition()
Retrieve the definition of this class, or NULL if this class has been forward-declared (with @class) ...
TypeSourceInfo * getSuperClassTInfo() const
Represents typeof(type), a C23 feature and GCC extension, or `typeof_unqual(type),...
ObjCIvarDecl - Represents an ObjC instance variable.
AccessControl getAccessControl() const
bool getSynthesize() const
ObjCMethodDecl - Represents an instance or class method declaration.
ImplicitParamDecl * getSelfDecl() const
ArrayRef< ParmVarDecl * > parameters() const
unsigned param_size() const
bool isPropertyAccessor() const
param_const_iterator param_end() const
param_const_iterator param_begin() const
SourceLocation getEndLoc() const LLVM_READONLY
TypeSourceInfo * getReturnTypeSourceInfo() const
void setMethodParams(ASTContext &C, ArrayRef< ParmVarDecl * > Params, ArrayRef< SourceLocation > SelLocs={})
Sets the method's parameters and selector source locations.
bool isSynthesizedAccessorStub() const
bool hasRelatedResultType() const
Determine whether this method has a result type that is related to the message receiver's type.
bool isInstanceMethod() const
void createImplicitParams(ASTContext &Context, const ObjCInterfaceDecl *ID)
createImplicitParams - Used to lazily create the self and cmd implicit parameters.
QualType getReturnType() const
ParmVarDecl *const * param_iterator
ObjCImplementationControl getImplementationControl() const
ObjCInterfaceDecl * getClassInterface()
void getSelectorLocs(SmallVectorImpl< SourceLocation > &SelLocs) const
Represents a pointer to an Objective C object.
Represents one property declaration in an Objective-C interface.
void setSetterName(Selector Sel, SourceLocation Loc=SourceLocation())
SourceLocation getGetterNameLoc() const
ObjCMethodDecl * getGetterMethodDecl() const
bool isInstanceProperty() const
ObjCMethodDecl * getSetterMethodDecl() const
SourceLocation getSetterNameLoc() const
SourceLocation getAtLoc() const
void setPropertyAttributes(ObjCPropertyAttribute::Kind PRVal)
ObjCIvarDecl * getPropertyIvarDecl() const
Selector getSetterName() const
TypeSourceInfo * getTypeSourceInfo() const
void setPropertyAttributesAsWritten(ObjCPropertyAttribute::Kind PRVal)
Selector getGetterName() const
void setPropertyIvarDecl(ObjCIvarDecl *Ivar)
SourceLocation getLParenLoc() const
void setSetterMethodDecl(ObjCMethodDecl *gDecl)
ObjCPropertyAttribute::Kind getPropertyAttributesAsWritten() const
ObjCPropertyAttribute::Kind getPropertyAttributes() const
void setGetterName(Selector Sel, SourceLocation Loc=SourceLocation())
PropertyControl getPropertyImplementation() const
void setGetterMethodDecl(ObjCMethodDecl *gDecl)
ObjCPropertyImplDecl - Represents implementation declaration of a property in a class or category imp...
ObjCIvarDecl * getPropertyIvarDecl() const
SourceLocation getPropertyIvarDeclLoc() const
Kind getPropertyImplementation() const
ObjCPropertyDecl * getPropertyDecl() const
SourceLocation getBeginLoc() const LLVM_READONLY
Represents an Objective-C protocol declaration.
bool isThisDeclarationADefinition() const
Determine whether this particular declaration is also the definition.
void setProtocolList(ObjCProtocolDecl *const *List, unsigned Num, const SourceLocation *Locs, ASTContext &C)
setProtocolList - Set the list of protocols that this interface implements.
ObjCProtocolDecl * getDefinition()
Retrieve the definition of this protocol, if any.
void startDefinition()
Starts the definition of this Objective-C protocol.
ObjCProtocolList::iterator protocol_iterator
protocol_iterator protocol_begin() const
ObjCProtocolList::loc_iterator protocol_loc_iterator
protocol_iterator protocol_end() const
protocol_loc_iterator protocol_loc_begin() const
Represents the declaration of an Objective-C type parameter.
unsigned getIndex() const
Retrieve the index into its type parameter list.
const Type * getTypeForDecl() const
SourceLocation getColonLoc() const
Retrieve the location of the ':' separating the type parameter name from the explicitly-specified bou...
ObjCTypeParamVariance getVariance() const
Determine the variance of this type parameter.
SourceLocation getVarianceLoc() const
Retrieve the location of the variance keyword.
Stores a list of Objective-C type parameters for a parameterized class or a category/extension thereo...
SourceLocation getRAngleLoc() const
static ObjCTypeParamList * create(ASTContext &ctx, SourceLocation lAngleLoc, ArrayRef< ObjCTypeParamDecl * > typeParams, SourceLocation rAngleLoc)
Create a new Objective-C type parameter list.
SourceLocation getLAngleLoc() const
OffsetOfExpr - [C99 7.17] - This represents an expression of the form offsetof(record-type,...
Expr * getIndexExpr(unsigned Idx)
SourceLocation getOperatorLoc() const
getOperatorLoc - Return the location of the operator.
const OffsetOfNode & getComponent(unsigned Idx) const
static OffsetOfExpr * Create(const ASTContext &C, QualType type, SourceLocation OperatorLoc, TypeSourceInfo *tsi, ArrayRef< OffsetOfNode > comps, ArrayRef< Expr * > exprs, SourceLocation RParenLoc)
TypeSourceInfo * getTypeSourceInfo() const
unsigned getNumExpressions() const
SourceLocation getRParenLoc() const
Return the location of the right parentheses.
unsigned getNumComponents() const
Helper class for OffsetOfExpr.
unsigned getArrayExprIndex() const
For an array element node, returns the index into the array of expressions.
FieldDecl * getField() const
For a field offsetof node, returns the field.
IdentifierInfo * getFieldName() const
For a field or identifier offsetof node, returns the name of the field.
@ Array
An index into an array.
@ Identifier
A field in a dependent type, known only by its name.
@ Base
An implicit indirection through a C++ base class, when the field found is in a base class.
SourceLocation getBeginLoc() const LLVM_READONLY
Kind getKind() const
Determine what kind of offsetof node this is.
SourceLocation getEndLoc() const LLVM_READONLY
CXXBaseSpecifier * getBase() const
For a base class node, returns the base specifier.
OpaqueValueExpr - An expression referring to an opaque object of a fixed type and value class.
Expr * getSourceExpr() const
The source expression of an opaque value expression is the expression which originally generated the ...
SourceLocation getLocation() const
Retrieve the location of this expression.
bool hasExplicitTemplateArgs() const
Determines whether this expression had explicit template arguments.
SourceLocation getLAngleLoc() const
Retrieve the location of the left angle bracket starting the explicit template argument list followin...
const DeclarationNameInfo & getNameInfo() const
Gets the full name info.
SourceLocation getNameLoc() const
Gets the location of the name.
SourceLocation getTemplateKeywordLoc() const
Retrieve the location of the template keyword preceding this name, if any.
NestedNameSpecifierLoc getQualifierLoc() const
Fetches the nested-name qualifier with source-location information, if one was given.
llvm::iterator_range< decls_iterator > decls() const
void copyTemplateArgumentsInto(TemplateArgumentListInfo &List) const
Copies the template arguments into the given structure.
DeclarationName getName() const
Gets the name looked up.
SourceLocation getRAngleLoc() const
Retrieve the location of the right angle bracket ending the explicit template argument list following...
ArrayRef< TemplateArgumentLoc > template_arguments() const
A structure for storing the information associated with an overloaded template name.
Represents a C++11 pack expansion that produces a sequence of expressions.
Expr * getPattern()
Retrieve the pattern of the pack expansion.
UnsignedOrNone getNumExpansions() const
Determine the number of expansions that will be produced when this pack expansion is instantiated,...
SourceLocation getEllipsisLoc() const
Retrieve the location of the ellipsis that describes this pack expansion.
ParenExpr - This represents a parenthesized expression, e.g.
SourceLocation getLParen() const
Get the location of the left parentheses '('.
const Expr * getSubExpr() const
SourceLocation getRParen() const
Get the location of the right parentheses ')'.
ArrayRef< Expr * > exprs()
static ParenListExpr * Create(const ASTContext &Ctx, SourceLocation LParenLoc, ArrayRef< Expr * > Exprs, SourceLocation RParenLoc)
Create a paren list.
unsigned getNumExprs() const
Return the number of expressions in this paren list.
SourceLocation getLParenLoc() const
SourceLocation getRParenLoc() const
Sugar for parentheses used when specifying types.
Represents a parameter to a function.
bool isKNRPromoted() const
True if the value passed to this parameter must undergo K&R-style default argument promotion:
unsigned getFunctionScopeIndex() const
Returns the index of this parameter in its prototype or method scope.
void setObjCDeclQualifier(ObjCDeclQualifier QTVal)
void setDefaultArg(Expr *defarg)
SourceLocation getExplicitObjectParamThisLoc() const
void setUnparsedDefaultArg()
Specify that this parameter has an unparsed default argument.
bool hasUnparsedDefaultArg() const
Determines whether this parameter has a default argument that has not yet been parsed.
void setUninstantiatedDefaultArg(Expr *arg)
bool isObjCMethodParameter() const
ObjCDeclQualifier getObjCDeclQualifier() const
void setScopeInfo(unsigned scopeDepth, unsigned parameterIndex)
bool hasUninstantiatedDefaultArg() const
void setObjCMethodScopeInfo(unsigned parameterIndex)
bool hasInheritedDefaultArg() const
void setKNRPromoted(bool promoted)
void setExplicitObjectParameterLoc(SourceLocation Loc)
Expr * getUninstantiatedDefaultArg()
bool hasDefaultArg() const
Determines whether this parameter has a default argument, either parsed or not.
unsigned getFunctionScopeDepth() const
void setHasInheritedDefaultArg(bool I=true)
PointerType - C99 6.7.5.1 - Pointer Declarators.
[C99 6.4.2.2] - A predefined identifier such as func.
SourceLocation getBeginLoc() const
static PredefinedExpr * Create(const ASTContext &Ctx, SourceLocation L, QualType FNTy, PredefinedIdentKind IK, bool IsTransparent, StringLiteral *SL)
Create a PredefinedExpr.
bool isTransparent() const
PredefinedIdentKind getIdentKind() const
StringLiteral * getFunctionName()
Stores the type being destroyed by a pseudo-destructor expression.
A (possibly-)qualified type.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
const Type * getTypePtr() const
Retrieves a pointer to the underlying (unqualified) type.
Qualifiers getLocalQualifiers() const
Retrieve the set of qualifiers local to this particular QualType instance, not including any qualifie...
Represents a template name as written in source code.
NestedNameSpecifier getQualifier() const
Return the nested name specifier that qualifies this name.
TemplateName getUnderlyingTemplate() const
Return the underlying template name.
bool hasTemplateKeyword() const
Whether the template name was prefixed by the "template" keyword.
An rvalue reference type, per C++11 [dcl.ref].
Represents a struct/union/class.
bool isLambda() const
Determine whether this record is a class describing a lambda function object.
void setAnonymousStructOrUnion(bool Anon)
field_range fields() const
RecordDecl * getMostRecentDecl()
virtual void completeDefinition()
Note that the definition of this type is now complete.
RecordDecl * getDefinition() const
Returns the RecordDecl that actually defines this struct/union/class.
bool isAnonymousStructOrUnion() const
Whether this is an anonymous struct or union.
Provides common interface for the Decls that can be redeclared.
decl_type * getFirstDecl()
Return the first declaration of this declaration or itself if this is the only declaration.
void setPreviousDecl(decl_type *PrevDecl)
Set the previous declaration.
Represents the body of a requires-expression.
C++2a [expr.prim.req]: A requires-expression provides a concise way to express requirements on templa...
SourceLocation getLParenLoc() const
SourceLocation getRParenLoc() const
SourceLocation getRBraceLoc() const
SourceLocation getRequiresKWLoc() const
static RequiresExpr * Create(ASTContext &C, SourceLocation RequiresKWLoc, RequiresExprBodyDecl *Body, SourceLocation LParenLoc, ArrayRef< ParmVarDecl * > LocalParameters, SourceLocation RParenLoc, ArrayRef< concepts::Requirement * > Requirements, SourceLocation RBraceLoc)
RequiresExprBodyDecl * getBody() const
ArrayRef< concepts::Requirement * > getRequirements() const
ArrayRef< ParmVarDecl * > getLocalParameters() const
ReturnStmt - This represents a return, optionally of an expression: return; return 4;.
SourceLocation getReturnLoc() const
const VarDecl * getNRVOCandidate() const
Retrieve the variable that might be used for the named return value optimization.
static ReturnStmt * Create(const ASTContext &Ctx, SourceLocation RL, Expr *E, const VarDecl *NRVOCandidate)
Create a return statement.
Smart pointer class that efficiently represents Objective-C method names.
const IdentifierInfo * getIdentifierInfoForSlot(unsigned argIndex) const
Retrieve the identifier at a given position in the selector.
bool isNull() const
Determine whether this is the empty selector.
unsigned getNumArgs() const
ShuffleVectorExpr - clang-specific builtin-in function __builtin_shufflevector.
Expr ** getSubExprs()
Retrieve the array of expressions.
unsigned getNumSubExprs() const
getNumSubExprs - Return the size of the SubExprs array.
SourceLocation getRParenLoc() const
SourceLocation getBeginLoc() const LLVM_READONLY
Represents an expression that computes the length of a parameter pack.
SourceLocation getPackLoc() const
Determine the location of the parameter pack.
bool isPartiallySubstituted() const
Determine whether this represents a partially-substituted sizeof... expression, such as is produced f...
static SizeOfPackExpr * Create(ASTContext &Context, SourceLocation OperatorLoc, NamedDecl *Pack, SourceLocation PackLoc, SourceLocation RParenLoc, UnsignedOrNone Length=std::nullopt, ArrayRef< TemplateArgument > PartialArgs={})
ArrayRef< TemplateArgument > getPartialArguments() const
Get.
SourceLocation getOperatorLoc() const
Determine the location of the 'sizeof' keyword.
SourceLocation getRParenLoc() const
Determine the location of the right parenthesis.
NamedDecl * getPack() const
Retrieve the parameter pack.
unsigned getPackLength() const
Retrieve the length of the parameter pack.
Represents a function call to one of __builtin_LINE(), __builtin_COLUMN(), __builtin_FUNCTION(),...
SourceLocation getBeginLoc() const
const DeclContext * getParentContext() const
If the SourceLocExpr has been resolved return the subexpression representing the resolved value.
SourceLocation getEndLoc() const
SourceLocIdentKind getIdentKind() const
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
This class handles loading and caching of source files into memory.
FileIDAndOffset getDecomposedLoc(SourceLocation Loc) const
Decompose the specified location into a raw FileID + Offset pair.
FileID getFileID(SourceLocation SpellingLoc) const
Return the FileID for a SourceLocation.
bool isWrittenInBuiltinFile(SourceLocation Loc) const
Returns whether Loc is located in a <built-in> file.
FileID createFileID(FileEntryRef SourceFile, SourceLocation IncludePos, SrcMgr::CharacteristicKind FileCharacter, int LoadedID=0, SourceLocation::UIntTy LoadedOffset=0)
Create a new FileID that represents the specified file being #included from the specified IncludePosi...
SourceLocation getComposedLoc(FileID FID, unsigned Offset) const
Form a SourceLocation from a FileID and Offset pair.
FileManager & getFileManager() const
FileID getMainFileID() const
Returns the FileID of the main source file.
unsigned getFileIDSize(FileID FID) const
The size of the SLocEntry that FID represents.
SourceLocation getLocForStartOfFile(FileID FID) const
Return the source location corresponding to the first byte of the specified file.
SourceLocation createExpansionLoc(SourceLocation SpellingLoc, SourceLocation ExpansionLocStart, SourceLocation ExpansionLocEnd, unsigned Length, bool ExpansionIsTokenRange=true, int LoadedID=0, SourceLocation::UIntTy LoadedOffset=0)
Creates an expansion SLocEntry for a macro use.
const SrcMgr::SLocEntry & getSLocEntry(FileID FID, bool *Invalid=nullptr) const
SourceLocation createMacroArgExpansionLoc(SourceLocation SpellingLoc, SourceLocation ExpansionLoc, unsigned Length)
Creates an expansion SLocEntry for the substitution of an argument into a function-like macro's body.
A trivial tuple used to represent a source range.
SourceLocation getEnd() const
SourceLocation getBegin() const
One instance of this struct is kept for every file loaded or used.
Each ExpansionInfo encodes the expansion location - where the token was ultimately expanded,...
SourceLocation getExpansionLocStart() const
bool isExpansionTokenRange() const
SourceLocation getSpellingLoc() const
bool isMacroArgExpansion() const
SourceLocation getExpansionLocEnd() const
const ContentCache & getContentCache() const
CharacteristicKind getFileCharacteristic() const
Return whether this is a system header or not.
SourceLocation getIncludeLoc() const
This is a discriminated union of FileInfo and ExpansionInfo.
const FileInfo & getFile() const
const ExpansionInfo & getExpansion() const
Represents a C++11 static_assert declaration.
SourceLocation getRParenLoc() const
StmtExpr - This is the GNU Statement Expression extension: ({int X=4; X;}).
CompoundStmt * getSubStmt()
unsigned getTemplateDepth() const
SourceLocation getRParenLoc() const
SourceLocation getLParenLoc() const
StmtVisitor - This class implements a simple visitor for Stmt subclasses.
Stmt - This represents one statement.
child_iterator child_begin()
StmtClass getStmtClass() const
child_iterator child_end()
const char * getStmtClassName() const
SourceLocation getBeginLoc() const LLVM_READONLY
StringLiteral - This represents a string literal expression, e.g.
tokloc_iterator tokloc_begin() const
tokloc_iterator tokloc_end() const
StringLiteralKind getKind() const
static StringLiteral * Create(const ASTContext &Ctx, StringRef Str, StringLiteralKind Kind, bool Pascal, QualType Ty, ArrayRef< SourceLocation > Locs)
This is the "fully general" constructor that allows representation of strings formed from one or more...
StringRef getBytes() const
Allow access to clients that need the byte representation, such as ASTWriterStmt::VisitStringLiteral(...
unsigned getNumConcatenated() const
getNumConcatenated - Get the number of string literal tokens that were concatenated in translation ph...
Represents a reference to a non-type template parameter that has been substituted with a template arg...
Decl * getAssociatedDecl() const
A template-like entity which owns the whole pattern being substituted.
UnsignedOrNone getPackIndex() const
bool isReferenceParameter() const
unsigned getIndex() const
Returns the index of the replaced parameter in the associated declaration.
SourceLocation getNameLoc() const
Expr * getReplacement() const
A structure for storing an already-substituted template template parameter pack.
Decl * getAssociatedDecl() const
A template-like entity which owns the whole pattern being substituted.
TemplateArgument getArgumentPack() const
Retrieve the template template argument pack with which this parameter was substituted.
unsigned getIndex() const
Returns the index of the replaced parameter in the associated declaration.
A structure for storing the information associated with a substituted template template parameter.
TemplateName getReplacement() const
UnsignedOrNone getPackIndex() const
unsigned getIndex() const
Returns the index of the replaced parameter in the associated declaration.
Decl * getAssociatedDecl() const
A template-like entity which owns the whole pattern being substituted.
void setNextSwitchCase(SwitchCase *SC)
SourceLocation getColonLoc() const
const SwitchCase * getNextSwitchCase() const
SwitchStmt - This represents a 'switch' stmt.
SourceLocation getSwitchLoc() const
SourceLocation getLParenLoc() const
SourceLocation getRParenLoc() const
static SwitchStmt * Create(const ASTContext &Ctx, Stmt *Init, VarDecl *Var, Expr *Cond, SourceLocation LParenLoc, SourceLocation RParenLoc)
Create a switch statement.
VarDecl * getConditionVariable()
Retrieve the variable declared in this "switch" statement, if any.
SwitchCase * getSwitchCaseList()
Represents the declaration of a struct/union/class/enum.
SourceRange getBraceRange() const
bool isBeingDefined() const
Return true if this decl is currently being defined.
TagDecl * getDefinition() const
Returns the TagDecl that actually defines this struct/union/class/enum.
bool isThisDeclarationADefinition() const
Return true if this declaration is a completion definition of the type.
bool isCompleteDefinition() const
Return true if this decl has its body fully specified.
NestedNameSpecifierLoc getQualifierLoc() const
Retrieve the nested-name-specifier (with source-location information) that qualifies the name of this...
TypedefNameDecl * getTypedefNameForAnonDecl() const
void startDefinition()
Starts the definition of this tag declaration.
void setTypedefNameForAnonDecl(TypedefNameDecl *TDD)
void setQualifierInfo(NestedNameSpecifierLoc QualifierLoc)
TagKind getTagKind() const
void setBraceRange(SourceRange R)
void setCompleteDefinition(bool V=true)
True if this decl has its body fully specified.
A convenient class for passing around template argument information.
SourceLocation getRAngleLoc() const
void addArgument(const TemplateArgumentLoc &Loc)
ArrayRef< TemplateArgumentLoc > arguments() const
SourceLocation getLAngleLoc() const
A template argument list.
static TemplateArgumentList * CreateCopy(ASTContext &Context, ArrayRef< TemplateArgument > Args)
Create a new template argument list that copies the given set of template arguments.
unsigned size() const
Retrieve the number of template arguments in this template argument list.
ArrayRef< TemplateArgument > asArray() const
Produce this as an array ref.
Location wrapper for a TemplateArgument.
TemplateArgumentLocInfo getLocInfo() const
const TemplateArgument & getArgument() const
NestedNameSpecifierLoc getTemplateQualifierLoc() const
Represents a template argument.
ArrayRef< TemplateArgument > getPackAsArray() const
Return the array of arguments in this template argument pack.
QualType getStructuralValueType() const
Get the type of a StructuralValue.
QualType getParamTypeForDecl() const
Expr * getAsExpr() const
Retrieve the template argument as an expression.
UnsignedOrNone getNumTemplateExpansions() const
Retrieve the number of expansions that a template template argument expansion will produce,...
QualType getAsType() const
Retrieve the type for a type template argument.
QualType getNullPtrType() const
Retrieve the type for null non-type template argument.
TemplateName getAsTemplate() const
Retrieve the template name for a template name argument.
unsigned pack_size() const
The number of template arguments in the given template argument pack.
QualType getIntegralType() const
Retrieve the type of the integral value.
bool getIsDefaulted() const
If returns 'true', this TemplateArgument corresponds to a default template parameter.
ValueDecl * getAsDecl() const
Retrieve the declaration for a declaration non-type template argument.
ArrayRef< TemplateArgument > pack_elements() const
Iterator range referencing all of the elements of a template argument pack.
@ Declaration
The template argument is a declaration that was provided for a pointer, reference,...
@ Template
The template argument is a template name that was provided for a template template parameter.
@ StructuralValue
The template argument is a non-type template argument that can't be represented by the special-case D...
@ Pack
The template argument is actually a parameter pack.
@ TemplateExpansion
The template argument is a pack expansion of a template name that was provided for a template templat...
@ NullPtr
The template argument is a null pointer or null pointer to member that was provided for a non-type te...
@ Type
The template argument is a type.
@ Null
Represents an empty template argument, e.g., one that has not been deduced.
@ Integral
The template argument is an integral value stored in an llvm::APSInt that was provided for an integra...
@ Expression
The template argument is an expression, and we've not resolved it to one of the other forms yet,...
ArgKind getKind() const
Return the kind of stored template argument.
bool isCanonicalExpr() const
TemplateName getAsTemplateOrTemplatePattern() const
Retrieve the template argument as a template name; if the argument is a pack expansion,...
const APValue & getAsStructuralValue() const
Get the value of a StructuralValue.
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
Represents a C++ template name within the type system.
TemplateDecl * getAsTemplateDecl(bool IgnoreDeduced=false) const
Retrieve the underlying template declaration that this template name refers to, if known.
DependentTemplateName * getAsDependentTemplateName() const
Retrieve the underlying dependent template name structure, if any.
QualifiedTemplateName * getAsQualifiedTemplateName() const
Retrieve the underlying qualified template name structure, if any.
OverloadedTemplateStorage * getAsOverloadedTemplate() const
Retrieve the underlying, overloaded function template declarations that this template name refers to,...
AssumedTemplateStorage * getAsAssumedTemplateName() const
Retrieve information on a name that has been assumed to be a template-name in order to permit a call ...
@ UsingTemplate
A template name that refers to a template declaration found through a specific using shadow declarati...
@ OverloadedTemplate
A set of overloaded template declarations.
@ Template
A single template declaration.
@ DependentTemplate
A dependent template name that has not been resolved to a template (or set of templates).
@ SubstTemplateTemplateParm
A template template parameter that has been substituted for some other template name.
@ SubstTemplateTemplateParmPack
A template template parameter pack that has been substituted for a template template argument pack,...
@ DeducedTemplate
A template name that refers to another TemplateName with deduced default arguments.
@ QualifiedTemplate
A qualified template name, where the qualification is kept to describe the source code as written.
@ AssumedTemplate
An unqualified-id that has been assumed to name a function template that will be found by ADL.
UsingShadowDecl * getAsUsingShadowDecl() const
Retrieve the using shadow declaration through which the underlying template declaration is introduced...
SubstTemplateTemplateParmPackStorage * getAsSubstTemplateTemplateParmPack() const
Retrieve the substituted template template parameter pack, if known.
SubstTemplateTemplateParmStorage * getAsSubstTemplateTemplateParm() const
Retrieve the substituted template template parameter, if known.
Stores a list of template parameters for a TemplateDecl and its derived classes.
NamedDecl * getParam(unsigned Idx)
static TemplateParameterList * Create(const ASTContext &C, SourceLocation TemplateLoc, SourceLocation LAngleLoc, ArrayRef< NamedDecl * > Params, SourceLocation RAngleLoc, Expr *RequiresClause)
Expr * getRequiresClause()
The constraint-expression of the associated requires-clause.
SourceLocation getRAngleLoc() const
SourceLocation getLAngleLoc() const
SourceLocation getTemplateLoc() const
TemplateTemplateParmDecl - Declares a template template parameter, e.g., "T" in.
bool wasDeclaredWithTypename() const
Whether this template template parameter was declared with the 'typename' keyword.
TemplateNameKind templateParameterKind() const
unsigned getPosition() const
Get the position of the template parameter within its parameter list.
bool isParameterPack() const
Whether this template template parameter is a template parameter pack.
unsigned getDepth() const
Get the nesting depth of the template parameter.
Declaration of a template type parameter.
bool wasDeclaredWithTypename() const
Whether this template type parameter was declared with the 'typename' keyword.
unsigned getIndex() const
Retrieve the index of the template parameter.
void setTypeConstraint(ConceptReference *CR, Expr *ImmediatelyDeclaredConstraint, UnsignedOrNone ArgPackSubstIndex)
bool hasTypeConstraint() const
Determine whether this template parameter has a type-constraint.
const TypeConstraint * getTypeConstraint() const
Returns the type constraint associated with this template parameter (if any).
bool isParameterPack() const
Returns whether this is a parameter pack.
unsigned getDepth() const
Retrieve the depth of the template parameter.
The top declaration context.
Represents the declaration of a typedef-name via a C++11 alias-declaration.
TypeAliasTemplateDecl * getDescribedAliasTemplate() const
Declaration of an alias template.
TypeAliasDecl * getTemplatedDecl() const
Get the underlying function declaration of the template.
Models the abbreviated syntax to constrain a template type parameter: template <convertible_to<string...
SourceLocation getBeginLoc() const LLVM_READONLY
Symbolic representation of typeid(T) for some type T.
const Type * getType() const
SourceLocation getBeginLoc() const
Get the begin source location.
Represents a typeof (or typeof) expression (a C23 feature and GCC extension) or a typeof_unqual expre...
A container of type source information.
TypeLoc getTypeLoc() const
Return the TypeLoc wrapper for the type source info.
QualType getType() const
Return the type wrapped by this type source info.
A type trait used in the implementation of various C++11 and Library TR1 trait templates.
bool getBoolValue() const
ArrayRef< TypeSourceInfo * > getArgs() const
Retrieve the argument types.
static TypeTraitExpr * Create(const ASTContext &C, QualType T, SourceLocation Loc, TypeTrait Kind, ArrayRef< TypeSourceInfo * > Args, SourceLocation RParenLoc, bool Value)
Create a new type trait expression.
SourceLocation getEndLoc() const LLVM_READONLY
unsigned getNumArgs() const
Determine the number of arguments to this type trait.
TypeTrait getTrait() const
Determine which type trait this expression uses.
SourceLocation getBeginLoc() const LLVM_READONLY
const APValue & getAPValue() const
bool isStoredAsBoolean() const
ExpectedType Visit(const Type *T)
The base class of the type hierarchy.
RecordDecl * getAsRecordDecl() const
Retrieves the RecordDecl this type refers to.
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
const Type * getBaseElementTypeUnsafe() const
Get the base element type of this type, potentially discarding type qualifiers.
bool isIncompleteType(NamedDecl **Def=nullptr) const
Types are partitioned into 3 broad categories (C99 6.2.5p1): object types, function types,...
bool isCanonicalUnqualified() const
Determines if this type would be canonical if it had no further qualification.
const T * getAs() const
Member-template getAs<specific type>'.
bool isRecordType() const
Represents the declaration of a typedef-name via the 'typedef' type specifier.
Base class for declarations which introduce a typedef-name.
TypeSourceInfo * getTypeSourceInfo() const
QualType getUnderlyingType() const
UnaryExprOrTypeTraitExpr - expression with either a type or (unevaluated) expression operand.
SourceLocation getRParenLoc() const
SourceLocation getOperatorLoc() const
bool isArgumentType() const
TypeSourceInfo * getArgumentTypeInfo() const
UnaryExprOrTypeTrait getKind() const
UnaryOperator - This represents the unary-expression's (except sizeof and alignof),...
SourceLocation getOperatorLoc() const
getOperatorLoc - Return the location of the operator.
Expr * getSubExpr() const
bool hasStoredFPFeatures() const
Is FPFeatures in Trailing Storage?
FPOptionsOverride getStoredFPFeatures() const
Get FPFeatures from trailing storage.
static UnaryOperator * CreateEmpty(const ASTContext &C, bool hasFPFeatures)
bool canOverflow() const
Returns true if the unary operator can cause an overflow.
A reference to a name which we were able to look up during parsing but could not resolve to a specifi...
CXXRecordDecl * getNamingClass()
Gets the 'naming class' (in the sense of C++0x [class.access.base]p5) of the lookup.
bool requiresADL() const
True if this declaration should be extended by argument-dependent lookup.
static UnresolvedLookupExpr * Create(const ASTContext &Context, CXXRecordDecl *NamingClass, NestedNameSpecifierLoc QualifierLoc, const DeclarationNameInfo &NameInfo, bool RequiresADL, UnresolvedSetIterator Begin, UnresolvedSetIterator End, bool KnownDependent, bool KnownInstantiationDependent)
Represents a C++ member access expression for which lookup produced a set of overloaded functions.
bool isArrow() const
Determine whether this member expression used the '->' operator; otherwise, it used the '.
SourceLocation getOperatorLoc() const
Retrieve the location of the '->' or '.' operator.
bool hasUnresolvedUsing() const
Determine whether the lookup results contain an unresolved using declaration.
Expr * getBase()
Retrieve the base object of this member expressions, e.g., the x in x.m.
static UnresolvedMemberExpr * Create(const ASTContext &Context, bool HasUnresolvedUsing, Expr *Base, QualType BaseType, bool IsArrow, SourceLocation OperatorLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc, const DeclarationNameInfo &MemberNameInfo, const TemplateArgumentListInfo *TemplateArgs, UnresolvedSetIterator Begin, UnresolvedSetIterator End)
bool isImplicitAccess() const
True if this is an implicit access, i.e., one in which the member being accessed was not written in t...
void addDecl(NamedDecl *D)
A set of unresolved declarations.
Represents the dependent type named by a dependently-scoped typename using declaration,...
Represents a dependent using declaration which was marked with typename.
SourceLocation getTypenameLoc() const
Returns the source location of the 'typename' keyword.
NestedNameSpecifierLoc getQualifierLoc() const
Retrieve the nested-name-specifier that qualifies the name, with source-location information.
SourceLocation getUsingLoc() const
Returns the source location of the 'using' keyword.
SourceLocation getEllipsisLoc() const
Get the location of the ellipsis if this is a pack expansion.
Represents a dependent using declaration which was not marked with typename.
SourceLocation getUsingLoc() const
Returns the source location of the 'using' keyword.
NestedNameSpecifierLoc getQualifierLoc() const
Retrieve the nested-name-specifier that qualifies the name, with source-location information.
DeclarationNameInfo getNameInfo() const
SourceLocation getEllipsisLoc() const
Get the location of the ellipsis if this is a pack expansion.
Represents a C++ using-declaration.
bool hasTypename() const
Return true if the using declaration has 'typename'.
NestedNameSpecifierLoc getQualifierLoc() const
Retrieve the nested-name-specifier that qualifies the name, with source-location information.
DeclarationNameInfo getNameInfo() const
SourceLocation getUsingLoc() const
Return the source location of the 'using' keyword.
Represents C++ using-directive.
SourceLocation getUsingLoc() const
Return the location of the using keyword.
NamespaceDecl * getNominatedNamespace()
Returns the namespace nominated by this using-directive.
DeclContext * getCommonAncestor()
Returns the common ancestor context of this using-directive and its nominated namespace.
SourceLocation getNamespaceKeyLocation() const
Returns the location of the namespace keyword.
SourceLocation getIdentLocation() const
Returns the location of this using declaration's identifier.
NestedNameSpecifierLoc getQualifierLoc() const
Retrieve the nested-name-specifier that qualifies the name of the namespace, with source-location inf...
Represents a C++ using-enum-declaration.
SourceLocation getEnumLoc() const
The source location of the 'enum' keyword.
TypeSourceInfo * getEnumType() const
SourceLocation getUsingLoc() const
The source location of the 'using' keyword.
Represents a pack of using declarations that a single using-declarator pack-expanded into.
NamedDecl * getInstantiatedFromUsingDecl() const
Get the using declaration from which this was instantiated.
ArrayRef< NamedDecl * > expansions() const
Get the set of using declarations that this pack expanded into.
Represents a shadow declaration implicitly introduced into a scope by a (resolved) using-declaration ...
NamedDecl * getTargetDecl() const
Gets the underlying declaration which has been brought into the local scope.
BaseUsingDecl * getIntroducer() const
Gets the (written or instantiated) using declaration that introduced this declaration.
Represents a call to the builtin function __builtin_va_arg.
TypeSourceInfo * getWrittenTypeInfo() const
SourceLocation getBuiltinLoc() const
SourceLocation getRParenLoc() const
bool isMicrosoftABI() const
Returns whether this is really a Win64 ABI va_arg expression.
const Expr * getSubExpr() const
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
void setType(QualType newType)
Represents a variable declaration or definition.
VarTemplateDecl * getDescribedVarTemplate() const
Retrieves the variable template that is described by this variable declaration.
bool isConstexpr() const
Whether this variable is (C++11) constexpr.
void setInstantiationOfStaticDataMember(VarDecl *VD, TemplateSpecializationKind TSK)
Specify that this variable is an instantiation of the static data member VD.
VarDecl * getMostRecentDecl()
Returns the most recent (re)declaration of this declaration.
DefinitionKind isThisDeclarationADefinition(ASTContext &) const
Check whether this declaration is a definition.
bool isInlineSpecified() const
VarDecl * getDefinition(ASTContext &)
Get the real (not just tentative) definition for this declaration.
EvaluatedStmt * getEvaluatedStmt() const
EvaluatedStmt * ensureEvaluatedStmt() const
Convert the initializer for this declaration to the elaborated EvaluatedStmt form,...
void setInlineSpecified()
VarDecl * getInstantiatedFromStaticDataMember() const
If this variable is an instantiated static data member of a class template specialization,...
bool isFileVarDecl() const
Returns true for file scoped variable declaration.
void setTSCSpec(ThreadStorageClassSpecifier TSC)
bool isInline() const
Whether this variable is (C++1z) inline.
ThreadStorageClassSpecifier getTSCSpec() const
const Expr * getInit() const
void setConstexpr(bool IC)
void setDescribedVarTemplate(VarTemplateDecl *Template)
StorageClass getStorageClass() const
Returns the storage class as written in the source.
void setImplicitlyInline()
VarDecl * getPreviousDecl()
Return the previous declaration of this declaration or NULL if this is the first declaration.
const Expr * getAnyInitializer() const
Get the initializer for this variable, no matter which declaration it is attached to.
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this variable is an instantiation of a static data member of a class template specialization,...
Declaration of a variable template.
VarDecl * getTemplatedDecl() const
Get the underlying variable declarations of the template.
bool isThisDeclarationADefinition() const
Returns whether this template declaration defines the primary variable pattern.
VarTemplateDecl * getMostRecentDecl()
Represents a variable template specialization, which refers to a variable template with a given set o...
SourceLocation getPointOfInstantiation() const
Get the point of instantiation (if any), or null if none.
void setTemplateArgsAsWritten(const ASTTemplateArgumentListInfo *ArgsWritten)
Set the template argument list as written in the sources.
const ASTTemplateArgumentListInfo * getTemplateArgsAsWritten() const
Retrieve the template argument list as written in the sources, if any.
void setSpecializationKind(TemplateSpecializationKind TSK)
const TemplateArgumentList & getTemplateArgs() const
Retrieve the template arguments of the variable template specialization.
void setPointOfInstantiation(SourceLocation Loc)
TemplateSpecializationKind getSpecializationKind() const
Determine the kind of specialization that this declaration represents.
VarTemplateDecl * getSpecializedTemplate() const
Retrieve the template that this specialization specializes.
VarTemplateSpecializationDecl * getMostRecentDecl()
Represents a C array with a specified size that is not an integer-constant-expression.
Represents a GCC generic vector type.
WhileStmt - This represents a 'while' stmt.
SourceLocation getWhileLoc() const
SourceLocation getRParenLoc() const
VarDecl * getConditionVariable()
Retrieve the variable declared in this "while" statement, if any.
SourceLocation getLParenLoc() const
static WhileStmt * Create(const ASTContext &Ctx, VarDecl *Var, Expr *Cond, Stmt *Body, SourceLocation WL, SourceLocation LParenLoc, SourceLocation RParenLoc)
Create a while statement.
A requires-expression requirement which queries the validity and properties of an expression ('simple...
SubstitutionDiagnostic * getExprSubstitutionDiagnostic() const
ConceptSpecializationExpr * getReturnTypeRequirementSubstitutedConstraintExpr() const
const ReturnTypeRequirement & getReturnTypeRequirement() const
SatisfactionStatus getSatisfactionStatus() const
SourceLocation getNoexceptLoc() const
A requires-expression requirement which is satisfied when a general constraint expression is satisfie...
const ASTConstraintSatisfaction & getConstraintSatisfaction() const
bool hasInvalidConstraint() const
Expr * getConstraintExpr() const
StringRef getInvalidConstraintEntity()
A static requirement that can be used in a requires-expression to check properties of types and expre...
RequirementKind getKind() const
A requires-expression requirement which queries the existence of a type name or type template special...
bool isSubstitutionFailure() const
SubstitutionDiagnostic * getSubstitutionDiagnostic() const
TypeSourceInfo * getType() const
The JSON file list parser is used to communicate input to InstallAPI.
CanQual< Type > CanQualType
Represents a canonical, potentially-qualified type.
bool isa(CodeGen::Address addr)
llvm::Expected< SourceLocation > ExpectedSLoc
StructuralEquivalenceKind
Whether to perform a normal or minimal equivalence check.
llvm::Expected< const Type * > ExpectedTypePtr
CanThrowResult
Possible results from evaluation of a noexcept expression.
@ TemplateName
The identifier is a template name. FIXME: Add an annotation for that.
ExprObjectKind
A further classification of the kind of object referenced by an l-value or x-value.
std::pair< FileID, unsigned > FileIDAndOffset
llvm::Expected< DeclarationName > ExpectedName
llvm::Expected< Decl * > ExpectedDecl
@ Property
The type of a property.
@ Result
The result type of a method or function.
const FunctionProtoType * T
llvm::Expected< QualType > ExpectedType
@ Template
We are parsing a template declaration.
@ VarTemplate
The name was classified as a variable template name.
std::pair< SourceLocation, StringRef > ConstraintSubstitutionDiagnostic
Unsatisfied constraint expressions if the template arguments could be substituted into them,...
CastKind
CastKind - The kind of operation required for a conversion.
ExprValueKind
The categorization of expression values, currently following the C++11 scheme.
llvm::SmallVector< Decl *, 2 > getCanonicalForwardRedeclChain(Decl *D)
SmallVector< CXXBaseSpecifier *, 4 > CXXCastPath
A simple array of base specifiers.
llvm::Expected< Expr * > ExpectedExpr
bool declaresSameEntity(const Decl *D1, const Decl *D2)
Determine whether two declarations declare the same entity.
TemplateSpecializationKind
Describes the kind of template specialization that a particular template specialization declaration r...
U cast(CodeGen::Address addr)
bool isLambdaMethod(const DeclContext *DC)
llvm::Expected< Stmt * > ExpectedStmt
static void updateFlags(const Decl *From, Decl *To)
Used as return type of getFriendCountAndPosition.
unsigned int IndexOfDecl
Index of the specific FriendDecl.
unsigned int TotalCount
Number of similar looking friends.
The result of a constraint satisfaction check, containing the necessary information to diagnose an un...
const UnsatisfiedConstraintRecord * end() const
static ASTConstraintSatisfaction * Rebuild(const ASTContext &C, const ASTConstraintSatisfaction &Satisfaction)
const UnsatisfiedConstraintRecord * begin() const
Represents an explicit template argument list in C++, e.g., the "<int>" in "sort<int>".
static const ASTTemplateArgumentListInfo * Create(const ASTContext &C, const TemplateArgumentListInfo &List)
const Expr * ConstraintExpr
Information about how a lambda is numbered within its context.
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
SourceLocation getLoc() const
getLoc - Returns the main location of the declaration name.
DeclarationName getName() const
getName - Returns the embedded declaration name.
void setCXXLiteralOperatorNameLoc(SourceLocation Loc)
setCXXLiteralOperatorNameLoc - Sets the location of the literal operator name (not the operator keywo...
void setNamedTypeInfo(TypeSourceInfo *TInfo)
setNamedTypeInfo - Sets the source type info associated to the name.
void setCXXOperatorNameRange(SourceRange R)
setCXXOperatorNameRange - Sets the range of the operator name (without the operator keyword).
SourceRange getCXXOperatorNameRange() const
getCXXOperatorNameRange - Gets the range of the operator name (without the operator keyword).
TypeSourceInfo * getNamedTypeInfo() const
getNamedTypeInfo - Returns the source type info associated to the name.
SourceLocation getCXXLiteralOperatorNameLoc() const
getCXXLiteralOperatorNameLoc - Returns the location of the literal operator name (not the operator ke...
Structure used to store a statement, the constant value to which it was evaluated (if any),...
bool HasConstantDestruction
Whether this variable is known to have constant destruction.
bool HasConstantInitialization
Whether this variable is known to have constant initialization.
FunctionDecl * SourceDecl
The function whose exception specification this is, for EST_Unevaluated and EST_Uninstantiated.
FunctionDecl * SourceTemplate
The function template whose exception specification this is instantiated from, for EST_Uninstantiated...
ExceptionSpecificationType Type
The kind of exception specification this is.
ArrayRef< QualType > Exceptions
Explicitly-specified list of exception types.
Expr * NoexceptExpr
Noexcept expression, if this is a computed noexcept specification.
Extra information about a function prototype.
ExceptionSpecInfo ExceptionSpec
RefQualifierKind RefQualifier
unsigned HasTrailingReturn
FunctionType::ExtInfo ExtInfo
const IdentifierInfo * getIdentifier() const
Returns the identifier to which this template name refers.
OverloadedOperatorKind getOperator() const
Return the overloaded operator to which this template name refers.
NestedNameSpecifierLoc Prefix
const NamespaceBaseDecl * Namespace
bool IsEquivalent(Decl *D1, Decl *D2)
Determine whether the two declarations are structurally equivalent.
Location information for a TemplateArgument.
SourceLocation getTemplateEllipsisLoc() const
SourceLocation getTemplateKwLoc() const
TypeSourceInfo * getAsTypeSourceInfo() const
SourceLocation getTemplateNameLoc() const
StringRef SubstitutedEntity