57#include "llvm/ADT/ArrayRef.h"
58#include "llvm/ADT/DenseMap.h"
59#include "llvm/ADT/STLExtras.h"
60#include "llvm/ADT/ScopeExit.h"
61#include "llvm/ADT/SmallVector.h"
62#include "llvm/Support/ErrorHandling.h"
63#include "llvm/Support/MemoryBuffer.h"
74 using llvm::make_error;
89 return "NameConflict";
91 return "UnsupportedConstruct";
93 return "Unknown error";
95 llvm_unreachable(
"Invalid error code.");
96 return "Invalid error code.";
102 llvm_unreachable(
"Function not implemented.");
113 Redecls.push_back(R);
116 std::reverse(Redecls.begin(), Redecls.end());
121 if (
auto *FD = dyn_cast<FunctionDecl>(D))
123 if (
auto *VD = dyn_cast<VarDecl>(D))
125 if (
auto *TD = dyn_cast<TagDecl>(D))
127 llvm_unreachable(
"Bad declaration kind");
148 bool const IgnoreChildErrors;
152 : FromDC(FromDC), IgnoreChildErrors(!
isa<
TagDecl>(FromDC)) {}
162 if (ChildErr && !IgnoreChildErrors)
163 ResultErr = joinErrors(std::move(ResultErr), std::move(ChildErr));
165 consumeError(std::move(ChildErr));
171 if (!IgnoreChildErrors || !FromDC)
173 return FromDC->containsDecl(FromChildD);
179 public StmtVisitor<ASTNodeImporter, ExpectedStmt> {
183 template <
typename ImportT>
184 [[nodiscard]]
Error importInto(ImportT &To,
const ImportT &From) {
185 return Importer.importInto(To, From);
191 template <
typename ImportT>
192 [[nodiscard]]
Error importInto(ImportT *&To, ImportT *From) {
193 auto ToOrErr = Importer.Import(From);
195 To = cast_or_null<ImportT>(*ToOrErr);
196 return ToOrErr.takeError();
201 template <
typename T>
205 auto ToOrErr = Importer.Import(From);
207 return ToOrErr.takeError();
208 return cast_or_null<T>(*ToOrErr);
211 template <
typename T>
212 auto import(
const T *From) {
213 return import(
const_cast<T *
>(From));
217 template <
typename T>
219 return Importer.Import(From);
223 template <
typename T>
227 return import(*From);
234 template <
typename ToDeclT>
struct CallOverloadedCreateFun {
235 template <
typename... Args>
decltype(
auto)
operator()(Args &&... args) {
236 return ToDeclT::Create(std::forward<Args>(args)...);
246 template <
typename ToDeclT,
typename FromDeclT,
typename... Args>
247 [[nodiscard]]
bool GetImportedOrCreateDecl(ToDeclT *&ToD, FromDeclT *FromD,
252 CallOverloadedCreateFun<ToDeclT> OC;
253 return GetImportedOrCreateSpecialDecl(ToD, OC, FromD,
254 std::forward<Args>(args)...);
261 template <
typename NewDeclT,
typename ToDeclT,
typename FromDeclT,
263 [[nodiscard]]
bool GetImportedOrCreateDecl(ToDeclT *&ToD, FromDeclT *FromD,
265 CallOverloadedCreateFun<NewDeclT> OC;
266 return GetImportedOrCreateSpecialDecl(ToD, OC, FromD,
267 std::forward<Args>(args)...);
271 template <
typename ToDeclT,
typename CreateFunT,
typename FromDeclT,
274 GetImportedOrCreateSpecialDecl(ToDeclT *&ToD, CreateFunT CreateFun,
275 FromDeclT *FromD, Args &&...args) {
276 if (Importer.getImportDeclErrorIfAny(FromD)) {
280 ToD = cast_or_null<ToDeclT>(Importer.GetAlreadyImportedOrNull(FromD));
283 ToD = CreateFun(std::forward<Args>(args)...);
285 Importer.RegisterImportedDecl(FromD, ToD);
286 Importer.SharedState->markAsNewDecl(ToD);
287 InitializeImportedDecl(FromD, ToD);
291 void InitializeImportedDecl(
Decl *FromD,
Decl *ToD) {
295 if (FromD->isImplicit())
303 if (D->doesThisDeclarationHaveABody() &&
309 void addDeclToContexts(
Decl *FromD,
Decl *ToD) {
310 if (Importer.isMinimalImport()) {
314 if (!FromD->getDescribedTemplate() &&
321 DeclContext *FromLexicalDC = FromD->getLexicalDeclContext();
325 bool Visible =
false;
338 if (
auto *FromNamed = dyn_cast<NamedDecl>(FromD)) {
341 FromDC->
lookup(FromNamed->getDeclName());
342 if (llvm::is_contained(FromLookup, FromNamed))
355 LT->update(TP, OldDC);
359 updateLookupTableForTemplateParameters(
360 Params, Importer.getToContext().getTranslationUnitDecl());
363 template <
typename TemplateParmDeclT>
364 Error importTemplateParameterDefaultArgument(
const TemplateParmDeclT *D,
365 TemplateParmDeclT *ToD) {
366 if (D->hasDefaultArgument()) {
367 if (D->defaultArgumentWasInherited()) {
369 import(D->getDefaultArgStorage().getInheritedFrom());
370 if (!ToInheritedFromOrErr)
371 return ToInheritedFromOrErr.takeError();
372 TemplateParmDeclT *ToInheritedFrom = *ToInheritedFromOrErr;
373 if (!ToInheritedFrom->hasDefaultArgument()) {
377 import(D->getDefaultArgStorage()
379 ->getDefaultArgument());
380 if (!ToInheritedDefaultArgOrErr)
381 return ToInheritedDefaultArgOrErr.takeError();
382 ToInheritedFrom->setDefaultArgument(Importer.getToContext(),
383 *ToInheritedDefaultArgOrErr);
385 ToD->setInheritedDefaultArgument(ToD->getASTContext(),
389 import(D->getDefaultArgument());
390 if (!ToDefaultArgOrErr)
391 return ToDefaultArgOrErr.takeError();
394 if (!ToD->hasDefaultArgument())
395 ToD->setDefaultArgument(Importer.getToContext(),
399 return Error::success();
411#define TYPE(Class, Base) \
412 ExpectedType Visit##Class##Type(const Class##Type *T);
413#include "clang/AST/TypeNodes.inc"
450 (IDK ==
IDK_Default && !Importer.isMinimalImport());
471 template <
typename InContainerTy>
475 template<
typename InContainerTy>
482 std::tuple<FunctionTemplateDecl *, TemplateArgsTy>;
487 template <
typename DeclTy>
511 template <
typename T>
515 bool IgnoreTemplateParmDepth =
false);
727 Err = MaybeVal.takeError();
733 template<
typename IIter,
typename OIter>
735 using ItemT = std::remove_reference_t<
decltype(*Obegin)>;
736 for (; Ibegin != Iend; ++Ibegin, ++Obegin) {
739 return ToOrErr.takeError();
742 return Error::success();
749 template<
typename InContainerTy,
typename OutContainerTy>
751 const InContainerTy &InContainer, OutContainerTy &OutContainer) {
753 InContainer.begin(), InContainer.end(), OutContainer.begin());
756 template<
typename InContainerTy,
typename OIter>
768template <
typename InContainerTy>
772 auto ToLAngleLocOrErr =
import(FromLAngleLoc);
773 if (!ToLAngleLocOrErr)
774 return ToLAngleLocOrErr.takeError();
775 auto ToRAngleLocOrErr =
import(FromRAngleLoc);
776 if (!ToRAngleLocOrErr)
777 return ToRAngleLocOrErr.takeError();
782 Result = std::move(ToTAInfo);
783 return Error::success();
799 From.LAngleLoc, From.RAngleLoc, From.arguments(),
Result);
811 if (
Error Err = importInto(std::get<0>(
Result), FTSInfo->getTemplate()))
812 return std::move(Err);
817 return std::move(Err);
827 return std::move(Err);
830 if (!ToRequiresClause)
831 return ToRequiresClause.takeError();
834 if (!ToTemplateLocOrErr)
835 return ToTemplateLocOrErr.takeError();
837 if (!ToLAngleLocOrErr)
838 return ToLAngleLocOrErr.takeError();
840 if (!ToRAngleLocOrErr)
841 return ToRAngleLocOrErr.takeError();
844 Importer.getToContext(),
862 return ToTypeOrErr.takeError();
870 return ToTypeOrErr.takeError();
877 return ToOrErr.takeError();
880 return ToTypeOrErr.takeError();
881 return TemplateArgument(dyn_cast<ValueDecl>((*ToOrErr)->getCanonicalDecl()),
888 return ToTypeOrErr.takeError();
896 return ToTypeOrErr.takeError();
899 return ToValueOrErr.takeError();
906 if (!ToTemplateOrErr)
907 return ToTemplateOrErr.takeError();
915 if (!ToTemplateOrErr)
916 return ToTemplateOrErr.takeError();
927 return ToExpr.takeError();
933 return std::move(Err);
939 llvm_unreachable(
"Invalid template argument kind");
947 return ArgOrErr.takeError();
956 return E.takeError();
962 return TSIOrErr.takeError();
965 if (!ToTemplateKWLocOrErr)
966 return ToTemplateKWLocOrErr.takeError();
968 if (!ToTemplateQualifierLocOrErr)
969 return ToTemplateQualifierLocOrErr.takeError();
971 if (!ToTemplateNameLocOrErr)
972 return ToTemplateNameLocOrErr.takeError();
973 auto ToTemplateEllipsisLocOrErr =
975 if (!ToTemplateEllipsisLocOrErr)
976 return ToTemplateEllipsisLocOrErr.takeError();
978 Importer.getToContext(), *ToTemplateKWLocOrErr,
979 *ToTemplateQualifierLocOrErr, *ToTemplateNameLocOrErr,
980 *ToTemplateEllipsisLocOrErr);
990 size_t NumDecls = DG.
end() - DG.
begin();
992 ToDecls.reserve(NumDecls);
993 for (
Decl *FromD : DG) {
994 if (
auto ToDOrErr =
import(FromD))
995 ToDecls.push_back(*ToDOrErr);
997 return ToDOrErr.takeError();
1012 return ToDotLocOrErr.takeError();
1015 if (!ToFieldLocOrErr)
1016 return ToFieldLocOrErr.takeError();
1019 ToFieldName, *ToDotLocOrErr, *ToFieldLocOrErr);
1023 if (!ToLBracketLocOrErr)
1024 return ToLBracketLocOrErr.takeError();
1027 if (!ToRBracketLocOrErr)
1028 return ToRBracketLocOrErr.takeError();
1032 *ToLBracketLocOrErr,
1033 *ToRBracketLocOrErr);
1036 if (!ToEllipsisLocOrErr)
1037 return ToEllipsisLocOrErr.takeError();
1041 D.
getArrayIndex(), *ToLBracketLocOrErr, *ToEllipsisLocOrErr,
1042 *ToRBracketLocOrErr);
1047 Error Err = Error::success();
1050 auto ToConceptNameLoc =
1056 return std::move(Err);
1059 if (ASTTemplateArgs)
1061 return std::move(Err);
1063 Importer.getToContext(), ToNNS, ToTemplateKWLoc,
1067 Importer.getToContext(), ToTAInfo)
1073 char *ToStore =
new (Importer.getToContext())
char[FromStr.size()];
1074 std::copy(FromStr.begin(), FromStr.end(), ToStore);
1075 return StringRef(ToStore, FromStr.size());
1084 if (
const Expr *E = dyn_cast<const Expr *>(*
Record)) {
1087 return ToSecondExpr.takeError();
1088 ToSat.
Details.emplace_back(ToSecondExpr.get());
1089 }
else if (
auto CR = dyn_cast<const ConceptReference *>(*
Record)) {
1092 return ToCROrErr.takeError();
1093 ToSat.
Details.emplace_back(ToCROrErr.get());
1095 auto Pair = dyn_cast<const ConstraintSubstitutionDiagnostic *>(*
Record);
1099 return ToPairFirst.takeError();
1101 ToSat.
Details.emplace_back(
new (Importer.getToContext())
1103 ToPairFirst.get(), ToPairSecond});
1107 return Error::success();
1112ASTNodeImporter::import(
1117 return ToLoc.takeError();
1119 return new (Importer.getToContext())
1131 return DiagOrErr.takeError();
1132 return new (Importer.getToContext()) TypeRequirement(*DiagOrErr);
1136 return ToType.takeError();
1137 return new (Importer.getToContext()) TypeRequirement(*ToType);
1145 bool IsRKSimple = From->
getKind() == Requirement::RK_Simple;
1148 std::optional<ExprRequirement::ReturnTypeRequirement> Req;
1154 const ExprRequirement::ReturnTypeRequirement &FromTypeRequirement =
1157 if (FromTypeRequirement.isTypeConstraint()) {
1158 const bool IsDependent = FromTypeRequirement.isDependent();
1160 import(FromTypeRequirement.getTypeConstraintTemplateParameterList());
1162 return ParamsOrErr.takeError();
1163 if (Status >= ExprRequirement::SS_ConstraintsNotSatisfied) {
1164 auto SubstConstraintExprOrErr =
1166 if (!SubstConstraintExprOrErr)
1167 return SubstConstraintExprOrErr.takeError();
1168 SubstitutedConstraintExpr = SubstConstraintExprOrErr.get();
1170 Req.emplace(ParamsOrErr.get(), IsDependent);
1171 }
else if (FromTypeRequirement.isSubstitutionFailure()) {
1172 auto DiagOrErr =
import(FromTypeRequirement.getSubstitutionDiagnostic());
1174 return DiagOrErr.takeError();
1175 Req.emplace(DiagOrErr.get());
1182 if (!NoexceptLocOrErr)
1183 return NoexceptLocOrErr.takeError();
1185 if (Status == ExprRequirement::SS_ExprSubstitutionFailure) {
1188 return DiagOrErr.takeError();
1189 return new (Importer.getToContext()) ExprRequirement(
1190 *DiagOrErr, IsRKSimple, *NoexceptLocOrErr, std::move(*Req));
1194 return ExprOrErr.takeError();
1196 *ExprOrErr, IsRKSimple, *NoexceptLocOrErr, std::move(*Req), Status,
1197 SubstitutedConstraintExpr);
1212 return new (Importer.getToContext())
1213 NestedRequirement(ToEntity, ToSatisfaction);
1217 return ToExpr.takeError();
1218 if (ToExpr.get()->isInstantiationDependent()) {
1219 return new (Importer.getToContext()) NestedRequirement(ToExpr.get());
1224 return std::move(Err);
1225 return new (Importer.getToContext()) NestedRequirement(
1226 Importer.getToContext(), ToExpr.get(), Satisfaction);
1234 switch (FromRequire->
getKind()) {
1244 llvm_unreachable(
"Unhandled requirement kind");
1254 return VarOrErr.takeError();
1259 return LocationOrErr.takeError();
1264 return std::move(Err);
1271template <
typename T>
1273 if (
Found->getLinkageInternal() != From->getLinkageInternal())
1276 if (From->hasExternalFormalLinkage())
1277 return Found->hasExternalFormalLinkage();
1278 if (Importer.GetFromTU(
Found) != From->getTranslationUnitDecl())
1280 if (From->isInAnonymousNamespace())
1281 return Found->isInAnonymousNamespace();
1283 return !
Found->isInAnonymousNamespace() &&
1284 !
Found->hasExternalFormalLinkage();
1304using namespace clang;
1310 FunctionDeclsWithImportInProgress.insert(D);
1313 return llvm::scope_exit([
this, LambdaD]() {
1315 FunctionDeclsWithImportInProgress.erase(LambdaD);
1322 return FunctionDeclsWithImportInProgress.find(D) !=
1323 FunctionDeclsWithImportInProgress.end();
1327 Importer.FromDiag(
SourceLocation(), diag::err_unsupported_ast_node)
1328 <<
T->getTypeClassName();
1333 ExpectedType UnderlyingTypeOrErr =
import(
T->getValueType());
1334 if (!UnderlyingTypeOrErr)
1335 return UnderlyingTypeOrErr.takeError();
1337 return Importer.getToContext().getAtomicType(*UnderlyingTypeOrErr);
1341 switch (
T->getKind()) {
1342#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
1343 case BuiltinType::Id: \
1344 return Importer.getToContext().SingletonId;
1345#include "clang/Basic/OpenCLImageTypes.def"
1346#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
1347 case BuiltinType::Id: \
1348 return Importer.getToContext().Id##Ty;
1349#include "clang/Basic/OpenCLExtensionTypes.def"
1350#define SVE_TYPE(Name, Id, SingletonId) \
1351 case BuiltinType::Id: \
1352 return Importer.getToContext().SingletonId;
1353#include "clang/Basic/AArch64ACLETypes.def"
1354#define PPC_VECTOR_TYPE(Name, Id, Size) \
1355 case BuiltinType::Id: \
1356 return Importer.getToContext().Id##Ty;
1357#include "clang/Basic/PPCTypes.def"
1358#define RVV_TYPE(Name, Id, SingletonId) \
1359 case BuiltinType::Id: \
1360 return Importer.getToContext().SingletonId;
1361#include "clang/Basic/RISCVVTypes.def"
1362#define WASM_TYPE(Name, Id, SingletonId) \
1363 case BuiltinType::Id: \
1364 return Importer.getToContext().SingletonId;
1365#include "clang/Basic/WebAssemblyReferenceTypes.def"
1366#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) \
1367 case BuiltinType::Id: \
1368 return Importer.getToContext().SingletonId;
1369#include "clang/Basic/AMDGPUTypes.def"
1370#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \
1371 case BuiltinType::Id: \
1372 return Importer.getToContext().SingletonId;
1373#include "clang/Basic/HLSLIntangibleTypes.def"
1374#define HLSL_PACKED_TYPE(Name, Id, SingletonId) \
1375 case BuiltinType::Id: \
1376 return Importer.getToContext().SingletonId;
1377#include "clang/Basic/HLSLPackedTypes.def"
1378#define SPIRV_TYPE(Name, Id, SingletonId) \
1379 case BuiltinType::Id: \
1380 return Importer.getToContext().SingletonId;
1381#include "clang/Basic/SPIRVTypes.def"
1382#define SHARED_SINGLETON_TYPE(Expansion)
1383#define BUILTIN_TYPE(Id, SingletonId) \
1384 case BuiltinType::Id: return Importer.getToContext().SingletonId;
1385#include "clang/AST/BuiltinTypes.def"
1393 case BuiltinType::Char_U:
1397 if (Importer.getToContext().getLangOpts().CharIsSigned)
1398 return Importer.getToContext().UnsignedCharTy;
1400 return Importer.getToContext().CharTy;
1402 case BuiltinType::Char_S:
1406 if (!Importer.getToContext().getLangOpts().CharIsSigned)
1407 return Importer.getToContext().SignedCharTy;
1409 return Importer.getToContext().CharTy;
1411 case BuiltinType::WChar_S:
1412 case BuiltinType::WChar_U:
1415 return Importer.getToContext().WCharTy;
1418 llvm_unreachable(
"Invalid BuiltinType Kind!");
1421ExpectedType ASTNodeImporter::VisitDecayedType(
const DecayedType *
T) {
1422 ExpectedType ToOriginalTypeOrErr =
import(
T->getOriginalType());
1423 if (!ToOriginalTypeOrErr)
1424 return ToOriginalTypeOrErr.takeError();
1426 return Importer.getToContext().getDecayedType(*ToOriginalTypeOrErr);
1429ExpectedType ASTNodeImporter::VisitComplexType(
const ComplexType *
T) {
1430 ExpectedType ToElementTypeOrErr =
import(
T->getElementType());
1431 if (!ToElementTypeOrErr)
1432 return ToElementTypeOrErr.takeError();
1434 return Importer.getToContext().getComplexType(*ToElementTypeOrErr);
1437ExpectedType ASTNodeImporter::VisitPointerType(
const PointerType *
T) {
1439 if (!ToPointeeTypeOrErr)
1440 return ToPointeeTypeOrErr.takeError();
1442 return Importer.getToContext().getPointerType(*ToPointeeTypeOrErr);
1445ExpectedType ASTNodeImporter::VisitBlockPointerType(
const BlockPointerType *
T) {
1448 if (!ToPointeeTypeOrErr)
1449 return ToPointeeTypeOrErr.takeError();
1451 return Importer.getToContext().getBlockPointerType(*ToPointeeTypeOrErr);
1455ASTNodeImporter::VisitLValueReferenceType(
const LValueReferenceType *
T) {
1457 ExpectedType ToPointeeTypeOrErr =
import(
T->getPointeeTypeAsWritten());
1458 if (!ToPointeeTypeOrErr)
1459 return ToPointeeTypeOrErr.takeError();
1461 return Importer.getToContext().getLValueReferenceType(*ToPointeeTypeOrErr);
1465ASTNodeImporter::VisitRValueReferenceType(
const RValueReferenceType *
T) {
1467 ExpectedType ToPointeeTypeOrErr =
import(
T->getPointeeTypeAsWritten());
1468 if (!ToPointeeTypeOrErr)
1469 return ToPointeeTypeOrErr.takeError();
1471 return Importer.getToContext().getRValueReferenceType(*ToPointeeTypeOrErr);
1475ASTNodeImporter::VisitMemberPointerType(
const MemberPointerType *
T) {
1478 if (!ToPointeeTypeOrErr)
1479 return ToPointeeTypeOrErr.takeError();
1481 auto QualifierOrErr =
import(
T->getQualifier());
1482 if (!QualifierOrErr)
1483 return QualifierOrErr.takeError();
1485 auto ClsOrErr =
import(
T->getMostRecentCXXRecordDecl());
1487 return ClsOrErr.takeError();
1489 return Importer.getToContext().getMemberPointerType(
1490 *ToPointeeTypeOrErr, *QualifierOrErr, *ClsOrErr);
1494ASTNodeImporter::VisitConstantArrayType(
const ConstantArrayType *
T) {
1495 Error Err = Error::success();
1496 auto ToElementType = importChecked(Err,
T->getElementType());
1497 auto ToSizeExpr = importChecked(Err,
T->getSizeExpr());
1499 return std::move(Err);
1501 return Importer.getToContext().getConstantArrayType(
1502 ToElementType,
T->getSize(), ToSizeExpr,
T->getSizeModifier(),
1503 T->getIndexTypeCVRQualifiers());
1507ASTNodeImporter::VisitArrayParameterType(
const ArrayParameterType *
T) {
1509 if (!ToArrayTypeOrErr)
1510 return ToArrayTypeOrErr.takeError();
1512 return Importer.getToContext().getArrayParameterType(*ToArrayTypeOrErr);
1516ASTNodeImporter::VisitIncompleteArrayType(
const IncompleteArrayType *
T) {
1517 ExpectedType ToElementTypeOrErr =
import(
T->getElementType());
1518 if (!ToElementTypeOrErr)
1519 return ToElementTypeOrErr.takeError();
1521 return Importer.getToContext().getIncompleteArrayType(*ToElementTypeOrErr,
1522 T->getSizeModifier(),
1523 T->getIndexTypeCVRQualifiers());
1527ASTNodeImporter::VisitVariableArrayType(
const VariableArrayType *
T) {
1528 Error Err = Error::success();
1529 QualType ToElementType = importChecked(Err,
T->getElementType());
1530 Expr *ToSizeExpr = importChecked(Err,
T->getSizeExpr());
1532 return std::move(Err);
1533 return Importer.getToContext().getVariableArrayType(
1534 ToElementType, ToSizeExpr,
T->getSizeModifier(),
1535 T->getIndexTypeCVRQualifiers());
1538ExpectedType ASTNodeImporter::VisitDependentSizedArrayType(
1539 const DependentSizedArrayType *
T) {
1540 Error Err = Error::success();
1541 QualType ToElementType = importChecked(Err,
T->getElementType());
1542 Expr *ToSizeExpr = importChecked(Err,
T->getSizeExpr());
1544 return std::move(Err);
1548 return Importer.getToContext().getDependentSizedArrayType(
1549 ToElementType, ToSizeExpr,
T->getSizeModifier(),
1550 T->getIndexTypeCVRQualifiers());
1553ExpectedType ASTNodeImporter::VisitDependentSizedExtVectorType(
1554 const DependentSizedExtVectorType *
T) {
1555 Error Err = Error::success();
1556 QualType ToElementType = importChecked(Err,
T->getElementType());
1557 Expr *ToSizeExpr = importChecked(Err,
T->getSizeExpr());
1558 SourceLocation ToAttrLoc = importChecked(Err,
T->getAttributeLoc());
1560 return std::move(Err);
1561 return Importer.getToContext().getDependentSizedExtVectorType(
1562 ToElementType, ToSizeExpr, ToAttrLoc);
1565ExpectedType ASTNodeImporter::VisitVectorType(
const VectorType *
T) {
1566 ExpectedType ToElementTypeOrErr =
import(
T->getElementType());
1567 if (!ToElementTypeOrErr)
1568 return ToElementTypeOrErr.takeError();
1570 return Importer.getToContext().getVectorType(*ToElementTypeOrErr,
1571 T->getNumElements(),
1572 T->getVectorKind());
1575ExpectedType ASTNodeImporter::VisitExtVectorType(
const ExtVectorType *
T) {
1576 ExpectedType ToElementTypeOrErr =
import(
T->getElementType());
1577 if (!ToElementTypeOrErr)
1578 return ToElementTypeOrErr.takeError();
1580 return Importer.getToContext().getExtVectorType(*ToElementTypeOrErr,
1581 T->getNumElements());
1585ASTNodeImporter::VisitFunctionNoProtoType(
const FunctionNoProtoType *
T) {
1589 if (!ToReturnTypeOrErr)
1590 return ToReturnTypeOrErr.takeError();
1592 return Importer.getToContext().getFunctionNoProtoType(*ToReturnTypeOrErr,
1597ASTNodeImporter::VisitFunctionProtoType(
const FunctionProtoType *
T) {
1599 if (!ToReturnTypeOrErr)
1600 return ToReturnTypeOrErr.takeError();
1603 SmallVector<QualType, 4> ArgTypes;
1607 return TyOrErr.takeError();
1608 ArgTypes.push_back(*TyOrErr);
1612 SmallVector<QualType, 4> ExceptionTypes;
1616 return TyOrErr.takeError();
1617 ExceptionTypes.push_back(*TyOrErr);
1621 Error Err = Error::success();
1622 FunctionProtoType::ExtProtoInfo ToEPI;
1638 return std::move(Err);
1640 return Importer.getToContext().getFunctionType(
1641 *ToReturnTypeOrErr, ArgTypes, ToEPI);
1645 const UnresolvedUsingType *
T) {
1646 auto ToQualifierOrErr =
import(
T->getQualifier());
1647 if (!ToQualifierOrErr)
1648 return ToQualifierOrErr.takeError();
1649 auto ToDeclOrErr =
import(
T->getDecl());
1651 return ToDeclOrErr.takeError();
1654 return Importer.getToContext().getCanonicalUnresolvedUsingType(
1656 return Importer.getToContext().getUnresolvedUsingType(
1657 T->getKeyword(), *ToQualifierOrErr, *ToDeclOrErr);
1660ExpectedType ASTNodeImporter::VisitParenType(
const ParenType *
T) {
1662 if (!ToInnerTypeOrErr)
1663 return ToInnerTypeOrErr.takeError();
1665 return Importer.getToContext().getParenType(*ToInnerTypeOrErr);
1669ASTNodeImporter::VisitPackIndexingType(clang::PackIndexingType
const *
T) {
1673 return Pattern.takeError();
1676 return Index.takeError();
1677 return Importer.getToContext().getPackIndexingType(*Pattern, *Index);
1680ExpectedType ASTNodeImporter::VisitTypedefType(
const TypedefType *
T) {
1681 Expected<TypedefNameDecl *> ToDeclOrErr =
import(
T->getDecl());
1683 return ToDeclOrErr.takeError();
1685 auto ToQualifierOrErr =
import(
T->getQualifier());
1686 if (!ToQualifierOrErr)
1687 return ToQualifierOrErr.takeError();
1690 T->typeMatchesDecl() ? QualType() : import(
T->desugar());
1691 if (!ToUnderlyingTypeOrErr)
1692 return ToUnderlyingTypeOrErr.takeError();
1694 return Importer.getToContext().getTypedefType(
1695 T->getKeyword(), *ToQualifierOrErr, *ToDeclOrErr, *ToUnderlyingTypeOrErr);
1698ExpectedType ASTNodeImporter::VisitTypeOfExprType(
const TypeOfExprType *
T) {
1701 return ToExprOrErr.takeError();
1702 return Importer.getToContext().getTypeOfExprType(*ToExprOrErr,
T->getKind());
1705ExpectedType ASTNodeImporter::VisitTypeOfType(
const TypeOfType *
T) {
1706 ExpectedType ToUnderlyingTypeOrErr =
import(
T->getUnmodifiedType());
1707 if (!ToUnderlyingTypeOrErr)
1708 return ToUnderlyingTypeOrErr.takeError();
1709 return Importer.getToContext().getTypeOfType(*ToUnderlyingTypeOrErr,
1713ExpectedType ASTNodeImporter::VisitUsingType(
const UsingType *
T) {
1714 auto ToQualifierOrErr =
import(
T->getQualifier());
1715 if (!ToQualifierOrErr)
1716 return ToQualifierOrErr.takeError();
1717 auto ToDeclOrErr =
import(
T->getDecl());
1719 return ToDeclOrErr.takeError();
1723 return ToTypeOrErr.takeError();
1724 return Importer.getToContext().getUsingType(
1725 T->getKeyword(), *ToQualifierOrErr, *ToDeclOrErr, *ToTypeOrErr);
1728ExpectedType ASTNodeImporter::VisitDecltypeType(
const DecltypeType *
T) {
1732 return ToExprOrErr.takeError();
1734 ExpectedType ToUnderlyingTypeOrErr =
import(
T->getUnderlyingType());
1735 if (!ToUnderlyingTypeOrErr)
1736 return ToUnderlyingTypeOrErr.takeError();
1738 return Importer.getToContext().getDecltypeType(
1739 *ToExprOrErr, *ToUnderlyingTypeOrErr);
1743ASTNodeImporter::VisitUnaryTransformType(
const UnaryTransformType *
T) {
1745 if (!ToBaseTypeOrErr)
1746 return ToBaseTypeOrErr.takeError();
1748 ExpectedType ToUnderlyingTypeOrErr =
import(
T->getUnderlyingType());
1749 if (!ToUnderlyingTypeOrErr)
1750 return ToUnderlyingTypeOrErr.takeError();
1752 return Importer.getToContext().getUnaryTransformType(
1753 *ToBaseTypeOrErr, *ToUnderlyingTypeOrErr,
T->getUTTKind());
1756ExpectedType ASTNodeImporter::VisitAutoType(
const AutoType *
T) {
1758 ExpectedType ToDeducedTypeOrErr =
import(
T->getDeducedType());
1759 if (!ToDeducedTypeOrErr)
1760 return ToDeducedTypeOrErr.takeError();
1763 if (
TemplateName FromTypeConstraint =
T->getTypeConstraintConcept();
1764 !FromTypeConstraint.isNull()) {
1765 Expected<TemplateName> ToTypeConstraintOrErr =
import(FromTypeConstraint);
1766 if (!ToTypeConstraintOrErr)
1767 return ToTypeConstraintOrErr.takeError();
1768 ToTypeConstraint = *ToTypeConstraintOrErr;
1771 SmallVector<TemplateArgument, 2> ToTemplateArgs;
1774 return std::move(Err);
1776 return Importer.getToContext().getAutoType(
1777 T->getDeducedKind(), *ToDeducedTypeOrErr,
T->getKeyword(),
1778 ToTypeConstraint, ToTemplateArgs);
1781ExpectedType ASTNodeImporter::VisitDeducedTemplateSpecializationType(
1782 const DeducedTemplateSpecializationType *
T) {
1784 Expected<TemplateName> ToTemplateNameOrErr =
import(
T->getTemplateName());
1785 if (!ToTemplateNameOrErr)
1786 return ToTemplateNameOrErr.takeError();
1787 ExpectedType ToDeducedTypeOrErr =
import(
T->getDeducedType());
1788 if (!ToDeducedTypeOrErr)
1789 return ToDeducedTypeOrErr.takeError();
1791 return Importer.getToContext().getDeducedTemplateSpecializationType(
1792 T->getDeducedKind(), *ToDeducedTypeOrErr,
T->getKeyword(),
1793 *ToTemplateNameOrErr);
1796ExpectedType ASTNodeImporter::VisitTagType(
const TagType *
T) {
1797 TagDecl *DeclForType =
T->getDecl();
1798 Expected<TagDecl *> ToDeclOrErr =
import(DeclForType);
1800 return ToDeclOrErr.takeError();
1806 Expected<TagDecl *> ToDefDeclOrErr =
import(DeclForType->
getDefinition());
1807 if (!ToDefDeclOrErr)
1808 return ToDefDeclOrErr.takeError();
1811 return Importer.getToContext().getCanonicalTagType(*ToDeclOrErr);
1813 auto ToQualifierOrErr =
import(
T->getQualifier());
1814 if (!ToQualifierOrErr)
1815 return ToQualifierOrErr.takeError();
1817 return Importer.getToContext().getTagType(
T->getKeyword(), *ToQualifierOrErr,
1818 *ToDeclOrErr,
T->isTagOwned());
1821ExpectedType ASTNodeImporter::VisitEnumType(
const EnumType *
T) {
1822 return VisitTagType(
T);
1825ExpectedType ASTNodeImporter::VisitRecordType(
const RecordType *
T) {
1826 return VisitTagType(
T);
1830ASTNodeImporter::VisitInjectedClassNameType(
const InjectedClassNameType *
T) {
1831 return VisitTagType(
T);
1834ExpectedType ASTNodeImporter::VisitAttributedType(
const AttributedType *
T) {
1835 ExpectedType ToModifiedTypeOrErr =
import(
T->getModifiedType());
1836 if (!ToModifiedTypeOrErr)
1837 return ToModifiedTypeOrErr.takeError();
1838 ExpectedType ToEquivalentTypeOrErr =
import(
T->getEquivalentType());
1839 if (!ToEquivalentTypeOrErr)
1840 return ToEquivalentTypeOrErr.takeError();
1842 return Importer.getToContext().getAttributedType(
1843 T->getAttrKind(), *ToModifiedTypeOrErr, *ToEquivalentTypeOrErr,
1848ASTNodeImporter::VisitCountAttributedType(
const CountAttributedType *
T) {
1850 if (!ToWrappedTypeOrErr)
1851 return ToWrappedTypeOrErr.takeError();
1853 Error Err = Error::success();
1854 Expr *CountExpr = importChecked(Err,
T->getCountExpr());
1856 SmallVector<TypeCoupledDeclRefInfo, 1> CoupledDecls;
1857 for (
const TypeCoupledDeclRefInfo &TI :
T->dependent_decls()) {
1858 Expected<ValueDecl *> ToDeclOrErr =
import(TI.getDecl());
1860 return ToDeclOrErr.takeError();
1861 CoupledDecls.emplace_back(*ToDeclOrErr, TI.isDeref());
1864 return Importer.getToContext().getCountAttributedType(
1865 *ToWrappedTypeOrErr, CountExpr,
T->isCountInBytes(),
T->isOrNull(),
1866 ArrayRef(CoupledDecls));
1870ASTNodeImporter::VisitLateParsedAttrType(
const LateParsedAttrType *
T) {
1871 llvm_unreachable(
"should be replaced with a concrete type before AST import");
1874ExpectedType ASTNodeImporter::VisitTemplateTypeParmType(
1875 const TemplateTypeParmType *
T) {
1876 Expected<TemplateTypeParmDecl *> ToDeclOrErr =
import(
T->getDecl());
1878 return ToDeclOrErr.takeError();
1880 return Importer.getToContext().getTemplateTypeParmType(
1881 T->getDepth(),
T->getIndex(),
T->isParameterPack(), *ToDeclOrErr);
1884ExpectedType ASTNodeImporter::VisitSubstTemplateTypeParmType(
1885 const SubstTemplateTypeParmType *
T) {
1886 Expected<Decl *> ReplacedOrErr =
import(
T->getAssociatedDecl());
1888 return ReplacedOrErr.takeError();
1890 ExpectedType ToReplacementTypeOrErr =
import(
T->getReplacementType());
1891 if (!ToReplacementTypeOrErr)
1892 return ToReplacementTypeOrErr.takeError();
1894 return Importer.getToContext().getSubstTemplateTypeParmType(
1895 *ToReplacementTypeOrErr, *ReplacedOrErr,
T->getIndex(),
T->getPackIndex(),
1899ExpectedType ASTNodeImporter::VisitSubstTemplateTypeParmPackType(
1900 const SubstTemplateTypeParmPackType *
T) {
1901 Expected<Decl *> ReplacedOrErr =
import(
T->getAssociatedDecl());
1903 return ReplacedOrErr.takeError();
1905 Expected<TemplateArgument> ToArgumentPack =
import(
T->getArgumentPack());
1906 if (!ToArgumentPack)
1907 return ToArgumentPack.takeError();
1909 return Importer.getToContext().getSubstTemplateTypeParmPackType(
1910 *ReplacedOrErr,
T->getIndex(),
T->getFinal(), *ToArgumentPack);
1913ExpectedType ASTNodeImporter::VisitSubstBuiltinTemplatePackType(
1914 const SubstBuiltinTemplatePackType *
T) {
1915 Expected<TemplateArgument> ToArgumentPack =
import(
T->getArgumentPack());
1916 if (!ToArgumentPack)
1917 return ToArgumentPack.takeError();
1918 return Importer.getToContext().getSubstBuiltinTemplatePack(*ToArgumentPack);
1921ExpectedType ASTNodeImporter::VisitTemplateSpecializationType(
1922 const TemplateSpecializationType *
T) {
1923 auto ToTemplateOrErr =
import(
T->getTemplateName());
1924 if (!ToTemplateOrErr)
1925 return ToTemplateOrErr.takeError();
1927 SmallVector<TemplateArgument, 2> ToTemplateArgs;
1930 return std::move(Err);
1934 if (!ToUnderlyingOrErr)
1935 return ToUnderlyingOrErr.takeError();
1936 return Importer.getToContext().getTemplateSpecializationType(
1937 T->getKeyword(), *ToTemplateOrErr, ToTemplateArgs, {},
1938 *ToUnderlyingOrErr);
1942ASTNodeImporter::VisitPackExpansionType(
const PackExpansionType *
T) {
1944 if (!ToPatternOrErr)
1945 return ToPatternOrErr.takeError();
1947 return Importer.getToContext().getPackExpansionType(*ToPatternOrErr,
1948 T->getNumExpansions(),
1953ASTNodeImporter::VisitDependentNameType(
const DependentNameType *
T) {
1954 auto ToQualifierOrErr =
import(
T->getQualifier());
1955 if (!ToQualifierOrErr)
1956 return ToQualifierOrErr.takeError();
1958 IdentifierInfo *Name = Importer.Import(
T->getIdentifier());
1959 return Importer.getToContext().getDependentNameType(
T->getKeyword(),
1960 *ToQualifierOrErr, Name);
1964ASTNodeImporter::VisitObjCInterfaceType(
const ObjCInterfaceType *
T) {
1965 Expected<ObjCInterfaceDecl *> ToDeclOrErr =
import(
T->getDecl());
1967 return ToDeclOrErr.takeError();
1969 return Importer.getToContext().getObjCInterfaceType(*ToDeclOrErr);
1972ExpectedType ASTNodeImporter::VisitObjCObjectType(
const ObjCObjectType *
T) {
1974 if (!ToBaseTypeOrErr)
1975 return ToBaseTypeOrErr.takeError();
1977 SmallVector<QualType, 4> TypeArgs;
1978 for (
auto TypeArg :
T->getTypeArgsAsWritten()) {
1980 TypeArgs.push_back(*TyOrErr);
1982 return TyOrErr.takeError();
1985 SmallVector<ObjCProtocolDecl *, 4> Protocols;
1986 for (
auto *P :
T->quals()) {
1987 if (Expected<ObjCProtocolDecl *> ProtocolOrErr =
import(P))
1988 Protocols.push_back(*ProtocolOrErr);
1990 return ProtocolOrErr.takeError();
1994 return Importer.getToContext().getObjCObjectType(*ToBaseTypeOrErr, TypeArgs,
1996 T->isKindOfTypeAsWritten());
2000ASTNodeImporter::VisitObjCObjectPointerType(
const ObjCObjectPointerType *
T) {
2002 if (!ToPointeeTypeOrErr)
2003 return ToPointeeTypeOrErr.takeError();
2005 return Importer.getToContext().getObjCObjectPointerType(*ToPointeeTypeOrErr);
2009ASTNodeImporter::VisitMacroQualifiedType(
const MacroQualifiedType *
T) {
2010 ExpectedType ToUnderlyingTypeOrErr =
import(
T->getUnderlyingType());
2011 if (!ToUnderlyingTypeOrErr)
2012 return ToUnderlyingTypeOrErr.takeError();
2014 IdentifierInfo *ToIdentifier = Importer.Import(
T->getMacroIdentifier());
2015 return Importer.getToContext().getMacroQualifiedType(*ToUnderlyingTypeOrErr,
2019ExpectedType clang::ASTNodeImporter::VisitAdjustedType(
const AdjustedType *
T) {
2020 Error Err = Error::success();
2021 QualType ToOriginalType = importChecked(Err,
T->getOriginalType());
2022 QualType ToAdjustedType = importChecked(Err,
T->getAdjustedType());
2024 return std::move(Err);
2026 return Importer.getToContext().getAdjustedType(ToOriginalType,
2030ExpectedType clang::ASTNodeImporter::VisitBitIntType(
const BitIntType *
T) {
2031 return Importer.getToContext().getBitIntType(
T->isUnsigned(),
2035ExpectedType clang::ASTNodeImporter::VisitBTFTagAttributedType(
2036 const clang::BTFTagAttributedType *
T) {
2037 Error Err = Error::success();
2038 const BTFTypeTagAttr *ToBTFAttr = importChecked(Err,
T->getAttr());
2039 QualType ToWrappedType = importChecked(Err,
T->getWrappedType());
2041 return std::move(Err);
2043 return Importer.getToContext().getBTFTagAttributedType(ToBTFAttr,
2047ExpectedType clang::ASTNodeImporter::VisitOverflowBehaviorType(
2048 const clang::OverflowBehaviorType *
T) {
2049 Error Err = Error::success();
2050 OverflowBehaviorType::OverflowBehaviorKind ToKind =
T->getBehaviorKind();
2053 return std::move(Err);
2055 return Importer.getToContext().getOverflowBehaviorType(ToKind,
2059ExpectedType clang::ASTNodeImporter::VisitHLSLAttributedResourceType(
2060 const clang::HLSLAttributedResourceType *
T) {
2061 Error Err = Error::success();
2062 HLSLAttributedResourceType::Attributes ToAttrs =
T->getAttrs();
2063 QualType ToWrappedType = importChecked(Err,
T->getWrappedType());
2064 QualType ToContainedType = importChecked(Err,
T->getContainedType());
2065 ToAttrs.SampleCountExpr = importChecked(Err,
T->getSampleCountExpr());
2067 return std::move(Err);
2069 return Importer.getToContext().getHLSLAttributedResourceType(
2070 ToWrappedType, ToContainedType, ToAttrs);
2073ExpectedType clang::ASTNodeImporter::VisitHLSLInlineSpirvType(
2074 const clang::HLSLInlineSpirvType *
T) {
2075 Error Err = Error::success();
2079 uint32_t ToAlignment =
T->getAlignment();
2081 llvm::SmallVector<SpirvOperand> ToOperands;
2083 for (
auto &Operand :
T->getOperands()) {
2084 using SpirvOperandKind = SpirvOperand::SpirvOperandKind;
2087 case SpirvOperandKind::ConstantId:
2088 ToOperands.push_back(SpirvOperand::createConstant(
2089 importChecked(Err,
Operand.getResultType()),
Operand.getValue()));
2091 case SpirvOperandKind::Literal:
2092 ToOperands.push_back(SpirvOperand::createLiteral(
Operand.getValue()));
2094 case SpirvOperandKind::TypeId:
2095 ToOperands.push_back(SpirvOperand::createType(
2096 importChecked(Err,
Operand.getResultType())));
2099 llvm_unreachable(
"Invalid SpirvOperand kind");
2103 return std::move(Err);
2106 return Importer.getToContext().getHLSLInlineSpirvType(
2107 ToOpcode, ToSize, ToAlignment, ToOperands);
2110ExpectedType clang::ASTNodeImporter::VisitConstantMatrixType(
2111 const clang::ConstantMatrixType *
T) {
2112 ExpectedType ToElementTypeOrErr =
import(
T->getElementType());
2113 if (!ToElementTypeOrErr)
2114 return ToElementTypeOrErr.takeError();
2116 return Importer.getToContext().getConstantMatrixType(
2117 *ToElementTypeOrErr,
T->getNumRows(),
T->getNumColumns(),
T->getLayout());
2120ExpectedType clang::ASTNodeImporter::VisitDependentAddressSpaceType(
2121 const clang::DependentAddressSpaceType *
T) {
2122 Error Err = Error::success();
2124 Expr *ToAddrSpaceExpr = importChecked(Err,
T->getAddrSpaceExpr());
2125 SourceLocation ToAttrLoc = importChecked(Err,
T->getAttributeLoc());
2127 return std::move(Err);
2129 return Importer.getToContext().getDependentAddressSpaceType(
2130 ToPointeeType, ToAddrSpaceExpr, ToAttrLoc);
2133ExpectedType clang::ASTNodeImporter::VisitDependentBitIntType(
2134 const clang::DependentBitIntType *
T) {
2135 ExpectedExpr ToNumBitsExprOrErr =
import(
T->getNumBitsExpr());
2136 if (!ToNumBitsExprOrErr)
2137 return ToNumBitsExprOrErr.takeError();
2138 return Importer.getToContext().getDependentBitIntType(
T->isUnsigned(),
2139 *ToNumBitsExprOrErr);
2142ExpectedType clang::ASTNodeImporter::VisitPredefinedSugarType(
2143 const clang::PredefinedSugarType *
T) {
2144 return Importer.getToContext().getPredefinedSugarType(
T->getKind());
2147ExpectedType clang::ASTNodeImporter::VisitDependentSizedMatrixType(
2148 const clang::DependentSizedMatrixType *
T) {
2149 Error Err = Error::success();
2150 QualType ToElementType = importChecked(Err,
T->getElementType());
2151 Expr *ToRowExpr = importChecked(Err,
T->getRowExpr());
2152 Expr *ToColumnExpr = importChecked(Err,
T->getColumnExpr());
2153 SourceLocation ToAttrLoc = importChecked(Err,
T->getAttributeLoc());
2155 return std::move(Err);
2157 return Importer.getToContext().getDependentSizedMatrixType(
2158 ToElementType, ToRowExpr, ToColumnExpr, ToAttrLoc);
2161ExpectedType clang::ASTNodeImporter::VisitDependentVectorType(
2162 const clang::DependentVectorType *
T) {
2163 Error Err = Error::success();
2164 QualType ToElementType = importChecked(Err,
T->getElementType());
2165 Expr *ToSizeExpr = importChecked(Err,
T->getSizeExpr());
2166 SourceLocation ToAttrLoc = importChecked(Err,
T->getAttributeLoc());
2168 return std::move(Err);
2170 return Importer.getToContext().getDependentVectorType(
2171 ToElementType, ToSizeExpr, ToAttrLoc,
T->getVectorKind());
2174ExpectedType clang::ASTNodeImporter::VisitObjCTypeParamType(
2175 const clang::ObjCTypeParamType *
T) {
2176 Expected<ObjCTypeParamDecl *> ToDeclOrErr =
import(
T->getDecl());
2178 return ToDeclOrErr.takeError();
2180 SmallVector<ObjCProtocolDecl *, 4> ToProtocols;
2181 for (ObjCProtocolDecl *FromProtocol :
T->getProtocols()) {
2182 Expected<ObjCProtocolDecl *> ToProtocolOrErr =
import(FromProtocol);
2183 if (!ToProtocolOrErr)
2184 return ToProtocolOrErr.takeError();
2185 ToProtocols.push_back(*ToProtocolOrErr);
2188 return Importer.getToContext().getObjCTypeParamType(*ToDeclOrErr,
2192ExpectedType clang::ASTNodeImporter::VisitPipeType(
const clang::PipeType *
T) {
2193 ExpectedType ToElementTypeOrErr =
import(
T->getElementType());
2194 if (!ToElementTypeOrErr)
2195 return ToElementTypeOrErr.takeError();
2197 ASTContext &ToCtx = Importer.getToContext();
2198 if (
T->isReadOnly())
2218 if (
isa<RecordDecl>(D) && (FunDecl = dyn_cast<FunctionDecl>(OrigDC)) &&
2220 auto getLeafPointeeType = [](
const Type *
T) {
2221 while (
T->isPointerType() ||
T->isArrayType()) {
2222 T =
T->getPointeeOrArrayElementType();
2228 getLeafPointeeType(
P->getType().getCanonicalType().getTypePtr());
2229 auto *RT = dyn_cast<RecordType>(LeafT);
2230 if (RT && RT->getDecl() == D) {
2231 Importer.FromDiag(D->
getLocation(), diag::err_unsupported_ast_node)
2250 ToD = cast_or_null<NamedDecl>(Importer.GetAlreadyImportedOrNull(D));
2255 return Error::success();
2269 ToD = cast_or_null<NamedDecl>(Importer.GetAlreadyImportedOrNull(D));
2274 return Error::success();
2279 return Error::success();
2285 if (
RecordDecl *FromRecord = dyn_cast<RecordDecl>(FromD)) {
2287 if (FromRecord->getDefinition() && FromRecord->isCompleteDefinition() &&
2288 !ToRecord->getDefinition()) {
2293 return Error::success();
2296 if (
EnumDecl *FromEnum = dyn_cast<EnumDecl>(FromD)) {
2298 if (FromEnum->getDefinition() && !ToEnum->getDefinition()) {
2303 return Error::success();
2306 return Error::success();
2321 return Error::success();
2327 return ToRangeOrErr.takeError();
2328 return Error::success();
2334 return LocOrErr.takeError();
2335 return Error::success();
2343 return ToTInfoOrErr.takeError();
2344 return Error::success();
2347 llvm_unreachable(
"Unknown name kind.");
2352 if (Importer.isMinimalImport() && !ForceImport) {
2353 auto ToDCOrErr = Importer.ImportContext(FromDC);
2354 return ToDCOrErr.takeError();
2368 auto MightNeedReordering = [](
const Decl *D) {
2373 Error ChildErrors = Error::success();
2374 for (
auto *From : FromDC->
decls()) {
2375 if (!MightNeedReordering(From))
2384 if (!ImportedOrErr) {
2386 ImportedOrErr.takeError());
2389 FieldDecl *FieldFrom = dyn_cast_or_null<FieldDecl>(From);
2390 Decl *ImportedDecl = *ImportedOrErr;
2391 FieldDecl *FieldTo = dyn_cast_or_null<FieldDecl>(ImportedDecl);
2392 if (FieldFrom && FieldTo) {
2422 auto ToDCOrErr = Importer.ImportContext(FromDC);
2424 consumeError(std::move(ChildErrors));
2425 return ToDCOrErr.takeError();
2428 if (
const auto *FromRD = dyn_cast<RecordDecl>(FromDC)) {
2432 for (
auto *D : FromRD->decls()) {
2433 if (!MightNeedReordering(D))
2436 assert(D &&
"DC contains a null decl");
2437 if (
Decl *ToD = Importer.GetAlreadyImportedOrNull(D)) {
2439 assert(ToDC == ToD->getLexicalDeclContext() && ToDC->
containsDecl(ToD));
2451 for (
auto *From : FromDC->
decls()) {
2452 if (MightNeedReordering(From))
2458 ImportedOrErr.takeError());
2478 if (!FromRecordDecl || !ToRecordDecl) {
2479 const RecordType *RecordFrom = FromType->
getAs<RecordType>();
2480 const RecordType *RecordTo = ToType->
getAs<RecordType>();
2482 if (RecordFrom && RecordTo) {
2483 FromRecordDecl = RecordFrom->getDecl();
2484 ToRecordDecl = RecordTo->getDecl();
2488 if (FromRecordDecl && ToRecordDecl) {
2494 return Error::success();
2499 auto ToDCOrErr = Importer.ImportContext(FromD->
getDeclContext());
2501 return ToDCOrErr.takeError();
2505 auto ToLexicalDCOrErr = Importer.ImportContext(
2507 if (!ToLexicalDCOrErr)
2508 return ToLexicalDCOrErr.takeError();
2509 ToLexicalDC = *ToLexicalDCOrErr;
2513 return Error::success();
2519 "Import implicit methods to or from non-definition");
2522 if (FromM->isImplicit()) {
2525 return ToMOrErr.takeError();
2528 return Error::success();
2537 return ToTypedefOrErr.takeError();
2539 return Error::success();
2544 auto DefinitionCompleter = [To]() {
2565 ToCaptures.reserve(FromCXXRD->capture_size());
2566 for (
const auto &FromCapture : FromCXXRD->captures()) {
2567 if (
auto ToCaptureOrErr =
import(FromCapture))
2568 ToCaptures.push_back(*ToCaptureOrErr);
2570 return ToCaptureOrErr.takeError();
2579 DefinitionCompleter();
2583 return Error::success();
2593 if (!Importer.isMinimalImport())
2598 llvm::scope_exit DefinitionCompleterScopeExit(DefinitionCompleter);
2604 auto *ToCXX = dyn_cast<CXXRecordDecl>(To);
2605 auto *FromCXX = dyn_cast<CXXRecordDecl>(From);
2606 if (ToCXX && FromCXX && ToCXX->dataPtr() && FromCXX->dataPtr()) {
2608 struct CXXRecordDecl::DefinitionData &ToData = ToCXX->data();
2609 struct CXXRecordDecl::DefinitionData &FromData = FromCXX->data();
2611 #define FIELD(Name, Width, Merge) \
2612 ToData.Name = FromData.Name;
2613 #include "clang/AST/CXXRecordDeclDefinitionBits.def"
2616 ToCXX->setArgPassingRestrictions(FromCXX->getArgPassingRestrictions());
2619 for (
const auto &Base1 : FromCXX->bases()) {
2622 return TyOrErr.takeError();
2625 if (Base1.isPackExpansion()) {
2626 if (
ExpectedSLoc LocOrErr =
import(Base1.getEllipsisLoc()))
2627 EllipsisLoc = *LocOrErr;
2629 return LocOrErr.takeError();
2637 auto RangeOrErr =
import(Base1.getSourceRange());
2639 return RangeOrErr.takeError();
2641 auto TSIOrErr =
import(Base1.getTypeSourceInfo());
2643 return TSIOrErr.takeError();
2649 Base1.isBaseOfClass(),
2650 Base1.getAccessSpecifierAsWritten(),
2655 ToCXX->setBases(Bases.data(), Bases.size());
2663 return Error::success();
2668 return Error::success();
2672 return Error::success();
2676 return ToInitOrErr.takeError();
2687 return Error::success();
2695 return Error::success();
2704 import(
QualType(Importer.getFromContext().getCanonicalTagType(From)));
2706 return ToTypeOrErr.takeError();
2709 if (!ToPromotionTypeOrErr)
2710 return ToPromotionTypeOrErr.takeError();
2721 return Error::success();
2727 for (
const auto &Arg : FromArgs) {
2728 if (
auto ToOrErr =
import(Arg))
2729 ToArgs.push_back(*ToOrErr);
2731 return ToOrErr.takeError();
2734 return Error::success();
2740 return import(From);
2743template <
typename InContainerTy>
2746 for (
const auto &FromLoc : Container) {
2747 if (
auto ToLocOrErr =
import(FromLoc))
2750 return ToLocOrErr.takeError();
2752 return Error::success();
2762 bool IgnoreTemplateParmDepth) {
2765 Decl *ToOrigin = Importer.GetOriginalDecl(To);
2771 Importer.getToContext().getLangOpts(), Importer.getFromContext(),
2772 Importer.getToContext(), Importer.getNonEquivalentDecls(),
2774 false, Complain,
false,
2775 IgnoreTemplateParmDepth);
2780 Importer.FromDiag(D->
getLocation(), diag::err_unsupported_ast_node)
2786 Importer.FromDiag(D->
getLocation(), diag::err_unsupported_ast_node)
2795 return std::move(Err);
2800 return LocOrErr.takeError();
2803 if (GetImportedOrCreateDecl(ToD, D, Importer.getToContext(), DC, *LocOrErr))
2815 Importer.MapImported(D, ToD);
2821 Error Err = Error::success();
2826 return std::move(Err);
2830 return DCOrErr.takeError();
2834 if (GetImportedOrCreateDecl(ToD, D, Importer.getToContext(), DC, ToAsmString,
2835 ToAsmLoc, ToRParenLoc))
2850 return std::move(Err);
2855 if (GetImportedOrCreateDecl(ToD, D, Importer.getToContext(), DC, Loc,
2859 Error Err = Error::success();
2865 return std::move(Err);
2869 addDeclToContexts(D, ToD);
2877 return LocOrErr.takeError();
2880 return ColonLocOrErr.takeError();
2885 return DCOrErr.takeError();
2889 if (GetImportedOrCreateDecl(ToD, D, Importer.getToContext(), D->
getAccess(),
2890 DC, *LocOrErr, *ColonLocOrErr))
2904 return DCOrErr.takeError();
2908 Error Err = Error::success();
2914 return std::move(Err);
2917 if (GetImportedOrCreateDecl(
2918 ToD, D, Importer.getToContext(), DC, ToLocation, ToAssertExpr, ToMessage,
2931 return DCOrErr.takeError();
2935 Error Err = Error::success();
2941 return std::move(Err);
2944 if (GetImportedOrCreateDecl(ToD, D, Importer.getToContext(), DC, ToLocation,
2962 return std::move(Err);
2971 if (
auto *TU = dyn_cast<TranslationUnitDecl>(EnclosingDC))
2974 MergeWithNamespace =
2978 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
2979 for (
auto *FoundDecl : FoundDecls) {
2983 if (
auto *FoundNS = dyn_cast<NamespaceDecl>(FoundDecl)) {
2984 MergeWithNamespace = FoundNS;
2985 ConflictingDecls.clear();
2989 ConflictingDecls.push_back(FoundDecl);
2992 if (!ConflictingDecls.empty()) {
2995 ConflictingDecls.size());
2997 Name = NameOrErr.get();
2999 return NameOrErr.takeError();
3005 return BeginLocOrErr.takeError();
3007 if (!RBraceLocOrErr)
3008 return RBraceLocOrErr.takeError();
3013 if (GetImportedOrCreateDecl(ToNamespace, D, Importer.getToContext(), DC,
3014 D->
isInline(), *BeginLocOrErr, Loc,
3025 if (
auto *TU = dyn_cast<TranslationUnitDecl>(DC))
3026 TU->setAnonymousNamespace(ToNamespace);
3031 Importer.MapImported(D, ToNamespace);
3034 return std::move(Err);
3046 return std::move(Err);
3052 Error Err = Error::success();
3059 return std::move(Err);
3064 if (GetImportedOrCreateDecl(
3065 ToD, D, Importer.getToContext(), DC, ToNamespaceLoc, ToAliasLoc,
3066 ToIdentifier, ToQualifierLoc, ToTargetNameLoc, ToNamespace))
3084 return std::move(Err);
3091 cast_or_null<DeclContext>(Importer.GetAlreadyImportedOrNull(
3103 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
3104 for (
auto *FoundDecl : FoundDecls) {
3105 if (!FoundDecl->isInIdentifierNamespace(IDNS))
3107 if (
auto *FoundTypedef = dyn_cast<TypedefNameDecl>(FoundDecl)) {
3112 QualType FoundUT = FoundTypedef->getUnderlyingType();
3113 if (Importer.IsStructurallyEquivalent(FromUT, FoundUT)) {
3126 if (FromR && FoundR &&
3133 return Importer.MapImported(D, FoundTypedef);
3137 ConflictingDecls.push_back(FoundDecl);
3142 if (!ConflictingDecls.empty()) {
3144 Name, DC, IDNS, ConflictingDecls.data(), ConflictingDecls.size());
3146 Name = NameOrErr.get();
3148 return NameOrErr.takeError();
3152 Error Err = Error::success();
3157 return std::move(Err);
3164 if (GetImportedOrCreateDecl<TypeAliasDecl>(
3165 ToTypedef, D, Importer.getToContext(), DC, ToBeginLoc, Loc,
3168 }
else if (GetImportedOrCreateDecl<TypedefDecl>(
3169 ToTypedef, D, Importer.getToContext(), DC, ToBeginLoc, Loc,
3175 return std::move(Err);
3179 Importer.AddToLookupTable(ToTypedef);
3207 return std::move(Err);
3217 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
3218 for (
auto *FoundDecl : FoundDecls) {
3219 if (!FoundDecl->isInIdentifierNamespace(IDNS))
3221 if (
auto *FoundAlias = dyn_cast<TypeAliasTemplateDecl>(FoundDecl)) {
3223 return Importer.MapImported(D, FoundAlias);
3224 ConflictingDecls.push_back(FoundDecl);
3228 if (!ConflictingDecls.empty()) {
3230 Name, DC, IDNS, ConflictingDecls.data(), ConflictingDecls.size());
3232 Name = NameOrErr.get();
3234 return NameOrErr.takeError();
3238 Error Err = Error::success();
3242 return std::move(Err);
3245 if (GetImportedOrCreateDecl(ToAlias, D, Importer.getToContext(), DC, Loc,
3246 Name, ToTemplateParameters, ToTemplatedDecl))
3249 ToTemplatedDecl->setDescribedAliasTemplate(ToAlias);
3254 if (DC != Importer.getToContext().getTranslationUnitDecl())
3255 updateLookupTableForTemplateParameters(*ToTemplateParameters);
3266 return std::move(Err);
3276 return BeginLocOrErr.takeError();
3277 if (GetImportedOrCreateDecl(ToLabel, D, Importer.getToContext(), DC, Loc,
3282 if (GetImportedOrCreateDecl(ToLabel, D, Importer.getToContext(), DC, Loc,
3290 return ToStmtOrErr.takeError();
3292 ToLabel->
setStmt(*ToStmtOrErr);
3305 return std::move(Err);
3315 return std::move(Err);
3317 }
else if (Importer.getToContext().getLangOpts().CPlusPlus)
3325 Importer.findDeclsInToCtx(DC, SearchName);
3326 for (
auto *FoundDecl : FoundDecls) {
3327 if (!FoundDecl->isInIdentifierNamespace(IDNS))
3330 if (
auto *
Typedef = dyn_cast<TypedefNameDecl>(FoundDecl)) {
3331 if (
const auto *Tag =
Typedef->getUnderlyingType()->getAs<TagType>())
3332 FoundDecl = Tag->getDecl();
3335 if (
auto *FoundEnum = dyn_cast<EnumDecl>(FoundDecl)) {
3341 return Importer.MapImported(D, FoundDef);
3345 ConflictingDecls.push_back(FoundDecl);
3354 if (SearchName && !ConflictingDecls.empty()) {
3356 SearchName, DC, IDNS, ConflictingDecls.data(),
3357 ConflictingDecls.size());
3359 Name = NameOrErr.get();
3361 return NameOrErr.takeError();
3365 Error Err = Error::success();
3371 return std::move(Err);
3375 if (GetImportedOrCreateDecl(
3376 D2, D, Importer.getToContext(), DC, ToBeginLoc,
3386 addDeclToContexts(D, D2);
3392 D2->setInstantiationOfMemberEnum(*ToInstOrErr, SK);
3394 return ToInstOrErr.takeError();
3395 if (
ExpectedSLoc POIOrErr =
import(MemberInfo->getPointOfInstantiation()))
3398 return POIOrErr.takeError();
3404 return std::move(Err);
3410 bool IsFriendTemplate =
false;
3411 if (
auto *DCXX = dyn_cast<CXXRecordDecl>(D)) {
3413 DCXX->getDescribedClassTemplate() &&
3414 DCXX->getDescribedClassTemplate()->getFriendObjectKind() !=
3424 return std::move(Err);
3434 return std::move(Err);
3436 }
else if (Importer.getToContext().getLangOpts().CPlusPlus)
3441 bool DependentFriend = IsFriendTemplate && IsDependentContext;
3448 Importer.findDeclsInToCtx(DC, SearchName);
3449 if (!FoundDecls.empty()) {
3456 for (
auto *FoundDecl : FoundDecls) {
3457 if (!FoundDecl->isInIdentifierNamespace(IDNS))
3461 if (
auto *
Typedef = dyn_cast<TypedefNameDecl>(
Found)) {
3462 if (
const auto *Tag =
Typedef->getUnderlyingType()->getAs<TagType>())
3463 Found = Tag->getDecl();
3466 if (
auto *FoundRecord = dyn_cast<RecordDecl>(
Found)) {
3488 Importer.MapImported(D, FoundDef);
3489 if (
const auto *DCXX = dyn_cast<CXXRecordDecl>(D)) {
3490 auto *FoundCXX = dyn_cast<CXXRecordDecl>(FoundDef);
3491 assert(FoundCXX &&
"Record type mismatch");
3493 if (!Importer.isMinimalImport())
3497 return std::move(Err);
3504 ConflictingDecls.push_back(FoundDecl);
3508 if (!ConflictingDecls.empty() && SearchName) {
3510 SearchName, DC, IDNS, ConflictingDecls.data(),
3511 ConflictingDecls.size());
3513 Name = NameOrErr.get();
3515 return NameOrErr.takeError();
3521 return BeginLocOrErr.takeError();
3526 if (
auto *DCXX = dyn_cast<CXXRecordDecl>(D)) {
3527 if (DCXX->isLambda()) {
3528 auto TInfoOrErr =
import(DCXX->getLambdaTypeInfo());
3530 return TInfoOrErr.takeError();
3531 if (GetImportedOrCreateSpecialDecl(
3533 DC, *TInfoOrErr, Loc, DCXX->getLambdaDependencyKind(),
3534 DCXX->isGenericLambda(), DCXX->getLambdaCaptureDefault()))
3536 Decl *ContextDecl = DCXX->getLambdaContextDecl();
3539 return CDeclOrErr.takeError();
3540 if (ContextDecl !=
nullptr) {
3545 if (GetImportedOrCreateDecl(D2CXX, D, Importer.getToContext(),
3548 cast_or_null<CXXRecordDecl>(PrevDecl)))
3555 addDeclToContexts(D, D2);
3558 DCXX->getDescribedClassTemplate()) {
3561 return std::move(Err);
3564 DCXX->getMemberSpecializationInfo()) {
3566 MemberInfo->getTemplateSpecializationKind();
3572 return ToInstOrErr.takeError();
3575 import(MemberInfo->getPointOfInstantiation()))
3579 return POIOrErr.takeError();
3583 if (GetImportedOrCreateDecl(D2, D, Importer.getToContext(),
3588 addDeclToContexts(D, D2);
3594 return BraceRangeOrErr.takeError();
3598 return QualifierLocOrErr.takeError();
3605 return std::move(Err);
3617 return std::move(Err);
3626 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
3627 for (
auto *FoundDecl : FoundDecls) {
3628 if (!FoundDecl->isInIdentifierNamespace(IDNS))
3631 if (
auto *FoundEnumConstant = dyn_cast<EnumConstantDecl>(FoundDecl)) {
3633 return Importer.MapImported(D, FoundEnumConstant);
3634 ConflictingDecls.push_back(FoundDecl);
3638 if (!ConflictingDecls.empty()) {
3640 Name, DC, IDNS, ConflictingDecls.data(), ConflictingDecls.size());
3642 Name = NameOrErr.get();
3644 return NameOrErr.takeError();
3650 return TypeOrErr.takeError();
3654 return InitOrErr.takeError();
3657 if (GetImportedOrCreateDecl(
3658 ToEnumerator, D, Importer.getToContext(),
cast<EnumDecl>(DC), Loc,
3660 return ToEnumerator;
3665 return ToEnumerator;
3668template <
typename DeclTy>
3672 FromD->getTemplateParameterLists();
3673 if (FromTPLs.empty())
3674 return Error::success();
3676 for (
unsigned int I = 0; I < FromTPLs.size(); ++I)
3678 ToTPLists[I] = *ToTPListOrErr;
3680 return ToTPListOrErr.takeError();
3681 ToD->setTemplateParameterListsInfo(Importer.ToContext, ToTPLists);
3682 return Error::success();
3690 return Error::success();
3696 return Error::success();
3702 ToFD->setInstantiationOfMemberFunction(*InstFDOrErr, TSK);
3704 return InstFDOrErr.takeError();
3710 return POIOrErr.takeError();
3712 return Error::success();
3716 auto FunctionAndArgsOrErr =
3718 if (!FunctionAndArgsOrErr)
3719 return FunctionAndArgsOrErr.takeError();
3722 Importer.getToContext(), std::get<1>(*FunctionAndArgsOrErr));
3726 const auto *FromTAArgsAsWritten = FTSInfo->TemplateArgumentsAsWritten;
3727 if (FromTAArgsAsWritten)
3729 *FromTAArgsAsWritten, ToTAInfo))
3732 ExpectedSLoc POIOrErr =
import(FTSInfo->getPointOfInstantiation());
3734 return POIOrErr.takeError();
3740 ToFD->setFunctionTemplateSpecialization(
3741 std::get<0>(*FunctionAndArgsOrErr), ToTAList, {}, TSK,
3742 FromTAArgsAsWritten ? &ToTAInfo :
nullptr, *POIOrErr);
3743 return Error::success();
3751 Candidates.
addDecl(*ToFTDOrErr);
3753 return ToFTDOrErr.takeError();
3758 const auto *FromTAArgsAsWritten = FromInfo->TemplateArgumentsAsWritten;
3759 if (FromTAArgsAsWritten)
3765 Importer.getToContext(), Candidates,
3766 FromTAArgsAsWritten ? &ToTAInfo :
nullptr);
3767 return Error::success();
3770 llvm_unreachable(
"All cases should be covered!");
3775 auto FunctionAndArgsOrErr =
3777 if (!FunctionAndArgsOrErr)
3778 return FunctionAndArgsOrErr.takeError();
3782 std::tie(
Template, ToTemplArgs) = *FunctionAndArgsOrErr;
3783 llvm::FoldingSetInsertToken InsertToken;
3784 auto *FoundSpec =
Template->findSpecialization(ToTemplArgs, InsertToken);
3794 return ToBodyOrErr.takeError();
3796 return Error::success();
3803 ExplicitExpr = importChecked(Err, ESpec.
getExpr());
3810 auto RedeclIt = Redecls.begin();
3813 for (; RedeclIt != Redecls.end() && *RedeclIt != D; ++RedeclIt) {
3816 return ToRedeclOrErr.takeError();
3818 assert(*RedeclIt == D);
3826 return std::move(Err);
3841 if (!FoundFunctionOrErr)
3842 return FoundFunctionOrErr.takeError();
3843 if (
FunctionDecl *FoundFunction = *FoundFunctionOrErr) {
3844 if (
Decl *Def = FindAndMapDefinition(D, FoundFunction))
3846 FoundByLookup = FoundFunction;
3854 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
3855 for (
auto *FoundDecl : FoundDecls) {
3856 if (!FoundDecl->isInIdentifierNamespace(IDNS))
3859 if (
auto *FoundFunction = dyn_cast<FunctionDecl>(FoundDecl)) {
3864 if (
Decl *Def = FindAndMapDefinition(D, FoundFunction))
3866 FoundByLookup = FoundFunction;
3873 if (Importer.getToContext().getLangOpts().CPlusPlus)
3877 Importer.ToDiag(Loc, diag::warn_odr_function_type_inconsistent)
3878 << Name << D->
getType() << FoundFunction->getType();
3879 Importer.ToDiag(FoundFunction->getLocation(), diag::note_odr_value_here)
3880 << FoundFunction->getType();
3881 ConflictingDecls.push_back(FoundDecl);
3885 if (!ConflictingDecls.empty()) {
3887 Name, DC, IDNS, ConflictingDecls.data(), ConflictingDecls.size());
3889 Name = NameOrErr.get();
3891 return NameOrErr.takeError();
3901 if (FoundByLookup) {
3911 "Templated function mapped to non-templated?");
3912 Importer.MapImported(DescribedD,
3915 return Importer.MapImported(D, FoundByLookup);
3927 return std::move(Err);
3938 bool UsedDifferentProtoType =
false;
3940 QualType FromReturnTy = FromFPT->getReturnType();
3948 if (Importer.FindFunctionDeclImportCycle.isCycle(D)) {
3949 FromReturnTy = Importer.getFromContext().VoidTy;
3950 UsedDifferentProtoType =
true;
3961 FromEPI = DefaultEPI;
3962 UsedDifferentProtoType =
true;
3964 FromTy = Importer.getFromContext().getFunctionType(
3965 FromReturnTy, FromFPT->getParamTypes(), FromEPI);
3966 FromTSI = Importer.getFromContext().getTrivialTypeSourceInfo(
3970 Error Err = Error::success();
3971 auto ScopedReturnTypeDeclCycleDetector =
3972 Importer.FindFunctionDeclImportCycle.makeScopedCycleDetection(D);
3983 return std::move(Err);
3989 Parameters.push_back(*ToPOrErr);
3991 return ToPOrErr.takeError();
3996 if (
auto *FromConstructor = dyn_cast<CXXConstructorDecl>(D)) {
3998 importExplicitSpecifier(Err, FromConstructor->getExplicitSpecifier());
4000 return std::move(Err);
4002 if (FromConstructor->isInheritingConstructor()) {
4004 import(FromConstructor->getInheritedConstructor());
4005 if (!ImportedInheritedCtor)
4006 return ImportedInheritedCtor.takeError();
4007 ToInheritedConstructor = *ImportedInheritedCtor;
4009 if (GetImportedOrCreateDecl<CXXConstructorDecl>(
4011 ToInnerLocStart, NameInfo,
T, TInfo, ESpec, D->
UsesFPIntrin(),
4013 ToInheritedConstructor, TrailingRequiresClause))
4017 Error Err = Error::success();
4019 Err,
const_cast<FunctionDecl *
>(FromDtor->getOperatorDelete()));
4020 auto ToThisArg =
importChecked(Err, FromDtor->getOperatorDeleteThisArg());
4022 return std::move(Err);
4024 if (GetImportedOrCreateDecl<CXXDestructorDecl>(
4028 TrailingRequiresClause))
4035 dyn_cast<CXXConversionDecl>(D)) {
4037 importExplicitSpecifier(Err, FromConversion->getExplicitSpecifier());
4039 return std::move(Err);
4040 if (GetImportedOrCreateDecl<CXXConversionDecl>(
4046 }
else if (
auto *
Method = dyn_cast<CXXMethodDecl>(D)) {
4047 if (GetImportedOrCreateDecl<CXXMethodDecl>(
4049 ToInnerLocStart, NameInfo,
T, TInfo,
Method->getStorageClass(),
4053 }
else if (
auto *Guide = dyn_cast<CXXDeductionGuideDecl>(D)) {
4055 importExplicitSpecifier(Err, Guide->getExplicitSpecifier());
4061 return std::move(Err);
4062 if (GetImportedOrCreateDecl<CXXDeductionGuideDecl>(
4063 ToFunction, D, Importer.getToContext(), DC, ToInnerLocStart, ESpec,
4064 NameInfo,
T, TInfo, ToEndLoc, Ctor,
4065 Guide->getDeductionCandidateKind(), TrailingRequiresClause,
4069 if (GetImportedOrCreateDecl(
4070 ToFunction, D, Importer.getToContext(), DC, ToInnerLocStart,
4078 if (FoundByLookup) {
4128 Importer.getToContext(), Lookups, Info->getFPFeatures(), Msg));
4132 for (
auto *Param : Parameters) {
4133 Param->setOwningFunction(ToFunction);
4136 LT->update(Param, Importer.getToContext().getTranslationUnitDecl());
4138 ToFunction->setParams(Parameters);
4145 for (
unsigned I = 0, N = Parameters.size(); I != N; ++I)
4146 ProtoLoc.setParam(I, Parameters[I]);
4152 auto ToFTOrErr =
import(FromFT);
4154 return ToFTOrErr.takeError();
4158 if (
auto *FromConstructor = dyn_cast<CXXConstructorDecl>(D)) {
4159 if (
unsigned NumInitializers = FromConstructor->getNumCtorInitializers()) {
4163 FromConstructor->inits(), CtorInitializers))
4164 return std::move(Err);
4167 llvm::copy(CtorInitializers, Memory);
4169 ToCtor->setCtorInitializers(Memory);
4170 ToCtor->setNumCtorInitializers(NumInitializers);
4176 return std::move(Err);
4178 if (
auto *FromCXXMethod = dyn_cast<CXXMethodDecl>(D))
4181 return std::move(Err);
4187 return std::move(Err);
4191 if (UsedDifferentProtoType) {
4193 ToFunction->
setType(*TyOrErr);
4195 return TyOrErr.takeError();
4199 return TSIOrErr.takeError();
4204 addDeclToContexts(D, ToFunction);
4207 for (++RedeclIt; RedeclIt != Redecls.end(); ++RedeclIt) {
4210 return ToRedeclOrErr.takeError();
4244 return std::move(Err);
4249 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
4250 for (
auto *FoundDecl : FoundDecls) {
4251 if (
FieldDecl *FoundField = dyn_cast<FieldDecl>(FoundDecl)) {
4258 if (Importer.IsStructurallyEquivalent(D->
getType(),
4259 FoundField->getType())) {
4260 Importer.MapImported(D, FoundField);
4268 if (
ExpectedExpr ToInitializerOrErr =
import(FromInitializer)) {
4271 assert(FoundField->hasInClassInitializer() &&
4272 "Field should have an in-class initializer if it has an "
4273 "expression for it.");
4274 if (!FoundField->getInClassInitializer())
4275 FoundField->setInClassInitializer(*ToInitializerOrErr);
4277 return ToInitializerOrErr.takeError();
4284 Importer.ToDiag(Loc, diag::warn_odr_field_type_inconsistent)
4285 << Name << D->
getType() << FoundField->getType();
4286 Importer.ToDiag(FoundField->getLocation(), diag::note_odr_value_here)
4287 << FoundField->getType();
4293 Error Err = Error::success();
4299 return std::move(Err);
4300 const Type *ToCapturedVLAType =
nullptr;
4301 if (
Error Err = Importer.importInto(
4303 return std::move(Err);
4306 if (GetImportedOrCreateDecl(ToField, D, Importer.getToContext(), DC,
4308 ToType, ToTInfo, ToBitWidth, D->
isMutable(),
4315 if (ToCapturedVLAType)
4322 return std::move(Err);
4323 if (ToInitializer) {
4325 if (AlreadyImported)
4326 assert(ToInitializer == AlreadyImported &&
4327 "Duplicate import of in-class initializer.");
4342 return std::move(Err);
4347 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
4348 for (
unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
4349 if (
auto *FoundField = dyn_cast<IndirectFieldDecl>(FoundDecls[I])) {
4356 if (Importer.IsStructurallyEquivalent(D->
getType(),
4357 FoundField->getType(),
4359 Importer.MapImported(D, FoundField);
4364 if (!Name && I < N-1)
4368 Importer.ToDiag(Loc, diag::warn_odr_field_type_inconsistent)
4369 << Name << D->
getType() << FoundField->getType();
4370 Importer.ToDiag(FoundField->getLocation(), diag::note_odr_value_here)
4371 << FoundField->getType();
4378 auto TypeOrErr =
import(D->
getType());
4380 return TypeOrErr.takeError();
4386 for (
auto *PI : D->
chain())
4388 NamedChain[i++] = *ToD;
4390 return ToD.takeError();
4394 if (GetImportedOrCreateDecl(ToIndirectField, D, Importer.getToContext(), DC,
4397 return ToIndirectField;
4402 return ToIndirectField;
4429 unsigned int FriendCount = 0;
4433 for (
FriendDecl *FoundFriend : RD->friends()) {
4434 if (FoundFriend == FD) {
4435 FriendPosition = FriendCount;
4442 assert(FriendPosition &&
"Friend decl not found in own parent.");
4443 return {FriendCount, *FriendPosition};
4446Expected<FriendDecl::FriendUnion>
4447ASTNodeImporter::importFriendUnion(FriendDecl *D) {
4449 NamedDecl *ToFriendD;
4451 return std::move(Err);
4464 return TSIOrErr.takeError();
4471 return std::move(Err);
4478 for (
FriendDecl *ImportedFriend : RD->friends())
4480 ImportedEquivalentFriends.push_back(ImportedFriend);
4485 assert(ImportedEquivalentFriends.size() <= CountAndPosition.
TotalCount &&
4486 "Class with non-matching friends is imported, ODR check wrong?");
4487 if (ImportedEquivalentFriends.size() == CountAndPosition.
TotalCount)
4488 return Importer.MapImported(
4489 D, ImportedEquivalentFriends[CountAndPosition.
IndexOfDecl]);
4493 auto ToFUOrErr = importFriendUnion(D);
4495 return ToFUOrErr.takeError();
4500 return LocationOrErr.takeError();
4502 if (!FriendLocOrErr)
4503 return FriendLocOrErr.takeError();
4505 if (!EllipsisLocOrErr)
4506 return EllipsisLocOrErr.takeError();
4509 if (GetImportedOrCreateDecl(FrD, D, Importer.getToContext(), DC,
4510 *LocationOrErr, ToFU, *FriendLocOrErr,
4523 return std::move(Err);
4527 for (
FriendDecl *ImportedFriend : RD->friends()) {
4528 auto *ImportedFriendTemplate = dyn_cast<FriendTemplateDecl>(ImportedFriend);
4529 if (ImportedFriendTemplate &&
4531 ImportedEquivalentFriends.push_back(ImportedFriendTemplate);
4536 assert(ImportedEquivalentFriends.size() <= CountAndPosition.
TotalCount &&
4537 "Class with non-matching friends is imported, ODR check wrong?");
4539 if (ImportedEquivalentFriends.size() == CountAndPosition.
TotalCount)
4540 return Importer.MapImported(
4541 D, ImportedEquivalentFriends[CountAndPosition.
IndexOfDecl]);
4546 auto ToFUOrErr = importFriendUnion(D);
4548 return ToFUOrErr.takeError();
4554 if (!FromTemplate.
isNull()) {
4556 return std::move(Err);
4562 return std::move(Err);
4566 return LocationOrErr.takeError();
4569 if (!FriendLocOrErr)
4570 return FriendLocOrErr.takeError();
4573 if (!EllipsisLocOrErr)
4574 return EllipsisLocOrErr.takeError();
4577 if (GetImportedOrCreateDecl(FTD, D, Importer.getToContext(), DC,
4578 *LocationOrErr, ToFU, *FriendLocOrErr, ToTPLs,
4579 *EllipsisLocOrErr, ToTemplate))
4595 return std::move(Err);
4600 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
4601 for (
auto *FoundDecl : FoundDecls) {
4602 if (
ObjCIvarDecl *FoundIvar = dyn_cast<ObjCIvarDecl>(FoundDecl)) {
4603 if (Importer.IsStructurallyEquivalent(D->
getType(),
4604 FoundIvar->getType())) {
4605 Importer.MapImported(D, FoundIvar);
4609 Importer.ToDiag(Loc, diag::warn_odr_ivar_type_inconsistent)
4610 << Name << D->
getType() << FoundIvar->getType();
4611 Importer.ToDiag(FoundIvar->getLocation(), diag::note_odr_value_here)
4612 << FoundIvar->getType();
4618 Error Err = Error::success();
4624 return std::move(Err);
4627 if (GetImportedOrCreateDecl(
4630 ToType, ToTypeSourceInfo,
4642 auto RedeclIt = Redecls.begin();
4645 for (; RedeclIt != Redecls.end() && *RedeclIt != D; ++RedeclIt) {
4648 return RedeclOrErr.takeError();
4650 assert(*RedeclIt == D);
4658 return std::move(Err);
4664 VarDecl *FoundByLookup =
nullptr;
4668 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
4669 for (
auto *FoundDecl : FoundDecls) {
4670 if (!FoundDecl->isInIdentifierNamespace(IDNS))
4673 if (
auto *FoundVar = dyn_cast<VarDecl>(FoundDecl)) {
4676 if (Importer.IsStructurallyEquivalent(D->
getType(),
4677 FoundVar->getType())) {
4685 return Importer.MapImported(D, FoundDef);
4689 const VarDecl *FoundDInit =
nullptr;
4690 if (D->
getInit() && FoundVar->getAnyInitializer(FoundDInit))
4692 return Importer.MapImported(D,
const_cast<VarDecl*
>(FoundDInit));
4694 FoundByLookup = FoundVar;
4699 = Importer.getToContext().getAsArrayType(FoundVar->getType());
4701 = Importer.getToContext().getAsArrayType(D->
getType());
4702 if (FoundArray && TArray) {
4706 if (
auto TyOrErr =
import(D->
getType()))
4707 FoundVar->setType(*TyOrErr);
4709 return TyOrErr.takeError();
4711 FoundByLookup = FoundVar;
4715 FoundByLookup = FoundVar;
4720 Importer.ToDiag(Loc, diag::warn_odr_variable_type_inconsistent)
4721 << Name << D->
getType() << FoundVar->getType();
4722 Importer.ToDiag(FoundVar->getLocation(), diag::note_odr_value_here)
4723 << FoundVar->getType();
4724 ConflictingDecls.push_back(FoundDecl);
4728 if (!ConflictingDecls.empty()) {
4730 Name, DC, IDNS, ConflictingDecls.data(), ConflictingDecls.size());
4732 Name = NameOrErr.get();
4734 return NameOrErr.takeError();
4738 Error Err = Error::success();
4744 return std::move(Err);
4747 if (
auto *FromDecomp = dyn_cast<DecompositionDecl>(D)) {
4751 return std::move(Err);
4753 if (GetImportedOrCreateDecl(
4754 ToDecomp, FromDecomp, Importer.getToContext(), DC, ToInnerLocStart,
4755 Loc, FromDecomp->getRSquareLoc(), ToType, ToTypeSourceInfo,
4761 if (GetImportedOrCreateDecl(ToVar, D, Importer.getToContext(), DC,
4762 ToInnerLocStart, Loc,
4777 if (FoundByLookup) {
4786 return ToVTOrErr.takeError();
4793 return ToInstOrErr.takeError();
4794 if (
ExpectedSLoc POIOrErr =
import(MSI->getPointOfInstantiation()))
4797 return POIOrErr.takeError();
4801 return std::move(Err);
4806 addDeclToContexts(D, ToVar);
4809 for (++RedeclIt; RedeclIt != Redecls.end(); ++RedeclIt) {
4812 return RedeclOrErr.takeError();
4821 DeclContext *DC = Importer.getToContext().getTranslationUnitDecl();
4823 Error Err = Error::success();
4828 return std::move(Err);
4832 if (GetImportedOrCreateDecl(ToParm, D, Importer.getToContext(), DC,
4833 ToLocation, ToDeclName.getAsIdentifierInfo(),
4845 return LocOrErr.takeError();
4854 return ToDefArgOrErr.takeError();
4858 if (
auto ToDefArgOrErr =
import(FromParam->
getDefaultArg()))
4861 return ToDefArgOrErr.takeError();
4864 return Error::success();
4869 Error Err = Error::success();
4874 return std::move(Err);
4881 DeclContext *DC = Importer.getToContext().getTranslationUnitDecl();
4883 Error Err = Error::success();
4890 return std::move(Err);
4893 if (GetImportedOrCreateDecl(ToParm, D, Importer.getToContext(), DC,
4894 ToInnerLocStart, ToLocation,
4895 ToDeclName.getAsIdentifierInfo(), ToType,
4904 return std::move(Err);
4924 return std::move(Err);
4928 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
4929 for (
auto *FoundDecl : FoundDecls) {
4930 if (
auto *FoundMethod = dyn_cast<ObjCMethodDecl>(FoundDecl)) {
4936 FoundMethod->getReturnType())) {
4937 Importer.ToDiag(Loc, diag::warn_odr_objc_method_result_type_inconsistent)
4939 << FoundMethod->getReturnType();
4940 Importer.ToDiag(FoundMethod->getLocation(),
4941 diag::note_odr_objc_method_here)
4948 if (D->
param_size() != FoundMethod->param_size()) {
4949 Importer.ToDiag(Loc, diag::warn_odr_objc_method_num_params_inconsistent)
4951 << D->
param_size() << FoundMethod->param_size();
4952 Importer.ToDiag(FoundMethod->getLocation(),
4953 diag::note_odr_objc_method_here)
4961 PEnd = D->
param_end(), FoundP = FoundMethod->param_begin();
4962 P != PEnd; ++
P, ++FoundP) {
4963 if (!Importer.IsStructurallyEquivalent((*P)->getType(),
4964 (*FoundP)->getType())) {
4965 Importer.FromDiag((*P)->getLocation(),
4966 diag::warn_odr_objc_method_param_type_inconsistent)
4968 << (*P)->getType() << (*FoundP)->getType();
4969 Importer.ToDiag((*FoundP)->getLocation(), diag::note_odr_value_here)
4970 << (*FoundP)->getType();
4978 if (D->
isVariadic() != FoundMethod->isVariadic()) {
4979 Importer.ToDiag(Loc, diag::warn_odr_objc_method_variadic_inconsistent)
4981 Importer.ToDiag(FoundMethod->getLocation(),
4982 diag::note_odr_objc_method_here)
4989 return Importer.MapImported(D, FoundMethod);
4993 Error Err = Error::success();
4996 auto ToReturnTypeSourceInfo =
4999 return std::move(Err);
5002 if (GetImportedOrCreateDecl(
5003 ToMethod, D, Importer.getToContext(), Loc, ToEndLoc,
5017 ToParams.push_back(*ToPOrErr);
5019 return ToPOrErr.takeError();
5023 for (
auto *ToParam : ToParams) {
5024 ToParam->setOwningFunction(ToMethod);
5032 return std::move(Err);
5034 ToMethod->
setMethodParams(Importer.getToContext(), ToParams, ToSelLocs);
5056 return std::move(Err);
5060 Error Err = Error::success();
5066 return std::move(Err);
5069 if (GetImportedOrCreateDecl(
5073 ToColonLoc, ToTypeSourceInfo))
5079 return std::move(Err);
5080 Result->setTypeForDecl(ToTypeForDecl);
5081 Result->setLexicalDeclContext(LexicalDC);
5092 return std::move(Err);
5098 return std::move(Err);
5106 Error Err = Error::success();
5112 return std::move(Err);
5114 if (GetImportedOrCreateDecl(ToCategory, D, Importer.getToContext(), DC,
5130 return PListOrErr.takeError();
5139 FromProto != FromProtoEnd;
5140 ++FromProto, ++FromProtoLoc) {
5142 Protocols.push_back(*ToProtoOrErr);
5144 return ToProtoOrErr.takeError();
5146 if (
ExpectedSLoc ToProtoLocOrErr =
import(*FromProtoLoc))
5147 ProtocolLocs.push_back(*ToProtoLocOrErr);
5149 return ToProtoLocOrErr.takeError();
5154 ProtocolLocs.data(), Importer.getToContext());
5157 Importer.MapImported(D, ToCategory);
5162 return std::move(Err);
5170 return ToImplOrErr.takeError();
5182 return Error::success();
5195 FromProto != FromProtoEnd;
5196 ++FromProto, ++FromProtoLoc) {
5198 Protocols.push_back(*ToProtoOrErr);
5200 return ToProtoOrErr.takeError();
5202 if (
ExpectedSLoc ToProtoLocOrErr =
import(*FromProtoLoc))
5203 ProtocolLocs.push_back(*ToProtoLocOrErr);
5205 return ToProtoLocOrErr.takeError();
5211 ProtocolLocs.data(), Importer.getToContext());
5218 return Error::success();
5228 return Importer.MapImported(D, *ImportedDefOrErr);
5230 return ImportedDefOrErr.takeError();
5239 return std::move(Err);
5244 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
5245 for (
auto *FoundDecl : FoundDecls) {
5249 if ((MergeWithProtocol = dyn_cast<ObjCProtocolDecl>(FoundDecl)))
5256 if (!ToAtBeginLocOrErr)
5257 return ToAtBeginLocOrErr.takeError();
5259 if (GetImportedOrCreateDecl(ToProto, D, Importer.getToContext(), DC,
5268 Importer.MapImported(D, ToProto);
5272 return std::move(Err);
5280 return std::move(Err);
5283 if (!ExternLocOrErr)
5284 return ExternLocOrErr.takeError();
5288 return LangLocOrErr.takeError();
5293 if (GetImportedOrCreateDecl(ToLinkageSpec, D, Importer.getToContext(), DC,
5294 *ExternLocOrErr, *LangLocOrErr,
5296 return ToLinkageSpec;
5300 if (!RBraceLocOrErr)
5301 return RBraceLocOrErr.takeError();
5308 return ToLinkageSpec;
5319 return ToShadowOrErr.takeError();
5330 return std::move(Err);
5334 Error Err = Error::success();
5339 return std::move(Err);
5343 return std::move(Err);
5346 if (GetImportedOrCreateDecl(ToUsing, D, Importer.getToContext(), DC,
5347 ToUsingLoc, ToQualifierLoc, NameInfo,
5355 Importer.getFromContext().getInstantiatedFromUsingDecl(D)) {
5357 Importer.getToContext().setInstantiatedFromUsingDecl(
5358 ToUsing, *ToPatternOrErr);
5360 return ToPatternOrErr.takeError();
5372 return std::move(Err);
5376 Error Err = Error::success();
5382 return std::move(Err);
5385 if (GetImportedOrCreateDecl(ToUsingEnum, D, Importer.getToContext(), DC,
5386 ToUsingLoc, ToEnumLoc, ToNameLoc, ToEnumType))
5393 Importer.getFromContext().getInstantiatedFromUsingEnumDecl(D)) {
5395 Importer.getToContext().setInstantiatedFromUsingEnumDecl(ToUsingEnum,
5398 return ToPatternOrErr.takeError();
5410 return std::move(Err);
5415 if (!ToIntroducerOrErr)
5416 return ToIntroducerOrErr.takeError();
5420 return ToTargetOrErr.takeError();
5423 if (
auto *FromConstructorUsingShadow =
5424 dyn_cast<ConstructorUsingShadowDecl>(D)) {
5425 Error Err = Error::success();
5427 Err, FromConstructorUsingShadow->getNominatedBaseClassShadowDecl());
5429 return std::move(Err);
5435 if (GetImportedOrCreateDecl<ConstructorUsingShadowDecl>(
5436 ToShadow, D, Importer.getToContext(), DC, Loc,
5438 Nominated ? Nominated : *ToTargetOrErr,
5439 FromConstructorUsingShadow->constructsVirtualBase()))
5442 if (GetImportedOrCreateDecl(ToShadow, D, Importer.getToContext(), DC, Loc,
5443 Name, *ToIntroducerOrErr, *ToTargetOrErr))
5451 Importer.getFromContext().getInstantiatedFromUsingShadowDecl(D)) {
5453 Importer.getToContext().setInstantiatedFromUsingShadowDecl(
5454 ToShadow, *ToPatternOrErr);
5458 return ToPatternOrErr.takeError();
5472 return std::move(Err);
5477 if (!ToComAncestorOrErr)
5478 return ToComAncestorOrErr.takeError();
5480 Error Err = Error::success();
5483 auto ToNamespaceKeyLocation =
5488 return std::move(Err);
5491 if (GetImportedOrCreateDecl(ToUsingDir, D, Importer.getToContext(), DC,
5493 ToNamespaceKeyLocation,
5496 ToNominatedNamespace, *ToComAncestorOrErr))
5511 return std::move(Err);
5515 auto ToInstantiatedFromUsingOrErr =
5517 if (!ToInstantiatedFromUsingOrErr)
5518 return ToInstantiatedFromUsingOrErr.takeError();
5521 return std::move(Err);
5524 if (GetImportedOrCreateDecl(ToUsingPack, D, Importer.getToContext(), DC,
5529 addDeclToContexts(D, ToUsingPack);
5541 return std::move(Err);
5545 Error Err = Error::success();
5551 return std::move(Err);
5555 return std::move(Err);
5558 if (GetImportedOrCreateDecl(ToUsingValue, D, Importer.getToContext(), DC,
5559 ToUsingLoc, ToQualifierLoc, NameInfo,
5561 return ToUsingValue;
5567 return ToUsingValue;
5577 return std::move(Err);
5581 Error Err = Error::success();
5587 return std::move(Err);
5590 if (GetImportedOrCreateDecl(ToUsing, D, Importer.getToContext(), DC,
5591 ToUsingLoc, ToTypenameLoc,
5592 ToQualifierLoc, Loc, Name, ToEllipsisLoc))
5603 Decl* ToD =
nullptr;
5605#define BuiltinTemplate(BTName) \
5606 case BuiltinTemplateKind::BTK##BTName: \
5607 ToD = Importer.getToContext().get##BTName##Decl(); \
5609#include "clang/Basic/BuiltinTemplates.inc"
5611 assert(ToD &&
"BuiltinTemplateDecl of unsupported kind!");
5612 Importer.MapImported(D, ToD);
5622 if (
auto FromSuperOrErr =
import(FromSuper))
5623 FromSuper = *FromSuperOrErr;
5625 return FromSuperOrErr.takeError();
5629 if ((
bool)FromSuper != (
bool)ToSuper ||
5632 diag::warn_odr_objc_superclass_inconsistent)
5639 diag::note_odr_objc_missing_superclass);
5642 diag::note_odr_objc_superclass)
5646 diag::note_odr_objc_missing_superclass);
5652 return Error::success();
5663 return SuperTInfoOrErr.takeError();
5674 FromProto != FromProtoEnd;
5675 ++FromProto, ++FromProtoLoc) {
5677 Protocols.push_back(*ToProtoOrErr);
5679 return ToProtoOrErr.takeError();
5681 if (
ExpectedSLoc ToProtoLocOrErr =
import(*FromProtoLoc))
5682 ProtocolLocs.push_back(*ToProtoLocOrErr);
5684 return ToProtoLocOrErr.takeError();
5690 ProtocolLocs.data(), Importer.getToContext());
5695 auto ToCatOrErr =
import(Cat);
5697 return ToCatOrErr.takeError();
5706 return ToImplOrErr.takeError();
5713 return Error::success();
5722 for (
auto *fromTypeParam : *list) {
5723 if (
auto toTypeParamOrErr =
import(fromTypeParam))
5724 toTypeParams.push_back(*toTypeParamOrErr);
5726 return toTypeParamOrErr.takeError();
5730 if (!LAngleLocOrErr)
5731 return LAngleLocOrErr.takeError();
5734 if (!RAngleLocOrErr)
5735 return RAngleLocOrErr.takeError();
5750 return Importer.MapImported(D, *ImportedDefOrErr);
5752 return ImportedDefOrErr.takeError();
5761 return std::move(Err);
5767 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
5768 for (
auto *FoundDecl : FoundDecls) {
5772 if ((MergeWithIface = dyn_cast<ObjCInterfaceDecl>(FoundDecl)))
5780 if (!AtBeginLocOrErr)
5781 return AtBeginLocOrErr.takeError();
5783 if (GetImportedOrCreateDecl(
5784 ToIface, D, Importer.getToContext(), DC,
5792 Importer.MapImported(D, ToIface);
5795 if (
auto ToPListOrErr =
5799 return ToPListOrErr.takeError();
5803 return std::move(Err);
5812 return std::move(Err);
5818 return std::move(Err);
5820 Error Err = Error::success();
5825 return std::move(Err);
5827 if (GetImportedOrCreateDecl(
5828 ToImpl, D, Importer.getToContext(), DC,
5829 Importer.Import(D->
getIdentifier()), Category->getClassInterface(),
5830 ToLocation, ToAtStartLoc, ToCategoryNameLoc))
5835 Category->setImplementation(ToImpl);
5838 Importer.MapImported(D, ToImpl);
5840 return std::move(Err);
5850 return std::move(Err);
5855 return std::move(Err);
5863 return std::move(Err);
5865 Error Err = Error::success();
5872 return std::move(Err);
5874 if (GetImportedOrCreateDecl(Impl, D, Importer.getToContext(),
5883 Impl->setLexicalDeclContext(LexicalDC);
5897 Importer.ToDiag(Impl->getLocation(),
5898 diag::warn_odr_objc_superclass_inconsistent)
5902 if (Impl->getSuperClass())
5903 Importer.ToDiag(Impl->getLocation(),
5904 diag::note_odr_objc_superclass)
5905 << Impl->getSuperClass()->getDeclName();
5907 Importer.ToDiag(Impl->getLocation(),
5908 diag::note_odr_objc_missing_superclass);
5911 diag::note_odr_objc_superclass)
5915 diag::note_odr_objc_missing_superclass);
5923 return std::move(Err);
5935 return std::move(Err);
5940 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
5941 for (
auto *FoundDecl : FoundDecls) {
5942 if (
auto *FoundProp = dyn_cast<ObjCPropertyDecl>(FoundDecl)) {
5949 if (!Importer.IsStructurallyEquivalent(D->
getType(),
5950 FoundProp->getType())) {
5951 Importer.ToDiag(Loc, diag::warn_odr_objc_property_type_inconsistent)
5952 << Name << D->
getType() << FoundProp->getType();
5953 Importer.ToDiag(FoundProp->getLocation(), diag::note_odr_value_here)
5954 << FoundProp->getType();
5962 Importer.MapImported(D, FoundProp);
5967 Error Err = Error::success();
5973 return std::move(Err);
5977 if (GetImportedOrCreateDecl(
5978 ToProperty, D, Importer.getToContext(), DC, Loc,
5980 ToLParenLoc, ToType,
5992 return std::move(Err);
6012 return std::move(Err);
6016 return std::move(Err);
6023 return std::move(Err);
6026 = InImpl->FindPropertyImplDecl(
Property->getIdentifier(),
6030 Error Err = Error::success();
6033 auto ToPropertyIvarDeclLoc =
6036 return std::move(Err);
6038 if (GetImportedOrCreateDecl(ToImpl, D, Importer.getToContext(), DC,
6042 ToPropertyIvarDeclLoc))
6052 diag::warn_odr_objc_property_impl_kind_inconsistent)
6057 diag::note_odr_objc_property_impl_kind)
6068 diag::warn_odr_objc_synthesize_ivar_inconsistent)
6073 diag::note_odr_objc_synthesize_ivar_here)
6080 Importer.MapImported(D, ToImpl);
6088 Error Err = Error::success();
6092 return std::move(Err);
6096 return Importer.ToContext.getTemplateParamObjectDecl(
T,
V);
6098 (void)GetImportedOrCreateSpecialDecl(ToD,
Create, D, ToType, ToValue);
6110 return BeginLocOrErr.takeError();
6114 return LocationOrErr.takeError();
6117 if (GetImportedOrCreateDecl(
6118 ToD, D, Importer.getToContext(),
6120 *BeginLocOrErr, *LocationOrErr,
6129 Error Err = Error::success();
6130 auto ToConceptRef =
importChecked(Err, TC->getConceptReference());
6131 auto ToIDC =
importChecked(Err, TC->getImmediatelyDeclaredConstraint());
6133 return std::move(Err);
6138 if (
Error Err = importTemplateParameterDefaultArgument(D, ToD))
6147 Error Err = Error::success();
6154 return std::move(Err);
6157 if (GetImportedOrCreateDecl(ToD, D, Importer.getToContext(),
6159 ToInnerLocStart, ToLocation, D->
getDepth(),
6161 ToDeclName.getAsIdentifierInfo(), ToType,
6165 Err = importTemplateParameterDefaultArgument(D, ToD);
6174 bool IsCanonical =
false;
6175 if (
auto *CanonD = Importer.getFromContext()
6176 .findCanonicalTemplateTemplateParmDeclInternal(D);
6183 return NameOrErr.takeError();
6188 return LocationOrErr.takeError();
6192 if (!TemplateParamsOrErr)
6193 return TemplateParamsOrErr.takeError();
6196 if (GetImportedOrCreateDecl(
6197 ToD, D, Importer.getToContext(),
6204 if (
Error Err = importTemplateParameterDefaultArgument(D, ToD))
6208 return Importer.getToContext()
6209 .insertCanonicalTemplateTemplateParmDeclInternal(ToD);
6217 assert(D->getTemplatedDecl() &&
"Should be called on templates only");
6218 auto *ToTemplatedDef = D->getTemplatedDecl()->getDefinition();
6219 if (!ToTemplatedDef)
6222 return cast_or_null<T>(TemplateWithDef);
6233 return std::move(Err);
6245 TD->getLexicalDeclContext()->isDependentContext();
6247 bool DependentFriend = IsDependentFriend(D);
6254 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
6255 for (
auto *FoundDecl : FoundDecls) {
6260 auto *FoundTemplate = dyn_cast<ClassTemplateDecl>(FoundDecl);
6261 if (FoundTemplate) {
6266 bool IgnoreTemplateParmDepth =
6270 IgnoreTemplateParmDepth)) {
6271 if (DependentFriend || IsDependentFriend(FoundTemplate))
6277 return Importer.MapImported(D, TemplateWithDef);
6279 FoundByLookup = FoundTemplate;
6297 ConflictingDecls.push_back(FoundDecl);
6301 if (!ConflictingDecls.empty()) {
6304 ConflictingDecls.size());
6306 Name = NameOrErr.get();
6308 return NameOrErr.takeError();
6315 if (!TemplateParamsOrErr)
6316 return TemplateParamsOrErr.takeError();
6321 return std::move(Err);
6325 if (GetImportedOrCreateDecl(D2, D, Importer.getToContext(), DC, Loc, Name,
6326 *TemplateParamsOrErr, ToTemplated))
6334 addDeclToContexts(D, D2);
6335 updateLookupTableForTemplateParameters(**TemplateParamsOrErr);
6337 if (FoundByLookup) {
6351 "Found decl must have its templated decl set");
6354 if (ToTemplated != PrevTemplated)
6368 return std::move(Err);
6373 return std::move(Err);
6379 return std::move(Err);
6382 llvm::FoldingSetInsertToken InsertToken;
6385 dyn_cast<ClassTemplatePartialSpecializationDecl>(D);
6393 return ToTPListOrErr.takeError();
6394 ToTPList = *ToTPListOrErr;
6396 TemplateArgs, *ToTPListOrErr, InsertToken);
6404 Importer.MapImported(D, PrevDefinition);
6407 for (
auto *FromField : D->
fields()) {
6408 auto ToOrErr =
import(FromField);
6410 return ToOrErr.takeError();
6416 auto ToOrErr =
import(FromM);
6418 return ToOrErr.takeError();
6426 return PrevDefinition;
6437 return BeginLocOrErr.takeError();
6440 return IdLocOrErr.takeError();
6446 return std::move(Err);
6452 if (GetImportedOrCreateDecl<ClassTemplatePartialSpecializationDecl>(
6453 D2, D, Importer.getToContext(), D->
getTagKind(), DC, *BeginLocOrErr,
6454 *IdLocOrErr, ToTPList, ClassTemplate,
ArrayRef(TemplateArgs),
6456 cast_or_null<ClassTemplatePartialSpecializationDecl>(PrevDecl)))
6468 PartSpec2->setInstantiatedFromMember(*ToInstOrErr);
6470 return ToInstOrErr.takeError();
6472 updateLookupTableForTemplateParameters(*ToTPList);
6474 if (GetImportedOrCreateDecl(D2, D, Importer.getToContext(), D->
getTagKind(),
6475 DC, *BeginLocOrErr, *IdLocOrErr, ClassTemplate,
6500 return BraceRangeOrErr.takeError();
6503 return std::move(Err);
6509 return LocOrErr.takeError();
6517 return LocOrErr.takeError();
6522 return LocOrErr.takeError();
6528 return POIOrErr.takeError();
6534 if (
auto *CTD = dyn_cast<ClassTemplateDecl *>(
P)) {
6535 if (
auto CTDorErr =
import(CTD))
6539 auto CTPSDOrErr =
import(CTPSD);
6541 return CTPSDOrErr.takeError();
6544 for (
unsigned I = 0; I < DArgs.
size(); ++I) {
6546 if (
auto ArgOrErr =
import(DArg))
6547 D2ArgsVec[I] = *ArgOrErr;
6549 return ArgOrErr.takeError();
6559 return std::move(Err);
6571 return std::move(Err);
6577 "Variable templates cannot be declared at function scope");
6580 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
6582 for (
auto *FoundDecl : FoundDecls) {
6586 if (
VarTemplateDecl *FoundTemplate = dyn_cast<VarTemplateDecl>(FoundDecl)) {
6596 assert(FoundTemplate->getDeclContext()->isRecord() &&
6597 "Member variable template imported as non-member, "
6598 "inconsistent imported AST?");
6600 return Importer.MapImported(D, FoundDef);
6602 return Importer.MapImported(D, FoundTemplate);
6605 return Importer.MapImported(D, FoundDef);
6607 FoundByLookup = FoundTemplate;
6610 ConflictingDecls.push_back(FoundDecl);
6614 if (!ConflictingDecls.empty()) {
6617 ConflictingDecls.size());
6619 Name = NameOrErr.get();
6621 return NameOrErr.takeError();
6630 return TypeOrErr.takeError();
6635 return std::move(Err);
6639 if (!TemplateParamsOrErr)
6640 return TemplateParamsOrErr.takeError();
6643 if (GetImportedOrCreateDecl(ToVarTD, D, Importer.getToContext(), DC, Loc,
6644 Name, *TemplateParamsOrErr, ToTemplated))
6652 if (DC != Importer.getToContext().getTranslationUnitDecl())
6653 updateLookupTableForTemplateParameters(**TemplateParamsOrErr);
6655 if (FoundByLookup) {
6659 auto *PrevTemplated =
6661 if (ToTemplated != PrevTemplated)
6676 auto RedeclIt = Redecls.begin();
6679 for (; RedeclIt != Redecls.end() && *RedeclIt != D; ++RedeclIt) {
6682 return RedeclOrErr.takeError();
6684 assert(*RedeclIt == D);
6688 return std::move(Err);
6693 return std::move(Err);
6698 return BeginLocOrErr.takeError();
6702 return IdLocOrErr.takeError();
6708 return std::move(Err);
6711 llvm::FoldingSetInsertToken InsertToken;
6713 VarTemplate->findSpecialization(TemplateArgs, InsertToken);
6714 if (FoundSpecialization) {
6722 "Member variable template specialization imported as non-member, "
6723 "inconsistent imported AST?");
6725 return Importer.MapImported(D, FoundDef);
6727 return Importer.MapImported(D, FoundSpecialization);
6732 return Importer.MapImported(D, FoundDef);
6744 return std::move(Err);
6749 if (
auto *FromPartial = dyn_cast<PartVarSpecDecl>(D)) {
6750 auto ToTPListOrErr =
import(FromPartial->getTemplateParameters());
6752 return ToTPListOrErr.takeError();
6754 PartVarSpecDecl *ToPartial;
6755 if (GetImportedOrCreateDecl(ToPartial, D, Importer.getToContext(), DC,
6756 *BeginLocOrErr, *IdLocOrErr, *ToTPListOrErr,
6762 import(FromPartial->getInstantiatedFromMember()))
6763 ToPartial->setInstantiatedFromMember(*ToInstOrErr);
6765 return ToInstOrErr.takeError();
6767 if (FromPartial->isMemberSpecialization())
6768 ToPartial->setMemberSpecialization();
6776 if (GetImportedOrCreateDecl(D2, D, Importer.getToContext(), DC,
6785 if (!
VarTemplate->findSpecialization(TemplateArgs, InsertToken))
6790 return std::move(Err);
6795 return TInfoOrErr.takeError();
6802 return POIOrErr.takeError();
6813 return LocOrErr.takeError();
6821 return std::move(Err);
6823 if (FoundSpecialization)
6826 addDeclToContexts(D, D2);
6829 for (++RedeclIt; RedeclIt != Redecls.end(); ++RedeclIt) {
6832 return RedeclOrErr.takeError();
6846 return std::move(Err);
6858 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
6859 for (
auto *FoundDecl : FoundDecls) {
6860 if (!FoundDecl->isInIdentifierNamespace(IDNS))
6863 if (
auto *FoundTemplate = dyn_cast<FunctionTemplateDecl>(FoundDecl)) {
6870 return Importer.MapImported(D, TemplateWithDef);
6872 FoundByLookup = FoundTemplate;
6882 return ParamsOrErr.takeError();
6887 return std::move(Err);
6904 OldParamDC.reserve(Params->
size());
6905 llvm::transform(*Params, std::back_inserter(OldParamDC),
6909 if (GetImportedOrCreateDecl(ToFunc, D, Importer.getToContext(), DC, Loc, Name,
6910 Params, TemplatedFD))
6924 ToFunc->setLexicalDeclContext(LexicalDC);
6925 addDeclToContexts(D, ToFunc);
6928 if (LT && !OldParamDC.empty()) {
6929 for (
unsigned int I = 0; I < OldParamDC.size(); ++I)
6930 LT->updateForced(Params->
getParam(I), OldParamDC[I]);
6933 if (FoundByLookup) {
6938 "Found decl must have its templated decl set");
6939 auto *PrevTemplated =
6941 if (TemplatedFD != PrevTemplated)
6958 return std::move(Err);
6961 if (GetImportedOrCreateDecl(To, D, Importer.getToContext(), DC, LocationOrErr,
6962 NameDeclOrErr, ToTemplateParameters,
6976 return std::move(Err);
6979 if (GetImportedOrCreateDecl(To, D, Importer.getToContext(), DC, RequiresLoc))
6992 return std::move(Err);
6996 return std::move(Err);
6999 if (GetImportedOrCreateDecl(To, D, Importer.getToContext(), DC, ToSL, ToArgs))
7017 return std::move(Err);
7021 auto ToTemplateArgsLAngleLoc =
7023 auto ToTemplateArgsRAngleLoc =
7026 return std::move(Err);
7029 ToTemplateArgsRAngleLoc);
7030 for (
unsigned I = 0; I < *NumArgs; ++I) {
7034 return ToArgLocOrErr.takeError();
7042 if (GetImportedOrCreateDecl(
7043 To, D, Importer.getToContext(), DC, ToSpecialization, ToExternLoc,
7044 ToTemplateLoc, ToQualifierLoc, ToArgsAsWritten, ToNameLoc,
7058 Importer.FromDiag(S->
getBeginLoc(), diag::err_unsupported_ast_node)
7065 if (Importer.returnWithErrorInTest())
7072 Names.push_back(ToII);
7075 for (
unsigned I = 0, E = S->
getNumInputs(); I != E; I++) {
7079 Names.push_back(ToII);
7085 Clobbers.push_back(*ClobberOrErr);
7087 return ClobberOrErr.takeError();
7094 Constraints.push_back(*OutputOrErr);
7096 return OutputOrErr.takeError();
7099 for (
unsigned I = 0, E = S->
getNumInputs(); I != E; I++) {
7101 Constraints.push_back(*InputOrErr);
7103 return InputOrErr.takeError();
7109 return std::move(Err);
7113 return std::move(Err);
7117 return std::move(Err);
7121 return AsmLocOrErr.takeError();
7124 return AsmStrOrErr.takeError();
7126 if (!RParenLocOrErr)
7127 return RParenLocOrErr.takeError();
7129 return new (Importer.getToContext())
GCCAsmStmt(
7130 Importer.getToContext(),
7148 Error Err = Error::success();
7153 return std::move(Err);
7154 return new (Importer.getToContext())
DeclStmt(ToDG, ToBeginLoc, ToEndLoc);
7159 if (!ToSemiLocOrErr)
7160 return ToSemiLocOrErr.takeError();
7161 return new (Importer.getToContext())
NullStmt(
7169 return std::move(Err);
7172 if (!ToLBracLocOrErr)
7173 return ToLBracLocOrErr.takeError();
7176 if (!ToRBracLocOrErr)
7177 return ToRBracLocOrErr.takeError();
7182 *ToLBracLocOrErr, *ToRBracLocOrErr);
7187 Error Err = Error::success();
7195 return std::move(Err);
7198 ToCaseLoc, ToEllipsisLoc, ToColonLoc);
7199 ToStmt->setSubStmt(ToSubStmt);
7206 Error Err = Error::success();
7211 return std::move(Err);
7214 ToDefaultLoc, ToColonLoc, ToSubStmt);
7219 Error Err = Error::success();
7224 return std::move(Err);
7226 return new (Importer.getToContext())
LabelStmt(
7227 ToIdentLoc, ToLabelDecl, ToSubStmt);
7232 if (!ToAttrLocOrErr)
7233 return ToAttrLocOrErr.takeError();
7237 return std::move(Err);
7239 if (!ToSubStmtOrErr)
7240 return ToSubStmtOrErr.takeError();
7243 Importer.getToContext(), *ToAttrLocOrErr, ToAttrs, *ToSubStmtOrErr);
7248 Error Err = Error::success();
7259 return std::move(Err);
7262 ToInit, ToConditionVariable, ToCond, ToLParenLoc,
7263 ToRParenLoc, ToThen, ToElseLoc, ToElse);
7268 Error Err = Error::success();
7277 return std::move(Err);
7281 ToCond, ToLParenLoc, ToRParenLoc);
7282 ToStmt->setBody(ToBody);
7283 ToStmt->setSwitchLoc(ToSwitchLoc);
7291 return ToSCOrErr.takeError();
7292 if (LastChainedSwitchCase)
7295 ToStmt->setSwitchCaseList(*ToSCOrErr);
7296 LastChainedSwitchCase = *ToSCOrErr;
7304 Error Err = Error::success();
7312 return std::move(Err);
7315 ToBody, ToWhileLoc, ToLParenLoc, ToRParenLoc);
7320 Error Err = Error::success();
7327 return std::move(Err);
7329 return new (Importer.getToContext())
DoStmt(
7330 ToBody, ToCond, ToDoLoc, ToWhileLoc, ToRParenLoc);
7335 Error Err = Error::success();
7345 return std::move(Err);
7347 return new (Importer.getToContext())
ForStmt(
7348 Importer.getToContext(),
7349 ToInit, ToCond, ToConditionVariable, ToInc, ToBody, ToForLoc, ToLParenLoc,
7355 Error Err = Error::success();
7360 return std::move(Err);
7362 return new (Importer.getToContext())
GotoStmt(
7363 ToLabel, ToGotoLoc, ToLabelLoc);
7368 Error Err = Error::success();
7373 return std::move(Err);
7376 ToGotoLoc, ToStarLoc, ToTarget);
7379template <
typename StmtClass>
7382 Error Err = Error::success();
7383 auto ToLoc = NodeImporter.
importChecked(Err, S->getKwLoc());
7384 auto ToLabelLoc = S->hasLabelTarget()
7387 auto ToDecl = S->hasLabelTarget()
7391 return std::move(Err);
7392 return new (Importer.
getToContext()) StmtClass(ToLoc, ToLabelLoc, ToDecl);
7405 Error Err = Error::success();
7410 return std::move(Err);
7418 Error Err = Error::success();
7423 return std::move(Err);
7426 ToCatchLoc, ToExceptionDecl, ToHandlerBlock);
7432 return ToTryLocOrErr.takeError();
7435 if (!ToTryBlockOrErr)
7436 return ToTryBlockOrErr.takeError();
7439 for (
unsigned HI = 0, HE = S->
getNumHandlers(); HI != HE; ++HI) {
7441 if (
auto ToHandlerOrErr =
import(FromHandler))
7442 ToHandlers[HI] = *ToHandlerOrErr;
7444 return ToHandlerOrErr.takeError();
7453 Error Err = Error::success();
7467 return std::move(Err);
7470 ToInit, ToRangeStmt, ToBeginStmt, ToEndStmt, ToCond, ToInc, ToLoopVarStmt,
7471 ToBody, ToForLoc, ToCoawaitLoc, ToColonLoc, ToRParenLoc);
7476 Error Err = Error::success();
7484 return std::move(Err);
7489 Importer.getToContext(), ToESD, ToInit, ToExpansionVar, ToLParenLoc,
7490 ToColonLoc, ToRParenLoc);
7497 return std::move(Err);
7500 Importer.getToContext(), ToESD, ToInit, ToExpansionVar, ToRange,
7501 ToBegin, ToIter, ToLParenLoc, ToColonLoc, ToRParenLoc);
7505 auto ToDecompositionDeclStmt =
7508 return std::move(Err);
7511 Importer.getToContext(), ToESD, ToInit, ToExpansionVar,
7512 ToDecompositionDeclStmt, ToLParenLoc, ToColonLoc, ToRParenLoc);
7516 auto ToExpansionInitializer =
7519 return std::move(Err);
7521 Importer.getToContext(), ToESD, ToInit, ToExpansionVar,
7522 ToExpansionInitializer, ToLParenLoc, ToColonLoc, ToRParenLoc);
7526 llvm_unreachable(
"invalid pattern kind");
7531 Error Err = Error::success();
7541 return std::move(Err);
7544 Importer.getToContext(), ToParent, ToInstantiations, ToSharedStmts,
7550 Error Err = Error::success();
7557 return std::move(Err);
7568 Error Err = Error::success();
7574 return std::move(Err);
7577 ToAtCatchLoc, ToRParenLoc, ToCatchParamDecl, ToCatchBody);
7582 if (!ToAtFinallyLocOrErr)
7583 return ToAtFinallyLocOrErr.takeError();
7585 if (!ToAtFinallyStmtOrErr)
7586 return ToAtFinallyStmtOrErr.takeError();
7588 *ToAtFinallyStmtOrErr);
7593 Error Err = Error::success();
7598 return std::move(Err);
7603 if (
ExpectedStmt ToCatchStmtOrErr =
import(FromCatchStmt))
7604 ToCatchStmts[CI] = *ToCatchStmtOrErr;
7606 return ToCatchStmtOrErr.takeError();
7610 ToAtTryLoc, ToTryBody,
7611 ToCatchStmts.begin(), ToCatchStmts.size(),
7618 Error Err = Error::success();
7623 return std::move(Err);
7626 ToAtSynchronizedLoc, ToSynchExpr, ToSynchBody);
7631 if (!ToThrowLocOrErr)
7632 return ToThrowLocOrErr.takeError();
7634 if (!ToThrowExprOrErr)
7635 return ToThrowExprOrErr.takeError();
7637 *ToThrowLocOrErr, *ToThrowExprOrErr);
7644 return ToAtLocOrErr.takeError();
7646 if (!ToSubStmtOrErr)
7647 return ToSubStmtOrErr.takeError();
7656 Importer.FromDiag(E->
getBeginLoc(), diag::err_unsupported_ast_node)
7662 Error Err = Error::success();
7667 return std::move(Err);
7669 if (!ParentContextOrErr)
7670 return ParentContextOrErr.takeError();
7672 return new (Importer.getToContext())
7674 RParenLoc, *ParentContextOrErr);
7679 Error Err = Error::success();
7686 return std::move(Err);
7688 return new (Importer.getToContext())
7689 VAArgExpr(ToBuiltinLoc, ToSubExpr, ToWrittenTypeInfo, ToRParenLoc, ToType,
7695 Error Err = Error::success();
7703 return std::move(Err);
7712 return new (Importer.getToContext())
7713 ChooseExpr(ToBuiltinLoc, ToCond, ToLHS, ToRHS, ToType,
VK, OK,
7714 ToRParenLoc, CondIsTrue);
7718 Error Err = Error::success();
7725 return std::move(Err);
7728 Importer.getToContext(), ToSrcExpr, ToTSI, ToType, E->
getValueKind(),
7734 Error Err = Error::success();
7742 ToSubExprs.resize(NumSubExprs);
7745 return std::move(Err);
7748 Importer.getToContext(), ToSubExprs, ToType, ToBeginLoc, ToRParenLoc);
7754 return TypeOrErr.takeError();
7758 return BeginLocOrErr.takeError();
7760 return new (Importer.getToContext())
GNUNullExpr(*TypeOrErr, *BeginLocOrErr);
7765 Error Err = Error::success();
7767 Expr *ToControllingExpr =
nullptr;
7773 assert((ToControllingExpr || ToControllingType) &&
7774 "Either the controlling expr or type must be nonnull");
7778 return std::move(Err);
7783 return std::move(Err);
7788 return std::move(Err);
7790 const ASTContext &ToCtx = Importer.getToContext();
7792 if (ToControllingExpr) {
7794 ToCtx, ToGenericLoc, ToControllingExpr,
ArrayRef(ToAssocTypes),
7795 ArrayRef(ToAssocExprs), ToDefaultLoc, ToRParenLoc,
7799 ToCtx, ToGenericLoc, ToControllingType,
ArrayRef(ToAssocTypes),
7800 ArrayRef(ToAssocExprs), ToDefaultLoc, ToRParenLoc,
7804 if (ToControllingExpr) {
7806 ToCtx, ToGenericLoc, ToControllingExpr,
ArrayRef(ToAssocTypes),
7807 ArrayRef(ToAssocExprs), ToDefaultLoc, ToRParenLoc,
7811 ToCtx, ToGenericLoc, ToControllingType,
ArrayRef(ToAssocTypes),
7812 ArrayRef(ToAssocExprs), ToDefaultLoc, ToRParenLoc,
7818 Error Err = Error::success();
7823 return std::move(Err);
7832 Error Err = Error::success();
7839 return std::move(Err);
7845 return FoundDOrErr.takeError();
7846 ToFoundD = *FoundDOrErr;
7855 return std::move(Err);
7856 ToResInfo = &ToTAInfo;
7860 Importer.getToContext(), ToQualifierLoc, ToTemplateKeywordLoc, ToDecl,
7864 ToE->setHadMultipleCandidates(
true);
7872 return TypeOrErr.takeError();
7880 return ToInitOrErr.takeError();
7883 if (!ToEqualOrColonLocOrErr)
7884 return ToEqualOrColonLocOrErr.takeError();
7890 ToIndexExprs[I - 1] = *ToArgOrErr;
7892 return ToArgOrErr.takeError();
7897 return std::move(Err);
7900 Importer.getToContext(), ToDesignators,
7901 ToIndexExprs, *ToEqualOrColonLocOrErr,
7909 return ToTypeOrErr.takeError();
7912 if (!ToLocationOrErr)
7913 return ToLocationOrErr.takeError();
7916 *ToTypeOrErr, *ToLocationOrErr);
7922 return ToTypeOrErr.takeError();
7925 if (!ToLocationOrErr)
7926 return ToLocationOrErr.takeError();
7929 Importer.getToContext(), E->
getValue(), *ToTypeOrErr, *ToLocationOrErr);
7936 return ToTypeOrErr.takeError();
7939 if (!ToLocationOrErr)
7940 return ToLocationOrErr.takeError();
7944 *ToTypeOrErr, *ToLocationOrErr);
7948 auto ToTypeOrErr =
import(E->
getType());
7950 return ToTypeOrErr.takeError();
7953 if (!ToSubExprOrErr)
7954 return ToSubExprOrErr.takeError();
7957 *ToSubExprOrErr, *ToTypeOrErr);
7961 auto ToTypeOrErr =
import(E->
getType());
7963 return ToTypeOrErr.takeError();
7966 if (!ToLocationOrErr)
7967 return ToLocationOrErr.takeError();
7970 Importer.getToContext(), E->
getValue(), *ToTypeOrErr, *ToLocationOrErr,
7971 Importer.getToContext().getFixedPointScale(*ToTypeOrErr));
7977 return ToTypeOrErr.takeError();
7980 if (!ToLocationOrErr)
7981 return ToLocationOrErr.takeError();
7990 return ToTypeOrErr.takeError();
7995 return std::move(Err);
8004 Error Err = Error::success();
8010 return std::move(Err);
8013 ToLParenLoc, ToTypeSourceInfo, ToType, E->
getValueKind(),
8019 Error Err = Error::success();
8024 return std::move(Err);
8030 return std::move(Err);
8032 return new (Importer.getToContext())
AtomicExpr(
8034 ToBuiltinLoc, ToExprs, ToType, E->
getOp(), ToRParenLoc);
8038 Error Err = Error::success();
8044 return std::move(Err);
8047 ToAmpAmpLoc, ToLabelLoc, ToLabel, ToType);
8050 Error Err = Error::success();
8054 return std::move(Err);
8059 Error Err = Error::success();
8064 return std::move(Err);
8066 return new (Importer.getToContext())
8067 ParenExpr(ToLParen, ToRParen, ToSubExpr);
8073 return std::move(Err);
8076 if (!ToLParenLocOrErr)
8077 return ToLParenLocOrErr.takeError();
8080 if (!ToRParenLocOrErr)
8081 return ToRParenLocOrErr.takeError();
8084 ToExprs, *ToRParenLocOrErr);
8088 Error Err = Error::success();
8094 return std::move(Err);
8096 return new (Importer.getToContext())
8097 StmtExpr(ToSubStmt, ToType, ToLParenLoc, ToRParenLoc,
8102 Error Err = Error::success();
8107 return std::move(Err);
8111 UO->setType(ToType);
8112 UO->setSubExpr(ToSubExpr);
8114 UO->setOperatorLoc(ToOperatorLoc);
8125 Error Err = Error::success();
8130 return std::move(Err);
8135 if (!ToArgumentTypeInfoOrErr)
8136 return ToArgumentTypeInfoOrErr.takeError();
8139 E->
getKind(), *ToArgumentTypeInfoOrErr, ToType, ToOperatorLoc,
8144 if (!ToArgumentExprOrErr)
8145 return ToArgumentExprOrErr.takeError();
8148 E->
getKind(), *ToArgumentExprOrErr, ToType, ToOperatorLoc, ToRParenLoc);
8152 Error Err = Error::success();
8158 return std::move(Err);
8161 Importer.getToContext(), ToLHS, ToRHS, E->
getOpcode(), ToType,
8167 Error Err = Error::success();
8175 return std::move(Err);
8178 ToCond, ToQuestionLoc, ToLHS, ToColonLoc, ToRHS, ToType,
8184 Error Err = Error::success();
8194 return std::move(Err);
8197 ToCommon, ToOpaqueValue, ToCond, ToTrueExpr, ToFalseExpr,
8204 Error Err = Error::success();
8207 return std::move(Err);
8209 return new (Importer.getToContext())
8214 Error Err = Error::success();
8216 auto ToQueriedTypeSourceInfo =
8222 return std::move(Err);
8226 ToDimensionExpression, ToEndLoc, ToType);
8230 Error Err = Error::success();
8236 return std::move(Err);
8244 Error Err = Error::success();
8249 return std::move(Err);
8256 Error Err = Error::success();
8262 return std::move(Err);
8271 Error Err = Error::success();
8276 auto ToComputationResultType =
8280 return std::move(Err);
8283 Importer.getToContext(), ToLHS, ToRHS, E->
getOpcode(), ToType,
8286 ToComputationLHSType, ToComputationResultType);
8293 if (
auto SpecOrErr =
import(*I))
8294 Path.push_back(*SpecOrErr);
8296 return SpecOrErr.takeError();
8304 return ToTypeOrErr.takeError();
8307 if (!ToSubExprOrErr)
8308 return ToSubExprOrErr.takeError();
8311 if (!ToBasePathOrErr)
8312 return ToBasePathOrErr.takeError();
8315 Importer.getToContext(), *ToTypeOrErr, E->
getCastKind(), *ToSubExprOrErr,
8320 Error Err = Error::success();
8325 return std::move(Err);
8328 if (!ToBasePathOrErr)
8329 return ToBasePathOrErr.takeError();
8333 case Stmt::CStyleCastExprClass: {
8335 ExpectedSLoc ToLParenLocOrErr =
import(CCE->getLParenLoc());
8336 if (!ToLParenLocOrErr)
8337 return ToLParenLocOrErr.takeError();
8338 ExpectedSLoc ToRParenLocOrErr =
import(CCE->getRParenLoc());
8339 if (!ToRParenLocOrErr)
8340 return ToRParenLocOrErr.takeError();
8343 ToSubExpr, ToBasePath, CCE->getFPFeatures(), ToTypeInfoAsWritten,
8344 *ToLParenLocOrErr, *ToRParenLocOrErr);
8347 case Stmt::CXXFunctionalCastExprClass: {
8349 ExpectedSLoc ToLParenLocOrErr =
import(FCE->getLParenLoc());
8350 if (!ToLParenLocOrErr)
8351 return ToLParenLocOrErr.takeError();
8352 ExpectedSLoc ToRParenLocOrErr =
import(FCE->getRParenLoc());
8353 if (!ToRParenLocOrErr)
8354 return ToRParenLocOrErr.takeError();
8356 Importer.getToContext(), ToType, E->
getValueKind(), ToTypeInfoAsWritten,
8357 E->
getCastKind(), ToSubExpr, ToBasePath, FCE->getFPFeatures(),
8358 *ToLParenLocOrErr, *ToRParenLocOrErr);
8361 case Stmt::ObjCBridgedCastExprClass: {
8363 ExpectedSLoc ToLParenLocOrErr =
import(OCE->getLParenLoc());
8364 if (!ToLParenLocOrErr)
8365 return ToLParenLocOrErr.takeError();
8366 ExpectedSLoc ToBridgeKeywordLocOrErr =
import(OCE->getBridgeKeywordLoc());
8367 if (!ToBridgeKeywordLocOrErr)
8368 return ToBridgeKeywordLocOrErr.takeError();
8370 *ToLParenLocOrErr, OCE->getBridgeKind(), E->
getCastKind(),
8371 *ToBridgeKeywordLocOrErr, ToTypeInfoAsWritten, ToSubExpr);
8373 case Stmt::BuiltinBitCastExprClass: {
8375 ExpectedSLoc ToKWLocOrErr =
import(BBC->getBeginLoc());
8377 return ToKWLocOrErr.takeError();
8378 ExpectedSLoc ToRParenLocOrErr =
import(BBC->getEndLoc());
8379 if (!ToRParenLocOrErr)
8380 return ToRParenLocOrErr.takeError();
8383 ToTypeInfoAsWritten, *ToKWLocOrErr, *ToRParenLocOrErr);
8386 llvm_unreachable(
"Cast expression of unsupported type!");
8399 Error Err = Error::success();
8403 return std::move(Err);
8412 auto ToBSOrErr =
import(FromNode.
getBase());
8414 return ToBSOrErr.takeError();
8419 auto ToFieldOrErr =
import(FromNode.
getField());
8421 return ToFieldOrErr.takeError();
8422 ToNodes.push_back(
OffsetOfNode(ToBeginLoc, *ToFieldOrErr, ToEndLoc));
8427 ToNodes.push_back(
OffsetOfNode(ToBeginLoc, ToII, ToEndLoc));
8436 if (!ToIndexExprOrErr)
8437 return ToIndexExprOrErr.takeError();
8438 ToExprs[I] = *ToIndexExprOrErr;
8441 Error Err = Error::success();
8447 return std::move(Err);
8450 Importer.getToContext(), ToType, ToOperatorLoc, ToTypeSourceInfo, ToNodes,
8451 ToExprs, ToRParenLoc);
8455 Error Err = Error::success();
8461 return std::move(Err);
8470 ToType, ToOperand, ToCanThrow, ToBeginLoc, ToEndLoc);
8474 Error Err = Error::success();
8479 return std::move(Err);
8487 if (!ToUsedLocOrErr)
8488 return ToUsedLocOrErr.takeError();
8490 auto ToParamOrErr =
import(E->
getParam());
8492 return ToParamOrErr.takeError();
8494 auto UsedContextOrErr = Importer.ImportContext(E->
getUsedContext());
8495 if (!UsedContextOrErr)
8496 return UsedContextOrErr.takeError();
8506 std::optional<ParmVarDecl *> FromParam =
8507 Importer.getImportedFromDecl(ToParam);
8508 assert(FromParam &&
"ParmVarDecl was not imported?");
8511 return std::move(Err);
8513 Expr *RewrittenInit =
nullptr;
8517 return ExprOrErr.takeError();
8518 RewrittenInit = ExprOrErr.get();
8521 *ToParamOrErr, RewrittenInit,
8527 Error Err = Error::success();
8532 return std::move(Err);
8535 ToType, ToTypeSourceInfo, ToRParenLoc);
8541 if (!ToSubExprOrErr)
8542 return ToSubExprOrErr.takeError();
8544 auto ToDtorOrErr =
import(E->
getTemporary()->getDestructor());
8546 return ToDtorOrErr.takeError();
8556 Error Err = Error::success();
8562 return std::move(Err);
8566 return std::move(Err);
8569 Importer.getToContext(), ToConstructor, ToType, ToTypeSourceInfo, ToArgs,
8579 return std::move(Err);
8581 Error Err = Error::success();
8585 return std::move(Err);
8589 if (GetImportedOrCreateDecl(To, D, Temporary, ExtendingDecl,
8600 Error Err = Error::success();
8604 auto ToMaterializedDecl =
8607 return std::move(Err);
8609 if (!ToTemporaryExpr)
8610 ToTemporaryExpr =
cast<Expr>(ToMaterializedDecl->getTemporaryExpr());
8614 ToMaterializedDecl);
8620 Error Err = Error::success();
8624 return std::move(Err);
8626 return new (Importer.getToContext())
8631 Error Err = Error::success();
8637 return std::move(Err);
8646 ToPartialArguments))
8647 return std::move(Err);
8651 Importer.getToContext(), ToOperatorLoc, ToPack, ToPackLoc, ToRParenLoc,
8652 Length, ToPartialArguments);
8657 Error Err = Error::success();
8664 auto ToAllocatedTypeSourceInfo =
8669 return std::move(Err);
8674 return std::move(Err);
8677 Importer.getToContext(), E->
isGlobalNew(), ToOperatorNew,
8681 ToAllocatedTypeSourceInfo, ToSourceRange, ToDirectInitRange);
8685 Error Err = Error::success();
8691 return std::move(Err);
8700 Error Err = Error::success();
8706 return std::move(Err);
8710 return std::move(Err);
8713 Importer.getToContext(), ToType, ToLocation, ToConstructor,
8717 ToParenOrBraceRange);
8724 if (!ToSubExprOrErr)
8725 return ToSubExprOrErr.takeError();
8729 return std::move(Err);
8737 Error Err = Error::success();
8742 return std::move(Err);
8746 return std::move(Err);
8756 return ToTypeOrErr.takeError();
8759 if (!ToLocationOrErr)
8760 return ToLocationOrErr.takeError();
8769 return ToTypeOrErr.takeError();
8772 if (!ToLocationOrErr)
8773 return ToLocationOrErr.takeError();
8776 *ToTypeOrErr, *ToLocationOrErr);
8780 Error Err = Error::success();
8784 return std::move(Err);
8790 Error Err = Error::success();
8801 return std::move(Err);
8813 return std::move(Err);
8814 ResInfo = &ToTAInfo;
8818 ToOperatorLoc, ToQualifierLoc, ToTemplateKeywordLoc,
8819 ToMemberDecl, ToFoundDecl, ToMemberNameInfo,
8826 Error Err = Error::success();
8834 return std::move(Err);
8840 if (!ToDestroyedTypeLocOrErr)
8841 return ToDestroyedTypeLocOrErr.takeError();
8847 return ToTIOrErr.takeError();
8851 Importer.getToContext(), ToBase, E->
isArrow(), ToOperatorLoc,
8852 ToQualifierLoc, ToScopeTypeInfo, ToColonColonLoc, ToTildeLoc, Storage);
8857 Error Err = Error::success();
8862 auto ToFirstQualifierFoundInScope =
8865 return std::move(Err);
8867 Expr *ToBase =
nullptr;
8870 ToBase = *ToBaseOrErr;
8872 return ToBaseOrErr.takeError();
8881 return std::move(Err);
8882 ResInfo = &ToTAInfo;
8887 return std::move(Err);
8893 return std::move(Err);
8896 Importer.getToContext(), ToBase, ToType, E->
isArrow(), ToOperatorLoc,
8897 ToQualifierLoc, ToTemplateKeywordLoc, ToFirstQualifierFoundInScope,
8898 ToMemberNameInfo, ResInfo);
8903 Error Err = Error::success();
8908 return std::move(Err);
8912 return std::move(Err);
8918 return std::move(Err);
8926 Error Err = Error::success();
8934 return std::move(Err);
8938 return std::move(Err);
8945 return std::move(Err);
8946 ResInfo = &ToTAInfo;
8950 Importer.getToContext(), ToQualifierLoc, ToTemplateKeywordLoc,
8951 ToNameInfo, ResInfo);
8956 Error Err = Error::success();
8962 return std::move(Err);
8967 return std::move(Err);
8970 Importer.getToContext(), ToType, ToTypeSourceInfo, ToLParenLoc,
8977 if (!ToNamingClassOrErr)
8978 return ToNamingClassOrErr.takeError();
8981 if (!ToQualifierLocOrErr)
8982 return ToQualifierLocOrErr.takeError();
8984 Error Err = Error::success();
8988 return std::move(Err);
8993 return std::move(Err);
8996 for (
auto *D : E->
decls())
8997 if (
auto ToDOrErr =
import(D))
9000 return ToDOrErr.takeError();
9007 return std::move(Err);
9010 if (!ToTemplateKeywordLocOrErr)
9011 return ToTemplateKeywordLocOrErr.takeError();
9013 const bool KnownDependent =
9015 ExprDependence::TypeValue;
9017 Importer.getToContext(), *ToNamingClassOrErr, *ToQualifierLocOrErr,
9018 *ToTemplateKeywordLocOrErr, ToNameInfo, E->
requiresADL(), &ToTAInfo,
9019 ToDecls.
begin(), ToDecls.
end(), KnownDependent,
9024 Importer.getToContext(), *ToNamingClassOrErr, *ToQualifierLocOrErr,
9032 Error Err = Error::success();
9040 return std::move(Err);
9045 return std::move(Err);
9049 if (
auto ToDOrErr =
import(D))
9052 return ToDOrErr.takeError();
9060 return std::move(Err);
9061 ResInfo = &ToTAInfo;
9064 Expr *ToBase =
nullptr;
9067 ToBase = *ToBaseOrErr;
9069 return ToBaseOrErr.takeError();
9074 E->
isArrow(), ToOperatorLoc, ToQualifierLoc, ToTemplateKeywordLoc,
9075 ToNameInfo, ResInfo, ToDecls.
begin(), ToDecls.
end());
9079 Error Err = Error::success();
9084 return std::move(Err);
9089 return std::move(Err);
9091 if (
const auto *OCE = dyn_cast<CXXOperatorCallExpr>(E)) {
9093 Importer.getToContext(), OCE->getOperator(), ToCallee, ToArgs, ToType,
9094 OCE->getValueKind(), ToRParenLoc, OCE->getFPFeatures(),
9095 OCE->getADLCallKind());
9105 auto ToClassOrErr =
import(FromClass);
9107 return ToClassOrErr.takeError();
9112 return ToCallOpOrErr.takeError();
9116 return std::move(Err);
9118 Error Err = Error::success();
9123 return std::move(Err);
9134 Error Err = Error::success();
9139 return std::move(Err);
9143 return std::move(Err);
9154 return ToFillerOrErr.takeError();
9158 if (
auto ToFDOrErr =
import(FromFD))
9161 return ToFDOrErr.takeError();
9165 if (
auto ToSyntFormOrErr =
import(SyntForm))
9168 return ToSyntFormOrErr.takeError();
9182 return ToTypeOrErr.takeError();
9185 if (!ToSubExprOrErr)
9186 return ToSubExprOrErr.takeError();
9189 *ToTypeOrErr, *ToSubExprOrErr);
9194 Error Err = Error::success();
9199 return std::move(Err);
9207 Error Err = Error::success();
9212 return std::move(Err);
9215 ToType, ToCommonExpr, ToSubExpr);
9221 return ToTypeOrErr.takeError();
9227 if (!ToBeginLocOrErr)
9228 return ToBeginLocOrErr.takeError();
9230 auto ToFieldOrErr =
import(E->
getField());
9232 return ToFieldOrErr.takeError();
9234 auto UsedContextOrErr = Importer.ImportContext(E->
getUsedContext());
9235 if (!UsedContextOrErr)
9236 return UsedContextOrErr.takeError();
9240 "Field should have in-class initializer if there is a default init "
9241 "expression that uses it.");
9246 auto ToInClassInitializerOrErr =
9247 import(E->
getField()->getInClassInitializer());
9248 if (!ToInClassInitializerOrErr)
9249 return ToInClassInitializerOrErr.takeError();
9253 Expr *RewrittenInit =
nullptr;
9257 return ExprOrErr.takeError();
9258 RewrittenInit = ExprOrErr.get();
9262 ToField, *UsedContextOrErr, RewrittenInit);
9266 Error Err = Error::success();
9274 return std::move(Err);
9279 if (!ToBasePathOrErr)
9280 return ToBasePathOrErr.takeError();
9282 if (
auto CCE = dyn_cast<CXXStaticCastExpr>(E)) {
9284 Importer.getToContext(), ToType,
VK, CK, ToSubExpr, &(*ToBasePathOrErr),
9285 ToTypeInfoAsWritten, CCE->getFPFeatures(), ToOperatorLoc, ToRParenLoc,
9289 Importer.getToContext(), ToType,
VK, CK, ToSubExpr, &(*ToBasePathOrErr),
9290 ToTypeInfoAsWritten, ToOperatorLoc, ToRParenLoc, ToAngleBrackets);
9293 Importer.getToContext(), ToType,
VK, CK, ToSubExpr, &(*ToBasePathOrErr),
9294 ToTypeInfoAsWritten, ToOperatorLoc, ToRParenLoc, ToAngleBrackets);
9297 Importer.getToContext(), ToType,
VK, ToSubExpr, ToTypeInfoAsWritten,
9298 ToOperatorLoc, ToRParenLoc, ToAngleBrackets);
9300 llvm_unreachable(
"Unknown cast type");
9301 return make_error<ASTImportError>();
9307 Error Err = Error::success();
9314 return std::move(Err);
9317 ToType, E->
getValueKind(), ToNameLoc, ToReplacement, ToAssociatedDecl,
9322 Error Err = Error::success();
9327 return std::move(Err);
9331 return std::move(Err);
9338 E->
getTrait(), ToArgs, ToEndLoc, ToValue);
9348 return ToTypeOrErr.takeError();
9351 if (!ToSourceRangeOrErr)
9352 return ToSourceRangeOrErr.takeError();
9357 *ToTypeOrErr, *ToTSIOrErr, *ToSourceRangeOrErr);
9359 return ToTSIOrErr.takeError();
9363 if (!ToExprOperandOrErr)
9364 return ToExprOperandOrErr.takeError();
9367 *ToTypeOrErr, *ToExprOperandOrErr, *ToSourceRangeOrErr);
9371 Error Err = Error::success();
9382 return std::move(Err);
9384 return new (Importer.getToContext())
9390 Error Err = Error::success();
9398 return std::move(Err);
9402 return std::move(Err);
9407 return std::move(Err);
9409 LParenLoc, LocalParameters, RParenLoc,
9410 Requirements, RBraceLoc);
9415 Error Err = Error::success();
9419 return std::move(Err);
9422 Importer.getToContext(),
CL,
9427 return std::move(Err);
9429 Importer.getToContext(),
CL,
9435 Error Err = Error::success();
9441 return std::move(Err);
9444 ToType, E->
getValueKind(), ToPackLoc, ToArgPack, ToAssociatedDecl,
9451 return std::move(Err);
9454 return ToSyntOrErr.takeError();
9461 Error Err = Error::success();
9467 return std::move(Err);
9471 return std::move(Err);
9474 ToInitLoc, ToBeginLoc, ToEndLoc);
9479 Error Err = Error::success();
9483 return std::move(Err);
9485 return new (Importer.getToContext())
9491 Error ImportErrors = Error::success();
9493 if (
auto ImportedOrErr =
import(FromOverriddenMethod))
9495 (*ImportedOrErr)->getCanonicalDecl()));
9498 joinErrors(std::move(ImportErrors), ImportedOrErr.takeError());
9500 return ImportErrors;
9506 std::shared_ptr<ASTImporterSharedState> SharedState)
9507 : SharedState(SharedState), ToContext(ToContext), FromContext(FromContext),
9508 ToFileManager(ToFileManager), FromFileManager(FromFileManager),
9513 this->SharedState = std::make_shared<ASTImporterSharedState>();
9516 ImportedDecls[FromContext.getTranslationUnitDecl()] =
9517 ToContext.getTranslationUnitDecl();
9524 "Try to get field index for non-field.");
9528 return std::nullopt;
9531 for (
const auto *D : Owner->decls()) {
9539 llvm_unreachable(
"Field was not found in its parent context.");
9541 return std::nullopt;
9544ASTImporter::FoundDeclsTy
9554 if (SharedState->getLookupTable()) {
9562 dyn_cast<NamespaceDecl>(ReDC));
9563 for (
auto *D : NSChain) {
9565 SharedState->getLookupTable()->lookup(dyn_cast<NamespaceDecl>(D),
9572 SharedState->getLookupTable()->lookup(ReDC, Name);
9573 return FoundDeclsTy(LookupResult.begin(), LookupResult.end());
9577 FoundDeclsTy
Result(NoloadLookupResult.
begin(), NoloadLookupResult.
end());
9594void ASTImporter::AddToLookupTable(
Decl *ToD) {
9595 SharedState->addDeclToLookup(ToD);
9601 return Importer.
Visit(FromD);
9610 if (
auto *CLE = dyn_cast<CompoundLiteralExpr *>(From)) {
9625 llvm::DenseMap<const Type *, const Type *>::iterator Pos =
9626 ImportedTypes.find(FromT);
9627 if (Pos != ImportedTypes.end())
9634 return ToTOrErr.takeError();
9637 ImportedTypes[FromT] = ToTOrErr->getTypePtr();
9639 return ToTOrErr->getTypePtr();
9648 return ToTyOrErr.takeError();
9661 return TOrErr.takeError();
9664 return BeginLocOrErr.takeError();
9666 return ToContext.getTrivialTypeSourceInfo(*TOrErr, *BeginLocOrErr);
9673template <
typename T>
struct AttrArgImporter {
9674 AttrArgImporter(
const AttrArgImporter<T> &) =
delete;
9675 AttrArgImporter(AttrArgImporter<T> &&) =
default;
9676 AttrArgImporter<T> &operator=(
const AttrArgImporter<T> &) =
delete;
9677 AttrArgImporter<T> &operator=(AttrArgImporter<T> &&) =
default;
9680 : To(I.importChecked(Err, From)) {}
9682 const T &value() {
return To; }
9693template <
typename T>
struct AttrArgArrayImporter {
9694 AttrArgArrayImporter(
const AttrArgArrayImporter<T> &) =
delete;
9695 AttrArgArrayImporter(AttrArgArrayImporter<T> &&) =
default;
9696 AttrArgArrayImporter<T> &operator=(
const AttrArgArrayImporter<T> &) =
delete;
9697 AttrArgArrayImporter<T> &operator=(AttrArgArrayImporter<T> &&) =
default;
9699 AttrArgArrayImporter(ASTNodeImporter &I,
Error &Err,
9700 const llvm::iterator_range<T *> &From,
9701 unsigned ArraySize) {
9704 To.reserve(ArraySize);
9708 T *value() {
return To.data(); }
9711 llvm::SmallVector<T, 2> To;
9715 Error Err{Error::success()};
9716 Attr *ToAttr =
nullptr;
9717 ASTImporter &Importer;
9718 ASTNodeImporter NImporter;
9721 AttrImporter(ASTImporter &I) : Importer(I), NImporter(I) {}
9726 template <
class T> AttrArgImporter<T> importArg(
const T &From) {
9727 return AttrArgImporter<T>(NImporter, Err, From);
9733 template <
typename T>
9734 AttrArgArrayImporter<T> importArrayArg(
const llvm::iterator_range<T *> &From,
9735 unsigned ArraySize) {
9736 return AttrArgArrayImporter<T>(NImporter, Err, From, ArraySize);
9747 template <
typename T,
typename... Arg>
9748 void importAttr(
const T *FromAttr, Arg &&...ImportedArg) {
9749 static_assert(std::is_base_of<Attr, T>::value,
9750 "T should be subclass of Attr.");
9751 assert(!ToAttr &&
"Use one AttrImporter to import one Attribute object.");
9753 const IdentifierInfo *ToAttrName = Importer.
Import(FromAttr->getAttrName());
9754 const IdentifierInfo *ToScopeName =
9755 Importer.
Import(FromAttr->getScopeName());
9756 SourceRange ToAttrRange =
9758 SourceLocation ToScopeLoc =
9764 AttributeCommonInfo ToI(
9765 ToAttrName, AttributeScopeInfo(ToScopeName, ToScopeLoc), ToAttrRange,
9766 FromAttr->getParsedKind(), FromAttr->getForm());
9770 std::forward<Arg>(ImportedArg)..., ToI);
9774 if (
auto *ToInheritableAttr = dyn_cast<InheritableAttr>(ToAttr))
9775 ToInheritableAttr->setInherited(FromAttr->isInherited());
9781 void cloneAttr(
const Attr *FromAttr) {
9782 assert(!ToAttr &&
"Use one AttrImporter to import one Attribute object.");
9794 llvm::Expected<Attr *> getResult() && {
9796 return std::move(Err);
9797 assert(ToAttr &&
"Attribute should be created.");
9804 AttrImporter AI(*
this);
9807 switch (FromAttr->
getKind()) {
9808 case attr::Aligned: {
9810 if (From->isAlignmentExpr())
9811 AI.importAttr(From,
true, AI.importArg(From->getAlignmentExpr()).value());
9813 AI.importAttr(From,
false,
9814 AI.importArg(From->getAlignmentType()).value());
9818 case attr::AlignValue: {
9820 AI.importAttr(From, AI.importArg(From->getAlignment()).value());
9824 case attr::Format: {
9826 AI.importAttr(From,
Import(From->getType()), From->getFormatIdx(),
9827 From->getFirstArg());
9831 case attr::EnableIf: {
9833 AI.importAttr(From, AI.importArg(From->getCond()).value(),
9834 From->getMessage());
9838 case attr::AssertCapability: {
9841 AI.importArrayArg(From->args(), From->args_size()).value(),
9845 case attr::AcquireCapability: {
9848 AI.importArrayArg(From->args(), From->args_size()).value(),
9852 case attr::TryAcquireCapability: {
9854 AI.importAttr(From, AI.importArg(From->getSuccessValue()).value(),
9855 AI.importArrayArg(From->args(), From->args_size()).value(),
9859 case attr::ReleaseCapability: {
9862 AI.importArrayArg(From->args(), From->args_size()).value(),
9866 case attr::RequiresCapability: {
9869 AI.importArrayArg(From->args(), From->args_size()).value(),
9873 case attr::GuardedBy: {
9876 AI.importArrayArg(From->args(), From->args_size()).value(),
9880 case attr::PtGuardedBy: {
9883 AI.importArrayArg(From->args(), From->args_size()).value(),
9887 case attr::AcquiredAfter: {
9890 AI.importArrayArg(From->args(), From->args_size()).value(),
9894 case attr::AcquiredBefore: {
9897 AI.importArrayArg(From->args(), From->args_size()).value(),
9901 case attr::LockReturned: {
9903 AI.importAttr(From, AI.importArg(From->getArg()).value());
9906 case attr::LocksExcluded: {
9909 AI.importArrayArg(From->args(), From->args_size()).value(),
9917 AI.cloneAttr(FromAttr);
9922 return std::move(AI).getResult();
9926 return ImportedDecls.lookup(FromD);
9930 auto FromDPos = ImportedFromDecls.find(ToD);
9931 if (FromDPos == ImportedFromDecls.end())
9941 ImportPath.push(FromD);
9942 llvm::scope_exit ImportPathBuilder([
this]() { ImportPath.pop(); });
9947 return make_error<ASTImportError>(*
Error);
9953 if (
auto Error = SharedState->getImportDeclErrorIfAny(ToD)) {
9955 return make_error<ASTImportError>(*
Error);
9962 if (ImportPath.hasCycleAtBack())
9963 SavedImportPaths[FromD].push_back(ImportPath.copyCycleAtBack());
9972 auto Pos = ImportedDecls.find(FromD);
9973 bool ToDWasCreated = Pos != ImportedDecls.end();
9977 Decl *CreatedToD = ToDWasCreated ? Pos->second :
nullptr;
9978 if (ToDWasCreated) {
9981 auto *ToD = CreatedToD;
9982 ImportedDecls.erase(Pos);
9987 if (
const auto *FromTD = dyn_cast<TagDecl>(FromD)) {
9988 if (
const Type *FromTy =
9990 ImportedTypes.erase(FromTy);
10004 auto PosF = ImportedFromDecls.find(ToD);
10005 if (PosF != ImportedFromDecls.end()) {
10010 SharedState->removeDeclFromLookup(ToD);
10011 ImportedFromDecls.erase(PosF);
10023 handleAllErrors(ToDOrErr.takeError(),
10028 SharedState->setImportDeclError(CreatedToD, ErrOut);
10032 for (
const auto &Path : SavedImportPaths[FromD]) {
10035 Decl *PrevFromDi = FromD;
10036 for (
Decl *FromDi : Path) {
10038 if (FromDi == FromD)
10045 PrevFromDi = FromDi;
10048 if (
const auto *FromTDi = dyn_cast<TagDecl>(FromDi)) {
10049 if (
const Type *FromTyi =
10051 ImportedTypes.erase(FromTyi);
10057 auto Ii = ImportedDecls.find(FromDi);
10058 if (Ii != ImportedDecls.end())
10059 SharedState->setImportDeclError(Ii->second, ErrOut);
10064 SavedImportPaths.erase(FromD);
10067 return make_error<ASTImportError>(ErrOut);
10079 return make_error<ASTImportError>(*Err);
10085 if (
auto Error = SharedState->getImportDeclErrorIfAny(ToD)) {
10087 return make_error<ASTImportError>(*
Error);
10090 assert(ImportedDecls.count(FromD) != 0 &&
"Missing call to MapImported?");
10094 auto ToAttrOrErr =
Import(FromAttr);
10098 return ToAttrOrErr.takeError();
10105 SavedImportPaths.erase(FromD);
10120 return ToDCOrErr.takeError();
10125 if (
auto *ToRecord = dyn_cast<RecordDecl>(ToDC)) {
10127 if (ToRecord->isCompleteDefinition())
10135 if (FromRecord->getASTContext().getExternalSource() &&
10136 !FromRecord->isCompleteDefinition())
10137 FromRecord->getASTContext().getExternalSource()->CompleteType(FromRecord);
10139 if (FromRecord->isCompleteDefinition())
10142 return std::move(Err);
10143 }
else if (
auto *ToEnum = dyn_cast<EnumDecl>(ToDC)) {
10145 if (ToEnum->isCompleteDefinition()) {
10147 }
else if (FromEnum->isCompleteDefinition()) {
10150 return std::move(Err);
10154 }
else if (
auto *ToClass = dyn_cast<ObjCInterfaceDecl>(ToDC)) {
10156 if (ToClass->getDefinition()) {
10161 return std::move(Err);
10165 }
else if (
auto *ToProto = dyn_cast<ObjCProtocolDecl>(ToDC)) {
10167 if (ToProto->getDefinition()) {
10172 return std::move(Err);
10183 return cast_or_null<Expr>(*ToSOrErr);
10185 return ToSOrErr.takeError();
10193 llvm::DenseMap<Stmt *, Stmt *>::iterator Pos = ImportedStmts.find(FromS);
10194 if (Pos != ImportedStmts.end())
10195 return Pos->second;
10203 if (
auto *ToE = dyn_cast<Expr>(*ToSOrErr)) {
10207 ToE->setValueKind(FromE->getValueKind());
10208 ToE->setObjectKind(FromE->getObjectKind());
10209 ToE->setDependence(FromE->getDependence());
10213 ImportedStmts[FromS] = *ToSOrErr;
10224 auto NSOrErr =
Import(Namespace);
10226 return NSOrErr.takeError();
10227 auto PrefixOrErr =
Import(Prefix);
10229 return PrefixOrErr.takeError();
10237 return RDOrErr.takeError();
10242 return TyOrErr.takeError();
10245 llvm_unreachable(
"Invalid nested name specifier kind");
10257 NestedNames.push_back(NNS);
10263 while (!NestedNames.empty()) {
10264 NNS = NestedNames.pop_back_val();
10267 return std::move(Err);
10274 return std::move(Err);
10278 return std::move(Err);
10284 ToLocalBeginLoc, ToLocalEndLoc);
10290 return std::move(Err);
10303 if (!ToSourceRangeOrErr)
10304 return ToSourceRangeOrErr.takeError();
10307 ToSourceRangeOrErr->getBegin(),
10308 ToSourceRangeOrErr->getEnd());
10312 llvm_unreachable(
"unexpected null nested name specifier");
10325 return ToTemplateOrErr.takeError();
10330 for (
auto *I : *FromStorage) {
10331 if (
auto ToOrErr =
Import(I))
10334 return ToOrErr.takeError();
10336 return ToContext.getOverloadedTemplateName(ToTemplates.
begin(),
10337 ToTemplates.
end());
10343 if (!DeclNameOrErr)
10344 return DeclNameOrErr.takeError();
10345 return ToContext.getAssumedTemplateName(*DeclNameOrErr);
10351 if (!QualifierOrErr)
10352 return QualifierOrErr.takeError();
10355 return TNOrErr.takeError();
10356 return ToContext.getQualifiedTemplateName(
10363 if (!QualifierOrErr)
10364 return QualifierOrErr.takeError();
10365 return ToContext.getDependentTemplateName(
10373 if (!ReplacementOrErr)
10374 return ReplacementOrErr.takeError();
10377 if (!AssociatedDeclOrErr)
10378 return AssociatedDeclOrErr.takeError();
10380 return ToContext.getSubstTemplateTemplateParm(
10381 *ReplacementOrErr, *AssociatedDeclOrErr, Subst->
getIndex(),
10389 auto ArgPackOrErr =
10392 return ArgPackOrErr.takeError();
10395 if (!AssociatedDeclOrErr)
10396 return AssociatedDeclOrErr.takeError();
10398 return ToContext.getSubstTemplateTemplateParmPack(
10399 *ArgPackOrErr, *AssociatedDeclOrErr, SubstPack->
getIndex(),
10406 return PatternOrErr.takeError();
10409 if (!IndexExprOrErr)
10410 return IndexExprOrErr.takeError();
10414 auto ExpansionOrErr =
Import(
T);
10415 if (!ExpansionOrErr)
10416 return ExpansionOrErr.takeError();
10417 Expansions.push_back(*ExpansionOrErr);
10420 return ToContext.getPackIndexingTemplateName(
10426 return UsingOrError.takeError();
10430 llvm_unreachable(
"Unexpected DeducedTemplate");
10433 llvm_unreachable(
"Invalid template name kind");
10445 if (!ToFileIDOrErr)
10446 return ToFileIDOrErr.takeError();
10454 return std::move(Err);
10456 return std::move(Err);
10462 llvm::DenseMap<FileID, FileID>::iterator Pos = ImportedFileIDs.find(FromID);
10463 if (Pos != ImportedFileIDs.end())
10464 return Pos->second;
10476 return ToSpLoc.takeError();
10479 return ToExLocS.takeError();
10489 return ToExLocE.takeError();
10495 if (!IsBuiltin && !
Cache->BufferOverridden) {
10499 return ToIncludeLoc.takeError();
10510 if (
Cache->OrigEntry &&
Cache->OrigEntry->getDir()) {
10516 ToFileManager.getOptionalFileRef(
Cache->OrigEntry->getName());
10521 ToID = ToSM.
createFileID(*Entry, ToIncludeLocOrFakeLoc,
10528 std::optional<llvm::MemoryBufferRef> FromBuf =
10529 Cache->getBufferOrNone(FromContext.getDiagnostics(),
10534 std::unique_ptr<llvm::MemoryBuffer> ToBuf =
10535 llvm::MemoryBuffer::getMemBufferCopy(FromBuf->getBuffer(),
10536 FromBuf->getBufferIdentifier());
10542 assert(ToID.
isValid() &&
"Unexpected invalid fileID was created.");
10544 ImportedFileIDs[FromID] = ToID;
10551 return ToExprOrErr.takeError();
10554 if (!LParenLocOrErr)
10555 return LParenLocOrErr.takeError();
10558 if (!RParenLocOrErr)
10559 return RParenLocOrErr.takeError();
10564 return ToTInfoOrErr.takeError();
10569 return std::move(Err);
10572 ToContext, *ToTInfoOrErr, From->
isBaseVirtual(), *LParenLocOrErr,
10573 *ToExprOrErr, *RParenLocOrErr, EllipsisLoc);
10577 return ToFieldOrErr.takeError();
10580 if (!MemberLocOrErr)
10581 return MemberLocOrErr.takeError();
10584 ToContext, cast_or_null<FieldDecl>(*ToFieldOrErr), *MemberLocOrErr,
10585 *LParenLocOrErr, *ToExprOrErr, *RParenLocOrErr);
10588 if (!ToIFieldOrErr)
10589 return ToIFieldOrErr.takeError();
10592 if (!MemberLocOrErr)
10593 return MemberLocOrErr.takeError();
10596 ToContext, cast_or_null<IndirectFieldDecl>(*ToIFieldOrErr),
10597 *MemberLocOrErr, *LParenLocOrErr, *ToExprOrErr, *RParenLocOrErr);
10601 return ToTInfoOrErr.takeError();
10603 return new (ToContext)
10605 *ToExprOrErr, *RParenLocOrErr);
10608 return make_error<ASTImportError>();
10614 auto Pos = ImportedCXXBaseSpecifiers.find(BaseSpec);
10615 if (Pos != ImportedCXXBaseSpecifiers.end())
10616 return Pos->second;
10619 if (!ToSourceRange)
10620 return ToSourceRange.takeError();
10623 return ToTSI.takeError();
10625 if (!ToEllipsisLoc)
10626 return ToEllipsisLoc.takeError();
10630 ImportedCXXBaseSpecifiers[BaseSpec] =
Imported;
10642 return ToOrErr.takeError();
10643 Decl *To = *ToOrErr;
10648 if (
auto *ToRecord = dyn_cast<RecordDecl>(To)) {
10649 if (!ToRecord->getDefinition()) {
10656 if (
auto *ToEnum = dyn_cast<EnumDecl>(To)) {
10657 if (!ToEnum->getDefinition()) {
10663 if (
auto *ToIFace = dyn_cast<ObjCInterfaceDecl>(To)) {
10664 if (!ToIFace->getDefinition()) {
10671 if (
auto *ToProto = dyn_cast<ObjCProtocolDecl>(To)) {
10672 if (!ToProto->getDefinition()) {
10696 return ToSelOrErr.takeError();
10700 return ToContext.DeclarationNames.getCXXConstructorName(
10701 ToContext.getCanonicalType(*ToTyOrErr));
10703 return ToTyOrErr.takeError();
10708 return ToContext.DeclarationNames.getCXXDestructorName(
10709 ToContext.getCanonicalType(*ToTyOrErr));
10711 return ToTyOrErr.takeError();
10716 return ToContext.DeclarationNames.getCXXDeductionGuideName(
10719 return ToTemplateOrErr.takeError();
10724 return ToContext.DeclarationNames.getCXXConversionFunctionName(
10725 ToContext.getCanonicalType(*ToTyOrErr));
10727 return ToTyOrErr.takeError();
10731 return ToContext.DeclarationNames.getCXXOperatorName(
10735 return ToContext.DeclarationNames.getCXXLiteralOperatorName(
10743 llvm_unreachable(
"Invalid DeclarationName Kind!");
10771 for (
unsigned I = 1, N = FromSel.
getNumArgs(); I < N; ++I)
10773 return ToContext.Selectors.getSelector(FromSel.
getNumArgs(), Idents.data());
10779 llvm::Error Err = llvm::Error::success();
10780 auto ImportLoop = [&](
const APValue *From,
APValue *To,
unsigned Size) {
10781 for (
unsigned Idx = 0; Idx < Size; Idx++) {
10786 switch (FromValue.
getKind()) {
10800 ImportLoop(((
const APValue::Vec *)(
const char *)&FromValue.Data)->Elts,
10806 llvm_unreachable(
"Matrix APValue import not yet supported");
10810 ImportLoop(((
const APValue::Arr *)(
const char *)&FromValue.Data)->Elts,
10811 ((
const APValue::Arr *)(
const char *)&
Result.Data)->Elts,
10819 ((
const APValue::StructData *)(
const char *)&FromValue.Data)->Elts,
10820 ((
const APValue::StructData *)(
const char *)&
Result.Data)->Elts,
10829 return std::move(Err);
10834 Result.MakeAddrLabelDiff();
10838 return std::move(Err);
10844 const Decl *ImpMemPtrDecl =
10847 return std::move(Err);
10849 Result.setMemberPointerUninit(
10858 return std::move(Err);
10868 "in C++20 dynamic allocation are transient so they shouldn't "
10869 "appear in the AST");
10871 if (
const auto *E =
10873 FromElemTy = E->getType();
10876 return std::move(Err);
10886 return std::move(Err);
10898 return std::move(Err);
10911 for (
unsigned LoopIdx = 0; LoopIdx < PathLength; LoopIdx++) {
10913 const Decl *FromDecl =
10914 FromPath[LoopIdx].getAsBaseOrMember().getPointer();
10917 return std::move(Err);
10918 if (
auto *RD = dyn_cast<CXXRecordDecl>(FromDecl))
10919 FromElemTy = Importer.FromContext.getCanonicalTagType(RD);
10923 ImpDecl, FromPath[LoopIdx].getAsBaseOrMember().getInt()));
10926 Importer.FromContext.getAsArrayType(FromElemTy)->getElementType();
10928 FromPath[LoopIdx].getAsArrayIndex());
10947 return std::move(Err);
10956 return std::move(Err);
10964 unsigned NumDecls) {
10974 if (LastDiagFromFrom)
10975 ToContext.getDiagnostics().notePriorDiagnosticFrom(
10976 FromContext.getDiagnostics());
10977 LastDiagFromFrom =
false;
10978 return ToContext.getDiagnostics().Report(Loc, DiagID);
10982 if (!LastDiagFromFrom)
10983 FromContext.getDiagnostics().notePriorDiagnosticFrom(
10984 ToContext.getDiagnostics());
10985 LastDiagFromFrom =
true;
10986 return FromContext.getDiagnostics().Report(Loc, DiagID);
10990 if (
auto *ID = dyn_cast<ObjCInterfaceDecl>(D)) {
10991 if (!ID->getDefinition())
10992 ID->startDefinition();
10994 else if (
auto *PD = dyn_cast<ObjCProtocolDecl>(D)) {
10995 if (!PD->getDefinition())
10996 PD->startDefinition();
10998 else if (
auto *TD = dyn_cast<TagDecl>(D)) {
10999 if (!TD->getDefinition() && !TD->isBeingDefined()) {
11000 TD->startDefinition();
11001 TD->setCompleteDefinition(
true);
11005 assert(0 &&
"CompleteDecl called on a Decl that can't be completed");
11010 auto [Pos, Inserted] = ImportedDecls.try_emplace(From, To);
11011 assert((Inserted || Pos->second == To) &&
11012 "Try to import an already imported Decl");
11014 return Pos->second;
11017 ImportedFromDecls[To] = From;
11022 AddToLookupTable(To);
11026std::optional<ASTImportError>
11028 auto Pos = ImportDeclErrors.find(FromD);
11029 if (Pos != ImportDeclErrors.end())
11030 return Pos->second;
11032 return std::nullopt;
11036 auto InsertRes = ImportDeclErrors.insert({From,
Error});
11040 assert(InsertRes.second || InsertRes.first->second.Error ==
Error.Error);
11045 llvm::DenseMap<const Type *, const Type *>::iterator Pos =
11047 if (Pos != ImportedTypes.end()) {
11049 if (ToContext.hasSameType(*ToFromOrErr, To))
11052 llvm::consumeError(ToFromOrErr.takeError());
11057 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 void * getReflectionOpaqueOperand() 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
ReflectionKind getReflectionOperandKind() 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 VisitCXXReflectExpr(CXXReflectExpr *E)
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)
ExpectedDecl VisitExplicitInstantiationDecl(ExplicitInstantiationDecl *D)
ExpectedStmt VisitCompoundAssignOperator(CompoundAssignOperator *E)
ExpectedStmt VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *E)
ExpectedStmt VisitLambdaExpr(LambdaExpr *LE)
ExpectedStmt VisitBinaryOperator(BinaryOperator *E)
ExpectedStmt VisitCallExpr(CallExpr *E)
ExpectedStmt VisitDeclStmt(DeclStmt *S)
ExpectedStmt VisitCXXDeleteExpr(CXXDeleteExpr *E)
ExpectedStmt VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *E)
Error ImportArrayChecked(IIter Ibegin, IIter Iend, OIter Obegin)
ExpectedDecl VisitClassTemplateDecl(ClassTemplateDecl *D)
ExpectedDecl VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D)
Expected< CXXCastPath > ImportCastPath(CastExpr *E)
Expected< APValue > ImportAPValue(const APValue &FromValue)
ExpectedDecl VisitFunctionTemplateDecl(FunctionTemplateDecl *D)
ExpectedStmt VisitGNUNullExpr(GNUNullExpr *E)
ExpectedDecl VisitClassTemplateSpecializationDecl(ClassTemplateSpecializationDecl *D)
ExpectedStmt VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E)
ExpectedDecl VisitLifetimeExtendedTemporaryDecl(LifetimeExtendedTemporaryDecl *D)
Expected< concepts::Requirement * > ImportNestedRequirement(concepts::NestedRequirement *From)
ExpectedDecl VisitTypedefNameDecl(TypedefNameDecl *D, bool IsAlias)
ExpectedDecl VisitCXXConstructorDecl(CXXConstructorDecl *D)
ExpectedDecl VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D)
ExpectedDecl VisitObjCIvarDecl(ObjCIvarDecl *D)
Expected< ObjCTypeParamList * > ImportObjCTypeParamList(ObjCTypeParamList *list)
ExpectedDecl VisitUsingPackDecl(UsingPackDecl *D)
ExpectedStmt VisitWhileStmt(WhileStmt *S)
ExpectedDecl VisitEnumConstantDecl(EnumConstantDecl *D)
ExpectedStmt VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E)
ExpectedStmt VisitCXXForRangeStmt(CXXForRangeStmt *S)
ExpectedDecl VisitFriendDecl(FriendDecl *D)
Error ImportContainerChecked(const InContainerTy &InContainer, OutContainerTy &OutContainer)
ExpectedStmt VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E)
ExpectedStmt VisitExpressionTraitExpr(ExpressionTraitExpr *E)
bool IsStructuralMatch(Decl *From, Decl *To, bool Complain=true, bool IgnoreTemplateParmDepth=false)
ExpectedStmt VisitFixedPointLiteral(FixedPointLiteral *E)
ExpectedStmt VisitForStmt(ForStmt *S)
ExpectedStmt VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E)
ExpectedDecl VisitEnumDecl(EnumDecl *D)
ExpectedStmt VisitCXXExpansionStmtInstantiation(CXXExpansionStmtInstantiation *S)
ExpectedDecl VisitFriendTemplateDecl(FriendTemplateDecl *D)
ExpectedStmt VisitCXXParenListInitExpr(CXXParenListInitExpr *E)
ExpectedDecl VisitObjCCategoryDecl(ObjCCategoryDecl *D)
ExpectedStmt VisitAddrLabelExpr(AddrLabelExpr *E)
ExpectedStmt VisitBinaryConditionalOperator(BinaryConditionalOperator *E)
ExpectedStmt VisitSwitchStmt(SwitchStmt *S)
ExpectedType VisitType(const Type *T)
ExpectedDecl VisitVarTemplateDecl(VarTemplateDecl *D)
ExpectedDecl ImportUsingShadowDecls(BaseUsingDecl *D, BaseUsingDecl *ToSI)
ExpectedStmt VisitPredefinedExpr(PredefinedExpr *E)
ExpectedStmt VisitOpaqueValueExpr(OpaqueValueExpr *E)
ExpectedDecl VisitNamespaceAliasDecl(NamespaceAliasDecl *D)
ExpectedStmt VisitCXXInheritedCtorInitExpr(CXXInheritedCtorInitExpr *E)
ExpectedDecl VisitVarTemplateSpecializationDecl(VarTemplateSpecializationDecl *D)
ExpectedStmt VisitPackExpansionExpr(PackExpansionExpr *E)
ExpectedStmt VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr *E)
ExpectedDecl VisitObjCMethodDecl(ObjCMethodDecl *D)
Error ImportTemplateArguments(ArrayRef< TemplateArgument > FromArgs, SmallVectorImpl< TemplateArgument > &ToArgs)
ExpectedDecl VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D)
ExpectedStmt VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E)
ExpectedDecl VisitImplicitParamDecl(ImplicitParamDecl *D)
ExpectedDecl VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D)
ExpectedStmt VisitExplicitCastExpr(ExplicitCastExpr *E)
ExpectedStmt VisitArrayInitIndexExpr(ArrayInitIndexExpr *E)
Error ImportTemplateArgumentListInfo(const InContainerTy &Container, TemplateArgumentListInfo &ToTAInfo)
ExpectedStmt VisitDoStmt(DoStmt *S)
ExpectedStmt VisitNullStmt(NullStmt *S)
ExpectedStmt VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E)
ExpectedDecl VisitBuiltinTemplateDecl(BuiltinTemplateDecl *D)
Error ImportOverriddenMethods(CXXMethodDecl *ToMethod, CXXMethodDecl *FromMethod)
ExpectedStmt VisitStringLiteral(StringLiteral *E)
Error ImportDeclarationNameLoc(const DeclarationNameInfo &From, DeclarationNameInfo &To)
ExpectedStmt VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E)
ASTNodeImporter(ASTImporter &Importer)
ExpectedDecl VisitCXXDeductionGuideDecl(CXXDeductionGuideDecl *D)
ExpectedStmt VisitMemberExpr(MemberExpr *E)
ExpectedStmt VisitConceptSpecializationExpr(ConceptSpecializationExpr *E)
ExpectedStmt VisitCXXThisExpr(CXXThisExpr *E)
Error ImportInitializer(VarDecl *From, VarDecl *To)
ImportDefinitionKind
What we should import from the definition.
@ IDK_Everything
Import everything.
@ IDK_Default
Import the default subset of the definition, which might be nothing (if minimal import is set) or mig...
@ IDK_Basic
Import only the bare bones needed to establish a valid DeclContext.
ExpectedDecl VisitTypedefDecl(TypedefDecl *D)
ExpectedDecl VisitUsingDirectiveDecl(UsingDirectiveDecl *D)
ExpectedStmt VisitDependentTemplateIdExpr(DependentTemplateIdExpr *E)
ExpectedStmt VisitArrayTypeTraitExpr(ArrayTypeTraitExpr *E)
ExpectedDecl VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D)
Expected< concepts::Requirement * > ImportExprRequirement(concepts::ExprRequirement *From)
ExpectedStmt VisitFloatingLiteral(FloatingLiteral *E)
ExpectedStmt VisitIfStmt(IfStmt *S)
ExpectedStmt VisitLabelStmt(LabelStmt *S)
ExpectedStmt VisitCXXTypeidExpr(CXXTypeidExpr *E)
ExpectedStmt VisitConvertVectorExpr(ConvertVectorExpr *E)
ExpectedDecl VisitUsingEnumDecl(UsingEnumDecl *D)
ExpectedStmt VisitGotoStmt(GotoStmt *S)
ExpectedStmt VisitSubstNonTypeTemplateParmExpr(SubstNonTypeTemplateParmExpr *E)
ExpectedStmt VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *S)
ExpectedStmt VisitGCCAsmStmt(GCCAsmStmt *S)
ExpectedDecl VisitNamespaceDecl(NamespaceDecl *D)
ExpectedStmt VisitCXXTryStmt(CXXTryStmt *S)
Error ImportConstraintSatisfaction(const ASTConstraintSatisfaction &FromSat, ConstraintSatisfaction &ToSat)
ExpectedDecl VisitImportDecl(ImportDecl *D)
Error ImportFunctionDeclBody(FunctionDecl *FromFD, FunctionDecl *ToFD)
ExpectedStmt VisitArraySubscriptExpr(ArraySubscriptExpr *E)
Expected< concepts::Requirement * > ImportTypeRequirement(concepts::TypeRequirement *From)
ExpectedStmt VisitIntegerLiteral(IntegerLiteral *E)
ExpectedDecl VisitEmptyDecl(EmptyDecl *D)
ExpectedStmt VisitCXXNoexceptExpr(CXXNoexceptExpr *E)
ExpectedStmt VisitExpr(Expr *E)
Error ImportDefaultArgOfParmVarDecl(const ParmVarDecl *FromParam, ParmVarDecl *ToParam)
ExpectedStmt VisitArrayInitLoopExpr(ArrayInitLoopExpr *E)
ExpectedStmt VisitCXXCatchStmt(CXXCatchStmt *S)
ExpectedStmt VisitAttributedStmt(AttributedStmt *S)
ExpectedStmt VisitIndirectGotoStmt(IndirectGotoStmt *S)
ExpectedStmt VisitParenListExpr(ParenListExpr *E)
Expected< FunctionDecl * > FindFunctionTemplateSpecialization(FunctionDecl *FromFD)
ExpectedDecl VisitCXXConversionDecl(CXXConversionDecl *D)
ExpectedStmt VisitObjCAtCatchStmt(ObjCAtCatchStmt *S)
Error ImportTemplateInformation(FunctionDecl *FromFD, FunctionDecl *ToFD)
ExpectedStmt VisitStmtExpr(StmtExpr *E)
ExpectedStmt VisitCXXDefaultInitExpr(CXXDefaultInitExpr *E)
bool shouldForceImportDeclContext(ImportDefinitionKind IDK)
ExpectedDecl VisitBindingDecl(BindingDecl *D)
std::tuple< FunctionTemplateDecl *, TemplateArgsTy > FunctionTemplateAndArgsTy
ExpectedStmt VisitBreakStmt(BreakStmt *S)
DesignatedInitExpr::Designator Designator
ExpectedDecl VisitTemplateParamObjectDecl(TemplateParamObjectDecl *D)
SourceLocation getColonLoc() const
SourceLocation getQuestionLoc() const
Represents an access specifier followed by colon ':'.
SourceLocation getColonLoc() const
The location of the colon following the access specifier.
AddrLabelExpr - The GNU address of label extension, representing &&label.
SourceLocation getAmpAmpLoc() const
SourceLocation getLabelLoc() const
LabelDecl * getLabel() const
Represents the index of the current element of an array being initialized by an ArrayInitLoopExpr.
Represents a loop initializing the elements of an array.
OpaqueValueExpr * getCommonExpr() const
Get the common subexpression shared by all initializations (the source array).
Expr * getSubExpr() const
Get the initializer to use for each array element.
ArraySubscriptExpr - [C99 6.5.2.1] Array Subscripting.
SourceLocation getRBracketLoc() const
Expr * getLHS()
An array access can be written A[4] or 4[A] (both are equivalent).
An Embarcadero array type trait, as used in the implementation of __array_rank and __array_extent.
uint64_t getValue() const
SourceLocation getEndLoc() const LLVM_READONLY
ArrayTypeTrait getTrait() const
Expr * getDimensionExpression() const
TypeSourceInfo * getQueriedTypeSourceInfo() const
SourceLocation getBeginLoc() const LLVM_READONLY
Represents an array type, per C99 6.7.5.2 - Array Declarators.
SourceLocation getAsmLoc() const
unsigned getNumClobbers() const
unsigned getNumOutputs() const
unsigned getNumInputs() const
A structure for storing the information associated with a name that has been assumed to be a template...
DeclarationName getDeclName() const
Get the name of the template.
AtomicExpr - Variadic atomic builtins: __atomic_exchange, __atomic_fetch_*, __atomic_load,...
SourceLocation getRParenLoc() const
static unsigned getNumSubExprs(AtomicOp Op)
Determine the number of arguments the specified atomic builtin should have.
SourceLocation getBuiltinLoc() const
Attr - This represents one attribute.
attr::Kind getKind() const
void setPackExpansion(bool PE)
Attr * clone(ASTContext &C) const
SourceRange getRange() const
void setRange(SourceRange R)
void setAttrName(const IdentifierInfo *AttrNameII)
const IdentifierInfo * getAttrName() const
Represents an attribute applied to a statement.
SourceLocation getAttrLoc() const
ArrayRef< const Attr * > getAttrs() const
static AttributedStmt * Create(const ASTContext &C, SourceLocation Loc, ArrayRef< const Attr * > Attrs, Stmt *SubStmt)
Represents a C++ declaration that introduces decls from somewhere else.
void addShadowDecl(UsingShadowDecl *S)
shadow_range shadows() const
BinaryConditionalOperator - The GNU extension to the conditional operator which allows the middle ope...
Expr * getFalseExpr() const
getFalseExpr - Return the subexpression which will be evaluated if the condition evaluates to false; ...
OpaqueValueExpr * getOpaqueValue() const
getOpaqueValue - Return the opaque value placeholder.
Expr * getCond() const
getCond - Return the condition expression; this is defined in terms of the opaque value.
Expr * getTrueExpr() const
getTrueExpr - Return the subexpression which will be evaluated if the condition evaluates to true; th...
Expr * getCommon() const
getCommon - Return the common expression, written to the left of the condition.
A builtin binary operation expression such as "x + y" or "x <= y".
SourceLocation getOperatorLoc() const
static BinaryOperator * Create(const ASTContext &C, Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy, ExprValueKind VK, ExprObjectKind OK, SourceLocation opLoc, FPOptionsOverride FPFeatures)
FPOptionsOverride getFPFeatures() const
A binding in a decomposition declaration.
void setDecomposedDecl(DecompositionDecl *Decomposed)
Set the decomposed variable for this BindingDecl.
Expr * getBinding() const
Get the expression to which this declaration is bound.
DecompositionDecl * getDecomposedDecl() const
Get the decomposition declaration that this binding represents a decomposition of.
void setBinding(QualType DeclaredType, Expr *Binding)
Set the binding for this BindingDecl, along with its declared type (which should be a possibly-cv-qua...
BreakStmt - This represents a break.
Represents a C++2a __builtin_bit_cast(T, v) expression.
Represents the builtin template declaration which is used to implement __make_integer_seq and other b...
BuiltinTemplateKind getBuiltinTemplateKind() const
This class is used for builtin types like 'int'.
static CStyleCastExpr * Create(const ASTContext &Context, QualType T, ExprValueKind VK, CastKind K, Expr *Op, const CXXCastPath *BasePath, FPOptionsOverride FPO, TypeSourceInfo *WrittenTy, SourceLocation L, SourceLocation R)
Represents a base class of a C++ class.
AccessSpecifier getAccessSpecifierAsWritten() const
Retrieves the access specifier as written in the source code (which may mean that no access specifier...
SourceLocation getEllipsisLoc() const
For a pack expansion, determine the location of the ellipsis.
bool isVirtual() const
Determines whether the base class is a virtual base class (or not).
TypeSourceInfo * getTypeSourceInfo() const
Retrieves the type and source location of the base class.
bool isBaseOfClass() const
Determine whether this base class is a base of a class declared with the 'class' keyword (vs.
SourceRange getSourceRange() const LLVM_READONLY
Retrieves the source range that contains the entire base specifier.
Represents binding an expression to a temporary.
CXXTemporary * getTemporary()
static CXXBindTemporaryExpr * Create(const ASTContext &C, CXXTemporary *Temp, Expr *SubExpr)
const Expr * getSubExpr() const
A boolean literal, per ([C++ lex.bool] Boolean literals).
static CXXBoolLiteralExpr * Create(const ASTContext &C, bool Val, QualType Ty, SourceLocation Loc)
SourceLocation getLocation() const
CXXCatchStmt - This represents a C++ catch block.
SourceLocation getCatchLoc() const
Stmt * getHandlerBlock() const
VarDecl * getExceptionDecl() const
static CXXConstCastExpr * Create(const ASTContext &Context, QualType T, ExprValueKind VK, Expr *Op, TypeSourceInfo *WrittenTy, SourceLocation L, SourceLocation RParenLoc, SourceRange AngleBrackets)
Represents a call to a C++ constructor.
SourceRange getParenOrBraceRange() const
void setIsImmediateEscalating(bool Set)
bool isElidable() const
Whether this construction is elidable.
bool hadMultipleCandidates() const
Whether the referred constructor was resolved from an overloaded set having size greater than 1.
static CXXConstructExpr * Create(const ASTContext &Ctx, QualType Ty, SourceLocation Loc, CXXConstructorDecl *Ctor, bool Elidable, ArrayRef< Expr * > Args, bool HadMultipleCandidates, bool ListInitialization, bool StdInitListInitialization, bool ZeroInitialization, CXXConstructionKind ConstructKind, SourceRange ParenOrBraceRange)
Create a C++ construction expression.
bool isStdInitListInitialization() const
Whether this constructor call was written as list-initialization, but was interpreted as forming a st...
bool isImmediateEscalating() const
bool requiresZeroInitialization() const
Whether this construction first requires zero-initialization before the initializer is called.
SourceLocation getLocation() const
CXXConstructorDecl * getConstructor() const
Get the constructor that this expression will (ultimately) call.
bool isListInitialization() const
Whether this constructor call was written as list-initialization.
unsigned getNumArgs() const
Return the number of arguments to the constructor call.
CXXConstructionKind getConstructionKind() const
Determine whether this constructor is actually constructing a base class (rather than a complete obje...
Represents a C++ constructor within a class.
Represents a C++ conversion function within a class.
Represents a C++ base or member initializer.
FieldDecl * getMember() const
If this is a member initializer, returns the declaration of the non-static data member being initiali...
bool isDelegatingInitializer() const
Determine whether this initializer is creating a delegating constructor.
Expr * getInit() const
Get the initializer.
SourceLocation getRParenLoc() const
SourceLocation getEllipsisLoc() const
SourceLocation getLParenLoc() const
bool isPackExpansion() const
Determine whether this initializer is a pack expansion.
TypeSourceInfo * getTypeSourceInfo() const
Returns the declarator information for a base class or delegating initializer.
bool isMemberInitializer() const
Determine whether this initializer is initializing a non-static data member.
bool isBaseInitializer() const
Determine whether this initializer is initializing a base class.
bool isIndirectMemberInitializer() const
SourceLocation getMemberLocation() const
IndirectFieldDecl * getIndirectMember() const
bool isBaseVirtual() const
Returns whether the base is virtual or not.
Represents a C++ deduction guide declaration.
SourceDeductionGuideKind getSourceDeductionGuideKind() const
A default argument (C++ [dcl.fct.default]).
SourceLocation getUsedLocation() const
Retrieve the location where this default argument was actually used.
const ParmVarDecl * getParam() const
Expr * getRewrittenExpr()
const DeclContext * getUsedContext() const
static CXXDefaultArgExpr * Create(const ASTContext &C, SourceLocation Loc, ParmVarDecl *Param, Expr *RewrittenExpr, DeclContext *UsedContext)
bool hasRewrittenInit() const
A use of a default initializer in a constructor or in aggregate initialization.
static CXXDefaultInitExpr * Create(const ASTContext &Ctx, SourceLocation Loc, FieldDecl *Field, DeclContext *UsedContext, Expr *RewrittenInitExpr)
Field is the non-static data member whose default initializer is used by this expression.
const DeclContext * getUsedContext() const
const Expr * getRewrittenExpr() const
Retrieve the initializing expression with evaluated immediate calls, if any.
bool hasRewrittenInit() const
FieldDecl * getField()
Get the field whose initializer will be used.
SourceLocation getBeginLoc() const
Represents a delete expression for memory deallocation and destructor calls, e.g.
FunctionDecl * getOperatorDelete() const
SourceLocation getBeginLoc() const
bool isGlobalDelete() const
bool doesUsualArrayDeleteWantSize() const
Answers whether the usual array deallocation function for the allocated type expects the size of the ...
bool isArrayFormAsWritten() const
Represents a C++ member access expression where the actual member referenced could not be resolved be...
bool isArrow() const
Determine whether this member expression used the '->' operator; otherwise, it used the '.
SourceLocation getOperatorLoc() const
Retrieve the location of the '->' or '.' operator.
static CXXDependentScopeMemberExpr * Create(const ASTContext &Ctx, Expr *Base, QualType BaseType, bool IsArrow, SourceLocation OperatorLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc, NamedDecl *FirstQualifierFoundInScope, DeclarationNameInfo MemberNameInfo, const TemplateArgumentListInfo *TemplateArgs)
SourceLocation getLAngleLoc() const
Retrieve the location of the left angle bracket starting the explicit template argument list followin...
SourceLocation getTemplateKeywordLoc() const
Retrieve the location of the template keyword preceding the member name, if any.
const DeclarationNameInfo & getMemberNameInfo() const
Retrieve the name of the member that this expression refers to.
bool hasExplicitTemplateArgs() const
Determines whether this member expression actually had a C++ template argument list explicitly specif...
SourceLocation getMemberLoc() const
SourceLocation getRAngleLoc() const
Retrieve the location of the right angle bracket ending the explicit template argument list following...
DeclarationName getMember() const
Retrieve the name of the member that this expression refers to.
NamedDecl * getFirstQualifierFoundInScope() const
Retrieve the first part of the nested-name-specifier that was found in the scope of the member access...
Expr * getBase() const
Retrieve the base object of this member expressions, e.g., the x in x.m.
NestedNameSpecifierLoc getQualifierLoc() const
Retrieve the nested-name-specifier that qualifies the member name, with source location information.
bool isImplicitAccess() const
True if this is an implicit access, i.e.
ArrayRef< TemplateArgumentLoc > template_arguments() const
Represents a C++ destructor within a class.
void setOperatorDelete(FunctionDecl *OD, Expr *ThisArg)
static CXXDynamicCastExpr * Create(const ASTContext &Context, QualType T, ExprValueKind VK, CastKind Kind, Expr *Op, const CXXCastPath *Path, TypeSourceInfo *Written, SourceLocation L, SourceLocation RParenLoc, SourceRange AngleBrackets)
Helper that selects an expression from an InitListExpr depending on the current expansion index.
InitListExpr * getRangeExpr()
Represents a C++26 expansion statement declaration.
CXXExpansionStmtPattern * getExpansionPattern()
CXXExpansionStmtInstantiation * getInstantiations()
void setInstantiations(CXXExpansionStmtInstantiation *S)
NonTypeTemplateParmDecl * getIndexTemplateParm()
void setExpansionPattern(CXXExpansionStmtPattern *S)
Represents the code generated for an expanded expansion statement.
ArrayRef< Stmt * > getInstantiations() const
bool shouldApplyLifetimeExtensionToPreamble() const
CXXExpansionStmtDecl * getParent()
ArrayRef< Stmt * > getPreambleStmts() const
static CXXExpansionStmtInstantiation * Create(ASTContext &C, CXXExpansionStmtDecl *Parent, ArrayRef< Stmt * > Instantiations, ArrayRef< Stmt * > PreambleStmts, bool ShouldApplyLifetimeExtensionToPreamble)
CXXExpansionStmtPattern - Represents an unexpanded C++ expansion statement.
ExpansionStmtKind getKind() const
static CXXExpansionStmtPattern * CreateIterating(ASTContext &Context, CXXExpansionStmtDecl *ESD, Stmt *Init, DeclStmt *ExpansionVar, DeclStmt *Range, DeclStmt *Begin, DeclStmt *Iter, SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation RParenLoc)
Create an iterating expansion statement pattern.
const DeclStmt * getIterVarStmt() const
DeclStmt * getExpansionVarStmt()
static CXXExpansionStmtPattern * CreateDependent(ASTContext &Context, CXXExpansionStmtDecl *ESD, Stmt *Init, DeclStmt *ExpansionVar, Expr *ExpansionInitializer, SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation RParenLoc)
Create a dependent expansion statement pattern.
SourceLocation getRParenLoc() const
static CXXExpansionStmtPattern * CreateDestructuring(ASTContext &Context, CXXExpansionStmtDecl *ESD, Stmt *Init, DeclStmt *ExpansionVar, Stmt *DecompositionDeclStmt, SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation RParenLoc)
Create a destructuring expansion statement pattern.
Stmt * getDecompositionDeclStmt()
const DeclStmt * getBeginVarStmt() const
SourceLocation getColonLoc() const
Expr * getExpansionInitializer()
const DeclStmt * getRangeVarStmt() const
CXXExpansionStmtDecl * getDecl()
static CXXExpansionStmtPattern * CreateEnumerating(ASTContext &Context, CXXExpansionStmtDecl *ESD, Stmt *Init, DeclStmt *ExpansionVar, SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation RParenLoc)
Create an enumerating expansion statement pattern.
SourceLocation getLParenLoc() const
Represents a folding of a pack over an operator.
UnresolvedLookupExpr * getCallee() const
SourceLocation getLParenLoc() const
SourceLocation getEllipsisLoc() const
UnsignedOrNone getNumExpansions() const
SourceLocation getRParenLoc() const
BinaryOperatorKind getOperator() const
CXXForRangeStmt - This represents C++0x [stmt.ranged]'s ranged for statement, represented as 'for (ra...
DeclStmt * getBeginStmt()
DeclStmt * getLoopVarStmt()
SourceLocation getForLoc() const
DeclStmt * getRangeStmt()
SourceLocation getRParenLoc() const
SourceLocation getColonLoc() const
SourceLocation getCoawaitLoc() const
static CXXFunctionalCastExpr * Create(const ASTContext &Context, QualType T, ExprValueKind VK, TypeSourceInfo *Written, CastKind Kind, Expr *Op, const CXXCastPath *Path, FPOptionsOverride FPO, SourceLocation LPLoc, SourceLocation RPLoc)
Represents a call to an inherited base class constructor from an inheriting constructor.
bool constructsVBase() const
Determine whether this constructor is actually constructing a base class (rather than a complete obje...
CXXConstructorDecl * getConstructor() const
Get the constructor that this expression will call.
SourceLocation getLocation() const LLVM_READONLY
bool inheritedFromVBase() const
Determine whether the inherited constructor is inherited from a virtual base of the object we constru...
Represents a call to a member function that may be written either with member call syntax (e....
static CXXMemberCallExpr * Create(const ASTContext &Ctx, Expr *Fn, ArrayRef< Expr * > Args, QualType Ty, ExprValueKind VK, SourceLocation RP, FPOptionsOverride FPFeatures, unsigned MinNumArgs=0)
Represents a static or instance method of a struct/union/class.
void addOverriddenMethod(const CXXMethodDecl *MD)
overridden_method_range overridden_methods() const
CXXMethodDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Abstract class common to all of the C++ "named"/"keyword" casts.
SourceLocation getOperatorLoc() const
Retrieve the location of the cast operator keyword, e.g., static_cast.
SourceRange getAngleBrackets() const LLVM_READONLY
SourceLocation getRParenLoc() const
Retrieve the location of the closing parenthesis.
Represents a new-expression for memory allocation and constructor calls, e.g: "new CXXNewExpr(foo)".
static CXXNewExpr * Create(const ASTContext &Ctx, bool IsGlobalNew, FunctionDecl *OperatorNew, FunctionDecl *OperatorDelete, const ImplicitAllocationParameters &IAP, bool UsualArrayDeleteWantsSize, ArrayRef< Expr * > PlacementArgs, SourceRange TypeIdParens, std::optional< Expr * > ArraySize, CXXNewInitializationStyle InitializationStyle, Expr *Initializer, QualType Ty, TypeSourceInfo *AllocatedTypeInfo, SourceRange Range, SourceRange DirectInitRange)
Create a c++ new expression.
SourceRange getDirectInitRange() const
llvm::iterator_range< arg_iterator > placement_arguments()
std::optional< Expr * > getArraySize()
This might return std::nullopt even if isArray() returns true, since there might not be an array size...
CXXNewInitializationStyle getInitializationStyle() const
The kind of initializer this new-expression has.
ImplicitAllocationParameters implicitAllocationParameters() const
Provides the full set of information about expected implicit parameters in this call.
FunctionDecl * getOperatorDelete() const
unsigned getNumPlacementArgs() const
TypeSourceInfo * getAllocatedTypeSourceInfo() const
SourceRange getSourceRange() const
SourceRange getTypeIdParens() const
bool doesUsualArrayDeleteWantSize() const
Answers whether the usual array deallocation function for the allocated type expects the size of the ...
FunctionDecl * getOperatorNew() const
Expr * getInitializer()
The initializer of this new-expression.
Represents a C++11 noexcept expression (C++ [expr.unary.noexcept]).
SourceLocation getEndLoc() const
Expr * getOperand() const
SourceLocation getBeginLoc() const
The null pointer literal (C++11 [lex.nullptr])
SourceLocation getLocation() const
static CXXOperatorCallExpr * Create(const ASTContext &Ctx, OverloadedOperatorKind OpKind, Expr *Fn, ArrayRef< Expr * > Args, QualType Ty, ExprValueKind VK, SourceLocation OperatorLoc, FPOptionsOverride FPFeatures, ADLCallKind UsesADL=NotADL, bool IsReversed=false)
Represents a list-initialization with parenthesis.
static CXXParenListInitExpr * Create(ASTContext &C, ArrayRef< Expr * > Args, QualType T, unsigned NumUserSpecifiedExprs, SourceLocation InitLoc, SourceLocation LParenLoc, SourceLocation RParenLoc)
SourceLocation getEndLoc() const LLVM_READONLY
SourceLocation getInitLoc() const LLVM_READONLY
MutableArrayRef< Expr * > getInitExprs()
SourceLocation getBeginLoc() const LLVM_READONLY
MutableArrayRef< Expr * > getUserSpecifiedInitExprs()
Represents a C++ pseudo-destructor (C++ [expr.pseudo]).
TypeSourceInfo * getDestroyedTypeInfo() const
Retrieve the source location information for the type being destroyed.
bool isArrow() const
Determine whether this pseudo-destructor expression was written using an '->' (otherwise,...
TypeSourceInfo * getScopeTypeInfo() const
Retrieve the scope type in a qualified pseudo-destructor expression.
SourceLocation getTildeLoc() const
Retrieve the location of the '~'.
NestedNameSpecifierLoc getQualifierLoc() const
Retrieves the nested-name-specifier that qualifies the type name, with source-location information.
SourceLocation getDestroyedTypeLoc() const
Retrieve the starting location of the type being destroyed.
SourceLocation getColonColonLoc() const
Retrieve the location of the '::' in a qualified pseudo-destructor expression.
SourceLocation getOperatorLoc() const
Retrieve the location of the '.' or '->' operator.
const IdentifierInfo * getDestroyedTypeIdentifier() const
In a dependent pseudo-destructor expression for which we do not have full type information on the des...
Represents a C++ struct/union/class.
CXXRecordDecl * getMostRecentDecl()
CXXRecordDecl * getInstantiatedFromMemberClass() const
If this record is an instantiation of a member class, retrieves the member class from which it was in...
method_range methods() const
CXXRecordDecl * getDefinition() const
static CXXRecordDecl * CreateLambda(const ASTContext &C, DeclContext *DC, TypeSourceInfo *Info, SourceLocation Loc, unsigned DependencyKind, bool IsGeneric, LambdaCaptureDefault CaptureDefault)
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine whether this particular class is a specialization or instantiation of a class template or m...
void setInstantiationOfMemberClass(CXXRecordDecl *RD, TemplateSpecializationKind TSK)
Specify that this record is an instantiation of the member class RD.
void setLambdaContextDecl(Decl *ContextDecl)
Set the context declaration for a lambda class.
void setDescribedClassTemplate(ClassTemplateDecl *Template)
void setLambdaNumbering(LambdaNumbering Numbering)
Set the mangling numbers for a lambda class.
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this class is an instantiation of a member class of a class template specialization,...
void setTemplateSpecializationKind(TemplateSpecializationKind TSK)
Set the kind of specialization or template instantiation this is.
CXXRecordDecl * getPreviousDecl()
Represents a C++26 reflect expression [expr.reflect].
SourceLocation getOperatorLoc() const
Returns location of the '^^'-operator.
const TypeSourceInfo * getTypeSourceInfo() const
static CXXReflectExpr * Create(ASTContext &C, SourceLocation OperatorLoc, const TypeSourceInfo *TSI)
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
This is an opaque type for sizes expressed in character units.
SourceLocation getLocation() const
unsigned getValue() const
CharacterLiteralKind getKind() const
How to handle import errors that occur when import of a child declaration of a DeclContext fails.
bool ignoreChildErrorOnParent(Decl *FromChildD) const
Determine if import failure of a child does not cause import failure of its parent.
ChildErrorHandlingStrategy(const Decl *FromD)
void handleChildImportResult(Error &ResultErr, Error &&ChildErr)
Process the import result of a child (of the current declaration).
ChildErrorHandlingStrategy(const DeclContext *FromDC)
ChooseExpr - GNU builtin-in function __builtin_choose_expr.
SourceLocation getBuiltinLoc() const
bool isConditionDependent() const
bool isConditionTrue() const
isConditionTrue - Return whether the condition is true (i.e.
SourceLocation getRParenLoc() const
Declaration of a class template.
ClassTemplatePartialSpecializationDecl * findPartialSpecialization(ArrayRef< TemplateArgument > Args, TemplateParameterList *TPL, llvm::FoldingSetInsertToken &InsertToken)
Return the partial specialization with the provided arguments if it exists, otherwise return the inse...
ClassTemplateDecl * getMostRecentDecl()
CXXRecordDecl * getTemplatedDecl() const
Get the underlying class declarations of the template.
ClassTemplateSpecializationDecl * findSpecialization(ArrayRef< TemplateArgument > Args, llvm::FoldingSetInsertToken &InsertToken)
Return the specialization with the provided arguments if it exists, otherwise return the insertion po...
bool isThisDeclarationADefinition() const
Returns whether this template declaration defines the primary class pattern.
void AddSpecialization(ClassTemplateSpecializationDecl *D, llvm::FoldingSetInsertToken InsertToken)
Insert the specified specialization knowing that it is not already in.
void AddPartialSpecialization(ClassTemplatePartialSpecializationDecl *D, llvm::FoldingSetInsertToken InsertToken)
Insert the specified partial specialization knowing that it is not already in.
ClassTemplatePartialSpecializationDecl * getInstantiatedFromMember() const
Retrieve the member class template partial specialization from which this particular class template p...
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
Represents a class template specialization, which refers to a class template with a given set of temp...
TemplateSpecializationKind getSpecializationKind() const
Determine the kind of specialization that this declaration represents.
const ASTTemplateArgumentListInfo * getTemplateArgsAsWritten() const
Retrieve the template argument list as written in the sources, if any.
ClassTemplateDecl * getSpecializedTemplate() const
Retrieve the template that this specialization specializes.
void setPointOfInstantiation(SourceLocation Loc)
SourceLocation getPointOfInstantiation() const
Get the point of instantiation (if any), or null if none.
void setExternKeywordLoc(SourceLocation Loc)
Sets the location of the extern keyword.
void setSpecializationKind(TemplateSpecializationKind TSK)
const TemplateArgumentList & getTemplateArgs() const
Retrieve the template arguments of the class template specialization.
SourceLocation getExternKeywordLoc() const
Gets the location of the extern keyword, if present.
SourceLocation getTemplateKeywordLoc() const
Gets the location of the template keyword, if present.
void setTemplateKeywordLoc(SourceLocation Loc)
Sets the location of the template keyword.
const TemplateArgumentList & getTemplateInstantiationArgs() const
Retrieve the set of template arguments that should be used to instantiate members of the class templa...
llvm::PointerUnion< ClassTemplateDecl *, ClassTemplatePartialSpecializationDecl * > getInstantiatedFrom() const
If this class template specialization is an instantiation of a template (rather than an explicit spec...
bool hasStrictPackMatch() const
void setInstantiationOf(ClassTemplatePartialSpecializationDecl *PartialSpec, const TemplateArgumentList *TemplateArgs)
Note that this class template specialization is actually an instantiation of the given class template...
bool isExplicitInstantiationOrSpecialization() const
True if this declaration is an explicit specialization, explicit instantiation declaration,...
void setTemplateArgsAsWritten(const ASTTemplateArgumentListInfo *ArgsWritten)
Set the template argument list as written in the sources.
CompoundAssignOperator - For compound assignments (e.g.
QualType getComputationLHSType() const
static CompoundAssignOperator * Create(const ASTContext &C, Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy, ExprValueKind VK, ExprObjectKind OK, SourceLocation opLoc, FPOptionsOverride FPFeatures, QualType CompLHSType=QualType(), QualType CompResultType=QualType())
QualType getComputationResultType() const
CompoundLiteralExpr - [C99 6.5.2.5].
SourceLocation getLParenLoc() const
const Expr * getInitializer() const
TypeSourceInfo * getTypeSourceInfo() const
CompoundStmt - This represents a group of statements like { stmt stmt }.
FPOptionsOverride getStoredFPFeatures() const
Get FPOptionsOverride from trailing storage.
SourceLocation getLBracLoc() const
bool hasStoredFPFeatures() const
static CompoundStmt * Create(const ASTContext &C, ArrayRef< Stmt * > Stmts, FPOptionsOverride FPFeatures, SourceLocation LB, SourceLocation RB)
SourceLocation getRBracLoc() const
Declaration of a C++20 concept.
Expr * getConstraintExpr() const
A reference to a concept and its template args, as it appears in the code.
const NestedNameSpecifierLoc & getNestedNameSpecifierLoc() const
NamedDecl * getFoundDecl() const
const DeclarationNameInfo & getConceptNameInfo() const
static ConceptReference * Create(const ASTContext &C, NestedNameSpecifierLoc NNS, SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo, NamedDecl *FoundDecl, TemplateName NamedConcept, const ASTTemplateArgumentListInfo *ArgsAsWritten)
const ASTTemplateArgumentListInfo * getTemplateArgsAsWritten() const
TemplateName getNamedConcept() const
SourceLocation getTemplateKWLoc() const
Represents the specialization of a concept - evaluates to a prvalue of type bool.
static ConceptSpecializationExpr * Create(const ASTContext &C, ConceptReference *ConceptRef, ImplicitConceptSpecializationDecl *SpecDecl, const ConstraintSatisfaction *Satisfaction)
ConceptReference * getConceptReference() const
const ImplicitConceptSpecializationDecl * getSpecializationDecl() const
const ASTConstraintSatisfaction & getSatisfaction() const
Get elaborated satisfaction info about the template arguments' satisfaction of the named concept.
ConditionalOperator - The ?
Expr * getCond() const
getCond - Return the expression representing the condition for the ?
ConstantExpr - An expression that occurs in a constant context and optionally the result of evaluatin...
APValue getAPValueResult() const
static ConstantExpr * Create(const ASTContext &Context, Expr *E, const APValue &Result)
The result of a constraint satisfaction check, containing the necessary information to diagnose an un...
llvm::SmallVector< UnsatisfiedConstraintRecord, 4 > Details
The substituted constraint expr, if the template arguments could be substituted into them,...
Represents a shadow constructor declaration introduced into a class by a C++11 using-declaration that...
ContinueStmt - This represents a continue.
ConvertVectorExpr - Clang builtin function __builtin_convertvector This AST node provides support for...
FPOptionsOverride getStoredFPFeaturesOrDefault() const
Get the store FPOptionsOverride or default if not stored.
SourceLocation getRParenLoc() const
getRParenLoc - Return the location of final right parenthesis.
static ConvertVectorExpr * Create(const ASTContext &C, Expr *SrcExpr, TypeSourceInfo *TI, QualType DstType, ExprValueKind VK, ExprObjectKind OK, SourceLocation BuiltinLoc, SourceLocation RParenLoc, FPOptionsOverride FPFeatures)
SourceLocation getBuiltinLoc() const
getBuiltinLoc - Return the location of the __builtin_convertvector token.
TypeSourceInfo * getTypeSourceInfo() const
getTypeSourceInfo - Return the destination type.
Expr * getSrcExpr() const
getSrcExpr - Return the Expr to be converted.
A POD class for pairing a NamedDecl* with an access specifier.
static DeclAccessPair make(NamedDecl *D, AccessSpecifier AS)
NamedDecl * getDecl() const
AccessSpecifier getAccess() const
The results of name lookup within a DeclContext.
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
void makeDeclVisibleInContext(NamedDecl *D)
Makes a declaration visible within this context.
DeclContextLookupResult lookup_result
bool isDependentContext() const
Determines whether this context is dependent on a template parameter.
lookup_result lookup(DeclarationName Name) const
lookup - Find the declarations (if any) with the given Name in this context.
DeclContext * getRedeclContext()
getRedeclContext - Retrieve the context in which an entity conflicts with other entities of the same ...
void addDeclInternal(Decl *D)
Add the declaration D into this context, but suppress searches for external declarations with the sam...
bool containsDeclAndLoad(Decl *D) const
Checks whether a declaration is in this context.
void removeDecl(Decl *D)
Removes a declaration from this context.
lookup_result noload_lookup(DeclarationName Name)
Find the declarations with the given name that are visible within this context; don't attempt to retr...
bool containsDecl(Decl *D) const
Checks whether a declaration is in this context.
bool hasExternalLexicalStorage() const
Whether this DeclContext has external storage containing additional declarations that are lexically i...
DeclContext * getEnclosingNamespaceContext()
Retrieve the nearest enclosing namespace context.
decl_range decls() const
decls_begin/decls_end - Iterate over the declarations stored in this context.
bool isFunctionOrMethod() const
Returns true if this DeclContext is a function, Objective-C method, or block, or a DeclContext that c...
void localUncachedLookup(DeclarationName Name, SmallVectorImpl< NamedDecl * > &Results)
A simplistic name lookup mechanism that performs name lookup into this declaration context without co...
static DeclGroupRef Create(ASTContext &C, Decl **Decls, unsigned NumDecls)
A reference to a declared variable, function, enum, etc.
NamedDecl * getFoundDecl()
Get the NamedDecl through which this reference occurred.
bool hasExplicitTemplateArgs() const
Determines whether this declaration reference was followed by an explicit template argument list.
bool refersToEnclosingVariableOrCapture() const
Does this DeclRefExpr refer to an enclosing local or a captured variable?
SourceLocation getTemplateKeywordLoc() const
Retrieve the location of the template keyword preceding this name, if any.
static DeclRefExpr * Create(const ASTContext &Context, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc, ValueDecl *D, bool RefersToEnclosingVariableOrCapture, SourceLocation NameLoc, QualType T, ExprValueKind VK, NamedDecl *FoundD=nullptr, const TemplateArgumentListInfo *TemplateArgs=nullptr, NonOdrUseReason NOUR=NOUR_None)
SourceLocation getLAngleLoc() const
Retrieve the location of the left angle bracket starting the explicit template argument list followin...
NestedNameSpecifierLoc getQualifierLoc() const
If the name was qualified, retrieves the nested-name-specifier that precedes the name,...
ArrayRef< TemplateArgumentLoc > template_arguments() const
NonOdrUseReason isNonOdrUse() const
Is this expression a non-odr-use reference, and if so, why?
bool hadMultipleCandidates() const
Returns true if this expression refers to a function that was resolved from an overloaded set having ...
SourceLocation getLocation() const
SourceLocation getRAngleLoc() const
Retrieve the location of the right angle bracket ending the explicit template argument list following...
bool isImmediateEscalating() const
DeclStmt - Adaptor class for mixing declarations with statements and expressions.
SourceLocation getEndLoc() const
const DeclGroupRef getDeclGroup() const
SourceLocation getBeginLoc() const LLVM_READONLY
A simple visitor class that helps create declaration visitors.
Decl - This represents one declaration (or definition), e.g.
SourceLocation getEndLoc() const LLVM_READONLY
TemplateDecl * getDescribedTemplate() const
If this is a declaration that describes some template, this method returns that template declaration.
FriendObjectKind getFriendObjectKind() const
Determines whether this declaration is the object of a friend declaration and, if so,...
ASTContext & getASTContext() const LLVM_READONLY
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
@ FOK_None
Not a friend object.
void setObjectOfFriendDecl(bool PerformFriendInjection=false)
Changes the namespace of this declaration to reflect that it's the object of a friend declaration.
void setAccess(AccessSpecifier AS)
SourceLocation getLocation() const
const char * getDeclKindName() const
IdentifierNamespace
IdentifierNamespace - The different namespaces in which declarations may appear.
@ IDNS_NonMemberOperator
This declaration is a C++ operator declared in a non-class context.
@ IDNS_TagFriend
This declaration is a friend class.
@ IDNS_Ordinary
Ordinary names.
@ IDNS_ObjCProtocol
Objective C @protocol.
@ IDNS_Namespace
Namespaces, declared with 'namespace foo {}'.
@ IDNS_OrdinaryFriend
This declaration is a friend function.
@ IDNS_Tag
Tags, declared with 'struct foo;' and referenced with 'struct foo'.
void setImplicit(bool I=true)
void setIsUsed()
Set whether the declaration is used, in the sense of odr-use.
bool isUsed(bool CheckUsedAttr=true) const
Whether any (re-)declaration of the entity was used, meaning that a definition is required.
DeclContext * getDeclContext()
AccessSpecifier getAccess() const
bool isInAnonymousNamespace() const
SourceLocation getBeginLoc() const LLVM_READONLY
TranslationUnitDecl * getTranslationUnitDecl()
void setDeclContext(DeclContext *DC)
setDeclContext - Set both the semantic and lexical DeclContext to DC.
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
void setLexicalDeclContext(DeclContext *DC)
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
The name of a declaration.
IdentifierInfo * getAsIdentifierInfo() const
Retrieve the IdentifierInfo * stored in this declaration name, or null if this declaration name isn't...
TemplateDecl * getCXXDeductionGuideTemplate() const
If this name is the name of a C++ deduction guide, return the template associated with that name.
const IdentifierInfo * getCXXLiteralIdentifier() const
If this name is the name of a literal operator, retrieve the identifier associated with it.
static DeclarationName getUsingDirectiveName()
Returns the name for all C++ using-directives.
OverloadedOperatorKind getCXXOverloadedOperator() const
If this name is the name of an overloadable operator in C++ (e.g., operator+), retrieve the kind of o...
@ CXXConversionFunctionName
QualType getCXXNameType() const
If this name is one of the C++ names (of a constructor, destructor, or conversion function),...
Selector getObjCSelector() const
Get the Objective-C selector stored in this declaration name.
NameKind getNameKind() const
Determine what kind of name this is.
bool isEmpty() const
Evaluates true when this declaration name is empty.
SourceLocation getInnerLocStart() const
Return start of source range ignoring outer template declarations.
SourceLocation getBeginLoc() const LLVM_READONLY
const AssociatedConstraint & getTrailingRequiresClause() const
Get the constraint-expression introduced by the trailing requires-clause in the function/member decla...
void setTypeSourceInfo(TypeSourceInfo *TI)
void setQualifierInfo(NestedNameSpecifierLoc QualifierLoc)
NestedNameSpecifierLoc getQualifierLoc() const
Retrieve the nested-name-specifier (with source-location information) that qualifies the name of this...
TypeSourceInfo * getTypeSourceInfo() const
A decomposition declaration.
SourceLocation getDefaultLoc() const
A qualified reference to a name whose declaration cannot yet be resolved.
static DependentScopeDeclRefExpr * Create(const ASTContext &Context, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc, const DeclarationNameInfo &NameInfo, const TemplateArgumentListInfo *TemplateArgs)
SourceLocation getRAngleLoc() const
Retrieve the location of the right angle bracket ending the explicit template argument list following...
NestedNameSpecifierLoc getQualifierLoc() const
Retrieve the nested-name-specifier that qualifies the name, with source location information.
SourceLocation getLAngleLoc() const
Retrieve the location of the left angle bracket starting the explicit template argument list followin...
ArrayRef< TemplateArgumentLoc > template_arguments() const
bool hasExplicitTemplateArgs() const
Determines whether this lookup had explicit template arguments.
SourceLocation getTemplateKeywordLoc() const
Retrieve the location of the template keyword preceding this name, if any.
DeclarationName getDeclName() const
Retrieve the name that this expression refers to.
const DeclarationNameInfo & getNameInfo() const
Retrieve the name that this expression refers to.
A template-id naming a variable template or a concept through a template template parameter.
static DependentTemplateIdExpr * Create(const ASTContext &Context, const DeclarationNameInfo &NameInfo, TemplateName Name, const TemplateArgumentListInfo &TemplateArgs)
const DeclarationNameInfo & getNameInfo() const
ArrayRef< TemplateArgumentLoc > template_arguments() const
SourceLocation getRAngleLoc() const
DeclarationName getName() const
TemplateName getTemplateName() const
SourceLocation getNameLoc() const
SourceLocation getLAngleLoc() const
IdentifierOrOverloadedOperator getName() const
NestedNameSpecifier getQualifier() const
Return the nested name specifier that qualifies this name.
bool hasTemplateKeyword() const
Was this template name was preceeded by the template keyword?
Represents a single C99 designator.
unsigned getArrayIndex() const
bool isFieldDesignator() const
static Designator CreateArrayRangeDesignator(unsigned Index, SourceLocation LBracketLoc, SourceLocation EllipsisLoc, SourceLocation RBracketLoc)
Creates a GNU array-range designator.
static Designator CreateFieldDesignator(const IdentifierInfo *FieldName, SourceLocation DotLoc, SourceLocation FieldLoc)
Creates a field designator.
bool isArrayRangeDesignator() const
static Designator CreateArrayDesignator(unsigned Index, SourceLocation LBracketLoc, SourceLocation RBracketLoc)
Creates an array designator.
bool isArrayDesignator() const
SourceLocation getFieldLoc() const
SourceLocation getRBracketLoc() const
const IdentifierInfo * getFieldName() const
SourceLocation getEllipsisLoc() const
SourceLocation getDotLoc() const
SourceLocation getLBracketLoc() const
Represents a C99 designated initializer expression.
Expr * getSubExpr(unsigned Idx) const
bool usesGNUSyntax() const
Determines whether this designated initializer used the deprecated GNU syntax for designated initiali...
MutableArrayRef< Designator > designators()
Expr * getInit() const
Retrieve the initializer value.
unsigned size() const
Returns the number of designators in this initializer.
SourceLocation getEqualOrColonLoc() const
Retrieve the location of the '=' that precedes the initializer value itself, if present.
unsigned getNumSubExprs() const
Retrieve the total number of subexpressions in this designated initializer expression,...
static DesignatedInitExpr * Create(const ASTContext &C, ArrayRef< Designator > Designators, ArrayRef< Expr * > IndexExprs, SourceLocation EqualOrColonLoc, bool GNUSyntax, Expr *Init)
A little helper class used to produce diagnostics.
DoStmt - This represents a 'do/while' stmt.
SourceLocation getWhileLoc() const
SourceLocation getDoLoc() const
SourceLocation getRParenLoc() const
Symbolic representation of a dynamic allocation.
Represents an empty-declaration.
An instance of this object exists for each enum constant that is defined.
llvm::APSInt getInitVal() const
const Expr * getInitExpr() const
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this enumeration is an instantiation of a member enumeration of a class template specialization,...
bool isScoped() const
Returns true if this is a C++11 scoped enumeration.
unsigned getNumNegativeBits() const
Returns the width in bits required to store all the negative enumerators of this enum.
bool isScopedUsingClassTag() const
Returns true if this is a C++11 scoped enumeration.
void setIntegerType(QualType T)
Set the underlying integer type.
EnumDecl * getMostRecentDecl()
bool isFixed() const
Returns true if this is an Objective-C, C++11, or Microsoft-style enumeration with a fixed underlying...
void completeDefinition(QualType NewType, QualType PromotionType, unsigned NumPositiveBits, unsigned NumNegativeBits)
When created, the EnumDecl corresponds to a forward-declared enum.
QualType getIntegerType() const
Return the integer type this enum decl corresponds to.
EnumDecl * getInstantiatedFromMemberEnum() const
Returns the enumeration (declared within the template) from which this enumeration type was instantia...
EnumDecl * getDefinition() const
unsigned getNumPositiveBits() const
Returns the width in bits required to store all the non-negative enumerators of this enum.
QualType getPromotionType() const
Return the integer type that enumerators should promote to.
ExplicitCastExpr - An explicit cast written in the source code.
TypeSourceInfo * getTypeInfoAsWritten() const
getTypeInfoAsWritten - Returns the type source info for the type that this expression is casting to.
Represents an explicit instantiation of a template entity in source code.
TypeSourceInfo * getTypeAsWritten() const
The declared type (return type or variable type) for function / variable templates.
TemplateSpecializationKind getTemplateSpecializationKind() const
SourceLocation getExternLoc() const
SourceLocation getTemplateArgsLAngleLoc() const
std::optional< unsigned > getNumTemplateArgs() const
Returns the number of explicit template arguments, or std::nullopt if this entity has no template arg...
TemplateArgumentLoc getTemplateArg(unsigned I) const
SourceLocation getTemplateArgsRAngleLoc() const
NamedDecl * getSpecialization() const
NestedNameSpecifierLoc getQualifierLoc() const
Returns the qualifier regardless of where it is stored.
SourceLocation getTemplateLoc() const
SourceLocation getNameLoc() const
Store information needed for an explicit specifier.
ExplicitSpecKind getKind() const
const Expr * getExpr() const
Represents an expression – generally a full-expression – that introduces cleanups to be run at the en...
bool cleanupsHaveSideEffects() const
ArrayRef< CleanupObject > getObjects() const
unsigned getNumObjects() const
llvm::PointerUnion< BlockDecl *, CompoundLiteralExpr * > CleanupObject
The type of objects that are kept in the cleanup.
static ExprWithCleanups * Create(const ASTContext &C, EmptyShell empty, unsigned numObjects)
This represents one expression.
bool isValueDependent() const
Determines whether the value of this expression depends on.
ExprValueKind getValueKind() const
getValueKind - The value kind that this expression produces.
bool isTypeDependent() const
Determines whether the type of this expression depends on.
bool containsUnexpandedParameterPack() const
Whether this expression contains an unexpanded parameter pack (for C++11 variadic templates).
ExprObjectKind getObjectKind() const
getObjectKind - The object kind that this expression produces.
bool isInstantiationDependent() const
Whether this expression is instantiation-dependent, meaning that it depends in some way on.
ExprDependence getDependence() const
An expression trait intrinsic.
SourceLocation getBeginLoc() const LLVM_READONLY
Expr * getQueriedExpression() const
ExpressionTrait getTrait() const
SourceLocation getEndLoc() const LLVM_READONLY
virtual void CompleteType(TagDecl *Tag)
Gives the external AST source an opportunity to complete an incomplete type.
Represents difference between two FPOptions values.
Represents a member of a struct/union/class.
bool isMutable() const
Determines whether this field is mutable (C++ only).
Expr * getInClassInitializer() const
Get the C++11 default member initializer for this member, or null if one has not been set.
bool hasInClassInitializer() const
Determine whether this member has a C++11 default member initializer.
InClassInitStyle getInClassInitStyle() const
Get the kind of (C++11) default member initializer that this field has.
void setInClassInitializer(Expr *NewInit)
Set the C++11 in-class initializer for this member.
Expr * getBitWidth() const
Returns the expression that represents the bit width, if this field is a bit field.
const VariableArrayType * getCapturedVLAType() const
Get the captured variable length array type.
void setCapturedVLAType(const VariableArrayType *VLAType)
Set the captured variable length array type for this field.
An opaque identifier used by SourceManager which refers to a source file (MemoryBuffer) along with it...
Implements support for file system lookup, file system caching, and directory search management.
SourceLocation getAsmLoc() const
const Expr * getAsmStringExpr() const
SourceLocation getRParenLoc() const
SourceLocation getLocation() const
Retrieve the location of the literal.
llvm::APInt getValue() const
Returns an internal integer representation of the literal.
SourceLocation getLocation() const
static FloatingLiteral * Create(const ASTContext &C, const llvm::APFloat &V, bool isexact, QualType Type, SourceLocation L)
llvm::APFloat getValue() const
ForStmt - This represents a 'for (init;cond;inc)' stmt.
VarDecl * getConditionVariable() const
Retrieve the variable declared in this "for" statement, if any.
SourceLocation getRParenLoc() const
SourceLocation getForLoc() const
SourceLocation getLParenLoc() const
FriendDecl - Represents the declaration of a friend entity, which can be a function,...
llvm::PointerUnion< NamedDecl *, TypeSourceInfo * > FriendUnion
SourceLocation getFriendLoc() const
SourceLocation getEllipsisLoc() const
Retrieves the location of the '...', if present.
virtual NamedDecl * getFriendDecl() const
If this friend declaration doesn't name a type, return the inner declaration.
TypeSourceInfo * getFriendType() const
If this friend declaration names an (untemplated but possibly dependent) type, return the type; other...
Declaration of a friend template.
TemplateName getFriendTemplateName() const
FriendTemplateEntityKind getFriendKind() const
ArrayRef< TemplateParameterList * > getTemplateParameterLists() const
const Expr * getSubExpr() const
static DefaultedOrDeletedFunctionInfo * Create(ASTContext &Context, ArrayRef< DeclAccessPair > Lookups, FPOptionsOverride FPFeatures, StringLiteral *DeletedMessage=nullptr)
Represents a function declaration or definition.
Stmt * getBody(const FunctionDecl *&Definition) const
Retrieve the body (definition) of the function.
ConstexprSpecKind getConstexprKind() const
DefaultedOrDeletedFunctionInfo * getDefaultedOrDeletedInfo() const
void setDescribedFunctionTemplate(FunctionTemplateDecl *Template)
FunctionTemplateDecl * getDescribedFunctionTemplate() const
Retrieves the function template that is described by this function declaration.
void setIsPureVirtual(bool P=true)
void setDefaultedOrDeletedInfo(DefaultedOrDeletedFunctionInfo *Info)
void setFriendConstraintRefersToEnclosingTemplate(bool V=true)
bool isDestroyingOperatorDelete() const
Determine whether this is a destroying operator delete.
bool UsesFPIntrin() const
Determine whether the function was declared in source context that requires constrained FP intrinsics...
SourceLocation getDefaultLoc() const
ArrayRef< ParmVarDecl * > parameters() const
bool isExplicitlyDefaulted() const
Whether this function is explicitly defaulted.
bool isTrivial() const
Whether this function is "trivial" in some specialized C++ senses.
bool hasWrittenPrototype() const
Whether this function has a written prototype.
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this function is an instantiation of a member function of a class template specialization,...
FunctionTemplateSpecializationInfo * getTemplateSpecializationInfo() const
If this function is actually a function template specialization, retrieve information about this func...
void setDefaultLoc(SourceLocation NewLoc)
bool doesThisDeclarationHaveABody() const
Returns whether this specific declaration of the function has a body.
DependentFunctionTemplateSpecializationInfo * getDependentSpecializationInfo() const
@ TK_MemberSpecialization
@ TK_DependentNonTemplate
@ TK_FunctionTemplateSpecialization
@ TK_DependentFunctionTemplateSpecialization
StorageClass getStorageClass() const
Returns the storage class as written in the source.
bool FriendConstraintRefersToEnclosingTemplate() const
TemplatedKind getTemplatedKind() const
What kind of templated function this is.
void setInstantiatedFromDecl(FunctionDecl *FD)
Specify that this function declaration was instantiated from a FunctionDecl FD.
bool isDeletedAsWritten() const
void setDependentTemplateSpecialization(ASTContext &Context, const UnresolvedSetImpl &Templates, const TemplateArgumentListInfo *TemplateArgs)
Specifies that this function declaration is actually a dependent function template specialization.
bool isPureVirtual() const
Whether this virtual function is pure, i.e.
FunctionDecl * getMostRecentDecl()
Returns the most recent (re)declaration of this declaration.
void setVirtualAsWritten(bool V)
State that this function is marked as virtual explicitly.
void setIsDestroyingOperatorDelete(bool IsDestroyingDelete)
bool isTypeAwareOperatorNewOrDelete() const
Determine whether this is a type aware operator new or delete.
void setIsTypeAwareOperatorNewOrDelete(bool IsTypeAwareOperator=true)
void setRangeEnd(SourceLocation E)
bool isDefaulted() const
Whether this function is defaulted.
FunctionDecl * getInstantiatedFromDecl() const
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine what kind of template instantiation this function represents.
void setDefaulted(bool D=true)
bool isVirtualAsWritten() const
Whether this function is marked as virtual explicitly.
void setDeletedAsWritten(bool D=true, StringLiteral *Message=nullptr)
void setExplicitlyDefaulted(bool ED=true)
State that this function is explicitly defaulted.
FunctionDecl * getInstantiatedFromMemberFunction() const
If this function is an instantiation of a member function of a class template specialization,...
DeclarationNameInfo getNameInfo() const
bool hasBody(const FunctionDecl *&Definition) const
Returns true if the function has a body.
FunctionDecl * getPreviousDecl()
Return the previous declaration of this declaration or NULL if this is the first declaration.
bool isInlineSpecified() const
Determine whether the "inline" keyword was specified for this function.
Represents a prototype with parameter type info, e.g.
ExtProtoInfo getExtProtoInfo() const
ArrayRef< QualType > exceptions() const
ArrayRef< QualType > param_types() const
Declaration of a template function.
FunctionDecl * getTemplatedDecl() const
Get the underlying function declaration of the template.
bool isThisDeclarationADefinition() const
Returns whether this template declaration defines the primary pattern.
FunctionTemplateDecl * getMostRecentDecl()
ExtInfo getExtInfo() const
QualType getReturnType() const
This represents a GCC inline-assembly statement extension.
unsigned getNumLabels() const
SourceLocation getRParenLoc() const
IdentifierInfo * getInputIdentifier(unsigned i) const
const Expr * getOutputConstraintExpr(unsigned i) const
const Expr * getInputConstraintExpr(unsigned i) const
IdentifierInfo * getOutputIdentifier(unsigned i) const
const Expr * getAsmStringExpr() const
Expr * getClobberExpr(unsigned i)
GNUNullExpr - Implements the GNU __null extension, which is a name for a null pointer constant that h...
SourceLocation getBeginLoc() const LLVM_READONLY
Represents a C11 generic selection.
TypeSourceInfo * getControllingType()
Return the controlling type of this generic selection expression.
ArrayRef< Expr * > getAssocExprs() const
bool isExprPredicate() const
Whether this generic selection uses an expression as its controlling argument.
SourceLocation getGenericLoc() const
SourceLocation getRParenLoc() const
unsigned getResultIndex() const
The zero-based index of the result expression's generic association in the generic selection's associ...
SourceLocation getDefaultLoc() const
static GenericSelectionExpr * Create(const ASTContext &Context, SourceLocation GenericLoc, Expr *ControllingExpr, ArrayRef< TypeSourceInfo * > AssocTypes, ArrayRef< Expr * > AssocExprs, SourceLocation DefaultLoc, SourceLocation RParenLoc, bool ContainsUnexpandedParameterPack, unsigned ResultIndex)
Create a non-result-dependent generic selection expression accepting an expression predicate.
bool isResultDependent() const
Whether this generic selection is result-dependent.
Expr * getControllingExpr()
Return the controlling expression of this generic selection expression.
ArrayRef< TypeSourceInfo * > getAssocTypeSourceInfos() const
GotoStmt - This represents a direct goto.
SourceLocation getLabelLoc() const
SourceLocation getGotoLoc() const
LabelDecl * getLabel() const
One of these records is kept for each identifier that is lexed.
unsigned getBuiltinID() const
Return a value indicating whether this is a builtin function.
void setBuiltinID(unsigned ID)
StringRef getName() const
Return the actual identifier string.
IfStmt - This represents an if/then/else.
static IfStmt * Create(const ASTContext &Ctx, SourceLocation IL, IfStatementKind Kind, Stmt *Init, VarDecl *Var, Expr *Cond, SourceLocation LPL, SourceLocation RPL, Stmt *Then, SourceLocation EL=SourceLocation(), Stmt *Else=nullptr)
Create an IfStmt.
SourceLocation getIfLoc() const
IfStatementKind getStatementKind() const
SourceLocation getElseLoc() const
SourceLocation getLParenLoc() const
SourceLocation getRParenLoc() const
VarDecl * getConditionVariable()
Retrieve the variable declared in this "if" statement, if any.
ImaginaryLiteral - We support imaginary integer and floating point literals, like "1....
const Expr * getSubExpr() const
ImplicitCastExpr - Allows us to explicitly represent implicit type conversions, which have no direct ...
static ImplicitCastExpr * Create(const ASTContext &Context, QualType T, CastKind Kind, Expr *Operand, const CXXCastPath *BasePath, ExprValueKind Cat, FPOptionsOverride FPO)
ArrayRef< TemplateArgument > getTemplateArguments() const
ImplicitParamKind getParameterKind() const
Returns the implicit parameter kind.
Represents an implicitly-generated value initialization of an object of a given type.
Describes a module import declaration, which makes the contents of the named module visible in the cu...
Represents a field injected from an anonymous union/struct into the parent scope.
unsigned getChainingSize() const
ArrayRef< NamedDecl * > chain() const
IndirectGotoStmt - This represents an indirect goto.
SourceLocation getGotoLoc() const
SourceLocation getStarLoc() const
Description of a constructor that was inherited from a base class.
CXXConstructorDecl * getConstructor() const
ConstructorUsingShadowDecl * getShadowDecl() const
Describes an C or C++ initializer list.
bool hasArrayFiller() const
Return true if this is an array initializer and its array "filler" has been set.
void setSyntacticForm(InitListExpr *Init)
FieldDecl * getInitializedFieldInUnion()
If this initializes a union, specifies which field in the union to initialize.
unsigned getNumInits() const
SourceLocation getLBraceLoc() const
void setArrayFiller(Expr *filler)
InitListExpr * getSyntacticForm() const
bool hadArrayRangeDesignator() const
Expr * getArrayFiller()
If this initializer list initializes an array with more elements than there are initializers in the l...
SourceLocation getRBraceLoc() const
void setInitializedFieldInUnion(FieldDecl *FD)
ArrayRef< Expr * > inits() const
void sawArrayRangeDesignator(bool ARD=true)
static IntegerLiteral * Create(const ASTContext &C, const llvm::APInt &V, QualType type, SourceLocation l)
Returns a new integer literal with value 'V' and type 'type'.
SourceLocation getLocation() const
Retrieve the location of the literal.
Represents the declaration of a label.
LabelStmt * getStmt() const
void setStmt(LabelStmt *T)
LabelStmt - Represents a label, which has a substatement.
LabelDecl * getDecl() const
SourceLocation getIdentLoc() const
Describes the capture of a variable or of this, or of a C++1y init-capture.
bool capturesVariable() const
Determine whether this capture handles a variable.
bool isPackExpansion() const
Determine whether this capture is a pack expansion, which captures a function parameter pack.
SourceLocation getEllipsisLoc() const
Retrieve the location of the ellipsis for a capture that is a pack expansion.
LambdaCaptureKind getCaptureKind() const
Determine the kind of capture.
ValueDecl * getCapturedVar() const
Retrieve the declaration of the local variable being captured.
bool isImplicit() const
Determine whether this was an implicit capture (not written between the square brackets introducing t...
SourceLocation getLocation() const
Retrieve the source location of the capture.
A C++ lambda expression, which produces a function object (of unspecified type) that can be invoked l...
static LambdaExpr * Create(const ASTContext &C, CXXRecordDecl *Class, SourceRange IntroducerRange, LambdaCaptureDefault CaptureDefault, SourceLocation CaptureDefaultLoc, bool ExplicitParams, bool ExplicitResultType, ArrayRef< Expr * > CaptureInits, SourceLocation ClosingBrace, bool ContainsUnexpandedParameterPack)
Construct a new lambda expression.
SourceLocation getEndLoc() const LLVM_READONLY
bool hasExplicitParameters() const
Determine whether this lambda has an explicit parameter list vs.
SourceRange getIntroducerRange() const
Retrieve the source range covering the lambda introducer, which contains the explicit capture list su...
unsigned capture_size() const
Determine the number of captures in this lambda.
CXXMethodDecl * getCallOperator() const
Retrieve the function call operator associated with this lambda expression.
bool hasExplicitResultType() const
Whether this lambda had its result type explicitly specified.
SourceLocation getCaptureDefaultLoc() const
Retrieve the location of this lambda's capture-default, if any.
llvm::iterator_range< capture_init_iterator > capture_inits()
Retrieve the initialization expressions for this lambda's captures.
LambdaCaptureDefault getCaptureDefault() const
Determine the default capture kind for this lambda.
CXXRecordDecl * getLambdaClass() const
Retrieve the class that corresponds to the lambda.
Implicit declaration of a temporary that was materialized by a MaterializeTemporaryExpr and lifetime-...
unsigned getManglingNumber() const
Expr * getTemporaryExpr()
Retrieve the expression to which the temporary materialization conversion was applied.
ValueDecl * getExtendingDecl()
Represents a linkage specification.
void setRBraceLoc(SourceLocation L)
LinkageSpecLanguageIDs getLanguage() const
Return the language specified by this linkage specification.
SourceLocation getExternLoc() const
SourceLocation getRBraceLoc() const
bool hasBraces() const
Determines whether this linkage specification had braces in its syntactic form.
Represents the results of name lookup.
Represents a prvalue temporary that is written into memory so that a reference can bind to it.
Expr * getSubExpr() const
Retrieve the temporary-generating subexpression whose value will be materialized into a glvalue.
bool isBoundToLvalueReference() const
Determine whether this materialized temporary is bound to an lvalue reference; otherwise,...
LifetimeExtendedTemporaryDecl * getLifetimeExtendedTemporaryDecl()
MemberExpr - [C99 6.5.2.3] Structure and Union Members.
ArrayRef< TemplateArgumentLoc > template_arguments() const
SourceLocation getOperatorLoc() const
SourceLocation getTemplateKeywordLoc() const
Retrieve the location of the template keyword preceding the member name, if any.
NestedNameSpecifierLoc getQualifierLoc() const
If the member name was qualified, retrieves the nested-name-specifier that precedes the member name,...
ValueDecl * getMemberDecl() const
Retrieve the member declaration to which this expression refers.
bool hasExplicitTemplateArgs() const
Determines whether the member name was followed by an explicit template argument list.
NonOdrUseReason isNonOdrUse() const
Is this expression a non-odr-use reference, and if so, why?
static MemberExpr * Create(const ASTContext &C, Expr *Base, bool IsArrow, SourceLocation OperatorLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc, ValueDecl *MemberDecl, DeclAccessPair FoundDecl, DeclarationNameInfo MemberNameInfo, const TemplateArgumentListInfo *TemplateArgs, QualType T, ExprValueKind VK, ExprObjectKind OK, NonOdrUseReason NOUR)
SourceLocation getRAngleLoc() const
Retrieve the location of the right angle bracket ending the explicit template argument list following...
SourceLocation getLAngleLoc() const
Retrieve the location of the left angle bracket starting the explicit template argument list followin...
DeclarationNameInfo getMemberNameInfo() const
Retrieve the member declaration name info.
DeclAccessPair getFoundDecl() const
Retrieves the declaration found by lookup.
Provides information a specialization of a member of a class template, which may be a member function...
SourceLocation getPointOfInstantiation() const
Retrieve the first point of instantiation of this member.
void setPointOfInstantiation(SourceLocation POI)
Set the first point of instantiation.
This represents a decl that may have a name.
Linkage getLinkageInternal() const
Determine what kind of linkage this entity has.
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
Represents a C++ namespace alias.
NestedNameSpecifierLoc getQualifierLoc() const
Retrieve the nested-name-specifier that qualifies the name of the namespace, with source-location inf...
SourceLocation getAliasLoc() const
Returns the location of the alias name, i.e.
SourceLocation getNamespaceLoc() const
Returns the location of the namespace keyword.
SourceLocation getTargetNameLoc() const
Returns the location of the identifier in the named namespace.
NamespaceDecl * getNamespace()
Retrieve the namespace declaration aliased by this directive.
Represent a C++ namespace.
SourceLocation getRBraceLoc() const
SourceLocation getBeginLoc() const LLVM_READONLY
bool isInline() const
Returns true if this is an inline namespace declaration.
NamespaceDecl * getAnonymousNamespace() const
Retrieve the anonymous namespace that inhabits this namespace, if any.
bool isNested() const
Returns true if this is a nested namespace declaration.
void setRBraceLoc(SourceLocation L)
Class that aids in the construction of nested-name-specifiers along with source-location information ...
NestedNameSpecifierLoc getWithLocInContext(ASTContext &Context) const
Retrieve a nested-name-specifier with location information, copied into the given AST context.
A C++ nested-name-specifier augmented with source location information.
NamespaceAndPrefixLoc getAsNamespaceAndPrefix() const
NestedNameSpecifier getNestedNameSpecifier() const
Retrieve the nested-name-specifier to which this instance refers.
SourceLocation getLocalEndLoc() const
Retrieve the location of the end of this component of the nested-name-specifier.
SourceRange getSourceRange() const LLVM_READONLY
Retrieve the source range covering the entirety of this nested-name-specifier.
TypeLoc castAsTypeLoc() const
For a nested-name-specifier that refers to a type, retrieve the type with source-location information...
SourceLocation getLocalBeginLoc() const
Retrieve the location of the beginning of this component of the nested-name-specifier.
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
CXXRecordDecl * getAsMicrosoftSuper() const
NamespaceAndPrefix getAsNamespaceAndPrefix() const
const Type * getAsType() const
Kind
The kind of specifier that completes this nested name specifier.
@ MicrosoftSuper
Microsoft's '__super' specifier, stored as a CXXRecordDecl* of the class it appeared in.
@ Global
The global specifier '::'. There is no stored value.
@ Type
A type, stored as a Type*.
@ Namespace
A namespace-like entity, stored as a NamespaceBaseDecl*.
NonTypeTemplateParmDecl - Declares a non-type template parameter, e.g., "Size" in.
unsigned getPosition() const
Get the position of the template parameter within its parameter list.
bool isParameterPack() const
Whether this parameter is a non-type template parameter pack.
unsigned getDepth() const
Get the nesting depth of the template parameter.
NullStmt - This is the null statement ";": C99 6.8.3p3.
bool hasLeadingEmptyMacro() const
SourceLocation getSemiLoc() const
Represents Objective-C's @catch statement.
const VarDecl * getCatchParamDecl() const
const Stmt * getCatchBody() const
SourceLocation getAtCatchLoc() const
SourceLocation getRParenLoc() const
Represents Objective-C's @finally statement.
const Stmt * getFinallyBody() const
SourceLocation getAtFinallyLoc() const
Represents Objective-C's @synchronized statement.
const Expr * getSynchExpr() const
const CompoundStmt * getSynchBody() const
SourceLocation getAtSynchronizedLoc() const
Represents Objective-C's @throw statement.
const Expr * getThrowExpr() const
SourceLocation getThrowLoc() const LLVM_READONLY
Represents Objective-C's @try ... @catch ... @finally statement.
const ObjCAtFinallyStmt * getFinallyStmt() const
Retrieve the @finally statement, if any.
static ObjCAtTryStmt * Create(const ASTContext &Context, SourceLocation atTryLoc, Stmt *atTryStmt, Stmt **CatchStmts, unsigned NumCatchStmts, Stmt *atFinallyStmt)
unsigned getNumCatchStmts() const
Retrieve the number of @catch statements in this try-catch-finally block.
const ObjCAtCatchStmt * getCatchStmt(unsigned I) const
Retrieve a @catch statement.
const Stmt * getTryBody() const
Retrieve the @try body.
SourceLocation getAtTryLoc() const
Retrieve the location of the @ in the @try.
Represents Objective-C's @autoreleasepool Statement.
SourceLocation getAtLoc() const
const Stmt * getSubStmt() const
An Objective-C "bridged" cast expression, which casts between Objective-C pointers and C pointers,...
ObjCCategoryDecl - Represents a category declaration.
void setTypeParamList(ObjCTypeParamList *TPL)
Set the type parameters of this category.
void setProtocolList(ObjCProtocolDecl *const *List, unsigned Num, const SourceLocation *Locs, ASTContext &C)
setProtocolList - Set the list of protocols that this interface implements.
ObjCCategoryImplDecl * getImplementation() const
ObjCInterfaceDecl * getClassInterface()
ObjCTypeParamList * getTypeParamList() const
Retrieve the type parameter list associated with this category or extension.
protocol_iterator protocol_end() const
ObjCProtocolList::loc_iterator protocol_loc_iterator
SourceLocation getIvarLBraceLoc() const
SourceLocation getIvarRBraceLoc() const
protocol_loc_iterator protocol_loc_begin() const
protocol_iterator protocol_begin() const
void setImplementation(ObjCCategoryImplDecl *ImplD)
ObjCProtocolList::iterator protocol_iterator
SourceLocation getCategoryNameLoc() const
ObjCCategoryImplDecl - An object of this class encapsulates a category @implementation declaration.
SourceLocation getCategoryNameLoc() const
ObjCCategoryDecl * getCategoryDecl() const
SourceLocation getAtStartLoc() const
Represents Objective-C's collection statement.
SourceLocation getForLoc() const
SourceLocation getRParenLoc() const
const ObjCInterfaceDecl * getClassInterface() const
ObjCImplementationDecl - Represents a class definition - this is where method definitions are specifi...
SourceLocation getIvarRBraceLoc() const
SourceLocation getSuperClassLoc() const
const ObjCInterfaceDecl * getSuperClass() const
SourceLocation getIvarLBraceLoc() const
Represents an ObjC class declaration.
void setProtocolList(ObjCProtocolDecl *const *List, unsigned Num, const SourceLocation *Locs, ASTContext &C)
setProtocolList - Set the list of protocols that this interface implements.
bool isImplicitInterfaceDecl() const
isImplicitInterfaceDecl - check that this is an implicitly declared ObjCInterfaceDecl node.
ObjCTypeParamList * getTypeParamListAsWritten() const
Retrieve the type parameters written on this particular declaration of the class.
ObjCCategoryDecl * FindCategoryDeclaration(const IdentifierInfo *CategoryId) const
FindCategoryDeclaration - Finds category declaration in the list of categories for this class and ret...
protocol_loc_iterator protocol_loc_begin() const
void setImplementation(ObjCImplementationDecl *ImplD)
known_categories_range known_categories() const
void setSuperClass(TypeSourceInfo *superClass)
protocol_iterator protocol_end() const
SourceLocation getSuperClassLoc() const
Retrieve the starting location of the superclass.
bool isThisDeclarationADefinition() const
Determine whether this particular declaration of this class is actually also a definition.
void setTypeParamList(ObjCTypeParamList *TPL)
Set the type parameters of this class.
ObjCProtocolList::iterator protocol_iterator
ObjCImplementationDecl * getImplementation() const
protocol_iterator protocol_begin() const
ObjCProtocolList::loc_iterator protocol_loc_iterator
void startDefinition()
Starts the definition of this Objective-C class, taking it from a forward declaration (@class) to a d...
ObjCInterfaceDecl * getCanonicalDecl() override
Retrieves the canonical declaration of this Objective-C class.
ObjCInterfaceDecl * getSuperClass() const
ObjCInterfaceDecl * getDefinition()
Retrieve the definition of this class, or NULL if this class has been forward-declared (with @class) ...
TypeSourceInfo * getSuperClassTInfo() const
ObjCIvarDecl - Represents an ObjC instance variable.
AccessControl getAccessControl() const
bool getSynthesize() const
ObjCMethodDecl - Represents an instance or class method declaration.
ImplicitParamDecl * getSelfDecl() const
ArrayRef< ParmVarDecl * > parameters() const
unsigned param_size() const
bool isPropertyAccessor() const
param_const_iterator param_end() const
param_const_iterator param_begin() const
SourceLocation getEndLoc() const LLVM_READONLY
TypeSourceInfo * getReturnTypeSourceInfo() const
void setMethodParams(ASTContext &C, ArrayRef< ParmVarDecl * > Params, ArrayRef< SourceLocation > SelLocs={})
Sets the method's parameters and selector source locations.
bool isSynthesizedAccessorStub() const
bool hasRelatedResultType() const
Determine whether this method has a result type that is related to the message receiver's type.
bool isInstanceMethod() const
void createImplicitParams(ASTContext &Context, const ObjCInterfaceDecl *ID)
createImplicitParams - Used to lazily create the self and cmd implicit parameters.
QualType getReturnType() const
ParmVarDecl *const * param_iterator
ObjCImplementationControl getImplementationControl() const
ObjCInterfaceDecl * getClassInterface()
void getSelectorLocs(SmallVectorImpl< SourceLocation > &SelLocs) const
Represents one property declaration in an Objective-C interface.
void setSetterName(Selector Sel, SourceLocation Loc=SourceLocation())
SourceLocation getGetterNameLoc() const
ObjCMethodDecl * getGetterMethodDecl() const
bool isInstanceProperty() const
ObjCMethodDecl * getSetterMethodDecl() const
SourceLocation getSetterNameLoc() const
SourceLocation getAtLoc() const
void setPropertyAttributes(ObjCPropertyAttribute::Kind PRVal)
ObjCIvarDecl * getPropertyIvarDecl() const
Selector getSetterName() const
TypeSourceInfo * getTypeSourceInfo() const
void setPropertyAttributesAsWritten(ObjCPropertyAttribute::Kind PRVal)
Selector getGetterName() const
void setPropertyIvarDecl(ObjCIvarDecl *Ivar)
SourceLocation getLParenLoc() const
void setSetterMethodDecl(ObjCMethodDecl *gDecl)
ObjCPropertyAttribute::Kind getPropertyAttributesAsWritten() const
ObjCPropertyAttribute::Kind getPropertyAttributes() const
void setGetterName(Selector Sel, SourceLocation Loc=SourceLocation())
PropertyControl getPropertyImplementation() const
void setGetterMethodDecl(ObjCMethodDecl *gDecl)
ObjCPropertyImplDecl - Represents implementation declaration of a property in a class or category imp...
ObjCIvarDecl * getPropertyIvarDecl() const
SourceLocation getPropertyIvarDeclLoc() const
Kind getPropertyImplementation() const
ObjCPropertyDecl * getPropertyDecl() const
SourceLocation getBeginLoc() const LLVM_READONLY
Represents an Objective-C protocol declaration.
bool isThisDeclarationADefinition() const
Determine whether this particular declaration is also the definition.
void setProtocolList(ObjCProtocolDecl *const *List, unsigned Num, const SourceLocation *Locs, ASTContext &C)
setProtocolList - Set the list of protocols that this interface implements.
ObjCProtocolDecl * getDefinition()
Retrieve the definition of this protocol, if any.
void startDefinition()
Starts the definition of this Objective-C protocol.
ObjCProtocolList::iterator protocol_iterator
protocol_iterator protocol_begin() const
ObjCProtocolList::loc_iterator protocol_loc_iterator
protocol_iterator protocol_end() const
protocol_loc_iterator protocol_loc_begin() const
Represents the declaration of an Objective-C type parameter.
unsigned getIndex() const
Retrieve the index into its type parameter list.
const Type * getTypeForDecl() const
SourceLocation getColonLoc() const
Retrieve the location of the ':' separating the type parameter name from the explicitly-specified bou...
ObjCTypeParamVariance getVariance() const
Determine the variance of this type parameter.
SourceLocation getVarianceLoc() const
Retrieve the location of the variance keyword.
Stores a list of Objective-C type parameters for a parameterized class or a category/extension thereo...
SourceLocation getRAngleLoc() const
static ObjCTypeParamList * create(ASTContext &ctx, SourceLocation lAngleLoc, ArrayRef< ObjCTypeParamDecl * > typeParams, SourceLocation rAngleLoc)
Create a new Objective-C type parameter list.
SourceLocation getLAngleLoc() const
OffsetOfExpr - [C99 7.17] - This represents an expression of the form offsetof(record-type,...
Expr * getIndexExpr(unsigned Idx)
SourceLocation getOperatorLoc() const
getOperatorLoc - Return the location of the operator.
const OffsetOfNode & getComponent(unsigned Idx) const
static OffsetOfExpr * Create(const ASTContext &C, QualType type, SourceLocation OperatorLoc, TypeSourceInfo *tsi, ArrayRef< OffsetOfNode > comps, ArrayRef< Expr * > exprs, SourceLocation RParenLoc)
TypeSourceInfo * getTypeSourceInfo() const
unsigned getNumExpressions() const
SourceLocation getRParenLoc() const
Return the location of the right parentheses.
unsigned getNumComponents() const
Helper class for OffsetOfExpr.
const IdentifierInfo * getFieldName() const
For a field or identifier offsetof node, returns the name of the field.
unsigned getArrayExprIndex() const
For an array element node, returns the index into the array of expressions.
FieldDecl * getField() const
For a field offsetof node, returns the field.
@ Array
An index into an array.
@ Identifier
A field in a dependent type, known only by its name.
@ Base
An implicit indirection through a C++ base class, when the field found is in a base class.
SourceLocation getBeginLoc() const LLVM_READONLY
Kind getKind() const
Determine what kind of offsetof node this is.
SourceLocation getEndLoc() const LLVM_READONLY
CXXBaseSpecifier * getBase() const
For a base class node, returns the base specifier.
OpaqueValueExpr - An expression referring to an opaque object of a fixed type and value class.
Expr * getSourceExpr() const
The source expression of an opaque value expression is the expression which originally generated the ...
SourceLocation getLocation() const
Retrieve the location of this expression.
bool hasExplicitTemplateArgs() const
Determines whether this expression had explicit template arguments.
SourceLocation getLAngleLoc() const
Retrieve the location of the left angle bracket starting the explicit template argument list followin...
const DeclarationNameInfo & getNameInfo() const
Gets the full name info.
SourceLocation getNameLoc() const
Gets the location of the name.
SourceLocation getTemplateKeywordLoc() const
Retrieve the location of the template keyword preceding this name, if any.
NestedNameSpecifierLoc getQualifierLoc() const
Fetches the nested-name qualifier with source-location information, if one was given.
llvm::iterator_range< decls_iterator > decls() const
void copyTemplateArgumentsInto(TemplateArgumentListInfo &List) const
Copies the template arguments into the given structure.
DeclarationName getName() const
Gets the name looked up.
SourceLocation getRAngleLoc() const
Retrieve the location of the right angle bracket ending the explicit template argument list following...
ArrayRef< TemplateArgumentLoc > template_arguments() const
A structure for storing the information associated with an overloaded template name.
Represents a C++11 pack expansion that produces a sequence of expressions.
Expr * getPattern()
Retrieve the pattern of the pack expansion.
UnsignedOrNone getNumExpansions() const
Determine the number of expansions that will be produced when this pack expansion is instantiated,...
SourceLocation getEllipsisLoc() const
Retrieve the location of the ellipsis that describes this pack expansion.
A structure for storing a pack-index-template-name ([temp.names]).
bool isFullySubstituted() const
TemplateName getPattern() const
Expr * getIndexExpr() const
ArrayRef< TemplateName > getExpansions() const
ParenExpr - This represents a parenthesized expression, e.g.
SourceLocation getLParen() const
Get the location of the left parentheses '('.
const Expr * getSubExpr() const
SourceLocation getRParen() const
Get the location of the right parentheses ')'.
ArrayRef< Expr * > exprs() const
static ParenListExpr * Create(const ASTContext &Ctx, SourceLocation LParenLoc, ArrayRef< Expr * > Exprs, SourceLocation RParenLoc)
Create a paren list.
unsigned getNumExprs() const
Return the number of expressions in this paren list.
SourceLocation getLParenLoc() const
SourceLocation getRParenLoc() const
Represents a parameter to a function.
bool isKNRPromoted() const
True if the value passed to this parameter must undergo K&R-style default argument promotion:
unsigned getFunctionScopeIndex() const
Returns the index of this parameter in its prototype or method scope.
void setObjCDeclQualifier(ObjCDeclQualifier QTVal)
void setDefaultArg(Expr *defarg)
SourceLocation getExplicitObjectParamThisLoc() const
void setUnparsedDefaultArg()
Specify that this parameter has an unparsed default argument.
bool hasUnparsedDefaultArg() const
Determines whether this parameter has a default argument that has not yet been parsed.
void setUninstantiatedDefaultArg(Expr *arg)
bool isObjCMethodParameter() const
ObjCDeclQualifier getObjCDeclQualifier() const
void setScopeInfo(unsigned scopeDepth, unsigned parameterIndex)
bool hasUninstantiatedDefaultArg() const
void setObjCMethodScopeInfo(unsigned parameterIndex)
bool hasInheritedDefaultArg() const
void setKNRPromoted(bool promoted)
void setExplicitObjectParameterLoc(SourceLocation Loc)
Expr * getUninstantiatedDefaultArg()
bool hasDefaultArg() const
Determines whether this parameter has a default argument, either parsed or not.
unsigned getFunctionScopeDepth() const
void setHasInheritedDefaultArg(bool I=true)
[C99 6.4.2.2] - A predefined identifier such as func.
SourceLocation getBeginLoc() const
static PredefinedExpr * Create(const ASTContext &Ctx, SourceLocation L, QualType FNTy, PredefinedIdentKind IK, bool IsTransparent, StringLiteral *SL)
Create a PredefinedExpr.
bool isTransparent() const
PredefinedIdentKind getIdentKind() const
StringLiteral * getFunctionName()
Stores the type being destroyed by a pseudo-destructor expression.
PseudoObjectExpr - An expression which accesses a pseudo-object l-value.
unsigned getResultExprIndex() const
Return the index of the result-bearing expression into the semantics expressions, or PseudoObjectExpr...
static PseudoObjectExpr * Create(const ASTContext &Context, Expr *syntactic, ArrayRef< Expr * > semantic, unsigned resultIndex)
ArrayRef< Expr * > semantics()
unsigned getNumSemanticExprs() const
Expr * getSyntacticForm()
Return the syntactic form of this expression, i.e.
A (possibly-)qualified type.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
const Type * getTypePtr() const
Retrieves a pointer to the underlying (unqualified) type.
Qualifiers getLocalQualifiers() const
Retrieve the set of qualifiers local to this particular QualType instance, not including any qualifie...
Represents a template name as written in source code.
NestedNameSpecifier getQualifier() const
Return the nested name specifier that qualifies this name.
TemplateName getUnderlyingTemplate() const
Return the underlying template name.
bool hasTemplateKeyword() const
Whether the template name was prefixed by the "template" keyword.
Represents a struct/union/class.
bool isLambda() const
Determine whether this record is a class describing a lambda function object.
void setAnonymousStructOrUnion(bool Anon)
field_range fields() const
RecordDecl * getMostRecentDecl()
virtual void completeDefinition()
Note that the definition of this type is now complete.
RecordDecl * getDefinition() const
Returns the RecordDecl that actually defines this struct/union/class.
bool isAnonymousStructOrUnion() const
Whether this is an anonymous struct or union.
Provides common interface for the Decls that can be redeclared.
decl_type * getFirstDecl()
Return the first declaration of this declaration or itself if this is the only declaration.
void setPreviousDecl(decl_type *PrevDecl)
Set the previous declaration.
Represents the body of a requires-expression.
C++2a [expr.prim.req]: A requires-expression provides a concise way to express requirements on templa...
SourceLocation getLParenLoc() const
SourceLocation getRParenLoc() const
SourceLocation getRBraceLoc() const
SourceLocation getRequiresKWLoc() const
static RequiresExpr * Create(ASTContext &C, SourceLocation RequiresKWLoc, RequiresExprBodyDecl *Body, SourceLocation LParenLoc, ArrayRef< ParmVarDecl * > LocalParameters, SourceLocation RParenLoc, ArrayRef< concepts::Requirement * > Requirements, SourceLocation RBraceLoc)
RequiresExprBodyDecl * getBody() const
ArrayRef< concepts::Requirement * > getRequirements() const
ArrayRef< ParmVarDecl * > getLocalParameters() const
ReturnStmt - This represents a return, optionally of an expression: return; return 4;.
SourceLocation getReturnLoc() const
const VarDecl * getNRVOCandidate() const
Retrieve the variable that might be used for the named return value optimization.
static ReturnStmt * Create(const ASTContext &Ctx, SourceLocation RL, Expr *E, const VarDecl *NRVOCandidate)
Create a return statement.
Smart pointer class that efficiently represents Objective-C method names.
const IdentifierInfo * getIdentifierInfoForSlot(unsigned argIndex) const
Retrieve the identifier at a given position in the selector.
bool isNull() const
Determine whether this is the empty selector.
unsigned getNumArgs() const
ShuffleVectorExpr - clang-specific builtin-in function __builtin_shufflevector.
Expr ** getSubExprs()
Retrieve the array of expressions.
unsigned getNumSubExprs() const
getNumSubExprs - Return the size of the SubExprs array.
SourceLocation getRParenLoc() const
SourceLocation getBeginLoc() const LLVM_READONLY
Represents an expression that computes the length of a parameter pack.
SourceLocation getPackLoc() const
Determine the location of the parameter pack.
bool isPartiallySubstituted() const
Determine whether this represents a partially-substituted sizeof... expression, such as is produced f...
static SizeOfPackExpr * Create(ASTContext &Context, SourceLocation OperatorLoc, NamedDecl *Pack, SourceLocation PackLoc, SourceLocation RParenLoc, UnsignedOrNone Length=std::nullopt, ArrayRef< TemplateArgument > PartialArgs={})
ArrayRef< TemplateArgument > getPartialArguments() const
Get.
SourceLocation getOperatorLoc() const
Determine the location of the 'sizeof' keyword.
SourceLocation getRParenLoc() const
Determine the location of the right parenthesis.
NamedDecl * getPack() const
Retrieve the parameter pack.
unsigned getPackLength() const
Retrieve the length of the parameter pack.
Represents a function call to one of __builtin_LINE(), __builtin_COLUMN(), __builtin_FUNCTION(),...
SourceLocation getBeginLoc() const
const DeclContext * getParentContext() const
If the SourceLocExpr has been resolved return the subexpression representing the resolved value.
SourceLocation getEndLoc() const
SourceLocIdentKind getIdentKind() const
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
This class handles loading and caching of source files into memory.
FileIDAndOffset getDecomposedLoc(SourceLocation Loc) const
Decompose the specified location into a raw FileID + Offset pair.
FileID getFileID(SourceLocation SpellingLoc) const
Return the FileID for a SourceLocation.
bool isWrittenInBuiltinFile(SourceLocation Loc) const
Returns whether Loc is located in a <built-in> file.
FileID createFileID(FileEntryRef SourceFile, SourceLocation IncludePos, SrcMgr::CharacteristicKind FileCharacter, int LoadedID=0, SourceLocation::UIntTy LoadedOffset=0)
Create a new FileID that represents the specified file being #included from the specified IncludePosi...
SourceLocation getComposedLoc(FileID FID, unsigned Offset) const
Form a SourceLocation from a FileID and Offset pair.
FileManager & getFileManager() const
FileID getMainFileID() const
Returns the FileID of the main source file.
unsigned getFileIDSize(FileID FID) const
The size of the SLocEntry that FID represents.
SourceLocation getLocForStartOfFile(FileID FID) const
Return the source location corresponding to the first byte of the specified file.
SourceLocation createExpansionLoc(SourceLocation SpellingLoc, SourceLocation ExpansionLocStart, SourceLocation ExpansionLocEnd, unsigned Length, bool ExpansionIsTokenRange=true, int LoadedID=0, SourceLocation::UIntTy LoadedOffset=0)
Creates an expansion SLocEntry for a macro use.
const SrcMgr::SLocEntry & getSLocEntry(FileID FID, bool *Invalid=nullptr) const
SourceLocation createMacroArgExpansionLoc(SourceLocation SpellingLoc, SourceLocation ExpansionLoc, unsigned Length)
Creates an expansion SLocEntry for the substitution of an argument into a function-like macro's body.
A trivial tuple used to represent a source range.
SourceLocation getEnd() const
SourceLocation getBegin() const
One instance of this struct is kept for every file loaded or used.
Each ExpansionInfo encodes the expansion location - where the token was ultimately expanded,...
SourceLocation getExpansionLocStart() const
bool isExpansionTokenRange() const
SourceLocation getSpellingLoc() const
bool isMacroArgExpansion() const
SourceLocation getExpansionLocEnd() const
const ContentCache & getContentCache() const
CharacteristicKind getFileCharacteristic() const
Return whether this is a system header or not.
SourceLocation getIncludeLoc() const
This is a discriminated union of FileInfo and ExpansionInfo.
const FileInfo & getFile() const
const ExpansionInfo & getExpansion() const
Represents a C++11 static_assert declaration.
SourceLocation getRParenLoc() const
StmtExpr - This is the GNU Statement Expression extension: ({int X=4; X;}).
CompoundStmt * getSubStmt()
unsigned getTemplateDepth() const
SourceLocation getRParenLoc() const
SourceLocation getLParenLoc() const
StmtVisitor - This class implements a simple visitor for Stmt subclasses.
Stmt - This represents one statement.
StmtClass getStmtClass() const
const char * getStmtClassName() const
SourceLocation getBeginLoc() const LLVM_READONLY
StringLiteral - This represents a string literal expression, e.g.
tokloc_iterator tokloc_begin() const
tokloc_iterator tokloc_end() const
StringLiteralKind getKind() const
static StringLiteral * Create(const ASTContext &Ctx, StringRef Str, StringLiteralKind Kind, bool Pascal, QualType Ty, ArrayRef< SourceLocation > Locs)
This is the "fully general" constructor that allows representation of strings formed from one or more...
StringRef getBytes() const
Allow access to clients that need the byte representation, such as ASTWriterStmt::VisitStringLiteral(...
unsigned getNumConcatenated() const
Get the number of string literal tokens that were concatenated in translation phase #6 to form this s...
Represents a reference to a non-type template parameter that has been substituted with a template arg...
Decl * getAssociatedDecl() const
A template-like entity which owns the whole pattern being substituted.
UnsignedOrNone getPackIndex() const
QualType getParameterType() const
Determine the substituted type of the template parameter.
unsigned getIndex() const
Returns the index of the replaced parameter in the associated declaration.
SourceLocation getNameLoc() const
Expr * getReplacement() const
Represents a reference to a non-type template parameter pack that has been substituted with a non-tem...
TemplateArgument getArgumentPack() const
Retrieve the template argument pack containing the substituted template arguments.
SourceLocation getParameterPackLocation() const
Retrieve the location of the parameter pack name.
Decl * getAssociatedDecl() const
A template-like entity which owns the whole pattern being substituted.
unsigned getIndex() const
Returns the index of the replaced parameter in the associated declaration.
A structure for storing an already-substituted template template parameter pack.
Decl * getAssociatedDecl() const
A template-like entity which owns the whole pattern being substituted.
TemplateArgument getArgumentPack() const
Retrieve the template template argument pack with which this parameter was substituted.
unsigned getIndex() const
Returns the index of the replaced parameter in the associated declaration.
A structure for storing the information associated with a substituted template template parameter.
TemplateName getReplacement() const
UnsignedOrNone getPackIndex() const
unsigned getIndex() const
Returns the index of the replaced parameter in the associated declaration.
Decl * getAssociatedDecl() const
A template-like entity which owns the whole pattern being substituted.
void setNextSwitchCase(SwitchCase *SC)
SourceLocation getColonLoc() const
const SwitchCase * getNextSwitchCase() const
SwitchStmt - This represents a 'switch' stmt.
SourceLocation getSwitchLoc() const
SourceLocation getLParenLoc() const
SourceLocation getRParenLoc() const
static SwitchStmt * Create(const ASTContext &Ctx, Stmt *Init, VarDecl *Var, Expr *Cond, SourceLocation LParenLoc, SourceLocation RParenLoc)
Create a switch statement.
VarDecl * getConditionVariable()
Retrieve the variable declared in this "switch" statement, if any.
SwitchCase * getSwitchCaseList()
Represents the declaration of a struct/union/class/enum.
SourceRange getBraceRange() const
bool isBeingDefined() const
Return true if this decl is currently being defined.
TagDecl * getDefinition() const
Returns the TagDecl that actually defines this struct/union/class/enum.
bool isThisDeclarationADefinition() const
Return true if this declaration is a completion definition of the type.
bool isCompleteDefinition() const
Return true if this decl has its body fully specified.
NestedNameSpecifierLoc getQualifierLoc() const
Retrieve the nested-name-specifier (with source-location information) that qualifies the name of this...
TypedefNameDecl * getTypedefNameForAnonDecl() const
void startDefinition()
Starts the definition of this tag declaration.
void setTypedefNameForAnonDecl(TypedefNameDecl *TDD)
void setQualifierInfo(NestedNameSpecifierLoc QualifierLoc)
TagKind getTagKind() const
void setBraceRange(SourceRange R)
void setCompleteDefinition(bool V=true)
True if this decl has its body fully specified.
A convenient class for passing around template argument information.
SourceLocation getRAngleLoc() const
void addArgument(const TemplateArgumentLoc &Loc)
ArrayRef< TemplateArgumentLoc > arguments() const
SourceLocation getLAngleLoc() const
A template argument list.
static TemplateArgumentList * CreateCopy(ASTContext &Context, ArrayRef< TemplateArgument > Args)
Create a new template argument list that copies the given set of template arguments.
unsigned size() const
Retrieve the number of template arguments in this template argument list.
ArrayRef< TemplateArgument > asArray() const
Produce this as an array ref.
Location wrapper for a TemplateArgument.
TemplateArgumentLocInfo getLocInfo() const
const TemplateArgument & getArgument() const
NestedNameSpecifierLoc getTemplateQualifierLoc() const
Represents a template argument.
QualType getStructuralValueType() const
Get the type of a StructuralValue.
QualType getParamTypeForDecl() const
Expr * getAsExpr() const
Retrieve the template argument as an expression.
UnsignedOrNone getNumTemplateExpansions() const
Retrieve the number of expansions that a template template argument expansion will produce,...
QualType getAsType() const
Retrieve the type for a type template argument.
QualType getNullPtrType() const
Retrieve the type for null non-type template argument.
TemplateName getAsTemplate() const
Retrieve the template name for a template name argument.
unsigned pack_size() const
The number of template arguments in the given template argument pack.
QualType getIntegralType() const
Retrieve the type of the integral value.
bool getIsDefaulted() const
If returns 'true', this TemplateArgument corresponds to a default template parameter.
ValueDecl * getAsDecl() const
Retrieve the declaration for a declaration non-type template argument.
ArrayRef< TemplateArgument > pack_elements() const
Iterator range referencing all of the elements of a template argument pack.
@ Declaration
The template argument is a declaration that was provided for a pointer, reference,...
@ Template
The template argument is a template name that was provided for a template template parameter.
@ StructuralValue
The template argument is a non-type template argument that can't be represented by the special-case D...
@ Pack
The template argument is actually a parameter pack.
@ TemplateExpansion
The template argument is a pack expansion of a template name that was provided for a template templat...
@ NullPtr
The template argument is a null pointer or null pointer to member that was provided for a non-type te...
@ Type
The template argument is a type.
@ Null
Represents an empty template argument, e.g., one that has not been deduced.
@ Integral
The template argument is an integral value stored in an llvm::APSInt that was provided for an integra...
@ Expression
The template argument is an expression, and we've not resolved it to one of the other forms yet,...
ArgKind getKind() const
Return the kind of stored template argument.
bool isCanonicalExpr() const
TemplateName getAsTemplateOrTemplatePattern() const
Retrieve the template argument as a template name; if the argument is a pack expansion,...
const APValue & getAsStructuralValue() const
Get the value of a StructuralValue.
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
Represents a C++ template name within the type system.
TemplateDecl * getAsTemplateDecl(bool IgnoreDeduced=false) const
Retrieve the underlying template declaration that this template name refers to, if known.
bool isNull() const
Determine whether this template name is NULL.
DependentTemplateName * getAsDependentTemplateName() const
Retrieve the underlying dependent template name structure, if any.
QualifiedTemplateName * getAsQualifiedTemplateName() const
Retrieve the underlying qualified template name structure, if any.
OverloadedTemplateStorage * getAsOverloadedTemplate() const
Retrieve the underlying, overloaded function template declarations that this template name refers to,...
AssumedTemplateStorage * getAsAssumedTemplateName() const
Retrieve information on a name that has been assumed to be a template-name in order to permit a call ...
@ UsingTemplate
A template name that refers to a template declaration found through a specific using shadow declarati...
@ OverloadedTemplate
A set of overloaded template declarations.
@ PackIndexingTemplate
A pack-index-template-name.
@ Template
A single template declaration.
@ DependentTemplate
A dependent template name that has not been resolved to a template (or set of templates).
@ SubstTemplateTemplateParm
A template template parameter that has been substituted for some other template name.
@ SubstTemplateTemplateParmPack
A template template parameter pack that has been substituted for a template template argument pack,...
@ DeducedTemplate
A template name that refers to another TemplateName with deduced default arguments.
@ QualifiedTemplate
A qualified template name, where the qualification is kept to describe the source code as written.
@ AssumedTemplate
An unqualified-id that has been assumed to name a function template that will be found by ADL.
UsingShadowDecl * getAsUsingShadowDecl() const
Retrieve the using shadow declaration through which the underlying template declaration is introduced...
SubstTemplateTemplateParmPackStorage * getAsSubstTemplateTemplateParmPack() const
Retrieve the substituted template template parameter pack, if known.
SubstTemplateTemplateParmStorage * getAsSubstTemplateTemplateParm() const
Retrieve the substituted template template parameter, if known.
PackIndexingTemplateStorage * getAsPackIndexingTemplate() const
Retrieve the pack-index-template-name storage, if any.
A template parameter object.
const APValue & getValue() const
Stores a list of template parameters for a TemplateDecl and its derived classes.
NamedDecl * getParam(unsigned Idx)
static TemplateParameterList * Create(const ASTContext &C, SourceLocation TemplateLoc, SourceLocation LAngleLoc, ArrayRef< NamedDecl * > Params, SourceLocation RAngleLoc, Expr *RequiresClause)
Expr * getRequiresClause()
The constraint-expression of the associated requires-clause.
SourceLocation getRAngleLoc() const
SourceLocation getLAngleLoc() const
SourceLocation getTemplateLoc() const
TemplateTemplateParmDecl - Declares a template template parameter, e.g., "T" in.
bool wasDeclaredWithTypename() const
Whether this template template parameter was declared with the 'typename' keyword.
TemplateNameKind templateParameterKind() const
unsigned getPosition() const
Get the position of the template parameter within its parameter list.
bool isParameterPack() const
Whether this template template parameter is a template parameter pack.
unsigned getDepth() const
Get the nesting depth of the template parameter.
Declaration of a template type parameter.
bool wasDeclaredWithTypename() const
Whether this template type parameter was declared with the 'typename' keyword.
unsigned getIndex() const
Retrieve the index of the template parameter.
void setTypeConstraint(ConceptReference *CR, Expr *ImmediatelyDeclaredConstraint, UnsignedOrNone ArgPackSubstIndex)
bool hasTypeConstraint() const
Determine whether this template parameter has a type-constraint.
const TypeConstraint * getTypeConstraint() const
Returns the type constraint associated with this template parameter (if any).
bool isParameterPack() const
Returns whether this is a parameter pack.
unsigned getDepth() const
Retrieve the depth of the template parameter.
The top declaration context.
Represents the declaration of a typedef-name via a C++11 alias-declaration.
TypeAliasTemplateDecl * getDescribedAliasTemplate() const
Declaration of an alias template.
TypeAliasDecl * getTemplatedDecl() const
Get the underlying function declaration of the template.
Models the abbreviated syntax to constrain a template type parameter: template <convertible_to<string...
SourceLocation getBeginLoc() const LLVM_READONLY
Symbolic representation of typeid(T) for some type T.
const Type * getType() const
SourceLocation getBeginLoc() const
Get the begin source location.
A container of type source information.
TypeLoc getTypeLoc() const
Return the TypeLoc wrapper for the type source info.
QualType getType() const
Return the type wrapped by this type source info.
A type trait used in the implementation of various C++11 and Library TR1 trait templates.
bool getBoolValue() const
ArrayRef< TypeSourceInfo * > getArgs() const
Retrieve the argument types.
static TypeTraitExpr * Create(const ASTContext &C, QualType T, SourceLocation Loc, TypeTrait Kind, ArrayRef< TypeSourceInfo * > Args, SourceLocation RParenLoc, bool Value)
Create a new type trait expression.
SourceLocation getEndLoc() const LLVM_READONLY
unsigned getNumArgs() const
Determine the number of arguments to this type trait.
TypeTrait getTrait() const
Determine which type trait this expression uses.
SourceLocation getBeginLoc() const LLVM_READONLY
const APValue & getAPValue() const
bool isStoredAsBoolean() const
ExpectedType Visit(const Type *T)
The base class of the type hierarchy.
RecordDecl * getAsRecordDecl() const
Retrieves the RecordDecl this type refers to.
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
const Type * getBaseElementTypeUnsafe() const
Get the base element type of this type, potentially discarding type qualifiers.
bool isIncompleteType(NamedDecl **Def=nullptr) const
Types are partitioned into 3 broad categories (C99 6.2.5p1): object types, function types,...
bool isCanonicalUnqualified() const
Determines if this type would be canonical if it had no further qualification.
const T * getAs() const
Member-template getAs<specific type>'.
bool isRecordType() const
Represents the declaration of a typedef-name via the 'typedef' type specifier.
Base class for declarations which introduce a typedef-name.
TypeSourceInfo * getTypeSourceInfo() const
QualType getUnderlyingType() const
UnaryExprOrTypeTraitExpr - expression with either a type or (unevaluated) expression operand.
SourceLocation getRParenLoc() const
SourceLocation getOperatorLoc() const
bool isArgumentType() const
TypeSourceInfo * getArgumentTypeInfo() const
UnaryExprOrTypeTrait getKind() const
UnaryOperator - This represents the unary-expression's (except sizeof and alignof),...
SourceLocation getOperatorLoc() const
getOperatorLoc - Return the location of the operator.
Expr * getSubExpr() const
bool hasStoredFPFeatures() const
Is FPFeatures in Trailing Storage?
FPOptionsOverride getStoredFPFeatures() const
Get FPFeatures from trailing storage.
static UnaryOperator * CreateEmpty(const ASTContext &C, bool hasFPFeatures)
bool canOverflow() const
Returns true if the unary operator can cause an overflow.
A reference to a name which we were able to look up during parsing but could not resolve to a specifi...
CXXRecordDecl * getNamingClass()
Gets the 'naming class' (in the sense of C++0x [class.access.base]p5) of the lookup.
bool requiresADL() const
True if this declaration should be extended by argument-dependent lookup.
static UnresolvedLookupExpr * Create(const ASTContext &Context, CXXRecordDecl *NamingClass, NestedNameSpecifierLoc QualifierLoc, const DeclarationNameInfo &NameInfo, bool RequiresADL, UnresolvedSetIterator Begin, UnresolvedSetIterator End, bool KnownDependent, bool KnownInstantiationDependent)
Represents a C++ member access expression for which lookup produced a set of overloaded functions.
bool isArrow() const
Determine whether this member expression used the '->' operator; otherwise, it used the '.
SourceLocation getOperatorLoc() const
Retrieve the location of the '->' or '.' operator.
bool hasUnresolvedUsing() const
Determine whether the lookup results contain an unresolved using declaration.
Expr * getBase()
Retrieve the base object of this member expressions, e.g., the x in x.m.
static UnresolvedMemberExpr * Create(const ASTContext &Context, bool HasUnresolvedUsing, Expr *Base, QualType BaseType, bool IsArrow, SourceLocation OperatorLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc, const DeclarationNameInfo &MemberNameInfo, const TemplateArgumentListInfo *TemplateArgs, UnresolvedSetIterator Begin, UnresolvedSetIterator End)
bool isImplicitAccess() const
True if this is an implicit access, i.e., one in which the member being accessed was not written in t...
void addDecl(NamedDecl *D)
A set of unresolved declarations.
Represents a dependent using declaration which was marked with typename.
SourceLocation getTypenameLoc() const
Returns the source location of the 'typename' keyword.
NestedNameSpecifierLoc getQualifierLoc() const
Retrieve the nested-name-specifier that qualifies the name, with source-location information.
SourceLocation getUsingLoc() const
Returns the source location of the 'using' keyword.
SourceLocation getEllipsisLoc() const
Get the location of the ellipsis if this is a pack expansion.
Represents a dependent using declaration which was not marked with typename.
SourceLocation getUsingLoc() const
Returns the source location of the 'using' keyword.
NestedNameSpecifierLoc getQualifierLoc() const
Retrieve the nested-name-specifier that qualifies the name, with source-location information.
DeclarationNameInfo getNameInfo() const
SourceLocation getEllipsisLoc() const
Get the location of the ellipsis if this is a pack expansion.
Represents a C++ using-declaration.
bool hasTypename() const
Return true if the using declaration has 'typename'.
NestedNameSpecifierLoc getQualifierLoc() const
Retrieve the nested-name-specifier that qualifies the name, with source-location information.
DeclarationNameInfo getNameInfo() const
SourceLocation getUsingLoc() const
Return the source location of the 'using' keyword.
Represents C++ using-directive.
SourceLocation getUsingLoc() const
Return the location of the using keyword.
NamespaceDecl * getNominatedNamespace()
Returns the namespace nominated by this using-directive.
DeclContext * getCommonAncestor()
Returns the common ancestor context of this using-directive and its nominated namespace.
SourceLocation getNamespaceKeyLocation() const
Returns the location of the namespace keyword.
SourceLocation getIdentLocation() const
Returns the location of this using declaration's identifier.
NestedNameSpecifierLoc getQualifierLoc() const
Retrieve the nested-name-specifier that qualifies the name of the namespace, with source-location inf...
Represents a C++ using-enum-declaration.
SourceLocation getEnumLoc() const
The source location of the 'enum' keyword.
TypeSourceInfo * getEnumType() const
SourceLocation getUsingLoc() const
The source location of the 'using' keyword.
Represents a pack of using declarations that a single using-declarator pack-expanded into.
NamedDecl * getInstantiatedFromUsingDecl() const
Get the using declaration from which this was instantiated.
ArrayRef< NamedDecl * > expansions() const
Get the set of using declarations that this pack expanded into.
Represents a shadow declaration implicitly introduced into a scope by a (resolved) using-declaration ...
NamedDecl * getTargetDecl() const
Gets the underlying declaration which has been brought into the local scope.
BaseUsingDecl * getIntroducer() const
Gets the (written or instantiated) using declaration that introduced this declaration.
Represents a call to the builtin function __builtin_va_arg.
TypeSourceInfo * getWrittenTypeInfo() const
SourceLocation getBuiltinLoc() const
SourceLocation getRParenLoc() const
VarArgKind getVarargABI() const
const Expr * getSubExpr() const
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
void setType(QualType newType)
Represents a variable declaration or definition.
VarTemplateDecl * getDescribedVarTemplate() const
Retrieves the variable template that is described by this variable declaration.
bool isConstexpr() const
Whether this variable is (C++11) constexpr.
void setInstantiationOfStaticDataMember(VarDecl *VD, TemplateSpecializationKind TSK)
Specify that this variable is an instantiation of the static data member VD.
VarDecl * getMostRecentDecl()
Returns the most recent (re)declaration of this declaration.
DefinitionKind isThisDeclarationADefinition(ASTContext &) const
Check whether this declaration is a definition.
bool isInlineSpecified() const
VarDecl * getDefinition(ASTContext &)
Get the real (not just tentative) definition for this declaration.
EvaluatedStmt * getEvaluatedStmt() const
EvaluatedStmt * ensureEvaluatedStmt() const
Convert the initializer for this declaration to the elaborated EvaluatedStmt form,...
void setInlineSpecified()
VarDecl * getInstantiatedFromStaticDataMember() const
If this variable is an instantiated static data member of a class template specialization,...
bool isFileVarDecl() const
Returns true for file scoped variable declaration.
void setTSCSpec(ThreadStorageClassSpecifier TSC)
bool isInline() const
Whether this variable is (C++1z) inline.
ThreadStorageClassSpecifier getTSCSpec() const
const Expr * getInit() const
void setConstexpr(bool IC)
void setDescribedVarTemplate(VarTemplateDecl *Template)
StorageClass getStorageClass() const
Returns the storage class as written in the source.
void setImplicitlyInline()
VarDecl * getPreviousDecl()
Return the previous declaration of this declaration or NULL if this is the first declaration.
const Expr * getAnyInitializer() const
Get the initializer for this variable, no matter which declaration it is attached to.
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this variable is an instantiation of a static data member of a class template specialization,...
Declaration of a variable template.
VarDecl * getTemplatedDecl() const
Get the underlying variable declarations of the template.
bool isThisDeclarationADefinition() const
Returns whether this template declaration defines the primary variable pattern.
VarTemplateDecl * getMostRecentDecl()
Represents a variable template specialization, which refers to a variable template with a given set o...
SourceLocation getPointOfInstantiation() const
Get the point of instantiation (if any), or null if none.
void setTemplateArgsAsWritten(const ASTTemplateArgumentListInfo *ArgsWritten)
Set the template argument list as written in the sources.
const ASTTemplateArgumentListInfo * getTemplateArgsAsWritten() const
Retrieve the template argument list as written in the sources, if any.
void setSpecializationKind(TemplateSpecializationKind TSK)
const TemplateArgumentList & getTemplateArgs() const
Retrieve the template arguments of the variable template specialization.
void setPointOfInstantiation(SourceLocation Loc)
TemplateSpecializationKind getSpecializationKind() const
Determine the kind of specialization that this declaration represents.
VarTemplateDecl * getSpecializedTemplate() const
Retrieve the template that this specialization specializes.
VarTemplateSpecializationDecl * getMostRecentDecl()
WhileStmt - This represents a 'while' stmt.
SourceLocation getWhileLoc() const
SourceLocation getRParenLoc() const
VarDecl * getConditionVariable()
Retrieve the variable declared in this "while" statement, if any.
SourceLocation getLParenLoc() const
static WhileStmt * Create(const ASTContext &Ctx, VarDecl *Var, Expr *Cond, Stmt *Body, SourceLocation WL, SourceLocation LParenLoc, SourceLocation RParenLoc)
Create a while statement.
A requires-expression requirement which queries the validity and properties of an expression ('simple...
SubstitutionDiagnostic * getExprSubstitutionDiagnostic() const
ConceptSpecializationExpr * getReturnTypeRequirementSubstitutedConstraintExpr() const
const ReturnTypeRequirement & getReturnTypeRequirement() const
SatisfactionStatus getSatisfactionStatus() const
SourceLocation getNoexceptLoc() const
A requires-expression requirement which is satisfied when a general constraint expression is satisfie...
const ASTConstraintSatisfaction & getConstraintSatisfaction() const
bool hasInvalidConstraint() const
Expr * getConstraintExpr() const
StringRef getInvalidConstraintEntity()
A static requirement that can be used in a requires-expression to check properties of types and expre...
RequirementKind getKind() const
A requires-expression requirement which queries the existence of a type name or type template special...
bool isSubstitutionFailure() const
SubstitutionDiagnostic * getSubstitutionDiagnostic() const
TypeSourceInfo * getType() const
Top level wrappers for InstallAPI frontend operations.
CanQual< Type > CanQualType
Represents a canonical, potentially-qualified type.
bool isa(CodeGen::Address addr)
llvm::Expected< SourceLocation > ExpectedSLoc
StructuralEquivalenceKind
Whether to perform a normal or minimal equivalence check.
llvm::Expected< const Type * > ExpectedTypePtr
CanThrowResult
Possible results from evaluation of a noexcept expression.
@ TemplateName
The identifier is a template name. FIXME: Add an annotation for that.
ExprObjectKind
A further classification of the kind of object referenced by an l-value or x-value.
std::pair< FileID, unsigned > FileIDAndOffset
llvm::Expected< DeclarationName > ExpectedName
llvm::Expected< Decl * > ExpectedDecl
@ Property
The type of a property.
@ Result
The result type of a method or function.
OptionalUnsigned< unsigned > UnsignedOrNone
const FunctionProtoType * T
llvm::Expected< QualType > ExpectedType
@ Template
We are parsing a template declaration.
static OMPLinearClause * Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc, OpenMPLinearClauseKind Modifier, SourceLocation ModifierLoc, SourceLocation ColonLoc, SourceLocation StepModifierLoc, SourceLocation EndLoc, ArrayRef< Expr * > VL, ArrayRef< Expr * > PL, ArrayRef< Expr * > IL, Expr *Step, Expr *CalcStep, Stmt *PreInit, Expr *PostUpdate)
Creates clause with a list of variables VL and a linear step Step.
@ VarTemplate
The name was classified as a variable template name.
std::pair< SourceLocation, StringRef > ConstraintSubstitutionDiagnostic
Unsatisfied constraint expressions if the template arguments could be substituted into them,...
CastKind
CastKind - The kind of operation required for a conversion.
ExprValueKind
The categorization of expression values, currently following the C++11 scheme.
llvm::SmallVector< Decl *, 2 > getCanonicalForwardRedeclChain(Decl *D)
SmallVector< CXXBaseSpecifier *, 4 > CXXCastPath
A simple array of base specifiers.
llvm::Expected< Expr * > ExpectedExpr
bool declaresSameEntity(const Decl *D1, const Decl *D2)
Determine whether two declarations declare the same entity.
TemplateSpecializationKind
Describes the kind of template specialization that a particular template specialization declaration r...
U cast(CodeGen::Address addr)
llvm::Expected< Stmt * > ExpectedStmt
static void updateFlags(const Decl *From, Decl *To)
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