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);
191 template <
typename ImportT>
192 [[nodiscard]]
Error importInto(ImportT *&To, ImportT *From) {
193 auto ToOrErr = Importer.Import(From);
195 To = cast_or_null<ImportT>(*ToOrErr);
196 return ToOrErr.takeError();
201 template <
typename T>
205 auto ToOrErr = Importer.Import(From);
207 return ToOrErr.takeError();
208 return cast_or_null<T>(*ToOrErr);
211 template <
typename T>
212 auto import(
const T *From) {
213 return import(
const_cast<T *
>(From));
217 template <
typename T>
219 return Importer.Import(From);
223 template <
typename T>
227 return import(*From);
234 template <
typename ToDeclT>
struct CallOverloadedCreateFun {
235 template <
typename... Args>
decltype(
auto)
operator()(Args &&... args) {
236 return ToDeclT::Create(std::forward<Args>(args)...);
246 template <
typename ToDeclT,
typename FromDeclT,
typename... Args>
247 [[nodiscard]]
bool GetImportedOrCreateDecl(ToDeclT *&ToD, FromDeclT *FromD,
252 CallOverloadedCreateFun<ToDeclT> OC;
253 return GetImportedOrCreateSpecialDecl(ToD, OC, FromD,
254 std::forward<Args>(args)...);
261 template <
typename NewDeclT,
typename ToDeclT,
typename FromDeclT,
263 [[nodiscard]]
bool GetImportedOrCreateDecl(ToDeclT *&ToD, FromDeclT *FromD,
265 CallOverloadedCreateFun<NewDeclT> OC;
266 return GetImportedOrCreateSpecialDecl(ToD, OC, FromD,
267 std::forward<Args>(args)...);
271 template <
typename ToDeclT,
typename CreateFunT,
typename FromDeclT,
274 GetImportedOrCreateSpecialDecl(ToDeclT *&ToD, CreateFunT CreateFun,
275 FromDeclT *FromD, Args &&...args) {
276 if (Importer.getImportDeclErrorIfAny(FromD)) {
280 ToD = cast_or_null<ToDeclT>(Importer.GetAlreadyImportedOrNull(FromD));
283 ToD = CreateFun(std::forward<Args>(args)...);
285 Importer.RegisterImportedDecl(FromD, ToD);
286 Importer.SharedState->markAsNewDecl(ToD);
287 InitializeImportedDecl(FromD, ToD);
291 void InitializeImportedDecl(
Decl *FromD,
Decl *ToD) {
295 if (FromD->isImplicit())
303 if (D->doesThisDeclarationHaveABody() &&
309 void addDeclToContexts(
Decl *FromD,
Decl *ToD) {
310 if (Importer.isMinimalImport()) {
314 if (!FromD->getDescribedTemplate() &&
321 DeclContext *FromLexicalDC = FromD->getLexicalDeclContext();
325 bool Visible =
false;
338 if (
auto *FromNamed = dyn_cast<NamedDecl>(FromD)) {
341 FromDC->
lookup(FromNamed->getDeclName());
342 if (llvm::is_contained(FromLookup, FromNamed))
355 LT->update(TP, OldDC);
359 updateLookupTableForTemplateParameters(
360 Params, Importer.getToContext().getTranslationUnitDecl());
363 template <
typename TemplateParmDeclT>
364 Error importTemplateParameterDefaultArgument(
const TemplateParmDeclT *D,
365 TemplateParmDeclT *ToD) {
366 if (D->hasDefaultArgument()) {
367 if (D->defaultArgumentWasInherited()) {
369 import(D->getDefaultArgStorage().getInheritedFrom());
370 if (!ToInheritedFromOrErr)
371 return ToInheritedFromOrErr.takeError();
372 TemplateParmDeclT *ToInheritedFrom = *ToInheritedFromOrErr;
373 if (!ToInheritedFrom->hasDefaultArgument()) {
377 import(D->getDefaultArgStorage()
379 ->getDefaultArgument());
380 if (!ToInheritedDefaultArgOrErr)
381 return ToInheritedDefaultArgOrErr.takeError();
382 ToInheritedFrom->setDefaultArgument(Importer.getToContext(),
383 *ToInheritedDefaultArgOrErr);
385 ToD->setInheritedDefaultArgument(ToD->getASTContext(),
389 import(D->getDefaultArgument());
390 if (!ToDefaultArgOrErr)
391 return ToDefaultArgOrErr.takeError();
394 if (!ToD->hasDefaultArgument())
395 ToD->setDefaultArgument(Importer.getToContext(),
399 return Error::success();
411#define TYPE(Class, Base) \
412 ExpectedType Visit##Class##Type(const Class##Type *T);
413#include "clang/AST/TypeNodes.inc"
450 (IDK ==
IDK_Default && !Importer.isMinimalImport());
471 template <
typename InContainerTy>
475 template<
typename InContainerTy>
482 std::tuple<FunctionTemplateDecl *, TemplateArgsTy>;
487 template <
typename DeclTy>
511 template <
typename T>
515 bool IgnoreTemplateParmDepth =
false);
725 Err = MaybeVal.takeError();
731 template<
typename IIter,
typename OIter>
733 using ItemT = std::remove_reference_t<
decltype(*Obegin)>;
734 for (; Ibegin != Iend; ++Ibegin, ++Obegin) {
737 return ToOrErr.takeError();
740 return Error::success();
747 template<
typename InContainerTy,
typename OutContainerTy>
749 const InContainerTy &InContainer, OutContainerTy &OutContainer) {
751 InContainer.begin(), InContainer.end(), OutContainer.begin());
754 template<
typename InContainerTy,
typename OIter>
766template <
typename InContainerTy>
770 auto ToLAngleLocOrErr =
import(FromLAngleLoc);
771 if (!ToLAngleLocOrErr)
772 return ToLAngleLocOrErr.takeError();
773 auto ToRAngleLocOrErr =
import(FromRAngleLoc);
774 if (!ToRAngleLocOrErr)
775 return ToRAngleLocOrErr.takeError();
780 Result = std::move(ToTAInfo);
781 return Error::success();
797 From.LAngleLoc, From.RAngleLoc, From.arguments(),
Result);
809 if (
Error Err = importInto(std::get<0>(
Result), FTSInfo->getTemplate()))
810 return std::move(Err);
815 return std::move(Err);
825 return std::move(Err);
828 if (!ToRequiresClause)
829 return ToRequiresClause.takeError();
832 if (!ToTemplateLocOrErr)
833 return ToTemplateLocOrErr.takeError();
835 if (!ToLAngleLocOrErr)
836 return ToLAngleLocOrErr.takeError();
838 if (!ToRAngleLocOrErr)
839 return ToRAngleLocOrErr.takeError();
842 Importer.getToContext(),
860 return ToTypeOrErr.takeError();
868 return ToTypeOrErr.takeError();
875 return ToOrErr.takeError();
878 return ToTypeOrErr.takeError();
879 return TemplateArgument(dyn_cast<ValueDecl>((*ToOrErr)->getCanonicalDecl()),
886 return ToTypeOrErr.takeError();
894 return ToTypeOrErr.takeError();
897 return ToValueOrErr.takeError();
904 if (!ToTemplateOrErr)
905 return ToTemplateOrErr.takeError();
913 if (!ToTemplateOrErr)
914 return ToTemplateOrErr.takeError();
925 return ToExpr.takeError();
931 return std::move(Err);
937 llvm_unreachable(
"Invalid template argument kind");
945 return ArgOrErr.takeError();
954 return E.takeError();
960 return TSIOrErr.takeError();
963 if (!ToTemplateKWLocOrErr)
964 return ToTemplateKWLocOrErr.takeError();
966 if (!ToTemplateQualifierLocOrErr)
967 return ToTemplateQualifierLocOrErr.takeError();
969 if (!ToTemplateNameLocOrErr)
970 return ToTemplateNameLocOrErr.takeError();
971 auto ToTemplateEllipsisLocOrErr =
973 if (!ToTemplateEllipsisLocOrErr)
974 return ToTemplateEllipsisLocOrErr.takeError();
976 Importer.getToContext(), *ToTemplateKWLocOrErr,
977 *ToTemplateQualifierLocOrErr, *ToTemplateNameLocOrErr,
978 *ToTemplateEllipsisLocOrErr);
988 size_t NumDecls = DG.
end() - DG.
begin();
990 ToDecls.reserve(NumDecls);
991 for (
Decl *FromD : DG) {
992 if (
auto ToDOrErr =
import(FromD))
993 ToDecls.push_back(*ToDOrErr);
995 return ToDOrErr.takeError();
1010 return ToDotLocOrErr.takeError();
1013 if (!ToFieldLocOrErr)
1014 return ToFieldLocOrErr.takeError();
1017 ToFieldName, *ToDotLocOrErr, *ToFieldLocOrErr);
1021 if (!ToLBracketLocOrErr)
1022 return ToLBracketLocOrErr.takeError();
1025 if (!ToRBracketLocOrErr)
1026 return ToRBracketLocOrErr.takeError();
1030 *ToLBracketLocOrErr,
1031 *ToRBracketLocOrErr);
1034 if (!ToEllipsisLocOrErr)
1035 return ToEllipsisLocOrErr.takeError();
1039 D.
getArrayIndex(), *ToLBracketLocOrErr, *ToEllipsisLocOrErr,
1040 *ToRBracketLocOrErr);
1045 Error Err = Error::success();
1048 auto ToConceptNameLoc =
1054 return std::move(Err);
1057 if (ASTTemplateArgs)
1059 return std::move(Err);
1061 Importer.getToContext(), ToNNS, ToTemplateKWLoc,
1065 Importer.getToContext(), ToTAInfo)
1071 char *ToStore =
new (Importer.getToContext())
char[FromStr.size()];
1072 std::copy(FromStr.begin(), FromStr.end(), ToStore);
1073 return StringRef(ToStore, FromStr.size());
1085 return ToSecondExpr.takeError();
1086 ToSat.
Details.emplace_back(ToSecondExpr.get());
1090 return ToCROrErr.takeError();
1091 ToSat.
Details.emplace_back(ToCROrErr.get());
1098 return ToPairFirst.takeError();
1100 ToSat.
Details.emplace_back(
new (Importer.getToContext())
1102 ToPairFirst.get(), ToPairSecond});
1106 return Error::success();
1111ASTNodeImporter::import(
1116 return ToLoc.takeError();
1118 return new (Importer.getToContext())
1130 return DiagOrErr.takeError();
1131 return new (Importer.getToContext()) TypeRequirement(*DiagOrErr);
1135 return ToType.takeError();
1136 return new (Importer.getToContext()) TypeRequirement(*ToType);
1144 bool IsRKSimple = From->
getKind() == Requirement::RK_Simple;
1147 std::optional<ExprRequirement::ReturnTypeRequirement> Req;
1153 const ExprRequirement::ReturnTypeRequirement &FromTypeRequirement =
1156 if (FromTypeRequirement.isTypeConstraint()) {
1157 const bool IsDependent = FromTypeRequirement.isDependent();
1159 import(FromTypeRequirement.getTypeConstraintTemplateParameterList());
1161 return ParamsOrErr.takeError();
1162 if (Status >= ExprRequirement::SS_ConstraintsNotSatisfied) {
1163 auto SubstConstraintExprOrErr =
1165 if (!SubstConstraintExprOrErr)
1166 return SubstConstraintExprOrErr.takeError();
1167 SubstitutedConstraintExpr = SubstConstraintExprOrErr.get();
1169 Req.emplace(ParamsOrErr.get(), IsDependent);
1170 }
else if (FromTypeRequirement.isSubstitutionFailure()) {
1171 auto DiagOrErr =
import(FromTypeRequirement.getSubstitutionDiagnostic());
1173 return DiagOrErr.takeError();
1174 Req.emplace(DiagOrErr.get());
1181 if (!NoexceptLocOrErr)
1182 return NoexceptLocOrErr.takeError();
1184 if (Status == ExprRequirement::SS_ExprSubstitutionFailure) {
1187 return DiagOrErr.takeError();
1188 return new (Importer.getToContext()) ExprRequirement(
1189 *DiagOrErr, IsRKSimple, *NoexceptLocOrErr, std::move(*Req));
1193 return ExprOrErr.takeError();
1195 *ExprOrErr, IsRKSimple, *NoexceptLocOrErr, std::move(*Req), Status,
1196 SubstitutedConstraintExpr);
1211 return new (Importer.getToContext())
1212 NestedRequirement(ToEntity, ToSatisfaction);
1216 return ToExpr.takeError();
1217 if (ToExpr.get()->isInstantiationDependent()) {
1218 return new (Importer.getToContext()) NestedRequirement(ToExpr.get());
1223 return std::move(Err);
1224 return new (Importer.getToContext()) NestedRequirement(
1225 Importer.getToContext(), ToExpr.get(), Satisfaction);
1233 switch (FromRequire->
getKind()) {
1243 llvm_unreachable(
"Unhandled requirement kind");
1253 return VarOrErr.takeError();
1258 return LocationOrErr.takeError();
1263 return std::move(Err);
1270template <
typename T>
1272 if (
Found->getLinkageInternal() != From->getLinkageInternal())
1275 if (From->hasExternalFormalLinkage())
1276 return Found->hasExternalFormalLinkage();
1277 if (Importer.GetFromTU(
Found) != From->getTranslationUnitDecl())
1279 if (From->isInAnonymousNamespace())
1280 return Found->isInAnonymousNamespace();
1282 return !
Found->isInAnonymousNamespace() &&
1283 !
Found->hasExternalFormalLinkage();
1303using namespace clang;
1309 FunctionDeclsWithImportInProgress.insert(D);
1312 return llvm::scope_exit([
this, LambdaD]() {
1314 FunctionDeclsWithImportInProgress.erase(LambdaD);
1321 return FunctionDeclsWithImportInProgress.find(D) !=
1322 FunctionDeclsWithImportInProgress.end();
1326 Importer.FromDiag(
SourceLocation(), diag::err_unsupported_ast_node)
1327 <<
T->getTypeClassName();
1332 ExpectedType UnderlyingTypeOrErr =
import(
T->getValueType());
1333 if (!UnderlyingTypeOrErr)
1334 return UnderlyingTypeOrErr.takeError();
1336 return Importer.getToContext().getAtomicType(*UnderlyingTypeOrErr);
1340 switch (
T->getKind()) {
1341#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
1342 case BuiltinType::Id: \
1343 return Importer.getToContext().SingletonId;
1344#include "clang/Basic/OpenCLImageTypes.def"
1345#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
1346 case BuiltinType::Id: \
1347 return Importer.getToContext().Id##Ty;
1348#include "clang/Basic/OpenCLExtensionTypes.def"
1349#define SVE_TYPE(Name, Id, SingletonId) \
1350 case BuiltinType::Id: \
1351 return Importer.getToContext().SingletonId;
1352#include "clang/Basic/AArch64ACLETypes.def"
1353#define PPC_VECTOR_TYPE(Name, Id, Size) \
1354 case BuiltinType::Id: \
1355 return Importer.getToContext().Id##Ty;
1356#include "clang/Basic/PPCTypes.def"
1357#define RVV_TYPE(Name, Id, SingletonId) \
1358 case BuiltinType::Id: \
1359 return Importer.getToContext().SingletonId;
1360#include "clang/Basic/RISCVVTypes.def"
1361#define WASM_TYPE(Name, Id, SingletonId) \
1362 case BuiltinType::Id: \
1363 return Importer.getToContext().SingletonId;
1364#include "clang/Basic/WebAssemblyReferenceTypes.def"
1365#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) \
1366 case BuiltinType::Id: \
1367 return Importer.getToContext().SingletonId;
1368#include "clang/Basic/AMDGPUTypes.def"
1369#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \
1370 case BuiltinType::Id: \
1371 return Importer.getToContext().SingletonId;
1372#include "clang/Basic/HLSLIntangibleTypes.def"
1373#define SPIRV_TYPE(Name, Id, SingletonId) \
1374 case BuiltinType::Id: \
1375 return Importer.getToContext().SingletonId;
1376#include "clang/Basic/SPIRVTypes.def"
1377#define SHARED_SINGLETON_TYPE(Expansion)
1378#define BUILTIN_TYPE(Id, SingletonId) \
1379 case BuiltinType::Id: return Importer.getToContext().SingletonId;
1380#include "clang/AST/BuiltinTypes.def"
1388 case BuiltinType::Char_U:
1392 if (Importer.getToContext().getLangOpts().CharIsSigned)
1393 return Importer.getToContext().UnsignedCharTy;
1395 return Importer.getToContext().CharTy;
1397 case BuiltinType::Char_S:
1401 if (!Importer.getToContext().getLangOpts().CharIsSigned)
1402 return Importer.getToContext().SignedCharTy;
1404 return Importer.getToContext().CharTy;
1406 case BuiltinType::WChar_S:
1407 case BuiltinType::WChar_U:
1410 return Importer.getToContext().WCharTy;
1413 llvm_unreachable(
"Invalid BuiltinType Kind!");
1416ExpectedType ASTNodeImporter::VisitDecayedType(
const DecayedType *
T) {
1417 ExpectedType ToOriginalTypeOrErr =
import(
T->getOriginalType());
1418 if (!ToOriginalTypeOrErr)
1419 return ToOriginalTypeOrErr.takeError();
1421 return Importer.getToContext().getDecayedType(*ToOriginalTypeOrErr);
1424ExpectedType ASTNodeImporter::VisitComplexType(
const ComplexType *
T) {
1425 ExpectedType ToElementTypeOrErr =
import(
T->getElementType());
1426 if (!ToElementTypeOrErr)
1427 return ToElementTypeOrErr.takeError();
1429 return Importer.getToContext().getComplexType(*ToElementTypeOrErr);
1432ExpectedType ASTNodeImporter::VisitPointerType(
const PointerType *
T) {
1434 if (!ToPointeeTypeOrErr)
1435 return ToPointeeTypeOrErr.takeError();
1437 return Importer.getToContext().getPointerType(*ToPointeeTypeOrErr);
1440ExpectedType ASTNodeImporter::VisitBlockPointerType(
const BlockPointerType *
T) {
1443 if (!ToPointeeTypeOrErr)
1444 return ToPointeeTypeOrErr.takeError();
1446 return Importer.getToContext().getBlockPointerType(*ToPointeeTypeOrErr);
1450ASTNodeImporter::VisitLValueReferenceType(
const LValueReferenceType *
T) {
1452 ExpectedType ToPointeeTypeOrErr =
import(
T->getPointeeTypeAsWritten());
1453 if (!ToPointeeTypeOrErr)
1454 return ToPointeeTypeOrErr.takeError();
1456 return Importer.getToContext().getLValueReferenceType(*ToPointeeTypeOrErr);
1460ASTNodeImporter::VisitRValueReferenceType(
const RValueReferenceType *
T) {
1462 ExpectedType ToPointeeTypeOrErr =
import(
T->getPointeeTypeAsWritten());
1463 if (!ToPointeeTypeOrErr)
1464 return ToPointeeTypeOrErr.takeError();
1466 return Importer.getToContext().getRValueReferenceType(*ToPointeeTypeOrErr);
1470ASTNodeImporter::VisitMemberPointerType(
const MemberPointerType *
T) {
1473 if (!ToPointeeTypeOrErr)
1474 return ToPointeeTypeOrErr.takeError();
1476 auto QualifierOrErr =
import(
T->getQualifier());
1477 if (!QualifierOrErr)
1478 return QualifierOrErr.takeError();
1480 auto ClsOrErr =
import(
T->getMostRecentCXXRecordDecl());
1482 return ClsOrErr.takeError();
1484 return Importer.getToContext().getMemberPointerType(
1485 *ToPointeeTypeOrErr, *QualifierOrErr, *ClsOrErr);
1489ASTNodeImporter::VisitConstantArrayType(
const ConstantArrayType *
T) {
1490 Error Err = Error::success();
1491 auto ToElementType = importChecked(Err,
T->getElementType());
1492 auto ToSizeExpr = importChecked(Err,
T->getSizeExpr());
1494 return std::move(Err);
1496 return Importer.getToContext().getConstantArrayType(
1497 ToElementType,
T->getSize(), ToSizeExpr,
T->getSizeModifier(),
1498 T->getIndexTypeCVRQualifiers());
1502ASTNodeImporter::VisitArrayParameterType(
const ArrayParameterType *
T) {
1504 if (!ToArrayTypeOrErr)
1505 return ToArrayTypeOrErr.takeError();
1507 return Importer.getToContext().getArrayParameterType(*ToArrayTypeOrErr);
1511ASTNodeImporter::VisitIncompleteArrayType(
const IncompleteArrayType *
T) {
1512 ExpectedType ToElementTypeOrErr =
import(
T->getElementType());
1513 if (!ToElementTypeOrErr)
1514 return ToElementTypeOrErr.takeError();
1516 return Importer.getToContext().getIncompleteArrayType(*ToElementTypeOrErr,
1517 T->getSizeModifier(),
1518 T->getIndexTypeCVRQualifiers());
1522ASTNodeImporter::VisitVariableArrayType(
const VariableArrayType *
T) {
1523 Error Err = Error::success();
1524 QualType ToElementType = importChecked(Err,
T->getElementType());
1525 Expr *ToSizeExpr = importChecked(Err,
T->getSizeExpr());
1527 return std::move(Err);
1528 return Importer.getToContext().getVariableArrayType(
1529 ToElementType, ToSizeExpr,
T->getSizeModifier(),
1530 T->getIndexTypeCVRQualifiers());
1533ExpectedType ASTNodeImporter::VisitDependentSizedArrayType(
1534 const DependentSizedArrayType *
T) {
1535 Error Err = Error::success();
1536 QualType ToElementType = importChecked(Err,
T->getElementType());
1537 Expr *ToSizeExpr = importChecked(Err,
T->getSizeExpr());
1539 return std::move(Err);
1543 return Importer.getToContext().getDependentSizedArrayType(
1544 ToElementType, ToSizeExpr,
T->getSizeModifier(),
1545 T->getIndexTypeCVRQualifiers());
1548ExpectedType ASTNodeImporter::VisitDependentSizedExtVectorType(
1549 const DependentSizedExtVectorType *
T) {
1550 Error Err = Error::success();
1551 QualType ToElementType = importChecked(Err,
T->getElementType());
1552 Expr *ToSizeExpr = importChecked(Err,
T->getSizeExpr());
1553 SourceLocation ToAttrLoc = importChecked(Err,
T->getAttributeLoc());
1555 return std::move(Err);
1556 return Importer.getToContext().getDependentSizedExtVectorType(
1557 ToElementType, ToSizeExpr, ToAttrLoc);
1560ExpectedType ASTNodeImporter::VisitVectorType(
const VectorType *
T) {
1561 ExpectedType ToElementTypeOrErr =
import(
T->getElementType());
1562 if (!ToElementTypeOrErr)
1563 return ToElementTypeOrErr.takeError();
1565 return Importer.getToContext().getVectorType(*ToElementTypeOrErr,
1566 T->getNumElements(),
1567 T->getVectorKind());
1570ExpectedType ASTNodeImporter::VisitExtVectorType(
const ExtVectorType *
T) {
1571 ExpectedType ToElementTypeOrErr =
import(
T->getElementType());
1572 if (!ToElementTypeOrErr)
1573 return ToElementTypeOrErr.takeError();
1575 return Importer.getToContext().getExtVectorType(*ToElementTypeOrErr,
1576 T->getNumElements());
1580ASTNodeImporter::VisitFunctionNoProtoType(
const FunctionNoProtoType *
T) {
1584 if (!ToReturnTypeOrErr)
1585 return ToReturnTypeOrErr.takeError();
1587 return Importer.getToContext().getFunctionNoProtoType(*ToReturnTypeOrErr,
1592ASTNodeImporter::VisitFunctionProtoType(
const FunctionProtoType *
T) {
1594 if (!ToReturnTypeOrErr)
1595 return ToReturnTypeOrErr.takeError();
1598 SmallVector<QualType, 4> ArgTypes;
1602 return TyOrErr.takeError();
1603 ArgTypes.push_back(*TyOrErr);
1607 SmallVector<QualType, 4> ExceptionTypes;
1611 return TyOrErr.takeError();
1612 ExceptionTypes.push_back(*TyOrErr);
1616 Error Err = Error::success();
1617 FunctionProtoType::ExtProtoInfo ToEPI;
1633 return std::move(Err);
1635 return Importer.getToContext().getFunctionType(
1636 *ToReturnTypeOrErr, ArgTypes, ToEPI);
1640 const UnresolvedUsingType *
T) {
1641 auto ToQualifierOrErr =
import(
T->getQualifier());
1642 if (!ToQualifierOrErr)
1643 return ToQualifierOrErr.takeError();
1644 auto ToDeclOrErr =
import(
T->getDecl());
1646 return ToDeclOrErr.takeError();
1649 return Importer.getToContext().getCanonicalUnresolvedUsingType(
1651 return Importer.getToContext().getUnresolvedUsingType(
1652 T->getKeyword(), *ToQualifierOrErr, *ToDeclOrErr);
1655ExpectedType ASTNodeImporter::VisitParenType(
const ParenType *
T) {
1657 if (!ToInnerTypeOrErr)
1658 return ToInnerTypeOrErr.takeError();
1660 return Importer.getToContext().getParenType(*ToInnerTypeOrErr);
1664ASTNodeImporter::VisitPackIndexingType(clang::PackIndexingType
const *
T) {
1668 return Pattern.takeError();
1671 return Index.takeError();
1672 return Importer.getToContext().getPackIndexingType(*Pattern, *Index);
1675ExpectedType ASTNodeImporter::VisitTypedefType(
const TypedefType *
T) {
1676 Expected<TypedefNameDecl *> ToDeclOrErr =
import(
T->getDecl());
1678 return ToDeclOrErr.takeError();
1680 auto ToQualifierOrErr =
import(
T->getQualifier());
1681 if (!ToQualifierOrErr)
1682 return ToQualifierOrErr.takeError();
1685 T->typeMatchesDecl() ? QualType() : import(
T->desugar());
1686 if (!ToUnderlyingTypeOrErr)
1687 return ToUnderlyingTypeOrErr.takeError();
1689 return Importer.getToContext().getTypedefType(
1690 T->getKeyword(), *ToQualifierOrErr, *ToDeclOrErr, *ToUnderlyingTypeOrErr);
1693ExpectedType ASTNodeImporter::VisitTypeOfExprType(
const TypeOfExprType *
T) {
1696 return ToExprOrErr.takeError();
1697 return Importer.getToContext().getTypeOfExprType(*ToExprOrErr,
T->getKind());
1700ExpectedType ASTNodeImporter::VisitTypeOfType(
const TypeOfType *
T) {
1701 ExpectedType ToUnderlyingTypeOrErr =
import(
T->getUnmodifiedType());
1702 if (!ToUnderlyingTypeOrErr)
1703 return ToUnderlyingTypeOrErr.takeError();
1704 return Importer.getToContext().getTypeOfType(*ToUnderlyingTypeOrErr,
1708ExpectedType ASTNodeImporter::VisitUsingType(
const UsingType *
T) {
1709 auto ToQualifierOrErr =
import(
T->getQualifier());
1710 if (!ToQualifierOrErr)
1711 return ToQualifierOrErr.takeError();
1712 auto ToDeclOrErr =
import(
T->getDecl());
1714 return ToDeclOrErr.takeError();
1718 return ToTypeOrErr.takeError();
1719 return Importer.getToContext().getUsingType(
1720 T->getKeyword(), *ToQualifierOrErr, *ToDeclOrErr, *ToTypeOrErr);
1723ExpectedType ASTNodeImporter::VisitDecltypeType(
const DecltypeType *
T) {
1727 return ToExprOrErr.takeError();
1729 ExpectedType ToUnderlyingTypeOrErr =
import(
T->getUnderlyingType());
1730 if (!ToUnderlyingTypeOrErr)
1731 return ToUnderlyingTypeOrErr.takeError();
1733 return Importer.getToContext().getDecltypeType(
1734 *ToExprOrErr, *ToUnderlyingTypeOrErr);
1738ASTNodeImporter::VisitUnaryTransformType(
const UnaryTransformType *
T) {
1740 if (!ToBaseTypeOrErr)
1741 return ToBaseTypeOrErr.takeError();
1743 ExpectedType ToUnderlyingTypeOrErr =
import(
T->getUnderlyingType());
1744 if (!ToUnderlyingTypeOrErr)
1745 return ToUnderlyingTypeOrErr.takeError();
1747 return Importer.getToContext().getUnaryTransformType(
1748 *ToBaseTypeOrErr, *ToUnderlyingTypeOrErr,
T->getUTTKind());
1751ExpectedType ASTNodeImporter::VisitAutoType(
const AutoType *
T) {
1753 ExpectedType ToDeducedTypeOrErr =
import(
T->getDeducedType());
1754 if (!ToDeducedTypeOrErr)
1755 return ToDeducedTypeOrErr.takeError();
1758 if (
TemplateName FromTypeConstraint =
T->getTypeConstraintConcept();
1759 !FromTypeConstraint.isNull()) {
1760 Expected<TemplateName> ToTypeConstraintOrErr =
import(FromTypeConstraint);
1761 if (!ToTypeConstraintOrErr)
1762 return ToTypeConstraintOrErr.takeError();
1763 ToTypeConstraint = *ToTypeConstraintOrErr;
1766 SmallVector<TemplateArgument, 2> ToTemplateArgs;
1769 return std::move(Err);
1771 return Importer.getToContext().getAutoType(
1772 T->getDeducedKind(), *ToDeducedTypeOrErr,
T->getKeyword(),
1773 ToTypeConstraint, ToTemplateArgs);
1776ExpectedType ASTNodeImporter::VisitDeducedTemplateSpecializationType(
1777 const DeducedTemplateSpecializationType *
T) {
1779 Expected<TemplateName> ToTemplateNameOrErr =
import(
T->getTemplateName());
1780 if (!ToTemplateNameOrErr)
1781 return ToTemplateNameOrErr.takeError();
1782 ExpectedType ToDeducedTypeOrErr =
import(
T->getDeducedType());
1783 if (!ToDeducedTypeOrErr)
1784 return ToDeducedTypeOrErr.takeError();
1786 return Importer.getToContext().getDeducedTemplateSpecializationType(
1787 T->getDeducedKind(), *ToDeducedTypeOrErr,
T->getKeyword(),
1788 *ToTemplateNameOrErr);
1791ExpectedType ASTNodeImporter::VisitTagType(
const TagType *
T) {
1792 TagDecl *DeclForType =
T->getDecl();
1793 Expected<TagDecl *> ToDeclOrErr =
import(DeclForType);
1795 return ToDeclOrErr.takeError();
1801 Expected<TagDecl *> ToDefDeclOrErr =
import(DeclForType->
getDefinition());
1802 if (!ToDefDeclOrErr)
1803 return ToDefDeclOrErr.takeError();
1806 return Importer.getToContext().getCanonicalTagType(*ToDeclOrErr);
1808 auto ToQualifierOrErr =
import(
T->getQualifier());
1809 if (!ToQualifierOrErr)
1810 return ToQualifierOrErr.takeError();
1812 return Importer.getToContext().getTagType(
T->getKeyword(), *ToQualifierOrErr,
1813 *ToDeclOrErr,
T->isTagOwned());
1816ExpectedType ASTNodeImporter::VisitEnumType(
const EnumType *
T) {
1817 return VisitTagType(
T);
1820ExpectedType ASTNodeImporter::VisitRecordType(
const RecordType *
T) {
1821 return VisitTagType(
T);
1825ASTNodeImporter::VisitInjectedClassNameType(
const InjectedClassNameType *
T) {
1826 return VisitTagType(
T);
1829ExpectedType ASTNodeImporter::VisitAttributedType(
const AttributedType *
T) {
1830 ExpectedType ToModifiedTypeOrErr =
import(
T->getModifiedType());
1831 if (!ToModifiedTypeOrErr)
1832 return ToModifiedTypeOrErr.takeError();
1833 ExpectedType ToEquivalentTypeOrErr =
import(
T->getEquivalentType());
1834 if (!ToEquivalentTypeOrErr)
1835 return ToEquivalentTypeOrErr.takeError();
1837 return Importer.getToContext().getAttributedType(
1838 T->getAttrKind(), *ToModifiedTypeOrErr, *ToEquivalentTypeOrErr,
1843ASTNodeImporter::VisitCountAttributedType(
const CountAttributedType *
T) {
1845 if (!ToWrappedTypeOrErr)
1846 return ToWrappedTypeOrErr.takeError();
1848 Error Err = Error::success();
1849 Expr *CountExpr = importChecked(Err,
T->getCountExpr());
1851 SmallVector<TypeCoupledDeclRefInfo, 1> CoupledDecls;
1852 for (
const TypeCoupledDeclRefInfo &TI :
T->dependent_decls()) {
1853 Expected<ValueDecl *> ToDeclOrErr =
import(TI.getDecl());
1855 return ToDeclOrErr.takeError();
1856 CoupledDecls.emplace_back(*ToDeclOrErr, TI.isDeref());
1859 return Importer.getToContext().getCountAttributedType(
1860 *ToWrappedTypeOrErr, CountExpr,
T->isCountInBytes(),
T->isOrNull(),
1861 ArrayRef(CoupledDecls));
1865ASTNodeImporter::VisitLateParsedAttrType(
const LateParsedAttrType *
T) {
1866 llvm_unreachable(
"should be replaced with a concrete type before AST import");
1869ExpectedType ASTNodeImporter::VisitTemplateTypeParmType(
1870 const TemplateTypeParmType *
T) {
1871 Expected<TemplateTypeParmDecl *> ToDeclOrErr =
import(
T->getDecl());
1873 return ToDeclOrErr.takeError();
1875 return Importer.getToContext().getTemplateTypeParmType(
1876 T->getDepth(),
T->getIndex(),
T->isParameterPack(), *ToDeclOrErr);
1879ExpectedType ASTNodeImporter::VisitSubstTemplateTypeParmType(
1880 const SubstTemplateTypeParmType *
T) {
1881 Expected<Decl *> ReplacedOrErr =
import(
T->getAssociatedDecl());
1883 return ReplacedOrErr.takeError();
1885 ExpectedType ToReplacementTypeOrErr =
import(
T->getReplacementType());
1886 if (!ToReplacementTypeOrErr)
1887 return ToReplacementTypeOrErr.takeError();
1889 return Importer.getToContext().getSubstTemplateTypeParmType(
1890 *ToReplacementTypeOrErr, *ReplacedOrErr,
T->getIndex(),
T->getPackIndex(),
1894ExpectedType ASTNodeImporter::VisitSubstTemplateTypeParmPackType(
1895 const SubstTemplateTypeParmPackType *
T) {
1896 Expected<Decl *> ReplacedOrErr =
import(
T->getAssociatedDecl());
1898 return ReplacedOrErr.takeError();
1900 Expected<TemplateArgument> ToArgumentPack =
import(
T->getArgumentPack());
1901 if (!ToArgumentPack)
1902 return ToArgumentPack.takeError();
1904 return Importer.getToContext().getSubstTemplateTypeParmPackType(
1905 *ReplacedOrErr,
T->getIndex(),
T->getFinal(), *ToArgumentPack);
1908ExpectedType ASTNodeImporter::VisitSubstBuiltinTemplatePackType(
1909 const SubstBuiltinTemplatePackType *
T) {
1910 Expected<TemplateArgument> ToArgumentPack =
import(
T->getArgumentPack());
1911 if (!ToArgumentPack)
1912 return ToArgumentPack.takeError();
1913 return Importer.getToContext().getSubstBuiltinTemplatePack(*ToArgumentPack);
1916ExpectedType ASTNodeImporter::VisitTemplateSpecializationType(
1917 const TemplateSpecializationType *
T) {
1918 auto ToTemplateOrErr =
import(
T->getTemplateName());
1919 if (!ToTemplateOrErr)
1920 return ToTemplateOrErr.takeError();
1922 SmallVector<TemplateArgument, 2> ToTemplateArgs;
1925 return std::move(Err);
1929 if (!ToUnderlyingOrErr)
1930 return ToUnderlyingOrErr.takeError();
1931 return Importer.getToContext().getTemplateSpecializationType(
1932 T->getKeyword(), *ToTemplateOrErr, ToTemplateArgs, {},
1933 *ToUnderlyingOrErr);
1937ASTNodeImporter::VisitPackExpansionType(
const PackExpansionType *
T) {
1939 if (!ToPatternOrErr)
1940 return ToPatternOrErr.takeError();
1942 return Importer.getToContext().getPackExpansionType(*ToPatternOrErr,
1943 T->getNumExpansions(),
1948ASTNodeImporter::VisitDependentNameType(
const DependentNameType *
T) {
1949 auto ToQualifierOrErr =
import(
T->getQualifier());
1950 if (!ToQualifierOrErr)
1951 return ToQualifierOrErr.takeError();
1953 IdentifierInfo *Name = Importer.Import(
T->getIdentifier());
1954 return Importer.getToContext().getDependentNameType(
T->getKeyword(),
1955 *ToQualifierOrErr, Name);
1959ASTNodeImporter::VisitObjCInterfaceType(
const ObjCInterfaceType *
T) {
1960 Expected<ObjCInterfaceDecl *> ToDeclOrErr =
import(
T->getDecl());
1962 return ToDeclOrErr.takeError();
1964 return Importer.getToContext().getObjCInterfaceType(*ToDeclOrErr);
1967ExpectedType ASTNodeImporter::VisitObjCObjectType(
const ObjCObjectType *
T) {
1969 if (!ToBaseTypeOrErr)
1970 return ToBaseTypeOrErr.takeError();
1972 SmallVector<QualType, 4> TypeArgs;
1973 for (
auto TypeArg :
T->getTypeArgsAsWritten()) {
1975 TypeArgs.push_back(*TyOrErr);
1977 return TyOrErr.takeError();
1980 SmallVector<ObjCProtocolDecl *, 4> Protocols;
1981 for (
auto *P :
T->quals()) {
1982 if (Expected<ObjCProtocolDecl *> ProtocolOrErr =
import(P))
1983 Protocols.push_back(*ProtocolOrErr);
1985 return ProtocolOrErr.takeError();
1989 return Importer.getToContext().getObjCObjectType(*ToBaseTypeOrErr, TypeArgs,
1991 T->isKindOfTypeAsWritten());
1995ASTNodeImporter::VisitObjCObjectPointerType(
const ObjCObjectPointerType *
T) {
1997 if (!ToPointeeTypeOrErr)
1998 return ToPointeeTypeOrErr.takeError();
2000 return Importer.getToContext().getObjCObjectPointerType(*ToPointeeTypeOrErr);
2004ASTNodeImporter::VisitMacroQualifiedType(
const MacroQualifiedType *
T) {
2005 ExpectedType ToUnderlyingTypeOrErr =
import(
T->getUnderlyingType());
2006 if (!ToUnderlyingTypeOrErr)
2007 return ToUnderlyingTypeOrErr.takeError();
2009 IdentifierInfo *ToIdentifier = Importer.Import(
T->getMacroIdentifier());
2010 return Importer.getToContext().getMacroQualifiedType(*ToUnderlyingTypeOrErr,
2014ExpectedType clang::ASTNodeImporter::VisitAdjustedType(
const AdjustedType *
T) {
2015 Error Err = Error::success();
2016 QualType ToOriginalType = importChecked(Err,
T->getOriginalType());
2017 QualType ToAdjustedType = importChecked(Err,
T->getAdjustedType());
2019 return std::move(Err);
2021 return Importer.getToContext().getAdjustedType(ToOriginalType,
2025ExpectedType clang::ASTNodeImporter::VisitBitIntType(
const BitIntType *
T) {
2026 return Importer.getToContext().getBitIntType(
T->isUnsigned(),
2030ExpectedType clang::ASTNodeImporter::VisitBTFTagAttributedType(
2031 const clang::BTFTagAttributedType *
T) {
2032 Error Err = Error::success();
2033 const BTFTypeTagAttr *ToBTFAttr = importChecked(Err,
T->getAttr());
2034 QualType ToWrappedType = importChecked(Err,
T->getWrappedType());
2036 return std::move(Err);
2038 return Importer.getToContext().getBTFTagAttributedType(ToBTFAttr,
2042ExpectedType clang::ASTNodeImporter::VisitOverflowBehaviorType(
2043 const clang::OverflowBehaviorType *
T) {
2044 Error Err = Error::success();
2045 OverflowBehaviorType::OverflowBehaviorKind ToKind =
T->getBehaviorKind();
2048 return std::move(Err);
2050 return Importer.getToContext().getOverflowBehaviorType(ToKind,
2054ExpectedType clang::ASTNodeImporter::VisitHLSLAttributedResourceType(
2055 const clang::HLSLAttributedResourceType *
T) {
2056 Error Err = Error::success();
2057 HLSLAttributedResourceType::Attributes ToAttrs =
T->getAttrs();
2058 QualType ToWrappedType = importChecked(Err,
T->getWrappedType());
2059 QualType ToContainedType = importChecked(Err,
T->getContainedType());
2060 ToAttrs.SampleCountExpr = importChecked(Err,
T->getSampleCountExpr());
2062 return std::move(Err);
2064 return Importer.getToContext().getHLSLAttributedResourceType(
2065 ToWrappedType, ToContainedType, ToAttrs);
2068ExpectedType clang::ASTNodeImporter::VisitHLSLInlineSpirvType(
2069 const clang::HLSLInlineSpirvType *
T) {
2070 Error Err = Error::success();
2074 uint32_t ToAlignment =
T->getAlignment();
2076 llvm::SmallVector<SpirvOperand> ToOperands;
2078 for (
auto &Operand :
T->getOperands()) {
2079 using SpirvOperandKind = SpirvOperand::SpirvOperandKind;
2082 case SpirvOperandKind::ConstantId:
2083 ToOperands.push_back(SpirvOperand::createConstant(
2084 importChecked(Err,
Operand.getResultType()),
Operand.getValue()));
2086 case SpirvOperandKind::Literal:
2087 ToOperands.push_back(SpirvOperand::createLiteral(
Operand.getValue()));
2089 case SpirvOperandKind::TypeId:
2090 ToOperands.push_back(SpirvOperand::createType(
2091 importChecked(Err,
Operand.getResultType())));
2094 llvm_unreachable(
"Invalid SpirvOperand kind");
2098 return std::move(Err);
2101 return Importer.getToContext().getHLSLInlineSpirvType(
2102 ToOpcode, ToSize, ToAlignment, ToOperands);
2105ExpectedType clang::ASTNodeImporter::VisitConstantMatrixType(
2106 const clang::ConstantMatrixType *
T) {
2107 ExpectedType ToElementTypeOrErr =
import(
T->getElementType());
2108 if (!ToElementTypeOrErr)
2109 return ToElementTypeOrErr.takeError();
2111 return Importer.getToContext().getConstantMatrixType(
2112 *ToElementTypeOrErr,
T->getNumRows(),
T->getNumColumns());
2115ExpectedType clang::ASTNodeImporter::VisitDependentAddressSpaceType(
2116 const clang::DependentAddressSpaceType *
T) {
2117 Error Err = Error::success();
2119 Expr *ToAddrSpaceExpr = importChecked(Err,
T->getAddrSpaceExpr());
2120 SourceLocation ToAttrLoc = importChecked(Err,
T->getAttributeLoc());
2122 return std::move(Err);
2124 return Importer.getToContext().getDependentAddressSpaceType(
2125 ToPointeeType, ToAddrSpaceExpr, ToAttrLoc);
2128ExpectedType clang::ASTNodeImporter::VisitDependentBitIntType(
2129 const clang::DependentBitIntType *
T) {
2130 ExpectedExpr ToNumBitsExprOrErr =
import(
T->getNumBitsExpr());
2131 if (!ToNumBitsExprOrErr)
2132 return ToNumBitsExprOrErr.takeError();
2133 return Importer.getToContext().getDependentBitIntType(
T->isUnsigned(),
2134 *ToNumBitsExprOrErr);
2137ExpectedType clang::ASTNodeImporter::VisitPredefinedSugarType(
2138 const clang::PredefinedSugarType *
T) {
2139 return Importer.getToContext().getPredefinedSugarType(
T->getKind());
2142ExpectedType clang::ASTNodeImporter::VisitDependentSizedMatrixType(
2143 const clang::DependentSizedMatrixType *
T) {
2144 Error Err = Error::success();
2145 QualType ToElementType = importChecked(Err,
T->getElementType());
2146 Expr *ToRowExpr = importChecked(Err,
T->getRowExpr());
2147 Expr *ToColumnExpr = importChecked(Err,
T->getColumnExpr());
2148 SourceLocation ToAttrLoc = importChecked(Err,
T->getAttributeLoc());
2150 return std::move(Err);
2152 return Importer.getToContext().getDependentSizedMatrixType(
2153 ToElementType, ToRowExpr, ToColumnExpr, ToAttrLoc);
2156ExpectedType clang::ASTNodeImporter::VisitDependentVectorType(
2157 const clang::DependentVectorType *
T) {
2158 Error Err = Error::success();
2159 QualType ToElementType = importChecked(Err,
T->getElementType());
2160 Expr *ToSizeExpr = importChecked(Err,
T->getSizeExpr());
2161 SourceLocation ToAttrLoc = importChecked(Err,
T->getAttributeLoc());
2163 return std::move(Err);
2165 return Importer.getToContext().getDependentVectorType(
2166 ToElementType, ToSizeExpr, ToAttrLoc,
T->getVectorKind());
2169ExpectedType clang::ASTNodeImporter::VisitObjCTypeParamType(
2170 const clang::ObjCTypeParamType *
T) {
2171 Expected<ObjCTypeParamDecl *> ToDeclOrErr =
import(
T->getDecl());
2173 return ToDeclOrErr.takeError();
2175 SmallVector<ObjCProtocolDecl *, 4> ToProtocols;
2176 for (ObjCProtocolDecl *FromProtocol :
T->getProtocols()) {
2177 Expected<ObjCProtocolDecl *> ToProtocolOrErr =
import(FromProtocol);
2178 if (!ToProtocolOrErr)
2179 return ToProtocolOrErr.takeError();
2180 ToProtocols.push_back(*ToProtocolOrErr);
2183 return Importer.getToContext().getObjCTypeParamType(*ToDeclOrErr,
2187ExpectedType clang::ASTNodeImporter::VisitPipeType(
const clang::PipeType *
T) {
2188 ExpectedType ToElementTypeOrErr =
import(
T->getElementType());
2189 if (!ToElementTypeOrErr)
2190 return ToElementTypeOrErr.takeError();
2192 ASTContext &ToCtx = Importer.getToContext();
2193 if (
T->isReadOnly())
2213 if (
isa<RecordDecl>(D) && (FunDecl = dyn_cast<FunctionDecl>(OrigDC)) &&
2215 auto getLeafPointeeType = [](
const Type *
T) {
2216 while (
T->isPointerType() ||
T->isArrayType()) {
2217 T =
T->getPointeeOrArrayElementType();
2223 getLeafPointeeType(
P->getType().getCanonicalType().getTypePtr());
2224 auto *RT = dyn_cast<RecordType>(LeafT);
2225 if (RT && RT->getDecl() == D) {
2226 Importer.FromDiag(D->
getLocation(), diag::err_unsupported_ast_node)
2245 ToD = cast_or_null<NamedDecl>(Importer.GetAlreadyImportedOrNull(D));
2250 return Error::success();
2264 ToD = cast_or_null<NamedDecl>(Importer.GetAlreadyImportedOrNull(D));
2269 return Error::success();
2274 return Error::success();
2280 if (
RecordDecl *FromRecord = dyn_cast<RecordDecl>(FromD)) {
2282 if (FromRecord->getDefinition() && FromRecord->isCompleteDefinition() &&
2283 !ToRecord->getDefinition()) {
2288 return Error::success();
2291 if (
EnumDecl *FromEnum = dyn_cast<EnumDecl>(FromD)) {
2293 if (FromEnum->getDefinition() && !ToEnum->getDefinition()) {
2298 return Error::success();
2301 return Error::success();
2316 return Error::success();
2322 return ToRangeOrErr.takeError();
2323 return Error::success();
2329 return LocOrErr.takeError();
2330 return Error::success();
2338 return ToTInfoOrErr.takeError();
2339 return Error::success();
2342 llvm_unreachable(
"Unknown name kind.");
2347 if (Importer.isMinimalImport() && !ForceImport) {
2348 auto ToDCOrErr = Importer.ImportContext(FromDC);
2349 return ToDCOrErr.takeError();
2363 auto MightNeedReordering = [](
const Decl *D) {
2368 Error ChildErrors = Error::success();
2369 for (
auto *From : FromDC->
decls()) {
2370 if (!MightNeedReordering(From))
2379 if (!ImportedOrErr) {
2381 ImportedOrErr.takeError());
2384 FieldDecl *FieldFrom = dyn_cast_or_null<FieldDecl>(From);
2385 Decl *ImportedDecl = *ImportedOrErr;
2386 FieldDecl *FieldTo = dyn_cast_or_null<FieldDecl>(ImportedDecl);
2387 if (FieldFrom && FieldTo) {
2417 auto ToDCOrErr = Importer.ImportContext(FromDC);
2419 consumeError(std::move(ChildErrors));
2420 return ToDCOrErr.takeError();
2423 if (
const auto *FromRD = dyn_cast<RecordDecl>(FromDC)) {
2427 for (
auto *D : FromRD->decls()) {
2428 if (!MightNeedReordering(D))
2431 assert(D &&
"DC contains a null decl");
2432 if (
Decl *ToD = Importer.GetAlreadyImportedOrNull(D)) {
2434 assert(ToDC == ToD->getLexicalDeclContext() && ToDC->
containsDecl(ToD));
2446 for (
auto *From : FromDC->
decls()) {
2447 if (MightNeedReordering(From))
2453 ImportedOrErr.takeError());
2473 if (!FromRecordDecl || !ToRecordDecl) {
2474 const RecordType *RecordFrom = FromType->
getAs<RecordType>();
2475 const RecordType *RecordTo = ToType->
getAs<RecordType>();
2477 if (RecordFrom && RecordTo) {
2478 FromRecordDecl = RecordFrom->getDecl();
2479 ToRecordDecl = RecordTo->getDecl();
2483 if (FromRecordDecl && ToRecordDecl) {
2489 return Error::success();
2494 auto ToDCOrErr = Importer.ImportContext(FromD->
getDeclContext());
2496 return ToDCOrErr.takeError();
2500 auto ToLexicalDCOrErr = Importer.ImportContext(
2502 if (!ToLexicalDCOrErr)
2503 return ToLexicalDCOrErr.takeError();
2504 ToLexicalDC = *ToLexicalDCOrErr;
2508 return Error::success();
2514 "Import implicit methods to or from non-definition");
2517 if (FromM->isImplicit()) {
2520 return ToMOrErr.takeError();
2523 return Error::success();
2532 return ToTypedefOrErr.takeError();
2534 return Error::success();
2539 auto DefinitionCompleter = [To]() {
2560 ToCaptures.reserve(FromCXXRD->capture_size());
2561 for (
const auto &FromCapture : FromCXXRD->captures()) {
2562 if (
auto ToCaptureOrErr =
import(FromCapture))
2563 ToCaptures.push_back(*ToCaptureOrErr);
2565 return ToCaptureOrErr.takeError();
2574 DefinitionCompleter();
2578 return Error::success();
2588 if (!Importer.isMinimalImport())
2593 llvm::scope_exit DefinitionCompleterScopeExit(DefinitionCompleter);
2599 auto *ToCXX = dyn_cast<CXXRecordDecl>(To);
2600 auto *FromCXX = dyn_cast<CXXRecordDecl>(From);
2601 if (ToCXX && FromCXX && ToCXX->dataPtr() && FromCXX->dataPtr()) {
2603 struct CXXRecordDecl::DefinitionData &ToData = ToCXX->data();
2604 struct CXXRecordDecl::DefinitionData &FromData = FromCXX->data();
2606 #define FIELD(Name, Width, Merge) \
2607 ToData.Name = FromData.Name;
2608 #include "clang/AST/CXXRecordDeclDefinitionBits.def"
2611 ToCXX->setArgPassingRestrictions(FromCXX->getArgPassingRestrictions());
2614 for (
const auto &Base1 : FromCXX->bases()) {
2617 return TyOrErr.takeError();
2620 if (Base1.isPackExpansion()) {
2621 if (
ExpectedSLoc LocOrErr =
import(Base1.getEllipsisLoc()))
2622 EllipsisLoc = *LocOrErr;
2624 return LocOrErr.takeError();
2632 auto RangeOrErr =
import(Base1.getSourceRange());
2634 return RangeOrErr.takeError();
2636 auto TSIOrErr =
import(Base1.getTypeSourceInfo());
2638 return TSIOrErr.takeError();
2644 Base1.isBaseOfClass(),
2645 Base1.getAccessSpecifierAsWritten(),
2650 ToCXX->setBases(Bases.data(), Bases.size());
2658 return Error::success();
2663 return Error::success();
2667 return Error::success();
2671 return ToInitOrErr.takeError();
2682 return Error::success();
2690 return Error::success();
2699 import(
QualType(Importer.getFromContext().getCanonicalTagType(From)));
2701 return ToTypeOrErr.takeError();
2704 if (!ToPromotionTypeOrErr)
2705 return ToPromotionTypeOrErr.takeError();
2716 return Error::success();
2722 for (
const auto &Arg : FromArgs) {
2723 if (
auto ToOrErr =
import(Arg))
2724 ToArgs.push_back(*ToOrErr);
2726 return ToOrErr.takeError();
2729 return Error::success();
2735 return import(From);
2738template <
typename InContainerTy>
2741 for (
const auto &FromLoc : Container) {
2742 if (
auto ToLocOrErr =
import(FromLoc))
2745 return ToLocOrErr.takeError();
2747 return Error::success();
2757 bool IgnoreTemplateParmDepth) {
2760 Decl *ToOrigin = Importer.GetOriginalDecl(To);
2766 Importer.getToContext().getLangOpts(), Importer.getFromContext(),
2767 Importer.getToContext(), Importer.getNonEquivalentDecls(),
2769 false, Complain,
false,
2770 IgnoreTemplateParmDepth);
2775 Importer.FromDiag(D->
getLocation(), diag::err_unsupported_ast_node)
2781 Importer.FromDiag(D->
getLocation(), diag::err_unsupported_ast_node)
2790 return std::move(Err);
2795 return LocOrErr.takeError();
2798 if (GetImportedOrCreateDecl(ToD, D, Importer.getToContext(), DC, *LocOrErr))
2810 Importer.MapImported(D, ToD);
2816 Error Err = Error::success();
2821 return std::move(Err);
2825 return DCOrErr.takeError();
2829 if (GetImportedOrCreateDecl(ToD, D, Importer.getToContext(), DC, ToAsmString,
2830 ToAsmLoc, ToRParenLoc))
2845 return std::move(Err);
2850 if (GetImportedOrCreateDecl(ToD, D, Importer.getToContext(), DC, Loc,
2854 Error Err = Error::success();
2860 return std::move(Err);
2864 addDeclToContexts(D, ToD);
2872 return LocOrErr.takeError();
2875 return ColonLocOrErr.takeError();
2880 return DCOrErr.takeError();
2884 if (GetImportedOrCreateDecl(ToD, D, Importer.getToContext(), D->
getAccess(),
2885 DC, *LocOrErr, *ColonLocOrErr))
2899 return DCOrErr.takeError();
2903 Error Err = Error::success();
2909 return std::move(Err);
2912 if (GetImportedOrCreateDecl(
2913 ToD, D, Importer.getToContext(), DC, ToLocation, ToAssertExpr, ToMessage,
2926 return DCOrErr.takeError();
2930 Error Err = Error::success();
2936 return std::move(Err);
2939 if (GetImportedOrCreateDecl(ToD, D, Importer.getToContext(), DC, ToLocation,
2957 return std::move(Err);
2966 if (
auto *TU = dyn_cast<TranslationUnitDecl>(EnclosingDC))
2969 MergeWithNamespace =
2973 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
2974 for (
auto *FoundDecl : FoundDecls) {
2978 if (
auto *FoundNS = dyn_cast<NamespaceDecl>(FoundDecl)) {
2979 MergeWithNamespace = FoundNS;
2980 ConflictingDecls.clear();
2984 ConflictingDecls.push_back(FoundDecl);
2987 if (!ConflictingDecls.empty()) {
2990 ConflictingDecls.size());
2992 Name = NameOrErr.get();
2994 return NameOrErr.takeError();
3000 return BeginLocOrErr.takeError();
3002 if (!RBraceLocOrErr)
3003 return RBraceLocOrErr.takeError();
3008 if (GetImportedOrCreateDecl(ToNamespace, D, Importer.getToContext(), DC,
3009 D->
isInline(), *BeginLocOrErr, Loc,
3020 if (
auto *TU = dyn_cast<TranslationUnitDecl>(DC))
3021 TU->setAnonymousNamespace(ToNamespace);
3026 Importer.MapImported(D, ToNamespace);
3029 return std::move(Err);
3041 return std::move(Err);
3047 Error Err = Error::success();
3054 return std::move(Err);
3059 if (GetImportedOrCreateDecl(
3060 ToD, D, Importer.getToContext(), DC, ToNamespaceLoc, ToAliasLoc,
3061 ToIdentifier, ToQualifierLoc, ToTargetNameLoc, ToNamespace))
3079 return std::move(Err);
3086 cast_or_null<DeclContext>(Importer.GetAlreadyImportedOrNull(
3098 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
3099 for (
auto *FoundDecl : FoundDecls) {
3100 if (!FoundDecl->isInIdentifierNamespace(IDNS))
3102 if (
auto *FoundTypedef = dyn_cast<TypedefNameDecl>(FoundDecl)) {
3107 QualType FoundUT = FoundTypedef->getUnderlyingType();
3108 if (Importer.IsStructurallyEquivalent(FromUT, FoundUT)) {
3121 if (FromR && FoundR &&
3128 return Importer.MapImported(D, FoundTypedef);
3132 ConflictingDecls.push_back(FoundDecl);
3137 if (!ConflictingDecls.empty()) {
3139 Name, DC, IDNS, ConflictingDecls.data(), ConflictingDecls.size());
3141 Name = NameOrErr.get();
3143 return NameOrErr.takeError();
3147 Error Err = Error::success();
3152 return std::move(Err);
3159 if (GetImportedOrCreateDecl<TypeAliasDecl>(
3160 ToTypedef, D, Importer.getToContext(), DC, ToBeginLoc, Loc,
3163 }
else if (GetImportedOrCreateDecl<TypedefDecl>(
3164 ToTypedef, D, Importer.getToContext(), DC, ToBeginLoc, Loc,
3170 return std::move(Err);
3174 Importer.AddToLookupTable(ToTypedef);
3202 return std::move(Err);
3212 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
3213 for (
auto *FoundDecl : FoundDecls) {
3214 if (!FoundDecl->isInIdentifierNamespace(IDNS))
3216 if (
auto *FoundAlias = dyn_cast<TypeAliasTemplateDecl>(FoundDecl)) {
3218 return Importer.MapImported(D, FoundAlias);
3219 ConflictingDecls.push_back(FoundDecl);
3223 if (!ConflictingDecls.empty()) {
3225 Name, DC, IDNS, ConflictingDecls.data(), ConflictingDecls.size());
3227 Name = NameOrErr.get();
3229 return NameOrErr.takeError();
3233 Error Err = Error::success();
3237 return std::move(Err);
3240 if (GetImportedOrCreateDecl(ToAlias, D, Importer.getToContext(), DC, Loc,
3241 Name, ToTemplateParameters, ToTemplatedDecl))
3244 ToTemplatedDecl->setDescribedAliasTemplate(ToAlias);
3249 if (DC != Importer.getToContext().getTranslationUnitDecl())
3250 updateLookupTableForTemplateParameters(*ToTemplateParameters);
3261 return std::move(Err);
3271 return BeginLocOrErr.takeError();
3272 if (GetImportedOrCreateDecl(ToLabel, D, Importer.getToContext(), DC, Loc,
3277 if (GetImportedOrCreateDecl(ToLabel, D, Importer.getToContext(), DC, Loc,
3285 return ToStmtOrErr.takeError();
3287 ToLabel->
setStmt(*ToStmtOrErr);
3300 return std::move(Err);
3310 return std::move(Err);
3312 }
else if (Importer.getToContext().getLangOpts().CPlusPlus)
3320 Importer.findDeclsInToCtx(DC, SearchName);
3321 for (
auto *FoundDecl : FoundDecls) {
3322 if (!FoundDecl->isInIdentifierNamespace(IDNS))
3325 if (
auto *
Typedef = dyn_cast<TypedefNameDecl>(FoundDecl)) {
3326 if (
const auto *Tag =
Typedef->getUnderlyingType()->getAs<TagType>())
3327 FoundDecl = Tag->getDecl();
3330 if (
auto *FoundEnum = dyn_cast<EnumDecl>(FoundDecl)) {
3336 return Importer.MapImported(D, FoundDef);
3340 ConflictingDecls.push_back(FoundDecl);
3349 if (SearchName && !ConflictingDecls.empty()) {
3351 SearchName, DC, IDNS, ConflictingDecls.data(),
3352 ConflictingDecls.size());
3354 Name = NameOrErr.get();
3356 return NameOrErr.takeError();
3360 Error Err = Error::success();
3366 return std::move(Err);
3370 if (GetImportedOrCreateDecl(
3371 D2, D, Importer.getToContext(), DC, ToBeginLoc,
3381 addDeclToContexts(D, D2);
3387 D2->setInstantiationOfMemberEnum(*ToInstOrErr, SK);
3389 return ToInstOrErr.takeError();
3390 if (
ExpectedSLoc POIOrErr =
import(MemberInfo->getPointOfInstantiation()))
3393 return POIOrErr.takeError();
3399 return std::move(Err);
3405 bool IsFriendTemplate =
false;
3406 if (
auto *DCXX = dyn_cast<CXXRecordDecl>(D)) {
3408 DCXX->getDescribedClassTemplate() &&
3409 DCXX->getDescribedClassTemplate()->getFriendObjectKind() !=
3419 return std::move(Err);
3429 return std::move(Err);
3431 }
else if (Importer.getToContext().getLangOpts().CPlusPlus)
3436 bool DependentFriend = IsFriendTemplate && IsDependentContext;
3443 Importer.findDeclsInToCtx(DC, SearchName);
3444 if (!FoundDecls.empty()) {
3451 for (
auto *FoundDecl : FoundDecls) {
3452 if (!FoundDecl->isInIdentifierNamespace(IDNS))
3456 if (
auto *
Typedef = dyn_cast<TypedefNameDecl>(
Found)) {
3457 if (
const auto *Tag =
Typedef->getUnderlyingType()->getAs<TagType>())
3458 Found = Tag->getDecl();
3461 if (
auto *FoundRecord = dyn_cast<RecordDecl>(
Found)) {
3483 Importer.MapImported(D, FoundDef);
3484 if (
const auto *DCXX = dyn_cast<CXXRecordDecl>(D)) {
3485 auto *FoundCXX = dyn_cast<CXXRecordDecl>(FoundDef);
3486 assert(FoundCXX &&
"Record type mismatch");
3488 if (!Importer.isMinimalImport())
3492 return std::move(Err);
3499 ConflictingDecls.push_back(FoundDecl);
3503 if (!ConflictingDecls.empty() && SearchName) {
3505 SearchName, DC, IDNS, ConflictingDecls.data(),
3506 ConflictingDecls.size());
3508 Name = NameOrErr.get();
3510 return NameOrErr.takeError();
3516 return BeginLocOrErr.takeError();
3521 if (
auto *DCXX = dyn_cast<CXXRecordDecl>(D)) {
3522 if (DCXX->isLambda()) {
3523 auto TInfoOrErr =
import(DCXX->getLambdaTypeInfo());
3525 return TInfoOrErr.takeError();
3526 if (GetImportedOrCreateSpecialDecl(
3528 DC, *TInfoOrErr, Loc, DCXX->getLambdaDependencyKind(),
3529 DCXX->isGenericLambda(), DCXX->getLambdaCaptureDefault()))
3531 Decl *ContextDecl = DCXX->getLambdaContextDecl();
3534 return CDeclOrErr.takeError();
3535 if (ContextDecl !=
nullptr) {
3540 if (GetImportedOrCreateDecl(D2CXX, D, Importer.getToContext(),
3543 cast_or_null<CXXRecordDecl>(PrevDecl)))
3550 addDeclToContexts(D, D2);
3553 DCXX->getDescribedClassTemplate()) {
3556 return std::move(Err);
3559 DCXX->getMemberSpecializationInfo()) {
3561 MemberInfo->getTemplateSpecializationKind();
3567 return ToInstOrErr.takeError();
3570 import(MemberInfo->getPointOfInstantiation()))
3574 return POIOrErr.takeError();
3578 if (GetImportedOrCreateDecl(D2, D, Importer.getToContext(),
3583 addDeclToContexts(D, D2);
3589 return BraceRangeOrErr.takeError();
3593 return QualifierLocOrErr.takeError();
3600 return std::move(Err);
3612 return std::move(Err);
3621 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
3622 for (
auto *FoundDecl : FoundDecls) {
3623 if (!FoundDecl->isInIdentifierNamespace(IDNS))
3626 if (
auto *FoundEnumConstant = dyn_cast<EnumConstantDecl>(FoundDecl)) {
3628 return Importer.MapImported(D, FoundEnumConstant);
3629 ConflictingDecls.push_back(FoundDecl);
3633 if (!ConflictingDecls.empty()) {
3635 Name, DC, IDNS, ConflictingDecls.data(), ConflictingDecls.size());
3637 Name = NameOrErr.get();
3639 return NameOrErr.takeError();
3645 return TypeOrErr.takeError();
3649 return InitOrErr.takeError();
3652 if (GetImportedOrCreateDecl(
3653 ToEnumerator, D, Importer.getToContext(),
cast<EnumDecl>(DC), Loc,
3655 return ToEnumerator;
3660 return ToEnumerator;
3663template <
typename DeclTy>
3667 FromD->getTemplateParameterLists();
3668 if (FromTPLs.empty())
3669 return Error::success();
3671 for (
unsigned int I = 0; I < FromTPLs.size(); ++I)
3673 ToTPLists[I] = *ToTPListOrErr;
3675 return ToTPListOrErr.takeError();
3676 ToD->setTemplateParameterListsInfo(Importer.ToContext, ToTPLists);
3677 return Error::success();
3685 return Error::success();
3691 return Error::success();
3697 ToFD->setInstantiationOfMemberFunction(*InstFDOrErr, TSK);
3699 return InstFDOrErr.takeError();
3705 return POIOrErr.takeError();
3707 return Error::success();
3711 auto FunctionAndArgsOrErr =
3713 if (!FunctionAndArgsOrErr)
3714 return FunctionAndArgsOrErr.takeError();
3717 Importer.getToContext(), std::get<1>(*FunctionAndArgsOrErr));
3721 const auto *FromTAArgsAsWritten = FTSInfo->TemplateArgumentsAsWritten;
3722 if (FromTAArgsAsWritten)
3724 *FromTAArgsAsWritten, ToTAInfo))
3727 ExpectedSLoc POIOrErr =
import(FTSInfo->getPointOfInstantiation());
3729 return POIOrErr.takeError();
3735 ToFD->setFunctionTemplateSpecialization(
3736 std::get<0>(*FunctionAndArgsOrErr), ToTAList, {}, TSK,
3737 FromTAArgsAsWritten ? &ToTAInfo :
nullptr, *POIOrErr);
3738 return Error::success();
3746 Candidates.
addDecl(*ToFTDOrErr);
3748 return ToFTDOrErr.takeError();
3753 const auto *FromTAArgsAsWritten = FromInfo->TemplateArgumentsAsWritten;
3754 if (FromTAArgsAsWritten)
3760 Importer.getToContext(), Candidates,
3761 FromTAArgsAsWritten ? &ToTAInfo :
nullptr);
3762 return Error::success();
3765 llvm_unreachable(
"All cases should be covered!");
3770 auto FunctionAndArgsOrErr =
3772 if (!FunctionAndArgsOrErr)
3773 return FunctionAndArgsOrErr.takeError();
3777 std::tie(
Template, ToTemplArgs) = *FunctionAndArgsOrErr;
3778 llvm::FoldingSetInsertToken InsertToken;
3779 auto *FoundSpec =
Template->findSpecialization(ToTemplArgs, InsertToken);
3789 return ToBodyOrErr.takeError();
3791 return Error::success();
3798 ExplicitExpr = importChecked(Err, ESpec.
getExpr());
3805 auto RedeclIt = Redecls.begin();
3808 for (; RedeclIt != Redecls.end() && *RedeclIt != D; ++RedeclIt) {
3811 return ToRedeclOrErr.takeError();
3813 assert(*RedeclIt == D);
3821 return std::move(Err);
3836 if (!FoundFunctionOrErr)
3837 return FoundFunctionOrErr.takeError();
3838 if (
FunctionDecl *FoundFunction = *FoundFunctionOrErr) {
3839 if (
Decl *Def = FindAndMapDefinition(D, FoundFunction))
3841 FoundByLookup = FoundFunction;
3849 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
3850 for (
auto *FoundDecl : FoundDecls) {
3851 if (!FoundDecl->isInIdentifierNamespace(IDNS))
3854 if (
auto *FoundFunction = dyn_cast<FunctionDecl>(FoundDecl)) {
3859 if (
Decl *Def = FindAndMapDefinition(D, FoundFunction))
3861 FoundByLookup = FoundFunction;
3868 if (Importer.getToContext().getLangOpts().CPlusPlus)
3872 Importer.ToDiag(Loc, diag::warn_odr_function_type_inconsistent)
3873 << Name << D->
getType() << FoundFunction->getType();
3874 Importer.ToDiag(FoundFunction->getLocation(), diag::note_odr_value_here)
3875 << FoundFunction->getType();
3876 ConflictingDecls.push_back(FoundDecl);
3880 if (!ConflictingDecls.empty()) {
3882 Name, DC, IDNS, ConflictingDecls.data(), ConflictingDecls.size());
3884 Name = NameOrErr.get();
3886 return NameOrErr.takeError();
3896 if (FoundByLookup) {
3906 "Templated function mapped to non-templated?");
3907 Importer.MapImported(DescribedD,
3910 return Importer.MapImported(D, FoundByLookup);
3922 return std::move(Err);
3933 bool UsedDifferentProtoType =
false;
3935 QualType FromReturnTy = FromFPT->getReturnType();
3943 if (Importer.FindFunctionDeclImportCycle.isCycle(D)) {
3944 FromReturnTy = Importer.getFromContext().VoidTy;
3945 UsedDifferentProtoType =
true;
3956 FromEPI = DefaultEPI;
3957 UsedDifferentProtoType =
true;
3959 FromTy = Importer.getFromContext().getFunctionType(
3960 FromReturnTy, FromFPT->getParamTypes(), FromEPI);
3961 FromTSI = Importer.getFromContext().getTrivialTypeSourceInfo(
3965 Error Err = Error::success();
3966 auto ScopedReturnTypeDeclCycleDetector =
3967 Importer.FindFunctionDeclImportCycle.makeScopedCycleDetection(D);
3978 return std::move(Err);
3984 Parameters.push_back(*ToPOrErr);
3986 return ToPOrErr.takeError();
3991 if (
auto *FromConstructor = dyn_cast<CXXConstructorDecl>(D)) {
3993 importExplicitSpecifier(Err, FromConstructor->getExplicitSpecifier());
3995 return std::move(Err);
3997 if (FromConstructor->isInheritingConstructor()) {
3999 import(FromConstructor->getInheritedConstructor());
4000 if (!ImportedInheritedCtor)
4001 return ImportedInheritedCtor.takeError();
4002 ToInheritedConstructor = *ImportedInheritedCtor;
4004 if (GetImportedOrCreateDecl<CXXConstructorDecl>(
4006 ToInnerLocStart, NameInfo,
T, TInfo, ESpec, D->
UsesFPIntrin(),
4008 ToInheritedConstructor, TrailingRequiresClause))
4012 Error Err = Error::success();
4014 Err,
const_cast<FunctionDecl *
>(FromDtor->getOperatorDelete()));
4015 auto ToThisArg =
importChecked(Err, FromDtor->getOperatorDeleteThisArg());
4017 return std::move(Err);
4019 if (GetImportedOrCreateDecl<CXXDestructorDecl>(
4023 TrailingRequiresClause))
4030 dyn_cast<CXXConversionDecl>(D)) {
4032 importExplicitSpecifier(Err, FromConversion->getExplicitSpecifier());
4034 return std::move(Err);
4035 if (GetImportedOrCreateDecl<CXXConversionDecl>(
4041 }
else if (
auto *
Method = dyn_cast<CXXMethodDecl>(D)) {
4042 if (GetImportedOrCreateDecl<CXXMethodDecl>(
4044 ToInnerLocStart, NameInfo,
T, TInfo,
Method->getStorageClass(),
4048 }
else if (
auto *Guide = dyn_cast<CXXDeductionGuideDecl>(D)) {
4050 importExplicitSpecifier(Err, Guide->getExplicitSpecifier());
4056 return std::move(Err);
4057 if (GetImportedOrCreateDecl<CXXDeductionGuideDecl>(
4058 ToFunction, D, Importer.getToContext(), DC, ToInnerLocStart, ESpec,
4059 NameInfo,
T, TInfo, ToEndLoc, Ctor,
4060 Guide->getDeductionCandidateKind(), TrailingRequiresClause,
4064 if (GetImportedOrCreateDecl(
4065 ToFunction, D, Importer.getToContext(), DC, ToInnerLocStart,
4073 if (FoundByLookup) {
4123 Importer.getToContext(), Lookups, Info->getFPFeatures(), Msg));
4127 for (
auto *Param : Parameters) {
4128 Param->setOwningFunction(ToFunction);
4131 LT->update(Param, Importer.getToContext().getTranslationUnitDecl());
4133 ToFunction->setParams(Parameters);
4140 for (
unsigned I = 0, N = Parameters.size(); I != N; ++I)
4141 ProtoLoc.setParam(I, Parameters[I]);
4147 auto ToFTOrErr =
import(FromFT);
4149 return ToFTOrErr.takeError();
4153 if (
auto *FromConstructor = dyn_cast<CXXConstructorDecl>(D)) {
4154 if (
unsigned NumInitializers = FromConstructor->getNumCtorInitializers()) {
4158 FromConstructor->inits(), CtorInitializers))
4159 return std::move(Err);
4162 llvm::copy(CtorInitializers, Memory);
4164 ToCtor->setCtorInitializers(Memory);
4165 ToCtor->setNumCtorInitializers(NumInitializers);
4171 return std::move(Err);
4173 if (
auto *FromCXXMethod = dyn_cast<CXXMethodDecl>(D))
4176 return std::move(Err);
4182 return std::move(Err);
4186 if (UsedDifferentProtoType) {
4188 ToFunction->
setType(*TyOrErr);
4190 return TyOrErr.takeError();
4194 return TSIOrErr.takeError();
4199 addDeclToContexts(D, ToFunction);
4202 for (++RedeclIt; RedeclIt != Redecls.end(); ++RedeclIt) {
4205 return ToRedeclOrErr.takeError();
4239 return std::move(Err);
4244 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
4245 for (
auto *FoundDecl : FoundDecls) {
4246 if (
FieldDecl *FoundField = dyn_cast<FieldDecl>(FoundDecl)) {
4253 if (Importer.IsStructurallyEquivalent(D->
getType(),
4254 FoundField->getType())) {
4255 Importer.MapImported(D, FoundField);
4263 if (
ExpectedExpr ToInitializerOrErr =
import(FromInitializer)) {
4266 assert(FoundField->hasInClassInitializer() &&
4267 "Field should have an in-class initializer if it has an "
4268 "expression for it.");
4269 if (!FoundField->getInClassInitializer())
4270 FoundField->setInClassInitializer(*ToInitializerOrErr);
4272 return ToInitializerOrErr.takeError();
4279 Importer.ToDiag(Loc, diag::warn_odr_field_type_inconsistent)
4280 << Name << D->
getType() << FoundField->getType();
4281 Importer.ToDiag(FoundField->getLocation(), diag::note_odr_value_here)
4282 << FoundField->getType();
4288 Error Err = Error::success();
4294 return std::move(Err);
4295 const Type *ToCapturedVLAType =
nullptr;
4296 if (
Error Err = Importer.importInto(
4298 return std::move(Err);
4301 if (GetImportedOrCreateDecl(ToField, D, Importer.getToContext(), DC,
4303 ToType, ToTInfo, ToBitWidth, D->
isMutable(),
4310 if (ToCapturedVLAType)
4317 return std::move(Err);
4318 if (ToInitializer) {
4320 if (AlreadyImported)
4321 assert(ToInitializer == AlreadyImported &&
4322 "Duplicate import of in-class initializer.");
4337 return std::move(Err);
4342 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
4343 for (
unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
4344 if (
auto *FoundField = dyn_cast<IndirectFieldDecl>(FoundDecls[I])) {
4351 if (Importer.IsStructurallyEquivalent(D->
getType(),
4352 FoundField->getType(),
4354 Importer.MapImported(D, FoundField);
4359 if (!Name && I < N-1)
4363 Importer.ToDiag(Loc, diag::warn_odr_field_type_inconsistent)
4364 << Name << D->
getType() << FoundField->getType();
4365 Importer.ToDiag(FoundField->getLocation(), diag::note_odr_value_here)
4366 << FoundField->getType();
4373 auto TypeOrErr =
import(D->
getType());
4375 return TypeOrErr.takeError();
4381 for (
auto *PI : D->
chain())
4383 NamedChain[i++] = *ToD;
4385 return ToD.takeError();
4389 if (GetImportedOrCreateDecl(ToIndirectField, D, Importer.getToContext(), DC,
4392 return ToIndirectField;
4397 return ToIndirectField;
4424 unsigned int FriendCount = 0;
4428 for (
FriendDecl *FoundFriend : RD->friends()) {
4429 if (FoundFriend == FD) {
4430 FriendPosition = FriendCount;
4437 assert(FriendPosition &&
"Friend decl not found in own parent.");
4438 return {FriendCount, *FriendPosition};
4441Expected<FriendDecl::FriendUnion>
4442ASTNodeImporter::importFriendUnion(FriendDecl *D) {
4444 NamedDecl *ToFriendD;
4446 return std::move(Err);
4459 return TSIOrErr.takeError();
4466 return std::move(Err);
4473 for (
FriendDecl *ImportedFriend : RD->friends())
4475 ImportedEquivalentFriends.push_back(ImportedFriend);
4480 assert(ImportedEquivalentFriends.size() <= CountAndPosition.
TotalCount &&
4481 "Class with non-matching friends is imported, ODR check wrong?");
4482 if (ImportedEquivalentFriends.size() == CountAndPosition.
TotalCount)
4483 return Importer.MapImported(
4484 D, ImportedEquivalentFriends[CountAndPosition.
IndexOfDecl]);
4488 auto ToFUOrErr = importFriendUnion(D);
4490 return ToFUOrErr.takeError();
4495 return LocationOrErr.takeError();
4497 if (!FriendLocOrErr)
4498 return FriendLocOrErr.takeError();
4500 if (!EllipsisLocOrErr)
4501 return EllipsisLocOrErr.takeError();
4504 if (GetImportedOrCreateDecl(FrD, D, Importer.getToContext(), DC,
4505 *LocationOrErr, ToFU, *FriendLocOrErr,
4518 return std::move(Err);
4522 for (
FriendDecl *ImportedFriend : RD->friends()) {
4523 auto *ImportedFriendTemplate = dyn_cast<FriendTemplateDecl>(ImportedFriend);
4524 if (ImportedFriendTemplate &&
4526 ImportedEquivalentFriends.push_back(ImportedFriendTemplate);
4531 assert(ImportedEquivalentFriends.size() <= CountAndPosition.
TotalCount &&
4532 "Class with non-matching friends is imported, ODR check wrong?");
4534 if (ImportedEquivalentFriends.size() == CountAndPosition.
TotalCount)
4535 return Importer.MapImported(
4536 D, ImportedEquivalentFriends[CountAndPosition.
IndexOfDecl]);
4541 auto ToFUOrErr = importFriendUnion(D);
4543 return ToFUOrErr.takeError();
4549 if (!FromTemplate.
isNull()) {
4551 return std::move(Err);
4557 return std::move(Err);
4561 return LocationOrErr.takeError();
4564 if (!FriendLocOrErr)
4565 return FriendLocOrErr.takeError();
4568 if (!EllipsisLocOrErr)
4569 return EllipsisLocOrErr.takeError();
4572 if (GetImportedOrCreateDecl(FTD, D, Importer.getToContext(), DC,
4573 *LocationOrErr, ToFU, *FriendLocOrErr, ToTPLs,
4574 *EllipsisLocOrErr, ToTemplate))
4590 return std::move(Err);
4595 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
4596 for (
auto *FoundDecl : FoundDecls) {
4597 if (
ObjCIvarDecl *FoundIvar = dyn_cast<ObjCIvarDecl>(FoundDecl)) {
4598 if (Importer.IsStructurallyEquivalent(D->
getType(),
4599 FoundIvar->getType())) {
4600 Importer.MapImported(D, FoundIvar);
4604 Importer.ToDiag(Loc, diag::warn_odr_ivar_type_inconsistent)
4605 << Name << D->
getType() << FoundIvar->getType();
4606 Importer.ToDiag(FoundIvar->getLocation(), diag::note_odr_value_here)
4607 << FoundIvar->getType();
4613 Error Err = Error::success();
4619 return std::move(Err);
4622 if (GetImportedOrCreateDecl(
4625 ToType, ToTypeSourceInfo,
4637 auto RedeclIt = Redecls.begin();
4640 for (; RedeclIt != Redecls.end() && *RedeclIt != D; ++RedeclIt) {
4643 return RedeclOrErr.takeError();
4645 assert(*RedeclIt == D);
4653 return std::move(Err);
4659 VarDecl *FoundByLookup =
nullptr;
4663 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
4664 for (
auto *FoundDecl : FoundDecls) {
4665 if (!FoundDecl->isInIdentifierNamespace(IDNS))
4668 if (
auto *FoundVar = dyn_cast<VarDecl>(FoundDecl)) {
4671 if (Importer.IsStructurallyEquivalent(D->
getType(),
4672 FoundVar->getType())) {
4680 return Importer.MapImported(D, FoundDef);
4684 const VarDecl *FoundDInit =
nullptr;
4685 if (D->
getInit() && FoundVar->getAnyInitializer(FoundDInit))
4687 return Importer.MapImported(D,
const_cast<VarDecl*
>(FoundDInit));
4689 FoundByLookup = FoundVar;
4694 = Importer.getToContext().getAsArrayType(FoundVar->getType());
4696 = Importer.getToContext().getAsArrayType(D->
getType());
4697 if (FoundArray && TArray) {
4701 if (
auto TyOrErr =
import(D->
getType()))
4702 FoundVar->setType(*TyOrErr);
4704 return TyOrErr.takeError();
4706 FoundByLookup = FoundVar;
4710 FoundByLookup = FoundVar;
4715 Importer.ToDiag(Loc, diag::warn_odr_variable_type_inconsistent)
4716 << Name << D->
getType() << FoundVar->getType();
4717 Importer.ToDiag(FoundVar->getLocation(), diag::note_odr_value_here)
4718 << FoundVar->getType();
4719 ConflictingDecls.push_back(FoundDecl);
4723 if (!ConflictingDecls.empty()) {
4725 Name, DC, IDNS, ConflictingDecls.data(), ConflictingDecls.size());
4727 Name = NameOrErr.get();
4729 return NameOrErr.takeError();
4733 Error Err = Error::success();
4739 return std::move(Err);
4742 if (
auto *FromDecomp = dyn_cast<DecompositionDecl>(D)) {
4746 return std::move(Err);
4748 if (GetImportedOrCreateDecl(
4749 ToDecomp, FromDecomp, Importer.getToContext(), DC, ToInnerLocStart,
4750 Loc, FromDecomp->getRSquareLoc(), ToType, ToTypeSourceInfo,
4756 if (GetImportedOrCreateDecl(ToVar, D, Importer.getToContext(), DC,
4757 ToInnerLocStart, Loc,
4772 if (FoundByLookup) {
4781 return ToVTOrErr.takeError();
4788 return ToInstOrErr.takeError();
4789 if (
ExpectedSLoc POIOrErr =
import(MSI->getPointOfInstantiation()))
4792 return POIOrErr.takeError();
4796 return std::move(Err);
4801 addDeclToContexts(D, ToVar);
4804 for (++RedeclIt; RedeclIt != Redecls.end(); ++RedeclIt) {
4807 return RedeclOrErr.takeError();
4816 DeclContext *DC = Importer.getToContext().getTranslationUnitDecl();
4818 Error Err = Error::success();
4823 return std::move(Err);
4827 if (GetImportedOrCreateDecl(ToParm, D, Importer.getToContext(), DC,
4828 ToLocation, ToDeclName.getAsIdentifierInfo(),
4840 return LocOrErr.takeError();
4849 return ToDefArgOrErr.takeError();
4853 if (
auto ToDefArgOrErr =
import(FromParam->
getDefaultArg()))
4856 return ToDefArgOrErr.takeError();
4859 return Error::success();
4864 Error Err = Error::success();
4869 return std::move(Err);
4876 DeclContext *DC = Importer.getToContext().getTranslationUnitDecl();
4878 Error Err = Error::success();
4885 return std::move(Err);
4888 if (GetImportedOrCreateDecl(ToParm, D, Importer.getToContext(), DC,
4889 ToInnerLocStart, ToLocation,
4890 ToDeclName.getAsIdentifierInfo(), ToType,
4899 return std::move(Err);
4919 return std::move(Err);
4923 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
4924 for (
auto *FoundDecl : FoundDecls) {
4925 if (
auto *FoundMethod = dyn_cast<ObjCMethodDecl>(FoundDecl)) {
4931 FoundMethod->getReturnType())) {
4932 Importer.ToDiag(Loc, diag::warn_odr_objc_method_result_type_inconsistent)
4934 << FoundMethod->getReturnType();
4935 Importer.ToDiag(FoundMethod->getLocation(),
4936 diag::note_odr_objc_method_here)
4943 if (D->
param_size() != FoundMethod->param_size()) {
4944 Importer.ToDiag(Loc, diag::warn_odr_objc_method_num_params_inconsistent)
4946 << D->
param_size() << FoundMethod->param_size();
4947 Importer.ToDiag(FoundMethod->getLocation(),
4948 diag::note_odr_objc_method_here)
4956 PEnd = D->
param_end(), FoundP = FoundMethod->param_begin();
4957 P != PEnd; ++
P, ++FoundP) {
4958 if (!Importer.IsStructurallyEquivalent((*P)->getType(),
4959 (*FoundP)->getType())) {
4960 Importer.FromDiag((*P)->getLocation(),
4961 diag::warn_odr_objc_method_param_type_inconsistent)
4963 << (*P)->getType() << (*FoundP)->getType();
4964 Importer.ToDiag((*FoundP)->getLocation(), diag::note_odr_value_here)
4965 << (*FoundP)->getType();
4973 if (D->
isVariadic() != FoundMethod->isVariadic()) {
4974 Importer.ToDiag(Loc, diag::warn_odr_objc_method_variadic_inconsistent)
4976 Importer.ToDiag(FoundMethod->getLocation(),
4977 diag::note_odr_objc_method_here)
4984 return Importer.MapImported(D, FoundMethod);
4988 Error Err = Error::success();
4991 auto ToReturnTypeSourceInfo =
4994 return std::move(Err);
4997 if (GetImportedOrCreateDecl(
4998 ToMethod, D, Importer.getToContext(), Loc, ToEndLoc,
5012 ToParams.push_back(*ToPOrErr);
5014 return ToPOrErr.takeError();
5018 for (
auto *ToParam : ToParams) {
5019 ToParam->setOwningFunction(ToMethod);
5027 return std::move(Err);
5029 ToMethod->
setMethodParams(Importer.getToContext(), ToParams, ToSelLocs);
5051 return std::move(Err);
5055 Error Err = Error::success();
5061 return std::move(Err);
5064 if (GetImportedOrCreateDecl(
5068 ToColonLoc, ToTypeSourceInfo))
5074 return std::move(Err);
5075 Result->setTypeForDecl(ToTypeForDecl);
5076 Result->setLexicalDeclContext(LexicalDC);
5087 return std::move(Err);
5093 return std::move(Err);
5101 Error Err = Error::success();
5107 return std::move(Err);
5109 if (GetImportedOrCreateDecl(ToCategory, D, Importer.getToContext(), DC,
5125 return PListOrErr.takeError();
5134 FromProto != FromProtoEnd;
5135 ++FromProto, ++FromProtoLoc) {
5137 Protocols.push_back(*ToProtoOrErr);
5139 return ToProtoOrErr.takeError();
5141 if (
ExpectedSLoc ToProtoLocOrErr =
import(*FromProtoLoc))
5142 ProtocolLocs.push_back(*ToProtoLocOrErr);
5144 return ToProtoLocOrErr.takeError();
5149 ProtocolLocs.data(), Importer.getToContext());
5152 Importer.MapImported(D, ToCategory);
5157 return std::move(Err);
5165 return ToImplOrErr.takeError();
5177 return Error::success();
5190 FromProto != FromProtoEnd;
5191 ++FromProto, ++FromProtoLoc) {
5193 Protocols.push_back(*ToProtoOrErr);
5195 return ToProtoOrErr.takeError();
5197 if (
ExpectedSLoc ToProtoLocOrErr =
import(*FromProtoLoc))
5198 ProtocolLocs.push_back(*ToProtoLocOrErr);
5200 return ToProtoLocOrErr.takeError();
5206 ProtocolLocs.data(), Importer.getToContext());
5213 return Error::success();
5223 return Importer.MapImported(D, *ImportedDefOrErr);
5225 return ImportedDefOrErr.takeError();
5234 return std::move(Err);
5239 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
5240 for (
auto *FoundDecl : FoundDecls) {
5244 if ((MergeWithProtocol = dyn_cast<ObjCProtocolDecl>(FoundDecl)))
5251 if (!ToAtBeginLocOrErr)
5252 return ToAtBeginLocOrErr.takeError();
5254 if (GetImportedOrCreateDecl(ToProto, D, Importer.getToContext(), DC,
5263 Importer.MapImported(D, ToProto);
5267 return std::move(Err);
5275 return std::move(Err);
5278 if (!ExternLocOrErr)
5279 return ExternLocOrErr.takeError();
5283 return LangLocOrErr.takeError();
5288 if (GetImportedOrCreateDecl(ToLinkageSpec, D, Importer.getToContext(), DC,
5289 *ExternLocOrErr, *LangLocOrErr,
5291 return ToLinkageSpec;
5295 if (!RBraceLocOrErr)
5296 return RBraceLocOrErr.takeError();
5303 return ToLinkageSpec;
5314 return ToShadowOrErr.takeError();
5325 return std::move(Err);
5329 Error Err = Error::success();
5334 return std::move(Err);
5338 return std::move(Err);
5341 if (GetImportedOrCreateDecl(ToUsing, D, Importer.getToContext(), DC,
5342 ToUsingLoc, ToQualifierLoc, NameInfo,
5350 Importer.getFromContext().getInstantiatedFromUsingDecl(D)) {
5352 Importer.getToContext().setInstantiatedFromUsingDecl(
5353 ToUsing, *ToPatternOrErr);
5355 return ToPatternOrErr.takeError();
5367 return std::move(Err);
5371 Error Err = Error::success();
5377 return std::move(Err);
5380 if (GetImportedOrCreateDecl(ToUsingEnum, D, Importer.getToContext(), DC,
5381 ToUsingLoc, ToEnumLoc, ToNameLoc, ToEnumType))
5388 Importer.getFromContext().getInstantiatedFromUsingEnumDecl(D)) {
5390 Importer.getToContext().setInstantiatedFromUsingEnumDecl(ToUsingEnum,
5393 return ToPatternOrErr.takeError();
5405 return std::move(Err);
5410 if (!ToIntroducerOrErr)
5411 return ToIntroducerOrErr.takeError();
5415 return ToTargetOrErr.takeError();
5418 if (
auto *FromConstructorUsingShadow =
5419 dyn_cast<ConstructorUsingShadowDecl>(D)) {
5420 Error Err = Error::success();
5422 Err, FromConstructorUsingShadow->getNominatedBaseClassShadowDecl());
5424 return std::move(Err);
5430 if (GetImportedOrCreateDecl<ConstructorUsingShadowDecl>(
5431 ToShadow, D, Importer.getToContext(), DC, Loc,
5433 Nominated ? Nominated : *ToTargetOrErr,
5434 FromConstructorUsingShadow->constructsVirtualBase()))
5437 if (GetImportedOrCreateDecl(ToShadow, D, Importer.getToContext(), DC, Loc,
5438 Name, *ToIntroducerOrErr, *ToTargetOrErr))
5446 Importer.getFromContext().getInstantiatedFromUsingShadowDecl(D)) {
5448 Importer.getToContext().setInstantiatedFromUsingShadowDecl(
5449 ToShadow, *ToPatternOrErr);
5453 return ToPatternOrErr.takeError();
5467 return std::move(Err);
5472 if (!ToComAncestorOrErr)
5473 return ToComAncestorOrErr.takeError();
5475 Error Err = Error::success();
5478 auto ToNamespaceKeyLocation =
5483 return std::move(Err);
5486 if (GetImportedOrCreateDecl(ToUsingDir, D, Importer.getToContext(), DC,
5488 ToNamespaceKeyLocation,
5491 ToNominatedNamespace, *ToComAncestorOrErr))
5506 return std::move(Err);
5510 auto ToInstantiatedFromUsingOrErr =
5512 if (!ToInstantiatedFromUsingOrErr)
5513 return ToInstantiatedFromUsingOrErr.takeError();
5516 return std::move(Err);
5519 if (GetImportedOrCreateDecl(ToUsingPack, D, Importer.getToContext(), DC,
5524 addDeclToContexts(D, ToUsingPack);
5536 return std::move(Err);
5540 Error Err = Error::success();
5546 return std::move(Err);
5550 return std::move(Err);
5553 if (GetImportedOrCreateDecl(ToUsingValue, D, Importer.getToContext(), DC,
5554 ToUsingLoc, ToQualifierLoc, NameInfo,
5556 return ToUsingValue;
5562 return ToUsingValue;
5572 return std::move(Err);
5576 Error Err = Error::success();
5582 return std::move(Err);
5585 if (GetImportedOrCreateDecl(ToUsing, D, Importer.getToContext(), DC,
5586 ToUsingLoc, ToTypenameLoc,
5587 ToQualifierLoc, Loc, Name, ToEllipsisLoc))
5598 Decl* ToD =
nullptr;
5600#define BuiltinTemplate(BTName) \
5601 case BuiltinTemplateKind::BTK##BTName: \
5602 ToD = Importer.getToContext().get##BTName##Decl(); \
5604#include "clang/Basic/BuiltinTemplates.inc"
5606 assert(ToD &&
"BuiltinTemplateDecl of unsupported kind!");
5607 Importer.MapImported(D, ToD);
5617 if (
auto FromSuperOrErr =
import(FromSuper))
5618 FromSuper = *FromSuperOrErr;
5620 return FromSuperOrErr.takeError();
5624 if ((
bool)FromSuper != (
bool)ToSuper ||
5627 diag::warn_odr_objc_superclass_inconsistent)
5634 diag::note_odr_objc_missing_superclass);
5637 diag::note_odr_objc_superclass)
5641 diag::note_odr_objc_missing_superclass);
5647 return Error::success();
5658 return SuperTInfoOrErr.takeError();
5669 FromProto != FromProtoEnd;
5670 ++FromProto, ++FromProtoLoc) {
5672 Protocols.push_back(*ToProtoOrErr);
5674 return ToProtoOrErr.takeError();
5676 if (
ExpectedSLoc ToProtoLocOrErr =
import(*FromProtoLoc))
5677 ProtocolLocs.push_back(*ToProtoLocOrErr);
5679 return ToProtoLocOrErr.takeError();
5685 ProtocolLocs.data(), Importer.getToContext());
5690 auto ToCatOrErr =
import(Cat);
5692 return ToCatOrErr.takeError();
5701 return ToImplOrErr.takeError();
5708 return Error::success();
5717 for (
auto *fromTypeParam : *list) {
5718 if (
auto toTypeParamOrErr =
import(fromTypeParam))
5719 toTypeParams.push_back(*toTypeParamOrErr);
5721 return toTypeParamOrErr.takeError();
5725 if (!LAngleLocOrErr)
5726 return LAngleLocOrErr.takeError();
5729 if (!RAngleLocOrErr)
5730 return RAngleLocOrErr.takeError();
5745 return Importer.MapImported(D, *ImportedDefOrErr);
5747 return ImportedDefOrErr.takeError();
5756 return std::move(Err);
5762 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
5763 for (
auto *FoundDecl : FoundDecls) {
5767 if ((MergeWithIface = dyn_cast<ObjCInterfaceDecl>(FoundDecl)))
5775 if (!AtBeginLocOrErr)
5776 return AtBeginLocOrErr.takeError();
5778 if (GetImportedOrCreateDecl(
5779 ToIface, D, Importer.getToContext(), DC,
5787 Importer.MapImported(D, ToIface);
5790 if (
auto ToPListOrErr =
5794 return ToPListOrErr.takeError();
5798 return std::move(Err);
5807 return std::move(Err);
5813 return std::move(Err);
5815 Error Err = Error::success();
5820 return std::move(Err);
5822 if (GetImportedOrCreateDecl(
5823 ToImpl, D, Importer.getToContext(), DC,
5824 Importer.Import(D->
getIdentifier()), Category->getClassInterface(),
5825 ToLocation, ToAtStartLoc, ToCategoryNameLoc))
5830 Category->setImplementation(ToImpl);
5833 Importer.MapImported(D, ToImpl);
5835 return std::move(Err);
5845 return std::move(Err);
5850 return std::move(Err);
5858 return std::move(Err);
5860 Error Err = Error::success();
5867 return std::move(Err);
5869 if (GetImportedOrCreateDecl(Impl, D, Importer.getToContext(),
5878 Impl->setLexicalDeclContext(LexicalDC);
5892 Importer.ToDiag(Impl->getLocation(),
5893 diag::warn_odr_objc_superclass_inconsistent)
5897 if (Impl->getSuperClass())
5898 Importer.ToDiag(Impl->getLocation(),
5899 diag::note_odr_objc_superclass)
5900 << Impl->getSuperClass()->getDeclName();
5902 Importer.ToDiag(Impl->getLocation(),
5903 diag::note_odr_objc_missing_superclass);
5906 diag::note_odr_objc_superclass)
5910 diag::note_odr_objc_missing_superclass);
5918 return std::move(Err);
5930 return std::move(Err);
5935 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
5936 for (
auto *FoundDecl : FoundDecls) {
5937 if (
auto *FoundProp = dyn_cast<ObjCPropertyDecl>(FoundDecl)) {
5944 if (!Importer.IsStructurallyEquivalent(D->
getType(),
5945 FoundProp->getType())) {
5946 Importer.ToDiag(Loc, diag::warn_odr_objc_property_type_inconsistent)
5947 << Name << D->
getType() << FoundProp->getType();
5948 Importer.ToDiag(FoundProp->getLocation(), diag::note_odr_value_here)
5949 << FoundProp->getType();
5957 Importer.MapImported(D, FoundProp);
5962 Error Err = Error::success();
5968 return std::move(Err);
5972 if (GetImportedOrCreateDecl(
5973 ToProperty, D, Importer.getToContext(), DC, Loc,
5975 ToLParenLoc, ToType,
5987 return std::move(Err);
6007 return std::move(Err);
6011 return std::move(Err);
6018 return std::move(Err);
6021 = InImpl->FindPropertyImplDecl(
Property->getIdentifier(),
6025 Error Err = Error::success();
6028 auto ToPropertyIvarDeclLoc =
6031 return std::move(Err);
6033 if (GetImportedOrCreateDecl(ToImpl, D, Importer.getToContext(), DC,
6037 ToPropertyIvarDeclLoc))
6047 diag::warn_odr_objc_property_impl_kind_inconsistent)
6052 diag::note_odr_objc_property_impl_kind)
6063 diag::warn_odr_objc_synthesize_ivar_inconsistent)
6068 diag::note_odr_objc_synthesize_ivar_here)
6075 Importer.MapImported(D, ToImpl);
6083 Error Err = Error::success();
6087 return std::move(Err);
6091 return Importer.ToContext.getTemplateParamObjectDecl(
T,
V);
6093 (void)GetImportedOrCreateSpecialDecl(ToD,
Create, D, ToType, ToValue);
6105 return BeginLocOrErr.takeError();
6109 return LocationOrErr.takeError();
6112 if (GetImportedOrCreateDecl(
6113 ToD, D, Importer.getToContext(),
6115 *BeginLocOrErr, *LocationOrErr,
6124 Error Err = Error::success();
6125 auto ToConceptRef =
importChecked(Err, TC->getConceptReference());
6126 auto ToIDC =
importChecked(Err, TC->getImmediatelyDeclaredConstraint());
6128 return std::move(Err);
6133 if (
Error Err = importTemplateParameterDefaultArgument(D, ToD))
6142 Error Err = Error::success();
6149 return std::move(Err);
6152 if (GetImportedOrCreateDecl(ToD, D, Importer.getToContext(),
6154 ToInnerLocStart, ToLocation, D->
getDepth(),
6156 ToDeclName.getAsIdentifierInfo(), ToType,
6160 Err = importTemplateParameterDefaultArgument(D, ToD);
6169 bool IsCanonical =
false;
6170 if (
auto *CanonD = Importer.getFromContext()
6171 .findCanonicalTemplateTemplateParmDeclInternal(D);
6178 return NameOrErr.takeError();
6183 return LocationOrErr.takeError();
6187 if (!TemplateParamsOrErr)
6188 return TemplateParamsOrErr.takeError();
6191 if (GetImportedOrCreateDecl(
6192 ToD, D, Importer.getToContext(),
6199 if (
Error Err = importTemplateParameterDefaultArgument(D, ToD))
6203 return Importer.getToContext()
6204 .insertCanonicalTemplateTemplateParmDeclInternal(ToD);
6212 assert(D->getTemplatedDecl() &&
"Should be called on templates only");
6213 auto *ToTemplatedDef = D->getTemplatedDecl()->getDefinition();
6214 if (!ToTemplatedDef)
6217 return cast_or_null<T>(TemplateWithDef);
6228 return std::move(Err);
6240 TD->getLexicalDeclContext()->isDependentContext();
6242 bool DependentFriend = IsDependentFriend(D);
6249 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
6250 for (
auto *FoundDecl : FoundDecls) {
6255 auto *FoundTemplate = dyn_cast<ClassTemplateDecl>(FoundDecl);
6256 if (FoundTemplate) {
6261 bool IgnoreTemplateParmDepth =
6265 IgnoreTemplateParmDepth)) {
6266 if (DependentFriend || IsDependentFriend(FoundTemplate))
6272 return Importer.MapImported(D, TemplateWithDef);
6274 FoundByLookup = FoundTemplate;
6292 ConflictingDecls.push_back(FoundDecl);
6296 if (!ConflictingDecls.empty()) {
6299 ConflictingDecls.size());
6301 Name = NameOrErr.get();
6303 return NameOrErr.takeError();
6310 if (!TemplateParamsOrErr)
6311 return TemplateParamsOrErr.takeError();
6316 return std::move(Err);
6320 if (GetImportedOrCreateDecl(D2, D, Importer.getToContext(), DC, Loc, Name,
6321 *TemplateParamsOrErr, ToTemplated))
6329 addDeclToContexts(D, D2);
6330 updateLookupTableForTemplateParameters(**TemplateParamsOrErr);
6332 if (FoundByLookup) {
6346 "Found decl must have its templated decl set");
6349 if (ToTemplated != PrevTemplated)
6363 return std::move(Err);
6368 return std::move(Err);
6374 return std::move(Err);
6377 llvm::FoldingSetInsertToken InsertToken;
6380 dyn_cast<ClassTemplatePartialSpecializationDecl>(D);
6388 return ToTPListOrErr.takeError();
6389 ToTPList = *ToTPListOrErr;
6391 TemplateArgs, *ToTPListOrErr, InsertToken);
6399 Importer.MapImported(D, PrevDefinition);
6402 for (
auto *FromField : D->
fields()) {
6403 auto ToOrErr =
import(FromField);
6405 return ToOrErr.takeError();
6411 auto ToOrErr =
import(FromM);
6413 return ToOrErr.takeError();
6421 return PrevDefinition;
6432 return BeginLocOrErr.takeError();
6435 return IdLocOrErr.takeError();
6441 return std::move(Err);
6447 if (GetImportedOrCreateDecl<ClassTemplatePartialSpecializationDecl>(
6448 D2, D, Importer.getToContext(), D->
getTagKind(), DC, *BeginLocOrErr,
6449 *IdLocOrErr, ToTPList, ClassTemplate,
ArrayRef(TemplateArgs),
6451 cast_or_null<ClassTemplatePartialSpecializationDecl>(PrevDecl)))
6463 PartSpec2->setInstantiatedFromMember(*ToInstOrErr);
6465 return ToInstOrErr.takeError();
6467 updateLookupTableForTemplateParameters(*ToTPList);
6469 if (GetImportedOrCreateDecl(D2, D, Importer.getToContext(), D->
getTagKind(),
6470 DC, *BeginLocOrErr, *IdLocOrErr, ClassTemplate,
6495 return BraceRangeOrErr.takeError();
6498 return std::move(Err);
6504 return LocOrErr.takeError();
6512 return LocOrErr.takeError();
6517 return LocOrErr.takeError();
6523 return POIOrErr.takeError();
6529 if (
auto *CTD = dyn_cast<ClassTemplateDecl *>(
P)) {
6530 if (
auto CTDorErr =
import(CTD))
6534 auto CTPSDOrErr =
import(CTPSD);
6536 return CTPSDOrErr.takeError();
6539 for (
unsigned I = 0; I < DArgs.
size(); ++I) {
6541 if (
auto ArgOrErr =
import(DArg))
6542 D2ArgsVec[I] = *ArgOrErr;
6544 return ArgOrErr.takeError();
6554 return std::move(Err);
6566 return std::move(Err);
6572 "Variable templates cannot be declared at function scope");
6575 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
6577 for (
auto *FoundDecl : FoundDecls) {
6581 if (
VarTemplateDecl *FoundTemplate = dyn_cast<VarTemplateDecl>(FoundDecl)) {
6591 assert(FoundTemplate->getDeclContext()->isRecord() &&
6592 "Member variable template imported as non-member, "
6593 "inconsistent imported AST?");
6595 return Importer.MapImported(D, FoundDef);
6597 return Importer.MapImported(D, FoundTemplate);
6600 return Importer.MapImported(D, FoundDef);
6602 FoundByLookup = FoundTemplate;
6605 ConflictingDecls.push_back(FoundDecl);
6609 if (!ConflictingDecls.empty()) {
6612 ConflictingDecls.size());
6614 Name = NameOrErr.get();
6616 return NameOrErr.takeError();
6625 return TypeOrErr.takeError();
6630 return std::move(Err);
6634 if (!TemplateParamsOrErr)
6635 return TemplateParamsOrErr.takeError();
6638 if (GetImportedOrCreateDecl(ToVarTD, D, Importer.getToContext(), DC, Loc,
6639 Name, *TemplateParamsOrErr, ToTemplated))
6647 if (DC != Importer.getToContext().getTranslationUnitDecl())
6648 updateLookupTableForTemplateParameters(**TemplateParamsOrErr);
6650 if (FoundByLookup) {
6654 auto *PrevTemplated =
6656 if (ToTemplated != PrevTemplated)
6671 auto RedeclIt = Redecls.begin();
6674 for (; RedeclIt != Redecls.end() && *RedeclIt != D; ++RedeclIt) {
6677 return RedeclOrErr.takeError();
6679 assert(*RedeclIt == D);
6683 return std::move(Err);
6688 return std::move(Err);
6693 return BeginLocOrErr.takeError();
6697 return IdLocOrErr.takeError();
6703 return std::move(Err);
6706 llvm::FoldingSetInsertToken InsertToken;
6708 VarTemplate->findSpecialization(TemplateArgs, InsertToken);
6709 if (FoundSpecialization) {
6717 "Member variable template specialization imported as non-member, "
6718 "inconsistent imported AST?");
6720 return Importer.MapImported(D, FoundDef);
6722 return Importer.MapImported(D, FoundSpecialization);
6727 return Importer.MapImported(D, FoundDef);
6739 return std::move(Err);
6744 if (
auto *FromPartial = dyn_cast<PartVarSpecDecl>(D)) {
6745 auto ToTPListOrErr =
import(FromPartial->getTemplateParameters());
6747 return ToTPListOrErr.takeError();
6749 PartVarSpecDecl *ToPartial;
6750 if (GetImportedOrCreateDecl(ToPartial, D, Importer.getToContext(), DC,
6751 *BeginLocOrErr, *IdLocOrErr, *ToTPListOrErr,
6757 import(FromPartial->getInstantiatedFromMember()))
6758 ToPartial->setInstantiatedFromMember(*ToInstOrErr);
6760 return ToInstOrErr.takeError();
6762 if (FromPartial->isMemberSpecialization())
6763 ToPartial->setMemberSpecialization();
6771 if (GetImportedOrCreateDecl(D2, D, Importer.getToContext(), DC,
6780 if (!
VarTemplate->findSpecialization(TemplateArgs, InsertToken))
6785 return std::move(Err);
6790 return TInfoOrErr.takeError();
6797 return POIOrErr.takeError();
6808 return LocOrErr.takeError();
6816 return std::move(Err);
6818 if (FoundSpecialization)
6821 addDeclToContexts(D, D2);
6824 for (++RedeclIt; RedeclIt != Redecls.end(); ++RedeclIt) {
6827 return RedeclOrErr.takeError();
6841 return std::move(Err);
6853 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
6854 for (
auto *FoundDecl : FoundDecls) {
6855 if (!FoundDecl->isInIdentifierNamespace(IDNS))
6858 if (
auto *FoundTemplate = dyn_cast<FunctionTemplateDecl>(FoundDecl)) {
6865 return Importer.MapImported(D, TemplateWithDef);
6867 FoundByLookup = FoundTemplate;
6877 return ParamsOrErr.takeError();
6882 return std::move(Err);
6899 OldParamDC.reserve(Params->
size());
6900 llvm::transform(*Params, std::back_inserter(OldParamDC),
6904 if (GetImportedOrCreateDecl(ToFunc, D, Importer.getToContext(), DC, Loc, Name,
6905 Params, TemplatedFD))
6919 ToFunc->setLexicalDeclContext(LexicalDC);
6920 addDeclToContexts(D, ToFunc);
6923 if (LT && !OldParamDC.empty()) {
6924 for (
unsigned int I = 0; I < OldParamDC.size(); ++I)
6925 LT->updateForced(Params->
getParam(I), OldParamDC[I]);
6928 if (FoundByLookup) {
6933 "Found decl must have its templated decl set");
6934 auto *PrevTemplated =
6936 if (TemplatedFD != PrevTemplated)
6953 return std::move(Err);
6956 if (GetImportedOrCreateDecl(To, D, Importer.getToContext(), DC, LocationOrErr,
6957 NameDeclOrErr, ToTemplateParameters,
6971 return std::move(Err);
6974 if (GetImportedOrCreateDecl(To, D, Importer.getToContext(), DC, RequiresLoc))
6987 return std::move(Err);
6991 return std::move(Err);
6994 if (GetImportedOrCreateDecl(To, D, Importer.getToContext(), DC, ToSL, ToArgs))
7006 Importer.FromDiag(S->
getBeginLoc(), diag::err_unsupported_ast_node)
7013 if (Importer.returnWithErrorInTest())
7020 Names.push_back(ToII);
7023 for (
unsigned I = 0, E = S->
getNumInputs(); I != E; I++) {
7027 Names.push_back(ToII);
7033 Clobbers.push_back(*ClobberOrErr);
7035 return ClobberOrErr.takeError();
7042 Constraints.push_back(*OutputOrErr);
7044 return OutputOrErr.takeError();
7047 for (
unsigned I = 0, E = S->
getNumInputs(); I != E; I++) {
7049 Constraints.push_back(*InputOrErr);
7051 return InputOrErr.takeError();
7057 return std::move(Err);
7061 return std::move(Err);
7065 return std::move(Err);
7069 return AsmLocOrErr.takeError();
7072 return AsmStrOrErr.takeError();
7074 if (!RParenLocOrErr)
7075 return RParenLocOrErr.takeError();
7077 return new (Importer.getToContext())
GCCAsmStmt(
7078 Importer.getToContext(),
7096 Error Err = Error::success();
7101 return std::move(Err);
7102 return new (Importer.getToContext())
DeclStmt(ToDG, ToBeginLoc, ToEndLoc);
7107 if (!ToSemiLocOrErr)
7108 return ToSemiLocOrErr.takeError();
7109 return new (Importer.getToContext())
NullStmt(
7117 return std::move(Err);
7120 if (!ToLBracLocOrErr)
7121 return ToLBracLocOrErr.takeError();
7124 if (!ToRBracLocOrErr)
7125 return ToRBracLocOrErr.takeError();
7130 *ToLBracLocOrErr, *ToRBracLocOrErr);
7135 Error Err = Error::success();
7143 return std::move(Err);
7146 ToCaseLoc, ToEllipsisLoc, ToColonLoc);
7147 ToStmt->setSubStmt(ToSubStmt);
7154 Error Err = Error::success();
7159 return std::move(Err);
7162 ToDefaultLoc, ToColonLoc, ToSubStmt);
7167 Error Err = Error::success();
7172 return std::move(Err);
7174 return new (Importer.getToContext())
LabelStmt(
7175 ToIdentLoc, ToLabelDecl, ToSubStmt);
7180 if (!ToAttrLocOrErr)
7181 return ToAttrLocOrErr.takeError();
7185 return std::move(Err);
7187 if (!ToSubStmtOrErr)
7188 return ToSubStmtOrErr.takeError();
7191 Importer.getToContext(), *ToAttrLocOrErr, ToAttrs, *ToSubStmtOrErr);
7196 Error Err = Error::success();
7207 return std::move(Err);
7210 ToInit, ToConditionVariable, ToCond, ToLParenLoc,
7211 ToRParenLoc, ToThen, ToElseLoc, ToElse);
7216 Error Err = Error::success();
7225 return std::move(Err);
7229 ToCond, ToLParenLoc, ToRParenLoc);
7230 ToStmt->setBody(ToBody);
7231 ToStmt->setSwitchLoc(ToSwitchLoc);
7239 return ToSCOrErr.takeError();
7240 if (LastChainedSwitchCase)
7243 ToStmt->setSwitchCaseList(*ToSCOrErr);
7244 LastChainedSwitchCase = *ToSCOrErr;
7252 Error Err = Error::success();
7260 return std::move(Err);
7263 ToBody, ToWhileLoc, ToLParenLoc, ToRParenLoc);
7268 Error Err = Error::success();
7275 return std::move(Err);
7277 return new (Importer.getToContext())
DoStmt(
7278 ToBody, ToCond, ToDoLoc, ToWhileLoc, ToRParenLoc);
7283 Error Err = Error::success();
7293 return std::move(Err);
7295 return new (Importer.getToContext())
ForStmt(
7296 Importer.getToContext(),
7297 ToInit, ToCond, ToConditionVariable, ToInc, ToBody, ToForLoc, ToLParenLoc,
7303 Error Err = Error::success();
7308 return std::move(Err);
7310 return new (Importer.getToContext())
GotoStmt(
7311 ToLabel, ToGotoLoc, ToLabelLoc);
7316 Error Err = Error::success();
7321 return std::move(Err);
7324 ToGotoLoc, ToStarLoc, ToTarget);
7327template <
typename StmtClass>
7330 Error Err = Error::success();
7331 auto ToLoc = NodeImporter.
importChecked(Err, S->getKwLoc());
7332 auto ToLabelLoc = S->hasLabelTarget()
7335 auto ToDecl = S->hasLabelTarget()
7339 return std::move(Err);
7340 return new (Importer.
getToContext()) StmtClass(ToLoc, ToLabelLoc, ToDecl);
7353 Error Err = Error::success();
7358 return std::move(Err);
7366 Error Err = Error::success();
7371 return std::move(Err);
7374 ToCatchLoc, ToExceptionDecl, ToHandlerBlock);
7380 return ToTryLocOrErr.takeError();
7383 if (!ToTryBlockOrErr)
7384 return ToTryBlockOrErr.takeError();
7387 for (
unsigned HI = 0, HE = S->
getNumHandlers(); HI != HE; ++HI) {
7389 if (
auto ToHandlerOrErr =
import(FromHandler))
7390 ToHandlers[HI] = *ToHandlerOrErr;
7392 return ToHandlerOrErr.takeError();
7401 Error Err = Error::success();
7415 return std::move(Err);
7418 ToInit, ToRangeStmt, ToBeginStmt, ToEndStmt, ToCond, ToInc, ToLoopVarStmt,
7419 ToBody, ToForLoc, ToCoawaitLoc, ToColonLoc, ToRParenLoc);
7424 Error Err = Error::success();
7432 return std::move(Err);
7437 Importer.getToContext(), ToESD, ToInit, ToExpansionVar, ToLParenLoc,
7438 ToColonLoc, ToRParenLoc);
7445 return std::move(Err);
7448 Importer.getToContext(), ToESD, ToInit, ToExpansionVar, ToRange,
7449 ToBegin, ToIter, ToLParenLoc, ToColonLoc, ToRParenLoc);
7453 auto ToDecompositionDeclStmt =
7456 return std::move(Err);
7459 Importer.getToContext(), ToESD, ToInit, ToExpansionVar,
7460 ToDecompositionDeclStmt, ToLParenLoc, ToColonLoc, ToRParenLoc);
7464 auto ToExpansionInitializer =
7467 return std::move(Err);
7469 Importer.getToContext(), ToESD, ToInit, ToExpansionVar,
7470 ToExpansionInitializer, ToLParenLoc, ToColonLoc, ToRParenLoc);
7474 llvm_unreachable(
"invalid pattern kind");
7479 Error Err = Error::success();
7489 return std::move(Err);
7492 Importer.getToContext(), ToParent, ToInstantiations, ToSharedStmts,
7498 Error Err = Error::success();
7505 return std::move(Err);
7516 Error Err = Error::success();
7522 return std::move(Err);
7525 ToAtCatchLoc, ToRParenLoc, ToCatchParamDecl, ToCatchBody);
7530 if (!ToAtFinallyLocOrErr)
7531 return ToAtFinallyLocOrErr.takeError();
7533 if (!ToAtFinallyStmtOrErr)
7534 return ToAtFinallyStmtOrErr.takeError();
7536 *ToAtFinallyStmtOrErr);
7541 Error Err = Error::success();
7546 return std::move(Err);
7551 if (
ExpectedStmt ToCatchStmtOrErr =
import(FromCatchStmt))
7552 ToCatchStmts[CI] = *ToCatchStmtOrErr;
7554 return ToCatchStmtOrErr.takeError();
7558 ToAtTryLoc, ToTryBody,
7559 ToCatchStmts.begin(), ToCatchStmts.size(),
7566 Error Err = Error::success();
7571 return std::move(Err);
7574 ToAtSynchronizedLoc, ToSynchExpr, ToSynchBody);
7579 if (!ToThrowLocOrErr)
7580 return ToThrowLocOrErr.takeError();
7582 if (!ToThrowExprOrErr)
7583 return ToThrowExprOrErr.takeError();
7585 *ToThrowLocOrErr, *ToThrowExprOrErr);
7592 return ToAtLocOrErr.takeError();
7594 if (!ToSubStmtOrErr)
7595 return ToSubStmtOrErr.takeError();
7604 Importer.FromDiag(E->
getBeginLoc(), diag::err_unsupported_ast_node)
7610 Error Err = Error::success();
7615 return std::move(Err);
7617 if (!ParentContextOrErr)
7618 return ParentContextOrErr.takeError();
7620 return new (Importer.getToContext())
7622 RParenLoc, *ParentContextOrErr);
7627 Error Err = Error::success();
7634 return std::move(Err);
7636 return new (Importer.getToContext())
7637 VAArgExpr(ToBuiltinLoc, ToSubExpr, ToWrittenTypeInfo, ToRParenLoc, ToType,
7643 Error Err = Error::success();
7651 return std::move(Err);
7660 return new (Importer.getToContext())
7661 ChooseExpr(ToBuiltinLoc, ToCond, ToLHS, ToRHS, ToType,
VK, OK,
7662 ToRParenLoc, CondIsTrue);
7666 Error Err = Error::success();
7673 return std::move(Err);
7676 Importer.getToContext(), ToSrcExpr, ToTSI, ToType, E->
getValueKind(),
7682 Error Err = Error::success();
7690 ToSubExprs.resize(NumSubExprs);
7693 return std::move(Err);
7696 Importer.getToContext(), ToSubExprs, ToType, ToBeginLoc, ToRParenLoc);
7702 return TypeOrErr.takeError();
7706 return BeginLocOrErr.takeError();
7708 return new (Importer.getToContext())
GNUNullExpr(*TypeOrErr, *BeginLocOrErr);
7713 Error Err = Error::success();
7715 Expr *ToControllingExpr =
nullptr;
7721 assert((ToControllingExpr || ToControllingType) &&
7722 "Either the controlling expr or type must be nonnull");
7726 return std::move(Err);
7731 return std::move(Err);
7736 return std::move(Err);
7738 const ASTContext &ToCtx = Importer.getToContext();
7740 if (ToControllingExpr) {
7742 ToCtx, ToGenericLoc, ToControllingExpr,
ArrayRef(ToAssocTypes),
7743 ArrayRef(ToAssocExprs), ToDefaultLoc, ToRParenLoc,
7747 ToCtx, ToGenericLoc, ToControllingType,
ArrayRef(ToAssocTypes),
7748 ArrayRef(ToAssocExprs), ToDefaultLoc, ToRParenLoc,
7752 if (ToControllingExpr) {
7754 ToCtx, ToGenericLoc, ToControllingExpr,
ArrayRef(ToAssocTypes),
7755 ArrayRef(ToAssocExprs), ToDefaultLoc, ToRParenLoc,
7759 ToCtx, ToGenericLoc, ToControllingType,
ArrayRef(ToAssocTypes),
7760 ArrayRef(ToAssocExprs), ToDefaultLoc, ToRParenLoc,
7766 Error Err = Error::success();
7771 return std::move(Err);
7780 Error Err = Error::success();
7787 return std::move(Err);
7793 return FoundDOrErr.takeError();
7794 ToFoundD = *FoundDOrErr;
7803 return std::move(Err);
7804 ToResInfo = &ToTAInfo;
7808 Importer.getToContext(), ToQualifierLoc, ToTemplateKeywordLoc, ToDecl,
7812 ToE->setHadMultipleCandidates(
true);
7820 return TypeOrErr.takeError();
7828 return ToInitOrErr.takeError();
7831 if (!ToEqualOrColonLocOrErr)
7832 return ToEqualOrColonLocOrErr.takeError();
7838 ToIndexExprs[I - 1] = *ToArgOrErr;
7840 return ToArgOrErr.takeError();
7845 return std::move(Err);
7848 Importer.getToContext(), ToDesignators,
7849 ToIndexExprs, *ToEqualOrColonLocOrErr,
7857 return ToTypeOrErr.takeError();
7860 if (!ToLocationOrErr)
7861 return ToLocationOrErr.takeError();
7864 *ToTypeOrErr, *ToLocationOrErr);
7870 return ToTypeOrErr.takeError();
7873 if (!ToLocationOrErr)
7874 return ToLocationOrErr.takeError();
7877 Importer.getToContext(), E->
getValue(), *ToTypeOrErr, *ToLocationOrErr);
7884 return ToTypeOrErr.takeError();
7887 if (!ToLocationOrErr)
7888 return ToLocationOrErr.takeError();
7892 *ToTypeOrErr, *ToLocationOrErr);
7896 auto ToTypeOrErr =
import(E->
getType());
7898 return ToTypeOrErr.takeError();
7901 if (!ToSubExprOrErr)
7902 return ToSubExprOrErr.takeError();
7905 *ToSubExprOrErr, *ToTypeOrErr);
7909 auto ToTypeOrErr =
import(E->
getType());
7911 return ToTypeOrErr.takeError();
7914 if (!ToLocationOrErr)
7915 return ToLocationOrErr.takeError();
7918 Importer.getToContext(), E->
getValue(), *ToTypeOrErr, *ToLocationOrErr,
7919 Importer.getToContext().getFixedPointScale(*ToTypeOrErr));
7925 return ToTypeOrErr.takeError();
7928 if (!ToLocationOrErr)
7929 return ToLocationOrErr.takeError();
7938 return ToTypeOrErr.takeError();
7943 return std::move(Err);
7952 Error Err = Error::success();
7958 return std::move(Err);
7961 ToLParenLoc, ToTypeSourceInfo, ToType, E->
getValueKind(),
7967 Error Err = Error::success();
7972 return std::move(Err);
7978 return std::move(Err);
7980 return new (Importer.getToContext())
AtomicExpr(
7982 ToBuiltinLoc, ToExprs, ToType, E->
getOp(), ToRParenLoc);
7986 Error Err = Error::success();
7992 return std::move(Err);
7995 ToAmpAmpLoc, ToLabelLoc, ToLabel, ToType);
7998 Error Err = Error::success();
8002 return std::move(Err);
8007 Error Err = Error::success();
8012 return std::move(Err);
8014 return new (Importer.getToContext())
8015 ParenExpr(ToLParen, ToRParen, ToSubExpr);
8021 return std::move(Err);
8024 if (!ToLParenLocOrErr)
8025 return ToLParenLocOrErr.takeError();
8028 if (!ToRParenLocOrErr)
8029 return ToRParenLocOrErr.takeError();
8032 ToExprs, *ToRParenLocOrErr);
8036 Error Err = Error::success();
8042 return std::move(Err);
8044 return new (Importer.getToContext())
8045 StmtExpr(ToSubStmt, ToType, ToLParenLoc, ToRParenLoc,
8050 Error Err = Error::success();
8055 return std::move(Err);
8059 UO->setType(ToType);
8060 UO->setSubExpr(ToSubExpr);
8062 UO->setOperatorLoc(ToOperatorLoc);
8073 Error Err = Error::success();
8078 return std::move(Err);
8083 if (!ToArgumentTypeInfoOrErr)
8084 return ToArgumentTypeInfoOrErr.takeError();
8087 E->
getKind(), *ToArgumentTypeInfoOrErr, ToType, ToOperatorLoc,
8092 if (!ToArgumentExprOrErr)
8093 return ToArgumentExprOrErr.takeError();
8096 E->
getKind(), *ToArgumentExprOrErr, ToType, ToOperatorLoc, ToRParenLoc);
8100 Error Err = Error::success();
8106 return std::move(Err);
8109 Importer.getToContext(), ToLHS, ToRHS, E->
getOpcode(), ToType,
8115 Error Err = Error::success();
8123 return std::move(Err);
8126 ToCond, ToQuestionLoc, ToLHS, ToColonLoc, ToRHS, ToType,
8132 Error Err = Error::success();
8142 return std::move(Err);
8145 ToCommon, ToOpaqueValue, ToCond, ToTrueExpr, ToFalseExpr,
8152 Error Err = Error::success();
8155 return std::move(Err);
8157 return new (Importer.getToContext())
8162 Error Err = Error::success();
8164 auto ToQueriedTypeSourceInfo =
8170 return std::move(Err);
8174 ToDimensionExpression, ToEndLoc, ToType);
8178 Error Err = Error::success();
8184 return std::move(Err);
8192 Error Err = Error::success();
8197 return std::move(Err);
8204 Error Err = Error::success();
8210 return std::move(Err);
8219 Error Err = Error::success();
8224 auto ToComputationResultType =
8228 return std::move(Err);
8231 Importer.getToContext(), ToLHS, ToRHS, E->
getOpcode(), ToType,
8234 ToComputationLHSType, ToComputationResultType);
8241 if (
auto SpecOrErr =
import(*I))
8242 Path.push_back(*SpecOrErr);
8244 return SpecOrErr.takeError();
8252 return ToTypeOrErr.takeError();
8255 if (!ToSubExprOrErr)
8256 return ToSubExprOrErr.takeError();
8259 if (!ToBasePathOrErr)
8260 return ToBasePathOrErr.takeError();
8263 Importer.getToContext(), *ToTypeOrErr, E->
getCastKind(), *ToSubExprOrErr,
8268 Error Err = Error::success();
8273 return std::move(Err);
8276 if (!ToBasePathOrErr)
8277 return ToBasePathOrErr.takeError();
8281 case Stmt::CStyleCastExprClass: {
8283 ExpectedSLoc ToLParenLocOrErr =
import(CCE->getLParenLoc());
8284 if (!ToLParenLocOrErr)
8285 return ToLParenLocOrErr.takeError();
8286 ExpectedSLoc ToRParenLocOrErr =
import(CCE->getRParenLoc());
8287 if (!ToRParenLocOrErr)
8288 return ToRParenLocOrErr.takeError();
8291 ToSubExpr, ToBasePath, CCE->getFPFeatures(), ToTypeInfoAsWritten,
8292 *ToLParenLocOrErr, *ToRParenLocOrErr);
8295 case Stmt::CXXFunctionalCastExprClass: {
8297 ExpectedSLoc ToLParenLocOrErr =
import(FCE->getLParenLoc());
8298 if (!ToLParenLocOrErr)
8299 return ToLParenLocOrErr.takeError();
8300 ExpectedSLoc ToRParenLocOrErr =
import(FCE->getRParenLoc());
8301 if (!ToRParenLocOrErr)
8302 return ToRParenLocOrErr.takeError();
8304 Importer.getToContext(), ToType, E->
getValueKind(), ToTypeInfoAsWritten,
8305 E->
getCastKind(), ToSubExpr, ToBasePath, FCE->getFPFeatures(),
8306 *ToLParenLocOrErr, *ToRParenLocOrErr);
8309 case Stmt::ObjCBridgedCastExprClass: {
8311 ExpectedSLoc ToLParenLocOrErr =
import(OCE->getLParenLoc());
8312 if (!ToLParenLocOrErr)
8313 return ToLParenLocOrErr.takeError();
8314 ExpectedSLoc ToBridgeKeywordLocOrErr =
import(OCE->getBridgeKeywordLoc());
8315 if (!ToBridgeKeywordLocOrErr)
8316 return ToBridgeKeywordLocOrErr.takeError();
8318 *ToLParenLocOrErr, OCE->getBridgeKind(), E->
getCastKind(),
8319 *ToBridgeKeywordLocOrErr, ToTypeInfoAsWritten, ToSubExpr);
8321 case Stmt::BuiltinBitCastExprClass: {
8323 ExpectedSLoc ToKWLocOrErr =
import(BBC->getBeginLoc());
8325 return ToKWLocOrErr.takeError();
8326 ExpectedSLoc ToRParenLocOrErr =
import(BBC->getEndLoc());
8327 if (!ToRParenLocOrErr)
8328 return ToRParenLocOrErr.takeError();
8331 ToTypeInfoAsWritten, *ToKWLocOrErr, *ToRParenLocOrErr);
8334 llvm_unreachable(
"Cast expression of unsupported type!");
8347 Error Err = Error::success();
8351 return std::move(Err);
8360 auto ToBSOrErr =
import(FromNode.
getBase());
8362 return ToBSOrErr.takeError();
8367 auto ToFieldOrErr =
import(FromNode.
getField());
8369 return ToFieldOrErr.takeError();
8370 ToNodes.push_back(
OffsetOfNode(ToBeginLoc, *ToFieldOrErr, ToEndLoc));
8375 ToNodes.push_back(
OffsetOfNode(ToBeginLoc, ToII, ToEndLoc));
8384 if (!ToIndexExprOrErr)
8385 return ToIndexExprOrErr.takeError();
8386 ToExprs[I] = *ToIndexExprOrErr;
8389 Error Err = Error::success();
8395 return std::move(Err);
8398 Importer.getToContext(), ToType, ToOperatorLoc, ToTypeSourceInfo, ToNodes,
8399 ToExprs, ToRParenLoc);
8403 Error Err = Error::success();
8409 return std::move(Err);
8418 ToType, ToOperand, ToCanThrow, ToBeginLoc, ToEndLoc);
8422 Error Err = Error::success();
8427 return std::move(Err);
8435 if (!ToUsedLocOrErr)
8436 return ToUsedLocOrErr.takeError();
8438 auto ToParamOrErr =
import(E->
getParam());
8440 return ToParamOrErr.takeError();
8442 auto UsedContextOrErr = Importer.ImportContext(E->
getUsedContext());
8443 if (!UsedContextOrErr)
8444 return UsedContextOrErr.takeError();
8454 std::optional<ParmVarDecl *> FromParam =
8455 Importer.getImportedFromDecl(ToParam);
8456 assert(FromParam &&
"ParmVarDecl was not imported?");
8459 return std::move(Err);
8461 Expr *RewrittenInit =
nullptr;
8465 return ExprOrErr.takeError();
8466 RewrittenInit = ExprOrErr.get();
8469 *ToParamOrErr, RewrittenInit,
8475 Error Err = Error::success();
8480 return std::move(Err);
8483 ToType, ToTypeSourceInfo, ToRParenLoc);
8489 if (!ToSubExprOrErr)
8490 return ToSubExprOrErr.takeError();
8492 auto ToDtorOrErr =
import(E->
getTemporary()->getDestructor());
8494 return ToDtorOrErr.takeError();
8504 Error Err = Error::success();
8510 return std::move(Err);
8514 return std::move(Err);
8517 Importer.getToContext(), ToConstructor, ToType, ToTypeSourceInfo, ToArgs,
8527 return std::move(Err);
8529 Error Err = Error::success();
8533 return std::move(Err);
8537 if (GetImportedOrCreateDecl(To, D, Temporary, ExtendingDecl,
8548 Error Err = Error::success();
8552 auto ToMaterializedDecl =
8555 return std::move(Err);
8557 if (!ToTemporaryExpr)
8558 ToTemporaryExpr =
cast<Expr>(ToMaterializedDecl->getTemporaryExpr());
8562 ToMaterializedDecl);
8568 Error Err = Error::success();
8572 return std::move(Err);
8574 return new (Importer.getToContext())
8579 Error Err = Error::success();
8585 return std::move(Err);
8594 ToPartialArguments))
8595 return std::move(Err);
8599 Importer.getToContext(), ToOperatorLoc, ToPack, ToPackLoc, ToRParenLoc,
8600 Length, ToPartialArguments);
8605 Error Err = Error::success();
8612 auto ToAllocatedTypeSourceInfo =
8617 return std::move(Err);
8622 return std::move(Err);
8625 Importer.getToContext(), E->
isGlobalNew(), ToOperatorNew,
8629 ToAllocatedTypeSourceInfo, ToSourceRange, ToDirectInitRange);
8633 Error Err = Error::success();
8639 return std::move(Err);
8648 Error Err = Error::success();
8654 return std::move(Err);
8658 return std::move(Err);
8661 Importer.getToContext(), ToType, ToLocation, ToConstructor,
8665 ToParenOrBraceRange);
8672 if (!ToSubExprOrErr)
8673 return ToSubExprOrErr.takeError();
8677 return std::move(Err);
8685 Error Err = Error::success();
8690 return std::move(Err);
8694 return std::move(Err);
8704 return ToTypeOrErr.takeError();
8707 if (!ToLocationOrErr)
8708 return ToLocationOrErr.takeError();
8717 return ToTypeOrErr.takeError();
8720 if (!ToLocationOrErr)
8721 return ToLocationOrErr.takeError();
8724 *ToTypeOrErr, *ToLocationOrErr);
8728 Error Err = Error::success();
8739 return std::move(Err);
8751 return std::move(Err);
8752 ResInfo = &ToTAInfo;
8756 ToOperatorLoc, ToQualifierLoc, ToTemplateKeywordLoc,
8757 ToMemberDecl, ToFoundDecl, ToMemberNameInfo,
8764 Error Err = Error::success();
8772 return std::move(Err);
8778 if (!ToDestroyedTypeLocOrErr)
8779 return ToDestroyedTypeLocOrErr.takeError();
8785 return ToTIOrErr.takeError();
8789 Importer.getToContext(), ToBase, E->
isArrow(), ToOperatorLoc,
8790 ToQualifierLoc, ToScopeTypeInfo, ToColonColonLoc, ToTildeLoc, Storage);
8795 Error Err = Error::success();
8800 auto ToFirstQualifierFoundInScope =
8803 return std::move(Err);
8805 Expr *ToBase =
nullptr;
8808 ToBase = *ToBaseOrErr;
8810 return ToBaseOrErr.takeError();
8819 return std::move(Err);
8820 ResInfo = &ToTAInfo;
8825 return std::move(Err);
8831 return std::move(Err);
8834 Importer.getToContext(), ToBase, ToType, E->
isArrow(), ToOperatorLoc,
8835 ToQualifierLoc, ToTemplateKeywordLoc, ToFirstQualifierFoundInScope,
8836 ToMemberNameInfo, ResInfo);
8841 Error Err = Error::success();
8846 return std::move(Err);
8850 return std::move(Err);
8856 return std::move(Err);
8864 Error Err = Error::success();
8872 return std::move(Err);
8876 return std::move(Err);
8883 return std::move(Err);
8884 ResInfo = &ToTAInfo;
8888 Importer.getToContext(), ToQualifierLoc, ToTemplateKeywordLoc,
8889 ToNameInfo, ResInfo);
8894 Error Err = Error::success();
8900 return std::move(Err);
8905 return std::move(Err);
8908 Importer.getToContext(), ToType, ToTypeSourceInfo, ToLParenLoc,
8915 if (!ToNamingClassOrErr)
8916 return ToNamingClassOrErr.takeError();
8919 if (!ToQualifierLocOrErr)
8920 return ToQualifierLocOrErr.takeError();
8922 Error Err = Error::success();
8926 return std::move(Err);
8931 return std::move(Err);
8934 for (
auto *D : E->
decls())
8935 if (
auto ToDOrErr =
import(D))
8938 return ToDOrErr.takeError();
8945 return std::move(Err);
8948 if (!ToTemplateKeywordLocOrErr)
8949 return ToTemplateKeywordLocOrErr.takeError();
8951 const bool KnownDependent =
8953 ExprDependence::TypeValue;
8955 Importer.getToContext(), *ToNamingClassOrErr, *ToQualifierLocOrErr,
8956 *ToTemplateKeywordLocOrErr, ToNameInfo, E->
requiresADL(), &ToTAInfo,
8957 ToDecls.
begin(), ToDecls.
end(), KnownDependent,
8962 Importer.getToContext(), *ToNamingClassOrErr, *ToQualifierLocOrErr,
8970 Error Err = Error::success();
8978 return std::move(Err);
8983 return std::move(Err);
8987 if (
auto ToDOrErr =
import(D))
8990 return ToDOrErr.takeError();
8998 return std::move(Err);
8999 ResInfo = &ToTAInfo;
9002 Expr *ToBase =
nullptr;
9005 ToBase = *ToBaseOrErr;
9007 return ToBaseOrErr.takeError();
9012 E->
isArrow(), ToOperatorLoc, ToQualifierLoc, ToTemplateKeywordLoc,
9013 ToNameInfo, ResInfo, ToDecls.
begin(), ToDecls.
end());
9017 Error Err = Error::success();
9022 return std::move(Err);
9027 return std::move(Err);
9029 if (
const auto *OCE = dyn_cast<CXXOperatorCallExpr>(E)) {
9031 Importer.getToContext(), OCE->getOperator(), ToCallee, ToArgs, ToType,
9032 OCE->getValueKind(), ToRParenLoc, OCE->getFPFeatures(),
9033 OCE->getADLCallKind());
9043 auto ToClassOrErr =
import(FromClass);
9045 return ToClassOrErr.takeError();
9050 return ToCallOpOrErr.takeError();
9054 return std::move(Err);
9056 Error Err = Error::success();
9061 return std::move(Err);
9072 Error Err = Error::success();
9077 return std::move(Err);
9081 return std::move(Err);
9092 return ToFillerOrErr.takeError();
9096 if (
auto ToFDOrErr =
import(FromFD))
9099 return ToFDOrErr.takeError();
9103 if (
auto ToSyntFormOrErr =
import(SyntForm))
9106 return ToSyntFormOrErr.takeError();
9120 return ToTypeOrErr.takeError();
9123 if (!ToSubExprOrErr)
9124 return ToSubExprOrErr.takeError();
9127 *ToTypeOrErr, *ToSubExprOrErr);
9132 Error Err = Error::success();
9137 return std::move(Err);
9145 Error Err = Error::success();
9150 return std::move(Err);
9153 ToType, ToCommonExpr, ToSubExpr);
9159 return ToTypeOrErr.takeError();
9165 if (!ToBeginLocOrErr)
9166 return ToBeginLocOrErr.takeError();
9168 auto ToFieldOrErr =
import(E->
getField());
9170 return ToFieldOrErr.takeError();
9172 auto UsedContextOrErr = Importer.ImportContext(E->
getUsedContext());
9173 if (!UsedContextOrErr)
9174 return UsedContextOrErr.takeError();
9178 "Field should have in-class initializer if there is a default init "
9179 "expression that uses it.");
9184 auto ToInClassInitializerOrErr =
9185 import(E->
getField()->getInClassInitializer());
9186 if (!ToInClassInitializerOrErr)
9187 return ToInClassInitializerOrErr.takeError();
9191 Expr *RewrittenInit =
nullptr;
9195 return ExprOrErr.takeError();
9196 RewrittenInit = ExprOrErr.get();
9200 ToField, *UsedContextOrErr, RewrittenInit);
9204 Error Err = Error::success();
9212 return std::move(Err);
9217 if (!ToBasePathOrErr)
9218 return ToBasePathOrErr.takeError();
9220 if (
auto CCE = dyn_cast<CXXStaticCastExpr>(E)) {
9222 Importer.getToContext(), ToType,
VK, CK, ToSubExpr, &(*ToBasePathOrErr),
9223 ToTypeInfoAsWritten, CCE->getFPFeatures(), ToOperatorLoc, ToRParenLoc,
9227 Importer.getToContext(), ToType,
VK, CK, ToSubExpr, &(*ToBasePathOrErr),
9228 ToTypeInfoAsWritten, ToOperatorLoc, ToRParenLoc, ToAngleBrackets);
9231 Importer.getToContext(), ToType,
VK, CK, ToSubExpr, &(*ToBasePathOrErr),
9232 ToTypeInfoAsWritten, ToOperatorLoc, ToRParenLoc, ToAngleBrackets);
9235 Importer.getToContext(), ToType,
VK, ToSubExpr, ToTypeInfoAsWritten,
9236 ToOperatorLoc, ToRParenLoc, ToAngleBrackets);
9238 llvm_unreachable(
"Unknown cast type");
9239 return make_error<ASTImportError>();
9245 Error Err = Error::success();
9252 return std::move(Err);
9255 ToType, E->
getValueKind(), ToNameLoc, ToReplacement, ToAssociatedDecl,
9260 Error Err = Error::success();
9265 return std::move(Err);
9269 return std::move(Err);
9276 E->
getTrait(), ToArgs, ToEndLoc, ToValue);
9286 return ToTypeOrErr.takeError();
9289 if (!ToSourceRangeOrErr)
9290 return ToSourceRangeOrErr.takeError();
9295 *ToTypeOrErr, *ToTSIOrErr, *ToSourceRangeOrErr);
9297 return ToTSIOrErr.takeError();
9301 if (!ToExprOperandOrErr)
9302 return ToExprOperandOrErr.takeError();
9305 *ToTypeOrErr, *ToExprOperandOrErr, *ToSourceRangeOrErr);
9309 Error Err = Error::success();
9320 return std::move(Err);
9322 return new (Importer.getToContext())
9328 Error Err = Error::success();
9336 return std::move(Err);
9340 return std::move(Err);
9345 return std::move(Err);
9347 LParenLoc, LocalParameters, RParenLoc,
9348 Requirements, RBraceLoc);
9353 Error Err = Error::success();
9357 return std::move(Err);
9360 Importer.getToContext(),
CL,
9365 return std::move(Err);
9367 Importer.getToContext(),
CL,
9373 Error Err = Error::success();
9379 return std::move(Err);
9382 ToType, E->
getValueKind(), ToPackLoc, ToArgPack, ToAssociatedDecl,
9389 return std::move(Err);
9392 return ToSyntOrErr.takeError();
9399 Error Err = Error::success();
9405 return std::move(Err);
9409 return std::move(Err);
9412 ToInitLoc, ToBeginLoc, ToEndLoc);
9417 Error Err = Error::success();
9421 return std::move(Err);
9423 return new (Importer.getToContext())
9429 Error ImportErrors = Error::success();
9431 if (
auto ImportedOrErr =
import(FromOverriddenMethod))
9433 (*ImportedOrErr)->getCanonicalDecl()));
9436 joinErrors(std::move(ImportErrors), ImportedOrErr.takeError());
9438 return ImportErrors;
9444 std::shared_ptr<ASTImporterSharedState> SharedState)
9445 : SharedState(SharedState), ToContext(ToContext), FromContext(FromContext),
9446 ToFileManager(ToFileManager), FromFileManager(FromFileManager),
9451 this->SharedState = std::make_shared<ASTImporterSharedState>();
9454 ImportedDecls[FromContext.getTranslationUnitDecl()] =
9455 ToContext.getTranslationUnitDecl();
9462 "Try to get field index for non-field.");
9466 return std::nullopt;
9469 for (
const auto *D : Owner->decls()) {
9477 llvm_unreachable(
"Field was not found in its parent context.");
9479 return std::nullopt;
9482ASTImporter::FoundDeclsTy
9492 if (SharedState->getLookupTable()) {
9500 dyn_cast<NamespaceDecl>(ReDC));
9501 for (
auto *D : NSChain) {
9503 SharedState->getLookupTable()->lookup(dyn_cast<NamespaceDecl>(D),
9510 SharedState->getLookupTable()->lookup(ReDC, Name);
9511 return FoundDeclsTy(LookupResult.begin(), LookupResult.end());
9515 FoundDeclsTy
Result(NoloadLookupResult.
begin(), NoloadLookupResult.
end());
9532void ASTImporter::AddToLookupTable(
Decl *ToD) {
9533 SharedState->addDeclToLookup(ToD);
9539 return Importer.
Visit(FromD);
9563 llvm::DenseMap<const Type *, const Type *>::iterator Pos =
9564 ImportedTypes.find(FromT);
9565 if (Pos != ImportedTypes.end())
9572 return ToTOrErr.takeError();
9575 ImportedTypes[FromT] = ToTOrErr->getTypePtr();
9577 return ToTOrErr->getTypePtr();
9586 return ToTyOrErr.takeError();
9599 return TOrErr.takeError();
9602 return BeginLocOrErr.takeError();
9604 return ToContext.getTrivialTypeSourceInfo(*TOrErr, *BeginLocOrErr);
9611template <
typename T>
struct AttrArgImporter {
9612 AttrArgImporter(
const AttrArgImporter<T> &) =
delete;
9613 AttrArgImporter(AttrArgImporter<T> &&) =
default;
9614 AttrArgImporter<T> &operator=(
const AttrArgImporter<T> &) =
delete;
9615 AttrArgImporter<T> &operator=(AttrArgImporter<T> &&) =
default;
9618 : To(I.importChecked(Err, From)) {}
9620 const T &value() {
return To; }
9631template <
typename T>
struct AttrArgArrayImporter {
9632 AttrArgArrayImporter(
const AttrArgArrayImporter<T> &) =
delete;
9633 AttrArgArrayImporter(AttrArgArrayImporter<T> &&) =
default;
9634 AttrArgArrayImporter<T> &operator=(
const AttrArgArrayImporter<T> &) =
delete;
9635 AttrArgArrayImporter<T> &operator=(AttrArgArrayImporter<T> &&) =
default;
9637 AttrArgArrayImporter(ASTNodeImporter &I,
Error &Err,
9638 const llvm::iterator_range<T *> &From,
9639 unsigned ArraySize) {
9642 To.reserve(ArraySize);
9646 T *value() {
return To.data(); }
9649 llvm::SmallVector<T, 2> To;
9653 Error Err{Error::success()};
9654 Attr *ToAttr =
nullptr;
9655 ASTImporter &Importer;
9656 ASTNodeImporter NImporter;
9659 AttrImporter(ASTImporter &I) : Importer(I), NImporter(I) {}
9664 template <
class T> AttrArgImporter<T> importArg(
const T &From) {
9665 return AttrArgImporter<T>(NImporter, Err, From);
9671 template <
typename T>
9672 AttrArgArrayImporter<T> importArrayArg(
const llvm::iterator_range<T *> &From,
9673 unsigned ArraySize) {
9674 return AttrArgArrayImporter<T>(NImporter, Err, From, ArraySize);
9685 template <
typename T,
typename... Arg>
9686 void importAttr(
const T *FromAttr, Arg &&...ImportedArg) {
9687 static_assert(std::is_base_of<Attr, T>::value,
9688 "T should be subclass of Attr.");
9689 assert(!ToAttr &&
"Use one AttrImporter to import one Attribute object.");
9691 const IdentifierInfo *ToAttrName = Importer.
Import(FromAttr->getAttrName());
9692 const IdentifierInfo *ToScopeName =
9693 Importer.
Import(FromAttr->getScopeName());
9694 SourceRange ToAttrRange =
9696 SourceLocation ToScopeLoc =
9702 AttributeCommonInfo ToI(
9703 ToAttrName, AttributeScopeInfo(ToScopeName, ToScopeLoc), ToAttrRange,
9704 FromAttr->getParsedKind(), FromAttr->getForm());
9708 std::forward<Arg>(ImportedArg)..., ToI);
9712 if (
auto *ToInheritableAttr = dyn_cast<InheritableAttr>(ToAttr))
9713 ToInheritableAttr->setInherited(FromAttr->isInherited());
9719 void cloneAttr(
const Attr *FromAttr) {
9720 assert(!ToAttr &&
"Use one AttrImporter to import one Attribute object.");
9732 llvm::Expected<Attr *> getResult() && {
9734 return std::move(Err);
9735 assert(ToAttr &&
"Attribute should be created.");
9742 AttrImporter AI(*
this);
9745 switch (FromAttr->
getKind()) {
9746 case attr::Aligned: {
9748 if (From->isAlignmentExpr())
9749 AI.importAttr(From,
true, AI.importArg(From->getAlignmentExpr()).value());
9751 AI.importAttr(From,
false,
9752 AI.importArg(From->getAlignmentType()).value());
9756 case attr::AlignValue: {
9758 AI.importAttr(From, AI.importArg(From->getAlignment()).value());
9762 case attr::Format: {
9764 AI.importAttr(From,
Import(From->getType()), From->getFormatIdx(),
9765 From->getFirstArg());
9769 case attr::EnableIf: {
9771 AI.importAttr(From, AI.importArg(From->getCond()).value(),
9772 From->getMessage());
9776 case attr::AssertCapability: {
9779 AI.importArrayArg(From->args(), From->args_size()).value(),
9783 case attr::AcquireCapability: {
9786 AI.importArrayArg(From->args(), From->args_size()).value(),
9790 case attr::TryAcquireCapability: {
9792 AI.importAttr(From, AI.importArg(From->getSuccessValue()).value(),
9793 AI.importArrayArg(From->args(), From->args_size()).value(),
9797 case attr::ReleaseCapability: {
9800 AI.importArrayArg(From->args(), From->args_size()).value(),
9804 case attr::RequiresCapability: {
9807 AI.importArrayArg(From->args(), From->args_size()).value(),
9811 case attr::GuardedBy: {
9814 AI.importArrayArg(From->args(), From->args_size()).value(),
9818 case attr::PtGuardedBy: {
9821 AI.importArrayArg(From->args(), From->args_size()).value(),
9825 case attr::AcquiredAfter: {
9828 AI.importArrayArg(From->args(), From->args_size()).value(),
9832 case attr::AcquiredBefore: {
9835 AI.importArrayArg(From->args(), From->args_size()).value(),
9839 case attr::LockReturned: {
9841 AI.importAttr(From, AI.importArg(From->getArg()).value());
9844 case attr::LocksExcluded: {
9847 AI.importArrayArg(From->args(), From->args_size()).value(),
9855 AI.cloneAttr(FromAttr);
9860 return std::move(AI).getResult();
9864 return ImportedDecls.lookup(FromD);
9868 auto FromDPos = ImportedFromDecls.find(ToD);
9869 if (FromDPos == ImportedFromDecls.end())
9879 ImportPath.push(FromD);
9880 llvm::scope_exit ImportPathBuilder([
this]() { ImportPath.pop(); });
9885 return make_error<ASTImportError>(*
Error);
9891 if (
auto Error = SharedState->getImportDeclErrorIfAny(ToD)) {
9893 return make_error<ASTImportError>(*
Error);
9900 if (ImportPath.hasCycleAtBack())
9901 SavedImportPaths[FromD].push_back(ImportPath.copyCycleAtBack());
9910 auto Pos = ImportedDecls.find(FromD);
9911 bool ToDWasCreated = Pos != ImportedDecls.end();
9915 Decl *CreatedToD = ToDWasCreated ? Pos->second :
nullptr;
9916 if (ToDWasCreated) {
9919 auto *ToD = CreatedToD;
9920 ImportedDecls.erase(Pos);
9925 if (
const auto *FromTD = dyn_cast<TagDecl>(FromD)) {
9926 if (
const Type *FromTy =
9928 ImportedTypes.erase(FromTy);
9942 auto PosF = ImportedFromDecls.find(ToD);
9943 if (PosF != ImportedFromDecls.end()) {
9948 SharedState->removeDeclFromLookup(ToD);
9949 ImportedFromDecls.erase(PosF);
9961 handleAllErrors(ToDOrErr.takeError(),
9966 SharedState->setImportDeclError(CreatedToD, ErrOut);
9970 for (
const auto &Path : SavedImportPaths[FromD]) {
9973 Decl *PrevFromDi = FromD;
9974 for (
Decl *FromDi : Path) {
9976 if (FromDi == FromD)
9983 PrevFromDi = FromDi;
9986 if (
const auto *FromTDi = dyn_cast<TagDecl>(FromDi)) {
9987 if (
const Type *FromTyi =
9989 ImportedTypes.erase(FromTyi);
9995 auto Ii = ImportedDecls.find(FromDi);
9996 if (Ii != ImportedDecls.end())
9997 SharedState->setImportDeclError(Ii->second, ErrOut);
10002 SavedImportPaths.erase(FromD);
10005 return make_error<ASTImportError>(ErrOut);
10017 return make_error<ASTImportError>(*Err);
10023 if (
auto Error = SharedState->getImportDeclErrorIfAny(ToD)) {
10025 return make_error<ASTImportError>(*
Error);
10028 assert(ImportedDecls.count(FromD) != 0 &&
"Missing call to MapImported?");
10032 auto ToAttrOrErr =
Import(FromAttr);
10036 return ToAttrOrErr.takeError();
10043 SavedImportPaths.erase(FromD);
10058 return ToDCOrErr.takeError();
10063 if (
auto *ToRecord = dyn_cast<RecordDecl>(ToDC)) {
10065 if (ToRecord->isCompleteDefinition())
10073 if (FromRecord->getASTContext().getExternalSource() &&
10074 !FromRecord->isCompleteDefinition())
10075 FromRecord->getASTContext().getExternalSource()->CompleteType(FromRecord);
10077 if (FromRecord->isCompleteDefinition())
10080 return std::move(Err);
10081 }
else if (
auto *ToEnum = dyn_cast<EnumDecl>(ToDC)) {
10083 if (ToEnum->isCompleteDefinition()) {
10085 }
else if (FromEnum->isCompleteDefinition()) {
10088 return std::move(Err);
10092 }
else if (
auto *ToClass = dyn_cast<ObjCInterfaceDecl>(ToDC)) {
10094 if (ToClass->getDefinition()) {
10099 return std::move(Err);
10103 }
else if (
auto *ToProto = dyn_cast<ObjCProtocolDecl>(ToDC)) {
10105 if (ToProto->getDefinition()) {
10110 return std::move(Err);
10121 return cast_or_null<Expr>(*ToSOrErr);
10123 return ToSOrErr.takeError();
10131 llvm::DenseMap<Stmt *, Stmt *>::iterator Pos = ImportedStmts.find(FromS);
10132 if (Pos != ImportedStmts.end())
10133 return Pos->second;
10141 if (
auto *ToE = dyn_cast<Expr>(*ToSOrErr)) {
10145 ToE->setValueKind(FromE->getValueKind());
10146 ToE->setObjectKind(FromE->getObjectKind());
10147 ToE->setDependence(FromE->getDependence());
10151 ImportedStmts[FromS] = *ToSOrErr;
10162 auto NSOrErr =
Import(Namespace);
10164 return NSOrErr.takeError();
10165 auto PrefixOrErr =
Import(Prefix);
10167 return PrefixOrErr.takeError();
10175 return RDOrErr.takeError();
10180 return TyOrErr.takeError();
10183 llvm_unreachable(
"Invalid nested name specifier kind");
10195 NestedNames.push_back(NNS);
10201 while (!NestedNames.empty()) {
10202 NNS = NestedNames.pop_back_val();
10205 return std::move(Err);
10212 return std::move(Err);
10216 return std::move(Err);
10222 ToLocalBeginLoc, ToLocalEndLoc);
10228 return std::move(Err);
10241 if (!ToSourceRangeOrErr)
10242 return ToSourceRangeOrErr.takeError();
10245 ToSourceRangeOrErr->getBegin(),
10246 ToSourceRangeOrErr->getEnd());
10250 llvm_unreachable(
"unexpected null nested name specifier");
10263 return ToTemplateOrErr.takeError();
10268 for (
auto *I : *FromStorage) {
10269 if (
auto ToOrErr =
Import(I))
10272 return ToOrErr.takeError();
10274 return ToContext.getOverloadedTemplateName(ToTemplates.
begin(),
10275 ToTemplates.
end());
10281 if (!DeclNameOrErr)
10282 return DeclNameOrErr.takeError();
10283 return ToContext.getAssumedTemplateName(*DeclNameOrErr);
10289 if (!QualifierOrErr)
10290 return QualifierOrErr.takeError();
10293 return TNOrErr.takeError();
10294 return ToContext.getQualifiedTemplateName(
10301 if (!QualifierOrErr)
10302 return QualifierOrErr.takeError();
10303 return ToContext.getDependentTemplateName(
10311 if (!ReplacementOrErr)
10312 return ReplacementOrErr.takeError();
10315 if (!AssociatedDeclOrErr)
10316 return AssociatedDeclOrErr.takeError();
10318 return ToContext.getSubstTemplateTemplateParm(
10319 *ReplacementOrErr, *AssociatedDeclOrErr, Subst->
getIndex(),
10327 auto ArgPackOrErr =
10330 return ArgPackOrErr.takeError();
10333 if (!AssociatedDeclOrErr)
10334 return AssociatedDeclOrErr.takeError();
10336 return ToContext.getSubstTemplateTemplateParmPack(
10337 *ArgPackOrErr, *AssociatedDeclOrErr, SubstPack->
getIndex(),
10344 return PatternOrErr.takeError();
10347 if (!IndexExprOrErr)
10348 return IndexExprOrErr.takeError();
10352 auto ExpansionOrErr =
Import(
T);
10353 if (!ExpansionOrErr)
10354 return ExpansionOrErr.takeError();
10355 Expansions.push_back(*ExpansionOrErr);
10358 return ToContext.getPackIndexingTemplateName(
10364 return UsingOrError.takeError();
10368 llvm_unreachable(
"Unexpected DeducedTemplate");
10371 llvm_unreachable(
"Invalid template name kind");
10383 if (!ToFileIDOrErr)
10384 return ToFileIDOrErr.takeError();
10392 return std::move(Err);
10394 return std::move(Err);
10400 llvm::DenseMap<FileID, FileID>::iterator Pos = ImportedFileIDs.find(FromID);
10401 if (Pos != ImportedFileIDs.end())
10402 return Pos->second;
10414 return ToSpLoc.takeError();
10417 return ToExLocS.takeError();
10427 return ToExLocE.takeError();
10433 if (!IsBuiltin && !
Cache->BufferOverridden) {
10437 return ToIncludeLoc.takeError();
10448 if (
Cache->OrigEntry &&
Cache->OrigEntry->getDir()) {
10454 ToFileManager.getOptionalFileRef(
Cache->OrigEntry->getName());
10459 ToID = ToSM.
createFileID(*Entry, ToIncludeLocOrFakeLoc,
10466 std::optional<llvm::MemoryBufferRef> FromBuf =
10467 Cache->getBufferOrNone(FromContext.getDiagnostics(),
10472 std::unique_ptr<llvm::MemoryBuffer> ToBuf =
10473 llvm::MemoryBuffer::getMemBufferCopy(FromBuf->getBuffer(),
10474 FromBuf->getBufferIdentifier());
10480 assert(ToID.
isValid() &&
"Unexpected invalid fileID was created.");
10482 ImportedFileIDs[FromID] = ToID;
10489 return ToExprOrErr.takeError();
10492 if (!LParenLocOrErr)
10493 return LParenLocOrErr.takeError();
10496 if (!RParenLocOrErr)
10497 return RParenLocOrErr.takeError();
10502 return ToTInfoOrErr.takeError();
10507 return std::move(Err);
10510 ToContext, *ToTInfoOrErr, From->
isBaseVirtual(), *LParenLocOrErr,
10511 *ToExprOrErr, *RParenLocOrErr, EllipsisLoc);
10515 return ToFieldOrErr.takeError();
10518 if (!MemberLocOrErr)
10519 return MemberLocOrErr.takeError();
10522 ToContext, cast_or_null<FieldDecl>(*ToFieldOrErr), *MemberLocOrErr,
10523 *LParenLocOrErr, *ToExprOrErr, *RParenLocOrErr);
10526 if (!ToIFieldOrErr)
10527 return ToIFieldOrErr.takeError();
10530 if (!MemberLocOrErr)
10531 return MemberLocOrErr.takeError();
10534 ToContext, cast_or_null<IndirectFieldDecl>(*ToIFieldOrErr),
10535 *MemberLocOrErr, *LParenLocOrErr, *ToExprOrErr, *RParenLocOrErr);
10539 return ToTInfoOrErr.takeError();
10541 return new (ToContext)
10543 *ToExprOrErr, *RParenLocOrErr);
10546 return make_error<ASTImportError>();
10552 auto Pos = ImportedCXXBaseSpecifiers.find(BaseSpec);
10553 if (Pos != ImportedCXXBaseSpecifiers.end())
10554 return Pos->second;
10557 if (!ToSourceRange)
10558 return ToSourceRange.takeError();
10561 return ToTSI.takeError();
10563 if (!ToEllipsisLoc)
10564 return ToEllipsisLoc.takeError();
10568 ImportedCXXBaseSpecifiers[BaseSpec] =
Imported;
10580 return ToOrErr.takeError();
10581 Decl *To = *ToOrErr;
10586 if (
auto *ToRecord = dyn_cast<RecordDecl>(To)) {
10587 if (!ToRecord->getDefinition()) {
10594 if (
auto *ToEnum = dyn_cast<EnumDecl>(To)) {
10595 if (!ToEnum->getDefinition()) {
10601 if (
auto *ToIFace = dyn_cast<ObjCInterfaceDecl>(To)) {
10602 if (!ToIFace->getDefinition()) {
10609 if (
auto *ToProto = dyn_cast<ObjCProtocolDecl>(To)) {
10610 if (!ToProto->getDefinition()) {
10634 return ToSelOrErr.takeError();
10638 return ToContext.DeclarationNames.getCXXConstructorName(
10639 ToContext.getCanonicalType(*ToTyOrErr));
10641 return ToTyOrErr.takeError();
10646 return ToContext.DeclarationNames.getCXXDestructorName(
10647 ToContext.getCanonicalType(*ToTyOrErr));
10649 return ToTyOrErr.takeError();
10654 return ToContext.DeclarationNames.getCXXDeductionGuideName(
10657 return ToTemplateOrErr.takeError();
10662 return ToContext.DeclarationNames.getCXXConversionFunctionName(
10663 ToContext.getCanonicalType(*ToTyOrErr));
10665 return ToTyOrErr.takeError();
10669 return ToContext.DeclarationNames.getCXXOperatorName(
10673 return ToContext.DeclarationNames.getCXXLiteralOperatorName(
10681 llvm_unreachable(
"Invalid DeclarationName Kind!");
10709 for (
unsigned I = 1, N = FromSel.
getNumArgs(); I < N; ++I)
10711 return ToContext.Selectors.getSelector(FromSel.
getNumArgs(), Idents.data());
10717 llvm::Error Err = llvm::Error::success();
10718 auto ImportLoop = [&](
const APValue *From,
APValue *To,
unsigned Size) {
10719 for (
unsigned Idx = 0; Idx < Size; Idx++) {
10724 switch (FromValue.
getKind()) {
10738 ImportLoop(((
const APValue::Vec *)(
const char *)&FromValue.Data)->Elts,
10744 llvm_unreachable(
"Matrix APValue import not yet supported");
10748 ImportLoop(((
const APValue::Arr *)(
const char *)&FromValue.Data)->Elts,
10749 ((
const APValue::Arr *)(
const char *)&
Result.Data)->Elts,
10757 ((
const APValue::StructData *)(
const char *)&FromValue.Data)->Elts,
10758 ((
const APValue::StructData *)(
const char *)&
Result.Data)->Elts,
10767 return std::move(Err);
10772 Result.MakeAddrLabelDiff();
10776 return std::move(Err);
10782 const Decl *ImpMemPtrDecl =
10785 return std::move(Err);
10787 Result.setMemberPointerUninit(
10796 return std::move(Err);
10806 "in C++20 dynamic allocation are transient so they shouldn't "
10807 "appear in the AST");
10809 if (
const auto *E =
10811 FromElemTy = E->getType();
10814 return std::move(Err);
10824 return std::move(Err);
10836 return std::move(Err);
10849 for (
unsigned LoopIdx = 0; LoopIdx < PathLength; LoopIdx++) {
10851 const Decl *FromDecl =
10852 FromPath[LoopIdx].getAsBaseOrMember().getPointer();
10855 return std::move(Err);
10856 if (
auto *RD = dyn_cast<CXXRecordDecl>(FromDecl))
10857 FromElemTy = Importer.FromContext.getCanonicalTagType(RD);
10861 ImpDecl, FromPath[LoopIdx].getAsBaseOrMember().getInt()));
10864 Importer.FromContext.getAsArrayType(FromElemTy)->getElementType();
10866 FromPath[LoopIdx].getAsArrayIndex());
10874 return std::move(Err);
10882 unsigned NumDecls) {
10892 if (LastDiagFromFrom)
10893 ToContext.getDiagnostics().notePriorDiagnosticFrom(
10894 FromContext.getDiagnostics());
10895 LastDiagFromFrom =
false;
10896 return ToContext.getDiagnostics().Report(Loc, DiagID);
10900 if (!LastDiagFromFrom)
10901 FromContext.getDiagnostics().notePriorDiagnosticFrom(
10902 ToContext.getDiagnostics());
10903 LastDiagFromFrom =
true;
10904 return FromContext.getDiagnostics().Report(Loc, DiagID);
10908 if (
auto *ID = dyn_cast<ObjCInterfaceDecl>(D)) {
10909 if (!ID->getDefinition())
10910 ID->startDefinition();
10912 else if (
auto *PD = dyn_cast<ObjCProtocolDecl>(D)) {
10913 if (!PD->getDefinition())
10914 PD->startDefinition();
10916 else if (
auto *TD = dyn_cast<TagDecl>(D)) {
10917 if (!TD->getDefinition() && !TD->isBeingDefined()) {
10918 TD->startDefinition();
10919 TD->setCompleteDefinition(
true);
10923 assert(0 &&
"CompleteDecl called on a Decl that can't be completed");
10928 auto [Pos, Inserted] = ImportedDecls.try_emplace(From, To);
10929 assert((Inserted || Pos->second == To) &&
10930 "Try to import an already imported Decl");
10932 return Pos->second;
10935 ImportedFromDecls[To] = From;
10940 AddToLookupTable(To);
10944std::optional<ASTImportError>
10946 auto Pos = ImportDeclErrors.find(FromD);
10947 if (Pos != ImportDeclErrors.end())
10948 return Pos->second;
10950 return std::nullopt;
10954 auto InsertRes = ImportDeclErrors.insert({From,
Error});
10958 assert(InsertRes.second || InsertRes.first->second.Error ==
Error.Error);
10963 llvm::DenseMap<const Type *, const Type *>::iterator Pos =
10965 if (Pos != ImportedTypes.end()) {
10967 if (ToContext.hasSameType(*ToFromOrErr, To))
10970 llvm::consumeError(ToFromOrErr.takeError());
10975 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 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.
Result
Implement __builtin_bit_cast and related operations.
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
unsigned getStructNumVirtualBases() 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 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.
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).
auto makeScopedCycleDetection(const FunctionDecl *D)
bool isCycle(const FunctionDecl *D) const
Imports selected nodes from one AST context into another context, merging AST nodes where appropriate...
ASTContext & getFromContext() const
Retrieve the context that AST nodes are being imported from.
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 ImportTemplateArguments(ArrayRef< TemplateArgument > FromArgs, SmallVectorImpl< TemplateArgument > &ToArgs)
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)
ExpectedStmt VisitCXXExpansionSelectExpr(CXXExpansionSelectExpr *E)
ExpectedDecl VisitStaticAssertDecl(StaticAssertDecl *D)
ExpectedStmt VisitShuffleVectorExpr(ShuffleVectorExpr *E)
ExpectedDecl VisitObjCPropertyDecl(ObjCPropertyDecl *D)
ExpectedDecl VisitRecordDecl(RecordDecl *D)
ExpectedStmt VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E)
ExpectedStmt VisitCXXExpansionStmtPattern(CXXExpansionStmtPattern *S)
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 VisitPseudoObjectExpr(PseudoObjectExpr *E)
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)
ExpectedDecl VisitCXXExpansionStmtDecl(CXXExpansionStmtDecl *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)
ExpectedStmt VisitSubstNonTypeTemplateParmPackExpr(SubstNonTypeTemplateParmPackExpr *E)
ExpectedDecl VisitObjCTypeParamDecl(ObjCTypeParamDecl *D)
ExpectedDecl VisitFileScopeAsmDecl(FileScopeAsmDecl *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)
ExpectedStmt VisitCXXExpansionStmtInstantiation(CXXExpansionStmtInstantiation *S)
ExpectedDecl VisitFriendTemplateDecl(FriendTemplateDecl *D)
ExpectedStmt VisitCXXParenListInitExpr(CXXParenListInitExpr *E)
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)
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 VisitDependentTemplateIdExpr(DependentTemplateIdExpr *E)
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
ExpectedDecl VisitTemplateParamObjectDecl(TemplateParamObjectDecl *D)
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 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.
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.
void setDecomposedDecl(DecompositionDecl *Decomposed)
Set the decomposed variable for this BindingDecl.
Expr * getBinding() const
Get the expression to which this declaration is bound.
DecompositionDecl * getDecomposedDecl() const
Get the decomposition declaration that this binding represents a decomposition of.
void setBinding(QualType DeclaredType, Expr *Binding)
Set the binding for this BindingDecl, along with its declared type (which should be a possibly-cv-qua...
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)
Helper that selects an expression from an InitListExpr depending on the current expansion index.
InitListExpr * getRangeExpr()
Represents a C++26 expansion statement declaration.
CXXExpansionStmtPattern * getExpansionPattern()
CXXExpansionStmtInstantiation * getInstantiations()
void setInstantiations(CXXExpansionStmtInstantiation *S)
NonTypeTemplateParmDecl * getIndexTemplateParm()
void setExpansionPattern(CXXExpansionStmtPattern *S)
Represents the code generated for an expanded expansion statement.
ArrayRef< Stmt * > getInstantiations() const
bool shouldApplyLifetimeExtensionToPreamble() const
CXXExpansionStmtDecl * getParent()
ArrayRef< Stmt * > getPreambleStmts() const
static CXXExpansionStmtInstantiation * Create(ASTContext &C, CXXExpansionStmtDecl *Parent, ArrayRef< Stmt * > Instantiations, ArrayRef< Stmt * > PreambleStmts, bool ShouldApplyLifetimeExtensionToPreamble)
CXXExpansionStmtPattern - Represents an unexpanded C++ expansion statement.
ExpansionStmtKind getKind() const
static CXXExpansionStmtPattern * CreateIterating(ASTContext &Context, CXXExpansionStmtDecl *ESD, Stmt *Init, DeclStmt *ExpansionVar, DeclStmt *Range, DeclStmt *Begin, DeclStmt *Iter, SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation RParenLoc)
Create an iterating expansion statement pattern.
const DeclStmt * getIterVarStmt() const
DeclStmt * getExpansionVarStmt()
static CXXExpansionStmtPattern * CreateDependent(ASTContext &Context, CXXExpansionStmtDecl *ESD, Stmt *Init, DeclStmt *ExpansionVar, Expr *ExpansionInitializer, SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation RParenLoc)
Create a dependent expansion statement pattern.
SourceLocation getRParenLoc() const
static CXXExpansionStmtPattern * CreateDestructuring(ASTContext &Context, CXXExpansionStmtDecl *ESD, Stmt *Init, DeclStmt *ExpansionVar, Stmt *DecompositionDeclStmt, SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation RParenLoc)
Create a destructuring expansion statement pattern.
Stmt * getDecompositionDeclStmt()
const DeclStmt * getBeginVarStmt() const
SourceLocation getColonLoc() const
Expr * getExpansionInitializer()
const DeclStmt * getRangeVarStmt() const
CXXExpansionStmtDecl * getDecl()
static CXXExpansionStmtPattern * CreateEnumerating(ASTContext &Context, CXXExpansionStmtDecl *ESD, Stmt *Init, DeclStmt *ExpansionVar, SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation RParenLoc)
Create an enumerating expansion statement pattern.
SourceLocation getLParenLoc() const
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, bool IsReversed=false)
Represents a list-initialization with parenthesis.
static CXXParenListInitExpr * Create(ASTContext &C, ArrayRef< Expr * > Args, QualType T, unsigned NumUserSpecifiedExprs, SourceLocation InitLoc, SourceLocation LParenLoc, SourceLocation RParenLoc)
SourceLocation getEndLoc() const LLVM_READONLY
SourceLocation getInitLoc() const LLVM_READONLY
MutableArrayRef< Expr * > getInitExprs()
SourceLocation getBeginLoc() const LLVM_READONLY
MutableArrayRef< Expr * > getUserSpecifiedInitExprs()
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 setLambdaContextDecl(Decl *ContextDecl)
Set the context declaration for a lambda class.
void setDescribedClassTemplate(ClassTemplateDecl *Template)
void setLambdaNumbering(LambdaNumbering Numbering)
Set the mangling numbers 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.
ClassTemplatePartialSpecializationDecl * findPartialSpecialization(ArrayRef< TemplateArgument > Args, TemplateParameterList *TPL, llvm::FoldingSetInsertToken &InsertToken)
Return the partial specialization with the provided arguments if it exists, otherwise return the inse...
ClassTemplateDecl * getMostRecentDecl()
CXXRecordDecl * getTemplatedDecl() const
Get the underlying class declarations of the template.
ClassTemplateSpecializationDecl * findSpecialization(ArrayRef< TemplateArgument > Args, llvm::FoldingSetInsertToken &InsertToken)
Return the specialization with the provided arguments if it exists, otherwise return the insertion po...
bool isThisDeclarationADefinition() const
Returns whether this template declaration defines the primary class pattern.
void AddSpecialization(ClassTemplateSpecializationDecl *D, llvm::FoldingSetInsertToken InsertToken)
Insert the specified specialization knowing that it is not already in.
void AddPartialSpecialization(ClassTemplatePartialSpecializationDecl *D, llvm::FoldingSetInsertToken InsertToken)
Insert the specified partial specialization knowing that it is not already in.
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.
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
static ConceptReference * Create(const ASTContext &C, NestedNameSpecifierLoc NNS, SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo, NamedDecl *FoundDecl, TemplateName NamedConcept, const ASTTemplateArgumentListInfo *ArgsAsWritten)
const ASTTemplateArgumentListInfo * getTemplateArgsAsWritten() const
TemplateName 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 ?
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.
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...
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.
A template-id naming a variable template or a concept through a template template parameter.
static DependentTemplateIdExpr * Create(const ASTContext &Context, const DeclarationNameInfo &NameInfo, TemplateName Name, const TemplateArgumentListInfo &TemplateArgs)
const DeclarationNameInfo & getNameInfo() const
ArrayRef< TemplateArgumentLoc > template_arguments() const
SourceLocation getRAngleLoc() const
DeclarationName getName() const
TemplateName getTemplateName() const
SourceLocation getNameLoc() const
SourceLocation getLAngleLoc() const
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
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 getAsmLoc() const
const Expr * getAsmStringExpr() const
SourceLocation getRParenLoc() const
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
SourceLocation getEllipsisLoc() const
Retrieves the location of the '...', if present.
virtual 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...
Declaration of a friend template.
TemplateName getFriendTemplateName() const
FriendTemplateEntityKind getFriendKind() const
ArrayRef< TemplateParameterList * > getTemplateParameterLists() const
const Expr * getSubExpr() const
static DefaultedOrDeletedFunctionInfo * Create(ASTContext &Context, ArrayRef< DeclAccessPair > Lookups, FPOptionsOverride FPFeatures, 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
DefaultedOrDeletedFunctionInfo * getDefaultedOrDeletedInfo() 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.
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)
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 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 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() const
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.
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.
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.
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
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 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.
const IdentifierInfo * getFieldName() const
For a field or identifier offsetof node, returns the name of the field.
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.
@ 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.
A structure for storing a pack-index-template-name ([temp.names]).
bool isFullySubstituted() const
TemplateName getPattern() const
Expr * getIndexExpr() const
ArrayRef< TemplateName > getExpansions() const
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() const
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
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)
[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.
PseudoObjectExpr - An expression which accesses a pseudo-object l-value.
unsigned getResultExprIndex() const
Return the index of the result-bearing expression into the semantics expressions, or PseudoObjectExpr...
static PseudoObjectExpr * Create(const ASTContext &Context, Expr *syntactic, ArrayRef< Expr * > semantic, unsigned resultIndex)
ArrayRef< Expr * > semantics()
unsigned getNumSemanticExprs() const
Expr * getSyntacticForm()
Return the syntactic form of this expression, i.e.
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.
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.
StmtClass getStmtClass() const
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
Get the number of string literal tokens that were concatenated in translation phase #6 to form this s...
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
QualType getParameterType() const
Determine the substituted type of the template parameter.
unsigned getIndex() const
Returns the index of the replaced parameter in the associated declaration.
SourceLocation getNameLoc() const
Expr * getReplacement() const
Represents a reference to a non-type template parameter pack that has been substituted with a non-tem...
TemplateArgument getArgumentPack() const
Retrieve the template argument pack containing the substituted template arguments.
SourceLocation getParameterPackLocation() const
Retrieve the location of the parameter pack name.
Decl * getAssociatedDecl() const
A template-like entity which owns the whole pattern being substituted.
unsigned getIndex() const
Returns the index of the replaced parameter in the associated declaration.
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.
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.
bool isNull() const
Determine whether this template name is NULL.
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.
@ PackIndexingTemplate
A pack-index-template-name.
@ 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.
PackIndexingTemplateStorage * getAsPackIndexingTemplate() const
Retrieve the pack-index-template-name storage, if any.
A template parameter object.
const APValue & getValue() const
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.
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.
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 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
VarArgKind getVarargABI() const
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()
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
Top level wrappers for InstallAPI frontend operations.
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.
OptionalUnsigned< unsigned > UnsignedOrNone
const FunctionProtoType * T
llvm::Expected< QualType > ExpectedType
@ Template
We are parsing a template declaration.
static OMPLinearClause * Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc, OpenMPLinearClauseKind Modifier, SourceLocation ModifierLoc, SourceLocation ColonLoc, SourceLocation StepModifierLoc, SourceLocation EndLoc, ArrayRef< Expr * > VL, ArrayRef< Expr * > PL, ArrayRef< Expr * > IL, Expr *Step, Expr *CalcStep, Stmt *PreInit, Expr *PostUpdate)
Creates clause with a list of variables VL and a linear step Step.
@ 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)
llvm::Expected< Stmt * > ExpectedStmt
static void updateFlags(const Decl *From, Decl *To)
__packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 __packed_splat2 __packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 uint32_t
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
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
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),...
unsigned HasConstantInitialization
Whether this variable is known to have constant initialization.
unsigned HasConstantDestruction
Whether this variable is known to have constant destruction.
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