57#include "llvm/ADT/ArrayRef.h"
58#include "llvm/ADT/DenseMap.h"
59#include "llvm/ADT/STLExtras.h"
60#include "llvm/ADT/ScopeExit.h"
61#include "llvm/ADT/SmallVector.h"
62#include "llvm/Support/ErrorHandling.h"
63#include "llvm/Support/MemoryBuffer.h"
74 using llvm::make_error;
89 return "NameConflict";
91 return "UnsupportedConstruct";
93 return "Unknown error";
95 llvm_unreachable(
"Invalid error code.");
96 return "Invalid error code.";
102 llvm_unreachable(
"Function not implemented.");
113 Redecls.push_back(R);
116 std::reverse(Redecls.begin(), Redecls.end());
121 if (
auto *FD = dyn_cast<FunctionDecl>(D))
123 if (
auto *VD = dyn_cast<VarDecl>(D))
125 if (
auto *TD = dyn_cast<TagDecl>(D))
127 llvm_unreachable(
"Bad declaration kind");
148 bool const IgnoreChildErrors;
152 : FromDC(FromDC), IgnoreChildErrors(!
isa<
TagDecl>(FromDC)) {}
162 if (ChildErr && !IgnoreChildErrors)
163 ResultErr = joinErrors(std::move(ResultErr), std::move(ChildErr));
165 consumeError(std::move(ChildErr));
171 if (!IgnoreChildErrors || !FromDC)
173 return FromDC->containsDecl(FromChildD);
179 public StmtVisitor<ASTNodeImporter, ExpectedStmt> {
183 template <
typename ImportT>
184 [[nodiscard]]
Error importInto(ImportT &To,
const ImportT &From) {
185 return Importer.importInto(To, From);
189 template <
typename ImportT>
190 [[nodiscard]]
Error importInto(ImportT *&To, ImportT *From) {
191 auto ToOrErr = Importer.Import(From);
193 To = cast_or_null<ImportT>(*ToOrErr);
194 return ToOrErr.takeError();
199 template <
typename T>
203 auto ToOrErr = Importer.Import(From);
205 return ToOrErr.takeError();
206 return cast_or_null<T>(*ToOrErr);
209 template <
typename T>
210 auto import(
const T *From) {
211 return import(
const_cast<T *
>(From));
215 template <
typename T>
217 return Importer.Import(From);
221 template <
typename T>
225 return import(*From);
232 template <
typename ToDeclT>
struct CallOverloadedCreateFun {
233 template <
typename... Args>
decltype(
auto)
operator()(Args &&... args) {
234 return ToDeclT::Create(std::forward<Args>(args)...);
244 template <
typename ToDeclT,
typename FromDeclT,
typename... Args>
245 [[nodiscard]]
bool GetImportedOrCreateDecl(ToDeclT *&ToD, FromDeclT *FromD,
250 CallOverloadedCreateFun<ToDeclT> OC;
251 return GetImportedOrCreateSpecialDecl(ToD, OC, FromD,
252 std::forward<Args>(args)...);
259 template <
typename NewDeclT,
typename ToDeclT,
typename FromDeclT,
261 [[nodiscard]]
bool GetImportedOrCreateDecl(ToDeclT *&ToD, FromDeclT *FromD,
263 CallOverloadedCreateFun<NewDeclT> OC;
264 return GetImportedOrCreateSpecialDecl(ToD, OC, FromD,
265 std::forward<Args>(args)...);
269 template <
typename ToDeclT,
typename CreateFunT,
typename FromDeclT,
272 GetImportedOrCreateSpecialDecl(ToDeclT *&ToD, CreateFunT CreateFun,
273 FromDeclT *FromD, Args &&...args) {
274 if (Importer.getImportDeclErrorIfAny(FromD)) {
278 ToD = cast_or_null<ToDeclT>(Importer.GetAlreadyImportedOrNull(FromD));
281 ToD = CreateFun(std::forward<Args>(args)...);
283 Importer.RegisterImportedDecl(FromD, ToD);
284 Importer.SharedState->markAsNewDecl(ToD);
285 InitializeImportedDecl(FromD, ToD);
289 void InitializeImportedDecl(
Decl *FromD,
Decl *ToD) {
293 if (FromD->isImplicit())
307 void addDeclToContexts(
Decl *FromD,
Decl *ToD) {
308 if (Importer.isMinimalImport()) {
312 if (!FromD->getDescribedTemplate() &&
319 DeclContext *FromLexicalDC = FromD->getLexicalDeclContext();
323 bool Visible =
false;
336 if (
auto *FromNamed = dyn_cast<NamedDecl>(FromD)) {
339 FromDC->
lookup(FromNamed->getDeclName());
340 if (llvm::is_contained(FromLookup, FromNamed))
353 LT->update(TP, OldDC);
357 updateLookupTableForTemplateParameters(
358 Params, Importer.getToContext().getTranslationUnitDecl());
361 template <
typename TemplateParmDeclT>
362 Error importTemplateParameterDefaultArgument(
const TemplateParmDeclT *D,
363 TemplateParmDeclT *ToD) {
364 if (D->hasDefaultArgument()) {
365 if (D->defaultArgumentWasInherited()) {
367 import(D->getDefaultArgStorage().getInheritedFrom());
368 if (!ToInheritedFromOrErr)
369 return ToInheritedFromOrErr.takeError();
370 TemplateParmDeclT *ToInheritedFrom = *ToInheritedFromOrErr;
371 if (!ToInheritedFrom->hasDefaultArgument()) {
375 import(D->getDefaultArgStorage()
377 ->getDefaultArgument());
378 if (!ToInheritedDefaultArgOrErr)
379 return ToInheritedDefaultArgOrErr.takeError();
380 ToInheritedFrom->setDefaultArgument(Importer.getToContext(),
381 *ToInheritedDefaultArgOrErr);
383 ToD->setInheritedDefaultArgument(ToD->getASTContext(),
387 import(D->getDefaultArgument());
388 if (!ToDefaultArgOrErr)
389 return ToDefaultArgOrErr.takeError();
392 if (!ToD->hasDefaultArgument())
393 ToD->setDefaultArgument(Importer.getToContext(),
397 return Error::success();
409#define TYPE(Class, Base) \
410 ExpectedType Visit##Class##Type(const Class##Type *T);
411#include "clang/AST/TypeNodes.inc"
448 (IDK ==
IDK_Default && !Importer.isMinimalImport());
469 template <
typename InContainerTy>
473 template<
typename InContainerTy>
480 std::tuple<FunctionTemplateDecl *, TemplateArgsTy>;
485 template <
typename DeclTy>
509 template <
typename T>
513 bool IgnoreTemplateParmDepth =
false);
721 Err = MaybeVal.takeError();
727 template<
typename IIter,
typename OIter>
729 using ItemT = std::remove_reference_t<
decltype(*Obegin)>;
730 for (; Ibegin != Iend; ++Ibegin, ++Obegin) {
733 return ToOrErr.takeError();
736 return Error::success();
743 template<
typename InContainerTy,
typename OutContainerTy>
745 const InContainerTy &InContainer, OutContainerTy &OutContainer) {
747 InContainer.begin(), InContainer.end(), OutContainer.begin());
750 template<
typename InContainerTy,
typename OIter>
762template <
typename InContainerTy>
766 auto ToLAngleLocOrErr =
import(FromLAngleLoc);
767 if (!ToLAngleLocOrErr)
768 return ToLAngleLocOrErr.takeError();
769 auto ToRAngleLocOrErr =
import(FromRAngleLoc);
770 if (!ToRAngleLocOrErr)
771 return ToRAngleLocOrErr.takeError();
776 Result = std::move(ToTAInfo);
777 return Error::success();
793 From.LAngleLoc, From.RAngleLoc, From.arguments(),
Result);
805 if (
Error Err = importInto(std::get<0>(
Result), FTSInfo->getTemplate()))
806 return std::move(Err);
811 return std::move(Err);
821 return std::move(Err);
824 if (!ToRequiresClause)
825 return ToRequiresClause.takeError();
828 if (!ToTemplateLocOrErr)
829 return ToTemplateLocOrErr.takeError();
831 if (!ToLAngleLocOrErr)
832 return ToLAngleLocOrErr.takeError();
834 if (!ToRAngleLocOrErr)
835 return ToRAngleLocOrErr.takeError();
838 Importer.getToContext(),
856 return ToTypeOrErr.takeError();
864 return ToTypeOrErr.takeError();
871 return ToOrErr.takeError();
874 return ToTypeOrErr.takeError();
875 return TemplateArgument(dyn_cast<ValueDecl>((*ToOrErr)->getCanonicalDecl()),
882 return ToTypeOrErr.takeError();
890 return ToTypeOrErr.takeError();
893 return ToValueOrErr.takeError();
900 if (!ToTemplateOrErr)
901 return ToTemplateOrErr.takeError();
909 if (!ToTemplateOrErr)
910 return ToTemplateOrErr.takeError();
921 return ToExpr.takeError();
927 return std::move(Err);
933 llvm_unreachable(
"Invalid template argument kind");
941 return ArgOrErr.takeError();
950 return E.takeError();
956 return TSIOrErr.takeError();
959 if (!ToTemplateKWLocOrErr)
960 return ToTemplateKWLocOrErr.takeError();
962 if (!ToTemplateQualifierLocOrErr)
963 return ToTemplateQualifierLocOrErr.takeError();
965 if (!ToTemplateNameLocOrErr)
966 return ToTemplateNameLocOrErr.takeError();
967 auto ToTemplateEllipsisLocOrErr =
969 if (!ToTemplateEllipsisLocOrErr)
970 return ToTemplateEllipsisLocOrErr.takeError();
972 Importer.getToContext(), *ToTemplateKWLocOrErr,
973 *ToTemplateQualifierLocOrErr, *ToTemplateNameLocOrErr,
974 *ToTemplateEllipsisLocOrErr);
984 size_t NumDecls = DG.
end() - DG.
begin();
986 ToDecls.reserve(NumDecls);
987 for (
Decl *FromD : DG) {
988 if (
auto ToDOrErr =
import(FromD))
989 ToDecls.push_back(*ToDOrErr);
991 return ToDOrErr.takeError();
1006 return ToDotLocOrErr.takeError();
1009 if (!ToFieldLocOrErr)
1010 return ToFieldLocOrErr.takeError();
1013 ToFieldName, *ToDotLocOrErr, *ToFieldLocOrErr);
1017 if (!ToLBracketLocOrErr)
1018 return ToLBracketLocOrErr.takeError();
1021 if (!ToRBracketLocOrErr)
1022 return ToRBracketLocOrErr.takeError();
1026 *ToLBracketLocOrErr,
1027 *ToRBracketLocOrErr);
1030 if (!ToEllipsisLocOrErr)
1031 return ToEllipsisLocOrErr.takeError();
1035 D.
getArrayIndex(), *ToLBracketLocOrErr, *ToEllipsisLocOrErr,
1036 *ToRBracketLocOrErr);
1041 Error Err = Error::success();
1044 auto ToConceptNameLoc =
1050 return std::move(Err);
1053 if (ASTTemplateArgs)
1055 return std::move(Err);
1057 Importer.getToContext(), ToNNS, ToTemplateKWLoc,
1061 Importer.getToContext(), ToTAInfo)
1067 char *ToStore =
new (Importer.getToContext())
char[FromStr.size()];
1068 std::copy(FromStr.begin(), FromStr.end(), ToStore);
1069 return StringRef(ToStore, FromStr.size());
1081 return ToSecondExpr.takeError();
1082 ToSat.
Details.emplace_back(ToSecondExpr.get());
1086 return ToCROrErr.takeError();
1087 ToSat.
Details.emplace_back(ToCROrErr.get());
1094 return ToPairFirst.takeError();
1096 ToSat.
Details.emplace_back(
new (Importer.getToContext())
1098 ToPairFirst.get(), ToPairSecond});
1102 return Error::success();
1107ASTNodeImporter::import(
1112 return ToLoc.takeError();
1114 return new (Importer.getToContext())
1126 return DiagOrErr.takeError();
1127 return new (Importer.getToContext()) TypeRequirement(*DiagOrErr);
1131 return ToType.takeError();
1132 return new (Importer.getToContext()) TypeRequirement(*ToType);
1140 bool IsRKSimple = From->
getKind() == Requirement::RK_Simple;
1143 std::optional<ExprRequirement::ReturnTypeRequirement> Req;
1149 const ExprRequirement::ReturnTypeRequirement &FromTypeRequirement =
1152 if (FromTypeRequirement.isTypeConstraint()) {
1153 const bool IsDependent = FromTypeRequirement.isDependent();
1155 import(FromTypeRequirement.getTypeConstraintTemplateParameterList());
1157 return ParamsOrErr.takeError();
1158 if (Status >= ExprRequirement::SS_ConstraintsNotSatisfied) {
1159 auto SubstConstraintExprOrErr =
1161 if (!SubstConstraintExprOrErr)
1162 return SubstConstraintExprOrErr.takeError();
1163 SubstitutedConstraintExpr = SubstConstraintExprOrErr.get();
1165 Req.emplace(ParamsOrErr.get(), IsDependent);
1166 }
else if (FromTypeRequirement.isSubstitutionFailure()) {
1167 auto DiagOrErr =
import(FromTypeRequirement.getSubstitutionDiagnostic());
1169 return DiagOrErr.takeError();
1170 Req.emplace(DiagOrErr.get());
1177 if (!NoexceptLocOrErr)
1178 return NoexceptLocOrErr.takeError();
1180 if (Status == ExprRequirement::SS_ExprSubstitutionFailure) {
1183 return DiagOrErr.takeError();
1184 return new (Importer.getToContext()) ExprRequirement(
1185 *DiagOrErr, IsRKSimple, *NoexceptLocOrErr, std::move(*Req));
1189 return ExprOrErr.takeError();
1191 *ExprOrErr, IsRKSimple, *NoexceptLocOrErr, std::move(*Req), Status,
1192 SubstitutedConstraintExpr);
1207 return new (Importer.getToContext())
1208 NestedRequirement(ToEntity, ToSatisfaction);
1212 return ToExpr.takeError();
1213 if (ToExpr.get()->isInstantiationDependent()) {
1214 return new (Importer.getToContext()) NestedRequirement(ToExpr.get());
1219 return std::move(Err);
1220 return new (Importer.getToContext()) NestedRequirement(
1221 Importer.getToContext(), ToExpr.get(), Satisfaction);
1229 switch (FromRequire->
getKind()) {
1239 llvm_unreachable(
"Unhandled requirement kind");
1249 return VarOrErr.takeError();
1254 return LocationOrErr.takeError();
1259 return std::move(Err);
1266template <
typename T>
1268 if (
Found->getLinkageInternal() != From->getLinkageInternal())
1271 if (From->hasExternalFormalLinkage())
1272 return Found->hasExternalFormalLinkage();
1273 if (Importer.GetFromTU(
Found) != From->getTranslationUnitDecl())
1275 if (From->isInAnonymousNamespace())
1276 return Found->isInAnonymousNamespace();
1278 return !
Found->isInAnonymousNamespace() &&
1279 !
Found->hasExternalFormalLinkage();
1299using namespace clang;
1305 FunctionDeclsWithImportInProgress.insert(D);
1308 return llvm::scope_exit([
this, LambdaD]() {
1310 FunctionDeclsWithImportInProgress.erase(LambdaD);
1317 return FunctionDeclsWithImportInProgress.find(D) !=
1318 FunctionDeclsWithImportInProgress.end();
1322 Importer.FromDiag(
SourceLocation(), diag::err_unsupported_ast_node)
1323 <<
T->getTypeClassName();
1328 ExpectedType UnderlyingTypeOrErr =
import(
T->getValueType());
1329 if (!UnderlyingTypeOrErr)
1330 return UnderlyingTypeOrErr.takeError();
1332 return Importer.getToContext().getAtomicType(*UnderlyingTypeOrErr);
1336 switch (
T->getKind()) {
1337#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
1338 case BuiltinType::Id: \
1339 return Importer.getToContext().SingletonId;
1340#include "clang/Basic/OpenCLImageTypes.def"
1341#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
1342 case BuiltinType::Id: \
1343 return Importer.getToContext().Id##Ty;
1344#include "clang/Basic/OpenCLExtensionTypes.def"
1345#define SVE_TYPE(Name, Id, SingletonId) \
1346 case BuiltinType::Id: \
1347 return Importer.getToContext().SingletonId;
1348#include "clang/Basic/AArch64ACLETypes.def"
1349#define PPC_VECTOR_TYPE(Name, Id, Size) \
1350 case BuiltinType::Id: \
1351 return Importer.getToContext().Id##Ty;
1352#include "clang/Basic/PPCTypes.def"
1353#define RVV_TYPE(Name, Id, SingletonId) \
1354 case BuiltinType::Id: \
1355 return Importer.getToContext().SingletonId;
1356#include "clang/Basic/RISCVVTypes.def"
1357#define WASM_TYPE(Name, Id, SingletonId) \
1358 case BuiltinType::Id: \
1359 return Importer.getToContext().SingletonId;
1360#include "clang/Basic/WebAssemblyReferenceTypes.def"
1361#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) \
1362 case BuiltinType::Id: \
1363 return Importer.getToContext().SingletonId;
1364#include "clang/Basic/AMDGPUTypes.def"
1365#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \
1366 case BuiltinType::Id: \
1367 return Importer.getToContext().SingletonId;
1368#include "clang/Basic/HLSLIntangibleTypes.def"
1369#define SPIRV_TYPE(Name, Id, SingletonId) \
1370 case BuiltinType::Id: \
1371 return Importer.getToContext().SingletonId;
1372#include "clang/Basic/SPIRVTypes.def"
1373#define SHARED_SINGLETON_TYPE(Expansion)
1374#define BUILTIN_TYPE(Id, SingletonId) \
1375 case BuiltinType::Id: return Importer.getToContext().SingletonId;
1376#include "clang/AST/BuiltinTypes.def"
1384 case BuiltinType::Char_U:
1388 if (Importer.getToContext().getLangOpts().CharIsSigned)
1389 return Importer.getToContext().UnsignedCharTy;
1391 return Importer.getToContext().CharTy;
1393 case BuiltinType::Char_S:
1397 if (!Importer.getToContext().getLangOpts().CharIsSigned)
1398 return Importer.getToContext().SignedCharTy;
1400 return Importer.getToContext().CharTy;
1402 case BuiltinType::WChar_S:
1403 case BuiltinType::WChar_U:
1406 return Importer.getToContext().WCharTy;
1409 llvm_unreachable(
"Invalid BuiltinType Kind!");
1412ExpectedType ASTNodeImporter::VisitDecayedType(
const DecayedType *
T) {
1413 ExpectedType ToOriginalTypeOrErr =
import(
T->getOriginalType());
1414 if (!ToOriginalTypeOrErr)
1415 return ToOriginalTypeOrErr.takeError();
1417 return Importer.getToContext().getDecayedType(*ToOriginalTypeOrErr);
1420ExpectedType ASTNodeImporter::VisitComplexType(
const ComplexType *
T) {
1421 ExpectedType ToElementTypeOrErr =
import(
T->getElementType());
1422 if (!ToElementTypeOrErr)
1423 return ToElementTypeOrErr.takeError();
1425 return Importer.getToContext().getComplexType(*ToElementTypeOrErr);
1428ExpectedType ASTNodeImporter::VisitPointerType(
const PointerType *
T) {
1430 if (!ToPointeeTypeOrErr)
1431 return ToPointeeTypeOrErr.takeError();
1433 return Importer.getToContext().getPointerType(*ToPointeeTypeOrErr);
1436ExpectedType ASTNodeImporter::VisitBlockPointerType(
const BlockPointerType *
T) {
1439 if (!ToPointeeTypeOrErr)
1440 return ToPointeeTypeOrErr.takeError();
1442 return Importer.getToContext().getBlockPointerType(*ToPointeeTypeOrErr);
1446ASTNodeImporter::VisitLValueReferenceType(
const LValueReferenceType *
T) {
1448 ExpectedType ToPointeeTypeOrErr =
import(
T->getPointeeTypeAsWritten());
1449 if (!ToPointeeTypeOrErr)
1450 return ToPointeeTypeOrErr.takeError();
1452 return Importer.getToContext().getLValueReferenceType(*ToPointeeTypeOrErr);
1456ASTNodeImporter::VisitRValueReferenceType(
const RValueReferenceType *
T) {
1458 ExpectedType ToPointeeTypeOrErr =
import(
T->getPointeeTypeAsWritten());
1459 if (!ToPointeeTypeOrErr)
1460 return ToPointeeTypeOrErr.takeError();
1462 return Importer.getToContext().getRValueReferenceType(*ToPointeeTypeOrErr);
1466ASTNodeImporter::VisitMemberPointerType(
const MemberPointerType *
T) {
1469 if (!ToPointeeTypeOrErr)
1470 return ToPointeeTypeOrErr.takeError();
1472 auto QualifierOrErr =
import(
T->getQualifier());
1473 if (!QualifierOrErr)
1474 return QualifierOrErr.takeError();
1476 auto ClsOrErr =
import(
T->getMostRecentCXXRecordDecl());
1478 return ClsOrErr.takeError();
1480 return Importer.getToContext().getMemberPointerType(
1481 *ToPointeeTypeOrErr, *QualifierOrErr, *ClsOrErr);
1485ASTNodeImporter::VisitConstantArrayType(
const ConstantArrayType *
T) {
1486 Error Err = Error::success();
1487 auto ToElementType = importChecked(Err,
T->getElementType());
1488 auto ToSizeExpr = importChecked(Err,
T->getSizeExpr());
1490 return std::move(Err);
1492 return Importer.getToContext().getConstantArrayType(
1493 ToElementType,
T->getSize(), ToSizeExpr,
T->getSizeModifier(),
1494 T->getIndexTypeCVRQualifiers());
1498ASTNodeImporter::VisitArrayParameterType(
const ArrayParameterType *
T) {
1500 if (!ToArrayTypeOrErr)
1501 return ToArrayTypeOrErr.takeError();
1503 return Importer.getToContext().getArrayParameterType(*ToArrayTypeOrErr);
1507ASTNodeImporter::VisitIncompleteArrayType(
const IncompleteArrayType *
T) {
1508 ExpectedType ToElementTypeOrErr =
import(
T->getElementType());
1509 if (!ToElementTypeOrErr)
1510 return ToElementTypeOrErr.takeError();
1512 return Importer.getToContext().getIncompleteArrayType(*ToElementTypeOrErr,
1513 T->getSizeModifier(),
1514 T->getIndexTypeCVRQualifiers());
1518ASTNodeImporter::VisitVariableArrayType(
const VariableArrayType *
T) {
1519 Error Err = Error::success();
1520 QualType ToElementType = importChecked(Err,
T->getElementType());
1521 Expr *ToSizeExpr = importChecked(Err,
T->getSizeExpr());
1523 return std::move(Err);
1524 return Importer.getToContext().getVariableArrayType(
1525 ToElementType, ToSizeExpr,
T->getSizeModifier(),
1526 T->getIndexTypeCVRQualifiers());
1529ExpectedType ASTNodeImporter::VisitDependentSizedArrayType(
1530 const DependentSizedArrayType *
T) {
1531 Error Err = Error::success();
1532 QualType ToElementType = importChecked(Err,
T->getElementType());
1533 Expr *ToSizeExpr = importChecked(Err,
T->getSizeExpr());
1535 return std::move(Err);
1539 return Importer.getToContext().getDependentSizedArrayType(
1540 ToElementType, ToSizeExpr,
T->getSizeModifier(),
1541 T->getIndexTypeCVRQualifiers());
1544ExpectedType ASTNodeImporter::VisitDependentSizedExtVectorType(
1545 const DependentSizedExtVectorType *
T) {
1546 Error Err = Error::success();
1547 QualType ToElementType = importChecked(Err,
T->getElementType());
1548 Expr *ToSizeExpr = importChecked(Err,
T->getSizeExpr());
1549 SourceLocation ToAttrLoc = importChecked(Err,
T->getAttributeLoc());
1551 return std::move(Err);
1552 return Importer.getToContext().getDependentSizedExtVectorType(
1553 ToElementType, ToSizeExpr, ToAttrLoc);
1556ExpectedType ASTNodeImporter::VisitVectorType(
const VectorType *
T) {
1557 ExpectedType ToElementTypeOrErr =
import(
T->getElementType());
1558 if (!ToElementTypeOrErr)
1559 return ToElementTypeOrErr.takeError();
1561 return Importer.getToContext().getVectorType(*ToElementTypeOrErr,
1562 T->getNumElements(),
1563 T->getVectorKind());
1566ExpectedType ASTNodeImporter::VisitExtVectorType(
const ExtVectorType *
T) {
1567 ExpectedType ToElementTypeOrErr =
import(
T->getElementType());
1568 if (!ToElementTypeOrErr)
1569 return ToElementTypeOrErr.takeError();
1571 return Importer.getToContext().getExtVectorType(*ToElementTypeOrErr,
1572 T->getNumElements());
1576ASTNodeImporter::VisitFunctionNoProtoType(
const FunctionNoProtoType *
T) {
1580 if (!ToReturnTypeOrErr)
1581 return ToReturnTypeOrErr.takeError();
1583 return Importer.getToContext().getFunctionNoProtoType(*ToReturnTypeOrErr,
1588ASTNodeImporter::VisitFunctionProtoType(
const FunctionProtoType *
T) {
1590 if (!ToReturnTypeOrErr)
1591 return ToReturnTypeOrErr.takeError();
1594 SmallVector<QualType, 4> ArgTypes;
1598 return TyOrErr.takeError();
1599 ArgTypes.push_back(*TyOrErr);
1603 SmallVector<QualType, 4> ExceptionTypes;
1607 return TyOrErr.takeError();
1608 ExceptionTypes.push_back(*TyOrErr);
1612 Error Err = Error::success();
1613 FunctionProtoType::ExtProtoInfo ToEPI;
1629 return std::move(Err);
1631 return Importer.getToContext().getFunctionType(
1632 *ToReturnTypeOrErr, ArgTypes, ToEPI);
1636 const UnresolvedUsingType *
T) {
1637 Error Err = Error::success();
1638 auto ToQualifier = importChecked(Err,
T->getQualifier());
1639 auto *ToD = importChecked(Err,
T->getDecl());
1641 return std::move(Err);
1644 return Importer.getToContext().getCanonicalUnresolvedUsingType(ToD);
1645 return Importer.getToContext().getUnresolvedUsingType(
T->getKeyword(),
1649ExpectedType ASTNodeImporter::VisitParenType(
const ParenType *
T) {
1651 if (!ToInnerTypeOrErr)
1652 return ToInnerTypeOrErr.takeError();
1654 return Importer.getToContext().getParenType(*ToInnerTypeOrErr);
1658ASTNodeImporter::VisitPackIndexingType(clang::PackIndexingType
const *
T) {
1662 return Pattern.takeError();
1665 return Index.takeError();
1666 return Importer.getToContext().getPackIndexingType(*Pattern, *Index);
1669ExpectedType ASTNodeImporter::VisitTypedefType(
const TypedefType *
T) {
1670 Expected<TypedefNameDecl *> ToDeclOrErr =
import(
T->getDecl());
1672 return ToDeclOrErr.takeError();
1674 auto ToQualifierOrErr =
import(
T->getQualifier());
1675 if (!ToQualifierOrErr)
1676 return ToQualifierOrErr.takeError();
1679 T->typeMatchesDecl() ? QualType() : import(
T->desugar());
1680 if (!ToUnderlyingTypeOrErr)
1681 return ToUnderlyingTypeOrErr.takeError();
1683 return Importer.getToContext().getTypedefType(
1684 T->getKeyword(), *ToQualifierOrErr, *ToDeclOrErr, *ToUnderlyingTypeOrErr);
1687ExpectedType ASTNodeImporter::VisitTypeOfExprType(
const TypeOfExprType *
T) {
1690 return ToExprOrErr.takeError();
1691 return Importer.getToContext().getTypeOfExprType(*ToExprOrErr,
T->getKind());
1694ExpectedType ASTNodeImporter::VisitTypeOfType(
const TypeOfType *
T) {
1695 ExpectedType ToUnderlyingTypeOrErr =
import(
T->getUnmodifiedType());
1696 if (!ToUnderlyingTypeOrErr)
1697 return ToUnderlyingTypeOrErr.takeError();
1698 return Importer.getToContext().getTypeOfType(*ToUnderlyingTypeOrErr,
1702ExpectedType ASTNodeImporter::VisitUsingType(
const UsingType *
T) {
1703 Error Err = Error::success();
1704 auto ToQualifier = importChecked(Err,
T->getQualifier());
1705 auto *ToD = importChecked(Err,
T->getDecl());
1706 QualType ToT = importChecked(Err,
T->
desugar());
1708 return std::move(Err);
1709 return Importer.getToContext().getUsingType(
T->getKeyword(), ToQualifier, ToD,
1713ExpectedType ASTNodeImporter::VisitDecltypeType(
const DecltypeType *
T) {
1717 return ToExprOrErr.takeError();
1719 ExpectedType ToUnderlyingTypeOrErr =
import(
T->getUnderlyingType());
1720 if (!ToUnderlyingTypeOrErr)
1721 return ToUnderlyingTypeOrErr.takeError();
1723 return Importer.getToContext().getDecltypeType(
1724 *ToExprOrErr, *ToUnderlyingTypeOrErr);
1728ASTNodeImporter::VisitUnaryTransformType(
const UnaryTransformType *
T) {
1730 if (!ToBaseTypeOrErr)
1731 return ToBaseTypeOrErr.takeError();
1733 ExpectedType ToUnderlyingTypeOrErr =
import(
T->getUnderlyingType());
1734 if (!ToUnderlyingTypeOrErr)
1735 return ToUnderlyingTypeOrErr.takeError();
1737 return Importer.getToContext().getUnaryTransformType(
1738 *ToBaseTypeOrErr, *ToUnderlyingTypeOrErr,
T->getUTTKind());
1741ExpectedType ASTNodeImporter::VisitAutoType(
const AutoType *
T) {
1743 ExpectedType ToDeducedTypeOrErr =
import(
T->getDeducedType());
1744 if (!ToDeducedTypeOrErr)
1745 return ToDeducedTypeOrErr.takeError();
1747 Expected<TemplateDecl *> ToTypeConstraint =
1748 import(
T->getTypeConstraintConcept());
1749 if (!ToTypeConstraint)
1750 return ToTypeConstraint.takeError();
1752 SmallVector<TemplateArgument, 2> ToTemplateArgs;
1755 return std::move(Err);
1757 return Importer.getToContext().getAutoType(
1758 T->getDeducedKind(), *ToDeducedTypeOrErr,
T->getKeyword(),
1759 *ToTypeConstraint, ToTemplateArgs);
1762ExpectedType ASTNodeImporter::VisitDeducedTemplateSpecializationType(
1763 const DeducedTemplateSpecializationType *
T) {
1765 Expected<TemplateName> ToTemplateNameOrErr =
import(
T->getTemplateName());
1766 if (!ToTemplateNameOrErr)
1767 return ToTemplateNameOrErr.takeError();
1768 ExpectedType ToDeducedTypeOrErr =
import(
T->getDeducedType());
1769 if (!ToDeducedTypeOrErr)
1770 return ToDeducedTypeOrErr.takeError();
1772 return Importer.getToContext().getDeducedTemplateSpecializationType(
1773 T->getDeducedKind(), *ToDeducedTypeOrErr,
T->getKeyword(),
1774 *ToTemplateNameOrErr);
1777ExpectedType ASTNodeImporter::VisitTagType(
const TagType *
T) {
1778 TagDecl *DeclForType =
T->getDecl();
1779 Expected<TagDecl *> ToDeclOrErr =
import(DeclForType);
1781 return ToDeclOrErr.takeError();
1787 Expected<TagDecl *> ToDefDeclOrErr =
import(DeclForType->
getDefinition());
1788 if (!ToDefDeclOrErr)
1789 return ToDefDeclOrErr.takeError();
1792 return Importer.getToContext().getCanonicalTagType(*ToDeclOrErr);
1794 auto ToQualifierOrErr =
import(
T->getQualifier());
1795 if (!ToQualifierOrErr)
1796 return ToQualifierOrErr.takeError();
1798 return Importer.getToContext().getTagType(
T->getKeyword(), *ToQualifierOrErr,
1799 *ToDeclOrErr,
T->isTagOwned());
1802ExpectedType ASTNodeImporter::VisitEnumType(
const EnumType *
T) {
1803 return VisitTagType(
T);
1806ExpectedType ASTNodeImporter::VisitRecordType(
const RecordType *
T) {
1807 return VisitTagType(
T);
1811ASTNodeImporter::VisitInjectedClassNameType(
const InjectedClassNameType *
T) {
1812 return VisitTagType(
T);
1815ExpectedType ASTNodeImporter::VisitAttributedType(
const AttributedType *
T) {
1816 ExpectedType ToModifiedTypeOrErr =
import(
T->getModifiedType());
1817 if (!ToModifiedTypeOrErr)
1818 return ToModifiedTypeOrErr.takeError();
1819 ExpectedType ToEquivalentTypeOrErr =
import(
T->getEquivalentType());
1820 if (!ToEquivalentTypeOrErr)
1821 return ToEquivalentTypeOrErr.takeError();
1823 return Importer.getToContext().getAttributedType(
1824 T->getAttrKind(), *ToModifiedTypeOrErr, *ToEquivalentTypeOrErr,
1829ASTNodeImporter::VisitCountAttributedType(
const CountAttributedType *
T) {
1831 if (!ToWrappedTypeOrErr)
1832 return ToWrappedTypeOrErr.takeError();
1834 Error Err = Error::success();
1835 Expr *CountExpr = importChecked(Err,
T->getCountExpr());
1837 SmallVector<TypeCoupledDeclRefInfo, 1> CoupledDecls;
1838 for (
const TypeCoupledDeclRefInfo &TI :
T->dependent_decls()) {
1839 Expected<ValueDecl *> ToDeclOrErr =
import(TI.getDecl());
1841 return ToDeclOrErr.takeError();
1842 CoupledDecls.emplace_back(*ToDeclOrErr, TI.isDeref());
1845 return Importer.getToContext().getCountAttributedType(
1846 *ToWrappedTypeOrErr, CountExpr,
T->isCountInBytes(),
T->isOrNull(),
1847 ArrayRef(CoupledDecls));
1851ASTNodeImporter::VisitLateParsedAttrType(
const LateParsedAttrType *
T) {
1852 llvm_unreachable(
"should be replaced with a concrete type before AST import");
1855ExpectedType ASTNodeImporter::VisitTemplateTypeParmType(
1856 const TemplateTypeParmType *
T) {
1857 Expected<TemplateTypeParmDecl *> ToDeclOrErr =
import(
T->getDecl());
1859 return ToDeclOrErr.takeError();
1861 return Importer.getToContext().getTemplateTypeParmType(
1862 T->getDepth(),
T->getIndex(),
T->isParameterPack(), *ToDeclOrErr);
1865ExpectedType ASTNodeImporter::VisitSubstTemplateTypeParmType(
1866 const SubstTemplateTypeParmType *
T) {
1867 Expected<Decl *> ReplacedOrErr =
import(
T->getAssociatedDecl());
1869 return ReplacedOrErr.takeError();
1871 ExpectedType ToReplacementTypeOrErr =
import(
T->getReplacementType());
1872 if (!ToReplacementTypeOrErr)
1873 return ToReplacementTypeOrErr.takeError();
1875 return Importer.getToContext().getSubstTemplateTypeParmType(
1876 *ToReplacementTypeOrErr, *ReplacedOrErr,
T->getIndex(),
T->getPackIndex(),
1880ExpectedType ASTNodeImporter::VisitSubstTemplateTypeParmPackType(
1881 const SubstTemplateTypeParmPackType *
T) {
1882 Expected<Decl *> ReplacedOrErr =
import(
T->getAssociatedDecl());
1884 return ReplacedOrErr.takeError();
1886 Expected<TemplateArgument> ToArgumentPack =
import(
T->getArgumentPack());
1887 if (!ToArgumentPack)
1888 return ToArgumentPack.takeError();
1890 return Importer.getToContext().getSubstTemplateTypeParmPackType(
1891 *ReplacedOrErr,
T->getIndex(),
T->getFinal(), *ToArgumentPack);
1894ExpectedType ASTNodeImporter::VisitSubstBuiltinTemplatePackType(
1895 const SubstBuiltinTemplatePackType *
T) {
1896 Expected<TemplateArgument> ToArgumentPack =
import(
T->getArgumentPack());
1897 if (!ToArgumentPack)
1898 return ToArgumentPack.takeError();
1899 return Importer.getToContext().getSubstBuiltinTemplatePack(*ToArgumentPack);
1902ExpectedType ASTNodeImporter::VisitTemplateSpecializationType(
1903 const TemplateSpecializationType *
T) {
1904 auto ToTemplateOrErr =
import(
T->getTemplateName());
1905 if (!ToTemplateOrErr)
1906 return ToTemplateOrErr.takeError();
1908 SmallVector<TemplateArgument, 2> ToTemplateArgs;
1911 return std::move(Err);
1915 if (!ToUnderlyingOrErr)
1916 return ToUnderlyingOrErr.takeError();
1917 return Importer.getToContext().getTemplateSpecializationType(
1918 T->getKeyword(), *ToTemplateOrErr, ToTemplateArgs, {},
1919 *ToUnderlyingOrErr);
1923ASTNodeImporter::VisitPackExpansionType(
const PackExpansionType *
T) {
1925 if (!ToPatternOrErr)
1926 return ToPatternOrErr.takeError();
1928 return Importer.getToContext().getPackExpansionType(*ToPatternOrErr,
1929 T->getNumExpansions(),
1934ASTNodeImporter::VisitDependentNameType(
const DependentNameType *
T) {
1935 auto ToQualifierOrErr =
import(
T->getQualifier());
1936 if (!ToQualifierOrErr)
1937 return ToQualifierOrErr.takeError();
1939 IdentifierInfo *Name = Importer.Import(
T->getIdentifier());
1940 return Importer.getToContext().getDependentNameType(
T->getKeyword(),
1941 *ToQualifierOrErr, Name);
1945ASTNodeImporter::VisitObjCInterfaceType(
const ObjCInterfaceType *
T) {
1946 Expected<ObjCInterfaceDecl *> ToDeclOrErr =
import(
T->getDecl());
1948 return ToDeclOrErr.takeError();
1950 return Importer.getToContext().getObjCInterfaceType(*ToDeclOrErr);
1953ExpectedType ASTNodeImporter::VisitObjCObjectType(
const ObjCObjectType *
T) {
1955 if (!ToBaseTypeOrErr)
1956 return ToBaseTypeOrErr.takeError();
1958 SmallVector<QualType, 4> TypeArgs;
1959 for (
auto TypeArg :
T->getTypeArgsAsWritten()) {
1961 TypeArgs.push_back(*TyOrErr);
1963 return TyOrErr.takeError();
1966 SmallVector<ObjCProtocolDecl *, 4> Protocols;
1967 for (
auto *P :
T->quals()) {
1968 if (Expected<ObjCProtocolDecl *> ProtocolOrErr =
import(P))
1969 Protocols.push_back(*ProtocolOrErr);
1971 return ProtocolOrErr.takeError();
1975 return Importer.getToContext().getObjCObjectType(*ToBaseTypeOrErr, TypeArgs,
1977 T->isKindOfTypeAsWritten());
1981ASTNodeImporter::VisitObjCObjectPointerType(
const ObjCObjectPointerType *
T) {
1983 if (!ToPointeeTypeOrErr)
1984 return ToPointeeTypeOrErr.takeError();
1986 return Importer.getToContext().getObjCObjectPointerType(*ToPointeeTypeOrErr);
1990ASTNodeImporter::VisitMacroQualifiedType(
const MacroQualifiedType *
T) {
1991 ExpectedType ToUnderlyingTypeOrErr =
import(
T->getUnderlyingType());
1992 if (!ToUnderlyingTypeOrErr)
1993 return ToUnderlyingTypeOrErr.takeError();
1995 IdentifierInfo *ToIdentifier = Importer.Import(
T->getMacroIdentifier());
1996 return Importer.getToContext().getMacroQualifiedType(*ToUnderlyingTypeOrErr,
2000ExpectedType clang::ASTNodeImporter::VisitAdjustedType(
const AdjustedType *
T) {
2001 Error Err = Error::success();
2002 QualType ToOriginalType = importChecked(Err,
T->getOriginalType());
2003 QualType ToAdjustedType = importChecked(Err,
T->getAdjustedType());
2005 return std::move(Err);
2007 return Importer.getToContext().getAdjustedType(ToOriginalType,
2011ExpectedType clang::ASTNodeImporter::VisitBitIntType(
const BitIntType *
T) {
2012 return Importer.getToContext().getBitIntType(
T->isUnsigned(),
2016ExpectedType clang::ASTNodeImporter::VisitBTFTagAttributedType(
2017 const clang::BTFTagAttributedType *
T) {
2018 Error Err = Error::success();
2019 const BTFTypeTagAttr *ToBTFAttr = importChecked(Err,
T->getAttr());
2020 QualType ToWrappedType = importChecked(Err,
T->getWrappedType());
2022 return std::move(Err);
2024 return Importer.getToContext().getBTFTagAttributedType(ToBTFAttr,
2028ExpectedType clang::ASTNodeImporter::VisitOverflowBehaviorType(
2029 const clang::OverflowBehaviorType *
T) {
2030 Error Err = Error::success();
2031 OverflowBehaviorType::OverflowBehaviorKind ToKind =
T->getBehaviorKind();
2034 return std::move(Err);
2036 return Importer.getToContext().getOverflowBehaviorType(ToKind,
2040ExpectedType clang::ASTNodeImporter::VisitHLSLAttributedResourceType(
2041 const clang::HLSLAttributedResourceType *
T) {
2042 Error Err = Error::success();
2043 const HLSLAttributedResourceType::Attributes &ToAttrs =
T->getAttrs();
2044 QualType ToWrappedType = importChecked(Err,
T->getWrappedType());
2045 QualType ToContainedType = importChecked(Err,
T->getContainedType());
2047 return std::move(Err);
2049 return Importer.getToContext().getHLSLAttributedResourceType(
2050 ToWrappedType, ToContainedType, ToAttrs);
2053ExpectedType clang::ASTNodeImporter::VisitHLSLInlineSpirvType(
2054 const clang::HLSLInlineSpirvType *
T) {
2055 Error Err = Error::success();
2059 uint32_t ToAlignment =
T->getAlignment();
2061 llvm::SmallVector<SpirvOperand> ToOperands;
2063 for (
auto &Operand :
T->getOperands()) {
2064 using SpirvOperandKind = SpirvOperand::SpirvOperandKind;
2067 case SpirvOperandKind::ConstantId:
2068 ToOperands.push_back(SpirvOperand::createConstant(
2069 importChecked(Err,
Operand.getResultType()),
Operand.getValue()));
2071 case SpirvOperandKind::Literal:
2072 ToOperands.push_back(SpirvOperand::createLiteral(
Operand.getValue()));
2074 case SpirvOperandKind::TypeId:
2075 ToOperands.push_back(SpirvOperand::createType(
2076 importChecked(Err,
Operand.getResultType())));
2079 llvm_unreachable(
"Invalid SpirvOperand kind");
2083 return std::move(Err);
2086 return Importer.getToContext().getHLSLInlineSpirvType(
2087 ToOpcode, ToSize, ToAlignment, ToOperands);
2090ExpectedType clang::ASTNodeImporter::VisitConstantMatrixType(
2091 const clang::ConstantMatrixType *
T) {
2092 ExpectedType ToElementTypeOrErr =
import(
T->getElementType());
2093 if (!ToElementTypeOrErr)
2094 return ToElementTypeOrErr.takeError();
2096 return Importer.getToContext().getConstantMatrixType(
2097 *ToElementTypeOrErr,
T->getNumRows(),
T->getNumColumns());
2100ExpectedType clang::ASTNodeImporter::VisitDependentAddressSpaceType(
2101 const clang::DependentAddressSpaceType *
T) {
2102 Error Err = Error::success();
2104 Expr *ToAddrSpaceExpr = importChecked(Err,
T->getAddrSpaceExpr());
2105 SourceLocation ToAttrLoc = importChecked(Err,
T->getAttributeLoc());
2107 return std::move(Err);
2109 return Importer.getToContext().getDependentAddressSpaceType(
2110 ToPointeeType, ToAddrSpaceExpr, ToAttrLoc);
2113ExpectedType clang::ASTNodeImporter::VisitDependentBitIntType(
2114 const clang::DependentBitIntType *
T) {
2115 ExpectedExpr ToNumBitsExprOrErr =
import(
T->getNumBitsExpr());
2116 if (!ToNumBitsExprOrErr)
2117 return ToNumBitsExprOrErr.takeError();
2118 return Importer.getToContext().getDependentBitIntType(
T->isUnsigned(),
2119 *ToNumBitsExprOrErr);
2122ExpectedType clang::ASTNodeImporter::VisitPredefinedSugarType(
2123 const clang::PredefinedSugarType *
T) {
2124 return Importer.getToContext().getPredefinedSugarType(
T->getKind());
2127ExpectedType clang::ASTNodeImporter::VisitDependentSizedMatrixType(
2128 const clang::DependentSizedMatrixType *
T) {
2129 Error Err = Error::success();
2130 QualType ToElementType = importChecked(Err,
T->getElementType());
2131 Expr *ToRowExpr = importChecked(Err,
T->getRowExpr());
2132 Expr *ToColumnExpr = importChecked(Err,
T->getColumnExpr());
2133 SourceLocation ToAttrLoc = importChecked(Err,
T->getAttributeLoc());
2135 return std::move(Err);
2137 return Importer.getToContext().getDependentSizedMatrixType(
2138 ToElementType, ToRowExpr, ToColumnExpr, ToAttrLoc);
2141ExpectedType clang::ASTNodeImporter::VisitDependentVectorType(
2142 const clang::DependentVectorType *
T) {
2143 Error Err = Error::success();
2144 QualType ToElementType = importChecked(Err,
T->getElementType());
2145 Expr *ToSizeExpr = importChecked(Err,
T->getSizeExpr());
2146 SourceLocation ToAttrLoc = importChecked(Err,
T->getAttributeLoc());
2148 return std::move(Err);
2150 return Importer.getToContext().getDependentVectorType(
2151 ToElementType, ToSizeExpr, ToAttrLoc,
T->getVectorKind());
2154ExpectedType clang::ASTNodeImporter::VisitObjCTypeParamType(
2155 const clang::ObjCTypeParamType *
T) {
2156 Expected<ObjCTypeParamDecl *> ToDeclOrErr =
import(
T->getDecl());
2158 return ToDeclOrErr.takeError();
2160 SmallVector<ObjCProtocolDecl *, 4> ToProtocols;
2161 for (ObjCProtocolDecl *FromProtocol :
T->getProtocols()) {
2162 Expected<ObjCProtocolDecl *> ToProtocolOrErr =
import(FromProtocol);
2163 if (!ToProtocolOrErr)
2164 return ToProtocolOrErr.takeError();
2165 ToProtocols.push_back(*ToProtocolOrErr);
2168 return Importer.getToContext().getObjCTypeParamType(*ToDeclOrErr,
2172ExpectedType clang::ASTNodeImporter::VisitPipeType(
const clang::PipeType *
T) {
2173 ExpectedType ToElementTypeOrErr =
import(
T->getElementType());
2174 if (!ToElementTypeOrErr)
2175 return ToElementTypeOrErr.takeError();
2177 ASTContext &ToCtx = Importer.getToContext();
2178 if (
T->isReadOnly())
2198 if (
isa<RecordDecl>(D) && (FunDecl = dyn_cast<FunctionDecl>(OrigDC)) &&
2200 auto getLeafPointeeType = [](
const Type *
T) {
2201 while (
T->isPointerType() ||
T->isArrayType()) {
2202 T =
T->getPointeeOrArrayElementType();
2208 getLeafPointeeType(
P->getType().getCanonicalType().getTypePtr());
2209 auto *RT = dyn_cast<RecordType>(LeafT);
2210 if (RT && RT->getDecl() == D) {
2211 Importer.FromDiag(D->
getLocation(), diag::err_unsupported_ast_node)
2230 ToD = cast_or_null<NamedDecl>(Importer.GetAlreadyImportedOrNull(D));
2235 return Error::success();
2249 ToD = cast_or_null<NamedDecl>(Importer.GetAlreadyImportedOrNull(D));
2254 return Error::success();
2259 return Error::success();
2265 if (
RecordDecl *FromRecord = dyn_cast<RecordDecl>(FromD)) {
2267 if (FromRecord->getDefinition() && FromRecord->isCompleteDefinition() &&
2268 !ToRecord->getDefinition()) {
2273 return Error::success();
2276 if (
EnumDecl *FromEnum = dyn_cast<EnumDecl>(FromD)) {
2278 if (FromEnum->getDefinition() && !ToEnum->getDefinition()) {
2283 return Error::success();
2286 return Error::success();
2301 return Error::success();
2307 return ToRangeOrErr.takeError();
2308 return Error::success();
2314 return LocOrErr.takeError();
2315 return Error::success();
2323 return ToTInfoOrErr.takeError();
2324 return Error::success();
2327 llvm_unreachable(
"Unknown name kind.");
2332 if (Importer.isMinimalImport() && !ForceImport) {
2333 auto ToDCOrErr = Importer.ImportContext(FromDC);
2334 return ToDCOrErr.takeError();
2348 auto MightNeedReordering = [](
const Decl *D) {
2353 Error ChildErrors = Error::success();
2354 for (
auto *From : FromDC->
decls()) {
2355 if (!MightNeedReordering(From))
2364 if (!ImportedOrErr) {
2366 ImportedOrErr.takeError());
2369 FieldDecl *FieldFrom = dyn_cast_or_null<FieldDecl>(From);
2370 Decl *ImportedDecl = *ImportedOrErr;
2371 FieldDecl *FieldTo = dyn_cast_or_null<FieldDecl>(ImportedDecl);
2372 if (FieldFrom && FieldTo) {
2402 auto ToDCOrErr = Importer.ImportContext(FromDC);
2404 consumeError(std::move(ChildErrors));
2405 return ToDCOrErr.takeError();
2408 if (
const auto *FromRD = dyn_cast<RecordDecl>(FromDC)) {
2412 for (
auto *D : FromRD->decls()) {
2413 if (!MightNeedReordering(D))
2416 assert(D &&
"DC contains a null decl");
2417 if (
Decl *ToD = Importer.GetAlreadyImportedOrNull(D)) {
2419 assert(ToDC == ToD->getLexicalDeclContext() && ToDC->
containsDecl(ToD));
2431 for (
auto *From : FromDC->
decls()) {
2432 if (MightNeedReordering(From))
2438 ImportedOrErr.takeError());
2458 if (!FromRecordDecl || !ToRecordDecl) {
2459 const RecordType *RecordFrom = FromType->
getAs<RecordType>();
2460 const RecordType *RecordTo = ToType->
getAs<RecordType>();
2462 if (RecordFrom && RecordTo) {
2463 FromRecordDecl = RecordFrom->getDecl();
2464 ToRecordDecl = RecordTo->getDecl();
2468 if (FromRecordDecl && ToRecordDecl) {
2474 return Error::success();
2479 auto ToDCOrErr = Importer.ImportContext(FromD->
getDeclContext());
2481 return ToDCOrErr.takeError();
2485 auto ToLexicalDCOrErr = Importer.ImportContext(
2487 if (!ToLexicalDCOrErr)
2488 return ToLexicalDCOrErr.takeError();
2489 ToLexicalDC = *ToLexicalDCOrErr;
2493 return Error::success();
2499 "Import implicit methods to or from non-definition");
2502 if (FromM->isImplicit()) {
2505 return ToMOrErr.takeError();
2508 return Error::success();
2517 return ToTypedefOrErr.takeError();
2519 return Error::success();
2524 auto DefinitionCompleter = [To]() {
2545 ToCaptures.reserve(FromCXXRD->capture_size());
2546 for (
const auto &FromCapture : FromCXXRD->captures()) {
2547 if (
auto ToCaptureOrErr =
import(FromCapture))
2548 ToCaptures.push_back(*ToCaptureOrErr);
2550 return ToCaptureOrErr.takeError();
2559 DefinitionCompleter();
2563 return Error::success();
2573 if (!Importer.isMinimalImport())
2578 llvm::scope_exit DefinitionCompleterScopeExit(DefinitionCompleter);
2584 auto *ToCXX = dyn_cast<CXXRecordDecl>(To);
2585 auto *FromCXX = dyn_cast<CXXRecordDecl>(From);
2586 if (ToCXX && FromCXX && ToCXX->dataPtr() && FromCXX->dataPtr()) {
2588 struct CXXRecordDecl::DefinitionData &ToData = ToCXX->data();
2589 struct CXXRecordDecl::DefinitionData &FromData = FromCXX->data();
2591 #define FIELD(Name, Width, Merge) \
2592 ToData.Name = FromData.Name;
2593 #include "clang/AST/CXXRecordDeclDefinitionBits.def"
2596 ToCXX->setArgPassingRestrictions(FromCXX->getArgPassingRestrictions());
2599 for (
const auto &Base1 : FromCXX->bases()) {
2602 return TyOrErr.takeError();
2605 if (Base1.isPackExpansion()) {
2606 if (
ExpectedSLoc LocOrErr =
import(Base1.getEllipsisLoc()))
2607 EllipsisLoc = *LocOrErr;
2609 return LocOrErr.takeError();
2617 auto RangeOrErr =
import(Base1.getSourceRange());
2619 return RangeOrErr.takeError();
2621 auto TSIOrErr =
import(Base1.getTypeSourceInfo());
2623 return TSIOrErr.takeError();
2629 Base1.isBaseOfClass(),
2630 Base1.getAccessSpecifierAsWritten(),
2635 ToCXX->setBases(Bases.data(), Bases.size());
2643 return Error::success();
2648 return Error::success();
2652 return Error::success();
2656 return ToInitOrErr.takeError();
2667 return Error::success();
2675 return Error::success();
2684 import(
QualType(Importer.getFromContext().getCanonicalTagType(From)));
2686 return ToTypeOrErr.takeError();
2689 if (!ToPromotionTypeOrErr)
2690 return ToPromotionTypeOrErr.takeError();
2701 return Error::success();
2707 for (
const auto &Arg : FromArgs) {
2708 if (
auto ToOrErr =
import(Arg))
2709 ToArgs.push_back(*ToOrErr);
2711 return ToOrErr.takeError();
2714 return Error::success();
2720 return import(From);
2723template <
typename InContainerTy>
2726 for (
const auto &FromLoc : Container) {
2727 if (
auto ToLocOrErr =
import(FromLoc))
2730 return ToLocOrErr.takeError();
2732 return Error::success();
2742 bool IgnoreTemplateParmDepth) {
2745 Decl *ToOrigin = Importer.GetOriginalDecl(To);
2751 Importer.getToContext().getLangOpts(), Importer.getFromContext(),
2752 Importer.getToContext(), Importer.getNonEquivalentDecls(),
2754 false, Complain,
false,
2755 IgnoreTemplateParmDepth);
2760 Importer.FromDiag(D->
getLocation(), diag::err_unsupported_ast_node)
2766 Importer.FromDiag(D->
getLocation(), diag::err_unsupported_ast_node)
2775 return std::move(Err);
2780 return LocOrErr.takeError();
2783 if (GetImportedOrCreateDecl(ToD, D, Importer.getToContext(), DC, *LocOrErr))
2795 Importer.MapImported(D, ToD);
2801 Error Err = Error::success();
2806 return std::move(Err);
2810 return DCOrErr.takeError();
2814 if (GetImportedOrCreateDecl(ToD, D, Importer.getToContext(), DC, ToAsmString,
2815 ToAsmLoc, ToRParenLoc))
2830 return std::move(Err);
2835 if (GetImportedOrCreateDecl(ToD, D, Importer.getToContext(), DC, Loc,
2839 Error Err = Error::success();
2845 return std::move(Err);
2849 addDeclToContexts(D, ToD);
2857 return LocOrErr.takeError();
2860 return ColonLocOrErr.takeError();
2865 return DCOrErr.takeError();
2869 if (GetImportedOrCreateDecl(ToD, D, Importer.getToContext(), D->
getAccess(),
2870 DC, *LocOrErr, *ColonLocOrErr))
2884 return DCOrErr.takeError();
2888 Error Err = Error::success();
2894 return std::move(Err);
2897 if (GetImportedOrCreateDecl(
2898 ToD, D, Importer.getToContext(), DC, ToLocation, ToAssertExpr, ToMessage,
2911 return DCOrErr.takeError();
2915 Error Err = Error::success();
2921 return std::move(Err);
2924 if (GetImportedOrCreateDecl(ToD, D, Importer.getToContext(), DC, ToLocation,
2942 return std::move(Err);
2951 if (
auto *TU = dyn_cast<TranslationUnitDecl>(EnclosingDC))
2954 MergeWithNamespace =
2958 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
2959 for (
auto *FoundDecl : FoundDecls) {
2963 if (
auto *FoundNS = dyn_cast<NamespaceDecl>(FoundDecl)) {
2964 MergeWithNamespace = FoundNS;
2965 ConflictingDecls.clear();
2969 ConflictingDecls.push_back(FoundDecl);
2972 if (!ConflictingDecls.empty()) {
2975 ConflictingDecls.size());
2977 Name = NameOrErr.get();
2979 return NameOrErr.takeError();
2985 return BeginLocOrErr.takeError();
2987 if (!RBraceLocOrErr)
2988 return RBraceLocOrErr.takeError();
2993 if (GetImportedOrCreateDecl(ToNamespace, D, Importer.getToContext(), DC,
2994 D->
isInline(), *BeginLocOrErr, Loc,
3005 if (
auto *TU = dyn_cast<TranslationUnitDecl>(DC))
3006 TU->setAnonymousNamespace(ToNamespace);
3011 Importer.MapImported(D, ToNamespace);
3014 return std::move(Err);
3026 return std::move(Err);
3032 Error Err = Error::success();
3039 return std::move(Err);
3044 if (GetImportedOrCreateDecl(
3045 ToD, D, Importer.getToContext(), DC, ToNamespaceLoc, ToAliasLoc,
3046 ToIdentifier, ToQualifierLoc, ToTargetNameLoc, ToNamespace))
3064 return std::move(Err);
3071 cast_or_null<DeclContext>(Importer.GetAlreadyImportedOrNull(
3083 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
3084 for (
auto *FoundDecl : FoundDecls) {
3085 if (!FoundDecl->isInIdentifierNamespace(IDNS))
3087 if (
auto *FoundTypedef = dyn_cast<TypedefNameDecl>(FoundDecl)) {
3092 QualType FoundUT = FoundTypedef->getUnderlyingType();
3093 if (Importer.IsStructurallyEquivalent(FromUT, FoundUT)) {
3106 if (FromR && FoundR &&
3113 return Importer.MapImported(D, FoundTypedef);
3117 ConflictingDecls.push_back(FoundDecl);
3122 if (!ConflictingDecls.empty()) {
3124 Name, DC, IDNS, ConflictingDecls.data(), ConflictingDecls.size());
3126 Name = NameOrErr.get();
3128 return NameOrErr.takeError();
3132 Error Err = Error::success();
3137 return std::move(Err);
3144 if (GetImportedOrCreateDecl<TypeAliasDecl>(
3145 ToTypedef, D, Importer.getToContext(), DC, ToBeginLoc, Loc,
3148 }
else if (GetImportedOrCreateDecl<TypedefDecl>(
3149 ToTypedef, D, Importer.getToContext(), DC, ToBeginLoc, Loc,
3155 return std::move(Err);
3159 Importer.AddToLookupTable(ToTypedef);
3187 return std::move(Err);
3197 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
3198 for (
auto *FoundDecl : FoundDecls) {
3199 if (!FoundDecl->isInIdentifierNamespace(IDNS))
3201 if (
auto *FoundAlias = dyn_cast<TypeAliasTemplateDecl>(FoundDecl)) {
3203 return Importer.MapImported(D, FoundAlias);
3204 ConflictingDecls.push_back(FoundDecl);
3208 if (!ConflictingDecls.empty()) {
3210 Name, DC, IDNS, ConflictingDecls.data(), ConflictingDecls.size());
3212 Name = NameOrErr.get();
3214 return NameOrErr.takeError();
3218 Error Err = Error::success();
3222 return std::move(Err);
3225 if (GetImportedOrCreateDecl(ToAlias, D, Importer.getToContext(), DC, Loc,
3226 Name, ToTemplateParameters, ToTemplatedDecl))
3229 ToTemplatedDecl->setDescribedAliasTemplate(ToAlias);
3234 if (DC != Importer.getToContext().getTranslationUnitDecl())
3235 updateLookupTableForTemplateParameters(*ToTemplateParameters);
3246 return std::move(Err);
3256 return BeginLocOrErr.takeError();
3257 if (GetImportedOrCreateDecl(ToLabel, D, Importer.getToContext(), DC, Loc,
3262 if (GetImportedOrCreateDecl(ToLabel, D, Importer.getToContext(), DC, Loc,
3270 return ToStmtOrErr.takeError();
3272 ToLabel->
setStmt(*ToStmtOrErr);
3285 return std::move(Err);
3295 return std::move(Err);
3297 }
else if (Importer.getToContext().getLangOpts().CPlusPlus)
3305 Importer.findDeclsInToCtx(DC, SearchName);
3306 for (
auto *FoundDecl : FoundDecls) {
3307 if (!FoundDecl->isInIdentifierNamespace(IDNS))
3310 if (
auto *
Typedef = dyn_cast<TypedefNameDecl>(FoundDecl)) {
3311 if (
const auto *Tag =
Typedef->getUnderlyingType()->getAs<TagType>())
3312 FoundDecl = Tag->getDecl();
3315 if (
auto *FoundEnum = dyn_cast<EnumDecl>(FoundDecl)) {
3321 return Importer.MapImported(D, FoundDef);
3325 ConflictingDecls.push_back(FoundDecl);
3334 if (SearchName && !ConflictingDecls.empty()) {
3336 SearchName, DC, IDNS, ConflictingDecls.data(),
3337 ConflictingDecls.size());
3339 Name = NameOrErr.get();
3341 return NameOrErr.takeError();
3345 Error Err = Error::success();
3351 return std::move(Err);
3355 if (GetImportedOrCreateDecl(
3356 D2, D, Importer.getToContext(), DC, ToBeginLoc,
3366 addDeclToContexts(D, D2);
3372 D2->setInstantiationOfMemberEnum(*ToInstOrErr, SK);
3374 return ToInstOrErr.takeError();
3375 if (
ExpectedSLoc POIOrErr =
import(MemberInfo->getPointOfInstantiation()))
3378 return POIOrErr.takeError();
3384 return std::move(Err);
3390 bool IsFriendTemplate =
false;
3391 if (
auto *DCXX = dyn_cast<CXXRecordDecl>(D)) {
3393 DCXX->getDescribedClassTemplate() &&
3394 DCXX->getDescribedClassTemplate()->getFriendObjectKind() !=
3404 return std::move(Err);
3414 return std::move(Err);
3416 }
else if (Importer.getToContext().getLangOpts().CPlusPlus)
3421 bool DependentFriend = IsFriendTemplate && IsDependentContext;
3428 Importer.findDeclsInToCtx(DC, SearchName);
3429 if (!FoundDecls.empty()) {
3436 for (
auto *FoundDecl : FoundDecls) {
3437 if (!FoundDecl->isInIdentifierNamespace(IDNS))
3441 if (
auto *
Typedef = dyn_cast<TypedefNameDecl>(
Found)) {
3442 if (
const auto *Tag =
Typedef->getUnderlyingType()->getAs<TagType>())
3443 Found = Tag->getDecl();
3446 if (
auto *FoundRecord = dyn_cast<RecordDecl>(
Found)) {
3468 Importer.MapImported(D, FoundDef);
3469 if (
const auto *DCXX = dyn_cast<CXXRecordDecl>(D)) {
3470 auto *FoundCXX = dyn_cast<CXXRecordDecl>(FoundDef);
3471 assert(FoundCXX &&
"Record type mismatch");
3473 if (!Importer.isMinimalImport())
3477 return std::move(Err);
3484 ConflictingDecls.push_back(FoundDecl);
3488 if (!ConflictingDecls.empty() && SearchName) {
3490 SearchName, DC, IDNS, ConflictingDecls.data(),
3491 ConflictingDecls.size());
3493 Name = NameOrErr.get();
3495 return NameOrErr.takeError();
3501 return BeginLocOrErr.takeError();
3506 if (
auto *DCXX = dyn_cast<CXXRecordDecl>(D)) {
3507 if (DCXX->isLambda()) {
3508 auto TInfoOrErr =
import(DCXX->getLambdaTypeInfo());
3510 return TInfoOrErr.takeError();
3511 if (GetImportedOrCreateSpecialDecl(
3513 DC, *TInfoOrErr, Loc, DCXX->getLambdaDependencyKind(),
3514 DCXX->isGenericLambda(), DCXX->getLambdaCaptureDefault()))
3516 Decl *ContextDecl = DCXX->getLambdaContextDecl();
3519 return CDeclOrErr.takeError();
3520 if (ContextDecl !=
nullptr) {
3525 if (GetImportedOrCreateDecl(D2CXX, D, Importer.getToContext(),
3528 cast_or_null<CXXRecordDecl>(PrevDecl)))
3535 addDeclToContexts(D, D2);
3538 DCXX->getDescribedClassTemplate()) {
3541 return std::move(Err);
3544 DCXX->getMemberSpecializationInfo()) {
3546 MemberInfo->getTemplateSpecializationKind();
3552 return ToInstOrErr.takeError();
3555 import(MemberInfo->getPointOfInstantiation()))
3559 return POIOrErr.takeError();
3563 if (GetImportedOrCreateDecl(D2, D, Importer.getToContext(),
3568 addDeclToContexts(D, D2);
3574 return BraceRangeOrErr.takeError();
3578 return QualifierLocOrErr.takeError();
3585 return std::move(Err);
3597 return std::move(Err);
3606 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
3607 for (
auto *FoundDecl : FoundDecls) {
3608 if (!FoundDecl->isInIdentifierNamespace(IDNS))
3611 if (
auto *FoundEnumConstant = dyn_cast<EnumConstantDecl>(FoundDecl)) {
3613 return Importer.MapImported(D, FoundEnumConstant);
3614 ConflictingDecls.push_back(FoundDecl);
3618 if (!ConflictingDecls.empty()) {
3620 Name, DC, IDNS, ConflictingDecls.data(), ConflictingDecls.size());
3622 Name = NameOrErr.get();
3624 return NameOrErr.takeError();
3630 return TypeOrErr.takeError();
3634 return InitOrErr.takeError();
3637 if (GetImportedOrCreateDecl(
3638 ToEnumerator, D, Importer.getToContext(),
cast<EnumDecl>(DC), Loc,
3640 return ToEnumerator;
3645 return ToEnumerator;
3648template <
typename DeclTy>
3652 FromD->getTemplateParameterLists();
3653 if (FromTPLs.empty())
3654 return Error::success();
3656 for (
unsigned int I = 0; I < FromTPLs.size(); ++I)
3658 ToTPLists[I] = *ToTPListOrErr;
3660 return ToTPListOrErr.takeError();
3661 ToD->setTemplateParameterListsInfo(Importer.ToContext, ToTPLists);
3662 return Error::success();
3670 return Error::success();
3676 return Error::success();
3682 ToFD->setInstantiationOfMemberFunction(*InstFDOrErr, TSK);
3684 return InstFDOrErr.takeError();
3690 return POIOrErr.takeError();
3692 return Error::success();
3696 auto FunctionAndArgsOrErr =
3698 if (!FunctionAndArgsOrErr)
3699 return FunctionAndArgsOrErr.takeError();
3702 Importer.getToContext(), std::get<1>(*FunctionAndArgsOrErr));
3706 const auto *FromTAArgsAsWritten = FTSInfo->TemplateArgumentsAsWritten;
3707 if (FromTAArgsAsWritten)
3709 *FromTAArgsAsWritten, ToTAInfo))
3712 ExpectedSLoc POIOrErr =
import(FTSInfo->getPointOfInstantiation());
3714 return POIOrErr.takeError();
3720 ToFD->setFunctionTemplateSpecialization(
3721 std::get<0>(*FunctionAndArgsOrErr), ToTAList,
nullptr,
3722 TSK, FromTAArgsAsWritten ? &ToTAInfo :
nullptr, *POIOrErr);
3723 return Error::success();
3731 Candidates.
addDecl(*ToFTDOrErr);
3733 return ToFTDOrErr.takeError();
3738 const auto *FromTAArgsAsWritten = FromInfo->TemplateArgumentsAsWritten;
3739 if (FromTAArgsAsWritten)
3745 Importer.getToContext(), Candidates,
3746 FromTAArgsAsWritten ? &ToTAInfo :
nullptr);
3747 return Error::success();
3750 llvm_unreachable(
"All cases should be covered!");
3755 auto FunctionAndArgsOrErr =
3757 if (!FunctionAndArgsOrErr)
3758 return FunctionAndArgsOrErr.takeError();
3762 std::tie(
Template, ToTemplArgs) = *FunctionAndArgsOrErr;
3763 void *InsertPos =
nullptr;
3764 auto *FoundSpec =
Template->findSpecialization(ToTemplArgs, InsertPos);
3774 return ToBodyOrErr.takeError();
3776 return Error::success();
3783 ExplicitExpr = importChecked(Err, ESpec.
getExpr());
3790 auto RedeclIt = Redecls.begin();
3793 for (; RedeclIt != Redecls.end() && *RedeclIt != D; ++RedeclIt) {
3796 return ToRedeclOrErr.takeError();
3798 assert(*RedeclIt == D);
3806 return std::move(Err);
3821 if (!FoundFunctionOrErr)
3822 return FoundFunctionOrErr.takeError();
3823 if (
FunctionDecl *FoundFunction = *FoundFunctionOrErr) {
3824 if (
Decl *Def = FindAndMapDefinition(D, FoundFunction))
3826 FoundByLookup = FoundFunction;
3834 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
3835 for (
auto *FoundDecl : FoundDecls) {
3836 if (!FoundDecl->isInIdentifierNamespace(IDNS))
3839 if (
auto *FoundFunction = dyn_cast<FunctionDecl>(FoundDecl)) {
3844 if (
Decl *Def = FindAndMapDefinition(D, FoundFunction))
3846 FoundByLookup = FoundFunction;
3853 if (Importer.getToContext().getLangOpts().CPlusPlus)
3857 Importer.ToDiag(Loc, diag::warn_odr_function_type_inconsistent)
3858 << Name << D->
getType() << FoundFunction->getType();
3859 Importer.ToDiag(FoundFunction->getLocation(), diag::note_odr_value_here)
3860 << FoundFunction->getType();
3861 ConflictingDecls.push_back(FoundDecl);
3865 if (!ConflictingDecls.empty()) {
3867 Name, DC, IDNS, ConflictingDecls.data(), ConflictingDecls.size());
3869 Name = NameOrErr.get();
3871 return NameOrErr.takeError();
3881 if (FoundByLookup) {
3891 "Templated function mapped to non-templated?");
3892 Importer.MapImported(DescribedD,
3895 return Importer.MapImported(D, FoundByLookup);
3907 return std::move(Err);
3918 bool UsedDifferentProtoType =
false;
3920 QualType FromReturnTy = FromFPT->getReturnType();
3928 if (Importer.FindFunctionDeclImportCycle.isCycle(D)) {
3929 FromReturnTy = Importer.getFromContext().VoidTy;
3930 UsedDifferentProtoType =
true;
3941 FromEPI = DefaultEPI;
3942 UsedDifferentProtoType =
true;
3944 FromTy = Importer.getFromContext().getFunctionType(
3945 FromReturnTy, FromFPT->getParamTypes(), FromEPI);
3946 FromTSI = Importer.getFromContext().getTrivialTypeSourceInfo(
3950 Error Err = Error::success();
3951 auto ScopedReturnTypeDeclCycleDetector =
3952 Importer.FindFunctionDeclImportCycle.makeScopedCycleDetection(D);
3963 return std::move(Err);
3969 Parameters.push_back(*ToPOrErr);
3971 return ToPOrErr.takeError();
3976 if (
auto *FromConstructor = dyn_cast<CXXConstructorDecl>(D)) {
3978 importExplicitSpecifier(Err, FromConstructor->getExplicitSpecifier());
3980 return std::move(Err);
3982 if (FromConstructor->isInheritingConstructor()) {
3984 import(FromConstructor->getInheritedConstructor());
3985 if (!ImportedInheritedCtor)
3986 return ImportedInheritedCtor.takeError();
3987 ToInheritedConstructor = *ImportedInheritedCtor;
3989 if (GetImportedOrCreateDecl<CXXConstructorDecl>(
3991 ToInnerLocStart, NameInfo,
T, TInfo, ESpec, D->
UsesFPIntrin(),
3993 ToInheritedConstructor, TrailingRequiresClause))
3997 Error Err = Error::success();
3999 Err,
const_cast<FunctionDecl *
>(FromDtor->getOperatorDelete()));
4000 auto ToThisArg =
importChecked(Err, FromDtor->getOperatorDeleteThisArg());
4002 return std::move(Err);
4004 if (GetImportedOrCreateDecl<CXXDestructorDecl>(
4008 TrailingRequiresClause))
4015 dyn_cast<CXXConversionDecl>(D)) {
4017 importExplicitSpecifier(Err, FromConversion->getExplicitSpecifier());
4019 return std::move(Err);
4020 if (GetImportedOrCreateDecl<CXXConversionDecl>(
4026 }
else if (
auto *
Method = dyn_cast<CXXMethodDecl>(D)) {
4027 if (GetImportedOrCreateDecl<CXXMethodDecl>(
4029 ToInnerLocStart, NameInfo,
T, TInfo,
Method->getStorageClass(),
4033 }
else if (
auto *Guide = dyn_cast<CXXDeductionGuideDecl>(D)) {
4035 importExplicitSpecifier(Err, Guide->getExplicitSpecifier());
4041 return std::move(Err);
4042 if (GetImportedOrCreateDecl<CXXDeductionGuideDecl>(
4043 ToFunction, D, Importer.getToContext(), DC, ToInnerLocStart, ESpec,
4044 NameInfo,
T, TInfo, ToEndLoc, Ctor,
4045 Guide->getDeductionCandidateKind(), TrailingRequiresClause,
4049 if (GetImportedOrCreateDecl(
4050 ToFunction, D, Importer.getToContext(), DC, ToInnerLocStart,
4058 if (FoundByLookup) {
4108 Importer.getToContext(), Lookups, Info->getFPFeatures(), Msg));
4112 for (
auto *Param : Parameters) {
4113 Param->setOwningFunction(ToFunction);
4116 LT->update(Param, Importer.getToContext().getTranslationUnitDecl());
4118 ToFunction->setParams(Parameters);
4125 for (
unsigned I = 0, N = Parameters.size(); I != N; ++I)
4126 ProtoLoc.setParam(I, Parameters[I]);
4132 auto ToFTOrErr =
import(FromFT);
4134 return ToFTOrErr.takeError();
4138 if (
auto *FromConstructor = dyn_cast<CXXConstructorDecl>(D)) {
4139 if (
unsigned NumInitializers = FromConstructor->getNumCtorInitializers()) {
4143 FromConstructor->inits(), CtorInitializers))
4144 return std::move(Err);
4147 llvm::copy(CtorInitializers, Memory);
4149 ToCtor->setCtorInitializers(Memory);
4150 ToCtor->setNumCtorInitializers(NumInitializers);
4156 return std::move(Err);
4158 if (
auto *FromCXXMethod = dyn_cast<CXXMethodDecl>(D))
4161 return std::move(Err);
4167 return std::move(Err);
4171 if (UsedDifferentProtoType) {
4173 ToFunction->
setType(*TyOrErr);
4175 return TyOrErr.takeError();
4179 return TSIOrErr.takeError();
4184 addDeclToContexts(D, ToFunction);
4187 for (++RedeclIt; RedeclIt != Redecls.end(); ++RedeclIt) {
4190 return ToRedeclOrErr.takeError();
4224 return std::move(Err);
4229 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
4230 for (
auto *FoundDecl : FoundDecls) {
4231 if (
FieldDecl *FoundField = dyn_cast<FieldDecl>(FoundDecl)) {
4238 if (Importer.IsStructurallyEquivalent(D->
getType(),
4239 FoundField->getType())) {
4240 Importer.MapImported(D, FoundField);
4248 if (
ExpectedExpr ToInitializerOrErr =
import(FromInitializer)) {
4251 assert(FoundField->hasInClassInitializer() &&
4252 "Field should have an in-class initializer if it has an "
4253 "expression for it.");
4254 if (!FoundField->getInClassInitializer())
4255 FoundField->setInClassInitializer(*ToInitializerOrErr);
4257 return ToInitializerOrErr.takeError();
4264 Importer.ToDiag(Loc, diag::warn_odr_field_type_inconsistent)
4265 << Name << D->
getType() << FoundField->getType();
4266 Importer.ToDiag(FoundField->getLocation(), diag::note_odr_value_here)
4267 << FoundField->getType();
4273 Error Err = Error::success();
4279 return std::move(Err);
4280 const Type *ToCapturedVLAType =
nullptr;
4281 if (
Error Err = Importer.importInto(
4283 return std::move(Err);
4286 if (GetImportedOrCreateDecl(ToField, D, Importer.getToContext(), DC,
4288 ToType, ToTInfo, ToBitWidth, D->
isMutable(),
4295 if (ToCapturedVLAType)
4302 return std::move(Err);
4303 if (ToInitializer) {
4305 if (AlreadyImported)
4306 assert(ToInitializer == AlreadyImported &&
4307 "Duplicate import of in-class initializer.");
4322 return std::move(Err);
4327 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
4328 for (
unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
4329 if (
auto *FoundField = dyn_cast<IndirectFieldDecl>(FoundDecls[I])) {
4336 if (Importer.IsStructurallyEquivalent(D->
getType(),
4337 FoundField->getType(),
4339 Importer.MapImported(D, FoundField);
4344 if (!Name && I < N-1)
4348 Importer.ToDiag(Loc, diag::warn_odr_field_type_inconsistent)
4349 << Name << D->
getType() << FoundField->getType();
4350 Importer.ToDiag(FoundField->getLocation(), diag::note_odr_value_here)
4351 << FoundField->getType();
4358 auto TypeOrErr =
import(D->
getType());
4360 return TypeOrErr.takeError();
4366 for (
auto *PI : D->
chain())
4368 NamedChain[i++] = *ToD;
4370 return ToD.takeError();
4374 if (GetImportedOrCreateDecl(ToIndirectField, D, Importer.getToContext(), DC,
4377 return ToIndirectField;
4382 return ToIndirectField;
4413 unsigned int FriendCount = 0;
4417 for (
FriendDecl *FoundFriend : RD->friends()) {
4418 if (FoundFriend == FD) {
4419 FriendPosition = FriendCount;
4426 assert(FriendPosition &&
"Friend decl not found in own parent.");
4428 return {FriendCount, *FriendPosition};
4435 return std::move(Err);
4442 for (
FriendDecl *ImportedFriend : RD->friends())
4444 ImportedEquivalentFriends.push_back(ImportedFriend);
4449 assert(ImportedEquivalentFriends.size() <= CountAndPosition.
TotalCount &&
4450 "Class with non-matching friends is imported, ODR check wrong?");
4451 if (ImportedEquivalentFriends.size() == CountAndPosition.
TotalCount)
4452 return Importer.MapImported(
4453 D, ImportedEquivalentFriends[CountAndPosition.
IndexOfDecl]);
4461 return std::move(Err);
4472 return TSIOrErr.takeError();
4476 auto **FromTPLists = D->getTrailingObjects();
4477 for (
unsigned I = 0; I < D->NumTPLists; I++) {
4478 if (
auto ListOrErr =
import(FromTPLists[I]))
4479 ToTPLists[I] = *ListOrErr;
4481 return ListOrErr.takeError();
4486 return LocationOrErr.takeError();
4488 if (!FriendLocOrErr)
4489 return FriendLocOrErr.takeError();
4491 if (!EllipsisLocOrErr)
4492 return EllipsisLocOrErr.takeError();
4495 if (GetImportedOrCreateDecl(FrD, D, Importer.getToContext(), DC,
4496 *LocationOrErr, ToFU, *FriendLocOrErr,
4497 *EllipsisLocOrErr, ToTPLists))
4513 return std::move(Err);
4518 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
4519 for (
auto *FoundDecl : FoundDecls) {
4520 if (
ObjCIvarDecl *FoundIvar = dyn_cast<ObjCIvarDecl>(FoundDecl)) {
4521 if (Importer.IsStructurallyEquivalent(D->
getType(),
4522 FoundIvar->getType())) {
4523 Importer.MapImported(D, FoundIvar);
4527 Importer.ToDiag(Loc, diag::warn_odr_ivar_type_inconsistent)
4528 << Name << D->
getType() << FoundIvar->getType();
4529 Importer.ToDiag(FoundIvar->getLocation(), diag::note_odr_value_here)
4530 << FoundIvar->getType();
4536 Error Err = Error::success();
4542 return std::move(Err);
4545 if (GetImportedOrCreateDecl(
4548 ToType, ToTypeSourceInfo,
4560 auto RedeclIt = Redecls.begin();
4563 for (; RedeclIt != Redecls.end() && *RedeclIt != D; ++RedeclIt) {
4566 return RedeclOrErr.takeError();
4568 assert(*RedeclIt == D);
4576 return std::move(Err);
4582 VarDecl *FoundByLookup =
nullptr;
4586 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
4587 for (
auto *FoundDecl : FoundDecls) {
4588 if (!FoundDecl->isInIdentifierNamespace(IDNS))
4591 if (
auto *FoundVar = dyn_cast<VarDecl>(FoundDecl)) {
4594 if (Importer.IsStructurallyEquivalent(D->
getType(),
4595 FoundVar->getType())) {
4603 return Importer.MapImported(D, FoundDef);
4607 const VarDecl *FoundDInit =
nullptr;
4608 if (D->
getInit() && FoundVar->getAnyInitializer(FoundDInit))
4610 return Importer.MapImported(D,
const_cast<VarDecl*
>(FoundDInit));
4612 FoundByLookup = FoundVar;
4617 = Importer.getToContext().getAsArrayType(FoundVar->getType());
4619 = Importer.getToContext().getAsArrayType(D->
getType());
4620 if (FoundArray && TArray) {
4624 if (
auto TyOrErr =
import(D->
getType()))
4625 FoundVar->setType(*TyOrErr);
4627 return TyOrErr.takeError();
4629 FoundByLookup = FoundVar;
4633 FoundByLookup = FoundVar;
4638 Importer.ToDiag(Loc, diag::warn_odr_variable_type_inconsistent)
4639 << Name << D->
getType() << FoundVar->getType();
4640 Importer.ToDiag(FoundVar->getLocation(), diag::note_odr_value_here)
4641 << FoundVar->getType();
4642 ConflictingDecls.push_back(FoundDecl);
4646 if (!ConflictingDecls.empty()) {
4648 Name, DC, IDNS, ConflictingDecls.data(), ConflictingDecls.size());
4650 Name = NameOrErr.get();
4652 return NameOrErr.takeError();
4656 Error Err = Error::success();
4662 return std::move(Err);
4665 if (
auto *FromDecomp = dyn_cast<DecompositionDecl>(D)) {
4669 return std::move(Err);
4671 if (GetImportedOrCreateDecl(
4672 ToDecomp, FromDecomp, Importer.getToContext(), DC, ToInnerLocStart,
4673 Loc, FromDecomp->getRSquareLoc(), ToType, ToTypeSourceInfo,
4679 if (GetImportedOrCreateDecl(ToVar, D, Importer.getToContext(), DC,
4680 ToInnerLocStart, Loc,
4695 if (FoundByLookup) {
4704 return ToVTOrErr.takeError();
4711 return ToInstOrErr.takeError();
4712 if (
ExpectedSLoc POIOrErr =
import(MSI->getPointOfInstantiation()))
4715 return POIOrErr.takeError();
4719 return std::move(Err);
4724 addDeclToContexts(D, ToVar);
4727 for (++RedeclIt; RedeclIt != Redecls.end(); ++RedeclIt) {
4730 return RedeclOrErr.takeError();
4739 DeclContext *DC = Importer.getToContext().getTranslationUnitDecl();
4741 Error Err = Error::success();
4746 return std::move(Err);
4750 if (GetImportedOrCreateDecl(ToParm, D, Importer.getToContext(), DC,
4751 ToLocation, ToDeclName.getAsIdentifierInfo(),
4763 return LocOrErr.takeError();
4772 return ToDefArgOrErr.takeError();
4776 if (
auto ToDefArgOrErr =
import(FromParam->
getDefaultArg()))
4779 return ToDefArgOrErr.takeError();
4782 return Error::success();
4787 Error Err = Error::success();
4792 return std::move(Err);
4799 DeclContext *DC = Importer.getToContext().getTranslationUnitDecl();
4801 Error Err = Error::success();
4808 return std::move(Err);
4811 if (GetImportedOrCreateDecl(ToParm, D, Importer.getToContext(), DC,
4812 ToInnerLocStart, ToLocation,
4813 ToDeclName.getAsIdentifierInfo(), ToType,
4822 return std::move(Err);
4842 return std::move(Err);
4846 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
4847 for (
auto *FoundDecl : FoundDecls) {
4848 if (
auto *FoundMethod = dyn_cast<ObjCMethodDecl>(FoundDecl)) {
4854 FoundMethod->getReturnType())) {
4855 Importer.ToDiag(Loc, diag::warn_odr_objc_method_result_type_inconsistent)
4857 << FoundMethod->getReturnType();
4858 Importer.ToDiag(FoundMethod->getLocation(),
4859 diag::note_odr_objc_method_here)
4866 if (D->
param_size() != FoundMethod->param_size()) {
4867 Importer.ToDiag(Loc, diag::warn_odr_objc_method_num_params_inconsistent)
4869 << D->
param_size() << FoundMethod->param_size();
4870 Importer.ToDiag(FoundMethod->getLocation(),
4871 diag::note_odr_objc_method_here)
4879 PEnd = D->
param_end(), FoundP = FoundMethod->param_begin();
4880 P != PEnd; ++
P, ++FoundP) {
4881 if (!Importer.IsStructurallyEquivalent((*P)->getType(),
4882 (*FoundP)->getType())) {
4883 Importer.FromDiag((*P)->getLocation(),
4884 diag::warn_odr_objc_method_param_type_inconsistent)
4886 << (*P)->getType() << (*FoundP)->getType();
4887 Importer.ToDiag((*FoundP)->getLocation(), diag::note_odr_value_here)
4888 << (*FoundP)->getType();
4896 if (D->
isVariadic() != FoundMethod->isVariadic()) {
4897 Importer.ToDiag(Loc, diag::warn_odr_objc_method_variadic_inconsistent)
4899 Importer.ToDiag(FoundMethod->getLocation(),
4900 diag::note_odr_objc_method_here)
4907 return Importer.MapImported(D, FoundMethod);
4911 Error Err = Error::success();
4914 auto ToReturnTypeSourceInfo =
4917 return std::move(Err);
4920 if (GetImportedOrCreateDecl(
4921 ToMethod, D, Importer.getToContext(), Loc, ToEndLoc,
4935 ToParams.push_back(*ToPOrErr);
4937 return ToPOrErr.takeError();
4941 for (
auto *ToParam : ToParams) {
4942 ToParam->setOwningFunction(ToMethod);
4950 return std::move(Err);
4952 ToMethod->
setMethodParams(Importer.getToContext(), ToParams, ToSelLocs);
4974 return std::move(Err);
4978 Error Err = Error::success();
4984 return std::move(Err);
4987 if (GetImportedOrCreateDecl(
4991 ToColonLoc, ToTypeSourceInfo))
4997 return std::move(Err);
4998 Result->setTypeForDecl(ToTypeForDecl);
4999 Result->setLexicalDeclContext(LexicalDC);
5010 return std::move(Err);
5016 return std::move(Err);
5024 Error Err = Error::success();
5030 return std::move(Err);
5032 if (GetImportedOrCreateDecl(ToCategory, D, Importer.getToContext(), DC,
5048 return PListOrErr.takeError();
5057 FromProto != FromProtoEnd;
5058 ++FromProto, ++FromProtoLoc) {
5060 Protocols.push_back(*ToProtoOrErr);
5062 return ToProtoOrErr.takeError();
5064 if (
ExpectedSLoc ToProtoLocOrErr =
import(*FromProtoLoc))
5065 ProtocolLocs.push_back(*ToProtoLocOrErr);
5067 return ToProtoLocOrErr.takeError();
5072 ProtocolLocs.data(), Importer.getToContext());
5075 Importer.MapImported(D, ToCategory);
5080 return std::move(Err);
5088 return ToImplOrErr.takeError();
5100 return Error::success();
5113 FromProto != FromProtoEnd;
5114 ++FromProto, ++FromProtoLoc) {
5116 Protocols.push_back(*ToProtoOrErr);
5118 return ToProtoOrErr.takeError();
5120 if (
ExpectedSLoc ToProtoLocOrErr =
import(*FromProtoLoc))
5121 ProtocolLocs.push_back(*ToProtoLocOrErr);
5123 return ToProtoLocOrErr.takeError();
5129 ProtocolLocs.data(), Importer.getToContext());
5136 return Error::success();
5146 return Importer.MapImported(D, *ImportedDefOrErr);
5148 return ImportedDefOrErr.takeError();
5157 return std::move(Err);
5162 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
5163 for (
auto *FoundDecl : FoundDecls) {
5167 if ((MergeWithProtocol = dyn_cast<ObjCProtocolDecl>(FoundDecl)))
5174 if (!ToAtBeginLocOrErr)
5175 return ToAtBeginLocOrErr.takeError();
5177 if (GetImportedOrCreateDecl(ToProto, D, Importer.getToContext(), DC,
5186 Importer.MapImported(D, ToProto);
5190 return std::move(Err);
5198 return std::move(Err);
5201 if (!ExternLocOrErr)
5202 return ExternLocOrErr.takeError();
5206 return LangLocOrErr.takeError();
5211 if (GetImportedOrCreateDecl(ToLinkageSpec, D, Importer.getToContext(), DC,
5212 *ExternLocOrErr, *LangLocOrErr,
5214 return ToLinkageSpec;
5218 if (!RBraceLocOrErr)
5219 return RBraceLocOrErr.takeError();
5226 return ToLinkageSpec;
5237 return ToShadowOrErr.takeError();
5248 return std::move(Err);
5252 Error Err = Error::success();
5257 return std::move(Err);
5261 return std::move(Err);
5264 if (GetImportedOrCreateDecl(ToUsing, D, Importer.getToContext(), DC,
5265 ToUsingLoc, ToQualifierLoc, NameInfo,
5273 Importer.getFromContext().getInstantiatedFromUsingDecl(D)) {
5275 Importer.getToContext().setInstantiatedFromUsingDecl(
5276 ToUsing, *ToPatternOrErr);
5278 return ToPatternOrErr.takeError();
5290 return std::move(Err);
5294 Error Err = Error::success();
5300 return std::move(Err);
5303 if (GetImportedOrCreateDecl(ToUsingEnum, D, Importer.getToContext(), DC,
5304 ToUsingLoc, ToEnumLoc, ToNameLoc, ToEnumType))
5311 Importer.getFromContext().getInstantiatedFromUsingEnumDecl(D)) {
5313 Importer.getToContext().setInstantiatedFromUsingEnumDecl(ToUsingEnum,
5316 return ToPatternOrErr.takeError();
5328 return std::move(Err);
5333 if (!ToIntroducerOrErr)
5334 return ToIntroducerOrErr.takeError();
5338 return ToTargetOrErr.takeError();
5341 if (
auto *FromConstructorUsingShadow =
5342 dyn_cast<ConstructorUsingShadowDecl>(D)) {
5343 Error Err = Error::success();
5345 Err, FromConstructorUsingShadow->getNominatedBaseClassShadowDecl());
5347 return std::move(Err);
5353 if (GetImportedOrCreateDecl<ConstructorUsingShadowDecl>(
5354 ToShadow, D, Importer.getToContext(), DC, Loc,
5356 Nominated ? Nominated : *ToTargetOrErr,
5357 FromConstructorUsingShadow->constructsVirtualBase()))
5360 if (GetImportedOrCreateDecl(ToShadow, D, Importer.getToContext(), DC, Loc,
5361 Name, *ToIntroducerOrErr, *ToTargetOrErr))
5369 Importer.getFromContext().getInstantiatedFromUsingShadowDecl(D)) {
5371 Importer.getToContext().setInstantiatedFromUsingShadowDecl(
5372 ToShadow, *ToPatternOrErr);
5376 return ToPatternOrErr.takeError();
5390 return std::move(Err);
5395 if (!ToComAncestorOrErr)
5396 return ToComAncestorOrErr.takeError();
5398 Error Err = Error::success();
5401 auto ToNamespaceKeyLocation =
5406 return std::move(Err);
5409 if (GetImportedOrCreateDecl(ToUsingDir, D, Importer.getToContext(), DC,
5411 ToNamespaceKeyLocation,
5414 ToNominatedNamespace, *ToComAncestorOrErr))
5429 return std::move(Err);
5433 auto ToInstantiatedFromUsingOrErr =
5435 if (!ToInstantiatedFromUsingOrErr)
5436 return ToInstantiatedFromUsingOrErr.takeError();
5439 return std::move(Err);
5442 if (GetImportedOrCreateDecl(ToUsingPack, D, Importer.getToContext(), DC,
5447 addDeclToContexts(D, ToUsingPack);
5459 return std::move(Err);
5463 Error Err = Error::success();
5469 return std::move(Err);
5473 return std::move(Err);
5476 if (GetImportedOrCreateDecl(ToUsingValue, D, Importer.getToContext(), DC,
5477 ToUsingLoc, ToQualifierLoc, NameInfo,
5479 return ToUsingValue;
5485 return ToUsingValue;
5495 return std::move(Err);
5499 Error Err = Error::success();
5505 return std::move(Err);
5508 if (GetImportedOrCreateDecl(ToUsing, D, Importer.getToContext(), DC,
5509 ToUsingLoc, ToTypenameLoc,
5510 ToQualifierLoc, Loc, Name, ToEllipsisLoc))
5521 Decl* ToD =
nullptr;
5523#define BuiltinTemplate(BTName) \
5524 case BuiltinTemplateKind::BTK##BTName: \
5525 ToD = Importer.getToContext().get##BTName##Decl(); \
5527#include "clang/Basic/BuiltinTemplates.inc"
5529 assert(ToD &&
"BuiltinTemplateDecl of unsupported kind!");
5530 Importer.MapImported(D, ToD);
5540 if (
auto FromSuperOrErr =
import(FromSuper))
5541 FromSuper = *FromSuperOrErr;
5543 return FromSuperOrErr.takeError();
5547 if ((
bool)FromSuper != (
bool)ToSuper ||
5550 diag::warn_odr_objc_superclass_inconsistent)
5557 diag::note_odr_objc_missing_superclass);
5560 diag::note_odr_objc_superclass)
5564 diag::note_odr_objc_missing_superclass);
5570 return Error::success();
5581 return SuperTInfoOrErr.takeError();
5592 FromProto != FromProtoEnd;
5593 ++FromProto, ++FromProtoLoc) {
5595 Protocols.push_back(*ToProtoOrErr);
5597 return ToProtoOrErr.takeError();
5599 if (
ExpectedSLoc ToProtoLocOrErr =
import(*FromProtoLoc))
5600 ProtocolLocs.push_back(*ToProtoLocOrErr);
5602 return ToProtoLocOrErr.takeError();
5608 ProtocolLocs.data(), Importer.getToContext());
5613 auto ToCatOrErr =
import(Cat);
5615 return ToCatOrErr.takeError();
5624 return ToImplOrErr.takeError();
5631 return Error::success();
5640 for (
auto *fromTypeParam : *list) {
5641 if (
auto toTypeParamOrErr =
import(fromTypeParam))
5642 toTypeParams.push_back(*toTypeParamOrErr);
5644 return toTypeParamOrErr.takeError();
5648 if (!LAngleLocOrErr)
5649 return LAngleLocOrErr.takeError();
5652 if (!RAngleLocOrErr)
5653 return RAngleLocOrErr.takeError();
5668 return Importer.MapImported(D, *ImportedDefOrErr);
5670 return ImportedDefOrErr.takeError();
5679 return std::move(Err);
5685 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
5686 for (
auto *FoundDecl : FoundDecls) {
5690 if ((MergeWithIface = dyn_cast<ObjCInterfaceDecl>(FoundDecl)))
5698 if (!AtBeginLocOrErr)
5699 return AtBeginLocOrErr.takeError();
5701 if (GetImportedOrCreateDecl(
5702 ToIface, D, Importer.getToContext(), DC,
5710 Importer.MapImported(D, ToIface);
5713 if (
auto ToPListOrErr =
5717 return ToPListOrErr.takeError();
5721 return std::move(Err);
5730 return std::move(Err);
5736 return std::move(Err);
5738 Error Err = Error::success();
5743 return std::move(Err);
5745 if (GetImportedOrCreateDecl(
5746 ToImpl, D, Importer.getToContext(), DC,
5747 Importer.Import(D->
getIdentifier()), Category->getClassInterface(),
5748 ToLocation, ToAtStartLoc, ToCategoryNameLoc))
5753 Category->setImplementation(ToImpl);
5756 Importer.MapImported(D, ToImpl);
5758 return std::move(Err);
5768 return std::move(Err);
5773 return std::move(Err);
5781 return std::move(Err);
5783 Error Err = Error::success();
5790 return std::move(Err);
5792 if (GetImportedOrCreateDecl(Impl, D, Importer.getToContext(),
5801 Impl->setLexicalDeclContext(LexicalDC);
5815 Importer.ToDiag(Impl->getLocation(),
5816 diag::warn_odr_objc_superclass_inconsistent)
5820 if (Impl->getSuperClass())
5821 Importer.ToDiag(Impl->getLocation(),
5822 diag::note_odr_objc_superclass)
5823 << Impl->getSuperClass()->getDeclName();
5825 Importer.ToDiag(Impl->getLocation(),
5826 diag::note_odr_objc_missing_superclass);
5829 diag::note_odr_objc_superclass)
5833 diag::note_odr_objc_missing_superclass);
5841 return std::move(Err);
5853 return std::move(Err);
5858 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
5859 for (
auto *FoundDecl : FoundDecls) {
5860 if (
auto *FoundProp = dyn_cast<ObjCPropertyDecl>(FoundDecl)) {
5867 if (!Importer.IsStructurallyEquivalent(D->
getType(),
5868 FoundProp->getType())) {
5869 Importer.ToDiag(Loc, diag::warn_odr_objc_property_type_inconsistent)
5870 << Name << D->
getType() << FoundProp->getType();
5871 Importer.ToDiag(FoundProp->getLocation(), diag::note_odr_value_here)
5872 << FoundProp->getType();
5880 Importer.MapImported(D, FoundProp);
5885 Error Err = Error::success();
5891 return std::move(Err);
5895 if (GetImportedOrCreateDecl(
5896 ToProperty, D, Importer.getToContext(), DC, Loc,
5898 ToLParenLoc, ToType,
5910 return std::move(Err);
5930 return std::move(Err);
5934 return std::move(Err);
5941 return std::move(Err);
5944 = InImpl->FindPropertyImplDecl(
Property->getIdentifier(),
5948 Error Err = Error::success();
5951 auto ToPropertyIvarDeclLoc =
5954 return std::move(Err);
5956 if (GetImportedOrCreateDecl(ToImpl, D, Importer.getToContext(), DC,
5960 ToPropertyIvarDeclLoc))
5970 diag::warn_odr_objc_property_impl_kind_inconsistent)
5975 diag::note_odr_objc_property_impl_kind)
5986 diag::warn_odr_objc_synthesize_ivar_inconsistent)
5991 diag::note_odr_objc_synthesize_ivar_here)
5998 Importer.MapImported(D, ToImpl);
6006 Error Err = Error::success();
6010 return std::move(Err);
6014 return Importer.ToContext.getTemplateParamObjectDecl(
T,
V);
6016 (void)GetImportedOrCreateSpecialDecl(ToD,
Create, D, ToType, ToValue);
6028 return BeginLocOrErr.takeError();
6032 return LocationOrErr.takeError();
6035 if (GetImportedOrCreateDecl(
6036 ToD, D, Importer.getToContext(),
6038 *BeginLocOrErr, *LocationOrErr,
6047 Error Err = Error::success();
6048 auto ToConceptRef =
importChecked(Err, TC->getConceptReference());
6049 auto ToIDC =
importChecked(Err, TC->getImmediatelyDeclaredConstraint());
6051 return std::move(Err);
6056 if (
Error Err = importTemplateParameterDefaultArgument(D, ToD))
6065 Error Err = Error::success();
6072 return std::move(Err);
6075 if (GetImportedOrCreateDecl(ToD, D, Importer.getToContext(),
6077 ToInnerLocStart, ToLocation, D->
getDepth(),
6079 ToDeclName.getAsIdentifierInfo(), ToType,
6083 Err = importTemplateParameterDefaultArgument(D, ToD);
6092 bool IsCanonical =
false;
6093 if (
auto *CanonD = Importer.getFromContext()
6094 .findCanonicalTemplateTemplateParmDeclInternal(D);
6101 return NameOrErr.takeError();
6106 return LocationOrErr.takeError();
6110 if (!TemplateParamsOrErr)
6111 return TemplateParamsOrErr.takeError();
6114 if (GetImportedOrCreateDecl(
6115 ToD, D, Importer.getToContext(),
6122 if (
Error Err = importTemplateParameterDefaultArgument(D, ToD))
6126 return Importer.getToContext()
6127 .insertCanonicalTemplateTemplateParmDeclInternal(ToD);
6135 assert(D->getTemplatedDecl() &&
"Should be called on templates only");
6136 auto *ToTemplatedDef = D->getTemplatedDecl()->getDefinition();
6137 if (!ToTemplatedDef)
6139 auto *TemplateWithDef = ToTemplatedDef->getDescribedTemplate();
6140 return cast_or_null<T>(TemplateWithDef);
6151 return std::move(Err);
6163 TD->getLexicalDeclContext()->isDependentContext();
6165 bool DependentFriend = IsDependentFriend(D);
6172 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
6173 for (
auto *FoundDecl : FoundDecls) {
6178 auto *FoundTemplate = dyn_cast<ClassTemplateDecl>(FoundDecl);
6179 if (FoundTemplate) {
6184 bool IgnoreTemplateParmDepth =
6188 IgnoreTemplateParmDepth)) {
6189 if (DependentFriend || IsDependentFriend(FoundTemplate))
6195 return Importer.MapImported(D, TemplateWithDef);
6197 FoundByLookup = FoundTemplate;
6215 ConflictingDecls.push_back(FoundDecl);
6219 if (!ConflictingDecls.empty()) {
6222 ConflictingDecls.size());
6224 Name = NameOrErr.get();
6226 return NameOrErr.takeError();
6233 if (!TemplateParamsOrErr)
6234 return TemplateParamsOrErr.takeError();
6239 return std::move(Err);
6243 if (GetImportedOrCreateDecl(D2, D, Importer.getToContext(), DC, Loc, Name,
6244 *TemplateParamsOrErr, ToTemplated))
6252 addDeclToContexts(D, D2);
6253 updateLookupTableForTemplateParameters(**TemplateParamsOrErr);
6255 if (FoundByLookup) {
6269 "Found decl must have its templated decl set");
6272 if (ToTemplated != PrevTemplated)
6286 return std::move(Err);
6291 return std::move(Err);
6297 return std::move(Err);
6300 void *InsertPos =
nullptr;
6303 dyn_cast<ClassTemplatePartialSpecializationDecl>(D);
6311 return ToTPListOrErr.takeError();
6312 ToTPList = *ToTPListOrErr;
6323 Importer.MapImported(D, PrevDefinition);
6326 for (
auto *FromField : D->
fields()) {
6327 auto ToOrErr =
import(FromField);
6329 return ToOrErr.takeError();
6335 auto ToOrErr =
import(FromM);
6337 return ToOrErr.takeError();
6345 return PrevDefinition;
6356 return BeginLocOrErr.takeError();
6359 return IdLocOrErr.takeError();
6365 return std::move(Err);
6371 if (GetImportedOrCreateDecl<ClassTemplatePartialSpecializationDecl>(
6372 D2, D, Importer.getToContext(), D->
getTagKind(), DC, *BeginLocOrErr,
6373 *IdLocOrErr, ToTPList, ClassTemplate,
ArrayRef(TemplateArgs),
6375 cast_or_null<ClassTemplatePartialSpecializationDecl>(PrevDecl)))
6387 PartSpec2->setInstantiatedFromMember(*ToInstOrErr);
6389 return ToInstOrErr.takeError();
6391 updateLookupTableForTemplateParameters(*ToTPList);
6393 if (GetImportedOrCreateDecl(D2, D, Importer.getToContext(), D->
getTagKind(),
6394 DC, *BeginLocOrErr, *IdLocOrErr, ClassTemplate,
6419 return BraceRangeOrErr.takeError();
6422 return std::move(Err);
6428 return LocOrErr.takeError();
6436 return LocOrErr.takeError();
6441 return LocOrErr.takeError();
6447 return POIOrErr.takeError();
6453 if (
auto *CTD = dyn_cast<ClassTemplateDecl *>(
P)) {
6454 if (
auto CTDorErr =
import(CTD))
6458 auto CTPSDOrErr =
import(CTPSD);
6460 return CTPSDOrErr.takeError();
6463 for (
unsigned I = 0; I < DArgs.
size(); ++I) {
6465 if (
auto ArgOrErr =
import(DArg))
6466 D2ArgsVec[I] = *ArgOrErr;
6468 return ArgOrErr.takeError();
6478 return std::move(Err);
6490 return std::move(Err);
6496 "Variable templates cannot be declared at function scope");
6499 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
6501 for (
auto *FoundDecl : FoundDecls) {
6505 if (
VarTemplateDecl *FoundTemplate = dyn_cast<VarTemplateDecl>(FoundDecl)) {
6515 assert(FoundTemplate->getDeclContext()->isRecord() &&
6516 "Member variable template imported as non-member, "
6517 "inconsistent imported AST?");
6519 return Importer.MapImported(D, FoundDef);
6521 return Importer.MapImported(D, FoundTemplate);
6524 return Importer.MapImported(D, FoundDef);
6526 FoundByLookup = FoundTemplate;
6529 ConflictingDecls.push_back(FoundDecl);
6533 if (!ConflictingDecls.empty()) {
6536 ConflictingDecls.size());
6538 Name = NameOrErr.get();
6540 return NameOrErr.takeError();
6549 return TypeOrErr.takeError();
6554 return std::move(Err);
6558 if (!TemplateParamsOrErr)
6559 return TemplateParamsOrErr.takeError();
6562 if (GetImportedOrCreateDecl(ToVarTD, D, Importer.getToContext(), DC, Loc,
6563 Name, *TemplateParamsOrErr, ToTemplated))
6571 if (DC != Importer.getToContext().getTranslationUnitDecl())
6572 updateLookupTableForTemplateParameters(**TemplateParamsOrErr);
6574 if (FoundByLookup) {
6578 auto *PrevTemplated =
6580 if (ToTemplated != PrevTemplated)
6595 auto RedeclIt = Redecls.begin();
6598 for (; RedeclIt != Redecls.end() && *RedeclIt != D; ++RedeclIt) {
6601 return RedeclOrErr.takeError();
6603 assert(*RedeclIt == D);
6607 return std::move(Err);
6612 return std::move(Err);
6617 return BeginLocOrErr.takeError();
6621 return IdLocOrErr.takeError();
6627 return std::move(Err);
6630 void *InsertPos =
nullptr;
6632 VarTemplate->findSpecialization(TemplateArgs, InsertPos);
6633 if (FoundSpecialization) {
6641 "Member variable template specialization imported as non-member, "
6642 "inconsistent imported AST?");
6644 return Importer.MapImported(D, FoundDef);
6646 return Importer.MapImported(D, FoundSpecialization);
6651 return Importer.MapImported(D, FoundDef);
6663 return std::move(Err);
6668 if (
auto *FromPartial = dyn_cast<PartVarSpecDecl>(D)) {
6669 auto ToTPListOrErr =
import(FromPartial->getTemplateParameters());
6671 return ToTPListOrErr.takeError();
6673 PartVarSpecDecl *ToPartial;
6674 if (GetImportedOrCreateDecl(ToPartial, D, Importer.getToContext(), DC,
6675 *BeginLocOrErr, *IdLocOrErr, *ToTPListOrErr,
6681 import(FromPartial->getInstantiatedFromMember()))
6682 ToPartial->setInstantiatedFromMember(*ToInstOrErr);
6684 return ToInstOrErr.takeError();
6686 if (FromPartial->isMemberSpecialization())
6687 ToPartial->setMemberSpecialization();
6695 if (GetImportedOrCreateDecl(D2, D, Importer.getToContext(), DC,
6704 if (!
VarTemplate->findSpecialization(TemplateArgs, InsertPos))
6709 return std::move(Err);
6714 return TInfoOrErr.takeError();
6721 return POIOrErr.takeError();
6732 return LocOrErr.takeError();
6740 return std::move(Err);
6742 if (FoundSpecialization)
6745 addDeclToContexts(D, D2);
6748 for (++RedeclIt; RedeclIt != Redecls.end(); ++RedeclIt) {
6751 return RedeclOrErr.takeError();
6765 return std::move(Err);
6777 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
6778 for (
auto *FoundDecl : FoundDecls) {
6779 if (!FoundDecl->isInIdentifierNamespace(IDNS))
6782 if (
auto *FoundTemplate = dyn_cast<FunctionTemplateDecl>(FoundDecl)) {
6789 return Importer.MapImported(D, TemplateWithDef);
6791 FoundByLookup = FoundTemplate;
6801 return ParamsOrErr.takeError();
6806 return std::move(Err);
6823 OldParamDC.reserve(Params->
size());
6824 llvm::transform(*Params, std::back_inserter(OldParamDC),
6828 if (GetImportedOrCreateDecl(ToFunc, D, Importer.getToContext(), DC, Loc, Name,
6829 Params, TemplatedFD))
6843 ToFunc->setLexicalDeclContext(LexicalDC);
6844 addDeclToContexts(D, ToFunc);
6847 if (LT && !OldParamDC.empty()) {
6848 for (
unsigned int I = 0; I < OldParamDC.size(); ++I)
6849 LT->updateForced(Params->
getParam(I), OldParamDC[I]);
6852 if (FoundByLookup) {
6857 "Found decl must have its templated decl set");
6858 auto *PrevTemplated =
6860 if (TemplatedFD != PrevTemplated)
6877 return std::move(Err);
6880 if (GetImportedOrCreateDecl(To, D, Importer.getToContext(), DC, LocationOrErr,
6881 NameDeclOrErr, ToTemplateParameters,
6895 return std::move(Err);
6898 if (GetImportedOrCreateDecl(To, D, Importer.getToContext(), DC, RequiresLoc))
6911 return std::move(Err);
6915 return std::move(Err);
6918 if (GetImportedOrCreateDecl(To, D, Importer.getToContext(), DC, ToSL, ToArgs))
6930 Importer.FromDiag(S->
getBeginLoc(), diag::err_unsupported_ast_node)
6937 if (Importer.returnWithErrorInTest())
6944 Names.push_back(ToII);
6947 for (
unsigned I = 0, E = S->
getNumInputs(); I != E; I++) {
6951 Names.push_back(ToII);
6957 Clobbers.push_back(*ClobberOrErr);
6959 return ClobberOrErr.takeError();
6966 Constraints.push_back(*OutputOrErr);
6968 return OutputOrErr.takeError();
6971 for (
unsigned I = 0, E = S->
getNumInputs(); I != E; I++) {
6973 Constraints.push_back(*InputOrErr);
6975 return InputOrErr.takeError();
6981 return std::move(Err);
6985 return std::move(Err);
6989 return std::move(Err);
6993 return AsmLocOrErr.takeError();
6996 return AsmStrOrErr.takeError();
6998 if (!RParenLocOrErr)
6999 return RParenLocOrErr.takeError();
7001 return new (Importer.getToContext())
GCCAsmStmt(
7002 Importer.getToContext(),
7020 Error Err = Error::success();
7025 return std::move(Err);
7026 return new (Importer.getToContext())
DeclStmt(ToDG, ToBeginLoc, ToEndLoc);
7031 if (!ToSemiLocOrErr)
7032 return ToSemiLocOrErr.takeError();
7033 return new (Importer.getToContext())
NullStmt(
7041 return std::move(Err);
7044 if (!ToLBracLocOrErr)
7045 return ToLBracLocOrErr.takeError();
7048 if (!ToRBracLocOrErr)
7049 return ToRBracLocOrErr.takeError();
7054 *ToLBracLocOrErr, *ToRBracLocOrErr);
7059 Error Err = Error::success();
7067 return std::move(Err);
7070 ToCaseLoc, ToEllipsisLoc, ToColonLoc);
7071 ToStmt->setSubStmt(ToSubStmt);
7078 Error Err = Error::success();
7083 return std::move(Err);
7086 ToDefaultLoc, ToColonLoc, ToSubStmt);
7091 Error Err = Error::success();
7096 return std::move(Err);
7098 return new (Importer.getToContext())
LabelStmt(
7099 ToIdentLoc, ToLabelDecl, ToSubStmt);
7104 if (!ToAttrLocOrErr)
7105 return ToAttrLocOrErr.takeError();
7109 return std::move(Err);
7111 if (!ToSubStmtOrErr)
7112 return ToSubStmtOrErr.takeError();
7115 Importer.getToContext(), *ToAttrLocOrErr, ToAttrs, *ToSubStmtOrErr);
7120 Error Err = Error::success();
7131 return std::move(Err);
7134 ToInit, ToConditionVariable, ToCond, ToLParenLoc,
7135 ToRParenLoc, ToThen, ToElseLoc, ToElse);
7140 Error Err = Error::success();
7149 return std::move(Err);
7153 ToCond, ToLParenLoc, ToRParenLoc);
7154 ToStmt->setBody(ToBody);
7155 ToStmt->setSwitchLoc(ToSwitchLoc);
7163 return ToSCOrErr.takeError();
7164 if (LastChainedSwitchCase)
7167 ToStmt->setSwitchCaseList(*ToSCOrErr);
7168 LastChainedSwitchCase = *ToSCOrErr;
7176 Error Err = Error::success();
7184 return std::move(Err);
7187 ToBody, ToWhileLoc, ToLParenLoc, ToRParenLoc);
7192 Error Err = Error::success();
7199 return std::move(Err);
7201 return new (Importer.getToContext())
DoStmt(
7202 ToBody, ToCond, ToDoLoc, ToWhileLoc, ToRParenLoc);
7207 Error Err = Error::success();
7217 return std::move(Err);
7219 return new (Importer.getToContext())
ForStmt(
7220 Importer.getToContext(),
7221 ToInit, ToCond, ToConditionVariable, ToInc, ToBody, ToForLoc, ToLParenLoc,
7227 Error Err = Error::success();
7232 return std::move(Err);
7234 return new (Importer.getToContext())
GotoStmt(
7235 ToLabel, ToGotoLoc, ToLabelLoc);
7240 Error Err = Error::success();
7245 return std::move(Err);
7248 ToGotoLoc, ToStarLoc, ToTarget);
7251template <
typename StmtClass>
7254 Error Err = Error::success();
7255 auto ToLoc = NodeImporter.
importChecked(Err, S->getKwLoc());
7256 auto ToLabelLoc = S->hasLabelTarget()
7259 auto ToDecl = S->hasLabelTarget()
7263 return std::move(Err);
7264 return new (Importer.
getToContext()) StmtClass(ToLoc, ToLabelLoc, ToDecl);
7277 Error Err = Error::success();
7282 return std::move(Err);
7290 Error Err = Error::success();
7295 return std::move(Err);
7298 ToCatchLoc, ToExceptionDecl, ToHandlerBlock);
7304 return ToTryLocOrErr.takeError();
7307 if (!ToTryBlockOrErr)
7308 return ToTryBlockOrErr.takeError();
7311 for (
unsigned HI = 0, HE = S->
getNumHandlers(); HI != HE; ++HI) {
7313 if (
auto ToHandlerOrErr =
import(FromHandler))
7314 ToHandlers[HI] = *ToHandlerOrErr;
7316 return ToHandlerOrErr.takeError();
7325 Error Err = Error::success();
7339 return std::move(Err);
7342 ToInit, ToRangeStmt, ToBeginStmt, ToEndStmt, ToCond, ToInc, ToLoopVarStmt,
7343 ToBody, ToForLoc, ToCoawaitLoc, ToColonLoc, ToRParenLoc);
7348 Error Err = Error::success();
7356 return std::move(Err);
7361 Importer.getToContext(), ToESD, ToInit, ToExpansionVar, ToLParenLoc,
7362 ToColonLoc, ToRParenLoc);
7369 return std::move(Err);
7372 Importer.getToContext(), ToESD, ToInit, ToExpansionVar, ToRange,
7373 ToBegin, ToIter, ToLParenLoc, ToColonLoc, ToRParenLoc);
7377 auto ToDecompositionDeclStmt =
7380 return std::move(Err);
7383 Importer.getToContext(), ToESD, ToInit, ToExpansionVar,
7384 ToDecompositionDeclStmt, ToLParenLoc, ToColonLoc, ToRParenLoc);
7388 auto ToExpansionInitializer =
7391 return std::move(Err);
7393 Importer.getToContext(), ToESD, ToInit, ToExpansionVar,
7394 ToExpansionInitializer, ToLParenLoc, ToColonLoc, ToRParenLoc);
7398 llvm_unreachable(
"invalid pattern kind");
7403 Error Err = Error::success();
7413 return std::move(Err);
7416 Importer.getToContext(), ToParent, ToInstantiations, ToSharedStmts,
7422 Error Err = Error::success();
7429 return std::move(Err);
7440 Error Err = Error::success();
7446 return std::move(Err);
7449 ToAtCatchLoc, ToRParenLoc, ToCatchParamDecl, ToCatchBody);
7454 if (!ToAtFinallyLocOrErr)
7455 return ToAtFinallyLocOrErr.takeError();
7457 if (!ToAtFinallyStmtOrErr)
7458 return ToAtFinallyStmtOrErr.takeError();
7460 *ToAtFinallyStmtOrErr);
7465 Error Err = Error::success();
7470 return std::move(Err);
7475 if (
ExpectedStmt ToCatchStmtOrErr =
import(FromCatchStmt))
7476 ToCatchStmts[CI] = *ToCatchStmtOrErr;
7478 return ToCatchStmtOrErr.takeError();
7482 ToAtTryLoc, ToTryBody,
7483 ToCatchStmts.begin(), ToCatchStmts.size(),
7490 Error Err = Error::success();
7495 return std::move(Err);
7498 ToAtSynchronizedLoc, ToSynchExpr, ToSynchBody);
7503 if (!ToThrowLocOrErr)
7504 return ToThrowLocOrErr.takeError();
7506 if (!ToThrowExprOrErr)
7507 return ToThrowExprOrErr.takeError();
7509 *ToThrowLocOrErr, *ToThrowExprOrErr);
7516 return ToAtLocOrErr.takeError();
7518 if (!ToSubStmtOrErr)
7519 return ToSubStmtOrErr.takeError();
7528 Importer.FromDiag(E->
getBeginLoc(), diag::err_unsupported_ast_node)
7534 Error Err = Error::success();
7539 return std::move(Err);
7541 if (!ParentContextOrErr)
7542 return ParentContextOrErr.takeError();
7544 return new (Importer.getToContext())
7546 RParenLoc, *ParentContextOrErr);
7551 Error Err = Error::success();
7558 return std::move(Err);
7560 return new (Importer.getToContext())
7561 VAArgExpr(ToBuiltinLoc, ToSubExpr, ToWrittenTypeInfo, ToRParenLoc, ToType,
7567 Error Err = Error::success();
7575 return std::move(Err);
7584 return new (Importer.getToContext())
7585 ChooseExpr(ToBuiltinLoc, ToCond, ToLHS, ToRHS, ToType,
VK, OK,
7586 ToRParenLoc, CondIsTrue);
7590 Error Err = Error::success();
7597 return std::move(Err);
7600 Importer.getToContext(), ToSrcExpr, ToTSI, ToType, E->
getValueKind(),
7606 Error Err = Error::success();
7614 ToSubExprs.resize(NumSubExprs);
7617 return std::move(Err);
7620 Importer.getToContext(), ToSubExprs, ToType, ToBeginLoc, ToRParenLoc);
7626 return TypeOrErr.takeError();
7630 return BeginLocOrErr.takeError();
7632 return new (Importer.getToContext())
GNUNullExpr(*TypeOrErr, *BeginLocOrErr);
7637 Error Err = Error::success();
7639 Expr *ToControllingExpr =
nullptr;
7645 assert((ToControllingExpr || ToControllingType) &&
7646 "Either the controlling expr or type must be nonnull");
7650 return std::move(Err);
7655 return std::move(Err);
7660 return std::move(Err);
7662 const ASTContext &ToCtx = Importer.getToContext();
7664 if (ToControllingExpr) {
7666 ToCtx, ToGenericLoc, ToControllingExpr,
ArrayRef(ToAssocTypes),
7667 ArrayRef(ToAssocExprs), ToDefaultLoc, ToRParenLoc,
7671 ToCtx, ToGenericLoc, ToControllingType,
ArrayRef(ToAssocTypes),
7672 ArrayRef(ToAssocExprs), ToDefaultLoc, ToRParenLoc,
7676 if (ToControllingExpr) {
7678 ToCtx, ToGenericLoc, ToControllingExpr,
ArrayRef(ToAssocTypes),
7679 ArrayRef(ToAssocExprs), ToDefaultLoc, ToRParenLoc,
7683 ToCtx, ToGenericLoc, ToControllingType,
ArrayRef(ToAssocTypes),
7684 ArrayRef(ToAssocExprs), ToDefaultLoc, ToRParenLoc,
7690 Error Err = Error::success();
7695 return std::move(Err);
7704 Error Err = Error::success();
7711 return std::move(Err);
7717 return FoundDOrErr.takeError();
7718 ToFoundD = *FoundDOrErr;
7727 return std::move(Err);
7728 ToResInfo = &ToTAInfo;
7732 Importer.getToContext(), ToQualifierLoc, ToTemplateKeywordLoc, ToDecl,
7736 ToE->setHadMultipleCandidates(
true);
7744 return TypeOrErr.takeError();
7752 return ToInitOrErr.takeError();
7755 if (!ToEqualOrColonLocOrErr)
7756 return ToEqualOrColonLocOrErr.takeError();
7762 ToIndexExprs[I - 1] = *ToArgOrErr;
7764 return ToArgOrErr.takeError();
7769 return std::move(Err);
7772 Importer.getToContext(), ToDesignators,
7773 ToIndexExprs, *ToEqualOrColonLocOrErr,
7781 return ToTypeOrErr.takeError();
7784 if (!ToLocationOrErr)
7785 return ToLocationOrErr.takeError();
7788 *ToTypeOrErr, *ToLocationOrErr);
7794 return ToTypeOrErr.takeError();
7797 if (!ToLocationOrErr)
7798 return ToLocationOrErr.takeError();
7801 Importer.getToContext(), E->
getValue(), *ToTypeOrErr, *ToLocationOrErr);
7808 return ToTypeOrErr.takeError();
7811 if (!ToLocationOrErr)
7812 return ToLocationOrErr.takeError();
7816 *ToTypeOrErr, *ToLocationOrErr);
7820 auto ToTypeOrErr =
import(E->
getType());
7822 return ToTypeOrErr.takeError();
7825 if (!ToSubExprOrErr)
7826 return ToSubExprOrErr.takeError();
7829 *ToSubExprOrErr, *ToTypeOrErr);
7833 auto ToTypeOrErr =
import(E->
getType());
7835 return ToTypeOrErr.takeError();
7838 if (!ToLocationOrErr)
7839 return ToLocationOrErr.takeError();
7842 Importer.getToContext(), E->
getValue(), *ToTypeOrErr, *ToLocationOrErr,
7843 Importer.getToContext().getFixedPointScale(*ToTypeOrErr));
7849 return ToTypeOrErr.takeError();
7852 if (!ToLocationOrErr)
7853 return ToLocationOrErr.takeError();
7862 return ToTypeOrErr.takeError();
7867 return std::move(Err);
7876 Error Err = Error::success();
7882 return std::move(Err);
7885 ToLParenLoc, ToTypeSourceInfo, ToType, E->
getValueKind(),
7891 Error Err = Error::success();
7896 return std::move(Err);
7902 return std::move(Err);
7904 return new (Importer.getToContext())
AtomicExpr(
7906 ToBuiltinLoc, ToExprs, ToType, E->
getOp(), ToRParenLoc);
7910 Error Err = Error::success();
7916 return std::move(Err);
7919 ToAmpAmpLoc, ToLabelLoc, ToLabel, ToType);
7922 Error Err = Error::success();
7926 return std::move(Err);
7931 Error Err = Error::success();
7936 return std::move(Err);
7938 return new (Importer.getToContext())
7939 ParenExpr(ToLParen, ToRParen, ToSubExpr);
7945 return std::move(Err);
7948 if (!ToLParenLocOrErr)
7949 return ToLParenLocOrErr.takeError();
7952 if (!ToRParenLocOrErr)
7953 return ToRParenLocOrErr.takeError();
7956 ToExprs, *ToRParenLocOrErr);
7960 Error Err = Error::success();
7966 return std::move(Err);
7968 return new (Importer.getToContext())
7969 StmtExpr(ToSubStmt, ToType, ToLParenLoc, ToRParenLoc,
7974 Error Err = Error::success();
7979 return std::move(Err);
7983 UO->setType(ToType);
7984 UO->setSubExpr(ToSubExpr);
7986 UO->setOperatorLoc(ToOperatorLoc);
7997 Error Err = Error::success();
8002 return std::move(Err);
8007 if (!ToArgumentTypeInfoOrErr)
8008 return ToArgumentTypeInfoOrErr.takeError();
8011 E->
getKind(), *ToArgumentTypeInfoOrErr, ToType, ToOperatorLoc,
8016 if (!ToArgumentExprOrErr)
8017 return ToArgumentExprOrErr.takeError();
8020 E->
getKind(), *ToArgumentExprOrErr, ToType, ToOperatorLoc, ToRParenLoc);
8024 Error Err = Error::success();
8030 return std::move(Err);
8033 Importer.getToContext(), ToLHS, ToRHS, E->
getOpcode(), ToType,
8039 Error Err = Error::success();
8047 return std::move(Err);
8050 ToCond, ToQuestionLoc, ToLHS, ToColonLoc, ToRHS, ToType,
8056 Error Err = Error::success();
8066 return std::move(Err);
8069 ToCommon, ToOpaqueValue, ToCond, ToTrueExpr, ToFalseExpr,
8076 Error Err = Error::success();
8079 return std::move(Err);
8081 return new (Importer.getToContext())
8086 Error Err = Error::success();
8088 auto ToQueriedTypeSourceInfo =
8094 return std::move(Err);
8098 ToDimensionExpression, ToEndLoc, ToType);
8102 Error Err = Error::success();
8108 return std::move(Err);
8116 Error Err = Error::success();
8121 return std::move(Err);
8128 Error Err = Error::success();
8134 return std::move(Err);
8143 Error Err = Error::success();
8148 auto ToComputationResultType =
8152 return std::move(Err);
8155 Importer.getToContext(), ToLHS, ToRHS, E->
getOpcode(), ToType,
8158 ToComputationLHSType, ToComputationResultType);
8165 if (
auto SpecOrErr =
import(*I))
8166 Path.push_back(*SpecOrErr);
8168 return SpecOrErr.takeError();
8176 return ToTypeOrErr.takeError();
8179 if (!ToSubExprOrErr)
8180 return ToSubExprOrErr.takeError();
8183 if (!ToBasePathOrErr)
8184 return ToBasePathOrErr.takeError();
8187 Importer.getToContext(), *ToTypeOrErr, E->
getCastKind(), *ToSubExprOrErr,
8192 Error Err = Error::success();
8197 return std::move(Err);
8200 if (!ToBasePathOrErr)
8201 return ToBasePathOrErr.takeError();
8205 case Stmt::CStyleCastExprClass: {
8207 ExpectedSLoc ToLParenLocOrErr =
import(CCE->getLParenLoc());
8208 if (!ToLParenLocOrErr)
8209 return ToLParenLocOrErr.takeError();
8210 ExpectedSLoc ToRParenLocOrErr =
import(CCE->getRParenLoc());
8211 if (!ToRParenLocOrErr)
8212 return ToRParenLocOrErr.takeError();
8215 ToSubExpr, ToBasePath, CCE->getFPFeatures(), ToTypeInfoAsWritten,
8216 *ToLParenLocOrErr, *ToRParenLocOrErr);
8219 case Stmt::CXXFunctionalCastExprClass: {
8221 ExpectedSLoc ToLParenLocOrErr =
import(FCE->getLParenLoc());
8222 if (!ToLParenLocOrErr)
8223 return ToLParenLocOrErr.takeError();
8224 ExpectedSLoc ToRParenLocOrErr =
import(FCE->getRParenLoc());
8225 if (!ToRParenLocOrErr)
8226 return ToRParenLocOrErr.takeError();
8228 Importer.getToContext(), ToType, E->
getValueKind(), ToTypeInfoAsWritten,
8229 E->
getCastKind(), ToSubExpr, ToBasePath, FCE->getFPFeatures(),
8230 *ToLParenLocOrErr, *ToRParenLocOrErr);
8233 case Stmt::ObjCBridgedCastExprClass: {
8235 ExpectedSLoc ToLParenLocOrErr =
import(OCE->getLParenLoc());
8236 if (!ToLParenLocOrErr)
8237 return ToLParenLocOrErr.takeError();
8238 ExpectedSLoc ToBridgeKeywordLocOrErr =
import(OCE->getBridgeKeywordLoc());
8239 if (!ToBridgeKeywordLocOrErr)
8240 return ToBridgeKeywordLocOrErr.takeError();
8242 *ToLParenLocOrErr, OCE->getBridgeKind(), E->
getCastKind(),
8243 *ToBridgeKeywordLocOrErr, ToTypeInfoAsWritten, ToSubExpr);
8245 case Stmt::BuiltinBitCastExprClass: {
8247 ExpectedSLoc ToKWLocOrErr =
import(BBC->getBeginLoc());
8249 return ToKWLocOrErr.takeError();
8250 ExpectedSLoc ToRParenLocOrErr =
import(BBC->getEndLoc());
8251 if (!ToRParenLocOrErr)
8252 return ToRParenLocOrErr.takeError();
8255 ToTypeInfoAsWritten, *ToKWLocOrErr, *ToRParenLocOrErr);
8258 llvm_unreachable(
"Cast expression of unsupported type!");
8271 Error Err = Error::success();
8275 return std::move(Err);
8284 auto ToBSOrErr =
import(FromNode.
getBase());
8286 return ToBSOrErr.takeError();
8291 auto ToFieldOrErr =
import(FromNode.
getField());
8293 return ToFieldOrErr.takeError();
8294 ToNodes.push_back(
OffsetOfNode(ToBeginLoc, *ToFieldOrErr, ToEndLoc));
8299 ToNodes.push_back(
OffsetOfNode(ToBeginLoc, ToII, ToEndLoc));
8308 if (!ToIndexExprOrErr)
8309 return ToIndexExprOrErr.takeError();
8310 ToExprs[I] = *ToIndexExprOrErr;
8313 Error Err = Error::success();
8319 return std::move(Err);
8322 Importer.getToContext(), ToType, ToOperatorLoc, ToTypeSourceInfo, ToNodes,
8323 ToExprs, ToRParenLoc);
8327 Error Err = Error::success();
8333 return std::move(Err);
8342 ToType, ToOperand, ToCanThrow, ToBeginLoc, ToEndLoc);
8346 Error Err = Error::success();
8351 return std::move(Err);
8359 if (!ToUsedLocOrErr)
8360 return ToUsedLocOrErr.takeError();
8362 auto ToParamOrErr =
import(E->
getParam());
8364 return ToParamOrErr.takeError();
8366 auto UsedContextOrErr = Importer.ImportContext(E->
getUsedContext());
8367 if (!UsedContextOrErr)
8368 return UsedContextOrErr.takeError();
8378 std::optional<ParmVarDecl *> FromParam =
8379 Importer.getImportedFromDecl(ToParam);
8380 assert(FromParam &&
"ParmVarDecl was not imported?");
8383 return std::move(Err);
8385 Expr *RewrittenInit =
nullptr;
8389 return ExprOrErr.takeError();
8390 RewrittenInit = ExprOrErr.get();
8393 *ToParamOrErr, RewrittenInit,
8399 Error Err = Error::success();
8404 return std::move(Err);
8407 ToType, ToTypeSourceInfo, ToRParenLoc);
8413 if (!ToSubExprOrErr)
8414 return ToSubExprOrErr.takeError();
8416 auto ToDtorOrErr =
import(E->
getTemporary()->getDestructor());
8418 return ToDtorOrErr.takeError();
8428 Error Err = Error::success();
8434 return std::move(Err);
8438 return std::move(Err);
8441 Importer.getToContext(), ToConstructor, ToType, ToTypeSourceInfo, ToArgs,
8451 return std::move(Err);
8453 Error Err = Error::success();
8457 return std::move(Err);
8461 if (GetImportedOrCreateDecl(To, D, Temporary, ExtendingDecl,
8472 Error Err = Error::success();
8476 auto ToMaterializedDecl =
8479 return std::move(Err);
8481 if (!ToTemporaryExpr)
8482 ToTemporaryExpr =
cast<Expr>(ToMaterializedDecl->getTemporaryExpr());
8486 ToMaterializedDecl);
8492 Error Err = Error::success();
8496 return std::move(Err);
8498 return new (Importer.getToContext())
8503 Error Err = Error::success();
8509 return std::move(Err);
8518 ToPartialArguments))
8519 return std::move(Err);
8523 Importer.getToContext(), ToOperatorLoc, ToPack, ToPackLoc, ToRParenLoc,
8524 Length, ToPartialArguments);
8529 Error Err = Error::success();
8536 auto ToAllocatedTypeSourceInfo =
8541 return std::move(Err);
8546 return std::move(Err);
8549 Importer.getToContext(), E->
isGlobalNew(), ToOperatorNew,
8553 ToAllocatedTypeSourceInfo, ToSourceRange, ToDirectInitRange);
8557 Error Err = Error::success();
8563 return std::move(Err);
8572 Error Err = Error::success();
8578 return std::move(Err);
8582 return std::move(Err);
8585 Importer.getToContext(), ToType, ToLocation, ToConstructor,
8589 ToParenOrBraceRange);
8596 if (!ToSubExprOrErr)
8597 return ToSubExprOrErr.takeError();
8601 return std::move(Err);
8609 Error Err = Error::success();
8614 return std::move(Err);
8618 return std::move(Err);
8628 return ToTypeOrErr.takeError();
8631 if (!ToLocationOrErr)
8632 return ToLocationOrErr.takeError();
8641 return ToTypeOrErr.takeError();
8644 if (!ToLocationOrErr)
8645 return ToLocationOrErr.takeError();
8648 *ToTypeOrErr, *ToLocationOrErr);
8652 Error Err = Error::success();
8663 return std::move(Err);
8675 return std::move(Err);
8676 ResInfo = &ToTAInfo;
8680 ToOperatorLoc, ToQualifierLoc, ToTemplateKeywordLoc,
8681 ToMemberDecl, ToFoundDecl, ToMemberNameInfo,
8688 Error Err = Error::success();
8696 return std::move(Err);
8702 if (!ToDestroyedTypeLocOrErr)
8703 return ToDestroyedTypeLocOrErr.takeError();
8709 return ToTIOrErr.takeError();
8713 Importer.getToContext(), ToBase, E->
isArrow(), ToOperatorLoc,
8714 ToQualifierLoc, ToScopeTypeInfo, ToColonColonLoc, ToTildeLoc, Storage);
8719 Error Err = Error::success();
8724 auto ToFirstQualifierFoundInScope =
8727 return std::move(Err);
8729 Expr *ToBase =
nullptr;
8732 ToBase = *ToBaseOrErr;
8734 return ToBaseOrErr.takeError();
8743 return std::move(Err);
8744 ResInfo = &ToTAInfo;
8749 return std::move(Err);
8755 return std::move(Err);
8758 Importer.getToContext(), ToBase, ToType, E->
isArrow(), ToOperatorLoc,
8759 ToQualifierLoc, ToTemplateKeywordLoc, ToFirstQualifierFoundInScope,
8760 ToMemberNameInfo, ResInfo);
8765 Error Err = Error::success();
8773 return std::move(Err);
8777 return std::move(Err);
8784 return std::move(Err);
8785 ResInfo = &ToTAInfo;
8789 Importer.getToContext(), ToQualifierLoc, ToTemplateKeywordLoc,
8790 ToNameInfo, ResInfo);
8795 Error Err = Error::success();
8801 return std::move(Err);
8806 return std::move(Err);
8809 Importer.getToContext(), ToType, ToTypeSourceInfo, ToLParenLoc,
8816 if (!ToNamingClassOrErr)
8817 return ToNamingClassOrErr.takeError();
8820 if (!ToQualifierLocOrErr)
8821 return ToQualifierLocOrErr.takeError();
8823 Error Err = Error::success();
8827 return std::move(Err);
8832 return std::move(Err);
8835 for (
auto *D : E->
decls())
8836 if (
auto ToDOrErr =
import(D))
8839 return ToDOrErr.takeError();
8846 return std::move(Err);
8849 if (!ToTemplateKeywordLocOrErr)
8850 return ToTemplateKeywordLocOrErr.takeError();
8852 const bool KnownDependent =
8854 ExprDependence::TypeValue;
8856 Importer.getToContext(), *ToNamingClassOrErr, *ToQualifierLocOrErr,
8857 *ToTemplateKeywordLocOrErr, ToNameInfo, E->
requiresADL(), &ToTAInfo,
8858 ToDecls.
begin(), ToDecls.
end(), KnownDependent,
8863 Importer.getToContext(), *ToNamingClassOrErr, *ToQualifierLocOrErr,
8871 Error Err = Error::success();
8879 return std::move(Err);
8884 return std::move(Err);
8888 if (
auto ToDOrErr =
import(D))
8891 return ToDOrErr.takeError();
8899 return std::move(Err);
8900 ResInfo = &ToTAInfo;
8903 Expr *ToBase =
nullptr;
8906 ToBase = *ToBaseOrErr;
8908 return ToBaseOrErr.takeError();
8913 E->
isArrow(), ToOperatorLoc, ToQualifierLoc, ToTemplateKeywordLoc,
8914 ToNameInfo, ResInfo, ToDecls.
begin(), ToDecls.
end());
8918 Error Err = Error::success();
8923 return std::move(Err);
8928 return std::move(Err);
8930 if (
const auto *OCE = dyn_cast<CXXOperatorCallExpr>(E)) {
8932 Importer.getToContext(), OCE->getOperator(), ToCallee, ToArgs, ToType,
8933 OCE->getValueKind(), ToRParenLoc, OCE->getFPFeatures(),
8934 OCE->getADLCallKind());
8944 auto ToClassOrErr =
import(FromClass);
8946 return ToClassOrErr.takeError();
8951 return ToCallOpOrErr.takeError();
8955 return std::move(Err);
8957 Error Err = Error::success();
8962 return std::move(Err);
8973 Error Err = Error::success();
8978 return std::move(Err);
8982 return std::move(Err);
8993 return ToFillerOrErr.takeError();
8997 if (
auto ToFDOrErr =
import(FromFD))
9000 return ToFDOrErr.takeError();
9004 if (
auto ToSyntFormOrErr =
import(SyntForm))
9007 return ToSyntFormOrErr.takeError();
9021 return ToTypeOrErr.takeError();
9024 if (!ToSubExprOrErr)
9025 return ToSubExprOrErr.takeError();
9028 *ToTypeOrErr, *ToSubExprOrErr);
9033 Error Err = Error::success();
9038 return std::move(Err);
9046 Error Err = Error::success();
9051 return std::move(Err);
9054 ToType, ToCommonExpr, ToSubExpr);
9060 return ToTypeOrErr.takeError();
9066 if (!ToBeginLocOrErr)
9067 return ToBeginLocOrErr.takeError();
9069 auto ToFieldOrErr =
import(E->
getField());
9071 return ToFieldOrErr.takeError();
9073 auto UsedContextOrErr = Importer.ImportContext(E->
getUsedContext());
9074 if (!UsedContextOrErr)
9075 return UsedContextOrErr.takeError();
9079 "Field should have in-class initializer if there is a default init "
9080 "expression that uses it.");
9085 auto ToInClassInitializerOrErr =
9086 import(E->
getField()->getInClassInitializer());
9087 if (!ToInClassInitializerOrErr)
9088 return ToInClassInitializerOrErr.takeError();
9092 Expr *RewrittenInit =
nullptr;
9096 return ExprOrErr.takeError();
9097 RewrittenInit = ExprOrErr.get();
9101 ToField, *UsedContextOrErr, RewrittenInit);
9105 Error Err = Error::success();
9113 return std::move(Err);
9118 if (!ToBasePathOrErr)
9119 return ToBasePathOrErr.takeError();
9121 if (
auto CCE = dyn_cast<CXXStaticCastExpr>(E)) {
9123 Importer.getToContext(), ToType,
VK, CK, ToSubExpr, &(*ToBasePathOrErr),
9124 ToTypeInfoAsWritten, CCE->getFPFeatures(), ToOperatorLoc, ToRParenLoc,
9128 Importer.getToContext(), ToType,
VK, CK, ToSubExpr, &(*ToBasePathOrErr),
9129 ToTypeInfoAsWritten, ToOperatorLoc, ToRParenLoc, ToAngleBrackets);
9132 Importer.getToContext(), ToType,
VK, CK, ToSubExpr, &(*ToBasePathOrErr),
9133 ToTypeInfoAsWritten, ToOperatorLoc, ToRParenLoc, ToAngleBrackets);
9136 Importer.getToContext(), ToType,
VK, ToSubExpr, ToTypeInfoAsWritten,
9137 ToOperatorLoc, ToRParenLoc, ToAngleBrackets);
9139 llvm_unreachable(
"Unknown cast type");
9140 return make_error<ASTImportError>();
9146 Error Err = Error::success();
9153 return std::move(Err);
9156 ToType, E->
getValueKind(), ToNameLoc, ToReplacement, ToAssociatedDecl,
9161 Error Err = Error::success();
9166 return std::move(Err);
9170 return std::move(Err);
9177 E->
getTrait(), ToArgs, ToEndLoc, ToValue);
9187 return ToTypeOrErr.takeError();
9190 if (!ToSourceRangeOrErr)
9191 return ToSourceRangeOrErr.takeError();
9196 *ToTypeOrErr, *ToTSIOrErr, *ToSourceRangeOrErr);
9198 return ToTSIOrErr.takeError();
9202 if (!ToExprOperandOrErr)
9203 return ToExprOperandOrErr.takeError();
9206 *ToTypeOrErr, *ToExprOperandOrErr, *ToSourceRangeOrErr);
9210 Error Err = Error::success();
9221 return std::move(Err);
9223 return new (Importer.getToContext())
9229 Error Err = Error::success();
9237 return std::move(Err);
9241 return std::move(Err);
9246 return std::move(Err);
9248 LParenLoc, LocalParameters, RParenLoc,
9249 Requirements, RBraceLoc);
9254 Error Err = Error::success();
9258 return std::move(Err);
9261 Importer.getToContext(),
CL,
9266 return std::move(Err);
9268 Importer.getToContext(),
CL,
9274 Error Err = Error::success();
9280 return std::move(Err);
9283 ToType, E->
getValueKind(), ToPackLoc, ToArgPack, ToAssociatedDecl,
9290 return std::move(Err);
9293 return ToSyntOrErr.takeError();
9300 Error Err = Error::success();
9306 return std::move(Err);
9310 return std::move(Err);
9313 ToInitLoc, ToBeginLoc, ToEndLoc);
9318 Error Err = Error::success();
9322 return std::move(Err);
9324 return new (Importer.getToContext())
9330 Error ImportErrors = Error::success();
9332 if (
auto ImportedOrErr =
import(FromOverriddenMethod))
9334 (*ImportedOrErr)->getCanonicalDecl()));
9337 joinErrors(std::move(ImportErrors), ImportedOrErr.takeError());
9339 return ImportErrors;
9345 std::shared_ptr<ASTImporterSharedState> SharedState)
9346 : SharedState(SharedState), ToContext(ToContext), FromContext(FromContext),
9347 ToFileManager(ToFileManager), FromFileManager(FromFileManager),
9352 this->SharedState = std::make_shared<ASTImporterSharedState>();
9355 ImportedDecls[FromContext.getTranslationUnitDecl()] =
9356 ToContext.getTranslationUnitDecl();
9363 "Try to get field index for non-field.");
9367 return std::nullopt;
9370 for (
const auto *D : Owner->decls()) {
9378 llvm_unreachable(
"Field was not found in its parent context.");
9380 return std::nullopt;
9383ASTImporter::FoundDeclsTy
9393 if (SharedState->getLookupTable()) {
9401 dyn_cast<NamespaceDecl>(ReDC));
9402 for (
auto *D : NSChain) {
9404 SharedState->getLookupTable()->lookup(dyn_cast<NamespaceDecl>(D),
9411 SharedState->getLookupTable()->lookup(ReDC, Name);
9412 return FoundDeclsTy(LookupResult.begin(), LookupResult.end());
9416 FoundDeclsTy
Result(NoloadLookupResult.
begin(), NoloadLookupResult.
end());
9433void ASTImporter::AddToLookupTable(
Decl *ToD) {
9434 SharedState->addDeclToLookup(ToD);
9440 return Importer.
Visit(FromD);
9464 llvm::DenseMap<const Type *, const Type *>::iterator Pos =
9465 ImportedTypes.find(FromT);
9466 if (Pos != ImportedTypes.end())
9473 return ToTOrErr.takeError();
9476 ImportedTypes[FromT] = ToTOrErr->getTypePtr();
9478 return ToTOrErr->getTypePtr();
9487 return ToTyOrErr.takeError();
9500 return TOrErr.takeError();
9503 return BeginLocOrErr.takeError();
9505 return ToContext.getTrivialTypeSourceInfo(*TOrErr, *BeginLocOrErr);
9512template <
typename T>
struct AttrArgImporter {
9513 AttrArgImporter(
const AttrArgImporter<T> &) =
delete;
9514 AttrArgImporter(AttrArgImporter<T> &&) =
default;
9515 AttrArgImporter<T> &operator=(
const AttrArgImporter<T> &) =
delete;
9516 AttrArgImporter<T> &operator=(AttrArgImporter<T> &&) =
default;
9519 : To(I.importChecked(Err, From)) {}
9521 const T &value() {
return To; }
9532template <
typename T>
struct AttrArgArrayImporter {
9533 AttrArgArrayImporter(
const AttrArgArrayImporter<T> &) =
delete;
9534 AttrArgArrayImporter(AttrArgArrayImporter<T> &&) =
default;
9535 AttrArgArrayImporter<T> &operator=(
const AttrArgArrayImporter<T> &) =
delete;
9536 AttrArgArrayImporter<T> &operator=(AttrArgArrayImporter<T> &&) =
default;
9538 AttrArgArrayImporter(ASTNodeImporter &I,
Error &Err,
9539 const llvm::iterator_range<T *> &From,
9540 unsigned ArraySize) {
9543 To.reserve(ArraySize);
9547 T *value() {
return To.data(); }
9550 llvm::SmallVector<T, 2> To;
9554 Error Err{Error::success()};
9555 Attr *ToAttr =
nullptr;
9556 ASTImporter &Importer;
9557 ASTNodeImporter NImporter;
9560 AttrImporter(ASTImporter &I) : Importer(I), NImporter(I) {}
9565 template <
class T> AttrArgImporter<T> importArg(
const T &From) {
9566 return AttrArgImporter<T>(NImporter, Err, From);
9572 template <
typename T>
9573 AttrArgArrayImporter<T> importArrayArg(
const llvm::iterator_range<T *> &From,
9574 unsigned ArraySize) {
9575 return AttrArgArrayImporter<T>(NImporter, Err, From, ArraySize);
9586 template <
typename T,
typename... Arg>
9587 void importAttr(
const T *FromAttr, Arg &&...ImportedArg) {
9588 static_assert(std::is_base_of<Attr, T>::value,
9589 "T should be subclass of Attr.");
9590 assert(!ToAttr &&
"Use one AttrImporter to import one Attribute object.");
9592 const IdentifierInfo *ToAttrName = Importer.
Import(FromAttr->getAttrName());
9593 const IdentifierInfo *ToScopeName =
9594 Importer.
Import(FromAttr->getScopeName());
9595 SourceRange ToAttrRange =
9597 SourceLocation ToScopeLoc =
9603 AttributeCommonInfo ToI(
9604 ToAttrName, AttributeScopeInfo(ToScopeName, ToScopeLoc), ToAttrRange,
9605 FromAttr->getParsedKind(), FromAttr->getForm());
9609 std::forward<Arg>(ImportedArg)..., ToI);
9613 if (
auto *ToInheritableAttr = dyn_cast<InheritableAttr>(ToAttr))
9614 ToInheritableAttr->setInherited(FromAttr->isInherited());
9620 void cloneAttr(
const Attr *FromAttr) {
9621 assert(!ToAttr &&
"Use one AttrImporter to import one Attribute object.");
9633 llvm::Expected<Attr *> getResult() && {
9635 return std::move(Err);
9636 assert(ToAttr &&
"Attribute should be created.");
9643 AttrImporter AI(*
this);
9646 switch (FromAttr->
getKind()) {
9647 case attr::Aligned: {
9649 if (From->isAlignmentExpr())
9650 AI.importAttr(From,
true, AI.importArg(From->getAlignmentExpr()).value());
9652 AI.importAttr(From,
false,
9653 AI.importArg(From->getAlignmentType()).value());
9657 case attr::AlignValue: {
9659 AI.importAttr(From, AI.importArg(From->getAlignment()).value());
9663 case attr::Format: {
9665 AI.importAttr(From,
Import(From->getType()), From->getFormatIdx(),
9666 From->getFirstArg());
9670 case attr::EnableIf: {
9672 AI.importAttr(From, AI.importArg(From->getCond()).value(),
9673 From->getMessage());
9677 case attr::AssertCapability: {
9680 AI.importArrayArg(From->args(), From->args_size()).value(),
9684 case attr::AcquireCapability: {
9687 AI.importArrayArg(From->args(), From->args_size()).value(),
9691 case attr::TryAcquireCapability: {
9693 AI.importAttr(From, AI.importArg(From->getSuccessValue()).value(),
9694 AI.importArrayArg(From->args(), From->args_size()).value(),
9698 case attr::ReleaseCapability: {
9701 AI.importArrayArg(From->args(), From->args_size()).value(),
9705 case attr::RequiresCapability: {
9708 AI.importArrayArg(From->args(), From->args_size()).value(),
9712 case attr::GuardedBy: {
9715 AI.importArrayArg(From->args(), From->args_size()).value(),
9719 case attr::PtGuardedBy: {
9722 AI.importArrayArg(From->args(), From->args_size()).value(),
9726 case attr::AcquiredAfter: {
9729 AI.importArrayArg(From->args(), From->args_size()).value(),
9733 case attr::AcquiredBefore: {
9736 AI.importArrayArg(From->args(), From->args_size()).value(),
9740 case attr::LockReturned: {
9742 AI.importAttr(From, AI.importArg(From->getArg()).value());
9745 case attr::LocksExcluded: {
9748 AI.importArrayArg(From->args(), From->args_size()).value(),
9756 AI.cloneAttr(FromAttr);
9761 return std::move(AI).getResult();
9765 return ImportedDecls.lookup(FromD);
9769 auto FromDPos = ImportedFromDecls.find(ToD);
9770 if (FromDPos == ImportedFromDecls.end())
9780 ImportPath.push(FromD);
9781 llvm::scope_exit ImportPathBuilder([
this]() { ImportPath.pop(); });
9786 return make_error<ASTImportError>(*
Error);
9792 if (
auto Error = SharedState->getImportDeclErrorIfAny(ToD)) {
9794 return make_error<ASTImportError>(*
Error);
9801 if (ImportPath.hasCycleAtBack())
9802 SavedImportPaths[FromD].push_back(ImportPath.copyCycleAtBack());
9811 auto Pos = ImportedDecls.find(FromD);
9812 bool ToDWasCreated = Pos != ImportedDecls.end();
9816 Decl *CreatedToD = ToDWasCreated ? Pos->second :
nullptr;
9817 if (ToDWasCreated) {
9820 auto *ToD = CreatedToD;
9821 ImportedDecls.erase(Pos);
9826 if (
const auto *FromTD = dyn_cast<TagDecl>(FromD)) {
9827 if (
const Type *FromTy =
9829 ImportedTypes.erase(FromTy);
9843 auto PosF = ImportedFromDecls.find(ToD);
9844 if (PosF != ImportedFromDecls.end()) {
9849 SharedState->removeDeclFromLookup(ToD);
9850 ImportedFromDecls.erase(PosF);
9862 handleAllErrors(ToDOrErr.takeError(),
9867 SharedState->setImportDeclError(CreatedToD, ErrOut);
9871 for (
const auto &Path : SavedImportPaths[FromD]) {
9874 Decl *PrevFromDi = FromD;
9875 for (
Decl *FromDi : Path) {
9877 if (FromDi == FromD)
9884 PrevFromDi = FromDi;
9887 if (
const auto *FromTDi = dyn_cast<TagDecl>(FromDi)) {
9888 if (
const Type *FromTyi =
9890 ImportedTypes.erase(FromTyi);
9896 auto Ii = ImportedDecls.find(FromDi);
9897 if (Ii != ImportedDecls.end())
9898 SharedState->setImportDeclError(Ii->second, ErrOut);
9903 SavedImportPaths.erase(FromD);
9906 return make_error<ASTImportError>(ErrOut);
9918 return make_error<ASTImportError>(*Err);
9924 if (
auto Error = SharedState->getImportDeclErrorIfAny(ToD)) {
9926 return make_error<ASTImportError>(*
Error);
9929 assert(ImportedDecls.count(FromD) != 0 &&
"Missing call to MapImported?");
9933 auto ToAttrOrErr =
Import(FromAttr);
9937 return ToAttrOrErr.takeError();
9944 SavedImportPaths.erase(FromD);
9959 return ToDCOrErr.takeError();
9964 if (
auto *ToRecord = dyn_cast<RecordDecl>(ToDC)) {
9966 if (ToRecord->isCompleteDefinition())
9974 if (FromRecord->getASTContext().getExternalSource() &&
9975 !FromRecord->isCompleteDefinition())
9976 FromRecord->getASTContext().getExternalSource()->CompleteType(FromRecord);
9978 if (FromRecord->isCompleteDefinition())
9981 return std::move(Err);
9982 }
else if (
auto *ToEnum = dyn_cast<EnumDecl>(ToDC)) {
9984 if (ToEnum->isCompleteDefinition()) {
9986 }
else if (FromEnum->isCompleteDefinition()) {
9989 return std::move(Err);
9993 }
else if (
auto *ToClass = dyn_cast<ObjCInterfaceDecl>(ToDC)) {
9995 if (ToClass->getDefinition()) {
10000 return std::move(Err);
10004 }
else if (
auto *ToProto = dyn_cast<ObjCProtocolDecl>(ToDC)) {
10006 if (ToProto->getDefinition()) {
10011 return std::move(Err);
10022 return cast_or_null<Expr>(*ToSOrErr);
10024 return ToSOrErr.takeError();
10032 llvm::DenseMap<Stmt *, Stmt *>::iterator Pos = ImportedStmts.find(FromS);
10033 if (Pos != ImportedStmts.end())
10034 return Pos->second;
10042 if (
auto *ToE = dyn_cast<Expr>(*ToSOrErr)) {
10046 ToE->setValueKind(FromE->getValueKind());
10047 ToE->setObjectKind(FromE->getObjectKind());
10048 ToE->setDependence(FromE->getDependence());
10052 ImportedStmts[FromS] = *ToSOrErr;
10063 auto NSOrErr =
Import(Namespace);
10065 return NSOrErr.takeError();
10066 auto PrefixOrErr =
Import(Prefix);
10068 return PrefixOrErr.takeError();
10076 return RDOrErr.takeError();
10081 return TyOrErr.takeError();
10084 llvm_unreachable(
"Invalid nested name specifier kind");
10096 NestedNames.push_back(NNS);
10102 while (!NestedNames.empty()) {
10103 NNS = NestedNames.pop_back_val();
10106 return std::move(Err);
10113 return std::move(Err);
10117 return std::move(Err);
10123 ToLocalBeginLoc, ToLocalEndLoc);
10129 return std::move(Err);
10142 if (!ToSourceRangeOrErr)
10143 return ToSourceRangeOrErr.takeError();
10146 ToSourceRangeOrErr->getBegin(),
10147 ToSourceRangeOrErr->getEnd());
10151 llvm_unreachable(
"unexpected null nested name specifier");
10164 return ToTemplateOrErr.takeError();
10169 for (
auto *I : *FromStorage) {
10170 if (
auto ToOrErr =
Import(I))
10173 return ToOrErr.takeError();
10175 return ToContext.getOverloadedTemplateName(ToTemplates.
begin(),
10176 ToTemplates.
end());
10182 if (!DeclNameOrErr)
10183 return DeclNameOrErr.takeError();
10184 return ToContext.getAssumedTemplateName(*DeclNameOrErr);
10190 if (!QualifierOrErr)
10191 return QualifierOrErr.takeError();
10194 return TNOrErr.takeError();
10195 return ToContext.getQualifiedTemplateName(
10202 if (!QualifierOrErr)
10203 return QualifierOrErr.takeError();
10204 return ToContext.getDependentTemplateName(
10212 if (!ReplacementOrErr)
10213 return ReplacementOrErr.takeError();
10216 if (!AssociatedDeclOrErr)
10217 return AssociatedDeclOrErr.takeError();
10219 return ToContext.getSubstTemplateTemplateParm(
10220 *ReplacementOrErr, *AssociatedDeclOrErr, Subst->
getIndex(),
10228 auto ArgPackOrErr =
10231 return ArgPackOrErr.takeError();
10234 if (!AssociatedDeclOrErr)
10235 return AssociatedDeclOrErr.takeError();
10237 return ToContext.getSubstTemplateTemplateParmPack(
10238 *ArgPackOrErr, *AssociatedDeclOrErr, SubstPack->
getIndex(),
10244 return UsingOrError.takeError();
10248 llvm_unreachable(
"Unexpected DeducedTemplate");
10251 llvm_unreachable(
"Invalid template name kind");
10263 if (!ToFileIDOrErr)
10264 return ToFileIDOrErr.takeError();
10272 return std::move(Err);
10274 return std::move(Err);
10280 llvm::DenseMap<FileID, FileID>::iterator Pos = ImportedFileIDs.find(FromID);
10281 if (Pos != ImportedFileIDs.end())
10282 return Pos->second;
10294 return ToSpLoc.takeError();
10297 return ToExLocS.takeError();
10307 return ToExLocE.takeError();
10313 if (!IsBuiltin && !
Cache->BufferOverridden) {
10317 return ToIncludeLoc.takeError();
10328 if (
Cache->OrigEntry &&
Cache->OrigEntry->getDir()) {
10334 ToFileManager.getOptionalFileRef(
Cache->OrigEntry->getName());
10339 ToID = ToSM.
createFileID(*Entry, ToIncludeLocOrFakeLoc,
10346 std::optional<llvm::MemoryBufferRef> FromBuf =
10347 Cache->getBufferOrNone(FromContext.getDiagnostics(),
10352 std::unique_ptr<llvm::MemoryBuffer> ToBuf =
10353 llvm::MemoryBuffer::getMemBufferCopy(FromBuf->getBuffer(),
10354 FromBuf->getBufferIdentifier());
10360 assert(ToID.
isValid() &&
"Unexpected invalid fileID was created.");
10362 ImportedFileIDs[FromID] = ToID;
10369 return ToExprOrErr.takeError();
10372 if (!LParenLocOrErr)
10373 return LParenLocOrErr.takeError();
10376 if (!RParenLocOrErr)
10377 return RParenLocOrErr.takeError();
10382 return ToTInfoOrErr.takeError();
10387 return std::move(Err);
10390 ToContext, *ToTInfoOrErr, From->
isBaseVirtual(), *LParenLocOrErr,
10391 *ToExprOrErr, *RParenLocOrErr, EllipsisLoc);
10395 return ToFieldOrErr.takeError();
10398 if (!MemberLocOrErr)
10399 return MemberLocOrErr.takeError();
10402 ToContext, cast_or_null<FieldDecl>(*ToFieldOrErr), *MemberLocOrErr,
10403 *LParenLocOrErr, *ToExprOrErr, *RParenLocOrErr);
10406 if (!ToIFieldOrErr)
10407 return ToIFieldOrErr.takeError();
10410 if (!MemberLocOrErr)
10411 return MemberLocOrErr.takeError();
10414 ToContext, cast_or_null<IndirectFieldDecl>(*ToIFieldOrErr),
10415 *MemberLocOrErr, *LParenLocOrErr, *ToExprOrErr, *RParenLocOrErr);
10419 return ToTInfoOrErr.takeError();
10421 return new (ToContext)
10423 *ToExprOrErr, *RParenLocOrErr);
10426 return make_error<ASTImportError>();
10432 auto Pos = ImportedCXXBaseSpecifiers.find(BaseSpec);
10433 if (Pos != ImportedCXXBaseSpecifiers.end())
10434 return Pos->second;
10437 if (!ToSourceRange)
10438 return ToSourceRange.takeError();
10441 return ToTSI.takeError();
10443 if (!ToEllipsisLoc)
10444 return ToEllipsisLoc.takeError();
10448 ImportedCXXBaseSpecifiers[BaseSpec] =
Imported;
10460 return ToOrErr.takeError();
10461 Decl *To = *ToOrErr;
10466 if (
auto *ToRecord = dyn_cast<RecordDecl>(To)) {
10467 if (!ToRecord->getDefinition()) {
10474 if (
auto *ToEnum = dyn_cast<EnumDecl>(To)) {
10475 if (!ToEnum->getDefinition()) {
10481 if (
auto *ToIFace = dyn_cast<ObjCInterfaceDecl>(To)) {
10482 if (!ToIFace->getDefinition()) {
10489 if (
auto *ToProto = dyn_cast<ObjCProtocolDecl>(To)) {
10490 if (!ToProto->getDefinition()) {
10514 return ToSelOrErr.takeError();
10518 return ToContext.DeclarationNames.getCXXConstructorName(
10519 ToContext.getCanonicalType(*ToTyOrErr));
10521 return ToTyOrErr.takeError();
10526 return ToContext.DeclarationNames.getCXXDestructorName(
10527 ToContext.getCanonicalType(*ToTyOrErr));
10529 return ToTyOrErr.takeError();
10534 return ToContext.DeclarationNames.getCXXDeductionGuideName(
10537 return ToTemplateOrErr.takeError();
10542 return ToContext.DeclarationNames.getCXXConversionFunctionName(
10543 ToContext.getCanonicalType(*ToTyOrErr));
10545 return ToTyOrErr.takeError();
10549 return ToContext.DeclarationNames.getCXXOperatorName(
10553 return ToContext.DeclarationNames.getCXXLiteralOperatorName(
10561 llvm_unreachable(
"Invalid DeclarationName Kind!");
10589 for (
unsigned I = 1, N = FromSel.
getNumArgs(); I < N; ++I)
10591 return ToContext.Selectors.getSelector(FromSel.
getNumArgs(), Idents.data());
10597 llvm::Error Err = llvm::Error::success();
10598 auto ImportLoop = [&](
const APValue *From,
APValue *To,
unsigned Size) {
10599 for (
unsigned Idx = 0; Idx < Size; Idx++) {
10604 switch (FromValue.
getKind()) {
10618 ImportLoop(((
const APValue::Vec *)(
const char *)&FromValue.Data)->Elts,
10624 llvm_unreachable(
"Matrix APValue import not yet supported");
10628 ImportLoop(((
const APValue::Arr *)(
const char *)&FromValue.Data)->Elts,
10629 ((
const APValue::Arr *)(
const char *)&
Result.Data)->Elts,
10637 ((
const APValue::StructData *)(
const char *)&FromValue.Data)->Elts,
10638 ((
const APValue::StructData *)(
const char *)&
Result.Data)->Elts,
10647 return std::move(Err);
10652 Result.MakeAddrLabelDiff();
10656 return std::move(Err);
10662 const Decl *ImpMemPtrDecl =
10665 return std::move(Err);
10667 Result.setMemberPointerUninit(
10676 return std::move(Err);
10686 "in C++20 dynamic allocation are transient so they shouldn't "
10687 "appear in the AST");
10689 if (
const auto *E =
10691 FromElemTy = E->getType();
10694 return std::move(Err);
10704 return std::move(Err);
10716 return std::move(Err);
10729 for (
unsigned LoopIdx = 0; LoopIdx < PathLength; LoopIdx++) {
10731 const Decl *FromDecl =
10732 FromPath[LoopIdx].getAsBaseOrMember().getPointer();
10735 return std::move(Err);
10736 if (
auto *RD = dyn_cast<CXXRecordDecl>(FromDecl))
10737 FromElemTy = Importer.FromContext.getCanonicalTagType(RD);
10741 ImpDecl, FromPath[LoopIdx].getAsBaseOrMember().getInt()));
10744 Importer.FromContext.getAsArrayType(FromElemTy)->getElementType();
10746 FromPath[LoopIdx].getAsArrayIndex());
10754 return std::move(Err);
10762 unsigned NumDecls) {
10772 if (LastDiagFromFrom)
10773 ToContext.getDiagnostics().notePriorDiagnosticFrom(
10774 FromContext.getDiagnostics());
10775 LastDiagFromFrom =
false;
10776 return ToContext.getDiagnostics().Report(Loc, DiagID);
10780 if (!LastDiagFromFrom)
10781 FromContext.getDiagnostics().notePriorDiagnosticFrom(
10782 ToContext.getDiagnostics());
10783 LastDiagFromFrom =
true;
10784 return FromContext.getDiagnostics().Report(Loc, DiagID);
10788 if (
auto *ID = dyn_cast<ObjCInterfaceDecl>(D)) {
10789 if (!ID->getDefinition())
10790 ID->startDefinition();
10792 else if (
auto *PD = dyn_cast<ObjCProtocolDecl>(D)) {
10793 if (!PD->getDefinition())
10794 PD->startDefinition();
10796 else if (
auto *TD = dyn_cast<TagDecl>(D)) {
10797 if (!TD->getDefinition() && !TD->isBeingDefined()) {
10798 TD->startDefinition();
10799 TD->setCompleteDefinition(
true);
10803 assert(0 &&
"CompleteDecl called on a Decl that can't be completed");
10808 auto [Pos, Inserted] = ImportedDecls.try_emplace(From, To);
10809 assert((Inserted || Pos->second == To) &&
10810 "Try to import an already imported Decl");
10812 return Pos->second;
10815 ImportedFromDecls[To] = From;
10820 AddToLookupTable(To);
10824std::optional<ASTImportError>
10826 auto Pos = ImportDeclErrors.find(FromD);
10827 if (Pos != ImportDeclErrors.end())
10828 return Pos->second;
10830 return std::nullopt;
10834 auto InsertRes = ImportDeclErrors.insert({From,
Error});
10838 assert(InsertRes.second || InsertRes.first->second.Error ==
Error.Error);
10843 llvm::DenseMap<const Type *, const Type *>::iterator Pos =
10845 if (Pos != ImportedTypes.end()) {
10847 if (ToContext.hasSameType(*ToFromOrErr, To))
10850 llvm::consumeError(ToFromOrErr.takeError());
10855 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)
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 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.
void AddPartialSpecialization(ClassTemplatePartialSpecializationDecl *D, void *InsertPos)
Insert the specified partial specialization knowing that it is not already in.
ClassTemplateDecl * getMostRecentDecl()
CXXRecordDecl * getTemplatedDecl() const
Get the underlying class declarations of the template.
ClassTemplatePartialSpecializationDecl * findPartialSpecialization(ArrayRef< TemplateArgument > Args, TemplateParameterList *TPL, void *&InsertPos)
Return the partial specialization with the provided arguments if it exists, otherwise return the inse...
bool isThisDeclarationADefinition() const
Returns whether this template declaration defines the primary class pattern.
void AddSpecialization(ClassTemplateSpecializationDecl *D, void *InsertPos)
Insert the specified specialization knowing that it is not already in.
ClassTemplateSpecializationDecl * findSpecialization(ArrayRef< TemplateArgument > Args, void *&InsertPos)
Return the specialization with the provided arguments if it exists, otherwise return the insertion po...
ClassTemplatePartialSpecializationDecl * getInstantiatedFromMember() const
Retrieve the member class template partial specialization from which this particular class template p...
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
Represents a class template specialization, which refers to a class template with a given set of temp...
TemplateSpecializationKind getSpecializationKind() const
Determine the kind of specialization that this declaration represents.
const ASTTemplateArgumentListInfo * getTemplateArgsAsWritten() const
Retrieve the template argument list as written in the sources, if any.
ClassTemplateDecl * getSpecializedTemplate() const
Retrieve the template that this specialization specializes.
void setPointOfInstantiation(SourceLocation Loc)
SourceLocation getPointOfInstantiation() const
Get the point of instantiation (if any), or null if none.
void setExternKeywordLoc(SourceLocation Loc)
Sets the location of the extern keyword.
void setSpecializationKind(TemplateSpecializationKind TSK)
const TemplateArgumentList & getTemplateArgs() const
Retrieve the template arguments of the class template specialization.
SourceLocation getExternKeywordLoc() const
Gets the location of the extern keyword, if present.
SourceLocation getTemplateKeywordLoc() const
Gets the location of the template keyword, if present.
void setTemplateKeywordLoc(SourceLocation Loc)
Sets the location of the template keyword.
const TemplateArgumentList & getTemplateInstantiationArgs() const
Retrieve the set of template arguments that should be used to instantiate members of the class templa...
llvm::PointerUnion< ClassTemplateDecl *, ClassTemplatePartialSpecializationDecl * > getInstantiatedFrom() const
If this class template specialization is an instantiation of a template (rather than an explicit spec...
bool hasStrictPackMatch() const
void setInstantiationOf(ClassTemplatePartialSpecializationDecl *PartialSpec, const TemplateArgumentList *TemplateArgs)
Note that this class template specialization is actually an instantiation of the given class template...
bool isExplicitInstantiationOrSpecialization() const
True if this declaration is an explicit specialization, explicit instantiation declaration,...
void setTemplateArgsAsWritten(const ASTTemplateArgumentListInfo *ArgsWritten)
Set the template argument list as written in the sources.
CompoundAssignOperator - For compound assignments (e.g.
QualType getComputationLHSType() const
static CompoundAssignOperator * Create(const ASTContext &C, Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy, ExprValueKind VK, ExprObjectKind OK, SourceLocation opLoc, FPOptionsOverride FPFeatures, QualType CompLHSType=QualType(), QualType CompResultType=QualType())
QualType getComputationResultType() const
CompoundLiteralExpr - [C99 6.5.2.5].
SourceLocation getLParenLoc() const
const Expr * getInitializer() const
TypeSourceInfo * getTypeSourceInfo() const
CompoundStmt - This represents a group of statements like { stmt stmt }.
FPOptionsOverride getStoredFPFeatures() const
Get FPOptionsOverride from trailing storage.
SourceLocation getLBracLoc() const
bool hasStoredFPFeatures() const
static CompoundStmt * Create(const ASTContext &C, ArrayRef< Stmt * > Stmts, FPOptionsOverride FPFeatures, SourceLocation LB, SourceLocation RB)
SourceLocation getRBracLoc() const
Declaration of a C++20 concept.
Expr * getConstraintExpr() const
A reference to a concept and its template args, as it appears in the code.
const NestedNameSpecifierLoc & getNestedNameSpecifierLoc() const
NamedDecl * getFoundDecl() const
const DeclarationNameInfo & getConceptNameInfo() const
const ASTTemplateArgumentListInfo * getTemplateArgsAsWritten() const
static ConceptReference * Create(const ASTContext &C, NestedNameSpecifierLoc NNS, SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo, NamedDecl *FoundDecl, TemplateDecl *NamedConcept, const ASTTemplateArgumentListInfo *ArgsAsWritten)
TemplateDecl * getNamedConcept() const
SourceLocation getTemplateKWLoc() const
Represents the specialization of a concept - evaluates to a prvalue of type bool.
static ConceptSpecializationExpr * Create(const ASTContext &C, ConceptReference *ConceptRef, ImplicitConceptSpecializationDecl *SpecDecl, const ConstraintSatisfaction *Satisfaction)
ConceptReference * getConceptReference() const
const ImplicitConceptSpecializationDecl * getSpecializationDecl() const
const ASTConstraintSatisfaction & getSatisfaction() const
Get elaborated satisfaction info about the template arguments' satisfaction of the named concept.
ConditionalOperator - The ?
Expr * getCond() const
getCond - Return the expression representing the condition for the ?
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.
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
Retrieves the location of the 'friend' keyword.
SourceLocation getEllipsisLoc() const
Retrieves the location of the '...', if present.
NamedDecl * getFriendDecl() const
If this friend declaration doesn't name a type, return the inner declaration.
TypeSourceInfo * getFriendType() const
If this friend declaration names an (untemplated but possibly dependent) type, return the type; other...
const Expr * getSubExpr() const
static DefaultedOrDeletedFunctionInfo * Create(ASTContext &Context, ArrayRef< DeclAccessPair > Lookups, 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.
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
getNumConcatenated - Get the number of string literal tokens that were concatenated in translation ph...
Represents a reference to a non-type template parameter that has been substituted with a template arg...
Decl * getAssociatedDecl() const
A template-like entity which owns the whole pattern being substituted.
UnsignedOrNone getPackIndex() const
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.
DependentTemplateName * getAsDependentTemplateName() const
Retrieve the underlying dependent template name structure, if any.
QualifiedTemplateName * getAsQualifiedTemplateName() const
Retrieve the underlying qualified template name structure, if any.
OverloadedTemplateStorage * getAsOverloadedTemplate() const
Retrieve the underlying, overloaded function template declarations that this template name refers to,...
AssumedTemplateStorage * getAsAssumedTemplateName() const
Retrieve information on a name that has been assumed to be a template-name in order to permit a call ...
@ UsingTemplate
A template name that refers to a template declaration found through a specific using shadow declarati...
@ OverloadedTemplate
A set of overloaded template declarations.
@ Template
A single template declaration.
@ DependentTemplate
A dependent template name that has not been resolved to a template (or set of templates).
@ SubstTemplateTemplateParm
A template template parameter that has been substituted for some other template name.
@ SubstTemplateTemplateParmPack
A template template parameter pack that has been substituted for a template template argument pack,...
@ DeducedTemplate
A template name that refers to another TemplateName with deduced default arguments.
@ QualifiedTemplate
A qualified template name, where the qualification is kept to describe the source code as written.
@ AssumedTemplate
An unqualified-id that has been assumed to name a function template that will be found by ADL.
UsingShadowDecl * getAsUsingShadowDecl() const
Retrieve the using shadow declaration through which the underlying template declaration is introduced...
SubstTemplateTemplateParmPackStorage * getAsSubstTemplateTemplateParmPack() const
Retrieve the substituted template template parameter pack, if known.
SubstTemplateTemplateParmStorage * getAsSubstTemplateTemplateParm() const
Retrieve the substituted template template parameter, if known.
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