57#include "llvm/ADT/ArrayRef.h"
58#include "llvm/ADT/DenseMap.h"
59#include "llvm/ADT/STLExtras.h"
60#include "llvm/ADT/ScopeExit.h"
61#include "llvm/ADT/SmallVector.h"
62#include "llvm/Support/ErrorHandling.h"
63#include "llvm/Support/MemoryBuffer.h"
74 using llvm::make_error;
89 return "NameConflict";
91 return "UnsupportedConstruct";
93 return "Unknown error";
95 llvm_unreachable(
"Invalid error code.");
96 return "Invalid error code.";
102 llvm_unreachable(
"Function not implemented.");
113 Redecls.push_back(R);
116 std::reverse(Redecls.begin(), Redecls.end());
121 if (
auto *FD = dyn_cast<FunctionDecl>(D))
123 if (
auto *VD = dyn_cast<VarDecl>(D))
125 if (
auto *TD = dyn_cast<TagDecl>(D))
127 llvm_unreachable(
"Bad declaration kind");
148 bool const IgnoreChildErrors;
152 : FromDC(FromDC), IgnoreChildErrors(!
isa<
TagDecl>(FromDC)) {}
162 if (ChildErr && !IgnoreChildErrors)
163 ResultErr = joinErrors(std::move(ResultErr), std::move(ChildErr));
165 consumeError(std::move(ChildErr));
171 if (!IgnoreChildErrors || !FromDC)
173 return FromDC->containsDecl(FromChildD);
179 public StmtVisitor<ASTNodeImporter, ExpectedStmt> {
183 template <
typename ImportT>
184 [[nodiscard]]
Error importInto(ImportT &To,
const ImportT &From) {
185 return Importer.importInto(To, From);
189 template <
typename ImportT>
190 [[nodiscard]]
Error importInto(ImportT *&To, ImportT *From) {
191 auto ToOrErr = Importer.Import(From);
193 To = cast_or_null<ImportT>(*ToOrErr);
194 return ToOrErr.takeError();
199 template <
typename T>
203 auto ToOrErr = Importer.Import(From);
205 return ToOrErr.takeError();
206 return cast_or_null<T>(*ToOrErr);
209 template <
typename T>
210 auto import(
const T *From) {
211 return import(
const_cast<T *
>(From));
215 template <
typename T>
217 return Importer.Import(From);
221 template <
typename T>
225 return import(*From);
232 template <
typename ToDeclT>
struct CallOverloadedCreateFun {
233 template <
typename... Args>
decltype(
auto)
operator()(Args &&... args) {
234 return ToDeclT::Create(std::forward<Args>(args)...);
244 template <
typename ToDeclT,
typename FromDeclT,
typename... Args>
245 [[nodiscard]]
bool GetImportedOrCreateDecl(ToDeclT *&ToD, FromDeclT *FromD,
250 CallOverloadedCreateFun<ToDeclT> OC;
251 return GetImportedOrCreateSpecialDecl(ToD, OC, FromD,
252 std::forward<Args>(args)...);
259 template <
typename NewDeclT,
typename ToDeclT,
typename FromDeclT,
261 [[nodiscard]]
bool GetImportedOrCreateDecl(ToDeclT *&ToD, FromDeclT *FromD,
263 CallOverloadedCreateFun<NewDeclT> OC;
264 return GetImportedOrCreateSpecialDecl(ToD, OC, FromD,
265 std::forward<Args>(args)...);
269 template <
typename ToDeclT,
typename CreateFunT,
typename FromDeclT,
272 GetImportedOrCreateSpecialDecl(ToDeclT *&ToD, CreateFunT CreateFun,
273 FromDeclT *FromD, Args &&...args) {
274 if (Importer.getImportDeclErrorIfAny(FromD)) {
278 ToD = cast_or_null<ToDeclT>(Importer.GetAlreadyImportedOrNull(FromD));
281 ToD = CreateFun(std::forward<Args>(args)...);
283 Importer.RegisterImportedDecl(FromD, ToD);
284 Importer.SharedState->markAsNewDecl(ToD);
285 InitializeImportedDecl(FromD, ToD);
289 void InitializeImportedDecl(
Decl *FromD,
Decl *ToD) {
293 if (FromD->isImplicit())
307 void addDeclToContexts(
Decl *FromD,
Decl *ToD) {
308 if (Importer.isMinimalImport()) {
312 if (!FromD->getDescribedTemplate() &&
319 DeclContext *FromLexicalDC = FromD->getLexicalDeclContext();
323 bool Visible =
false;
336 if (
auto *FromNamed = dyn_cast<NamedDecl>(FromD)) {
339 FromDC->
lookup(FromNamed->getDeclName());
340 if (llvm::is_contained(FromLookup, FromNamed))
353 LT->update(TP, OldDC);
357 updateLookupTableForTemplateParameters(
358 Params, Importer.getToContext().getTranslationUnitDecl());
361 template <
typename TemplateParmDeclT>
362 Error importTemplateParameterDefaultArgument(
const TemplateParmDeclT *D,
363 TemplateParmDeclT *ToD) {
364 if (D->hasDefaultArgument()) {
365 if (D->defaultArgumentWasInherited()) {
367 import(D->getDefaultArgStorage().getInheritedFrom());
368 if (!ToInheritedFromOrErr)
369 return ToInheritedFromOrErr.takeError();
370 TemplateParmDeclT *ToInheritedFrom = *ToInheritedFromOrErr;
371 if (!ToInheritedFrom->hasDefaultArgument()) {
375 import(D->getDefaultArgStorage()
377 ->getDefaultArgument());
378 if (!ToInheritedDefaultArgOrErr)
379 return ToInheritedDefaultArgOrErr.takeError();
380 ToInheritedFrom->setDefaultArgument(Importer.getToContext(),
381 *ToInheritedDefaultArgOrErr);
383 ToD->setInheritedDefaultArgument(ToD->getASTContext(),
387 import(D->getDefaultArgument());
388 if (!ToDefaultArgOrErr)
389 return ToDefaultArgOrErr.takeError();
392 if (!ToD->hasDefaultArgument())
393 ToD->setDefaultArgument(Importer.getToContext(),
397 return Error::success();
409#define TYPE(Class, Base) \
410 ExpectedType Visit##Class##Type(const Class##Type *T);
411#include "clang/AST/TypeNodes.inc"
448 (IDK ==
IDK_Default && !Importer.isMinimalImport());
469 template <
typename InContainerTy>
473 template<
typename InContainerTy>
480 std::tuple<FunctionTemplateDecl *, TemplateArgsTy>;
485 template <
typename DeclTy>
509 template <
typename T>
513 bool IgnoreTemplateParmDepth =
false);
716 Err = MaybeVal.takeError();
722 template<
typename IIter,
typename OIter>
724 using ItemT = std::remove_reference_t<
decltype(*Obegin)>;
725 for (; Ibegin != Iend; ++Ibegin, ++Obegin) {
728 return ToOrErr.takeError();
731 return Error::success();
738 template<
typename InContainerTy,
typename OutContainerTy>
740 const InContainerTy &InContainer, OutContainerTy &OutContainer) {
742 InContainer.begin(), InContainer.end(), OutContainer.begin());
745 template<
typename InContainerTy,
typename OIter>
762template <
typename InContainerTy>
766 auto ToLAngleLocOrErr =
import(FromLAngleLoc);
767 if (!ToLAngleLocOrErr)
768 return ToLAngleLocOrErr.takeError();
769 auto ToRAngleLocOrErr =
import(FromRAngleLoc);
770 if (!ToRAngleLocOrErr)
771 return ToRAngleLocOrErr.takeError();
776 Result = std::move(ToTAInfo);
777 return Error::success();
793 From.LAngleLoc, From.RAngleLoc, From.arguments(),
Result);
805 if (
Error Err = importInto(std::get<0>(
Result), FTSInfo->getTemplate()))
806 return std::move(Err);
811 return std::move(Err);
821 return std::move(Err);
824 if (!ToRequiresClause)
825 return ToRequiresClause.takeError();
828 if (!ToTemplateLocOrErr)
829 return ToTemplateLocOrErr.takeError();
831 if (!ToLAngleLocOrErr)
832 return ToLAngleLocOrErr.takeError();
834 if (!ToRAngleLocOrErr)
835 return ToRAngleLocOrErr.takeError();
838 Importer.getToContext(),
856 return ToTypeOrErr.takeError();
864 return ToTypeOrErr.takeError();
871 return ToOrErr.takeError();
874 return ToTypeOrErr.takeError();
875 return TemplateArgument(dyn_cast<ValueDecl>((*ToOrErr)->getCanonicalDecl()),
882 return ToTypeOrErr.takeError();
890 return ToTypeOrErr.takeError();
893 return ToValueOrErr.takeError();
900 if (!ToTemplateOrErr)
901 return ToTemplateOrErr.takeError();
909 if (!ToTemplateOrErr)
910 return ToTemplateOrErr.takeError();
921 return ToExpr.takeError();
927 return std::move(Err);
933 llvm_unreachable(
"Invalid template argument kind");
941 return ArgOrErr.takeError();
950 return E.takeError();
956 return TSIOrErr.takeError();
959 if (!ToTemplateKWLocOrErr)
960 return ToTemplateKWLocOrErr.takeError();
962 if (!ToTemplateQualifierLocOrErr)
963 return ToTemplateQualifierLocOrErr.takeError();
965 if (!ToTemplateNameLocOrErr)
966 return ToTemplateNameLocOrErr.takeError();
967 auto ToTemplateEllipsisLocOrErr =
969 if (!ToTemplateEllipsisLocOrErr)
970 return ToTemplateEllipsisLocOrErr.takeError();
972 Importer.getToContext(), *ToTemplateKWLocOrErr,
973 *ToTemplateQualifierLocOrErr, *ToTemplateNameLocOrErr,
974 *ToTemplateEllipsisLocOrErr);
984 size_t NumDecls = DG.
end() - DG.
begin();
986 ToDecls.reserve(NumDecls);
987 for (
Decl *FromD : DG) {
988 if (
auto ToDOrErr =
import(FromD))
989 ToDecls.push_back(*ToDOrErr);
991 return ToDOrErr.takeError();
1006 return ToDotLocOrErr.takeError();
1009 if (!ToFieldLocOrErr)
1010 return ToFieldLocOrErr.takeError();
1013 ToFieldName, *ToDotLocOrErr, *ToFieldLocOrErr);
1017 if (!ToLBracketLocOrErr)
1018 return ToLBracketLocOrErr.takeError();
1021 if (!ToRBracketLocOrErr)
1022 return ToRBracketLocOrErr.takeError();
1026 *ToLBracketLocOrErr,
1027 *ToRBracketLocOrErr);
1030 if (!ToEllipsisLocOrErr)
1031 return ToEllipsisLocOrErr.takeError();
1035 D.
getArrayIndex(), *ToLBracketLocOrErr, *ToEllipsisLocOrErr,
1036 *ToRBracketLocOrErr);
1041 Error Err = Error::success();
1044 auto ToConceptNameLoc =
1050 return std::move(Err);
1053 if (ASTTemplateArgs)
1055 return std::move(Err);
1057 Importer.getToContext(), ToNNS, ToTemplateKWLoc,
1061 Importer.getToContext(), ToTAInfo)
1067 char *ToStore =
new (Importer.getToContext())
char[FromStr.size()];
1068 std::copy(FromStr.begin(), FromStr.end(), ToStore);
1069 return StringRef(ToStore, FromStr.size());
1081 return ToSecondExpr.takeError();
1082 ToSat.
Details.emplace_back(ToSecondExpr.get());
1086 return ToCROrErr.takeError();
1087 ToSat.
Details.emplace_back(ToCROrErr.get());
1094 return ToPairFirst.takeError();
1096 ToSat.
Details.emplace_back(
new (Importer.getToContext())
1098 ToPairFirst.get(), ToPairSecond});
1102 return Error::success();
1107ASTNodeImporter::import(
1112 return ToLoc.takeError();
1114 return new (Importer.getToContext())
1126 return DiagOrErr.takeError();
1127 return new (Importer.getToContext()) TypeRequirement(*DiagOrErr);
1131 return ToType.takeError();
1132 return new (Importer.getToContext()) TypeRequirement(*ToType);
1140 bool IsRKSimple = From->
getKind() == Requirement::RK_Simple;
1143 std::optional<ExprRequirement::ReturnTypeRequirement> Req;
1149 const ExprRequirement::ReturnTypeRequirement &FromTypeRequirement =
1152 if (FromTypeRequirement.isTypeConstraint()) {
1153 const bool IsDependent = FromTypeRequirement.isDependent();
1155 import(FromTypeRequirement.getTypeConstraintTemplateParameterList());
1157 return ParamsOrErr.takeError();
1158 if (Status >= ExprRequirement::SS_ConstraintsNotSatisfied) {
1159 auto SubstConstraintExprOrErr =
1161 if (!SubstConstraintExprOrErr)
1162 return SubstConstraintExprOrErr.takeError();
1163 SubstitutedConstraintExpr = SubstConstraintExprOrErr.get();
1165 Req.emplace(ParamsOrErr.get(), IsDependent);
1166 }
else if (FromTypeRequirement.isSubstitutionFailure()) {
1167 auto DiagOrErr =
import(FromTypeRequirement.getSubstitutionDiagnostic());
1169 return DiagOrErr.takeError();
1170 Req.emplace(DiagOrErr.get());
1177 if (!NoexceptLocOrErr)
1178 return NoexceptLocOrErr.takeError();
1180 if (Status == ExprRequirement::SS_ExprSubstitutionFailure) {
1183 return DiagOrErr.takeError();
1184 return new (Importer.getToContext()) ExprRequirement(
1185 *DiagOrErr, IsRKSimple, *NoexceptLocOrErr, std::move(*Req));
1189 return ExprOrErr.takeError();
1191 *ExprOrErr, IsRKSimple, *NoexceptLocOrErr, std::move(*Req), Status,
1192 SubstitutedConstraintExpr);
1207 return new (Importer.getToContext())
1208 NestedRequirement(ToEntity, ToSatisfaction);
1212 return ToExpr.takeError();
1213 if (ToExpr.get()->isInstantiationDependent()) {
1214 return new (Importer.getToContext()) NestedRequirement(ToExpr.get());
1219 return std::move(Err);
1220 return new (Importer.getToContext()) NestedRequirement(
1221 Importer.getToContext(), ToExpr.get(), Satisfaction);
1229 switch (FromRequire->
getKind()) {
1239 llvm_unreachable(
"Unhandled requirement kind");
1249 return VarOrErr.takeError();
1254 return LocationOrErr.takeError();
1259 return std::move(Err);
1266template <
typename T>
1268 if (
Found->getLinkageInternal() != From->getLinkageInternal())
1271 if (From->hasExternalFormalLinkage())
1272 return Found->hasExternalFormalLinkage();
1273 if (Importer.GetFromTU(
Found) != From->getTranslationUnitDecl())
1275 if (From->isInAnonymousNamespace())
1276 return Found->isInAnonymousNamespace();
1278 return !
Found->isInAnonymousNamespace() &&
1279 !
Found->hasExternalFormalLinkage();
1299using namespace clang;
1305 FunctionDeclsWithImportInProgress.insert(D);
1308 return llvm::scope_exit([
this, LambdaD]() {
1310 FunctionDeclsWithImportInProgress.erase(LambdaD);
1317 return FunctionDeclsWithImportInProgress.find(D) !=
1318 FunctionDeclsWithImportInProgress.end();
1322 Importer.FromDiag(
SourceLocation(), diag::err_unsupported_ast_node)
1323 << T->getTypeClassName();
1328 ExpectedType UnderlyingTypeOrErr =
import(T->getValueType());
1329 if (!UnderlyingTypeOrErr)
1330 return UnderlyingTypeOrErr.takeError();
1332 return Importer.getToContext().getAtomicType(*UnderlyingTypeOrErr);
1336 switch (T->getKind()) {
1337#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
1338 case BuiltinType::Id: \
1339 return Importer.getToContext().SingletonId;
1340#include "clang/Basic/OpenCLImageTypes.def"
1341#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
1342 case BuiltinType::Id: \
1343 return Importer.getToContext().Id##Ty;
1344#include "clang/Basic/OpenCLExtensionTypes.def"
1345#define SVE_TYPE(Name, Id, SingletonId) \
1346 case BuiltinType::Id: \
1347 return Importer.getToContext().SingletonId;
1348#include "clang/Basic/AArch64ACLETypes.def"
1349#define PPC_VECTOR_TYPE(Name, Id, Size) \
1350 case BuiltinType::Id: \
1351 return Importer.getToContext().Id##Ty;
1352#include "clang/Basic/PPCTypes.def"
1353#define RVV_TYPE(Name, Id, SingletonId) \
1354 case BuiltinType::Id: \
1355 return Importer.getToContext().SingletonId;
1356#include "clang/Basic/RISCVVTypes.def"
1357#define WASM_TYPE(Name, Id, SingletonId) \
1358 case BuiltinType::Id: \
1359 return Importer.getToContext().SingletonId;
1360#include "clang/Basic/WebAssemblyReferenceTypes.def"
1361#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) \
1362 case BuiltinType::Id: \
1363 return Importer.getToContext().SingletonId;
1364#include "clang/Basic/AMDGPUTypes.def"
1365#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \
1366 case BuiltinType::Id: \
1367 return Importer.getToContext().SingletonId;
1368#include "clang/Basic/HLSLIntangibleTypes.def"
1369#define SHARED_SINGLETON_TYPE(Expansion)
1370#define BUILTIN_TYPE(Id, SingletonId) \
1371 case BuiltinType::Id: return Importer.getToContext().SingletonId;
1372#include "clang/AST/BuiltinTypes.def"
1380 case BuiltinType::Char_U:
1384 if (Importer.getToContext().getLangOpts().CharIsSigned)
1385 return Importer.getToContext().UnsignedCharTy;
1387 return Importer.getToContext().CharTy;
1389 case BuiltinType::Char_S:
1393 if (!Importer.getToContext().getLangOpts().CharIsSigned)
1394 return Importer.getToContext().SignedCharTy;
1396 return Importer.getToContext().CharTy;
1398 case BuiltinType::WChar_S:
1399 case BuiltinType::WChar_U:
1402 return Importer.getToContext().WCharTy;
1405 llvm_unreachable(
"Invalid BuiltinType Kind!");
1408ExpectedType ASTNodeImporter::VisitDecayedType(
const DecayedType *T) {
1410 if (!ToOriginalTypeOrErr)
1411 return ToOriginalTypeOrErr.takeError();
1413 return Importer.getToContext().getDecayedType(*ToOriginalTypeOrErr);
1416ExpectedType ASTNodeImporter::VisitComplexType(
const ComplexType *T) {
1418 if (!ToElementTypeOrErr)
1419 return ToElementTypeOrErr.takeError();
1421 return Importer.getToContext().getComplexType(*ToElementTypeOrErr);
1424ExpectedType ASTNodeImporter::VisitPointerType(
const PointerType *T) {
1426 if (!ToPointeeTypeOrErr)
1427 return ToPointeeTypeOrErr.takeError();
1429 return Importer.getToContext().getPointerType(*ToPointeeTypeOrErr);
1432ExpectedType ASTNodeImporter::VisitBlockPointerType(
const BlockPointerType *T) {
1435 if (!ToPointeeTypeOrErr)
1436 return ToPointeeTypeOrErr.takeError();
1438 return Importer.getToContext().getBlockPointerType(*ToPointeeTypeOrErr);
1442ASTNodeImporter::VisitLValueReferenceType(
const LValueReferenceType *T) {
1445 if (!ToPointeeTypeOrErr)
1446 return ToPointeeTypeOrErr.takeError();
1448 return Importer.getToContext().getLValueReferenceType(*ToPointeeTypeOrErr);
1452ASTNodeImporter::VisitRValueReferenceType(
const RValueReferenceType *T) {
1455 if (!ToPointeeTypeOrErr)
1456 return ToPointeeTypeOrErr.takeError();
1458 return Importer.getToContext().getRValueReferenceType(*ToPointeeTypeOrErr);
1462ASTNodeImporter::VisitMemberPointerType(
const MemberPointerType *T) {
1465 if (!ToPointeeTypeOrErr)
1466 return ToPointeeTypeOrErr.takeError();
1469 if (!QualifierOrErr)
1470 return QualifierOrErr.takeError();
1474 return ClsOrErr.takeError();
1476 return Importer.getToContext().getMemberPointerType(
1477 *ToPointeeTypeOrErr, *QualifierOrErr, *ClsOrErr);
1481ASTNodeImporter::VisitConstantArrayType(
const ConstantArrayType *T) {
1482 Error Err = Error::success();
1484 auto ToSizeExpr = importChecked(Err, T->
getSizeExpr());
1486 return std::move(Err);
1488 return Importer.getToContext().getConstantArrayType(
1494ASTNodeImporter::VisitArrayParameterType(
const ArrayParameterType *T) {
1495 ExpectedType ToArrayTypeOrErr = VisitConstantArrayType(T);
1496 if (!ToArrayTypeOrErr)
1497 return ToArrayTypeOrErr.takeError();
1499 return Importer.getToContext().getArrayParameterType(*ToArrayTypeOrErr);
1503ASTNodeImporter::VisitIncompleteArrayType(
const IncompleteArrayType *T) {
1505 if (!ToElementTypeOrErr)
1506 return ToElementTypeOrErr.takeError();
1508 return Importer.getToContext().getIncompleteArrayType(*ToElementTypeOrErr,
1514ASTNodeImporter::VisitVariableArrayType(
const VariableArrayType *T) {
1515 Error Err = Error::success();
1516 QualType ToElementType = importChecked(Err, T->
getElementType());
1517 Expr *ToSizeExpr = importChecked(Err, T->
getSizeExpr());
1519 return std::move(Err);
1520 return Importer.getToContext().getVariableArrayType(
1525ExpectedType ASTNodeImporter::VisitDependentSizedArrayType(
1526 const DependentSizedArrayType *T) {
1527 Error Err = Error::success();
1528 QualType ToElementType = importChecked(Err, T->
getElementType());
1529 Expr *ToSizeExpr = importChecked(Err, T->
getSizeExpr());
1531 return std::move(Err);
1535 return Importer.getToContext().getDependentSizedArrayType(
1540ExpectedType ASTNodeImporter::VisitDependentSizedExtVectorType(
1541 const DependentSizedExtVectorType *T) {
1542 Error Err = Error::success();
1543 QualType ToElementType = importChecked(Err, T->
getElementType());
1544 Expr *ToSizeExpr = importChecked(Err, T->
getSizeExpr());
1547 return std::move(Err);
1548 return Importer.getToContext().getDependentSizedExtVectorType(
1549 ToElementType, ToSizeExpr, ToAttrLoc);
1552ExpectedType ASTNodeImporter::VisitVectorType(
const VectorType *T) {
1554 if (!ToElementTypeOrErr)
1555 return ToElementTypeOrErr.takeError();
1557 return Importer.getToContext().getVectorType(*ToElementTypeOrErr,
1562ExpectedType ASTNodeImporter::VisitExtVectorType(
const ExtVectorType *T) {
1564 if (!ToElementTypeOrErr)
1565 return ToElementTypeOrErr.takeError();
1567 return Importer.getToContext().getExtVectorType(*ToElementTypeOrErr,
1572ASTNodeImporter::VisitFunctionNoProtoType(
const FunctionNoProtoType *T) {
1576 if (!ToReturnTypeOrErr)
1577 return ToReturnTypeOrErr.takeError();
1579 return Importer.getToContext().getFunctionNoProtoType(*ToReturnTypeOrErr,
1584ASTNodeImporter::VisitFunctionProtoType(
const FunctionProtoType *T) {
1586 if (!ToReturnTypeOrErr)
1587 return ToReturnTypeOrErr.takeError();
1590 SmallVector<QualType, 4> ArgTypes;
1594 return TyOrErr.takeError();
1595 ArgTypes.push_back(*TyOrErr);
1599 SmallVector<QualType, 4> ExceptionTypes;
1603 return TyOrErr.takeError();
1604 ExceptionTypes.push_back(*TyOrErr);
1608 Error Err = Error::success();
1609 FunctionProtoType::ExtProtoInfo ToEPI;
1625 return std::move(Err);
1627 return Importer.getToContext().getFunctionType(
1628 *ToReturnTypeOrErr, ArgTypes, ToEPI);
1632 const UnresolvedUsingType *T) {
1633 Error Err = Error::success();
1634 auto ToQualifier = importChecked(Err, T->
getQualifier());
1635 auto *ToD = importChecked(Err, T->
getDecl());
1637 return std::move(Err);
1640 return Importer.getToContext().getCanonicalUnresolvedUsingType(ToD);
1641 return Importer.getToContext().getUnresolvedUsingType(T->
getKeyword(),
1645ExpectedType ASTNodeImporter::VisitParenType(
const ParenType *T) {
1647 if (!ToInnerTypeOrErr)
1648 return ToInnerTypeOrErr.takeError();
1650 return Importer.getToContext().getParenType(*ToInnerTypeOrErr);
1654ASTNodeImporter::VisitPackIndexingType(clang::PackIndexingType
const *T) {
1658 return Pattern.takeError();
1661 return Index.takeError();
1662 return Importer.getToContext().getPackIndexingType(*Pattern, *Index);
1665ExpectedType ASTNodeImporter::VisitTypedefType(
const TypedefType *T) {
1666 Expected<TypedefNameDecl *> ToDeclOrErr =
import(T->
getDecl());
1668 return ToDeclOrErr.takeError();
1671 if (!ToQualifierOrErr)
1672 return ToQualifierOrErr.takeError();
1676 if (!ToUnderlyingTypeOrErr)
1677 return ToUnderlyingTypeOrErr.takeError();
1679 return Importer.getToContext().getTypedefType(
1680 T->
getKeyword(), *ToQualifierOrErr, *ToDeclOrErr, *ToUnderlyingTypeOrErr);
1683ExpectedType ASTNodeImporter::VisitTypeOfExprType(
const TypeOfExprType *T) {
1686 return ToExprOrErr.takeError();
1687 return Importer.getToContext().getTypeOfExprType(*ToExprOrErr, T->
getKind());
1690ExpectedType ASTNodeImporter::VisitTypeOfType(
const TypeOfType *T) {
1691 ExpectedType ToUnderlyingTypeOrErr =
import(T->getUnmodifiedType());
1692 if (!ToUnderlyingTypeOrErr)
1693 return ToUnderlyingTypeOrErr.takeError();
1694 return Importer.getToContext().getTypeOfType(*ToUnderlyingTypeOrErr,
1698ExpectedType ASTNodeImporter::VisitUsingType(
const UsingType *T) {
1699 Error Err = Error::success();
1700 auto ToQualifier = importChecked(Err, T->
getQualifier());
1701 auto *ToD = importChecked(Err, T->
getDecl());
1702 QualType ToT = importChecked(Err, T->
desugar());
1704 return std::move(Err);
1705 return Importer.getToContext().getUsingType(T->
getKeyword(), ToQualifier, ToD,
1709ExpectedType ASTNodeImporter::VisitDecltypeType(
const DecltypeType *T) {
1711 ExpectedExpr ToExprOrErr =
import(T->getUnderlyingExpr());
1713 return ToExprOrErr.takeError();
1715 ExpectedType ToUnderlyingTypeOrErr =
import(T->getUnderlyingType());
1716 if (!ToUnderlyingTypeOrErr)
1717 return ToUnderlyingTypeOrErr.takeError();
1719 return Importer.getToContext().getDecltypeType(
1720 *ToExprOrErr, *ToUnderlyingTypeOrErr);
1724ASTNodeImporter::VisitUnaryTransformType(
const UnaryTransformType *T) {
1725 ExpectedType ToBaseTypeOrErr =
import(T->getBaseType());
1726 if (!ToBaseTypeOrErr)
1727 return ToBaseTypeOrErr.takeError();
1729 ExpectedType ToUnderlyingTypeOrErr =
import(T->getUnderlyingType());
1730 if (!ToUnderlyingTypeOrErr)
1731 return ToUnderlyingTypeOrErr.takeError();
1733 return Importer.getToContext().getUnaryTransformType(
1734 *ToBaseTypeOrErr, *ToUnderlyingTypeOrErr, T->getUTTKind());
1737ExpectedType ASTNodeImporter::VisitAutoType(
const AutoType *T) {
1739 ExpectedType ToDeducedTypeOrErr =
import(T->getDeducedType());
1740 if (!ToDeducedTypeOrErr)
1741 return ToDeducedTypeOrErr.takeError();
1743 Expected<TemplateDecl *> ToTypeConstraint =
1744 import(T->getTypeConstraintConcept());
1745 if (!ToTypeConstraint)
1746 return ToTypeConstraint.takeError();
1748 SmallVector<TemplateArgument, 2> ToTemplateArgs;
1751 return std::move(Err);
1753 return Importer.getToContext().getAutoType(
1754 T->getDeducedKind(), *ToDeducedTypeOrErr, T->getKeyword(),
1755 *ToTypeConstraint, ToTemplateArgs);
1758ExpectedType ASTNodeImporter::VisitDeducedTemplateSpecializationType(
1759 const DeducedTemplateSpecializationType *T) {
1761 Expected<TemplateName> ToTemplateNameOrErr =
import(T->getTemplateName());
1762 if (!ToTemplateNameOrErr)
1763 return ToTemplateNameOrErr.takeError();
1764 ExpectedType ToDeducedTypeOrErr =
import(T->getDeducedType());
1765 if (!ToDeducedTypeOrErr)
1766 return ToDeducedTypeOrErr.takeError();
1768 return Importer.getToContext().getDeducedTemplateSpecializationType(
1769 T->getDeducedKind(), *ToDeducedTypeOrErr, T->getKeyword(),
1770 *ToTemplateNameOrErr);
1773ExpectedType ASTNodeImporter::VisitTagType(
const TagType *T) {
1774 TagDecl *DeclForType = T->getDecl();
1775 Expected<TagDecl *> ToDeclOrErr =
import(DeclForType);
1777 return ToDeclOrErr.takeError();
1783 Expected<TagDecl *> ToDefDeclOrErr =
import(DeclForType->
getDefinition());
1784 if (!ToDefDeclOrErr)
1785 return ToDefDeclOrErr.takeError();
1787 if (T->isCanonicalUnqualified())
1788 return Importer.getToContext().getCanonicalTagType(*ToDeclOrErr);
1790 auto ToQualifierOrErr =
import(T->getQualifier());
1791 if (!ToQualifierOrErr)
1792 return ToQualifierOrErr.takeError();
1794 return Importer.getToContext().getTagType(T->getKeyword(), *ToQualifierOrErr,
1795 *ToDeclOrErr, T->isTagOwned());
1798ExpectedType ASTNodeImporter::VisitEnumType(
const EnumType *T) {
1799 return VisitTagType(T);
1802ExpectedType ASTNodeImporter::VisitRecordType(
const RecordType *T) {
1803 return VisitTagType(T);
1807ASTNodeImporter::VisitInjectedClassNameType(
const InjectedClassNameType *T) {
1808 return VisitTagType(T);
1811ExpectedType ASTNodeImporter::VisitAttributedType(
const AttributedType *T) {
1812 ExpectedType ToModifiedTypeOrErr =
import(T->getModifiedType());
1813 if (!ToModifiedTypeOrErr)
1814 return ToModifiedTypeOrErr.takeError();
1815 ExpectedType ToEquivalentTypeOrErr =
import(T->getEquivalentType());
1816 if (!ToEquivalentTypeOrErr)
1817 return ToEquivalentTypeOrErr.takeError();
1819 return Importer.getToContext().getAttributedType(
1820 T->getAttrKind(), *ToModifiedTypeOrErr, *ToEquivalentTypeOrErr,
1825ASTNodeImporter::VisitCountAttributedType(
const CountAttributedType *T) {
1827 if (!ToWrappedTypeOrErr)
1828 return ToWrappedTypeOrErr.takeError();
1830 Error Err = Error::success();
1831 Expr *CountExpr = importChecked(Err, T->
getCountExpr());
1833 SmallVector<TypeCoupledDeclRefInfo, 1> CoupledDecls;
1835 Expected<ValueDecl *> ToDeclOrErr =
import(TI.getDecl());
1837 return ToDeclOrErr.takeError();
1838 CoupledDecls.emplace_back(*ToDeclOrErr, TI.isDeref());
1841 return Importer.getToContext().getCountAttributedType(
1843 ArrayRef(CoupledDecls));
1846ExpectedType ASTNodeImporter::VisitTemplateTypeParmType(
1847 const TemplateTypeParmType *T) {
1848 Expected<TemplateTypeParmDecl *> ToDeclOrErr =
import(T->getDecl());
1850 return ToDeclOrErr.takeError();
1852 return Importer.getToContext().getTemplateTypeParmType(
1853 T->getDepth(), T->getIndex(), T->isParameterPack(), *ToDeclOrErr);
1856ExpectedType ASTNodeImporter::VisitSubstTemplateTypeParmType(
1857 const SubstTemplateTypeParmType *T) {
1858 Expected<Decl *> ReplacedOrErr =
import(T->getAssociatedDecl());
1860 return ReplacedOrErr.takeError();
1862 ExpectedType ToReplacementTypeOrErr =
import(T->getReplacementType());
1863 if (!ToReplacementTypeOrErr)
1864 return ToReplacementTypeOrErr.takeError();
1866 return Importer.getToContext().getSubstTemplateTypeParmType(
1867 *ToReplacementTypeOrErr, *ReplacedOrErr, T->getIndex(), T->getPackIndex(),
1871ExpectedType ASTNodeImporter::VisitSubstTemplateTypeParmPackType(
1872 const SubstTemplateTypeParmPackType *T) {
1873 Expected<Decl *> ReplacedOrErr =
import(T->getAssociatedDecl());
1875 return ReplacedOrErr.takeError();
1877 Expected<TemplateArgument> ToArgumentPack =
import(T->getArgumentPack());
1878 if (!ToArgumentPack)
1879 return ToArgumentPack.takeError();
1881 return Importer.getToContext().getSubstTemplateTypeParmPackType(
1882 *ReplacedOrErr, T->getIndex(), T->getFinal(), *ToArgumentPack);
1885ExpectedType ASTNodeImporter::VisitSubstBuiltinTemplatePackType(
1886 const SubstBuiltinTemplatePackType *T) {
1887 Expected<TemplateArgument> ToArgumentPack =
import(T->getArgumentPack());
1888 if (!ToArgumentPack)
1889 return ToArgumentPack.takeError();
1890 return Importer.getToContext().getSubstBuiltinTemplatePack(*ToArgumentPack);
1893ExpectedType ASTNodeImporter::VisitTemplateSpecializationType(
1894 const TemplateSpecializationType *T) {
1895 auto ToTemplateOrErr =
import(T->getTemplateName());
1896 if (!ToTemplateOrErr)
1897 return ToTemplateOrErr.takeError();
1899 SmallVector<TemplateArgument, 2> ToTemplateArgs;
1902 return std::move(Err);
1905 T->isCanonicalUnqualified() ? QualType() : import(T->desugar());
1906 if (!ToUnderlyingOrErr)
1907 return ToUnderlyingOrErr.takeError();
1908 return Importer.getToContext().getTemplateSpecializationType(
1909 T->getKeyword(), *ToTemplateOrErr, ToTemplateArgs, {},
1910 *ToUnderlyingOrErr);
1914ASTNodeImporter::VisitPackExpansionType(
const PackExpansionType *T) {
1916 if (!ToPatternOrErr)
1917 return ToPatternOrErr.takeError();
1919 return Importer.getToContext().getPackExpansionType(*ToPatternOrErr,
1920 T->getNumExpansions(),
1925ASTNodeImporter::VisitDependentNameType(
const DependentNameType *T) {
1926 auto ToQualifierOrErr =
import(T->getQualifier());
1927 if (!ToQualifierOrErr)
1928 return ToQualifierOrErr.takeError();
1930 IdentifierInfo *Name = Importer.Import(T->getIdentifier());
1931 return Importer.getToContext().getDependentNameType(T->getKeyword(),
1932 *ToQualifierOrErr, Name);
1936ASTNodeImporter::VisitObjCInterfaceType(
const ObjCInterfaceType *T) {
1937 Expected<ObjCInterfaceDecl *> ToDeclOrErr =
import(T->
getDecl());
1939 return ToDeclOrErr.takeError();
1941 return Importer.getToContext().getObjCInterfaceType(*ToDeclOrErr);
1944ExpectedType ASTNodeImporter::VisitObjCObjectType(
const ObjCObjectType *T) {
1945 ExpectedType ToBaseTypeOrErr =
import(T->getBaseType());
1946 if (!ToBaseTypeOrErr)
1947 return ToBaseTypeOrErr.takeError();
1949 SmallVector<QualType, 4> TypeArgs;
1950 for (
auto TypeArg : T->getTypeArgsAsWritten()) {
1952 TypeArgs.push_back(*TyOrErr);
1954 return TyOrErr.takeError();
1957 SmallVector<ObjCProtocolDecl *, 4> Protocols;
1958 for (
auto *P : T->quals()) {
1959 if (Expected<ObjCProtocolDecl *> ProtocolOrErr =
import(P))
1960 Protocols.push_back(*ProtocolOrErr);
1962 return ProtocolOrErr.takeError();
1966 return Importer.getToContext().getObjCObjectType(*ToBaseTypeOrErr, TypeArgs,
1968 T->isKindOfTypeAsWritten());
1972ASTNodeImporter::VisitObjCObjectPointerType(
const ObjCObjectPointerType *T) {
1974 if (!ToPointeeTypeOrErr)
1975 return ToPointeeTypeOrErr.takeError();
1977 return Importer.getToContext().getObjCObjectPointerType(*ToPointeeTypeOrErr);
1981ASTNodeImporter::VisitMacroQualifiedType(
const MacroQualifiedType *T) {
1983 if (!ToUnderlyingTypeOrErr)
1984 return ToUnderlyingTypeOrErr.takeError();
1987 return Importer.getToContext().getMacroQualifiedType(*ToUnderlyingTypeOrErr,
1991ExpectedType clang::ASTNodeImporter::VisitAdjustedType(
const AdjustedType *T) {
1992 Error Err = Error::success();
1996 return std::move(Err);
1998 return Importer.getToContext().getAdjustedType(ToOriginalType,
2002ExpectedType clang::ASTNodeImporter::VisitBitIntType(
const BitIntType *T) {
2003 return Importer.getToContext().getBitIntType(T->
isUnsigned(),
2007ExpectedType clang::ASTNodeImporter::VisitBTFTagAttributedType(
2008 const clang::BTFTagAttributedType *T) {
2009 Error Err = Error::success();
2010 const BTFTypeTagAttr *ToBTFAttr = importChecked(Err, T->getAttr());
2011 QualType ToWrappedType = importChecked(Err, T->getWrappedType());
2013 return std::move(Err);
2015 return Importer.getToContext().getBTFTagAttributedType(ToBTFAttr,
2019ExpectedType clang::ASTNodeImporter::VisitOverflowBehaviorType(
2020 const clang::OverflowBehaviorType *T) {
2021 Error Err = Error::success();
2022 OverflowBehaviorType::OverflowBehaviorKind ToKind = T->getBehaviorKind();
2025 return std::move(Err);
2027 return Importer.getToContext().getOverflowBehaviorType(ToKind,
2031ExpectedType clang::ASTNodeImporter::VisitHLSLAttributedResourceType(
2032 const clang::HLSLAttributedResourceType *T) {
2033 Error Err = Error::success();
2034 const HLSLAttributedResourceType::Attributes &ToAttrs = T->getAttrs();
2035 QualType ToWrappedType = importChecked(Err, T->getWrappedType());
2036 QualType ToContainedType = importChecked(Err, T->getContainedType());
2038 return std::move(Err);
2040 return Importer.getToContext().getHLSLAttributedResourceType(
2041 ToWrappedType, ToContainedType, ToAttrs);
2044ExpectedType clang::ASTNodeImporter::VisitHLSLInlineSpirvType(
2045 const clang::HLSLInlineSpirvType *T) {
2046 Error Err = Error::success();
2048 uint32_t ToOpcode = T->getOpcode();
2050 uint32_t ToAlignment = T->getAlignment();
2052 llvm::SmallVector<SpirvOperand> ToOperands;
2054 for (
auto &Operand : T->getOperands()) {
2055 using SpirvOperandKind = SpirvOperand::SpirvOperandKind;
2058 case SpirvOperandKind::ConstantId:
2059 ToOperands.push_back(SpirvOperand::createConstant(
2060 importChecked(Err,
Operand.getResultType()),
Operand.getValue()));
2062 case SpirvOperandKind::Literal:
2063 ToOperands.push_back(SpirvOperand::createLiteral(
Operand.getValue()));
2065 case SpirvOperandKind::TypeId:
2066 ToOperands.push_back(SpirvOperand::createType(
2067 importChecked(Err,
Operand.getResultType())));
2070 llvm_unreachable(
"Invalid SpirvOperand kind");
2074 return std::move(Err);
2077 return Importer.getToContext().getHLSLInlineSpirvType(
2078 ToOpcode, ToSize, ToAlignment, ToOperands);
2081ExpectedType clang::ASTNodeImporter::VisitConstantMatrixType(
2082 const clang::ConstantMatrixType *T) {
2084 if (!ToElementTypeOrErr)
2085 return ToElementTypeOrErr.takeError();
2087 return Importer.getToContext().getConstantMatrixType(
2091ExpectedType clang::ASTNodeImporter::VisitDependentAddressSpaceType(
2092 const clang::DependentAddressSpaceType *T) {
2093 Error Err = Error::success();
2094 QualType ToPointeeType = importChecked(Err, T->
getPointeeType());
2098 return std::move(Err);
2100 return Importer.getToContext().getDependentAddressSpaceType(
2101 ToPointeeType, ToAddrSpaceExpr, ToAttrLoc);
2104ExpectedType clang::ASTNodeImporter::VisitDependentBitIntType(
2105 const clang::DependentBitIntType *T) {
2107 if (!ToNumBitsExprOrErr)
2108 return ToNumBitsExprOrErr.takeError();
2109 return Importer.getToContext().getDependentBitIntType(T->
isUnsigned(),
2110 *ToNumBitsExprOrErr);
2113ExpectedType clang::ASTNodeImporter::VisitPredefinedSugarType(
2114 const clang::PredefinedSugarType *T) {
2115 return Importer.getToContext().getPredefinedSugarType(T->
getKind());
2118ExpectedType clang::ASTNodeImporter::VisitDependentSizedMatrixType(
2119 const clang::DependentSizedMatrixType *T) {
2120 Error Err = Error::success();
2121 QualType ToElementType = importChecked(Err, T->
getElementType());
2122 Expr *ToRowExpr = importChecked(Err, T->
getRowExpr());
2123 Expr *ToColumnExpr = importChecked(Err, T->
getColumnExpr());
2126 return std::move(Err);
2128 return Importer.getToContext().getDependentSizedMatrixType(
2129 ToElementType, ToRowExpr, ToColumnExpr, ToAttrLoc);
2132ExpectedType clang::ASTNodeImporter::VisitDependentVectorType(
2133 const clang::DependentVectorType *T) {
2134 Error Err = Error::success();
2135 QualType ToElementType = importChecked(Err, T->
getElementType());
2136 Expr *ToSizeExpr = importChecked(Err, T->
getSizeExpr());
2139 return std::move(Err);
2141 return Importer.getToContext().getDependentVectorType(
2145ExpectedType clang::ASTNodeImporter::VisitObjCTypeParamType(
2146 const clang::ObjCTypeParamType *T) {
2147 Expected<ObjCTypeParamDecl *> ToDeclOrErr =
import(T->getDecl());
2149 return ToDeclOrErr.takeError();
2151 SmallVector<ObjCProtocolDecl *, 4> ToProtocols;
2152 for (ObjCProtocolDecl *FromProtocol : T->getProtocols()) {
2153 Expected<ObjCProtocolDecl *> ToProtocolOrErr =
import(FromProtocol);
2154 if (!ToProtocolOrErr)
2155 return ToProtocolOrErr.takeError();
2156 ToProtocols.push_back(*ToProtocolOrErr);
2159 return Importer.getToContext().getObjCTypeParamType(*ToDeclOrErr,
2163ExpectedType clang::ASTNodeImporter::VisitPipeType(
const clang::PipeType *T) {
2165 if (!ToElementTypeOrErr)
2166 return ToElementTypeOrErr.takeError();
2168 ASTContext &ToCtx = Importer.getToContext();
2189 if (
isa<RecordDecl>(D) && (FunDecl = dyn_cast<FunctionDecl>(OrigDC)) &&
2191 auto getLeafPointeeType = [](
const Type *T) {
2192 while (T->isPointerType() || T->isArrayType()) {
2193 T = T->getPointeeOrArrayElementType();
2199 getLeafPointeeType(
P->getType().getCanonicalType().getTypePtr());
2200 auto *RT = dyn_cast<RecordType>(LeafT);
2201 if (RT && RT->getDecl() == D) {
2202 Importer.FromDiag(D->
getLocation(), diag::err_unsupported_ast_node)
2221 ToD = cast_or_null<NamedDecl>(Importer.GetAlreadyImportedOrNull(D));
2226 return Error::success();
2240 ToD = cast_or_null<NamedDecl>(Importer.GetAlreadyImportedOrNull(D));
2245 return Error::success();
2250 return Error::success();
2256 if (
RecordDecl *FromRecord = dyn_cast<RecordDecl>(FromD)) {
2258 if (FromRecord->getDefinition() && FromRecord->isCompleteDefinition() &&
2259 !ToRecord->getDefinition()) {
2264 return Error::success();
2267 if (
EnumDecl *FromEnum = dyn_cast<EnumDecl>(FromD)) {
2269 if (FromEnum->getDefinition() && !ToEnum->getDefinition()) {
2274 return Error::success();
2277 return Error::success();
2292 return Error::success();
2298 return ToRangeOrErr.takeError();
2299 return Error::success();
2305 return LocOrErr.takeError();
2306 return Error::success();
2314 return ToTInfoOrErr.takeError();
2315 return Error::success();
2318 llvm_unreachable(
"Unknown name kind.");
2323 if (Importer.isMinimalImport() && !ForceImport) {
2324 auto ToDCOrErr = Importer.ImportContext(FromDC);
2325 return ToDCOrErr.takeError();
2339 auto MightNeedReordering = [](
const Decl *D) {
2344 Error ChildErrors = Error::success();
2345 for (
auto *From : FromDC->
decls()) {
2346 if (!MightNeedReordering(From))
2355 if (!ImportedOrErr) {
2357 ImportedOrErr.takeError());
2360 FieldDecl *FieldFrom = dyn_cast_or_null<FieldDecl>(From);
2361 Decl *ImportedDecl = *ImportedOrErr;
2362 FieldDecl *FieldTo = dyn_cast_or_null<FieldDecl>(ImportedDecl);
2363 if (FieldFrom && FieldTo) {
2393 auto ToDCOrErr = Importer.ImportContext(FromDC);
2395 consumeError(std::move(ChildErrors));
2396 return ToDCOrErr.takeError();
2399 if (
const auto *FromRD = dyn_cast<RecordDecl>(FromDC)) {
2403 for (
auto *D : FromRD->decls()) {
2404 if (!MightNeedReordering(D))
2407 assert(D &&
"DC contains a null decl");
2408 if (
Decl *ToD = Importer.GetAlreadyImportedOrNull(D)) {
2410 assert(ToDC == ToD->getLexicalDeclContext() && ToDC->
containsDecl(ToD));
2422 for (
auto *From : FromDC->
decls()) {
2423 if (MightNeedReordering(From))
2429 ImportedOrErr.takeError());
2449 if (!FromRecordDecl || !ToRecordDecl) {
2450 const RecordType *RecordFrom = FromType->
getAs<RecordType>();
2451 const RecordType *RecordTo = ToType->
getAs<RecordType>();
2453 if (RecordFrom && RecordTo) {
2454 FromRecordDecl = RecordFrom->getDecl();
2455 ToRecordDecl = RecordTo->getDecl();
2459 if (FromRecordDecl && ToRecordDecl) {
2465 return Error::success();
2470 auto ToDCOrErr = Importer.ImportContext(FromD->
getDeclContext());
2472 return ToDCOrErr.takeError();
2476 auto ToLexicalDCOrErr = Importer.ImportContext(
2478 if (!ToLexicalDCOrErr)
2479 return ToLexicalDCOrErr.takeError();
2480 ToLexicalDC = *ToLexicalDCOrErr;
2484 return Error::success();
2490 "Import implicit methods to or from non-definition");
2493 if (FromM->isImplicit()) {
2496 return ToMOrErr.takeError();
2499 return Error::success();
2508 return ToTypedefOrErr.takeError();
2510 return Error::success();
2515 auto DefinitionCompleter = [To]() {
2536 ToCaptures.reserve(FromCXXRD->capture_size());
2537 for (
const auto &FromCapture : FromCXXRD->captures()) {
2538 if (
auto ToCaptureOrErr =
import(FromCapture))
2539 ToCaptures.push_back(*ToCaptureOrErr);
2541 return ToCaptureOrErr.takeError();
2550 DefinitionCompleter();
2554 return Error::success();
2564 if (!Importer.isMinimalImport())
2569 llvm::scope_exit DefinitionCompleterScopeExit(DefinitionCompleter);
2575 auto *ToCXX = dyn_cast<CXXRecordDecl>(To);
2576 auto *FromCXX = dyn_cast<CXXRecordDecl>(From);
2577 if (ToCXX && FromCXX && ToCXX->dataPtr() && FromCXX->dataPtr()) {
2579 struct CXXRecordDecl::DefinitionData &ToData = ToCXX->data();
2580 struct CXXRecordDecl::DefinitionData &FromData = FromCXX->data();
2582 #define FIELD(Name, Width, Merge) \
2583 ToData.Name = FromData.Name;
2584 #include "clang/AST/CXXRecordDeclDefinitionBits.def"
2587 ToCXX->setArgPassingRestrictions(FromCXX->getArgPassingRestrictions());
2590 for (
const auto &Base1 : FromCXX->bases()) {
2593 return TyOrErr.takeError();
2596 if (Base1.isPackExpansion()) {
2597 if (
ExpectedSLoc LocOrErr =
import(Base1.getEllipsisLoc()))
2598 EllipsisLoc = *LocOrErr;
2600 return LocOrErr.takeError();
2608 auto RangeOrErr =
import(Base1.getSourceRange());
2610 return RangeOrErr.takeError();
2612 auto TSIOrErr =
import(Base1.getTypeSourceInfo());
2614 return TSIOrErr.takeError();
2620 Base1.isBaseOfClass(),
2621 Base1.getAccessSpecifierAsWritten(),
2626 ToCXX->setBases(Bases.data(), Bases.size());
2634 return Error::success();
2639 return Error::success();
2643 return Error::success();
2647 return ToInitOrErr.takeError();
2658 return Error::success();
2666 return Error::success();
2675 import(
QualType(Importer.getFromContext().getCanonicalTagType(From)));
2677 return ToTypeOrErr.takeError();
2680 if (!ToPromotionTypeOrErr)
2681 return ToPromotionTypeOrErr.takeError();
2692 return Error::success();
2698 for (
const auto &Arg : FromArgs) {
2699 if (
auto ToOrErr =
import(Arg))
2700 ToArgs.push_back(*ToOrErr);
2702 return ToOrErr.takeError();
2705 return Error::success();
2711 return import(From);
2714template <
typename InContainerTy>
2717 for (
const auto &FromLoc : Container) {
2718 if (
auto ToLocOrErr =
import(FromLoc))
2721 return ToLocOrErr.takeError();
2723 return Error::success();
2733 bool IgnoreTemplateParmDepth) {
2736 Decl *ToOrigin = Importer.GetOriginalDecl(To);
2742 Importer.getToContext().getLangOpts(), Importer.getFromContext(),
2743 Importer.getToContext(), Importer.getNonEquivalentDecls(),
2745 false, Complain,
false,
2746 IgnoreTemplateParmDepth);
2751 Importer.FromDiag(D->
getLocation(), diag::err_unsupported_ast_node)
2757 Importer.FromDiag(D->
getLocation(), diag::err_unsupported_ast_node)
2766 return std::move(Err);
2771 return LocOrErr.takeError();
2774 if (GetImportedOrCreateDecl(ToD, D, Importer.getToContext(), DC, *LocOrErr))
2786 Importer.MapImported(D, ToD);
2792 Error Err = Error::success();
2797 return std::move(Err);
2801 return DCOrErr.takeError();
2805 if (GetImportedOrCreateDecl(ToD, D, Importer.getToContext(), DC, ToAsmString,
2806 ToAsmLoc, ToRParenLoc))
2821 return std::move(Err);
2826 if (GetImportedOrCreateDecl(ToD, D, Importer.getToContext(), DC, Loc,
2830 Error Err = Error::success();
2835 return std::move(Err);
2839 addDeclToContexts(D, ToD);
2847 return LocOrErr.takeError();
2850 return ColonLocOrErr.takeError();
2855 return DCOrErr.takeError();
2859 if (GetImportedOrCreateDecl(ToD, D, Importer.getToContext(), D->
getAccess(),
2860 DC, *LocOrErr, *ColonLocOrErr))
2874 return DCOrErr.takeError();
2878 Error Err = Error::success();
2884 return std::move(Err);
2887 if (GetImportedOrCreateDecl(
2888 ToD, D, Importer.getToContext(), DC, ToLocation, ToAssertExpr, ToMessage,
2904 return std::move(Err);
2913 if (
auto *TU = dyn_cast<TranslationUnitDecl>(EnclosingDC))
2916 MergeWithNamespace =
2920 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
2921 for (
auto *FoundDecl : FoundDecls) {
2925 if (
auto *FoundNS = dyn_cast<NamespaceDecl>(FoundDecl)) {
2926 MergeWithNamespace = FoundNS;
2927 ConflictingDecls.clear();
2931 ConflictingDecls.push_back(FoundDecl);
2934 if (!ConflictingDecls.empty()) {
2937 ConflictingDecls.size());
2939 Name = NameOrErr.get();
2941 return NameOrErr.takeError();
2947 return BeginLocOrErr.takeError();
2949 if (!RBraceLocOrErr)
2950 return RBraceLocOrErr.takeError();
2955 if (GetImportedOrCreateDecl(ToNamespace, D, Importer.getToContext(), DC,
2956 D->
isInline(), *BeginLocOrErr, Loc,
2967 if (
auto *TU = dyn_cast<TranslationUnitDecl>(DC))
2968 TU->setAnonymousNamespace(ToNamespace);
2973 Importer.MapImported(D, ToNamespace);
2976 return std::move(Err);
2988 return std::move(Err);
2994 Error Err = Error::success();
3001 return std::move(Err);
3006 if (GetImportedOrCreateDecl(
3007 ToD, D, Importer.getToContext(), DC, ToNamespaceLoc, ToAliasLoc,
3008 ToIdentifier, ToQualifierLoc, ToTargetNameLoc, ToNamespace))
3026 return std::move(Err);
3033 cast_or_null<DeclContext>(Importer.GetAlreadyImportedOrNull(
3045 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
3046 for (
auto *FoundDecl : FoundDecls) {
3047 if (!FoundDecl->isInIdentifierNamespace(IDNS))
3049 if (
auto *FoundTypedef = dyn_cast<TypedefNameDecl>(FoundDecl)) {
3054 QualType FoundUT = FoundTypedef->getUnderlyingType();
3055 if (Importer.IsStructurallyEquivalent(FromUT, FoundUT)) {
3068 if (FromR && FoundR &&
3075 return Importer.MapImported(D, FoundTypedef);
3079 ConflictingDecls.push_back(FoundDecl);
3084 if (!ConflictingDecls.empty()) {
3086 Name, DC, IDNS, ConflictingDecls.data(), ConflictingDecls.size());
3088 Name = NameOrErr.get();
3090 return NameOrErr.takeError();
3094 Error Err = Error::success();
3099 return std::move(Err);
3106 if (GetImportedOrCreateDecl<TypeAliasDecl>(
3107 ToTypedef, D, Importer.getToContext(), DC, ToBeginLoc, Loc,
3110 }
else if (GetImportedOrCreateDecl<TypedefDecl>(
3111 ToTypedef, D, Importer.getToContext(), DC, ToBeginLoc, Loc,
3117 return std::move(Err);
3121 Importer.AddToLookupTable(ToTypedef);
3149 return std::move(Err);
3159 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
3160 for (
auto *FoundDecl : FoundDecls) {
3161 if (!FoundDecl->isInIdentifierNamespace(IDNS))
3163 if (
auto *FoundAlias = dyn_cast<TypeAliasTemplateDecl>(FoundDecl)) {
3165 return Importer.MapImported(D, FoundAlias);
3166 ConflictingDecls.push_back(FoundDecl);
3170 if (!ConflictingDecls.empty()) {
3172 Name, DC, IDNS, ConflictingDecls.data(), ConflictingDecls.size());
3174 Name = NameOrErr.get();
3176 return NameOrErr.takeError();
3180 Error Err = Error::success();
3184 return std::move(Err);
3187 if (GetImportedOrCreateDecl(ToAlias, D, Importer.getToContext(), DC, Loc,
3188 Name, ToTemplateParameters, ToTemplatedDecl))
3191 ToTemplatedDecl->setDescribedAliasTemplate(ToAlias);
3196 if (DC != Importer.getToContext().getTranslationUnitDecl())
3197 updateLookupTableForTemplateParameters(*ToTemplateParameters);
3208 return std::move(Err);
3218 return BeginLocOrErr.takeError();
3219 if (GetImportedOrCreateDecl(ToLabel, D, Importer.getToContext(), DC, Loc,
3224 if (GetImportedOrCreateDecl(ToLabel, D, Importer.getToContext(), DC, Loc,
3232 return ToStmtOrErr.takeError();
3234 ToLabel->
setStmt(*ToStmtOrErr);
3247 return std::move(Err);
3257 return std::move(Err);
3259 }
else if (Importer.getToContext().getLangOpts().CPlusPlus)
3267 Importer.findDeclsInToCtx(DC, SearchName);
3268 for (
auto *FoundDecl : FoundDecls) {
3269 if (!FoundDecl->isInIdentifierNamespace(IDNS))
3272 if (
auto *
Typedef = dyn_cast<TypedefNameDecl>(FoundDecl)) {
3273 if (
const auto *Tag =
Typedef->getUnderlyingType()->getAs<TagType>())
3274 FoundDecl = Tag->getDecl();
3277 if (
auto *FoundEnum = dyn_cast<EnumDecl>(FoundDecl)) {
3283 return Importer.MapImported(D, FoundDef);
3287 ConflictingDecls.push_back(FoundDecl);
3296 if (SearchName && !ConflictingDecls.empty()) {
3298 SearchName, DC, IDNS, ConflictingDecls.data(),
3299 ConflictingDecls.size());
3301 Name = NameOrErr.get();
3303 return NameOrErr.takeError();
3307 Error Err = Error::success();
3313 return std::move(Err);
3317 if (GetImportedOrCreateDecl(
3318 D2, D, Importer.getToContext(), DC, ToBeginLoc,
3328 addDeclToContexts(D, D2);
3334 D2->setInstantiationOfMemberEnum(*ToInstOrErr, SK);
3336 return ToInstOrErr.takeError();
3337 if (
ExpectedSLoc POIOrErr =
import(MemberInfo->getPointOfInstantiation()))
3340 return POIOrErr.takeError();
3346 return std::move(Err);
3352 bool IsFriendTemplate =
false;
3353 if (
auto *DCXX = dyn_cast<CXXRecordDecl>(D)) {
3355 DCXX->getDescribedClassTemplate() &&
3356 DCXX->getDescribedClassTemplate()->getFriendObjectKind() !=
3366 return std::move(Err);
3376 return std::move(Err);
3378 }
else if (Importer.getToContext().getLangOpts().CPlusPlus)
3383 bool DependentFriend = IsFriendTemplate && IsDependentContext;
3390 Importer.findDeclsInToCtx(DC, SearchName);
3391 if (!FoundDecls.empty()) {
3398 for (
auto *FoundDecl : FoundDecls) {
3399 if (!FoundDecl->isInIdentifierNamespace(IDNS))
3403 if (
auto *
Typedef = dyn_cast<TypedefNameDecl>(
Found)) {
3404 if (
const auto *Tag =
Typedef->getUnderlyingType()->getAs<TagType>())
3405 Found = Tag->getDecl();
3408 if (
auto *FoundRecord = dyn_cast<RecordDecl>(
Found)) {
3430 Importer.MapImported(D, FoundDef);
3431 if (
const auto *DCXX = dyn_cast<CXXRecordDecl>(D)) {
3432 auto *FoundCXX = dyn_cast<CXXRecordDecl>(FoundDef);
3433 assert(FoundCXX &&
"Record type mismatch");
3435 if (!Importer.isMinimalImport())
3439 return std::move(Err);
3446 ConflictingDecls.push_back(FoundDecl);
3450 if (!ConflictingDecls.empty() && SearchName) {
3452 SearchName, DC, IDNS, ConflictingDecls.data(),
3453 ConflictingDecls.size());
3455 Name = NameOrErr.get();
3457 return NameOrErr.takeError();
3463 return BeginLocOrErr.takeError();
3468 if (
auto *DCXX = dyn_cast<CXXRecordDecl>(D)) {
3469 if (DCXX->isLambda()) {
3470 auto TInfoOrErr =
import(DCXX->getLambdaTypeInfo());
3472 return TInfoOrErr.takeError();
3473 if (GetImportedOrCreateSpecialDecl(
3475 DC, *TInfoOrErr, Loc, DCXX->getLambdaDependencyKind(),
3476 DCXX->isGenericLambda(), DCXX->getLambdaCaptureDefault()))
3478 Decl *ContextDecl = DCXX->getLambdaContextDecl();
3481 return CDeclOrErr.takeError();
3482 if (ContextDecl !=
nullptr) {
3487 if (GetImportedOrCreateDecl(D2CXX, D, Importer.getToContext(),
3490 cast_or_null<CXXRecordDecl>(PrevDecl)))
3497 addDeclToContexts(D, D2);
3500 DCXX->getDescribedClassTemplate()) {
3503 return std::move(Err);
3506 DCXX->getMemberSpecializationInfo()) {
3508 MemberInfo->getTemplateSpecializationKind();
3514 return ToInstOrErr.takeError();
3517 import(MemberInfo->getPointOfInstantiation()))
3521 return POIOrErr.takeError();
3525 if (GetImportedOrCreateDecl(D2, D, Importer.getToContext(),
3530 addDeclToContexts(D, D2);
3536 return BraceRangeOrErr.takeError();
3540 return QualifierLocOrErr.takeError();
3547 return std::move(Err);
3559 return std::move(Err);
3568 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
3569 for (
auto *FoundDecl : FoundDecls) {
3570 if (!FoundDecl->isInIdentifierNamespace(IDNS))
3573 if (
auto *FoundEnumConstant = dyn_cast<EnumConstantDecl>(FoundDecl)) {
3575 return Importer.MapImported(D, FoundEnumConstant);
3576 ConflictingDecls.push_back(FoundDecl);
3580 if (!ConflictingDecls.empty()) {
3582 Name, DC, IDNS, ConflictingDecls.data(), ConflictingDecls.size());
3584 Name = NameOrErr.get();
3586 return NameOrErr.takeError();
3592 return TypeOrErr.takeError();
3596 return InitOrErr.takeError();
3599 if (GetImportedOrCreateDecl(
3600 ToEnumerator, D, Importer.getToContext(),
cast<EnumDecl>(DC), Loc,
3602 return ToEnumerator;
3607 return ToEnumerator;
3610template <
typename DeclTy>
3614 FromD->getTemplateParameterLists();
3615 if (FromTPLs.empty())
3616 return Error::success();
3618 for (
unsigned int I = 0; I < FromTPLs.size(); ++I)
3620 ToTPLists[I] = *ToTPListOrErr;
3622 return ToTPListOrErr.takeError();
3623 ToD->setTemplateParameterListsInfo(Importer.ToContext, ToTPLists);
3624 return Error::success();
3632 return Error::success();
3638 return Error::success();
3644 ToFD->setInstantiationOfMemberFunction(*InstFDOrErr, TSK);
3646 return InstFDOrErr.takeError();
3652 return POIOrErr.takeError();
3654 return Error::success();
3658 auto FunctionAndArgsOrErr =
3660 if (!FunctionAndArgsOrErr)
3661 return FunctionAndArgsOrErr.takeError();
3664 Importer.getToContext(), std::get<1>(*FunctionAndArgsOrErr));
3668 const auto *FromTAArgsAsWritten = FTSInfo->TemplateArgumentsAsWritten;
3669 if (FromTAArgsAsWritten)
3671 *FromTAArgsAsWritten, ToTAInfo))
3674 ExpectedSLoc POIOrErr =
import(FTSInfo->getPointOfInstantiation());
3676 return POIOrErr.takeError();
3682 ToFD->setFunctionTemplateSpecialization(
3683 std::get<0>(*FunctionAndArgsOrErr), ToTAList,
nullptr,
3684 TSK, FromTAArgsAsWritten ? &ToTAInfo :
nullptr, *POIOrErr);
3685 return Error::success();
3693 Candidates.
addDecl(*ToFTDOrErr);
3695 return ToFTDOrErr.takeError();
3700 const auto *FromTAArgsAsWritten = FromInfo->TemplateArgumentsAsWritten;
3701 if (FromTAArgsAsWritten)
3707 Importer.getToContext(), Candidates,
3708 FromTAArgsAsWritten ? &ToTAInfo :
nullptr);
3709 return Error::success();
3712 llvm_unreachable(
"All cases should be covered!");
3717 auto FunctionAndArgsOrErr =
3719 if (!FunctionAndArgsOrErr)
3720 return FunctionAndArgsOrErr.takeError();
3724 std::tie(
Template, ToTemplArgs) = *FunctionAndArgsOrErr;
3725 void *InsertPos =
nullptr;
3726 auto *FoundSpec =
Template->findSpecialization(ToTemplArgs, InsertPos);
3736 return ToBodyOrErr.takeError();
3738 return Error::success();
3744 const DeclContext *DCi = dyn_cast<DeclContext>(D);
3747 assert(DCi &&
"Declaration should have a context");
3761 ToProcess.push_back(S);
3762 while (!ToProcess.empty()) {
3763 const Stmt *CurrentS = ToProcess.pop_back_val();
3765 if (
const auto *DeclRef = dyn_cast<DeclRefExpr>(CurrentS)) {
3766 if (
const Decl *D = DeclRef->getDecl())
3769 }
else if (
const auto *E =
3770 dyn_cast_or_null<SubstNonTypeTemplateParmExpr>(CurrentS)) {
3771 if (
const Decl *D = E->getAssociatedDecl())
3804class IsTypeDeclaredInsideVisitor
3805 :
public TypeVisitor<IsTypeDeclaredInsideVisitor, std::optional<bool>> {
3807 IsTypeDeclaredInsideVisitor(
const FunctionDecl *ParentDC)
3808 : ParentDC(ParentDC) {}
3810 bool CheckType(QualType T) {
3814 if (std::optional<bool> Res = Visit(T.
getTypePtr()))
3819 if (std::optional<bool> Res = Visit(DsT.
getTypePtr()))
3827 std::optional<bool> VisitTagType(
const TagType *T) {
3828 if (
auto *Spec = dyn_cast<ClassTemplateSpecializationDecl>(T->getDecl()))
3829 for (
const auto &Arg : Spec->getTemplateArgs().asArray())
3830 if (checkTemplateArgument(Arg))
3835 std::optional<bool> VisitPointerType(
const PointerType *T) {
3839 std::optional<bool> VisitReferenceType(
const ReferenceType *T) {
3843 std::optional<bool> VisitTypedefType(
const TypedefType *T) {
3847 std::optional<bool> VisitUsingType(
const UsingType *T) {
3852 VisitTemplateSpecializationType(
const TemplateSpecializationType *T) {
3853 for (
const auto &Arg : T->template_arguments())
3854 if (checkTemplateArgument(Arg))
3860 std::optional<bool> VisitUnaryTransformType(
const UnaryTransformType *T) {
3861 return CheckType(T->getBaseType());
3865 VisitSubstTemplateTypeParmType(
const SubstTemplateTypeParmType *T) {
3872 std::optional<bool> VisitConstantArrayType(
const ConstantArrayType *T) {
3879 std::optional<bool> VisitVariableArrayType(
const VariableArrayType *T) {
3881 "Variable array should not occur in deduced return type of a function");
3884 std::optional<bool> VisitIncompleteArrayType(
const IncompleteArrayType *T) {
3885 llvm_unreachable(
"Incomplete array should not occur in deduced return type "
3889 std::optional<bool> VisitDependentArrayType(
const IncompleteArrayType *T) {
3890 llvm_unreachable(
"Dependent array should not occur in deduced return type "
3895 const DeclContext *
const ParentDC;
3897 bool checkTemplateArgument(
const TemplateArgument &Arg) {
3917 if (checkTemplateArgument(PackArg))
3929 llvm_unreachable(
"Unknown TemplateArgument::ArgKind enum");
3939 assert(FromFPT &&
"Must be called on FunctionProtoType");
3941 auto IsCXX11Lambda = [&]() {
3942 if (Importer.FromContext.getLangOpts().CPlusPlus14)
3948 QualType RetT = FromFPT->getReturnType();
3951 IsTypeDeclaredInsideVisitor Visitor(Def ? Def : D);
3952 return Visitor.CheckType(RetT);
3962 ExplicitExpr = importChecked(Err, ESpec.
getExpr());
3969 auto RedeclIt = Redecls.begin();
3972 for (; RedeclIt != Redecls.end() && *RedeclIt != D; ++RedeclIt) {
3975 return ToRedeclOrErr.takeError();
3977 assert(*RedeclIt == D);
3985 return std::move(Err);
4000 if (!FoundFunctionOrErr)
4001 return FoundFunctionOrErr.takeError();
4002 if (
FunctionDecl *FoundFunction = *FoundFunctionOrErr) {
4003 if (
Decl *Def = FindAndMapDefinition(D, FoundFunction))
4005 FoundByLookup = FoundFunction;
4013 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
4014 for (
auto *FoundDecl : FoundDecls) {
4015 if (!FoundDecl->isInIdentifierNamespace(IDNS))
4018 if (
auto *FoundFunction = dyn_cast<FunctionDecl>(FoundDecl)) {
4023 if (
Decl *Def = FindAndMapDefinition(D, FoundFunction))
4025 FoundByLookup = FoundFunction;
4032 if (Importer.getToContext().getLangOpts().CPlusPlus)
4036 Importer.ToDiag(Loc, diag::warn_odr_function_type_inconsistent)
4037 << Name << D->
getType() << FoundFunction->getType();
4038 Importer.ToDiag(FoundFunction->getLocation(), diag::note_odr_value_here)
4039 << FoundFunction->getType();
4040 ConflictingDecls.push_back(FoundDecl);
4044 if (!ConflictingDecls.empty()) {
4046 Name, DC, IDNS, ConflictingDecls.data(), ConflictingDecls.size());
4048 Name = NameOrErr.get();
4050 return NameOrErr.takeError();
4060 if (FoundByLookup) {
4070 "Templated function mapped to non-templated?");
4071 Importer.MapImported(DescribedD,
4074 return Importer.MapImported(D, FoundByLookup);
4086 return std::move(Err);
4097 bool UsedDifferentProtoType =
false;
4099 QualType FromReturnTy = FromFPT->getReturnType();
4108 Importer.FindFunctionDeclImportCycle.isCycle(D)) {
4109 FromReturnTy = Importer.getFromContext().VoidTy;
4110 UsedDifferentProtoType =
true;
4121 FromEPI = DefaultEPI;
4122 UsedDifferentProtoType =
true;
4124 FromTy = Importer.getFromContext().getFunctionType(
4125 FromReturnTy, FromFPT->getParamTypes(), FromEPI);
4126 FromTSI = Importer.getFromContext().getTrivialTypeSourceInfo(
4130 Error Err = Error::success();
4131 auto ScopedReturnTypeDeclCycleDetector =
4132 Importer.FindFunctionDeclImportCycle.makeScopedCycleDetection(D);
4143 return std::move(Err);
4149 Parameters.push_back(*ToPOrErr);
4151 return ToPOrErr.takeError();
4156 if (
auto *FromConstructor = dyn_cast<CXXConstructorDecl>(D)) {
4158 importExplicitSpecifier(Err, FromConstructor->getExplicitSpecifier());
4160 return std::move(Err);
4162 if (FromConstructor->isInheritingConstructor()) {
4164 import(FromConstructor->getInheritedConstructor());
4165 if (!ImportedInheritedCtor)
4166 return ImportedInheritedCtor.takeError();
4167 ToInheritedConstructor = *ImportedInheritedCtor;
4169 if (GetImportedOrCreateDecl<CXXConstructorDecl>(
4171 ToInnerLocStart, NameInfo, T, TInfo, ESpec, D->
UsesFPIntrin(),
4173 ToInheritedConstructor, TrailingRequiresClause))
4177 Error Err = Error::success();
4179 Err,
const_cast<FunctionDecl *
>(FromDtor->getOperatorDelete()));
4180 auto ToThisArg =
importChecked(Err, FromDtor->getOperatorDeleteThisArg());
4182 return std::move(Err);
4184 if (GetImportedOrCreateDecl<CXXDestructorDecl>(
4186 ToInnerLocStart, NameInfo, T, TInfo, D->
UsesFPIntrin(),
4188 TrailingRequiresClause))
4195 dyn_cast<CXXConversionDecl>(D)) {
4197 importExplicitSpecifier(Err, FromConversion->getExplicitSpecifier());
4199 return std::move(Err);
4200 if (GetImportedOrCreateDecl<CXXConversionDecl>(
4202 ToInnerLocStart, NameInfo, T, TInfo, D->
UsesFPIntrin(),
4206 }
else if (
auto *
Method = dyn_cast<CXXMethodDecl>(D)) {
4207 if (GetImportedOrCreateDecl<CXXMethodDecl>(
4209 ToInnerLocStart, NameInfo, T, TInfo,
Method->getStorageClass(),
4213 }
else if (
auto *Guide = dyn_cast<CXXDeductionGuideDecl>(D)) {
4215 importExplicitSpecifier(Err, Guide->getExplicitSpecifier());
4221 return std::move(Err);
4222 if (GetImportedOrCreateDecl<CXXDeductionGuideDecl>(
4223 ToFunction, D, Importer.getToContext(), DC, ToInnerLocStart, ESpec,
4224 NameInfo, T, TInfo, ToEndLoc, Ctor,
4225 Guide->getDeductionCandidateKind(), TrailingRequiresClause,
4229 if (GetImportedOrCreateDecl(
4230 ToFunction, D, Importer.getToContext(), DC, ToInnerLocStart,
4238 if (FoundByLookup) {
4277 Importer.getToContext(), {}, Msg));
4280 for (
auto *Param : Parameters) {
4281 Param->setOwningFunction(ToFunction);
4284 LT->update(Param, Importer.getToContext().getTranslationUnitDecl());
4286 ToFunction->setParams(Parameters);
4293 for (
unsigned I = 0, N = Parameters.size(); I != N; ++I)
4294 ProtoLoc.setParam(I, Parameters[I]);
4300 auto ToFTOrErr =
import(FromFT);
4302 return ToFTOrErr.takeError();
4306 if (
auto *FromConstructor = dyn_cast<CXXConstructorDecl>(D)) {
4307 if (
unsigned NumInitializers = FromConstructor->getNumCtorInitializers()) {
4311 FromConstructor->inits(), CtorInitializers))
4312 return std::move(Err);
4315 llvm::copy(CtorInitializers, Memory);
4317 ToCtor->setCtorInitializers(Memory);
4318 ToCtor->setNumCtorInitializers(NumInitializers);
4324 return std::move(Err);
4326 if (
auto *FromCXXMethod = dyn_cast<CXXMethodDecl>(D))
4329 return std::move(Err);
4335 return std::move(Err);
4339 if (UsedDifferentProtoType) {
4341 ToFunction->
setType(*TyOrErr);
4343 return TyOrErr.takeError();
4347 return TSIOrErr.takeError();
4352 addDeclToContexts(D, ToFunction);
4355 for (++RedeclIt; RedeclIt != Redecls.end(); ++RedeclIt) {
4358 return ToRedeclOrErr.takeError();
4392 return std::move(Err);
4397 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
4398 for (
auto *FoundDecl : FoundDecls) {
4399 if (
FieldDecl *FoundField = dyn_cast<FieldDecl>(FoundDecl)) {
4406 if (Importer.IsStructurallyEquivalent(D->
getType(),
4407 FoundField->getType())) {
4408 Importer.MapImported(D, FoundField);
4416 if (
ExpectedExpr ToInitializerOrErr =
import(FromInitializer)) {
4419 assert(FoundField->hasInClassInitializer() &&
4420 "Field should have an in-class initializer if it has an "
4421 "expression for it.");
4422 if (!FoundField->getInClassInitializer())
4423 FoundField->setInClassInitializer(*ToInitializerOrErr);
4425 return ToInitializerOrErr.takeError();
4432 Importer.ToDiag(Loc, diag::warn_odr_field_type_inconsistent)
4433 << Name << D->
getType() << FoundField->getType();
4434 Importer.ToDiag(FoundField->getLocation(), diag::note_odr_value_here)
4435 << FoundField->getType();
4441 Error Err = Error::success();
4447 return std::move(Err);
4448 const Type *ToCapturedVLAType =
nullptr;
4449 if (
Error Err = Importer.importInto(
4451 return std::move(Err);
4454 if (GetImportedOrCreateDecl(ToField, D, Importer.getToContext(), DC,
4456 ToType, ToTInfo, ToBitWidth, D->
isMutable(),
4463 if (ToCapturedVLAType)
4470 return std::move(Err);
4471 if (ToInitializer) {
4473 if (AlreadyImported)
4474 assert(ToInitializer == AlreadyImported &&
4475 "Duplicate import of in-class initializer.");
4490 return std::move(Err);
4495 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
4496 for (
unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
4497 if (
auto *FoundField = dyn_cast<IndirectFieldDecl>(FoundDecls[I])) {
4504 if (Importer.IsStructurallyEquivalent(D->
getType(),
4505 FoundField->getType(),
4507 Importer.MapImported(D, FoundField);
4512 if (!Name && I < N-1)
4516 Importer.ToDiag(Loc, diag::warn_odr_field_type_inconsistent)
4517 << Name << D->
getType() << FoundField->getType();
4518 Importer.ToDiag(FoundField->getLocation(), diag::note_odr_value_here)
4519 << FoundField->getType();
4526 auto TypeOrErr =
import(D->
getType());
4528 return TypeOrErr.takeError();
4534 for (
auto *PI : D->
chain())
4536 NamedChain[i++] = *ToD;
4538 return ToD.takeError();
4542 if (GetImportedOrCreateDecl(ToIndirectField, D, Importer.getToContext(), DC,
4545 return ToIndirectField;
4550 return ToIndirectField;
4581 unsigned int FriendCount = 0;
4585 for (
FriendDecl *FoundFriend : RD->friends()) {
4586 if (FoundFriend == FD) {
4587 FriendPosition = FriendCount;
4594 assert(FriendPosition &&
"Friend decl not found in own parent.");
4596 return {FriendCount, *FriendPosition};
4603 return std::move(Err);
4610 for (
FriendDecl *ImportedFriend : RD->friends())
4612 ImportedEquivalentFriends.push_back(ImportedFriend);
4617 assert(ImportedEquivalentFriends.size() <= CountAndPosition.
TotalCount &&
4618 "Class with non-matching friends is imported, ODR check wrong?");
4619 if (ImportedEquivalentFriends.size() == CountAndPosition.
TotalCount)
4620 return Importer.MapImported(
4621 D, ImportedEquivalentFriends[CountAndPosition.
IndexOfDecl]);
4629 return std::move(Err);
4640 return TSIOrErr.takeError();
4644 auto **FromTPLists = D->getTrailingObjects();
4645 for (
unsigned I = 0; I < D->NumTPLists; I++) {
4646 if (
auto ListOrErr =
import(FromTPLists[I]))
4647 ToTPLists[I] = *ListOrErr;
4649 return ListOrErr.takeError();
4654 return LocationOrErr.takeError();
4656 if (!FriendLocOrErr)
4657 return FriendLocOrErr.takeError();
4659 if (!EllipsisLocOrErr)
4660 return EllipsisLocOrErr.takeError();
4663 if (GetImportedOrCreateDecl(FrD, D, Importer.getToContext(), DC,
4664 *LocationOrErr, ToFU, *FriendLocOrErr,
4665 *EllipsisLocOrErr, ToTPLists))
4681 return std::move(Err);
4686 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
4687 for (
auto *FoundDecl : FoundDecls) {
4688 if (
ObjCIvarDecl *FoundIvar = dyn_cast<ObjCIvarDecl>(FoundDecl)) {
4689 if (Importer.IsStructurallyEquivalent(D->
getType(),
4690 FoundIvar->getType())) {
4691 Importer.MapImported(D, FoundIvar);
4695 Importer.ToDiag(Loc, diag::warn_odr_ivar_type_inconsistent)
4696 << Name << D->
getType() << FoundIvar->getType();
4697 Importer.ToDiag(FoundIvar->getLocation(), diag::note_odr_value_here)
4698 << FoundIvar->getType();
4704 Error Err = Error::success();
4710 return std::move(Err);
4713 if (GetImportedOrCreateDecl(
4716 ToType, ToTypeSourceInfo,
4728 auto RedeclIt = Redecls.begin();
4731 for (; RedeclIt != Redecls.end() && *RedeclIt != D; ++RedeclIt) {
4734 return RedeclOrErr.takeError();
4736 assert(*RedeclIt == D);
4744 return std::move(Err);
4750 VarDecl *FoundByLookup =
nullptr;
4754 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
4755 for (
auto *FoundDecl : FoundDecls) {
4756 if (!FoundDecl->isInIdentifierNamespace(IDNS))
4759 if (
auto *FoundVar = dyn_cast<VarDecl>(FoundDecl)) {
4762 if (Importer.IsStructurallyEquivalent(D->
getType(),
4763 FoundVar->getType())) {
4771 return Importer.MapImported(D, FoundDef);
4775 const VarDecl *FoundDInit =
nullptr;
4776 if (D->
getInit() && FoundVar->getAnyInitializer(FoundDInit))
4778 return Importer.MapImported(D,
const_cast<VarDecl*
>(FoundDInit));
4780 FoundByLookup = FoundVar;
4785 = Importer.getToContext().getAsArrayType(FoundVar->getType());
4787 = Importer.getToContext().getAsArrayType(D->
getType());
4788 if (FoundArray && TArray) {
4792 if (
auto TyOrErr =
import(D->
getType()))
4793 FoundVar->setType(*TyOrErr);
4795 return TyOrErr.takeError();
4797 FoundByLookup = FoundVar;
4801 FoundByLookup = FoundVar;
4806 Importer.ToDiag(Loc, diag::warn_odr_variable_type_inconsistent)
4807 << Name << D->
getType() << FoundVar->getType();
4808 Importer.ToDiag(FoundVar->getLocation(), diag::note_odr_value_here)
4809 << FoundVar->getType();
4810 ConflictingDecls.push_back(FoundDecl);
4814 if (!ConflictingDecls.empty()) {
4816 Name, DC, IDNS, ConflictingDecls.data(), ConflictingDecls.size());
4818 Name = NameOrErr.get();
4820 return NameOrErr.takeError();
4824 Error Err = Error::success();
4830 return std::move(Err);
4833 if (
auto *FromDecomp = dyn_cast<DecompositionDecl>(D)) {
4837 return std::move(Err);
4839 if (GetImportedOrCreateDecl(
4840 ToDecomp, FromDecomp, Importer.getToContext(), DC, ToInnerLocStart,
4846 if (GetImportedOrCreateDecl(ToVar, D, Importer.getToContext(), DC,
4847 ToInnerLocStart, Loc,
4862 if (FoundByLookup) {
4871 return ToVTOrErr.takeError();
4878 return ToInstOrErr.takeError();
4879 if (
ExpectedSLoc POIOrErr =
import(MSI->getPointOfInstantiation()))
4882 return POIOrErr.takeError();
4886 return std::move(Err);
4891 addDeclToContexts(D, ToVar);
4894 for (++RedeclIt; RedeclIt != Redecls.end(); ++RedeclIt) {
4897 return RedeclOrErr.takeError();
4906 DeclContext *DC = Importer.getToContext().getTranslationUnitDecl();
4908 Error Err = Error::success();
4913 return std::move(Err);
4917 if (GetImportedOrCreateDecl(ToParm, D, Importer.getToContext(), DC,
4918 ToLocation, ToDeclName.getAsIdentifierInfo(),
4930 return LocOrErr.takeError();
4939 return ToDefArgOrErr.takeError();
4943 if (
auto ToDefArgOrErr =
import(FromParam->
getDefaultArg()))
4946 return ToDefArgOrErr.takeError();
4949 return Error::success();
4954 Error Err = Error::success();
4959 return std::move(Err);
4966 DeclContext *DC = Importer.getToContext().getTranslationUnitDecl();
4968 Error Err = Error::success();
4975 return std::move(Err);
4978 if (GetImportedOrCreateDecl(ToParm, D, Importer.getToContext(), DC,
4979 ToInnerLocStart, ToLocation,
4980 ToDeclName.getAsIdentifierInfo(), ToType,
4989 return std::move(Err);
5009 return std::move(Err);
5013 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
5014 for (
auto *FoundDecl : FoundDecls) {
5015 if (
auto *FoundMethod = dyn_cast<ObjCMethodDecl>(FoundDecl)) {
5021 FoundMethod->getReturnType())) {
5022 Importer.ToDiag(Loc, diag::warn_odr_objc_method_result_type_inconsistent)
5024 << FoundMethod->getReturnType();
5025 Importer.ToDiag(FoundMethod->getLocation(),
5026 diag::note_odr_objc_method_here)
5033 if (D->
param_size() != FoundMethod->param_size()) {
5034 Importer.ToDiag(Loc, diag::warn_odr_objc_method_num_params_inconsistent)
5036 << D->
param_size() << FoundMethod->param_size();
5037 Importer.ToDiag(FoundMethod->getLocation(),
5038 diag::note_odr_objc_method_here)
5046 PEnd = D->
param_end(), FoundP = FoundMethod->param_begin();
5047 P != PEnd; ++
P, ++FoundP) {
5048 if (!Importer.IsStructurallyEquivalent((*P)->getType(),
5049 (*FoundP)->getType())) {
5050 Importer.FromDiag((*P)->getLocation(),
5051 diag::warn_odr_objc_method_param_type_inconsistent)
5053 << (*P)->getType() << (*FoundP)->getType();
5054 Importer.ToDiag((*FoundP)->getLocation(), diag::note_odr_value_here)
5055 << (*FoundP)->getType();
5063 if (D->
isVariadic() != FoundMethod->isVariadic()) {
5064 Importer.ToDiag(Loc, diag::warn_odr_objc_method_variadic_inconsistent)
5066 Importer.ToDiag(FoundMethod->getLocation(),
5067 diag::note_odr_objc_method_here)
5074 return Importer.MapImported(D, FoundMethod);
5078 Error Err = Error::success();
5081 auto ToReturnTypeSourceInfo =
5084 return std::move(Err);
5087 if (GetImportedOrCreateDecl(
5088 ToMethod, D, Importer.getToContext(), Loc, ToEndLoc,
5102 ToParams.push_back(*ToPOrErr);
5104 return ToPOrErr.takeError();
5108 for (
auto *ToParam : ToParams) {
5109 ToParam->setOwningFunction(ToMethod);
5117 return std::move(Err);
5119 ToMethod->
setMethodParams(Importer.getToContext(), ToParams, ToSelLocs);
5141 return std::move(Err);
5145 Error Err = Error::success();
5151 return std::move(Err);
5154 if (GetImportedOrCreateDecl(
5158 ToColonLoc, ToTypeSourceInfo))
5164 return std::move(Err);
5165 Result->setTypeForDecl(ToTypeForDecl);
5166 Result->setLexicalDeclContext(LexicalDC);
5177 return std::move(Err);
5183 return std::move(Err);
5191 Error Err = Error::success();
5197 return std::move(Err);
5199 if (GetImportedOrCreateDecl(ToCategory, D, Importer.getToContext(), DC,
5215 return PListOrErr.takeError();
5224 FromProto != FromProtoEnd;
5225 ++FromProto, ++FromProtoLoc) {
5227 Protocols.push_back(*ToProtoOrErr);
5229 return ToProtoOrErr.takeError();
5231 if (
ExpectedSLoc ToProtoLocOrErr =
import(*FromProtoLoc))
5232 ProtocolLocs.push_back(*ToProtoLocOrErr);
5234 return ToProtoLocOrErr.takeError();
5239 ProtocolLocs.data(), Importer.getToContext());
5242 Importer.MapImported(D, ToCategory);
5247 return std::move(Err);
5255 return ToImplOrErr.takeError();
5267 return Error::success();
5280 FromProto != FromProtoEnd;
5281 ++FromProto, ++FromProtoLoc) {
5283 Protocols.push_back(*ToProtoOrErr);
5285 return ToProtoOrErr.takeError();
5287 if (
ExpectedSLoc ToProtoLocOrErr =
import(*FromProtoLoc))
5288 ProtocolLocs.push_back(*ToProtoLocOrErr);
5290 return ToProtoLocOrErr.takeError();
5296 ProtocolLocs.data(), Importer.getToContext());
5303 return Error::success();
5313 return Importer.MapImported(D, *ImportedDefOrErr);
5315 return ImportedDefOrErr.takeError();
5324 return std::move(Err);
5329 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
5330 for (
auto *FoundDecl : FoundDecls) {
5334 if ((MergeWithProtocol = dyn_cast<ObjCProtocolDecl>(FoundDecl)))
5341 if (!ToAtBeginLocOrErr)
5342 return ToAtBeginLocOrErr.takeError();
5344 if (GetImportedOrCreateDecl(ToProto, D, Importer.getToContext(), DC,
5353 Importer.MapImported(D, ToProto);
5357 return std::move(Err);
5365 return std::move(Err);
5368 if (!ExternLocOrErr)
5369 return ExternLocOrErr.takeError();
5373 return LangLocOrErr.takeError();
5378 if (GetImportedOrCreateDecl(ToLinkageSpec, D, Importer.getToContext(), DC,
5379 *ExternLocOrErr, *LangLocOrErr,
5381 return ToLinkageSpec;
5385 if (!RBraceLocOrErr)
5386 return RBraceLocOrErr.takeError();
5393 return ToLinkageSpec;
5404 return ToShadowOrErr.takeError();
5415 return std::move(Err);
5419 Error Err = Error::success();
5424 return std::move(Err);
5428 return std::move(Err);
5431 if (GetImportedOrCreateDecl(ToUsing, D, Importer.getToContext(), DC,
5432 ToUsingLoc, ToQualifierLoc, NameInfo,
5440 Importer.getFromContext().getInstantiatedFromUsingDecl(D)) {
5442 Importer.getToContext().setInstantiatedFromUsingDecl(
5443 ToUsing, *ToPatternOrErr);
5445 return ToPatternOrErr.takeError();
5457 return std::move(Err);
5461 Error Err = Error::success();
5467 return std::move(Err);
5470 if (GetImportedOrCreateDecl(ToUsingEnum, D, Importer.getToContext(), DC,
5471 ToUsingLoc, ToEnumLoc, ToNameLoc, ToEnumType))
5478 Importer.getFromContext().getInstantiatedFromUsingEnumDecl(D)) {
5480 Importer.getToContext().setInstantiatedFromUsingEnumDecl(ToUsingEnum,
5483 return ToPatternOrErr.takeError();
5495 return std::move(Err);
5500 if (!ToIntroducerOrErr)
5501 return ToIntroducerOrErr.takeError();
5505 return ToTargetOrErr.takeError();
5508 if (
auto *FromConstructorUsingShadow =
5509 dyn_cast<ConstructorUsingShadowDecl>(D)) {
5510 Error Err = Error::success();
5512 Err, FromConstructorUsingShadow->getNominatedBaseClassShadowDecl());
5514 return std::move(Err);
5520 if (GetImportedOrCreateDecl<ConstructorUsingShadowDecl>(
5521 ToShadow, D, Importer.getToContext(), DC, Loc,
5523 Nominated ? Nominated : *ToTargetOrErr,
5524 FromConstructorUsingShadow->constructsVirtualBase()))
5527 if (GetImportedOrCreateDecl(ToShadow, D, Importer.getToContext(), DC, Loc,
5528 Name, *ToIntroducerOrErr, *ToTargetOrErr))
5536 Importer.getFromContext().getInstantiatedFromUsingShadowDecl(D)) {
5538 Importer.getToContext().setInstantiatedFromUsingShadowDecl(
5539 ToShadow, *ToPatternOrErr);
5543 return ToPatternOrErr.takeError();
5557 return std::move(Err);
5562 if (!ToComAncestorOrErr)
5563 return ToComAncestorOrErr.takeError();
5565 Error Err = Error::success();
5568 auto ToNamespaceKeyLocation =
5573 return std::move(Err);
5576 if (GetImportedOrCreateDecl(ToUsingDir, D, Importer.getToContext(), DC,
5578 ToNamespaceKeyLocation,
5581 ToNominatedNamespace, *ToComAncestorOrErr))
5596 return std::move(Err);
5600 auto ToInstantiatedFromUsingOrErr =
5602 if (!ToInstantiatedFromUsingOrErr)
5603 return ToInstantiatedFromUsingOrErr.takeError();
5606 return std::move(Err);
5609 if (GetImportedOrCreateDecl(ToUsingPack, D, Importer.getToContext(), DC,
5614 addDeclToContexts(D, ToUsingPack);
5626 return std::move(Err);
5630 Error Err = Error::success();
5636 return std::move(Err);
5640 return std::move(Err);
5643 if (GetImportedOrCreateDecl(ToUsingValue, D, Importer.getToContext(), DC,
5644 ToUsingLoc, ToQualifierLoc, NameInfo,
5646 return ToUsingValue;
5652 return ToUsingValue;
5662 return std::move(Err);
5666 Error Err = Error::success();
5672 return std::move(Err);
5675 if (GetImportedOrCreateDecl(ToUsing, D, Importer.getToContext(), DC,
5676 ToUsingLoc, ToTypenameLoc,
5677 ToQualifierLoc, Loc, Name, ToEllipsisLoc))
5688 Decl* ToD =
nullptr;
5690#define BuiltinTemplate(BTName) \
5691 case BuiltinTemplateKind::BTK##BTName: \
5692 ToD = Importer.getToContext().get##BTName##Decl(); \
5694#include "clang/Basic/BuiltinTemplates.inc"
5696 assert(ToD &&
"BuiltinTemplateDecl of unsupported kind!");
5697 Importer.MapImported(D, ToD);
5707 if (
auto FromSuperOrErr =
import(FromSuper))
5708 FromSuper = *FromSuperOrErr;
5710 return FromSuperOrErr.takeError();
5714 if ((
bool)FromSuper != (
bool)ToSuper ||
5717 diag::warn_odr_objc_superclass_inconsistent)
5724 diag::note_odr_objc_missing_superclass);
5727 diag::note_odr_objc_superclass)
5731 diag::note_odr_objc_missing_superclass);
5737 return Error::success();
5748 return SuperTInfoOrErr.takeError();
5759 FromProto != FromProtoEnd;
5760 ++FromProto, ++FromProtoLoc) {
5762 Protocols.push_back(*ToProtoOrErr);
5764 return ToProtoOrErr.takeError();
5766 if (
ExpectedSLoc ToProtoLocOrErr =
import(*FromProtoLoc))
5767 ProtocolLocs.push_back(*ToProtoLocOrErr);
5769 return ToProtoLocOrErr.takeError();
5775 ProtocolLocs.data(), Importer.getToContext());
5780 auto ToCatOrErr =
import(Cat);
5782 return ToCatOrErr.takeError();
5791 return ToImplOrErr.takeError();
5798 return Error::success();
5807 for (
auto *fromTypeParam : *list) {
5808 if (
auto toTypeParamOrErr =
import(fromTypeParam))
5809 toTypeParams.push_back(*toTypeParamOrErr);
5811 return toTypeParamOrErr.takeError();
5815 if (!LAngleLocOrErr)
5816 return LAngleLocOrErr.takeError();
5819 if (!RAngleLocOrErr)
5820 return RAngleLocOrErr.takeError();
5835 return Importer.MapImported(D, *ImportedDefOrErr);
5837 return ImportedDefOrErr.takeError();
5846 return std::move(Err);
5852 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
5853 for (
auto *FoundDecl : FoundDecls) {
5857 if ((MergeWithIface = dyn_cast<ObjCInterfaceDecl>(FoundDecl)))
5865 if (!AtBeginLocOrErr)
5866 return AtBeginLocOrErr.takeError();
5868 if (GetImportedOrCreateDecl(
5869 ToIface, D, Importer.getToContext(), DC,
5877 Importer.MapImported(D, ToIface);
5880 if (
auto ToPListOrErr =
5884 return ToPListOrErr.takeError();
5888 return std::move(Err);
5897 return std::move(Err);
5903 return std::move(Err);
5905 Error Err = Error::success();
5910 return std::move(Err);
5912 if (GetImportedOrCreateDecl(
5913 ToImpl, D, Importer.getToContext(), DC,
5914 Importer.Import(D->
getIdentifier()), Category->getClassInterface(),
5915 ToLocation, ToAtStartLoc, ToCategoryNameLoc))
5920 Category->setImplementation(ToImpl);
5923 Importer.MapImported(D, ToImpl);
5925 return std::move(Err);
5935 return std::move(Err);
5940 return std::move(Err);
5948 return std::move(Err);
5950 Error Err = Error::success();
5957 return std::move(Err);
5959 if (GetImportedOrCreateDecl(Impl, D, Importer.getToContext(),
5968 Impl->setLexicalDeclContext(LexicalDC);
5982 Importer.ToDiag(Impl->getLocation(),
5983 diag::warn_odr_objc_superclass_inconsistent)
5987 if (Impl->getSuperClass())
5988 Importer.ToDiag(Impl->getLocation(),
5989 diag::note_odr_objc_superclass)
5990 << Impl->getSuperClass()->getDeclName();
5992 Importer.ToDiag(Impl->getLocation(),
5993 diag::note_odr_objc_missing_superclass);
5996 diag::note_odr_objc_superclass)
6000 diag::note_odr_objc_missing_superclass);
6008 return std::move(Err);
6020 return std::move(Err);
6025 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
6026 for (
auto *FoundDecl : FoundDecls) {
6027 if (
auto *FoundProp = dyn_cast<ObjCPropertyDecl>(FoundDecl)) {
6034 if (!Importer.IsStructurallyEquivalent(D->
getType(),
6035 FoundProp->getType())) {
6036 Importer.ToDiag(Loc, diag::warn_odr_objc_property_type_inconsistent)
6037 << Name << D->
getType() << FoundProp->getType();
6038 Importer.ToDiag(FoundProp->getLocation(), diag::note_odr_value_here)
6039 << FoundProp->getType();
6047 Importer.MapImported(D, FoundProp);
6052 Error Err = Error::success();
6058 return std::move(Err);
6062 if (GetImportedOrCreateDecl(
6063 ToProperty, D, Importer.getToContext(), DC, Loc,
6065 ToLParenLoc, ToType,
6077 return std::move(Err);
6097 return std::move(Err);
6101 return std::move(Err);
6108 return std::move(Err);
6111 = InImpl->FindPropertyImplDecl(
Property->getIdentifier(),
6115 Error Err = Error::success();
6118 auto ToPropertyIvarDeclLoc =
6121 return std::move(Err);
6123 if (GetImportedOrCreateDecl(ToImpl, D, Importer.getToContext(), DC,
6127 ToPropertyIvarDeclLoc))
6137 diag::warn_odr_objc_property_impl_kind_inconsistent)
6142 diag::note_odr_objc_property_impl_kind)
6153 diag::warn_odr_objc_synthesize_ivar_inconsistent)
6158 diag::note_odr_objc_synthesize_ivar_here)
6165 Importer.MapImported(D, ToImpl);
6173 Error Err = Error::success();
6177 return std::move(Err);
6181 return Importer.ToContext.getTemplateParamObjectDecl(T,
V);
6183 (void)GetImportedOrCreateSpecialDecl(ToD,
Create, D, ToType, ToValue);
6195 return BeginLocOrErr.takeError();
6199 return LocationOrErr.takeError();
6202 if (GetImportedOrCreateDecl(
6203 ToD, D, Importer.getToContext(),
6205 *BeginLocOrErr, *LocationOrErr,
6214 Error Err = Error::success();
6215 auto ToConceptRef =
importChecked(Err, TC->getConceptReference());
6216 auto ToIDC =
importChecked(Err, TC->getImmediatelyDeclaredConstraint());
6218 return std::move(Err);
6223 if (
Error Err = importTemplateParameterDefaultArgument(D, ToD))
6232 Error Err = Error::success();
6239 return std::move(Err);
6242 if (GetImportedOrCreateDecl(ToD, D, Importer.getToContext(),
6244 ToInnerLocStart, ToLocation, D->
getDepth(),
6246 ToDeclName.getAsIdentifierInfo(), ToType,
6250 Err = importTemplateParameterDefaultArgument(D, ToD);
6259 bool IsCanonical =
false;
6260 if (
auto *CanonD = Importer.getFromContext()
6261 .findCanonicalTemplateTemplateParmDeclInternal(D);
6268 return NameOrErr.takeError();
6273 return LocationOrErr.takeError();
6277 if (!TemplateParamsOrErr)
6278 return TemplateParamsOrErr.takeError();
6281 if (GetImportedOrCreateDecl(
6282 ToD, D, Importer.getToContext(),
6289 if (
Error Err = importTemplateParameterDefaultArgument(D, ToD))
6293 return Importer.getToContext()
6294 .insertCanonicalTemplateTemplateParmDeclInternal(ToD);
6302 assert(D->getTemplatedDecl() &&
"Should be called on templates only");
6303 auto *ToTemplatedDef = D->getTemplatedDecl()->getDefinition();
6304 if (!ToTemplatedDef)
6306 auto *TemplateWithDef = ToTemplatedDef->getDescribedTemplate();
6307 return cast_or_null<T>(TemplateWithDef);
6318 return std::move(Err);
6330 TD->getLexicalDeclContext()->isDependentContext();
6332 bool DependentFriend = IsDependentFriend(D);
6339 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
6340 for (
auto *FoundDecl : FoundDecls) {
6345 auto *FoundTemplate = dyn_cast<ClassTemplateDecl>(FoundDecl);
6346 if (FoundTemplate) {
6351 bool IgnoreTemplateParmDepth =
6355 IgnoreTemplateParmDepth)) {
6356 if (DependentFriend || IsDependentFriend(FoundTemplate))
6362 return Importer.MapImported(D, TemplateWithDef);
6364 FoundByLookup = FoundTemplate;
6382 ConflictingDecls.push_back(FoundDecl);
6386 if (!ConflictingDecls.empty()) {
6389 ConflictingDecls.size());
6391 Name = NameOrErr.get();
6393 return NameOrErr.takeError();
6400 if (!TemplateParamsOrErr)
6401 return TemplateParamsOrErr.takeError();
6406 return std::move(Err);
6410 if (GetImportedOrCreateDecl(D2, D, Importer.getToContext(), DC, Loc, Name,
6411 *TemplateParamsOrErr, ToTemplated))
6419 addDeclToContexts(D, D2);
6420 updateLookupTableForTemplateParameters(**TemplateParamsOrErr);
6422 if (FoundByLookup) {
6436 "Found decl must have its templated decl set");
6439 if (ToTemplated != PrevTemplated)
6453 return std::move(Err);
6458 return std::move(Err);
6464 return std::move(Err);
6467 void *InsertPos =
nullptr;
6470 dyn_cast<ClassTemplatePartialSpecializationDecl>(D);
6478 return ToTPListOrErr.takeError();
6479 ToTPList = *ToTPListOrErr;
6490 Importer.MapImported(D, PrevDefinition);
6493 for (
auto *FromField : D->
fields()) {
6494 auto ToOrErr =
import(FromField);
6496 return ToOrErr.takeError();
6502 auto ToOrErr =
import(FromM);
6504 return ToOrErr.takeError();
6512 return PrevDefinition;
6523 return BeginLocOrErr.takeError();
6526 return IdLocOrErr.takeError();
6532 return std::move(Err);
6538 if (GetImportedOrCreateDecl<ClassTemplatePartialSpecializationDecl>(
6539 D2, D, Importer.getToContext(), D->
getTagKind(), DC, *BeginLocOrErr,
6540 *IdLocOrErr, ToTPList, ClassTemplate,
ArrayRef(TemplateArgs),
6542 cast_or_null<ClassTemplatePartialSpecializationDecl>(PrevDecl)))
6554 PartSpec2->setInstantiatedFromMember(*ToInstOrErr);
6556 return ToInstOrErr.takeError();
6558 updateLookupTableForTemplateParameters(*ToTPList);
6560 if (GetImportedOrCreateDecl(D2, D, Importer.getToContext(), D->
getTagKind(),
6561 DC, *BeginLocOrErr, *IdLocOrErr, ClassTemplate,
6586 return BraceRangeOrErr.takeError();
6589 return std::move(Err);
6595 return LocOrErr.takeError();
6603 return LocOrErr.takeError();
6608 return LocOrErr.takeError();
6614 return POIOrErr.takeError();
6620 if (
auto *CTD = dyn_cast<ClassTemplateDecl *>(
P)) {
6621 if (
auto CTDorErr =
import(CTD))
6625 auto CTPSDOrErr =
import(CTPSD);
6627 return CTPSDOrErr.takeError();
6630 for (
unsigned I = 0; I < DArgs.
size(); ++I) {
6632 if (
auto ArgOrErr =
import(DArg))
6633 D2ArgsVec[I] = *ArgOrErr;
6635 return ArgOrErr.takeError();
6645 return std::move(Err);
6657 return std::move(Err);
6663 "Variable templates cannot be declared at function scope");
6666 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
6668 for (
auto *FoundDecl : FoundDecls) {
6672 if (
VarTemplateDecl *FoundTemplate = dyn_cast<VarTemplateDecl>(FoundDecl)) {
6682 assert(FoundTemplate->getDeclContext()->isRecord() &&
6683 "Member variable template imported as non-member, "
6684 "inconsistent imported AST?");
6686 return Importer.MapImported(D, FoundDef);
6688 return Importer.MapImported(D, FoundTemplate);
6691 return Importer.MapImported(D, FoundDef);
6693 FoundByLookup = FoundTemplate;
6696 ConflictingDecls.push_back(FoundDecl);
6700 if (!ConflictingDecls.empty()) {
6703 ConflictingDecls.size());
6705 Name = NameOrErr.get();
6707 return NameOrErr.takeError();
6716 return TypeOrErr.takeError();
6721 return std::move(Err);
6725 if (!TemplateParamsOrErr)
6726 return TemplateParamsOrErr.takeError();
6729 if (GetImportedOrCreateDecl(ToVarTD, D, Importer.getToContext(), DC, Loc,
6730 Name, *TemplateParamsOrErr, ToTemplated))
6738 if (DC != Importer.getToContext().getTranslationUnitDecl())
6739 updateLookupTableForTemplateParameters(**TemplateParamsOrErr);
6741 if (FoundByLookup) {
6745 auto *PrevTemplated =
6747 if (ToTemplated != PrevTemplated)
6762 auto RedeclIt = Redecls.begin();
6765 for (; RedeclIt != Redecls.end() && *RedeclIt != D; ++RedeclIt) {
6768 return RedeclOrErr.takeError();
6770 assert(*RedeclIt == D);
6774 return std::move(Err);
6779 return std::move(Err);
6784 return BeginLocOrErr.takeError();
6788 return IdLocOrErr.takeError();
6794 return std::move(Err);
6797 void *InsertPos =
nullptr;
6799 VarTemplate->findSpecialization(TemplateArgs, InsertPos);
6800 if (FoundSpecialization) {
6808 "Member variable template specialization imported as non-member, "
6809 "inconsistent imported AST?");
6811 return Importer.MapImported(D, FoundDef);
6813 return Importer.MapImported(D, FoundSpecialization);
6818 return Importer.MapImported(D, FoundDef);
6830 return std::move(Err);
6835 if (
auto *FromPartial = dyn_cast<PartVarSpecDecl>(D)) {
6836 auto ToTPListOrErr =
import(FromPartial->getTemplateParameters());
6838 return ToTPListOrErr.takeError();
6840 PartVarSpecDecl *ToPartial;
6841 if (GetImportedOrCreateDecl(ToPartial, D, Importer.getToContext(), DC,
6842 *BeginLocOrErr, *IdLocOrErr, *ToTPListOrErr,
6848 import(FromPartial->getInstantiatedFromMember()))
6849 ToPartial->setInstantiatedFromMember(*ToInstOrErr);
6851 return ToInstOrErr.takeError();
6853 if (FromPartial->isMemberSpecialization())
6854 ToPartial->setMemberSpecialization();
6862 if (GetImportedOrCreateDecl(D2, D, Importer.getToContext(), DC,
6871 if (!
VarTemplate->findSpecialization(TemplateArgs, InsertPos))
6876 return std::move(Err);
6881 return TInfoOrErr.takeError();
6888 return POIOrErr.takeError();
6899 return LocOrErr.takeError();
6907 return std::move(Err);
6909 if (FoundSpecialization)
6912 addDeclToContexts(D, D2);
6915 for (++RedeclIt; RedeclIt != Redecls.end(); ++RedeclIt) {
6918 return RedeclOrErr.takeError();
6932 return std::move(Err);
6944 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
6945 for (
auto *FoundDecl : FoundDecls) {
6946 if (!FoundDecl->isInIdentifierNamespace(IDNS))
6949 if (
auto *FoundTemplate = dyn_cast<FunctionTemplateDecl>(FoundDecl)) {
6956 return Importer.MapImported(D, TemplateWithDef);
6958 FoundByLookup = FoundTemplate;
6968 return ParamsOrErr.takeError();
6973 return std::move(Err);
6990 OldParamDC.reserve(Params->
size());
6991 llvm::transform(*Params, std::back_inserter(OldParamDC),
6995 if (GetImportedOrCreateDecl(ToFunc, D, Importer.getToContext(), DC, Loc, Name,
6996 Params, TemplatedFD))
7010 ToFunc->setLexicalDeclContext(LexicalDC);
7011 addDeclToContexts(D, ToFunc);
7014 if (LT && !OldParamDC.empty()) {
7015 for (
unsigned int I = 0; I < OldParamDC.size(); ++I)
7016 LT->updateForced(Params->
getParam(I), OldParamDC[I]);
7019 if (FoundByLookup) {
7024 "Found decl must have its templated decl set");
7025 auto *PrevTemplated =
7027 if (TemplatedFD != PrevTemplated)
7044 return std::move(Err);
7047 if (GetImportedOrCreateDecl(To, D, Importer.getToContext(), DC, LocationOrErr,
7048 NameDeclOrErr, ToTemplateParameters,
7062 return std::move(Err);
7065 if (GetImportedOrCreateDecl(To, D, Importer.getToContext(), DC, RequiresLoc))
7078 return std::move(Err);
7082 return std::move(Err);
7085 if (GetImportedOrCreateDecl(To, D, Importer.getToContext(), DC, ToSL, ToArgs))
7097 Importer.FromDiag(S->
getBeginLoc(), diag::err_unsupported_ast_node)
7104 if (Importer.returnWithErrorInTest())
7111 Names.push_back(ToII);
7114 for (
unsigned I = 0, E = S->
getNumInputs(); I != E; I++) {
7118 Names.push_back(ToII);
7124 Clobbers.push_back(*ClobberOrErr);
7126 return ClobberOrErr.takeError();
7133 Constraints.push_back(*OutputOrErr);
7135 return OutputOrErr.takeError();
7138 for (
unsigned I = 0, E = S->
getNumInputs(); I != E; I++) {
7140 Constraints.push_back(*InputOrErr);
7142 return InputOrErr.takeError();
7148 return std::move(Err);
7152 return std::move(Err);
7156 return std::move(Err);
7160 return AsmLocOrErr.takeError();
7163 return AsmStrOrErr.takeError();
7165 if (!RParenLocOrErr)
7166 return RParenLocOrErr.takeError();
7168 return new (Importer.getToContext())
GCCAsmStmt(
7169 Importer.getToContext(),
7187 Error Err = Error::success();
7192 return std::move(Err);
7193 return new (Importer.getToContext())
DeclStmt(ToDG, ToBeginLoc, ToEndLoc);
7198 if (!ToSemiLocOrErr)
7199 return ToSemiLocOrErr.takeError();
7200 return new (Importer.getToContext())
NullStmt(
7208 return std::move(Err);
7211 if (!ToLBracLocOrErr)
7212 return ToLBracLocOrErr.takeError();
7215 if (!ToRBracLocOrErr)
7216 return ToRBracLocOrErr.takeError();
7221 *ToLBracLocOrErr, *ToRBracLocOrErr);
7226 Error Err = Error::success();
7234 return std::move(Err);
7237 ToCaseLoc, ToEllipsisLoc, ToColonLoc);
7238 ToStmt->setSubStmt(ToSubStmt);
7245 Error Err = Error::success();
7250 return std::move(Err);
7253 ToDefaultLoc, ToColonLoc, ToSubStmt);
7258 Error Err = Error::success();
7263 return std::move(Err);
7265 return new (Importer.getToContext())
LabelStmt(
7266 ToIdentLoc, ToLabelDecl, ToSubStmt);
7271 if (!ToAttrLocOrErr)
7272 return ToAttrLocOrErr.takeError();
7276 return std::move(Err);
7278 if (!ToSubStmtOrErr)
7279 return ToSubStmtOrErr.takeError();
7282 Importer.getToContext(), *ToAttrLocOrErr, ToAttrs, *ToSubStmtOrErr);
7287 Error Err = Error::success();
7298 return std::move(Err);
7301 ToInit, ToConditionVariable, ToCond, ToLParenLoc,
7302 ToRParenLoc, ToThen, ToElseLoc, ToElse);
7307 Error Err = Error::success();
7316 return std::move(Err);
7320 ToCond, ToLParenLoc, ToRParenLoc);
7321 ToStmt->setBody(ToBody);
7322 ToStmt->setSwitchLoc(ToSwitchLoc);
7330 return ToSCOrErr.takeError();
7331 if (LastChainedSwitchCase)
7334 ToStmt->setSwitchCaseList(*ToSCOrErr);
7335 LastChainedSwitchCase = *ToSCOrErr;
7343 Error Err = Error::success();
7351 return std::move(Err);
7354 ToBody, ToWhileLoc, ToLParenLoc, ToRParenLoc);
7359 Error Err = Error::success();
7366 return std::move(Err);
7368 return new (Importer.getToContext())
DoStmt(
7369 ToBody, ToCond, ToDoLoc, ToWhileLoc, ToRParenLoc);
7374 Error Err = Error::success();
7384 return std::move(Err);
7386 return new (Importer.getToContext())
ForStmt(
7387 Importer.getToContext(),
7388 ToInit, ToCond, ToConditionVariable, ToInc, ToBody, ToForLoc, ToLParenLoc,
7394 Error Err = Error::success();
7399 return std::move(Err);
7401 return new (Importer.getToContext())
GotoStmt(
7402 ToLabel, ToGotoLoc, ToLabelLoc);
7407 Error Err = Error::success();
7412 return std::move(Err);
7415 ToGotoLoc, ToStarLoc, ToTarget);
7418template <
typename StmtClass>
7421 Error Err = Error::success();
7422 auto ToLoc = NodeImporter.
importChecked(Err, S->getKwLoc());
7423 auto ToLabelLoc = S->hasLabelTarget()
7426 auto ToDecl = S->hasLabelTarget()
7430 return std::move(Err);
7431 return new (Importer.
getToContext()) StmtClass(ToLoc, ToLabelLoc, ToDecl);
7444 Error Err = Error::success();
7449 return std::move(Err);
7457 Error Err = Error::success();
7462 return std::move(Err);
7465 ToCatchLoc, ToExceptionDecl, ToHandlerBlock);
7471 return ToTryLocOrErr.takeError();
7474 if (!ToTryBlockOrErr)
7475 return ToTryBlockOrErr.takeError();
7478 for (
unsigned HI = 0, HE = S->
getNumHandlers(); HI != HE; ++HI) {
7480 if (
auto ToHandlerOrErr =
import(FromHandler))
7481 ToHandlers[HI] = *ToHandlerOrErr;
7483 return ToHandlerOrErr.takeError();
7492 Error Err = Error::success();
7506 return std::move(Err);
7509 ToInit, ToRangeStmt, ToBeginStmt, ToEndStmt, ToCond, ToInc, ToLoopVarStmt,
7510 ToBody, ToForLoc, ToCoawaitLoc, ToColonLoc, ToRParenLoc);
7515 Error Err = Error::success();
7522 return std::move(Err);
7533 Error Err = Error::success();
7539 return std::move(Err);
7542 ToAtCatchLoc, ToRParenLoc, ToCatchParamDecl, ToCatchBody);
7547 if (!ToAtFinallyLocOrErr)
7548 return ToAtFinallyLocOrErr.takeError();
7550 if (!ToAtFinallyStmtOrErr)
7551 return ToAtFinallyStmtOrErr.takeError();
7553 *ToAtFinallyStmtOrErr);
7558 Error Err = Error::success();
7563 return std::move(Err);
7568 if (
ExpectedStmt ToCatchStmtOrErr =
import(FromCatchStmt))
7569 ToCatchStmts[CI] = *ToCatchStmtOrErr;
7571 return ToCatchStmtOrErr.takeError();
7575 ToAtTryLoc, ToTryBody,
7576 ToCatchStmts.begin(), ToCatchStmts.size(),
7583 Error Err = Error::success();
7588 return std::move(Err);
7591 ToAtSynchronizedLoc, ToSynchExpr, ToSynchBody);
7596 if (!ToThrowLocOrErr)
7597 return ToThrowLocOrErr.takeError();
7599 if (!ToThrowExprOrErr)
7600 return ToThrowExprOrErr.takeError();
7602 *ToThrowLocOrErr, *ToThrowExprOrErr);
7609 return ToAtLocOrErr.takeError();
7611 if (!ToSubStmtOrErr)
7612 return ToSubStmtOrErr.takeError();
7621 Importer.FromDiag(E->
getBeginLoc(), diag::err_unsupported_ast_node)
7627 Error Err = Error::success();
7632 return std::move(Err);
7634 if (!ParentContextOrErr)
7635 return ParentContextOrErr.takeError();
7637 return new (Importer.getToContext())
7639 RParenLoc, *ParentContextOrErr);
7644 Error Err = Error::success();
7651 return std::move(Err);
7653 return new (Importer.getToContext())
VAArgExpr(
7654 ToBuiltinLoc, ToSubExpr, ToWrittenTypeInfo, ToRParenLoc, ToType,
7660 Error Err = Error::success();
7668 return std::move(Err);
7677 return new (Importer.getToContext())
7678 ChooseExpr(ToBuiltinLoc, ToCond, ToLHS, ToRHS, ToType,
VK, OK,
7679 ToRParenLoc, CondIsTrue);
7683 Error Err = Error::success();
7690 return std::move(Err);
7693 Importer.getToContext(), ToSrcExpr, ToTSI, ToType, E->
getValueKind(),
7699 Error Err = Error::success();
7707 ToSubExprs.resize(NumSubExprs);
7710 return std::move(Err);
7713 Importer.getToContext(), ToSubExprs, ToType, ToBeginLoc, ToRParenLoc);
7719 return TypeOrErr.takeError();
7723 return BeginLocOrErr.takeError();
7725 return new (Importer.getToContext())
GNUNullExpr(*TypeOrErr, *BeginLocOrErr);
7730 Error Err = Error::success();
7732 Expr *ToControllingExpr =
nullptr;
7738 assert((ToControllingExpr || ToControllingType) &&
7739 "Either the controlling expr or type must be nonnull");
7743 return std::move(Err);
7748 return std::move(Err);
7753 return std::move(Err);
7755 const ASTContext &ToCtx = Importer.getToContext();
7757 if (ToControllingExpr) {
7759 ToCtx, ToGenericLoc, ToControllingExpr,
ArrayRef(ToAssocTypes),
7760 ArrayRef(ToAssocExprs), ToDefaultLoc, ToRParenLoc,
7764 ToCtx, ToGenericLoc, ToControllingType,
ArrayRef(ToAssocTypes),
7765 ArrayRef(ToAssocExprs), ToDefaultLoc, ToRParenLoc,
7769 if (ToControllingExpr) {
7771 ToCtx, ToGenericLoc, ToControllingExpr,
ArrayRef(ToAssocTypes),
7772 ArrayRef(ToAssocExprs), ToDefaultLoc, ToRParenLoc,
7776 ToCtx, ToGenericLoc, ToControllingType,
ArrayRef(ToAssocTypes),
7777 ArrayRef(ToAssocExprs), ToDefaultLoc, ToRParenLoc,
7783 Error Err = Error::success();
7788 return std::move(Err);
7797 Error Err = Error::success();
7804 return std::move(Err);
7810 return FoundDOrErr.takeError();
7811 ToFoundD = *FoundDOrErr;
7820 return std::move(Err);
7821 ToResInfo = &ToTAInfo;
7825 Importer.getToContext(), ToQualifierLoc, ToTemplateKeywordLoc, ToDecl,
7829 ToE->setHadMultipleCandidates(
true);
7837 return TypeOrErr.takeError();
7845 return ToInitOrErr.takeError();
7848 if (!ToEqualOrColonLocOrErr)
7849 return ToEqualOrColonLocOrErr.takeError();
7855 ToIndexExprs[I - 1] = *ToArgOrErr;
7857 return ToArgOrErr.takeError();
7862 return std::move(Err);
7865 Importer.getToContext(), ToDesignators,
7866 ToIndexExprs, *ToEqualOrColonLocOrErr,
7874 return ToTypeOrErr.takeError();
7877 if (!ToLocationOrErr)
7878 return ToLocationOrErr.takeError();
7881 *ToTypeOrErr, *ToLocationOrErr);
7887 return ToTypeOrErr.takeError();
7890 if (!ToLocationOrErr)
7891 return ToLocationOrErr.takeError();
7894 Importer.getToContext(), E->
getValue(), *ToTypeOrErr, *ToLocationOrErr);
7901 return ToTypeOrErr.takeError();
7904 if (!ToLocationOrErr)
7905 return ToLocationOrErr.takeError();
7909 *ToTypeOrErr, *ToLocationOrErr);
7913 auto ToTypeOrErr =
import(E->
getType());
7915 return ToTypeOrErr.takeError();
7918 if (!ToSubExprOrErr)
7919 return ToSubExprOrErr.takeError();
7922 *ToSubExprOrErr, *ToTypeOrErr);
7926 auto ToTypeOrErr =
import(E->
getType());
7928 return ToTypeOrErr.takeError();
7931 if (!ToLocationOrErr)
7932 return ToLocationOrErr.takeError();
7935 Importer.getToContext(), E->
getValue(), *ToTypeOrErr, *ToLocationOrErr,
7936 Importer.getToContext().getFixedPointScale(*ToTypeOrErr));
7942 return ToTypeOrErr.takeError();
7945 if (!ToLocationOrErr)
7946 return ToLocationOrErr.takeError();
7955 return ToTypeOrErr.takeError();
7960 return std::move(Err);
7969 Error Err = Error::success();
7975 return std::move(Err);
7978 ToLParenLoc, ToTypeSourceInfo, ToType, E->
getValueKind(),
7984 Error Err = Error::success();
7989 return std::move(Err);
7995 return std::move(Err);
7997 return new (Importer.getToContext())
AtomicExpr(
7999 ToBuiltinLoc, ToExprs, ToType, E->
getOp(), ToRParenLoc);
8003 Error Err = Error::success();
8009 return std::move(Err);
8012 ToAmpAmpLoc, ToLabelLoc, ToLabel, ToType);
8015 Error Err = Error::success();
8019 return std::move(Err);
8024 Error Err = Error::success();
8029 return std::move(Err);
8031 return new (Importer.getToContext())
8032 ParenExpr(ToLParen, ToRParen, ToSubExpr);
8038 return std::move(Err);
8041 if (!ToLParenLocOrErr)
8042 return ToLParenLocOrErr.takeError();
8045 if (!ToRParenLocOrErr)
8046 return ToRParenLocOrErr.takeError();
8049 ToExprs, *ToRParenLocOrErr);
8053 Error Err = Error::success();
8059 return std::move(Err);
8061 return new (Importer.getToContext())
8062 StmtExpr(ToSubStmt, ToType, ToLParenLoc, ToRParenLoc,
8067 Error Err = Error::success();
8072 return std::move(Err);
8076 UO->setType(ToType);
8077 UO->setSubExpr(ToSubExpr);
8079 UO->setOperatorLoc(ToOperatorLoc);
8090 Error Err = Error::success();
8095 return std::move(Err);
8100 if (!ToArgumentTypeInfoOrErr)
8101 return ToArgumentTypeInfoOrErr.takeError();
8104 E->
getKind(), *ToArgumentTypeInfoOrErr, ToType, ToOperatorLoc,
8109 if (!ToArgumentExprOrErr)
8110 return ToArgumentExprOrErr.takeError();
8113 E->
getKind(), *ToArgumentExprOrErr, ToType, ToOperatorLoc, ToRParenLoc);
8117 Error Err = Error::success();
8123 return std::move(Err);
8126 Importer.getToContext(), ToLHS, ToRHS, E->
getOpcode(), ToType,
8132 Error Err = Error::success();
8140 return std::move(Err);
8143 ToCond, ToQuestionLoc, ToLHS, ToColonLoc, ToRHS, ToType,
8149 Error Err = Error::success();
8159 return std::move(Err);
8162 ToCommon, ToOpaqueValue, ToCond, ToTrueExpr, ToFalseExpr,
8169 Error Err = Error::success();
8172 return std::move(Err);
8174 return new (Importer.getToContext())
8179 Error Err = Error::success();
8181 auto ToQueriedTypeSourceInfo =
8187 return std::move(Err);
8191 ToDimensionExpression, ToEndLoc, ToType);
8195 Error Err = Error::success();
8201 return std::move(Err);
8209 Error Err = Error::success();
8214 return std::move(Err);
8221 Error Err = Error::success();
8227 return std::move(Err);
8236 Error Err = Error::success();
8241 auto ToComputationResultType =
8245 return std::move(Err);
8248 Importer.getToContext(), ToLHS, ToRHS, E->
getOpcode(), ToType,
8251 ToComputationLHSType, ToComputationResultType);
8258 if (
auto SpecOrErr =
import(*I))
8259 Path.push_back(*SpecOrErr);
8261 return SpecOrErr.takeError();
8269 return ToTypeOrErr.takeError();
8272 if (!ToSubExprOrErr)
8273 return ToSubExprOrErr.takeError();
8276 if (!ToBasePathOrErr)
8277 return ToBasePathOrErr.takeError();
8280 Importer.getToContext(), *ToTypeOrErr, E->
getCastKind(), *ToSubExprOrErr,
8285 Error Err = Error::success();
8290 return std::move(Err);
8293 if (!ToBasePathOrErr)
8294 return ToBasePathOrErr.takeError();
8298 case Stmt::CStyleCastExprClass: {
8300 ExpectedSLoc ToLParenLocOrErr =
import(CCE->getLParenLoc());
8301 if (!ToLParenLocOrErr)
8302 return ToLParenLocOrErr.takeError();
8303 ExpectedSLoc ToRParenLocOrErr =
import(CCE->getRParenLoc());
8304 if (!ToRParenLocOrErr)
8305 return ToRParenLocOrErr.takeError();
8308 ToSubExpr, ToBasePath, CCE->getFPFeatures(), ToTypeInfoAsWritten,
8309 *ToLParenLocOrErr, *ToRParenLocOrErr);
8312 case Stmt::CXXFunctionalCastExprClass: {
8314 ExpectedSLoc ToLParenLocOrErr =
import(FCE->getLParenLoc());
8315 if (!ToLParenLocOrErr)
8316 return ToLParenLocOrErr.takeError();
8317 ExpectedSLoc ToRParenLocOrErr =
import(FCE->getRParenLoc());
8318 if (!ToRParenLocOrErr)
8319 return ToRParenLocOrErr.takeError();
8321 Importer.getToContext(), ToType, E->
getValueKind(), ToTypeInfoAsWritten,
8322 E->
getCastKind(), ToSubExpr, ToBasePath, FCE->getFPFeatures(),
8323 *ToLParenLocOrErr, *ToRParenLocOrErr);
8326 case Stmt::ObjCBridgedCastExprClass: {
8328 ExpectedSLoc ToLParenLocOrErr =
import(OCE->getLParenLoc());
8329 if (!ToLParenLocOrErr)
8330 return ToLParenLocOrErr.takeError();
8331 ExpectedSLoc ToBridgeKeywordLocOrErr =
import(OCE->getBridgeKeywordLoc());
8332 if (!ToBridgeKeywordLocOrErr)
8333 return ToBridgeKeywordLocOrErr.takeError();
8335 *ToLParenLocOrErr, OCE->getBridgeKind(), E->
getCastKind(),
8336 *ToBridgeKeywordLocOrErr, ToTypeInfoAsWritten, ToSubExpr);
8338 case Stmt::BuiltinBitCastExprClass: {
8340 ExpectedSLoc ToKWLocOrErr =
import(BBC->getBeginLoc());
8342 return ToKWLocOrErr.takeError();
8343 ExpectedSLoc ToRParenLocOrErr =
import(BBC->getEndLoc());
8344 if (!ToRParenLocOrErr)
8345 return ToRParenLocOrErr.takeError();
8348 ToTypeInfoAsWritten, *ToKWLocOrErr, *ToRParenLocOrErr);
8351 llvm_unreachable(
"Cast expression of unsupported type!");
8364 Error Err = Error::success();
8368 return std::move(Err);
8377 auto ToBSOrErr =
import(FromNode.
getBase());
8379 return ToBSOrErr.takeError();
8384 auto ToFieldOrErr =
import(FromNode.
getField());
8386 return ToFieldOrErr.takeError();
8387 ToNodes.push_back(
OffsetOfNode(ToBeginLoc, *ToFieldOrErr, ToEndLoc));
8392 ToNodes.push_back(
OffsetOfNode(ToBeginLoc, ToII, ToEndLoc));
8401 if (!ToIndexExprOrErr)
8402 return ToIndexExprOrErr.takeError();
8403 ToExprs[I] = *ToIndexExprOrErr;
8406 Error Err = Error::success();
8412 return std::move(Err);
8415 Importer.getToContext(), ToType, ToOperatorLoc, ToTypeSourceInfo, ToNodes,
8416 ToExprs, ToRParenLoc);
8420 Error Err = Error::success();
8426 return std::move(Err);
8435 ToType, ToOperand, ToCanThrow, ToBeginLoc, ToEndLoc);
8439 Error Err = Error::success();
8444 return std::move(Err);
8452 if (!ToUsedLocOrErr)
8453 return ToUsedLocOrErr.takeError();
8455 auto ToParamOrErr =
import(E->
getParam());
8457 return ToParamOrErr.takeError();
8459 auto UsedContextOrErr = Importer.ImportContext(E->
getUsedContext());
8460 if (!UsedContextOrErr)
8461 return UsedContextOrErr.takeError();
8471 std::optional<ParmVarDecl *> FromParam =
8472 Importer.getImportedFromDecl(ToParam);
8473 assert(FromParam &&
"ParmVarDecl was not imported?");
8476 return std::move(Err);
8478 Expr *RewrittenInit =
nullptr;
8482 return ExprOrErr.takeError();
8483 RewrittenInit = ExprOrErr.get();
8486 *ToParamOrErr, RewrittenInit,
8492 Error Err = Error::success();
8497 return std::move(Err);
8500 ToType, ToTypeSourceInfo, ToRParenLoc);
8506 if (!ToSubExprOrErr)
8507 return ToSubExprOrErr.takeError();
8509 auto ToDtorOrErr =
import(E->
getTemporary()->getDestructor());
8511 return ToDtorOrErr.takeError();
8521 Error Err = Error::success();
8527 return std::move(Err);
8531 return std::move(Err);
8534 Importer.getToContext(), ToConstructor, ToType, ToTypeSourceInfo, ToArgs,
8544 return std::move(Err);
8546 Error Err = Error::success();
8550 return std::move(Err);
8554 if (GetImportedOrCreateDecl(To, D, Temporary, ExtendingDecl,
8565 Error Err = Error::success();
8569 auto ToMaterializedDecl =
8572 return std::move(Err);
8574 if (!ToTemporaryExpr)
8575 ToTemporaryExpr =
cast<Expr>(ToMaterializedDecl->getTemporaryExpr());
8579 ToMaterializedDecl);
8585 Error Err = Error::success();
8589 return std::move(Err);
8591 return new (Importer.getToContext())
8596 Error Err = Error::success();
8602 return std::move(Err);
8611 ToPartialArguments))
8612 return std::move(Err);
8616 Importer.getToContext(), ToOperatorLoc, ToPack, ToPackLoc, ToRParenLoc,
8617 Length, ToPartialArguments);
8622 Error Err = Error::success();
8629 auto ToAllocatedTypeSourceInfo =
8634 return std::move(Err);
8639 return std::move(Err);
8642 Importer.getToContext(), E->
isGlobalNew(), ToOperatorNew,
8646 ToAllocatedTypeSourceInfo, ToSourceRange, ToDirectInitRange);
8650 Error Err = Error::success();
8656 return std::move(Err);
8665 Error Err = Error::success();
8671 return std::move(Err);
8675 return std::move(Err);
8678 Importer.getToContext(), ToType, ToLocation, ToConstructor,
8682 ToParenOrBraceRange);
8689 if (!ToSubExprOrErr)
8690 return ToSubExprOrErr.takeError();
8694 return std::move(Err);
8702 Error Err = Error::success();
8707 return std::move(Err);
8711 return std::move(Err);
8721 return ToTypeOrErr.takeError();
8724 if (!ToLocationOrErr)
8725 return ToLocationOrErr.takeError();
8734 return ToTypeOrErr.takeError();
8737 if (!ToLocationOrErr)
8738 return ToLocationOrErr.takeError();
8741 *ToTypeOrErr, *ToLocationOrErr);
8745 Error Err = Error::success();
8756 return std::move(Err);
8768 return std::move(Err);
8769 ResInfo = &ToTAInfo;
8773 ToOperatorLoc, ToQualifierLoc, ToTemplateKeywordLoc,
8774 ToMemberDecl, ToFoundDecl, ToMemberNameInfo,
8781 Error Err = Error::success();
8789 return std::move(Err);
8795 if (!ToDestroyedTypeLocOrErr)
8796 return ToDestroyedTypeLocOrErr.takeError();
8802 return ToTIOrErr.takeError();
8806 Importer.getToContext(), ToBase, E->
isArrow(), ToOperatorLoc,
8807 ToQualifierLoc, ToScopeTypeInfo, ToColonColonLoc, ToTildeLoc, Storage);
8812 Error Err = Error::success();
8817 auto ToFirstQualifierFoundInScope =
8820 return std::move(Err);
8822 Expr *ToBase =
nullptr;
8825 ToBase = *ToBaseOrErr;
8827 return ToBaseOrErr.takeError();
8836 return std::move(Err);
8837 ResInfo = &ToTAInfo;
8842 return std::move(Err);
8848 return std::move(Err);
8851 Importer.getToContext(), ToBase, ToType, E->
isArrow(), ToOperatorLoc,
8852 ToQualifierLoc, ToTemplateKeywordLoc, ToFirstQualifierFoundInScope,
8853 ToMemberNameInfo, ResInfo);
8858 Error Err = Error::success();
8866 return std::move(Err);
8870 return std::move(Err);
8877 return std::move(Err);
8878 ResInfo = &ToTAInfo;
8882 Importer.getToContext(), ToQualifierLoc, ToTemplateKeywordLoc,
8883 ToNameInfo, ResInfo);
8888 Error Err = Error::success();
8894 return std::move(Err);
8899 return std::move(Err);
8902 Importer.getToContext(), ToType, ToTypeSourceInfo, ToLParenLoc,
8909 if (!ToNamingClassOrErr)
8910 return ToNamingClassOrErr.takeError();
8913 if (!ToQualifierLocOrErr)
8914 return ToQualifierLocOrErr.takeError();
8916 Error Err = Error::success();
8920 return std::move(Err);
8925 return std::move(Err);
8928 for (
auto *D : E->
decls())
8929 if (
auto ToDOrErr =
import(D))
8932 return ToDOrErr.takeError();
8939 return std::move(Err);
8942 if (!ToTemplateKeywordLocOrErr)
8943 return ToTemplateKeywordLocOrErr.takeError();
8945 const bool KnownDependent =
8947 ExprDependence::TypeValue;
8949 Importer.getToContext(), *ToNamingClassOrErr, *ToQualifierLocOrErr,
8950 *ToTemplateKeywordLocOrErr, ToNameInfo, E->
requiresADL(), &ToTAInfo,
8951 ToDecls.
begin(), ToDecls.
end(), KnownDependent,
8956 Importer.getToContext(), *ToNamingClassOrErr, *ToQualifierLocOrErr,
8964 Error Err = Error::success();
8972 return std::move(Err);
8977 return std::move(Err);
8981 if (
auto ToDOrErr =
import(D))
8984 return ToDOrErr.takeError();
8992 return std::move(Err);
8993 ResInfo = &ToTAInfo;
8996 Expr *ToBase =
nullptr;
8999 ToBase = *ToBaseOrErr;
9001 return ToBaseOrErr.takeError();
9006 E->
isArrow(), ToOperatorLoc, ToQualifierLoc, ToTemplateKeywordLoc,
9007 ToNameInfo, ResInfo, ToDecls.
begin(), ToDecls.
end());
9011 Error Err = Error::success();
9016 return std::move(Err);
9021 return std::move(Err);
9023 if (
const auto *OCE = dyn_cast<CXXOperatorCallExpr>(E)) {
9025 Importer.getToContext(), OCE->getOperator(), ToCallee, ToArgs, ToType,
9026 OCE->getValueKind(), ToRParenLoc, OCE->getFPFeatures(),
9027 OCE->getADLCallKind());
9037 auto ToClassOrErr =
import(FromClass);
9039 return ToClassOrErr.takeError();
9044 return ToCallOpOrErr.takeError();
9048 return std::move(Err);
9050 Error Err = Error::success();
9055 return std::move(Err);
9066 Error Err = Error::success();
9071 return std::move(Err);
9075 return std::move(Err);
9086 return ToFillerOrErr.takeError();
9090 if (
auto ToFDOrErr =
import(FromFD))
9093 return ToFDOrErr.takeError();
9097 if (
auto ToSyntFormOrErr =
import(SyntForm))
9100 return ToSyntFormOrErr.takeError();
9114 return ToTypeOrErr.takeError();
9117 if (!ToSubExprOrErr)
9118 return ToSubExprOrErr.takeError();
9121 *ToTypeOrErr, *ToSubExprOrErr);
9126 Error Err = Error::success();
9131 return std::move(Err);
9139 Error Err = Error::success();
9144 return std::move(Err);
9147 ToType, ToCommonExpr, ToSubExpr);
9153 return ToTypeOrErr.takeError();
9159 if (!ToBeginLocOrErr)
9160 return ToBeginLocOrErr.takeError();
9162 auto ToFieldOrErr =
import(E->
getField());
9164 return ToFieldOrErr.takeError();
9166 auto UsedContextOrErr = Importer.ImportContext(E->
getUsedContext());
9167 if (!UsedContextOrErr)
9168 return UsedContextOrErr.takeError();
9172 "Field should have in-class initializer if there is a default init "
9173 "expression that uses it.");
9178 auto ToInClassInitializerOrErr =
9179 import(E->
getField()->getInClassInitializer());
9180 if (!ToInClassInitializerOrErr)
9181 return ToInClassInitializerOrErr.takeError();
9185 Expr *RewrittenInit =
nullptr;
9189 return ExprOrErr.takeError();
9190 RewrittenInit = ExprOrErr.get();
9194 ToField, *UsedContextOrErr, RewrittenInit);
9198 Error Err = Error::success();
9206 return std::move(Err);
9211 if (!ToBasePathOrErr)
9212 return ToBasePathOrErr.takeError();
9214 if (
auto CCE = dyn_cast<CXXStaticCastExpr>(E)) {
9216 Importer.getToContext(), ToType,
VK, CK, ToSubExpr, &(*ToBasePathOrErr),
9217 ToTypeInfoAsWritten, CCE->getFPFeatures(), ToOperatorLoc, ToRParenLoc,
9221 Importer.getToContext(), ToType,
VK, CK, ToSubExpr, &(*ToBasePathOrErr),
9222 ToTypeInfoAsWritten, ToOperatorLoc, ToRParenLoc, ToAngleBrackets);
9225 Importer.getToContext(), ToType,
VK, CK, ToSubExpr, &(*ToBasePathOrErr),
9226 ToTypeInfoAsWritten, ToOperatorLoc, ToRParenLoc, ToAngleBrackets);
9229 Importer.getToContext(), ToType,
VK, ToSubExpr, ToTypeInfoAsWritten,
9230 ToOperatorLoc, ToRParenLoc, ToAngleBrackets);
9232 llvm_unreachable(
"Unknown cast type");
9233 return make_error<ASTImportError>();
9239 Error Err = Error::success();
9246 return std::move(Err);
9249 ToType, E->
getValueKind(), ToNameLoc, ToReplacement, ToAssociatedDecl,
9254 Error Err = Error::success();
9259 return std::move(Err);
9263 return std::move(Err);
9270 E->
getTrait(), ToArgs, ToEndLoc, ToValue);
9280 return ToTypeOrErr.takeError();
9283 if (!ToSourceRangeOrErr)
9284 return ToSourceRangeOrErr.takeError();
9289 *ToTypeOrErr, *ToTSIOrErr, *ToSourceRangeOrErr);
9291 return ToTSIOrErr.takeError();
9295 if (!ToExprOperandOrErr)
9296 return ToExprOperandOrErr.takeError();
9299 *ToTypeOrErr, *ToExprOperandOrErr, *ToSourceRangeOrErr);
9303 Error Err = Error::success();
9314 return std::move(Err);
9316 return new (Importer.getToContext())
9322 Error Err = Error::success();
9330 return std::move(Err);
9334 return std::move(Err);
9339 return std::move(Err);
9341 LParenLoc, LocalParameters, RParenLoc,
9342 Requirements, RBraceLoc);
9347 Error Err = Error::success();
9351 return std::move(Err);
9354 Importer.getToContext(),
CL,
9359 return std::move(Err);
9361 Importer.getToContext(),
CL,
9367 Error Err = Error::success();
9373 return std::move(Err);
9376 ToType, E->
getValueKind(), ToPackLoc, ToArgPack, ToAssociatedDecl,
9383 return std::move(Err);
9386 return ToSyntOrErr.takeError();
9393 Error Err = Error::success();
9399 return std::move(Err);
9403 return std::move(Err);
9406 ToInitLoc, ToBeginLoc, ToEndLoc);
9411 Error ImportErrors = Error::success();
9413 if (
auto ImportedOrErr =
import(FromOverriddenMethod))
9415 (*ImportedOrErr)->getCanonicalDecl()));
9418 joinErrors(std::move(ImportErrors), ImportedOrErr.takeError());
9420 return ImportErrors;
9426 std::shared_ptr<ASTImporterSharedState> SharedState)
9427 : SharedState(SharedState), ToContext(ToContext), FromContext(FromContext),
9428 ToFileManager(ToFileManager), FromFileManager(FromFileManager),
9433 this->SharedState = std::make_shared<ASTImporterSharedState>();
9436 ImportedDecls[FromContext.getTranslationUnitDecl()] =
9437 ToContext.getTranslationUnitDecl();
9444 "Try to get field index for non-field.");
9448 return std::nullopt;
9451 for (
const auto *D : Owner->decls()) {
9459 llvm_unreachable(
"Field was not found in its parent context.");
9461 return std::nullopt;
9464ASTImporter::FoundDeclsTy
9474 if (SharedState->getLookupTable()) {
9482 dyn_cast<NamespaceDecl>(ReDC));
9483 for (
auto *D : NSChain) {
9485 SharedState->getLookupTable()->lookup(dyn_cast<NamespaceDecl>(D),
9492 SharedState->getLookupTable()->lookup(ReDC, Name);
9493 return FoundDeclsTy(LookupResult.begin(), LookupResult.end());
9497 FoundDeclsTy
Result(NoloadLookupResult.
begin(), NoloadLookupResult.
end());
9514void ASTImporter::AddToLookupTable(
Decl *ToD) {
9515 SharedState->addDeclToLookup(ToD);
9521 return Importer.
Visit(FromD);
9545 llvm::DenseMap<const Type *, const Type *>::iterator Pos =
9546 ImportedTypes.find(FromT);
9547 if (Pos != ImportedTypes.end())
9554 return ToTOrErr.takeError();
9557 ImportedTypes[FromT] = ToTOrErr->getTypePtr();
9559 return ToTOrErr->getTypePtr();
9568 return ToTyOrErr.takeError();
9581 return TOrErr.takeError();
9584 return BeginLocOrErr.takeError();
9586 return ToContext.getTrivialTypeSourceInfo(*TOrErr, *BeginLocOrErr);
9593template <
typename T>
struct AttrArgImporter {
9594 AttrArgImporter(
const AttrArgImporter<T> &) =
delete;
9595 AttrArgImporter(AttrArgImporter<T> &&) =
default;
9596 AttrArgImporter<T> &operator=(
const AttrArgImporter<T> &) =
delete;
9597 AttrArgImporter<T> &operator=(AttrArgImporter<T> &&) =
default;
9600 : To(I.importChecked(Err, From)) {}
9602 const T &value() {
return To; }
9613template <
typename T>
struct AttrArgArrayImporter {
9614 AttrArgArrayImporter(
const AttrArgArrayImporter<T> &) =
delete;
9615 AttrArgArrayImporter(AttrArgArrayImporter<T> &&) =
default;
9616 AttrArgArrayImporter<T> &operator=(
const AttrArgArrayImporter<T> &) =
delete;
9617 AttrArgArrayImporter<T> &operator=(AttrArgArrayImporter<T> &&) =
default;
9619 AttrArgArrayImporter(ASTNodeImporter &I,
Error &Err,
9620 const llvm::iterator_range<T *> &From,
9621 unsigned ArraySize) {
9624 To.reserve(ArraySize);
9628 T *value() {
return To.data(); }
9631 llvm::SmallVector<T, 2> To;
9635 Error Err{Error::success()};
9636 Attr *ToAttr =
nullptr;
9637 ASTImporter &Importer;
9638 ASTNodeImporter NImporter;
9641 AttrImporter(ASTImporter &I) : Importer(I), NImporter(I) {}
9646 template <
class T> AttrArgImporter<T> importArg(
const T &From) {
9647 return AttrArgImporter<T>(NImporter, Err, From);
9653 template <
typename T>
9654 AttrArgArrayImporter<T> importArrayArg(
const llvm::iterator_range<T *> &From,
9655 unsigned ArraySize) {
9656 return AttrArgArrayImporter<T>(NImporter, Err, From, ArraySize);
9667 template <
typename T,
typename... Arg>
9668 void importAttr(
const T *FromAttr, Arg &&...ImportedArg) {
9669 static_assert(std::is_base_of<Attr, T>::value,
9670 "T should be subclass of Attr.");
9671 assert(!ToAttr &&
"Use one AttrImporter to import one Attribute object.");
9673 const IdentifierInfo *ToAttrName = Importer.
Import(FromAttr->getAttrName());
9674 const IdentifierInfo *ToScopeName =
9675 Importer.
Import(FromAttr->getScopeName());
9676 SourceRange ToAttrRange =
9678 SourceLocation ToScopeLoc =
9684 AttributeCommonInfo ToI(
9685 ToAttrName, AttributeScopeInfo(ToScopeName, ToScopeLoc), ToAttrRange,
9686 FromAttr->getParsedKind(), FromAttr->getForm());
9690 std::forward<Arg>(ImportedArg)..., ToI);
9694 if (
auto *ToInheritableAttr = dyn_cast<InheritableAttr>(ToAttr))
9695 ToInheritableAttr->setInherited(FromAttr->isInherited());
9701 void cloneAttr(
const Attr *FromAttr) {
9702 assert(!ToAttr &&
"Use one AttrImporter to import one Attribute object.");
9714 llvm::Expected<Attr *> getResult() && {
9716 return std::move(Err);
9717 assert(ToAttr &&
"Attribute should be created.");
9724 AttrImporter AI(*
this);
9727 switch (FromAttr->
getKind()) {
9728 case attr::Aligned: {
9730 if (From->isAlignmentExpr())
9731 AI.importAttr(From,
true, AI.importArg(From->getAlignmentExpr()).value());
9733 AI.importAttr(From,
false,
9734 AI.importArg(From->getAlignmentType()).value());
9738 case attr::AlignValue: {
9740 AI.importAttr(From, AI.importArg(From->getAlignment()).value());
9744 case attr::Format: {
9746 AI.importAttr(From,
Import(From->getType()), From->getFormatIdx(),
9747 From->getFirstArg());
9751 case attr::EnableIf: {
9753 AI.importAttr(From, AI.importArg(From->getCond()).value(),
9754 From->getMessage());
9758 case attr::AssertCapability: {
9761 AI.importArrayArg(From->args(), From->args_size()).value(),
9765 case attr::AcquireCapability: {
9768 AI.importArrayArg(From->args(), From->args_size()).value(),
9772 case attr::TryAcquireCapability: {
9774 AI.importAttr(From, AI.importArg(From->getSuccessValue()).value(),
9775 AI.importArrayArg(From->args(), From->args_size()).value(),
9779 case attr::ReleaseCapability: {
9782 AI.importArrayArg(From->args(), From->args_size()).value(),
9786 case attr::RequiresCapability: {
9789 AI.importArrayArg(From->args(), From->args_size()).value(),
9793 case attr::GuardedBy: {
9796 AI.importArrayArg(From->args(), From->args_size()).value(),
9800 case attr::PtGuardedBy: {
9803 AI.importArrayArg(From->args(), From->args_size()).value(),
9807 case attr::AcquiredAfter: {
9810 AI.importArrayArg(From->args(), From->args_size()).value(),
9814 case attr::AcquiredBefore: {
9817 AI.importArrayArg(From->args(), From->args_size()).value(),
9821 case attr::LockReturned: {
9823 AI.importAttr(From, AI.importArg(From->getArg()).value());
9826 case attr::LocksExcluded: {
9829 AI.importArrayArg(From->args(), From->args_size()).value(),
9837 AI.cloneAttr(FromAttr);
9842 return std::move(AI).getResult();
9846 return ImportedDecls.lookup(FromD);
9850 auto FromDPos = ImportedFromDecls.find(ToD);
9851 if (FromDPos == ImportedFromDecls.end())
9861 ImportPath.push(FromD);
9862 llvm::scope_exit ImportPathBuilder([
this]() { ImportPath.pop(); });
9867 return make_error<ASTImportError>(*
Error);
9873 if (
auto Error = SharedState->getImportDeclErrorIfAny(ToD)) {
9875 return make_error<ASTImportError>(*
Error);
9882 if (ImportPath.hasCycleAtBack())
9883 SavedImportPaths[FromD].push_back(ImportPath.copyCycleAtBack());
9892 auto Pos = ImportedDecls.find(FromD);
9893 bool ToDWasCreated = Pos != ImportedDecls.end();
9897 Decl *CreatedToD = ToDWasCreated ? Pos->second :
nullptr;
9898 if (ToDWasCreated) {
9901 auto *ToD = CreatedToD;
9902 ImportedDecls.erase(Pos);
9914 auto PosF = ImportedFromDecls.find(ToD);
9915 if (PosF != ImportedFromDecls.end()) {
9920 SharedState->removeDeclFromLookup(ToD);
9921 ImportedFromDecls.erase(PosF);
9933 handleAllErrors(ToDOrErr.takeError(),
9938 SharedState->setImportDeclError(CreatedToD, ErrOut);
9942 for (
const auto &Path : SavedImportPaths[FromD]) {
9945 Decl *PrevFromDi = FromD;
9946 for (
Decl *FromDi : Path) {
9948 if (FromDi == FromD)
9955 PrevFromDi = FromDi;
9959 auto Ii = ImportedDecls.find(FromDi);
9960 if (Ii != ImportedDecls.end())
9961 SharedState->setImportDeclError(Ii->second, ErrOut);
9966 SavedImportPaths.erase(FromD);
9969 return make_error<ASTImportError>(ErrOut);
9981 return make_error<ASTImportError>(*Err);
9987 if (
auto Error = SharedState->getImportDeclErrorIfAny(ToD)) {
9989 return make_error<ASTImportError>(*
Error);
9992 assert(ImportedDecls.count(FromD) != 0 &&
"Missing call to MapImported?");
9996 auto ToAttrOrErr =
Import(FromAttr);
10000 return ToAttrOrErr.takeError();
10007 SavedImportPaths.erase(FromD);
10022 return ToDCOrErr.takeError();
10027 if (
auto *ToRecord = dyn_cast<RecordDecl>(ToDC)) {
10029 if (ToRecord->isCompleteDefinition())
10037 if (FromRecord->getASTContext().getExternalSource() &&
10038 !FromRecord->isCompleteDefinition())
10039 FromRecord->getASTContext().getExternalSource()->CompleteType(FromRecord);
10041 if (FromRecord->isCompleteDefinition())
10044 return std::move(Err);
10045 }
else if (
auto *ToEnum = dyn_cast<EnumDecl>(ToDC)) {
10047 if (ToEnum->isCompleteDefinition()) {
10049 }
else if (FromEnum->isCompleteDefinition()) {
10052 return std::move(Err);
10056 }
else if (
auto *ToClass = dyn_cast<ObjCInterfaceDecl>(ToDC)) {
10058 if (ToClass->getDefinition()) {
10063 return std::move(Err);
10067 }
else if (
auto *ToProto = dyn_cast<ObjCProtocolDecl>(ToDC)) {
10069 if (ToProto->getDefinition()) {
10074 return std::move(Err);
10085 return cast_or_null<Expr>(*ToSOrErr);
10087 return ToSOrErr.takeError();
10095 llvm::DenseMap<Stmt *, Stmt *>::iterator Pos = ImportedStmts.find(FromS);
10096 if (Pos != ImportedStmts.end())
10097 return Pos->second;
10105 if (
auto *ToE = dyn_cast<Expr>(*ToSOrErr)) {
10109 ToE->setValueKind(FromE->getValueKind());
10110 ToE->setObjectKind(FromE->getObjectKind());
10111 ToE->setDependence(FromE->getDependence());
10115 ImportedStmts[FromS] = *ToSOrErr;
10126 auto NSOrErr =
Import(Namespace);
10128 return NSOrErr.takeError();
10129 auto PrefixOrErr =
Import(Prefix);
10131 return PrefixOrErr.takeError();
10139 return RDOrErr.takeError();
10144 return TyOrErr.takeError();
10147 llvm_unreachable(
"Invalid nested name specifier kind");
10159 NestedNames.push_back(NNS);
10165 while (!NestedNames.empty()) {
10166 NNS = NestedNames.pop_back_val();
10169 return std::move(Err);
10176 return std::move(Err);
10180 return std::move(Err);
10186 ToLocalBeginLoc, ToLocalEndLoc);
10192 return std::move(Err);
10205 if (!ToSourceRangeOrErr)
10206 return ToSourceRangeOrErr.takeError();
10209 ToSourceRangeOrErr->getBegin(),
10210 ToSourceRangeOrErr->getEnd());
10214 llvm_unreachable(
"unexpected null nested name specifier");
10227 return ToTemplateOrErr.takeError();
10232 for (
auto *I : *FromStorage) {
10233 if (
auto ToOrErr =
Import(I))
10236 return ToOrErr.takeError();
10238 return ToContext.getOverloadedTemplateName(ToTemplates.
begin(),
10239 ToTemplates.
end());
10245 if (!DeclNameOrErr)
10246 return DeclNameOrErr.takeError();
10247 return ToContext.getAssumedTemplateName(*DeclNameOrErr);
10253 if (!QualifierOrErr)
10254 return QualifierOrErr.takeError();
10257 return TNOrErr.takeError();
10258 return ToContext.getQualifiedTemplateName(
10265 if (!QualifierOrErr)
10266 return QualifierOrErr.takeError();
10267 return ToContext.getDependentTemplateName(
10275 if (!ReplacementOrErr)
10276 return ReplacementOrErr.takeError();
10279 if (!AssociatedDeclOrErr)
10280 return AssociatedDeclOrErr.takeError();
10282 return ToContext.getSubstTemplateTemplateParm(
10283 *ReplacementOrErr, *AssociatedDeclOrErr, Subst->
getIndex(),
10291 auto ArgPackOrErr =
10294 return ArgPackOrErr.takeError();
10297 if (!AssociatedDeclOrErr)
10298 return AssociatedDeclOrErr.takeError();
10300 return ToContext.getSubstTemplateTemplateParmPack(
10301 *ArgPackOrErr, *AssociatedDeclOrErr, SubstPack->
getIndex(),
10307 return UsingOrError.takeError();
10311 llvm_unreachable(
"Unexpected DeducedTemplate");
10314 llvm_unreachable(
"Invalid template name kind");
10326 if (!ToFileIDOrErr)
10327 return ToFileIDOrErr.takeError();
10335 return std::move(Err);
10337 return std::move(Err);
10343 llvm::DenseMap<FileID, FileID>::iterator Pos = ImportedFileIDs.find(FromID);
10344 if (Pos != ImportedFileIDs.end())
10345 return Pos->second;
10357 return ToSpLoc.takeError();
10360 return ToExLocS.takeError();
10370 return ToExLocE.takeError();
10376 if (!IsBuiltin && !
Cache->BufferOverridden) {
10380 return ToIncludeLoc.takeError();
10391 if (
Cache->OrigEntry &&
Cache->OrigEntry->getDir()) {
10397 ToFileManager.getOptionalFileRef(
Cache->OrigEntry->getName());
10402 ToID = ToSM.
createFileID(*Entry, ToIncludeLocOrFakeLoc,
10409 std::optional<llvm::MemoryBufferRef> FromBuf =
10410 Cache->getBufferOrNone(FromContext.getDiagnostics(),
10415 std::unique_ptr<llvm::MemoryBuffer> ToBuf =
10416 llvm::MemoryBuffer::getMemBufferCopy(FromBuf->getBuffer(),
10417 FromBuf->getBufferIdentifier());
10423 assert(ToID.
isValid() &&
"Unexpected invalid fileID was created.");
10425 ImportedFileIDs[FromID] = ToID;
10432 return ToExprOrErr.takeError();
10435 if (!LParenLocOrErr)
10436 return LParenLocOrErr.takeError();
10439 if (!RParenLocOrErr)
10440 return RParenLocOrErr.takeError();
10445 return ToTInfoOrErr.takeError();
10450 return std::move(Err);
10453 ToContext, *ToTInfoOrErr, From->
isBaseVirtual(), *LParenLocOrErr,
10454 *ToExprOrErr, *RParenLocOrErr, EllipsisLoc);
10458 return ToFieldOrErr.takeError();
10461 if (!MemberLocOrErr)
10462 return MemberLocOrErr.takeError();
10465 ToContext, cast_or_null<FieldDecl>(*ToFieldOrErr), *MemberLocOrErr,
10466 *LParenLocOrErr, *ToExprOrErr, *RParenLocOrErr);
10469 if (!ToIFieldOrErr)
10470 return ToIFieldOrErr.takeError();
10473 if (!MemberLocOrErr)
10474 return MemberLocOrErr.takeError();
10477 ToContext, cast_or_null<IndirectFieldDecl>(*ToIFieldOrErr),
10478 *MemberLocOrErr, *LParenLocOrErr, *ToExprOrErr, *RParenLocOrErr);
10482 return ToTInfoOrErr.takeError();
10484 return new (ToContext)
10486 *ToExprOrErr, *RParenLocOrErr);
10489 return make_error<ASTImportError>();
10495 auto Pos = ImportedCXXBaseSpecifiers.find(BaseSpec);
10496 if (Pos != ImportedCXXBaseSpecifiers.end())
10497 return Pos->second;
10500 if (!ToSourceRange)
10501 return ToSourceRange.takeError();
10504 return ToTSI.takeError();
10506 if (!ToEllipsisLoc)
10507 return ToEllipsisLoc.takeError();
10511 ImportedCXXBaseSpecifiers[BaseSpec] =
Imported;
10523 return ToOrErr.takeError();
10524 Decl *To = *ToOrErr;
10529 if (
auto *ToRecord = dyn_cast<RecordDecl>(To)) {
10530 if (!ToRecord->getDefinition()) {
10537 if (
auto *ToEnum = dyn_cast<EnumDecl>(To)) {
10538 if (!ToEnum->getDefinition()) {
10544 if (
auto *ToIFace = dyn_cast<ObjCInterfaceDecl>(To)) {
10545 if (!ToIFace->getDefinition()) {
10552 if (
auto *ToProto = dyn_cast<ObjCProtocolDecl>(To)) {
10553 if (!ToProto->getDefinition()) {
10577 return ToSelOrErr.takeError();
10581 return ToContext.DeclarationNames.getCXXConstructorName(
10582 ToContext.getCanonicalType(*ToTyOrErr));
10584 return ToTyOrErr.takeError();
10589 return ToContext.DeclarationNames.getCXXDestructorName(
10590 ToContext.getCanonicalType(*ToTyOrErr));
10592 return ToTyOrErr.takeError();
10597 return ToContext.DeclarationNames.getCXXDeductionGuideName(
10600 return ToTemplateOrErr.takeError();
10605 return ToContext.DeclarationNames.getCXXConversionFunctionName(
10606 ToContext.getCanonicalType(*ToTyOrErr));
10608 return ToTyOrErr.takeError();
10612 return ToContext.DeclarationNames.getCXXOperatorName(
10616 return ToContext.DeclarationNames.getCXXLiteralOperatorName(
10624 llvm_unreachable(
"Invalid DeclarationName Kind!");
10652 for (
unsigned I = 1, N = FromSel.
getNumArgs(); I < N; ++I)
10654 return ToContext.Selectors.getSelector(FromSel.
getNumArgs(), Idents.data());
10660 llvm::Error Err = llvm::Error::success();
10661 auto ImportLoop = [&](
const APValue *From,
APValue *To,
unsigned Size) {
10662 for (
unsigned Idx = 0; Idx < Size; Idx++) {
10667 switch (FromValue.
getKind()) {
10681 ImportLoop(((
const APValue::Vec *)(
const char *)&FromValue.Data)->Elts,
10687 llvm_unreachable(
"Matrix APValue import not yet supported");
10691 ImportLoop(((
const APValue::Arr *)(
const char *)&FromValue.Data)->Elts,
10692 ((
const APValue::Arr *)(
const char *)&
Result.Data)->Elts,
10699 ((
const APValue::StructData *)(
const char *)&FromValue.Data)->Elts,
10700 ((
const APValue::StructData *)(
const char *)&
Result.Data)->Elts,
10708 return std::move(Err);
10713 Result.MakeAddrLabelDiff();
10717 return std::move(Err);
10723 const Decl *ImpMemPtrDecl =
10726 return std::move(Err);
10728 Result.setMemberPointerUninit(
10737 return std::move(Err);
10747 "in C++20 dynamic allocation are transient so they shouldn't "
10748 "appear in the AST");
10750 if (
const auto *E =
10752 FromElemTy = E->getType();
10755 return std::move(Err);
10765 return std::move(Err);
10777 return std::move(Err);
10790 for (
unsigned LoopIdx = 0; LoopIdx < PathLength; LoopIdx++) {
10792 const Decl *FromDecl =
10793 FromPath[LoopIdx].getAsBaseOrMember().getPointer();
10796 return std::move(Err);
10797 if (
auto *RD = dyn_cast<CXXRecordDecl>(FromDecl))
10798 FromElemTy = Importer.FromContext.getCanonicalTagType(RD);
10802 ImpDecl, FromPath[LoopIdx].getAsBaseOrMember().getInt()));
10805 Importer.FromContext.getAsArrayType(FromElemTy)->getElementType();
10807 FromPath[LoopIdx].getAsArrayIndex());
10815 return std::move(Err);
10823 unsigned NumDecls) {
10833 if (LastDiagFromFrom)
10834 ToContext.getDiagnostics().notePriorDiagnosticFrom(
10835 FromContext.getDiagnostics());
10836 LastDiagFromFrom =
false;
10837 return ToContext.getDiagnostics().Report(Loc, DiagID);
10841 if (!LastDiagFromFrom)
10842 FromContext.getDiagnostics().notePriorDiagnosticFrom(
10843 ToContext.getDiagnostics());
10844 LastDiagFromFrom =
true;
10845 return FromContext.getDiagnostics().Report(Loc, DiagID);
10849 if (
auto *ID = dyn_cast<ObjCInterfaceDecl>(D)) {
10850 if (!ID->getDefinition())
10851 ID->startDefinition();
10853 else if (
auto *PD = dyn_cast<ObjCProtocolDecl>(D)) {
10854 if (!PD->getDefinition())
10855 PD->startDefinition();
10857 else if (
auto *TD = dyn_cast<TagDecl>(D)) {
10858 if (!TD->getDefinition() && !TD->isBeingDefined()) {
10859 TD->startDefinition();
10860 TD->setCompleteDefinition(
true);
10864 assert(0 &&
"CompleteDecl called on a Decl that can't be completed");
10869 auto [Pos, Inserted] = ImportedDecls.try_emplace(From, To);
10870 assert((Inserted || Pos->second == To) &&
10871 "Try to import an already imported Decl");
10873 return Pos->second;
10876 ImportedFromDecls[To] = From;
10881 AddToLookupTable(To);
10885std::optional<ASTImportError>
10887 auto Pos = ImportDeclErrors.find(FromD);
10888 if (Pos != ImportDeclErrors.end())
10889 return Pos->second;
10891 return std::nullopt;
10895 auto InsertRes = ImportDeclErrors.insert({From,
Error});
10899 assert(InsertRes.second || InsertRes.first->second.Error ==
Error.Error);
10904 llvm::DenseMap<const Type *, const Type *>::iterator Pos =
10906 if (Pos != ImportedTypes.end()) {
10908 if (ToContext.hasSameType(*ToFromOrErr, To))
10911 llvm::consumeError(ToFromOrErr.takeError());
10916 getToContext().getLangOpts(), FromContext, ToContext, NonEquivalentDecls,
Defines the clang::ASTContext interface.
static FriendCountAndPosition getFriendCountAndPosition(ASTImporter &Importer, FriendDecl *FD)
static bool IsEquivalentFriend(ASTImporter &Importer, FriendDecl *FD1, FriendDecl *FD2)
static ExpectedStmt ImportLoopControlStmt(ASTNodeImporter &NodeImporter, ASTImporter &Importer, StmtClass *S)
static auto getTemplateDefinition(T *D) -> T *
static bool isAncestorDeclContextOf(const DeclContext *DC, const Decl *D)
static Error setTypedefNameForAnonDecl(TagDecl *From, TagDecl *To, ASTImporter &Importer)
static StructuralEquivalenceKind getStructuralEquivalenceKind(const ASTImporter &Importer)
This file provides some common utility functions for processing Lambda related AST Constructs.
Defines enum values for all the target-independent builtin functions.
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
Defines the C++ template declaration subclasses.
Defines the ExceptionSpecificationType enumeration and various utility functions.
Defines the clang::Expr interface and subclasses for C++ expressions.
Defines the clang::FileManager interface and associated types.
Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.
Result
Implement __builtin_bit_cast and related operations.
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
Defines the LambdaCapture class.
Defines the clang::LangOptions interface.
llvm::MachO::Record Record
llvm::SmallVector< std::pair< const MemRegion *, SVal >, 4 > Bindings
Defines the clang::SourceLocation class and associated facilities.
Defines the SourceManager interface.
Defines various enumerations that describe declaration and type specifiers.
Defines the Objective-C statement AST node classes.
Defines the clang::TypeLoc interface and its subclasses.
C Language Family Type Representation.
llvm::APInt getValue() const
unsigned getVersion() const
QualType getTypeInfoType() const
static LValueBase getTypeInfo(TypeInfoLValue LV, QualType TypeInfo)
unsigned getCallIndex() const
A non-discriminated union of a base, field, or array index.
static LValuePathEntry ArrayIndex(uint64_t Index)
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
const LValueBase getLValueBase() const
ArrayRef< LValuePathEntry > getLValuePath() const
const FieldDecl * getUnionField() const
unsigned getStructNumFields() const
llvm::PointerIntPair< const Decl *, 1, bool > BaseOrMemberType
A FieldDecl or CXXRecordDecl, along with a flag indicating whether we mean a virtual or non-virtual b...
ValueKind getKind() const
bool isLValueOnePastTheEnd() const
bool isMemberPointerToDerivedMember() const
unsigned getArrayInitializedElts() const
unsigned getStructNumBases() const
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 & getToContext() const
Retrieve the context that AST nodes are being imported into.
DiagnosticBuilder ToDiag(SourceLocation Loc, unsigned DiagID)
Report a diagnostic in the "to" context.
Decl * MapImported(Decl *From, Decl *To)
Store and assign the imported declaration to its counterpart.
static UnsignedOrNone getFieldIndex(Decl *F)
Determine the index of a field in its parent record.
TranslationUnitDecl * GetFromTU(Decl *ToD)
Return the translation unit from where the declaration was imported.
llvm::Expected< DeclContext * > ImportContext(DeclContext *FromDC)
Import the given declaration context from the "from" AST context into the "to" AST context.
llvm::Error ImportDefinition(Decl *From)
Import the definition of the given declaration, including all of the declarations it contains.
virtual Expected< DeclarationName > HandleNameConflict(DeclarationName Name, DeclContext *DC, unsigned IDNS, NamedDecl **Decls, unsigned NumDecls)
Cope with a name conflict when importing a declaration into the given context.
void RegisterImportedDecl(Decl *FromD, Decl *ToD)
std::optional< ASTImportError > getImportDeclErrorIfAny(Decl *FromD) const
Return if import of the given declaration has failed and if yes the kind of the problem.
friend class ASTNodeImporter
llvm::Error ImportTemplateArguments(ArrayRef< TemplateArgument > FromArgs, SmallVectorImpl< TemplateArgument > &ToArgs)
llvm::Error importInto(ImportT &To, const ImportT &From)
Import the given object, returns the result.
virtual void Imported(Decl *From, Decl *To)
Subclasses can override this function to observe all of the From -> To declaration mappings as they a...
DiagnosticBuilder FromDiag(SourceLocation Loc, unsigned DiagID)
Report a diagnostic in the "from" context.
llvm::DenseSet< std::tuple< Decl *, Decl *, int > > NonEquivalentDeclSet
bool IsStructurallyEquivalent(QualType From, QualType To, bool Complain=true)
Determine whether the given types are structurally equivalent.
virtual Expected< Decl * > ImportImpl(Decl *From)
Can be overwritten by subclasses to implement their own import logic.
bool isMinimalImport() const
Whether the importer will perform a minimal import, creating to-be-completed forward declarations whe...
ASTImporter(ASTContext &ToContext, FileManager &ToFileManager, ASTContext &FromContext, FileManager &FromFileManager, bool MinimalImport, std::shared_ptr< ASTImporterSharedState > SharedState=nullptr)
llvm::Expected< ExprWithCleanups::CleanupObject > Import(ExprWithCleanups::CleanupObject From)
Import cleanup objects owned by ExprWithCleanup.
virtual void CompleteDecl(Decl *D)
Called for ObjCInterfaceDecl, ObjCProtocolDecl, and TagDecl.
Decl * GetAlreadyImportedOrNull(const Decl *FromD) const
Return the copy of the given declaration in the "to" context if it has already been imported from the...
void setImportDeclError(Decl *From, ASTImportError Error)
Mark (newly) imported declaration with error.
ExpectedDecl VisitObjCImplementationDecl(ObjCImplementationDecl *D)
ExpectedStmt VisitGenericSelectionExpr(GenericSelectionExpr *E)
ExpectedStmt VisitTypeTraitExpr(TypeTraitExpr *E)
ExpectedDecl VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D)
ExpectedDecl VisitObjCInterfaceDecl(ObjCInterfaceDecl *D)
ExpectedStmt VisitDeclRefExpr(DeclRefExpr *E)
ExpectedDecl VisitAccessSpecDecl(AccessSpecDecl *D)
ExpectedDecl VisitFunctionDecl(FunctionDecl *D)
ExpectedDecl VisitParmVarDecl(ParmVarDecl *D)
ExpectedStmt VisitImplicitValueInitExpr(ImplicitValueInitExpr *E)
ExpectedStmt VisitImplicitCastExpr(ImplicitCastExpr *E)
ExpectedDecl VisitCXXMethodDecl(CXXMethodDecl *D)
ExpectedDecl VisitUsingDecl(UsingDecl *D)
ExpectedDecl VisitObjCProtocolDecl(ObjCProtocolDecl *D)
ExpectedStmt VisitStmt(Stmt *S)
ExpectedDecl VisitTranslationUnitDecl(TranslationUnitDecl *D)
ExpectedDecl VisitFieldDecl(FieldDecl *D)
Error ImportFieldDeclDefinition(const FieldDecl *From, const FieldDecl *To)
Error ImportDefinitionIfNeeded(Decl *FromD, Decl *ToD=nullptr)
ExpectedStmt VisitCharacterLiteral(CharacterLiteral *E)
ExpectedStmt VisitCXXConstructExpr(CXXConstructExpr *E)
ExpectedStmt VisitObjCAtThrowStmt(ObjCAtThrowStmt *S)
ExpectedDecl VisitStaticAssertDecl(StaticAssertDecl *D)
ExpectedStmt VisitShuffleVectorExpr(ShuffleVectorExpr *E)
ExpectedDecl VisitObjCPropertyDecl(ObjCPropertyDecl *D)
ExpectedDecl VisitRecordDecl(RecordDecl *D)
ExpectedStmt VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E)
ExpectedDecl VisitUsingShadowDecl(UsingShadowDecl *D)
Error ImportArrayChecked(const InContainerTy &InContainer, OIter Obegin)
ExpectedStmt VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S)
StringRef ImportASTStringRef(StringRef FromStr)
T importChecked(Error &Err, const T &From)
ExpectedStmt VisitVAArgExpr(VAArgExpr *E)
ExpectedStmt VisitDefaultStmt(DefaultStmt *S)
ExpectedDecl VisitUnresolvedUsingTypenameDecl(UnresolvedUsingTypenameDecl *D)
ExpectedStmt VisitCXXThrowExpr(CXXThrowExpr *E)
ExpectedDecl VisitLabelDecl(LabelDecl *D)
ExpectedStmt VisitSizeOfPackExpr(SizeOfPackExpr *E)
ExpectedDecl VisitRequiresExprBodyDecl(RequiresExprBodyDecl *E)
ExpectedStmt VisitObjCAtTryStmt(ObjCAtTryStmt *S)
ExpectedStmt VisitUnaryOperator(UnaryOperator *E)
Error ImportTemplateParameterLists(const DeclTy *FromD, DeclTy *ToD)
Error ImportDeclContext(DeclContext *FromDC, bool ForceImport=false)
ExpectedStmt VisitRequiresExpr(RequiresExpr *E)
ExpectedDecl VisitImplicitConceptSpecializationDecl(ImplicitConceptSpecializationDecl *D)
ExpectedStmt VisitContinueStmt(ContinueStmt *S)
ExpectedStmt VisitCXXMemberCallExpr(CXXMemberCallExpr *E)
ExpectedDecl VisitVarDecl(VarDecl *D)
ExpectedStmt VisitCXXStdInitializerListExpr(CXXStdInitializerListExpr *E)
ExpectedDecl VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D)
Error ImportImplicitMethods(const CXXRecordDecl *From, CXXRecordDecl *To)
ExpectedStmt 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)
bool hasSameVisibilityContextAndLinkage(T *Found, T *From)
ExpectedStmt VisitParenExpr(ParenExpr *E)
ExpectedStmt VisitObjCForCollectionStmt(ObjCForCollectionStmt *S)
ExpectedStmt VisitSourceLocExpr(SourceLocExpr *E)
ExpectedStmt VisitInitListExpr(InitListExpr *E)
Expected< FunctionTemplateAndArgsTy > ImportFunctionTemplateWithTemplateArgsFromSpecialization(FunctionDecl *FromFD)
ExpectedStmt VisitReturnStmt(ReturnStmt *S)
SmallVector< TemplateArgument, 8 > TemplateArgsTy
ExpectedStmt VisitAtomicExpr(AtomicExpr *E)
ExpectedStmt VisitConditionalOperator(ConditionalOperator *E)
ExpectedStmt VisitChooseExpr(ChooseExpr *E)
ExpectedStmt VisitCompoundStmt(CompoundStmt *S)
Expected< TemplateArgument > ImportTemplateArgument(const TemplateArgument &From)
ExpectedStmt VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E)
ExpectedStmt VisitCaseStmt(CaseStmt *S)
ExpectedStmt VisitCXXRewrittenBinaryOperator(CXXRewrittenBinaryOperator *E)
ExpectedStmt VisitDesignatedInitExpr(DesignatedInitExpr *E)
ExpectedStmt VisitSubstNonTypeTemplateParmPackExpr(SubstNonTypeTemplateParmPackExpr *E)
ExpectedDecl VisitObjCTypeParamDecl(ObjCTypeParamDecl *D)
ExpectedDecl VisitFileScopeAsmDecl(FileScopeAsmDecl *D)
ExpectedStmt VisitCompoundAssignOperator(CompoundAssignOperator *E)
ExpectedStmt VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *E)
ExpectedStmt VisitLambdaExpr(LambdaExpr *LE)
ExpectedStmt VisitBinaryOperator(BinaryOperator *E)
ExpectedStmt VisitCallExpr(CallExpr *E)
ExpectedStmt VisitDeclStmt(DeclStmt *S)
ExpectedStmt VisitCXXDeleteExpr(CXXDeleteExpr *E)
ExpectedStmt VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *E)
Error ImportArrayChecked(IIter Ibegin, IIter Iend, OIter Obegin)
ExpectedDecl VisitClassTemplateDecl(ClassTemplateDecl *D)
ExpectedDecl VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D)
Expected< CXXCastPath > ImportCastPath(CastExpr *E)
Expected< APValue > ImportAPValue(const APValue &FromValue)
ExpectedDecl VisitFunctionTemplateDecl(FunctionTemplateDecl *D)
ExpectedStmt VisitGNUNullExpr(GNUNullExpr *E)
ExpectedDecl VisitClassTemplateSpecializationDecl(ClassTemplateSpecializationDecl *D)
ExpectedStmt VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E)
ExpectedDecl VisitLifetimeExtendedTemporaryDecl(LifetimeExtendedTemporaryDecl *D)
Expected< concepts::Requirement * > ImportNestedRequirement(concepts::NestedRequirement *From)
ExpectedDecl VisitTypedefNameDecl(TypedefNameDecl *D, bool IsAlias)
ExpectedDecl VisitCXXConstructorDecl(CXXConstructorDecl *D)
ExpectedDecl VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D)
ExpectedDecl VisitObjCIvarDecl(ObjCIvarDecl *D)
Expected< ObjCTypeParamList * > ImportObjCTypeParamList(ObjCTypeParamList *list)
ExpectedDecl VisitUsingPackDecl(UsingPackDecl *D)
ExpectedStmt VisitWhileStmt(WhileStmt *S)
ExpectedDecl VisitEnumConstantDecl(EnumConstantDecl *D)
ExpectedStmt VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E)
ExpectedStmt VisitCXXForRangeStmt(CXXForRangeStmt *S)
ExpectedDecl VisitFriendDecl(FriendDecl *D)
Error ImportContainerChecked(const InContainerTy &InContainer, OutContainerTy &OutContainer)
ExpectedStmt VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E)
ExpectedStmt VisitExpressionTraitExpr(ExpressionTraitExpr *E)
bool IsStructuralMatch(Decl *From, Decl *To, bool Complain=true, bool IgnoreTemplateParmDepth=false)
ExpectedStmt VisitFixedPointLiteral(FixedPointLiteral *E)
ExpectedStmt VisitForStmt(ForStmt *S)
ExpectedStmt VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E)
ExpectedDecl VisitEnumDecl(EnumDecl *D)
ExpectedStmt 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)
bool hasReturnTypeDeclaredInside(FunctionDecl *D)
This function checks if the given function has a return type that contains a reference (in any way) t...
ASTNodeImporter(ASTImporter &Importer)
ExpectedDecl VisitCXXDeductionGuideDecl(CXXDeductionGuideDecl *D)
ExpectedStmt VisitMemberExpr(MemberExpr *E)
ExpectedStmt VisitConceptSpecializationExpr(ConceptSpecializationExpr *E)
ExpectedStmt VisitCXXThisExpr(CXXThisExpr *E)
Error ImportInitializer(VarDecl *From, VarDecl *To)
ImportDefinitionKind
What we should import from the definition.
@ IDK_Everything
Import everything.
@ IDK_Default
Import the default subset of the definition, which might be nothing (if minimal import is set) or mig...
@ IDK_Basic
Import only the bare bones needed to establish a valid DeclContext.
ExpectedDecl VisitTypedefDecl(TypedefDecl *D)
ExpectedDecl VisitUsingDirectiveDecl(UsingDirectiveDecl *D)
ExpectedStmt VisitArrayTypeTraitExpr(ArrayTypeTraitExpr *E)
ExpectedDecl VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D)
Expected< concepts::Requirement * > ImportExprRequirement(concepts::ExprRequirement *From)
ExpectedStmt VisitFloatingLiteral(FloatingLiteral *E)
ExpectedStmt VisitIfStmt(IfStmt *S)
ExpectedStmt VisitLabelStmt(LabelStmt *S)
ExpectedStmt VisitCXXTypeidExpr(CXXTypeidExpr *E)
ExpectedStmt VisitConvertVectorExpr(ConvertVectorExpr *E)
ExpectedDecl VisitUsingEnumDecl(UsingEnumDecl *D)
ExpectedStmt VisitGotoStmt(GotoStmt *S)
ExpectedStmt VisitSubstNonTypeTemplateParmExpr(SubstNonTypeTemplateParmExpr *E)
ExpectedStmt VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *S)
ExpectedStmt VisitGCCAsmStmt(GCCAsmStmt *S)
ExpectedDecl VisitNamespaceDecl(NamespaceDecl *D)
ExpectedStmt VisitCXXTryStmt(CXXTryStmt *S)
Error ImportConstraintSatisfaction(const ASTConstraintSatisfaction &FromSat, ConstraintSatisfaction &ToSat)
ExpectedDecl VisitImportDecl(ImportDecl *D)
Error ImportFunctionDeclBody(FunctionDecl *FromFD, FunctionDecl *ToFD)
ExpectedStmt VisitArraySubscriptExpr(ArraySubscriptExpr *E)
Expected< concepts::Requirement * > ImportTypeRequirement(concepts::TypeRequirement *From)
ExpectedStmt VisitIntegerLiteral(IntegerLiteral *E)
ExpectedDecl VisitEmptyDecl(EmptyDecl *D)
ExpectedStmt VisitCXXNoexceptExpr(CXXNoexceptExpr *E)
ExpectedStmt VisitExpr(Expr *E)
Error ImportDefaultArgOfParmVarDecl(const ParmVarDecl *FromParam, ParmVarDecl *ToParam)
ExpectedStmt VisitArrayInitLoopExpr(ArrayInitLoopExpr *E)
ExpectedStmt VisitCXXCatchStmt(CXXCatchStmt *S)
ExpectedStmt VisitAttributedStmt(AttributedStmt *S)
ExpectedStmt VisitIndirectGotoStmt(IndirectGotoStmt *S)
ExpectedStmt VisitParenListExpr(ParenListExpr *E)
Expected< FunctionDecl * > FindFunctionTemplateSpecialization(FunctionDecl *FromFD)
ExpectedDecl VisitCXXConversionDecl(CXXConversionDecl *D)
ExpectedStmt VisitObjCAtCatchStmt(ObjCAtCatchStmt *S)
Error ImportTemplateInformation(FunctionDecl *FromFD, FunctionDecl *ToFD)
ExpectedStmt VisitStmtExpr(StmtExpr *E)
ExpectedStmt VisitCXXDefaultInitExpr(CXXDefaultInitExpr *E)
bool shouldForceImportDeclContext(ImportDefinitionKind IDK)
ExpectedDecl VisitBindingDecl(BindingDecl *D)
std::tuple< FunctionTemplateDecl *, TemplateArgsTy > FunctionTemplateAndArgsTy
ExpectedStmt VisitBreakStmt(BreakStmt *S)
DesignatedInitExpr::Designator Designator
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
QualType getAdjustedType() const
QualType getOriginalType() 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.
ArraySizeModifier getSizeModifier() const
QualType getElementType() const
unsigned getIndexTypeCVRQualifiers() const
SourceLocation getAsmLoc() const
unsigned getNumClobbers() const
unsigned getNumOutputs() const
unsigned getNumInputs() const
A structure for storing the information associated with a name that has been assumed to be a template...
DeclarationName getDeclName() const
Get the name of the template.
AtomicExpr - Variadic atomic builtins: __atomic_exchange, __atomic_fetch_*, __atomic_load,...
SourceLocation getRParenLoc() const
static unsigned getNumSubExprs(AtomicOp Op)
Determine the number of arguments the specified atomic builtin should have.
SourceLocation getBuiltinLoc() const
Attr - This represents one attribute.
attr::Kind getKind() const
void setPackExpansion(bool PE)
Attr * clone(ASTContext &C) const
SourceRange getRange() const
void setRange(SourceRange R)
void setAttrName(const IdentifierInfo *AttrNameII)
const IdentifierInfo * getAttrName() const
Represents an attribute applied to a statement.
SourceLocation getAttrLoc() const
ArrayRef< const Attr * > getAttrs() const
static AttributedStmt * Create(const ASTContext &C, SourceLocation Loc, ArrayRef< const Attr * > Attrs, Stmt *SubStmt)
Represents a C++ declaration that introduces decls from somewhere else.
void addShadowDecl(UsingShadowDecl *S)
shadow_range shadows() const
BinaryConditionalOperator - The GNU extension to the conditional operator which allows the middle ope...
Expr * getFalseExpr() const
getFalseExpr - Return the subexpression which will be evaluated if the condition evaluates to false; ...
OpaqueValueExpr * getOpaqueValue() const
getOpaqueValue - Return the opaque value placeholder.
Expr * getCond() const
getCond - Return the condition expression; this is defined in terms of the opaque value.
Expr * getTrueExpr() const
getTrueExpr - Return the subexpression which will be evaluated if the condition evaluates to true; th...
Expr * getCommon() const
getCommon - Return the common expression, written to the left of the condition.
A builtin binary operation expression such as "x + y" or "x <= y".
SourceLocation getOperatorLoc() const
static BinaryOperator * Create(const ASTContext &C, Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy, ExprValueKind VK, ExprObjectKind OK, SourceLocation opLoc, FPOptionsOverride FPFeatures)
FPOptionsOverride getFPFeatures() const
A binding in a decomposition declaration.
ValueDecl * getDecomposedDecl() const
Get the decomposition declaration that this binding represents a decomposition of.
Expr * getBinding() const
Get the expression to which this declaration is bound.
void setBinding(QualType DeclaredType, Expr *Binding)
Set the binding for this BindingDecl, along with its declared type (which should be a possibly-cv-qua...
void setDecomposedDecl(ValueDecl *Decomposed)
Set the decomposed variable for this BindingDecl.
unsigned getNumBits() const
QualType getPointeeType() const
decl_range dependent_decls() const
BreakStmt - This represents a break.
Represents a C++2a __builtin_bit_cast(T, v) expression.
Represents the builtin template declaration which is used to implement __make_integer_seq and other b...
BuiltinTemplateKind getBuiltinTemplateKind() const
This class is used for builtin types like 'int'.
static CStyleCastExpr * Create(const ASTContext &Context, QualType T, ExprValueKind VK, CastKind K, Expr *Op, const CXXCastPath *BasePath, FPOptionsOverride FPO, TypeSourceInfo *WrittenTy, SourceLocation L, SourceLocation R)
Represents a base class of a C++ class.
AccessSpecifier getAccessSpecifierAsWritten() const
Retrieves the access specifier as written in the source code (which may mean that no access specifier...
SourceLocation getEllipsisLoc() const
For a pack expansion, determine the location of the ellipsis.
bool isVirtual() const
Determines whether the base class is a virtual base class (or not).
TypeSourceInfo * getTypeSourceInfo() const
Retrieves the type and source location of the base class.
bool isBaseOfClass() const
Determine whether this base class is a base of a class declared with the 'class' keyword (vs.
SourceRange getSourceRange() const LLVM_READONLY
Retrieves the source range that contains the entire base specifier.
Represents binding an expression to a temporary.
CXXTemporary * getTemporary()
static CXXBindTemporaryExpr * Create(const ASTContext &C, CXXTemporary *Temp, Expr *SubExpr)
const Expr * getSubExpr() const
A boolean literal, per ([C++ lex.bool] Boolean literals).
static CXXBoolLiteralExpr * Create(const ASTContext &C, bool Val, QualType Ty, SourceLocation Loc)
SourceLocation getLocation() const
CXXCatchStmt - This represents a C++ catch block.
SourceLocation getCatchLoc() const
Stmt * getHandlerBlock() const
VarDecl * getExceptionDecl() const
static CXXConstCastExpr * Create(const ASTContext &Context, QualType T, ExprValueKind VK, Expr *Op, TypeSourceInfo *WrittenTy, SourceLocation L, SourceLocation RParenLoc, SourceRange AngleBrackets)
Represents a call to a C++ constructor.
SourceRange getParenOrBraceRange() const
void setIsImmediateEscalating(bool Set)
bool isElidable() const
Whether this construction is elidable.
bool hadMultipleCandidates() const
Whether the referred constructor was resolved from an overloaded set having size greater than 1.
static CXXConstructExpr * Create(const ASTContext &Ctx, QualType Ty, SourceLocation Loc, CXXConstructorDecl *Ctor, bool Elidable, ArrayRef< Expr * > Args, bool HadMultipleCandidates, bool ListInitialization, bool StdInitListInitialization, bool ZeroInitialization, CXXConstructionKind ConstructKind, SourceRange ParenOrBraceRange)
Create a C++ construction expression.
bool isStdInitListInitialization() const
Whether this constructor call was written as list-initialization, but was interpreted as forming a st...
bool isImmediateEscalating() const
bool requiresZeroInitialization() const
Whether this construction first requires zero-initialization before the initializer is called.
SourceLocation getLocation() const
CXXConstructorDecl * getConstructor() const
Get the constructor that this expression will (ultimately) call.
bool isListInitialization() const
Whether this constructor call was written as list-initialization.
unsigned getNumArgs() const
Return the number of arguments to the constructor call.
CXXConstructionKind getConstructionKind() const
Determine whether this constructor is actually constructing a base class (rather than a complete obje...
Represents a C++ constructor within a class.
Represents a C++ conversion function within a class.
Represents a C++ base or member initializer.
FieldDecl * getMember() const
If this is a member initializer, returns the declaration of the non-static data member being initiali...
bool isDelegatingInitializer() const
Determine whether this initializer is creating a delegating constructor.
Expr * getInit() const
Get the initializer.
SourceLocation getRParenLoc() const
SourceLocation getEllipsisLoc() const
SourceLocation getLParenLoc() const
bool isPackExpansion() const
Determine whether this initializer is a pack expansion.
TypeSourceInfo * getTypeSourceInfo() const
Returns the declarator information for a base class or delegating initializer.
bool isMemberInitializer() const
Determine whether this initializer is initializing a non-static data member.
bool isBaseInitializer() const
Determine whether this initializer is initializing a base class.
bool isIndirectMemberInitializer() const
SourceLocation getMemberLocation() const
IndirectFieldDecl * getIndirectMember() const
bool isBaseVirtual() const
Returns whether the base is virtual or not.
Represents a C++ deduction guide declaration.
SourceDeductionGuideKind getSourceDeductionGuideKind() const
A default argument (C++ [dcl.fct.default]).
SourceLocation getUsedLocation() const
Retrieve the location where this default argument was actually used.
const ParmVarDecl * getParam() const
Expr * getRewrittenExpr()
const DeclContext * getUsedContext() const
static CXXDefaultArgExpr * Create(const ASTContext &C, SourceLocation Loc, ParmVarDecl *Param, Expr *RewrittenExpr, DeclContext *UsedContext)
bool hasRewrittenInit() const
A use of a default initializer in a constructor or in aggregate initialization.
static CXXDefaultInitExpr * Create(const ASTContext &Ctx, SourceLocation Loc, FieldDecl *Field, DeclContext *UsedContext, Expr *RewrittenInitExpr)
Field is the non-static data member whose default initializer is used by this expression.
const DeclContext * getUsedContext() const
const Expr * getRewrittenExpr() const
Retrieve the initializing expression with evaluated immediate calls, if any.
bool hasRewrittenInit() const
FieldDecl * getField()
Get the field whose initializer will be used.
SourceLocation getBeginLoc() const
Represents a delete expression for memory deallocation and destructor calls, e.g.
FunctionDecl * getOperatorDelete() const
SourceLocation getBeginLoc() const
bool isGlobalDelete() const
bool doesUsualArrayDeleteWantSize() const
Answers whether the usual array deallocation function for the allocated type expects the size of the ...
bool isArrayFormAsWritten() const
Represents a C++ member access expression where the actual member referenced could not be resolved be...
bool isArrow() const
Determine whether this member expression used the '->' operator; otherwise, it used the '.
SourceLocation getOperatorLoc() const
Retrieve the location of the '->' or '.' operator.
static CXXDependentScopeMemberExpr * Create(const ASTContext &Ctx, Expr *Base, QualType BaseType, bool IsArrow, SourceLocation OperatorLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc, NamedDecl *FirstQualifierFoundInScope, DeclarationNameInfo MemberNameInfo, const TemplateArgumentListInfo *TemplateArgs)
SourceLocation getLAngleLoc() const
Retrieve the location of the left angle bracket starting the explicit template argument list followin...
SourceLocation getTemplateKeywordLoc() const
Retrieve the location of the template keyword preceding the member name, if any.
const DeclarationNameInfo & getMemberNameInfo() const
Retrieve the name of the member that this expression refers to.
bool hasExplicitTemplateArgs() const
Determines whether this member expression actually had a C++ template argument list explicitly specif...
SourceLocation getMemberLoc() const
SourceLocation getRAngleLoc() const
Retrieve the location of the right angle bracket ending the explicit template argument list following...
DeclarationName getMember() const
Retrieve the name of the member that this expression refers to.
NamedDecl * getFirstQualifierFoundInScope() const
Retrieve the first part of the nested-name-specifier that was found in the scope of the member access...
Expr * getBase() const
Retrieve the base object of this member expressions, e.g., the x in x.m.
NestedNameSpecifierLoc getQualifierLoc() const
Retrieve the nested-name-specifier that qualifies the member name, with source location information.
bool isImplicitAccess() const
True if this is an implicit access, i.e.
ArrayRef< TemplateArgumentLoc > template_arguments() const
Represents a C++ destructor within a class.
void setOperatorDelete(FunctionDecl *OD, Expr *ThisArg)
static CXXDynamicCastExpr * Create(const ASTContext &Context, QualType T, ExprValueKind VK, CastKind Kind, Expr *Op, const CXXCastPath *Path, TypeSourceInfo *Written, SourceLocation L, SourceLocation RParenLoc, SourceRange AngleBrackets)
Represents a folding of a pack over an operator.
UnresolvedLookupExpr * getCallee() const
SourceLocation getLParenLoc() const
SourceLocation getEllipsisLoc() const
UnsignedOrNone getNumExpansions() const
SourceLocation getRParenLoc() const
BinaryOperatorKind getOperator() const
CXXForRangeStmt - This represents C++0x [stmt.ranged]'s ranged for statement, represented as 'for (ra...
DeclStmt * getBeginStmt()
DeclStmt * getLoopVarStmt()
SourceLocation getForLoc() const
DeclStmt * getRangeStmt()
SourceLocation getRParenLoc() const
SourceLocation getColonLoc() const
SourceLocation getCoawaitLoc() const
static CXXFunctionalCastExpr * Create(const ASTContext &Context, QualType T, ExprValueKind VK, TypeSourceInfo *Written, CastKind Kind, Expr *Op, const CXXCastPath *Path, FPOptionsOverride FPO, SourceLocation LPLoc, SourceLocation RPLoc)
Represents a call to an inherited base class constructor from an inheriting constructor.
bool constructsVBase() const
Determine whether this constructor is actually constructing a base class (rather than a complete obje...
CXXConstructorDecl * getConstructor() const
Get the constructor that this expression will call.
SourceLocation getLocation() const LLVM_READONLY
bool inheritedFromVBase() const
Determine whether the inherited constructor is inherited from a virtual base of the object we constru...
Represents a call to a member function that may be written either with member call syntax (e....
static CXXMemberCallExpr * Create(const ASTContext &Ctx, Expr *Fn, ArrayRef< Expr * > Args, QualType Ty, ExprValueKind VK, SourceLocation RP, FPOptionsOverride FPFeatures, unsigned MinNumArgs=0)
Represents a static or instance method of a struct/union/class.
void addOverriddenMethod(const CXXMethodDecl *MD)
overridden_method_range overridden_methods() const
CXXMethodDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Abstract class common to all of the C++ "named"/"keyword" casts.
SourceLocation getOperatorLoc() const
Retrieve the location of the cast operator keyword, e.g., static_cast.
SourceRange getAngleBrackets() const LLVM_READONLY
SourceLocation getRParenLoc() const
Retrieve the location of the closing parenthesis.
Represents a new-expression for memory allocation and constructor calls, e.g: "new CXXNewExpr(foo)".
static CXXNewExpr * Create(const ASTContext &Ctx, bool IsGlobalNew, FunctionDecl *OperatorNew, FunctionDecl *OperatorDelete, const ImplicitAllocationParameters &IAP, bool UsualArrayDeleteWantsSize, ArrayRef< Expr * > PlacementArgs, SourceRange TypeIdParens, std::optional< Expr * > ArraySize, CXXNewInitializationStyle InitializationStyle, Expr *Initializer, QualType Ty, TypeSourceInfo *AllocatedTypeInfo, SourceRange Range, SourceRange DirectInitRange)
Create a c++ new expression.
SourceRange getDirectInitRange() const
llvm::iterator_range< arg_iterator > placement_arguments()
std::optional< Expr * > getArraySize()
This might return std::nullopt even if isArray() returns true, since there might not be an array size...
CXXNewInitializationStyle getInitializationStyle() const
The kind of initializer this new-expression has.
ImplicitAllocationParameters implicitAllocationParameters() const
Provides the full set of information about expected implicit parameters in this call.
FunctionDecl * getOperatorDelete() const
unsigned getNumPlacementArgs() const
TypeSourceInfo * getAllocatedTypeSourceInfo() const
SourceRange getSourceRange() const
SourceRange getTypeIdParens() const
bool doesUsualArrayDeleteWantSize() const
Answers whether the usual array deallocation function for the allocated type expects the size of the ...
FunctionDecl * getOperatorNew() const
Expr * getInitializer()
The initializer of this new-expression.
Represents a C++11 noexcept expression (C++ [expr.unary.noexcept]).
SourceLocation getEndLoc() const
Expr * getOperand() const
SourceLocation getBeginLoc() const
The null pointer literal (C++11 [lex.nullptr])
SourceLocation getLocation() const
static CXXOperatorCallExpr * Create(const ASTContext &Ctx, OverloadedOperatorKind OpKind, Expr *Fn, ArrayRef< Expr * > Args, QualType Ty, ExprValueKind VK, SourceLocation OperatorLoc, FPOptionsOverride FPFeatures, ADLCallKind UsesADL=NotADL, 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()
ArrayRef< Expr * > getUserSpecifiedInitExprs() const
SourceLocation getBeginLoc() const LLVM_READONLY
Represents a C++ pseudo-destructor (C++ [expr.pseudo]).
TypeSourceInfo * getDestroyedTypeInfo() const
Retrieve the source location information for the type being destroyed.
bool isArrow() const
Determine whether this pseudo-destructor expression was written using an '->' (otherwise,...
TypeSourceInfo * getScopeTypeInfo() const
Retrieve the scope type in a qualified pseudo-destructor expression.
SourceLocation getTildeLoc() const
Retrieve the location of the '~'.
NestedNameSpecifierLoc getQualifierLoc() const
Retrieves the nested-name-specifier that qualifies the type name, with source-location information.
SourceLocation getDestroyedTypeLoc() const
Retrieve the starting location of the type being destroyed.
SourceLocation getColonColonLoc() const
Retrieve the location of the '::' in a qualified pseudo-destructor expression.
SourceLocation getOperatorLoc() const
Retrieve the location of the '.' or '->' operator.
const IdentifierInfo * getDestroyedTypeIdentifier() const
In a dependent pseudo-destructor expression for which we do not have full type information on the des...
Represents a C++ struct/union/class.
CXXRecordDecl * getMostRecentDecl()
CXXRecordDecl * getInstantiatedFromMemberClass() const
If this record is an instantiation of a member class, retrieves the member class from which it was in...
method_range methods() const
CXXRecordDecl * getDefinition() const
static CXXRecordDecl * CreateLambda(const ASTContext &C, DeclContext *DC, TypeSourceInfo *Info, SourceLocation Loc, unsigned DependencyKind, bool IsGeneric, LambdaCaptureDefault CaptureDefault)
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine whether this particular class is a specialization or instantiation of a class template or m...
void setInstantiationOfMemberClass(CXXRecordDecl *RD, TemplateSpecializationKind TSK)
Specify that this record is an instantiation of the member class RD.
void setLambdaContextDecl(Decl *ContextDecl)
Set the context declaration for a lambda class.
void setDescribedClassTemplate(ClassTemplateDecl *Template)
void setLambdaNumbering(LambdaNumbering Numbering)
Set the mangling numbers for a lambda class.
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this class is an instantiation of a member class of a class template specialization,...
void setTemplateSpecializationKind(TemplateSpecializationKind TSK)
Set the kind of specialization or template instantiation this is.
CXXRecordDecl * getPreviousDecl()
static CXXReinterpretCastExpr * Create(const ASTContext &Context, QualType T, ExprValueKind VK, CastKind Kind, Expr *Op, const CXXCastPath *Path, TypeSourceInfo *WrittenTy, SourceLocation L, SourceLocation RParenLoc, SourceRange AngleBrackets)
A rewritten comparison expression that was originally written using operator syntax.
Expr * getSemanticForm()
Get an equivalent semantic form for this expression.
bool isReversed() const
Determine whether this expression was rewritten in reverse form.
An expression "T()" which creates an rvalue of a non-class type T.
TypeSourceInfo * getTypeSourceInfo() const
SourceLocation getRParenLoc() const
static CXXStaticCastExpr * Create(const ASTContext &Context, QualType T, ExprValueKind VK, CastKind K, Expr *Op, const CXXCastPath *Path, TypeSourceInfo *Written, FPOptionsOverride FPO, SourceLocation L, SourceLocation RParenLoc, SourceRange AngleBrackets)
Implicit construction of a std::initializer_list<T> object from an array temporary within list-initia...
Represents a C++ functional cast expression that builds a temporary object.
static CXXTemporaryObjectExpr * Create(const ASTContext &Ctx, CXXConstructorDecl *Cons, QualType Ty, TypeSourceInfo *TSI, ArrayRef< Expr * > Args, SourceRange ParenOrBraceRange, bool HadMultipleCandidates, bool ListInitialization, bool StdInitListInitialization, bool ZeroInitialization)
TypeSourceInfo * getTypeSourceInfo() const
Represents a C++ temporary.
static CXXTemporary * Create(const ASTContext &C, const CXXDestructorDecl *Destructor)
Represents the this expression in C++.
static CXXThisExpr * Create(const ASTContext &Ctx, SourceLocation L, QualType Ty, bool IsImplicit)
SourceLocation getLocation() const
A C++ throw-expression (C++ [except.throw]).
const Expr * getSubExpr() const
SourceLocation getThrowLoc() const
bool isThrownVariableInScope() const
Determines whether the variable thrown by this expression (if any!) is within the innermost try block...
CXXTryStmt - A C++ try block, including all handlers.
SourceLocation getTryLoc() const
CXXCatchStmt * getHandler(unsigned i)
unsigned getNumHandlers() const
static CXXTryStmt * Create(const ASTContext &C, SourceLocation tryLoc, CompoundStmt *tryBlock, ArrayRef< Stmt * > handlers)
CompoundStmt * getTryBlock()
A C++ typeid expression (C++ [expr.typeid]), which gets the type_info that corresponds to the supplie...
bool isTypeOperand() const
TypeSourceInfo * getTypeOperandSourceInfo() const
Retrieve source information for the type operand.
Expr * getExprOperand() const
SourceRange getSourceRange() const LLVM_READONLY
Describes an explicit type conversion that uses functional notion but could not be resolved because o...
SourceLocation getLParenLoc() const
Retrieve the location of the left parentheses ('(') that precedes the argument list.
bool isListInitialization() const
Determine whether this expression models list-initialization.
static CXXUnresolvedConstructExpr * Create(const ASTContext &Context, QualType T, TypeSourceInfo *TSI, SourceLocation LParenLoc, ArrayRef< Expr * > Args, SourceLocation RParenLoc, bool IsListInit)
TypeSourceInfo * getTypeSourceInfo() const
Retrieve the type source information for the type being constructed.
SourceLocation getRParenLoc() const
Retrieve the location of the right parentheses (')') that follows the argument list.
unsigned getNumArgs() const
Retrieve the number of arguments.
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
static CallExpr * Create(const ASTContext &Ctx, Expr *Fn, ArrayRef< Expr * > Args, QualType Ty, ExprValueKind VK, SourceLocation RParenLoc, FPOptionsOverride FPFeatures, unsigned MinNumArgs=0, ADLCallKind UsesADL=NotADL)
Create a call expression.
ADLCallKind getADLCallKind() const
FPOptionsOverride getFPFeatures() const
unsigned getNumArgs() const
getNumArgs - Return the number of actual arguments to this call.
SourceLocation getRParenLoc() const
CaseStmt - Represent a case statement.
SourceLocation getEllipsisLoc() const
Get the location of the ... in a case statement of the form LHS ... RHS.
static CaseStmt * Create(const ASTContext &Ctx, Expr *lhs, Expr *rhs, SourceLocation caseLoc, SourceLocation ellipsisLoc, SourceLocation colonLoc)
Build a case statement.
SourceLocation getCaseLoc() const
CastExpr - Base class for type casts, including both implicit casts (ImplicitCastExpr) and explicit c...
path_iterator path_begin()
CastKind getCastKind() const
FPOptionsOverride getFPFeatures() const
CharUnits - This is an opaque type for sizes expressed in character units.
SourceLocation getLocation() const
unsigned getValue() const
CharacterLiteralKind getKind() const
How to handle import errors that occur when import of a child declaration of a DeclContext fails.
bool ignoreChildErrorOnParent(Decl *FromChildD) const
Determine if import failure of a child does not cause import failure of its parent.
ChildErrorHandlingStrategy(const Decl *FromD)
void handleChildImportResult(Error &ResultErr, Error &&ChildErr)
Process the import result of a child (of the current declaration).
ChildErrorHandlingStrategy(const DeclContext *FromDC)
ChooseExpr - GNU builtin-in function __builtin_choose_expr.
SourceLocation getBuiltinLoc() const
bool isConditionDependent() const
bool isConditionTrue() const
isConditionTrue - Return whether the condition is true (i.e.
SourceLocation getRParenLoc() const
Declaration of a class template.
void AddPartialSpecialization(ClassTemplatePartialSpecializationDecl *D, void *InsertPos)
Insert the specified partial specialization knowing that it is not already in.
ClassTemplateDecl * getMostRecentDecl()
CXXRecordDecl * getTemplatedDecl() const
Get the underlying class declarations of the template.
ClassTemplatePartialSpecializationDecl * findPartialSpecialization(ArrayRef< TemplateArgument > Args, TemplateParameterList *TPL, void *&InsertPos)
Return the partial specialization with the provided arguments if it exists, otherwise return the inse...
bool isThisDeclarationADefinition() const
Returns whether this template declaration defines the primary class pattern.
void AddSpecialization(ClassTemplateSpecializationDecl *D, void *InsertPos)
Insert the specified specialization knowing that it is not already in.
ClassTemplateSpecializationDecl * findSpecialization(ArrayRef< TemplateArgument > Args, void *&InsertPos)
Return the specialization with the provided arguments if it exists, otherwise return the insertion po...
ClassTemplatePartialSpecializationDecl * getInstantiatedFromMember() const
Retrieve the member class template partial specialization from which this particular class template p...
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
Represents a class template specialization, which refers to a class template with a given set of temp...
TemplateSpecializationKind getSpecializationKind() const
Determine the kind of specialization that this declaration represents.
const ASTTemplateArgumentListInfo * getTemplateArgsAsWritten() const
Retrieve the template argument list as written in the sources, if any.
ClassTemplateDecl * getSpecializedTemplate() const
Retrieve the template that this specialization specializes.
void setPointOfInstantiation(SourceLocation Loc)
SourceLocation getPointOfInstantiation() const
Get the point of instantiation (if any), or null if none.
void setExternKeywordLoc(SourceLocation Loc)
Sets the location of the extern keyword.
void setSpecializationKind(TemplateSpecializationKind TSK)
const TemplateArgumentList & getTemplateArgs() const
Retrieve the template arguments of the class template specialization.
SourceLocation getExternKeywordLoc() const
Gets the location of the extern keyword, if present.
SourceLocation getTemplateKeywordLoc() const
Gets the location of the template keyword, if present.
void setTemplateKeywordLoc(SourceLocation Loc)
Sets the location of the template keyword.
const TemplateArgumentList & getTemplateInstantiationArgs() const
Retrieve the set of template arguments that should be used to instantiate members of the class templa...
llvm::PointerUnion< ClassTemplateDecl *, ClassTemplatePartialSpecializationDecl * > getInstantiatedFrom() const
If this class template specialization is an instantiation of a template (rather than an explicit spec...
bool hasStrictPackMatch() const
void setInstantiationOf(ClassTemplatePartialSpecializationDecl *PartialSpec, const TemplateArgumentList *TemplateArgs)
Note that this class template specialization is actually an instantiation of the given class template...
bool isExplicitInstantiationOrSpecialization() const
True if this declaration is an explicit specialization, explicit instantiation declaration,...
void setTemplateArgsAsWritten(const ASTTemplateArgumentListInfo *ArgsWritten)
Set the template argument list as written in the sources.
QualType getElementType() const
CompoundAssignOperator - For compound assignments (e.g.
QualType getComputationLHSType() const
static CompoundAssignOperator * Create(const ASTContext &C, Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy, ExprValueKind VK, ExprObjectKind OK, SourceLocation opLoc, FPOptionsOverride FPFeatures, QualType CompLHSType=QualType(), QualType CompResultType=QualType())
QualType getComputationResultType() const
CompoundLiteralExpr - [C99 6.5.2.5].
SourceLocation getLParenLoc() const
const Expr * getInitializer() const
TypeSourceInfo * getTypeSourceInfo() const
CompoundStmt - This represents a group of statements like { stmt stmt }.
FPOptionsOverride getStoredFPFeatures() const
Get FPOptionsOverride from trailing storage.
SourceLocation getLBracLoc() const
bool hasStoredFPFeatures() const
static CompoundStmt * Create(const ASTContext &C, ArrayRef< Stmt * > Stmts, FPOptionsOverride FPFeatures, SourceLocation LB, SourceLocation RB)
SourceLocation getRBracLoc() const
Declaration of a C++20 concept.
Expr * getConstraintExpr() const
A reference to a concept and its template args, as it appears in the code.
const NestedNameSpecifierLoc & getNestedNameSpecifierLoc() const
NamedDecl * getFoundDecl() const
const DeclarationNameInfo & getConceptNameInfo() const
const ASTTemplateArgumentListInfo * getTemplateArgsAsWritten() const
static ConceptReference * Create(const ASTContext &C, NestedNameSpecifierLoc NNS, SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo, NamedDecl *FoundDecl, TemplateDecl *NamedConcept, const ASTTemplateArgumentListInfo *ArgsAsWritten)
TemplateDecl * getNamedConcept() const
SourceLocation getTemplateKWLoc() const
Represents the specialization of a concept - evaluates to a prvalue of type bool.
static ConceptSpecializationExpr * Create(const ASTContext &C, ConceptReference *ConceptRef, ImplicitConceptSpecializationDecl *SpecDecl, const ConstraintSatisfaction *Satisfaction)
ConceptReference * getConceptReference() const
const ImplicitConceptSpecializationDecl * getSpecializationDecl() const
const ASTConstraintSatisfaction & getSatisfaction() const
Get elaborated satisfaction info about the template arguments' satisfaction of the named concept.
ConditionalOperator - The ?
Expr * getCond() const
getCond - Return the expression representing the condition for the ?
const Expr * getSizeExpr() const
Return a pointer to the size expression.
llvm::APInt getSize() const
Return the constant array size as an APInt.
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)
unsigned getNumColumns() const
Returns the number of columns in the matrix.
unsigned getNumRows() const
Returns the number of rows in the matrix.
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.
bool isCountInBytes() const
Expr * getCountExpr() const
A POD class for pairing a NamedDecl* with an access specifier.
static DeclAccessPair make(NamedDecl *D, AccessSpecifier AS)
NamedDecl * getDecl() const
AccessSpecifier getAccess() const
The results of name lookup within a DeclContext.
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
DeclContext * getParent()
getParent - Returns the containing DeclContext.
void makeDeclVisibleInContext(NamedDecl *D)
Makes a declaration visible within this context.
DeclContextLookupResult lookup_result
bool isDependentContext() const
Determines whether this context is dependent on a template parameter.
lookup_result lookup(DeclarationName Name) const
lookup - Find the declarations (if any) with the given Name in this context.
DeclContext * getRedeclContext()
getRedeclContext - Retrieve the context in which an entity conflicts with other entities of the same ...
void addDeclInternal(Decl *D)
Add the declaration D into this context, but suppress searches for external declarations with the sam...
bool containsDeclAndLoad(Decl *D) const
Checks whether a declaration is in this context.
void removeDecl(Decl *D)
Removes a declaration from this context.
lookup_result noload_lookup(DeclarationName Name)
Find the declarations with the given name that are visible within this context; don't attempt to retr...
bool containsDecl(Decl *D) const
Checks whether a declaration is in this context.
bool hasExternalLexicalStorage() const
Whether this DeclContext has external storage containing additional declarations that are lexically i...
DeclContext * getEnclosingNamespaceContext()
Retrieve the nearest enclosing namespace context.
decl_range decls() const
decls_begin/decls_end - Iterate over the declarations stored in this context.
bool isFunctionOrMethod() const
void localUncachedLookup(DeclarationName Name, SmallVectorImpl< NamedDecl * > &Results)
A simplistic name lookup mechanism that performs name lookup into this declaration context without co...
static DeclGroupRef Create(ASTContext &C, Decl **Decls, unsigned NumDecls)
A reference to a declared variable, function, enum, etc.
NamedDecl * getFoundDecl()
Get the NamedDecl through which this reference occurred.
bool hasExplicitTemplateArgs() const
Determines whether this declaration reference was followed by an explicit template argument list.
bool refersToEnclosingVariableOrCapture() const
Does this DeclRefExpr refer to an enclosing local or a captured variable?
SourceLocation getTemplateKeywordLoc() const
Retrieve the location of the template keyword preceding this name, if any.
static DeclRefExpr * Create(const ASTContext &Context, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc, ValueDecl *D, bool RefersToEnclosingVariableOrCapture, SourceLocation NameLoc, QualType T, ExprValueKind VK, NamedDecl *FoundD=nullptr, const TemplateArgumentListInfo *TemplateArgs=nullptr, NonOdrUseReason NOUR=NOUR_None)
SourceLocation getLAngleLoc() const
Retrieve the location of the left angle bracket starting the explicit template argument list followin...
NestedNameSpecifierLoc getQualifierLoc() const
If the name was qualified, retrieves the nested-name-specifier that precedes the name,...
ArrayRef< TemplateArgumentLoc > template_arguments() const
NonOdrUseReason isNonOdrUse() const
Is this expression a non-odr-use reference, and if so, why?
bool hadMultipleCandidates() const
Returns true if this expression refers to a function that was resolved from an overloaded set having ...
SourceLocation getLocation() const
SourceLocation getRAngleLoc() const
Retrieve the location of the right angle bracket ending the explicit template argument list following...
bool isImmediateEscalating() const
DeclStmt - Adaptor class for mixing declarations with statements and expressions.
SourceLocation getEndLoc() const
const DeclGroupRef getDeclGroup() const
SourceLocation getBeginLoc() const LLVM_READONLY
A simple visitor class that helps create declaration visitors.
Decl - This represents one declaration (or definition), e.g.
SourceLocation getEndLoc() const LLVM_READONLY
TemplateDecl * getDescribedTemplate() const
If this is a declaration that describes some template, this method returns that template declaration.
FriendObjectKind getFriendObjectKind() const
Determines whether this declaration is the object of a friend declaration and, if so,...
ASTContext & getASTContext() const LLVM_READONLY
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
@ FOK_None
Not a friend object.
void setObjectOfFriendDecl(bool PerformFriendInjection=false)
Changes the namespace of this declaration to reflect that it's the object of a friend declaration.
void setAccess(AccessSpecifier AS)
SourceLocation getLocation() const
const char * getDeclKindName() const
IdentifierNamespace
IdentifierNamespace - The different namespaces in which declarations may appear.
@ IDNS_NonMemberOperator
This declaration is a C++ operator declared in a non-class context.
@ IDNS_TagFriend
This declaration is a friend class.
@ IDNS_Ordinary
Ordinary names.
@ IDNS_ObjCProtocol
Objective C @protocol.
@ IDNS_Namespace
Namespaces, declared with 'namespace foo {}'.
@ IDNS_OrdinaryFriend
This declaration is a friend function.
@ IDNS_Tag
Tags, declared with 'struct foo;' and referenced with 'struct foo'.
void setImplicit(bool I=true)
void setIsUsed()
Set whether the declaration is used, in the sense of odr-use.
bool isUsed(bool CheckUsedAttr=true) const
Whether any (re-)declaration of the entity was used, meaning that a definition is required.
DeclContext * getDeclContext()
AccessSpecifier getAccess() const
bool isInAnonymousNamespace() const
SourceLocation getBeginLoc() const LLVM_READONLY
TranslationUnitDecl * getTranslationUnitDecl()
void setDeclContext(DeclContext *DC)
setDeclContext - Set both the semantic and lexical DeclContext to DC.
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
void setLexicalDeclContext(DeclContext *DC)
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
The name of a declaration.
IdentifierInfo * getAsIdentifierInfo() const
Retrieve the IdentifierInfo * stored in this declaration name, or null if this declaration name isn't...
TemplateDecl * getCXXDeductionGuideTemplate() const
If this name is the name of a C++ deduction guide, return the template associated with that name.
const IdentifierInfo * getCXXLiteralIdentifier() const
If this name is the name of a literal operator, retrieve the identifier associated with it.
static DeclarationName getUsingDirectiveName()
Returns the name for all C++ using-directives.
OverloadedOperatorKind getCXXOverloadedOperator() const
If this name is the name of an overloadable operator in C++ (e.g., operator+), retrieve the kind of o...
@ CXXConversionFunctionName
QualType getCXXNameType() const
If this name is one of the C++ names (of a constructor, destructor, or conversion function),...
Selector getObjCSelector() const
Get the Objective-C selector stored in this declaration name.
NameKind getNameKind() const
Determine what kind of name this is.
bool isEmpty() const
Evaluates true when this declaration name is empty.
SourceLocation getInnerLocStart() const
Return start of source range ignoring outer template declarations.
SourceLocation getBeginLoc() const LLVM_READONLY
const AssociatedConstraint & getTrailingRequiresClause() const
Get the constraint-expression introduced by the trailing requires-clause in the function/member decla...
void setTypeSourceInfo(TypeSourceInfo *TI)
void setQualifierInfo(NestedNameSpecifierLoc QualifierLoc)
NestedNameSpecifierLoc getQualifierLoc() const
Retrieve the nested-name-specifier (with source-location information) that qualifies the name of this...
TypeSourceInfo * getTypeSourceInfo() const
A decomposition declaration.
SourceLocation getDefaultLoc() const
Expr * getAddrSpaceExpr() const
QualType getPointeeType() const
SourceLocation getAttributeLoc() const
Expr * getNumBitsExpr() 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.
Expr * getSizeExpr() const
Expr * getSizeExpr() const
SourceLocation getAttributeLoc() const
QualType getElementType() const
Expr * getColumnExpr() const
Expr * getRowExpr() const
SourceLocation getAttributeLoc() 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?
Expr * getSizeExpr() const
VectorKind getVectorKind() const
SourceLocation getAttributeLoc() const
QualType getElementType() const
Represents a single C99 designator.
unsigned getArrayIndex() const
bool isFieldDesignator() const
static Designator CreateArrayRangeDesignator(unsigned Index, SourceLocation LBracketLoc, SourceLocation EllipsisLoc, SourceLocation RBracketLoc)
Creates a GNU array-range designator.
static Designator CreateFieldDesignator(const IdentifierInfo *FieldName, SourceLocation DotLoc, SourceLocation FieldLoc)
Creates a field designator.
bool isArrayRangeDesignator() const
static Designator CreateArrayDesignator(unsigned Index, SourceLocation LBracketLoc, SourceLocation RBracketLoc)
Creates an array designator.
bool isArrayDesignator() const
SourceLocation getFieldLoc() const
SourceLocation getRBracketLoc() const
const IdentifierInfo * getFieldName() const
SourceLocation getEllipsisLoc() const
SourceLocation getDotLoc() const
SourceLocation getLBracketLoc() const
Represents a C99 designated initializer expression.
Expr * getSubExpr(unsigned Idx) const
bool usesGNUSyntax() const
Determines whether this designated initializer used the deprecated GNU syntax for designated initiali...
MutableArrayRef< Designator > designators()
Expr * getInit() const
Retrieve the initializer value.
unsigned size() const
Returns the number of designators in this initializer.
SourceLocation getEqualOrColonLoc() const
Retrieve the location of the '=' that precedes the initializer value itself, if present.
unsigned getNumSubExprs() const
Retrieve the total number of subexpressions in this designated initializer expression,...
static DesignatedInitExpr * Create(const ASTContext &C, ArrayRef< Designator > Designators, ArrayRef< Expr * > IndexExprs, SourceLocation EqualOrColonLoc, bool GNUSyntax, Expr *Init)
A little helper class used to produce diagnostics.
DoStmt - This represents a 'do/while' stmt.
SourceLocation getWhileLoc() const
SourceLocation getDoLoc() const
SourceLocation getRParenLoc() const
Symbolic representation of a dynamic allocation.
Represents an empty-declaration.
An instance of this object exists for each enum constant that is defined.
llvm::APSInt getInitVal() const
const Expr * getInitExpr() const
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this enumeration is an instantiation of a member enumeration of a class template specialization,...
bool isScoped() const
Returns true if this is a C++11 scoped enumeration.
unsigned getNumNegativeBits() const
Returns the width in bits required to store all the negative enumerators of this enum.
bool isScopedUsingClassTag() const
Returns true if this is a C++11 scoped enumeration.
void setIntegerType(QualType T)
Set the underlying integer type.
EnumDecl * getMostRecentDecl()
bool isFixed() const
Returns true if this is an Objective-C, C++11, or Microsoft-style enumeration with a fixed underlying...
void completeDefinition(QualType NewType, QualType PromotionType, unsigned NumPositiveBits, unsigned NumNegativeBits)
When created, the EnumDecl corresponds to a forward-declared enum.
QualType getIntegerType() const
Return the integer type this enum decl corresponds to.
EnumDecl * getInstantiatedFromMemberEnum() const
Returns the enumeration (declared within the template) from which this enumeration type was instantia...
EnumDecl * getDefinition() const
unsigned getNumPositiveBits() const
Returns the width in bits required to store all the non-negative enumerators of this enum.
QualType getPromotionType() const
Return the integer type that enumerators should promote to.
ExplicitCastExpr - An explicit cast written in the source code.
TypeSourceInfo * getTypeInfoAsWritten() const
getTypeInfoAsWritten - Returns the type source info for the type that this expression is casting to.
Store information needed for an explicit specifier.
ExplicitSpecKind getKind() const
const Expr * getExpr() const
Represents an expression – generally a full-expression – that introduces cleanups to be run at the en...
bool cleanupsHaveSideEffects() const
ArrayRef< CleanupObject > getObjects() const
unsigned getNumObjects() const
llvm::PointerUnion< BlockDecl *, CompoundLiteralExpr * > CleanupObject
The type of objects that are kept in the cleanup.
static ExprWithCleanups * Create(const ASTContext &C, EmptyShell empty, unsigned numObjects)
This represents one expression.
bool isValueDependent() const
Determines whether the value of this expression depends on.
ExprValueKind getValueKind() const
getValueKind - The value kind that this expression produces.
bool isTypeDependent() const
Determines whether the type of this expression depends on.
bool containsUnexpandedParameterPack() const
Whether this expression contains an unexpanded parameter pack (for C++11 variadic templates).
ExprObjectKind getObjectKind() const
getObjectKind - The object kind that this expression produces.
bool isInstantiationDependent() const
Whether this expression is instantiation-dependent, meaning that it depends in some way on.
ExprDependence getDependence() const
An expression trait intrinsic.
SourceLocation getBeginLoc() const LLVM_READONLY
Expr * getQueriedExpression() const
ExpressionTrait getTrait() const
SourceLocation getEndLoc() const LLVM_READONLY
virtual void CompleteType(TagDecl *Tag)
Gives the external AST source an opportunity to complete an incomplete type.
Represents difference between two FPOptions values.
Represents a member of a struct/union/class.
bool isMutable() const
Determines whether this field is mutable (C++ only).
Expr * getInClassInitializer() const
Get the C++11 default member initializer for this member, or null if one has not been set.
bool hasInClassInitializer() const
Determine whether this member has a C++11 default member initializer.
InClassInitStyle getInClassInitStyle() const
Get the kind of (C++11) default member initializer that this field has.
void setInClassInitializer(Expr *NewInit)
Set the C++11 in-class initializer for this member.
Expr * getBitWidth() const
Returns the expression that represents the bit width, if this field is a bit field.
const VariableArrayType * getCapturedVLAType() const
Get the captured variable length array type.
void setCapturedVLAType(const VariableArrayType *VLAType)
Set the captured variable length array type for this field.
An opaque identifier used by SourceManager which refers to a source file (MemoryBuffer) along with it...
Implements support for file system lookup, file system caching, and directory search management.
SourceLocation getAsmLoc() const
const Expr * getAsmStringExpr() const
SourceLocation getRParenLoc() const
SourceLocation getLocation() const
Retrieve the location of the literal.
llvm::APInt getValue() const
Returns an internal integer representation of the literal.
SourceLocation getLocation() const
static FloatingLiteral * Create(const ASTContext &C, const llvm::APFloat &V, bool isexact, QualType Type, SourceLocation L)
llvm::APFloat getValue() const
ForStmt - This represents a 'for (init;cond;inc)' stmt.
VarDecl * getConditionVariable() const
Retrieve the variable declared in this "for" statement, if any.
SourceLocation getRParenLoc() const
SourceLocation getForLoc() const
SourceLocation getLParenLoc() const
FriendDecl - Represents the declaration of a friend entity, which can be a function,...
llvm::PointerUnion< NamedDecl *, TypeSourceInfo * > FriendUnion
SourceLocation getFriendLoc() const
Retrieves the location of the 'friend' keyword.
SourceLocation getEllipsisLoc() const
Retrieves the location of the '...', if present.
NamedDecl * getFriendDecl() const
If this friend declaration doesn't name a type, return the inner declaration.
TypeSourceInfo * getFriendType() const
If this friend declaration names an (untemplated but possibly dependent) type, return the type; other...
const Expr * getSubExpr() const
static DefaultedOrDeletedFunctionInfo * Create(ASTContext &Context, ArrayRef< DeclAccessPair > Lookups, StringLiteral *DeletedMessage=nullptr)
Represents a function declaration or definition.
Stmt * getBody(const FunctionDecl *&Definition) const
Retrieve the body (definition) of the function.
ConstexprSpecKind getConstexprKind() const
void setDescribedFunctionTemplate(FunctionTemplateDecl *Template)
FunctionTemplateDecl * getDescribedFunctionTemplate() const
Retrieves the function template that is described by this function declaration.
void setIsPureVirtual(bool P=true)
void setDefaultedOrDeletedInfo(DefaultedOrDeletedFunctionInfo *Info)
void setFriendConstraintRefersToEnclosingTemplate(bool V=true)
bool isDestroyingOperatorDelete() const
Determine whether this is a destroying operator delete.
StringLiteral * getDeletedMessage() const
Get the message that indicates why this function was deleted.
bool UsesFPIntrin() const
Determine whether the function was declared in source context that requires constrained FP intrinsics...
SourceLocation getDefaultLoc() const
ArrayRef< ParmVarDecl * > parameters() const
bool isExplicitlyDefaulted() const
Whether this function is explicitly defaulted.
bool isTrivial() const
Whether this function is "trivial" in some specialized C++ senses.
bool hasWrittenPrototype() const
Whether this function has a written prototype.
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this function is an instantiation of a member function of a class template specialization,...
FunctionTemplateSpecializationInfo * getTemplateSpecializationInfo() const
If this function is actually a function template specialization, retrieve information about this func...
void setDefaultLoc(SourceLocation NewLoc)
bool doesThisDeclarationHaveABody() const
Returns whether this specific declaration of the function has a body.
DependentFunctionTemplateSpecializationInfo * getDependentSpecializationInfo() const
@ TK_MemberSpecialization
@ TK_DependentNonTemplate
@ TK_FunctionTemplateSpecialization
@ TK_DependentFunctionTemplateSpecialization
StorageClass getStorageClass() const
Returns the storage class as written in the source.
bool FriendConstraintRefersToEnclosingTemplate() const
TemplatedKind getTemplatedKind() const
What kind of templated function this is.
void setInstantiatedFromDecl(FunctionDecl *FD)
Specify that this function declaration was instantiated from a FunctionDecl FD.
bool isDeletedAsWritten() const
void setDependentTemplateSpecialization(ASTContext &Context, const UnresolvedSetImpl &Templates, const TemplateArgumentListInfo *TemplateArgs)
Specifies that this function declaration is actually a dependent function template specialization.
bool isPureVirtual() const
Whether this virtual function is pure, i.e.
FunctionDecl * getMostRecentDecl()
Returns the most recent (re)declaration of this declaration.
void setVirtualAsWritten(bool V)
State that this function is marked as virtual explicitly.
void setIsDestroyingOperatorDelete(bool IsDestroyingDelete)
FunctionDecl * getDefinition()
Get the definition for this declaration.
bool isTypeAwareOperatorNewOrDelete() const
Determine whether this is a type aware operator new or delete.
void setIsTypeAwareOperatorNewOrDelete(bool IsTypeAwareOperator=true)
void setRangeEnd(SourceLocation E)
bool isDefaulted() const
Whether this function is defaulted.
FunctionDecl * getInstantiatedFromDecl() const
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine what kind of template instantiation this function represents.
void setDefaulted(bool D=true)
bool isVirtualAsWritten() const
Whether this function is marked as virtual explicitly.
void setDeletedAsWritten(bool D=true, StringLiteral *Message=nullptr)
void setExplicitlyDefaulted(bool ED=true)
State that this function is explicitly defaulted.
FunctionDecl * getInstantiatedFromMemberFunction() const
If this function is an instantiation of a member function of a class template specialization,...
DeclarationNameInfo getNameInfo() const
bool hasBody(const FunctionDecl *&Definition) const
Returns true if the function has a body.
FunctionDecl * getPreviousDecl()
Return the previous declaration of this declaration or NULL if this is the first declaration.
bool isInlineSpecified() const
Determine whether the "inline" keyword was specified for this function.
Represents a 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.
ElaboratedTypeKeyword getKeyword() const
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.
QualType getUnderlyingType() const
const IdentifierInfo * getMacroIdentifier() const
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()
QualType getElementType() const
Returns type of the elements being stored in the matrix.
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.
NestedNameSpecifier getQualifier() const
CXXRecordDecl * getMostRecentCXXRecordDecl() const
Note: this can trigger extra deserialization when external AST sources are used.
QualType getPointeeType() const
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
ObjCInterfaceDecl * getDecl() const
Get the declaration of this interface.
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
QualType getPointeeType() const
Gets the type pointed to by this ObjC pointer.
Represents one property declaration in an Objective-C interface.
void setSetterName(Selector Sel, SourceLocation Loc=SourceLocation())
SourceLocation getGetterNameLoc() const
ObjCMethodDecl * getGetterMethodDecl() const
bool isInstanceProperty() const
ObjCMethodDecl * getSetterMethodDecl() const
SourceLocation getSetterNameLoc() const
SourceLocation getAtLoc() const
void setPropertyAttributes(ObjCPropertyAttribute::Kind PRVal)
ObjCIvarDecl * getPropertyIvarDecl() const
Selector getSetterName() const
TypeSourceInfo * getTypeSourceInfo() const
void setPropertyAttributesAsWritten(ObjCPropertyAttribute::Kind PRVal)
Selector getGetterName() const
void setPropertyIvarDecl(ObjCIvarDecl *Ivar)
SourceLocation getLParenLoc() const
void setSetterMethodDecl(ObjCMethodDecl *gDecl)
ObjCPropertyAttribute::Kind getPropertyAttributesAsWritten() const
ObjCPropertyAttribute::Kind getPropertyAttributes() const
void setGetterName(Selector Sel, SourceLocation Loc=SourceLocation())
PropertyControl getPropertyImplementation() const
void setGetterMethodDecl(ObjCMethodDecl *gDecl)
ObjCPropertyImplDecl - Represents implementation declaration of a property in a class or category imp...
ObjCIvarDecl * getPropertyIvarDecl() const
SourceLocation getPropertyIvarDeclLoc() const
Kind getPropertyImplementation() const
ObjCPropertyDecl * getPropertyDecl() const
SourceLocation getBeginLoc() const LLVM_READONLY
Represents an Objective-C protocol declaration.
bool isThisDeclarationADefinition() const
Determine whether this particular declaration is also the definition.
void setProtocolList(ObjCProtocolDecl *const *List, unsigned Num, const SourceLocation *Locs, ASTContext &C)
setProtocolList - Set the list of protocols that this interface implements.
ObjCProtocolDecl * getDefinition()
Retrieve the definition of this protocol, if any.
void startDefinition()
Starts the definition of this Objective-C protocol.
ObjCProtocolList::iterator protocol_iterator
protocol_iterator protocol_begin() const
ObjCProtocolList::loc_iterator protocol_loc_iterator
protocol_iterator protocol_end() const
protocol_loc_iterator protocol_loc_begin() const
Represents the declaration of an Objective-C type parameter.
unsigned getIndex() const
Retrieve the index into its type parameter list.
const Type * getTypeForDecl() const
SourceLocation getColonLoc() const
Retrieve the location of the ':' separating the type parameter name from the explicitly-specified bou...
ObjCTypeParamVariance getVariance() const
Determine the variance of this type parameter.
SourceLocation getVarianceLoc() const
Retrieve the location of the variance keyword.
Stores a list of Objective-C type parameters for a parameterized class or a category/extension thereo...
SourceLocation getRAngleLoc() const
static ObjCTypeParamList * create(ASTContext &ctx, SourceLocation lAngleLoc, ArrayRef< ObjCTypeParamDecl * > typeParams, SourceLocation rAngleLoc)
Create a new Objective-C type parameter list.
SourceLocation getLAngleLoc() const
OffsetOfExpr - [C99 7.17] - This represents an expression of the form offsetof(record-type,...
Expr * getIndexExpr(unsigned Idx)
SourceLocation getOperatorLoc() const
getOperatorLoc - Return the location of the operator.
const OffsetOfNode & getComponent(unsigned Idx) const
static OffsetOfExpr * Create(const ASTContext &C, QualType type, SourceLocation OperatorLoc, TypeSourceInfo *tsi, ArrayRef< OffsetOfNode > comps, ArrayRef< Expr * > exprs, SourceLocation RParenLoc)
TypeSourceInfo * getTypeSourceInfo() const
unsigned getNumExpressions() const
SourceLocation getRParenLoc() const
Return the location of the right parentheses.
unsigned getNumComponents() const
Helper class for OffsetOfExpr.
const IdentifierInfo * getFieldName() const
For a field or identifier offsetof node, returns the name of the field.
unsigned getArrayExprIndex() const
For an array element node, returns the index into the array of expressions.
FieldDecl * getField() const
For a field offsetof node, returns the field.
@ Array
An index into an array.
@ Identifier
A field in a dependent type, known only by its name.
@ Base
An implicit indirection through a C++ base class, when the field found is in a base class.
SourceLocation getBeginLoc() const LLVM_READONLY
Kind getKind() const
Determine what kind of offsetof node this is.
SourceLocation getEndLoc() const LLVM_READONLY
CXXBaseSpecifier * getBase() const
For a base class node, returns the base specifier.
OpaqueValueExpr - An expression referring to an opaque object of a fixed type and value class.
Expr * getSourceExpr() const
The source expression of an opaque value expression is the expression which originally generated the ...
SourceLocation getLocation() const
Retrieve the location of this expression.
bool hasExplicitTemplateArgs() const
Determines whether this expression had explicit template arguments.
SourceLocation getLAngleLoc() const
Retrieve the location of the left angle bracket starting the explicit template argument list followin...
const DeclarationNameInfo & getNameInfo() const
Gets the full name info.
SourceLocation getNameLoc() const
Gets the location of the name.
SourceLocation getTemplateKeywordLoc() const
Retrieve the location of the template keyword preceding this name, if any.
NestedNameSpecifierLoc getQualifierLoc() const
Fetches the nested-name qualifier with source-location information, if one was given.
llvm::iterator_range< decls_iterator > decls() const
void copyTemplateArgumentsInto(TemplateArgumentListInfo &List) const
Copies the template arguments into the given structure.
DeclarationName getName() const
Gets the name looked up.
SourceLocation getRAngleLoc() const
Retrieve the location of the right angle bracket ending the explicit template argument list following...
ArrayRef< TemplateArgumentLoc > template_arguments() const
A structure for storing the information associated with an overloaded template name.
Represents a C++11 pack expansion that produces a sequence of expressions.
Expr * getPattern()
Retrieve the pattern of the pack expansion.
UnsignedOrNone getNumExpansions() const
Determine the number of expansions that will be produced when this pack expansion is instantiated,...
SourceLocation getEllipsisLoc() const
Retrieve the location of the ellipsis that describes this pack expansion.
ParenExpr - This represents a parenthesized expression, e.g.
SourceLocation getLParen() const
Get the location of the left parentheses '('.
const Expr * getSubExpr() const
SourceLocation getRParen() const
Get the location of the right parentheses ')'.
ArrayRef< Expr * > exprs() const
static ParenListExpr * Create(const ASTContext &Ctx, SourceLocation LParenLoc, ArrayRef< Expr * > Exprs, SourceLocation RParenLoc)
Create a paren list.
unsigned getNumExprs() const
Return the number of expressions in this paren list.
SourceLocation getLParenLoc() const
SourceLocation getRParenLoc() const
QualType getInnerType() 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)
QualType getElementType() const
QualType getPointeeType() const
[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.
QualType getSingleStepDesugaredType(const ASTContext &Context) const
Return the specified type with one level of "sugar" removed from the 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.
QualType getPointeeTypeAsWritten() const
Represents the body of a requires-expression.
C++2a [expr.prim.req]: A requires-expression provides a concise way to express requirements on templa...
SourceLocation getLParenLoc() const
SourceLocation getRParenLoc() const
SourceLocation getRBraceLoc() const
SourceLocation getRequiresKWLoc() const
static RequiresExpr * Create(ASTContext &C, SourceLocation RequiresKWLoc, RequiresExprBodyDecl *Body, SourceLocation LParenLoc, ArrayRef< ParmVarDecl * > LocalParameters, SourceLocation RParenLoc, ArrayRef< concepts::Requirement * > Requirements, SourceLocation RBraceLoc)
RequiresExprBodyDecl * getBody() const
ArrayRef< concepts::Requirement * > getRequirements() const
ArrayRef< ParmVarDecl * > getLocalParameters() const
ReturnStmt - This represents a return, optionally of an expression: return; return 4;.
SourceLocation getReturnLoc() const
const VarDecl * getNRVOCandidate() const
Retrieve the variable that might be used for the named return value optimization.
static ReturnStmt * Create(const ASTContext &Ctx, SourceLocation RL, Expr *E, const VarDecl *NRVOCandidate)
Create a return statement.
Smart pointer class that efficiently represents Objective-C method names.
const IdentifierInfo * getIdentifierInfoForSlot(unsigned argIndex) const
Retrieve the identifier at a given position in the selector.
bool isNull() const
Determine whether this is the empty selector.
unsigned getNumArgs() const
ShuffleVectorExpr - clang-specific builtin-in function __builtin_shufflevector.
Expr ** getSubExprs()
Retrieve the array of expressions.
unsigned getNumSubExprs() const
getNumSubExprs - Return the size of the SubExprs array.
SourceLocation getRParenLoc() const
SourceLocation getBeginLoc() const LLVM_READONLY
Represents an expression that computes the length of a parameter pack.
SourceLocation getPackLoc() const
Determine the location of the parameter pack.
bool isPartiallySubstituted() const
Determine whether this represents a partially-substituted sizeof... expression, such as is produced f...
static SizeOfPackExpr * Create(ASTContext &Context, SourceLocation OperatorLoc, NamedDecl *Pack, SourceLocation PackLoc, SourceLocation RParenLoc, UnsignedOrNone Length=std::nullopt, ArrayRef< TemplateArgument > PartialArgs={})
ArrayRef< TemplateArgument > getPartialArguments() const
Get.
SourceLocation getOperatorLoc() const
Determine the location of the 'sizeof' keyword.
SourceLocation getRParenLoc() const
Determine the location of the right parenthesis.
NamedDecl * getPack() const
Retrieve the parameter pack.
unsigned getPackLength() const
Retrieve the length of the parameter pack.
Represents a function call to one of __builtin_LINE(), __builtin_COLUMN(), __builtin_FUNCTION(),...
SourceLocation getBeginLoc() const
const DeclContext * getParentContext() const
If the SourceLocExpr has been resolved return the subexpression representing the resolved value.
SourceLocation getEndLoc() const
SourceLocIdentKind getIdentKind() const
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
This class handles loading and caching of source files into memory.
FileIDAndOffset getDecomposedLoc(SourceLocation Loc) const
Decompose the specified location into a raw FileID + Offset pair.
FileID getFileID(SourceLocation SpellingLoc) const
Return the FileID for a SourceLocation.
bool isWrittenInBuiltinFile(SourceLocation Loc) const
Returns whether Loc is located in a <built-in> file.
FileID createFileID(FileEntryRef SourceFile, SourceLocation IncludePos, SrcMgr::CharacteristicKind FileCharacter, int LoadedID=0, SourceLocation::UIntTy LoadedOffset=0)
Create a new FileID that represents the specified file being #included from the specified IncludePosi...
SourceLocation getComposedLoc(FileID FID, unsigned Offset) const
Form a SourceLocation from a FileID and Offset pair.
FileManager & getFileManager() const
FileID getMainFileID() const
Returns the FileID of the main source file.
unsigned getFileIDSize(FileID FID) const
The size of the SLocEntry that FID represents.
SourceLocation getLocForStartOfFile(FileID FID) const
Return the source location corresponding to the first byte of the specified file.
SourceLocation createExpansionLoc(SourceLocation SpellingLoc, SourceLocation ExpansionLocStart, SourceLocation ExpansionLocEnd, unsigned Length, bool ExpansionIsTokenRange=true, int LoadedID=0, SourceLocation::UIntTy LoadedOffset=0)
Creates an expansion SLocEntry for a macro use.
const SrcMgr::SLocEntry & getSLocEntry(FileID FID, bool *Invalid=nullptr) const
SourceLocation createMacroArgExpansionLoc(SourceLocation SpellingLoc, SourceLocation ExpansionLoc, unsigned Length)
Creates an expansion SLocEntry for the substitution of an argument into a function-like macro's body.
A trivial tuple used to represent a source range.
SourceLocation getEnd() const
SourceLocation getBegin() const
One instance of this struct is kept for every file loaded or used.
Each ExpansionInfo encodes the expansion location - where the token was ultimately expanded,...
SourceLocation getExpansionLocStart() const
bool isExpansionTokenRange() const
SourceLocation getSpellingLoc() const
bool isMacroArgExpansion() const
SourceLocation getExpansionLocEnd() const
const ContentCache & getContentCache() const
CharacteristicKind getFileCharacteristic() const
Return whether this is a system header or not.
SourceLocation getIncludeLoc() const
This is a discriminated union of FileInfo and ExpansionInfo.
const FileInfo & getFile() const
const ExpansionInfo & getExpansion() const
Represents a C++11 static_assert declaration.
SourceLocation getRParenLoc() const
StmtExpr - This is the GNU Statement Expression extension: ({int X=4; X;}).
CompoundStmt * getSubStmt()
unsigned getTemplateDepth() const
SourceLocation getRParenLoc() const
SourceLocation getLParenLoc() const
StmtVisitor - This class implements a simple visitor for Stmt subclasses.
Stmt - This represents one statement.
child_iterator child_begin()
StmtClass getStmtClass() const
child_iterator child_end()
const char * getStmtClassName() const
SourceLocation getBeginLoc() const LLVM_READONLY
StringLiteral - This represents a string literal expression, e.g.
tokloc_iterator tokloc_begin() const
tokloc_iterator tokloc_end() const
StringLiteralKind getKind() const
static StringLiteral * Create(const ASTContext &Ctx, StringRef Str, StringLiteralKind Kind, bool Pascal, QualType Ty, ArrayRef< SourceLocation > Locs)
This is the "fully general" constructor that allows representation of strings formed from one or more...
StringRef getBytes() const
Allow access to clients that need the byte representation, such as ASTWriterStmt::VisitStringLiteral(...
unsigned getNumConcatenated() const
getNumConcatenated - Get the number of string literal tokens that were concatenated in translation ph...
Represents a reference to a non-type template parameter that has been substituted with a template arg...
Decl * getAssociatedDecl() const
A template-like entity which owns the whole pattern being substituted.
UnsignedOrNone getPackIndex() const
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.
ArrayRef< TemplateArgument > getPackAsArray() const
Return the array of arguments in this template argument pack.
QualType getStructuralValueType() const
Get the type of a StructuralValue.
QualType getParamTypeForDecl() const
Expr * getAsExpr() const
Retrieve the template argument as an expression.
UnsignedOrNone getNumTemplateExpansions() const
Retrieve the number of expansions that a template template argument expansion will produce,...
QualType getAsType() const
Retrieve the type for a type template argument.
QualType getNullPtrType() const
Retrieve the type for null non-type template argument.
TemplateName getAsTemplate() const
Retrieve the template name for a template name argument.
unsigned pack_size() const
The number of template arguments in the given template argument pack.
QualType getIntegralType() const
Retrieve the type of the integral value.
bool getIsDefaulted() const
If returns 'true', this TemplateArgument corresponds to a default template parameter.
ValueDecl * getAsDecl() const
Retrieve the declaration for a declaration non-type template argument.
ArrayRef< TemplateArgument > pack_elements() const
Iterator range referencing all of the elements of a template argument pack.
@ Declaration
The template argument is a declaration that was provided for a pointer, reference,...
@ Template
The template argument is a template name that was provided for a template template parameter.
@ StructuralValue
The template argument is a non-type template argument that can't be represented by the special-case D...
@ Pack
The template argument is actually a parameter pack.
@ TemplateExpansion
The template argument is a pack expansion of a template name that was provided for a template templat...
@ NullPtr
The template argument is a null pointer or null pointer to member that was provided for a non-type te...
@ Type
The template argument is a type.
@ Null
Represents an empty template argument, e.g., one that has not been deduced.
@ Integral
The template argument is an integral value stored in an llvm::APSInt that was provided for an integra...
@ Expression
The template argument is an expression, and we've not resolved it to one of the other forms yet,...
ArgKind getKind() const
Return the kind of stored template argument.
bool isCanonicalExpr() const
TemplateName getAsTemplateOrTemplatePattern() const
Retrieve the template argument as a template name; if the argument is a pack expansion,...
const APValue & getAsStructuralValue() const
Get the value of a StructuralValue.
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
Represents a C++ template name within the type system.
TemplateDecl * getAsTemplateDecl(bool IgnoreDeduced=false) const
Retrieve the underlying template declaration that this template name refers to, if known.
DependentTemplateName * getAsDependentTemplateName() const
Retrieve the underlying dependent template name structure, if any.
QualifiedTemplateName * getAsQualifiedTemplateName() const
Retrieve the underlying qualified template name structure, if any.
OverloadedTemplateStorage * getAsOverloadedTemplate() const
Retrieve the underlying, overloaded function template declarations that this template name refers to,...
AssumedTemplateStorage * getAsAssumedTemplateName() const
Retrieve information on a name that has been assumed to be a template-name in order to permit a call ...
@ UsingTemplate
A template name that refers to a template declaration found through a specific using shadow declarati...
@ OverloadedTemplate
A set of overloaded template declarations.
@ Template
A single template declaration.
@ DependentTemplate
A dependent template name that has not been resolved to a template (or set of templates).
@ SubstTemplateTemplateParm
A template template parameter that has been substituted for some other template name.
@ SubstTemplateTemplateParmPack
A template template parameter pack that has been substituted for a template template argument pack,...
@ DeducedTemplate
A template name that refers to another TemplateName with deduced default arguments.
@ QualifiedTemplate
A qualified template name, where the qualification is kept to describe the source code as written.
@ AssumedTemplate
An unqualified-id that has been assumed to name a function template that will be found by ADL.
UsingShadowDecl * getAsUsingShadowDecl() const
Retrieve the using shadow declaration through which the underlying template declaration is introduced...
SubstTemplateTemplateParmPackStorage * getAsSubstTemplateTemplateParmPack() const
Retrieve the substituted template template parameter pack, if known.
SubstTemplateTemplateParmStorage * getAsSubstTemplateTemplateParm() const
Retrieve the substituted template template parameter, if known.
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.
TypeOfKind getKind() const
Returns the kind of 'typeof' type this is.
Expr * getUnderlyingExpr() const
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.
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
TypedefNameDecl * getDecl() const
NestedNameSpecifier getQualifier() const
bool typeMatchesDecl() 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.
NestedNameSpecifier getQualifier() const
UnresolvedUsingTypenameDecl * getDecl() const
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.
UsingShadowDecl * getDecl() const
NestedNameSpecifier getQualifier() const
Represents a call to the builtin function __builtin_va_arg.
TypeSourceInfo * getWrittenTypeInfo() const
SourceLocation getBuiltinLoc() const
SourceLocation getRParenLoc() const
bool isMicrosoftABI() const
Returns whether this is really a Win64 ABI va_arg expression.
const Expr * getSubExpr() const
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
void setType(QualType newType)
Represents a variable declaration or definition.
VarTemplateDecl * getDescribedVarTemplate() const
Retrieves the variable template that is described by this variable declaration.
bool isConstexpr() const
Whether this variable is (C++11) constexpr.
void setInstantiationOfStaticDataMember(VarDecl *VD, TemplateSpecializationKind TSK)
Specify that this variable is an instantiation of the static data member VD.
VarDecl * getMostRecentDecl()
Returns the most recent (re)declaration of this declaration.
DefinitionKind isThisDeclarationADefinition(ASTContext &) const
Check whether this declaration is a definition.
bool isInlineSpecified() const
VarDecl * getDefinition(ASTContext &)
Get the real (not just tentative) definition for this declaration.
EvaluatedStmt * getEvaluatedStmt() const
EvaluatedStmt * ensureEvaluatedStmt() const
Convert the initializer for this declaration to the elaborated EvaluatedStmt form,...
void setInlineSpecified()
VarDecl * getInstantiatedFromStaticDataMember() const
If this variable is an instantiated static data member of a class template specialization,...
bool isFileVarDecl() const
Returns true for file scoped variable declaration.
void setTSCSpec(ThreadStorageClassSpecifier TSC)
bool isInline() const
Whether this variable is (C++1z) inline.
ThreadStorageClassSpecifier getTSCSpec() const
const Expr * getInit() const
void setConstexpr(bool IC)
void setDescribedVarTemplate(VarTemplateDecl *Template)
StorageClass getStorageClass() const
Returns the storage class as written in the source.
void setImplicitlyInline()
VarDecl * getPreviousDecl()
Return the previous declaration of this declaration or NULL if this is the first declaration.
const Expr * getAnyInitializer() const
Get the initializer for this variable, no matter which declaration it is attached to.
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this variable is an instantiation of a static data member of a class template specialization,...
Declaration of a variable template.
VarDecl * getTemplatedDecl() const
Get the underlying variable declarations of the template.
bool isThisDeclarationADefinition() const
Returns whether this template declaration defines the primary variable pattern.
VarTemplateDecl * getMostRecentDecl()
Represents a variable template specialization, which refers to a variable template with a given set o...
SourceLocation getPointOfInstantiation() const
Get the point of instantiation (if any), or null if none.
void setTemplateArgsAsWritten(const ASTTemplateArgumentListInfo *ArgsWritten)
Set the template argument list as written in the sources.
const ASTTemplateArgumentListInfo * getTemplateArgsAsWritten() const
Retrieve the template argument list as written in the sources, if any.
void setSpecializationKind(TemplateSpecializationKind TSK)
const TemplateArgumentList & getTemplateArgs() const
Retrieve the template arguments of the variable template specialization.
void setPointOfInstantiation(SourceLocation Loc)
TemplateSpecializationKind getSpecializationKind() const
Determine the kind of specialization that this declaration represents.
VarTemplateDecl * getSpecializedTemplate() const
Retrieve the template that this specialization specializes.
VarTemplateSpecializationDecl * getMostRecentDecl()
Expr * getSizeExpr() const
unsigned getNumElements() const
VectorKind getVectorKind() const
QualType getElementType() const
WhileStmt - This represents a 'while' stmt.
SourceLocation getWhileLoc() const
SourceLocation getRParenLoc() const
VarDecl * getConditionVariable()
Retrieve the variable declared in this "while" statement, if any.
SourceLocation getLParenLoc() const
static WhileStmt * Create(const ASTContext &Ctx, VarDecl *Var, Expr *Cond, Stmt *Body, SourceLocation WL, SourceLocation LParenLoc, SourceLocation RParenLoc)
Create a while statement.
A requires-expression requirement which queries the validity and properties of an expression ('simple...
SubstitutionDiagnostic * getExprSubstitutionDiagnostic() const
ConceptSpecializationExpr * getReturnTypeRequirementSubstitutedConstraintExpr() const
const ReturnTypeRequirement & getReturnTypeRequirement() const
SatisfactionStatus getSatisfactionStatus() const
SourceLocation getNoexceptLoc() const
A requires-expression requirement which is satisfied when a general constraint expression is satisfie...
const ASTConstraintSatisfaction & getConstraintSatisfaction() const
bool hasInvalidConstraint() const
Expr * getConstraintExpr() const
StringRef getInvalidConstraintEntity()
A static requirement that can be used in a requires-expression to check properties of types and expre...
RequirementKind getKind() const
A requires-expression requirement which queries the existence of a type name or type template special...
bool isSubstitutionFailure() const
SubstitutionDiagnostic * getSubstitutionDiagnostic() const
TypeSourceInfo * getType() const
The JSON file list parser is used to communicate input to InstallAPI.
CanQual< Type > CanQualType
Represents a canonical, potentially-qualified type.
bool isa(CodeGen::Address addr)
llvm::Expected< SourceLocation > ExpectedSLoc
StructuralEquivalenceKind
Whether to perform a normal or minimal equivalence check.
llvm::Expected< const Type * > ExpectedTypePtr
CanThrowResult
Possible results from evaluation of a noexcept expression.
@ TemplateName
The identifier is a template name. FIXME: Add an annotation for that.
ExprObjectKind
A further classification of the kind of object referenced by an l-value or x-value.
std::pair< FileID, unsigned > FileIDAndOffset
llvm::Expected< DeclarationName > ExpectedName
llvm::Expected< Decl * > ExpectedDecl
@ Property
The type of a property.
@ Result
The result type of a method or function.
OptionalUnsigned< unsigned > UnsignedOrNone
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)
bool isLambdaMethod(const DeclContext *DC)
llvm::Expected< Stmt * > ExpectedStmt
static void updateFlags(const Decl *From, Decl *To)
__packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 __packed_splat2 __packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 uint32_t
Used as return type of getFriendCountAndPosition.
unsigned int IndexOfDecl
Index of the specific FriendDecl.
unsigned int TotalCount
Number of similar looking friends.
The result of a constraint satisfaction check, containing the necessary information to diagnose an un...
const UnsatisfiedConstraintRecord * end() const
static ASTConstraintSatisfaction * Rebuild(const ASTContext &C, const ASTConstraintSatisfaction &Satisfaction)
const UnsatisfiedConstraintRecord * begin() const
Represents an explicit template argument list in C++, e.g., the "<int>" in "sort<int>".
static const ASTTemplateArgumentListInfo * Create(const ASTContext &C, const TemplateArgumentListInfo &List)
const Expr * ConstraintExpr
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
SourceLocation getLoc() const
getLoc - Returns the main location of the declaration name.
DeclarationName getName() const
getName - Returns the embedded declaration name.
void setCXXLiteralOperatorNameLoc(SourceLocation Loc)
setCXXLiteralOperatorNameLoc - Sets the location of the literal operator name (not the operator keywo...
void setNamedTypeInfo(TypeSourceInfo *TInfo)
setNamedTypeInfo - Sets the source type info associated to the name.
void setCXXOperatorNameRange(SourceRange R)
setCXXOperatorNameRange - Sets the range of the operator name (without the operator keyword).
SourceRange getCXXOperatorNameRange() const
getCXXOperatorNameRange - Gets the range of the operator name (without the operator keyword).
TypeSourceInfo * getNamedTypeInfo() const
SourceLocation getCXXLiteralOperatorNameLoc() const
getCXXLiteralOperatorNameLoc - Returns the location of the literal operator name (not the operator ke...
Structure used to store a statement, the constant value to which it was evaluated (if any),...
unsigned HasConstantInitialization
Whether this variable is known to have constant initialization.
unsigned HasConstantDestruction
Whether this variable is known to have constant destruction.
FunctionDecl * SourceDecl
The function whose exception specification this is, for EST_Unevaluated and EST_Uninstantiated.
FunctionDecl * SourceTemplate
The function template whose exception specification this is instantiated from, for EST_Uninstantiated...
ExceptionSpecificationType Type
The kind of exception specification this is.
ArrayRef< QualType > Exceptions
Explicitly-specified list of exception types.
Expr * NoexceptExpr
Noexcept expression, if this is a computed noexcept specification.
Extra information about a function prototype.
ExceptionSpecInfo ExceptionSpec
RefQualifierKind RefQualifier
unsigned HasTrailingReturn
FunctionType::ExtInfo ExtInfo
const IdentifierInfo * getIdentifier() const
Returns the identifier to which this template name refers.
OverloadedOperatorKind getOperator() const
Return the overloaded operator to which this template name refers.
NestedNameSpecifierLoc Prefix
const NamespaceBaseDecl * Namespace
bool IsEquivalent(Decl *D1, Decl *D2)
Determine whether the two declarations are structurally equivalent.
Location information for a TemplateArgument.
SourceLocation getTemplateEllipsisLoc() const
SourceLocation getTemplateKwLoc() const
TypeSourceInfo * getAsTypeSourceInfo() const
SourceLocation getTemplateNameLoc() const
StringRef SubstitutedEntity