Path: blob/main/contrib/llvm-project/clang/lib/AST/ASTImporter.cpp
35260 views
//===- ASTImporter.cpp - Importing ASTs from other Contexts ---------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7//8// This file defines the ASTImporter class which imports AST nodes from one9// context into another context.10//11//===----------------------------------------------------------------------===//1213#include "clang/AST/ASTImporter.h"14#include "clang/AST/ASTContext.h"15#include "clang/AST/ASTDiagnostic.h"16#include "clang/AST/ASTImporterSharedState.h"17#include "clang/AST/ASTStructuralEquivalence.h"18#include "clang/AST/Attr.h"19#include "clang/AST/Decl.h"20#include "clang/AST/DeclAccessPair.h"21#include "clang/AST/DeclBase.h"22#include "clang/AST/DeclCXX.h"23#include "clang/AST/DeclFriend.h"24#include "clang/AST/DeclGroup.h"25#include "clang/AST/DeclObjC.h"26#include "clang/AST/DeclTemplate.h"27#include "clang/AST/DeclVisitor.h"28#include "clang/AST/DeclarationName.h"29#include "clang/AST/Expr.h"30#include "clang/AST/ExprCXX.h"31#include "clang/AST/ExprObjC.h"32#include "clang/AST/ExternalASTSource.h"33#include "clang/AST/LambdaCapture.h"34#include "clang/AST/NestedNameSpecifier.h"35#include "clang/AST/OperationKinds.h"36#include "clang/AST/Stmt.h"37#include "clang/AST/StmtCXX.h"38#include "clang/AST/StmtObjC.h"39#include "clang/AST/StmtVisitor.h"40#include "clang/AST/TemplateBase.h"41#include "clang/AST/TemplateName.h"42#include "clang/AST/Type.h"43#include "clang/AST/TypeLoc.h"44#include "clang/AST/TypeVisitor.h"45#include "clang/AST/UnresolvedSet.h"46#include "clang/Basic/Builtins.h"47#include "clang/Basic/ExceptionSpecificationType.h"48#include "clang/Basic/FileManager.h"49#include "clang/Basic/IdentifierTable.h"50#include "clang/Basic/LLVM.h"51#include "clang/Basic/LangOptions.h"52#include "clang/Basic/SourceLocation.h"53#include "clang/Basic/SourceManager.h"54#include "clang/Basic/Specifiers.h"55#include "llvm/ADT/APSInt.h"56#include "llvm/ADT/ArrayRef.h"57#include "llvm/ADT/DenseMap.h"58#include "llvm/ADT/STLExtras.h"59#include "llvm/ADT/ScopeExit.h"60#include "llvm/ADT/SmallVector.h"61#include "llvm/Support/Casting.h"62#include "llvm/Support/ErrorHandling.h"63#include "llvm/Support/MemoryBuffer.h"64#include <algorithm>65#include <cassert>66#include <cstddef>67#include <memory>68#include <optional>69#include <type_traits>70#include <utility>7172namespace clang {7374using llvm::make_error;75using llvm::Error;76using llvm::Expected;77using ExpectedTypePtr = llvm::Expected<const Type *>;78using ExpectedType = llvm::Expected<QualType>;79using ExpectedStmt = llvm::Expected<Stmt *>;80using ExpectedExpr = llvm::Expected<Expr *>;81using ExpectedDecl = llvm::Expected<Decl *>;82using ExpectedSLoc = llvm::Expected<SourceLocation>;83using ExpectedName = llvm::Expected<DeclarationName>;8485std::string ASTImportError::toString() const {86// FIXME: Improve error texts.87switch (Error) {88case NameConflict:89return "NameConflict";90case UnsupportedConstruct:91return "UnsupportedConstruct";92case Unknown:93return "Unknown error";94}95llvm_unreachable("Invalid error code.");96return "Invalid error code.";97}9899void ASTImportError::log(raw_ostream &OS) const { OS << toString(); }100101std::error_code ASTImportError::convertToErrorCode() const {102llvm_unreachable("Function not implemented.");103}104105char ASTImportError::ID;106107template <class T>108SmallVector<Decl *, 2>109getCanonicalForwardRedeclChain(Redeclarable<T>* D) {110SmallVector<Decl *, 2> Redecls;111for (auto *R : D->getFirstDecl()->redecls()) {112if (R != D->getFirstDecl())113Redecls.push_back(R);114}115Redecls.push_back(D->getFirstDecl());116std::reverse(Redecls.begin(), Redecls.end());117return Redecls;118}119120SmallVector<Decl*, 2> getCanonicalForwardRedeclChain(Decl* D) {121if (auto *FD = dyn_cast<FunctionDecl>(D))122return getCanonicalForwardRedeclChain<FunctionDecl>(FD);123if (auto *VD = dyn_cast<VarDecl>(D))124return getCanonicalForwardRedeclChain<VarDecl>(VD);125if (auto *TD = dyn_cast<TagDecl>(D))126return getCanonicalForwardRedeclChain<TagDecl>(TD);127llvm_unreachable("Bad declaration kind");128}129130void updateFlags(const Decl *From, Decl *To) {131// Check if some flags or attrs are new in 'From' and copy into 'To'.132// FIXME: Other flags or attrs?133if (From->isUsed(false) && !To->isUsed(false))134To->setIsUsed();135}136137/// How to handle import errors that occur when import of a child declaration138/// of a DeclContext fails.139class ChildErrorHandlingStrategy {140/// This context is imported (in the 'from' domain).141/// It is nullptr if a non-DeclContext is imported.142const DeclContext *const FromDC;143/// Ignore import errors of the children.144/// If true, the context can be imported successfully if a child145/// of it failed to import. Otherwise the import errors of the child nodes146/// are accumulated (joined) into the import error object of the parent.147/// (Import of a parent can fail in other ways.)148bool const IgnoreChildErrors;149150public:151ChildErrorHandlingStrategy(const DeclContext *FromDC)152: FromDC(FromDC), IgnoreChildErrors(!isa<TagDecl>(FromDC)) {}153ChildErrorHandlingStrategy(const Decl *FromD)154: FromDC(dyn_cast<DeclContext>(FromD)),155IgnoreChildErrors(!isa<TagDecl>(FromD)) {}156157/// Process the import result of a child (of the current declaration).158/// \param ResultErr The import error that can be used as result of159/// importing the parent. This may be changed by the function.160/// \param ChildErr Result of importing a child. Can be success or error.161void handleChildImportResult(Error &ResultErr, Error &&ChildErr) {162if (ChildErr && !IgnoreChildErrors)163ResultErr = joinErrors(std::move(ResultErr), std::move(ChildErr));164else165consumeError(std::move(ChildErr));166}167168/// Determine if import failure of a child does not cause import failure of169/// its parent.170bool ignoreChildErrorOnParent(Decl *FromChildD) const {171if (!IgnoreChildErrors || !FromDC)172return false;173return FromDC->containsDecl(FromChildD);174}175};176177class ASTNodeImporter : public TypeVisitor<ASTNodeImporter, ExpectedType>,178public DeclVisitor<ASTNodeImporter, ExpectedDecl>,179public StmtVisitor<ASTNodeImporter, ExpectedStmt> {180ASTImporter &Importer;181182// Use this instead of Importer.importInto .183template <typename ImportT>184[[nodiscard]] Error importInto(ImportT &To, const ImportT &From) {185return Importer.importInto(To, From);186}187188// Use this to import pointers of specific type.189template <typename ImportT>190[[nodiscard]] Error importInto(ImportT *&To, ImportT *From) {191auto ToOrErr = Importer.Import(From);192if (ToOrErr)193To = cast_or_null<ImportT>(*ToOrErr);194return ToOrErr.takeError();195}196197// Call the import function of ASTImporter for a baseclass of type `T` and198// cast the return value to `T`.199template <typename T>200auto import(T *From)201-> std::conditional_t<std::is_base_of_v<Type, T>, Expected<const T *>,202Expected<T *>> {203auto ToOrErr = Importer.Import(From);204if (!ToOrErr)205return ToOrErr.takeError();206return cast_or_null<T>(*ToOrErr);207}208209template <typename T>210auto import(const T *From) {211return import(const_cast<T *>(From));212}213214// Call the import function of ASTImporter for type `T`.215template <typename T>216Expected<T> import(const T &From) {217return Importer.Import(From);218}219220// Import an std::optional<T> by importing the contained T, if any.221template <typename T>222Expected<std::optional<T>> import(std::optional<T> From) {223if (!From)224return std::nullopt;225return import(*From);226}227228ExplicitSpecifier importExplicitSpecifier(Error &Err,229ExplicitSpecifier ESpec);230231// Wrapper for an overload set.232template <typename ToDeclT> struct CallOverloadedCreateFun {233template <typename... Args> decltype(auto) operator()(Args &&... args) {234return ToDeclT::Create(std::forward<Args>(args)...);235}236};237238// Always use these functions to create a Decl during import. There are239// certain tasks which must be done after the Decl was created, e.g. we240// must immediately register that as an imported Decl. The parameter `ToD`241// will be set to the newly created Decl or if had been imported before242// then to the already imported Decl. Returns a bool value set to true if243// the `FromD` had been imported before.244template <typename ToDeclT, typename FromDeclT, typename... Args>245[[nodiscard]] bool GetImportedOrCreateDecl(ToDeclT *&ToD, FromDeclT *FromD,246Args &&...args) {247// There may be several overloads of ToDeclT::Create. We must make sure248// to call the one which would be chosen by the arguments, thus we use a249// wrapper for the overload set.250CallOverloadedCreateFun<ToDeclT> OC;251return GetImportedOrCreateSpecialDecl(ToD, OC, FromD,252std::forward<Args>(args)...);253}254// Use this overload if a special Type is needed to be created. E.g if we255// want to create a `TypeAliasDecl` and assign that to a `TypedefNameDecl`256// then:257// TypedefNameDecl *ToTypedef;258// GetImportedOrCreateDecl<TypeAliasDecl>(ToTypedef, FromD, ...);259template <typename NewDeclT, typename ToDeclT, typename FromDeclT,260typename... Args>261[[nodiscard]] bool GetImportedOrCreateDecl(ToDeclT *&ToD, FromDeclT *FromD,262Args &&...args) {263CallOverloadedCreateFun<NewDeclT> OC;264return GetImportedOrCreateSpecialDecl(ToD, OC, FromD,265std::forward<Args>(args)...);266}267// Use this version if a special create function must be268// used, e.g. CXXRecordDecl::CreateLambda .269template <typename ToDeclT, typename CreateFunT, typename FromDeclT,270typename... Args>271[[nodiscard]] bool272GetImportedOrCreateSpecialDecl(ToDeclT *&ToD, CreateFunT CreateFun,273FromDeclT *FromD, Args &&...args) {274if (Importer.getImportDeclErrorIfAny(FromD)) {275ToD = nullptr;276return true; // Already imported but with error.277}278ToD = cast_or_null<ToDeclT>(Importer.GetAlreadyImportedOrNull(FromD));279if (ToD)280return true; // Already imported.281ToD = CreateFun(std::forward<Args>(args)...);282// Keep track of imported Decls.283Importer.RegisterImportedDecl(FromD, ToD);284Importer.SharedState->markAsNewDecl(ToD);285InitializeImportedDecl(FromD, ToD);286return false; // A new Decl is created.287}288289void InitializeImportedDecl(Decl *FromD, Decl *ToD) {290ToD->IdentifierNamespace = FromD->IdentifierNamespace;291if (FromD->isUsed())292ToD->setIsUsed();293if (FromD->isImplicit())294ToD->setImplicit();295}296297// Check if we have found an existing definition. Returns with that298// definition if yes, otherwise returns null.299Decl *FindAndMapDefinition(FunctionDecl *D, FunctionDecl *FoundFunction) {300const FunctionDecl *Definition = nullptr;301if (D->doesThisDeclarationHaveABody() &&302FoundFunction->hasBody(Definition))303return Importer.MapImported(D, const_cast<FunctionDecl *>(Definition));304return nullptr;305}306307void addDeclToContexts(Decl *FromD, Decl *ToD) {308if (Importer.isMinimalImport()) {309// In minimal import case the decl must be added even if it is not310// contained in original context, for LLDB compatibility.311// FIXME: Check if a better solution is possible.312if (!FromD->getDescribedTemplate() &&313FromD->getFriendObjectKind() == Decl::FOK_None)314ToD->getLexicalDeclContext()->addDeclInternal(ToD);315return;316}317318DeclContext *FromDC = FromD->getDeclContext();319DeclContext *FromLexicalDC = FromD->getLexicalDeclContext();320DeclContext *ToDC = ToD->getDeclContext();321DeclContext *ToLexicalDC = ToD->getLexicalDeclContext();322323bool Visible = false;324if (FromDC->containsDeclAndLoad(FromD)) {325ToDC->addDeclInternal(ToD);326Visible = true;327}328if (ToDC != ToLexicalDC && FromLexicalDC->containsDeclAndLoad(FromD)) {329ToLexicalDC->addDeclInternal(ToD);330Visible = true;331}332333// If the Decl was added to any context, it was made already visible.334// Otherwise it is still possible that it should be visible.335if (!Visible) {336if (auto *FromNamed = dyn_cast<NamedDecl>(FromD)) {337auto *ToNamed = cast<NamedDecl>(ToD);338DeclContextLookupResult FromLookup =339FromDC->lookup(FromNamed->getDeclName());340if (llvm::is_contained(FromLookup, FromNamed))341ToDC->makeDeclVisibleInContext(ToNamed);342}343}344}345346void updateLookupTableForTemplateParameters(TemplateParameterList &Params,347DeclContext *OldDC) {348ASTImporterLookupTable *LT = Importer.SharedState->getLookupTable();349if (!LT)350return;351352for (NamedDecl *TP : Params)353LT->update(TP, OldDC);354}355356void updateLookupTableForTemplateParameters(TemplateParameterList &Params) {357updateLookupTableForTemplateParameters(358Params, Importer.getToContext().getTranslationUnitDecl());359}360361public:362explicit ASTNodeImporter(ASTImporter &Importer) : Importer(Importer) {}363364using TypeVisitor<ASTNodeImporter, ExpectedType>::Visit;365using DeclVisitor<ASTNodeImporter, ExpectedDecl>::Visit;366using StmtVisitor<ASTNodeImporter, ExpectedStmt>::Visit;367368// Importing types369ExpectedType VisitType(const Type *T);370#define TYPE(Class, Base) \371ExpectedType Visit##Class##Type(const Class##Type *T);372#include "clang/AST/TypeNodes.inc"373374// Importing declarations375Error ImportDeclParts(NamedDecl *D, DeclarationName &Name, NamedDecl *&ToD,376SourceLocation &Loc);377Error ImportDeclParts(378NamedDecl *D, DeclContext *&DC, DeclContext *&LexicalDC,379DeclarationName &Name, NamedDecl *&ToD, SourceLocation &Loc);380Error ImportDefinitionIfNeeded(Decl *FromD, Decl *ToD = nullptr);381Error ImportDeclarationNameLoc(382const DeclarationNameInfo &From, DeclarationNameInfo &To);383Error ImportDeclContext(DeclContext *FromDC, bool ForceImport = false);384Error ImportDeclContext(385Decl *From, DeclContext *&ToDC, DeclContext *&ToLexicalDC);386Error ImportImplicitMethods(const CXXRecordDecl *From, CXXRecordDecl *To);387388Error ImportFieldDeclDefinition(const FieldDecl *From, const FieldDecl *To);389Expected<CXXCastPath> ImportCastPath(CastExpr *E);390Expected<APValue> ImportAPValue(const APValue &FromValue);391392using Designator = DesignatedInitExpr::Designator;393394/// What we should import from the definition.395enum ImportDefinitionKind {396/// Import the default subset of the definition, which might be397/// nothing (if minimal import is set) or might be everything (if minimal398/// import is not set).399IDK_Default,400/// Import everything.401IDK_Everything,402/// Import only the bare bones needed to establish a valid403/// DeclContext.404IDK_Basic405};406407bool shouldForceImportDeclContext(ImportDefinitionKind IDK) {408return IDK == IDK_Everything ||409(IDK == IDK_Default && !Importer.isMinimalImport());410}411412Error ImportInitializer(VarDecl *From, VarDecl *To);413Error ImportDefinition(414RecordDecl *From, RecordDecl *To,415ImportDefinitionKind Kind = IDK_Default);416Error ImportDefinition(417EnumDecl *From, EnumDecl *To,418ImportDefinitionKind Kind = IDK_Default);419Error ImportDefinition(420ObjCInterfaceDecl *From, ObjCInterfaceDecl *To,421ImportDefinitionKind Kind = IDK_Default);422Error ImportDefinition(423ObjCProtocolDecl *From, ObjCProtocolDecl *To,424ImportDefinitionKind Kind = IDK_Default);425Error ImportTemplateArguments(ArrayRef<TemplateArgument> FromArgs,426SmallVectorImpl<TemplateArgument> &ToArgs);427Expected<TemplateArgument>428ImportTemplateArgument(const TemplateArgument &From);429430template <typename InContainerTy>431Error ImportTemplateArgumentListInfo(432const InContainerTy &Container, TemplateArgumentListInfo &ToTAInfo);433434template<typename InContainerTy>435Error ImportTemplateArgumentListInfo(436SourceLocation FromLAngleLoc, SourceLocation FromRAngleLoc,437const InContainerTy &Container, TemplateArgumentListInfo &Result);438439using TemplateArgsTy = SmallVector<TemplateArgument, 8>;440using FunctionTemplateAndArgsTy =441std::tuple<FunctionTemplateDecl *, TemplateArgsTy>;442Expected<FunctionTemplateAndArgsTy>443ImportFunctionTemplateWithTemplateArgsFromSpecialization(444FunctionDecl *FromFD);445446template <typename DeclTy>447Error ImportTemplateParameterLists(const DeclTy *FromD, DeclTy *ToD);448449Error ImportTemplateInformation(FunctionDecl *FromFD, FunctionDecl *ToFD);450451Error ImportFunctionDeclBody(FunctionDecl *FromFD, FunctionDecl *ToFD);452453Error ImportDefaultArgOfParmVarDecl(const ParmVarDecl *FromParam,454ParmVarDecl *ToParam);455456Expected<InheritedConstructor>457ImportInheritedConstructor(const InheritedConstructor &From);458459template <typename T>460bool hasSameVisibilityContextAndLinkage(T *Found, T *From);461462bool IsStructuralMatch(Decl *From, Decl *To, bool Complain = true,463bool IgnoreTemplateParmDepth = false);464ExpectedDecl VisitDecl(Decl *D);465ExpectedDecl VisitImportDecl(ImportDecl *D);466ExpectedDecl VisitEmptyDecl(EmptyDecl *D);467ExpectedDecl VisitAccessSpecDecl(AccessSpecDecl *D);468ExpectedDecl VisitStaticAssertDecl(StaticAssertDecl *D);469ExpectedDecl VisitTranslationUnitDecl(TranslationUnitDecl *D);470ExpectedDecl VisitBindingDecl(BindingDecl *D);471ExpectedDecl VisitNamespaceDecl(NamespaceDecl *D);472ExpectedDecl VisitNamespaceAliasDecl(NamespaceAliasDecl *D);473ExpectedDecl VisitTypedefNameDecl(TypedefNameDecl *D, bool IsAlias);474ExpectedDecl VisitTypedefDecl(TypedefDecl *D);475ExpectedDecl VisitTypeAliasDecl(TypeAliasDecl *D);476ExpectedDecl VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D);477ExpectedDecl VisitLabelDecl(LabelDecl *D);478ExpectedDecl VisitEnumDecl(EnumDecl *D);479ExpectedDecl VisitRecordDecl(RecordDecl *D);480ExpectedDecl VisitEnumConstantDecl(EnumConstantDecl *D);481ExpectedDecl VisitFunctionDecl(FunctionDecl *D);482ExpectedDecl VisitCXXMethodDecl(CXXMethodDecl *D);483ExpectedDecl VisitCXXConstructorDecl(CXXConstructorDecl *D);484ExpectedDecl VisitCXXDestructorDecl(CXXDestructorDecl *D);485ExpectedDecl VisitCXXConversionDecl(CXXConversionDecl *D);486ExpectedDecl VisitCXXDeductionGuideDecl(CXXDeductionGuideDecl *D);487ExpectedDecl VisitFieldDecl(FieldDecl *D);488ExpectedDecl VisitIndirectFieldDecl(IndirectFieldDecl *D);489ExpectedDecl VisitFriendDecl(FriendDecl *D);490ExpectedDecl VisitObjCIvarDecl(ObjCIvarDecl *D);491ExpectedDecl VisitVarDecl(VarDecl *D);492ExpectedDecl VisitImplicitParamDecl(ImplicitParamDecl *D);493ExpectedDecl VisitParmVarDecl(ParmVarDecl *D);494ExpectedDecl VisitObjCMethodDecl(ObjCMethodDecl *D);495ExpectedDecl VisitObjCTypeParamDecl(ObjCTypeParamDecl *D);496ExpectedDecl VisitObjCCategoryDecl(ObjCCategoryDecl *D);497ExpectedDecl VisitObjCProtocolDecl(ObjCProtocolDecl *D);498ExpectedDecl VisitLinkageSpecDecl(LinkageSpecDecl *D);499ExpectedDecl VisitUsingDecl(UsingDecl *D);500ExpectedDecl VisitUsingShadowDecl(UsingShadowDecl *D);501ExpectedDecl VisitUsingDirectiveDecl(UsingDirectiveDecl *D);502ExpectedDecl VisitUsingPackDecl(UsingPackDecl *D);503ExpectedDecl ImportUsingShadowDecls(BaseUsingDecl *D, BaseUsingDecl *ToSI);504ExpectedDecl VisitUsingEnumDecl(UsingEnumDecl *D);505ExpectedDecl VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D);506ExpectedDecl VisitUnresolvedUsingTypenameDecl(UnresolvedUsingTypenameDecl *D);507ExpectedDecl VisitBuiltinTemplateDecl(BuiltinTemplateDecl *D);508ExpectedDecl509VisitLifetimeExtendedTemporaryDecl(LifetimeExtendedTemporaryDecl *D);510511Expected<ObjCTypeParamList *>512ImportObjCTypeParamList(ObjCTypeParamList *list);513514ExpectedDecl VisitObjCInterfaceDecl(ObjCInterfaceDecl *D);515ExpectedDecl VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D);516ExpectedDecl VisitObjCImplementationDecl(ObjCImplementationDecl *D);517ExpectedDecl VisitObjCPropertyDecl(ObjCPropertyDecl *D);518ExpectedDecl VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D);519ExpectedDecl VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D);520ExpectedDecl VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D);521ExpectedDecl VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D);522ExpectedDecl VisitClassTemplateDecl(ClassTemplateDecl *D);523ExpectedDecl VisitClassTemplateSpecializationDecl(524ClassTemplateSpecializationDecl *D);525ExpectedDecl VisitVarTemplateDecl(VarTemplateDecl *D);526ExpectedDecl VisitVarTemplateSpecializationDecl(VarTemplateSpecializationDecl *D);527ExpectedDecl VisitFunctionTemplateDecl(FunctionTemplateDecl *D);528529// Importing statements530ExpectedStmt VisitStmt(Stmt *S);531ExpectedStmt VisitGCCAsmStmt(GCCAsmStmt *S);532ExpectedStmt VisitDeclStmt(DeclStmt *S);533ExpectedStmt VisitNullStmt(NullStmt *S);534ExpectedStmt VisitCompoundStmt(CompoundStmt *S);535ExpectedStmt VisitCaseStmt(CaseStmt *S);536ExpectedStmt VisitDefaultStmt(DefaultStmt *S);537ExpectedStmt VisitLabelStmt(LabelStmt *S);538ExpectedStmt VisitAttributedStmt(AttributedStmt *S);539ExpectedStmt VisitIfStmt(IfStmt *S);540ExpectedStmt VisitSwitchStmt(SwitchStmt *S);541ExpectedStmt VisitWhileStmt(WhileStmt *S);542ExpectedStmt VisitDoStmt(DoStmt *S);543ExpectedStmt VisitForStmt(ForStmt *S);544ExpectedStmt VisitGotoStmt(GotoStmt *S);545ExpectedStmt VisitIndirectGotoStmt(IndirectGotoStmt *S);546ExpectedStmt VisitContinueStmt(ContinueStmt *S);547ExpectedStmt VisitBreakStmt(BreakStmt *S);548ExpectedStmt VisitReturnStmt(ReturnStmt *S);549// FIXME: MSAsmStmt550// FIXME: SEHExceptStmt551// FIXME: SEHFinallyStmt552// FIXME: SEHTryStmt553// FIXME: SEHLeaveStmt554// FIXME: CapturedStmt555ExpectedStmt VisitCXXCatchStmt(CXXCatchStmt *S);556ExpectedStmt VisitCXXTryStmt(CXXTryStmt *S);557ExpectedStmt VisitCXXForRangeStmt(CXXForRangeStmt *S);558// FIXME: MSDependentExistsStmt559ExpectedStmt VisitObjCForCollectionStmt(ObjCForCollectionStmt *S);560ExpectedStmt VisitObjCAtCatchStmt(ObjCAtCatchStmt *S);561ExpectedStmt VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S);562ExpectedStmt VisitObjCAtTryStmt(ObjCAtTryStmt *S);563ExpectedStmt VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *S);564ExpectedStmt VisitObjCAtThrowStmt(ObjCAtThrowStmt *S);565ExpectedStmt VisitObjCAutoreleasePoolStmt(ObjCAutoreleasePoolStmt *S);566567// Importing expressions568ExpectedStmt VisitExpr(Expr *E);569ExpectedStmt VisitSourceLocExpr(SourceLocExpr *E);570ExpectedStmt VisitVAArgExpr(VAArgExpr *E);571ExpectedStmt VisitChooseExpr(ChooseExpr *E);572ExpectedStmt VisitConvertVectorExpr(ConvertVectorExpr *E);573ExpectedStmt VisitShuffleVectorExpr(ShuffleVectorExpr *E);574ExpectedStmt VisitGNUNullExpr(GNUNullExpr *E);575ExpectedStmt VisitGenericSelectionExpr(GenericSelectionExpr *E);576ExpectedStmt VisitPredefinedExpr(PredefinedExpr *E);577ExpectedStmt VisitDeclRefExpr(DeclRefExpr *E);578ExpectedStmt VisitImplicitValueInitExpr(ImplicitValueInitExpr *E);579ExpectedStmt VisitDesignatedInitExpr(DesignatedInitExpr *E);580ExpectedStmt VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E);581ExpectedStmt VisitIntegerLiteral(IntegerLiteral *E);582ExpectedStmt VisitFloatingLiteral(FloatingLiteral *E);583ExpectedStmt VisitImaginaryLiteral(ImaginaryLiteral *E);584ExpectedStmt VisitFixedPointLiteral(FixedPointLiteral *E);585ExpectedStmt VisitCharacterLiteral(CharacterLiteral *E);586ExpectedStmt VisitStringLiteral(StringLiteral *E);587ExpectedStmt VisitCompoundLiteralExpr(CompoundLiteralExpr *E);588ExpectedStmt VisitAtomicExpr(AtomicExpr *E);589ExpectedStmt VisitAddrLabelExpr(AddrLabelExpr *E);590ExpectedStmt VisitConstantExpr(ConstantExpr *E);591ExpectedStmt VisitParenExpr(ParenExpr *E);592ExpectedStmt VisitParenListExpr(ParenListExpr *E);593ExpectedStmt VisitStmtExpr(StmtExpr *E);594ExpectedStmt VisitUnaryOperator(UnaryOperator *E);595ExpectedStmt VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *E);596ExpectedStmt VisitBinaryOperator(BinaryOperator *E);597ExpectedStmt VisitConditionalOperator(ConditionalOperator *E);598ExpectedStmt VisitBinaryConditionalOperator(BinaryConditionalOperator *E);599ExpectedStmt VisitCXXRewrittenBinaryOperator(CXXRewrittenBinaryOperator *E);600ExpectedStmt VisitOpaqueValueExpr(OpaqueValueExpr *E);601ExpectedStmt VisitArrayTypeTraitExpr(ArrayTypeTraitExpr *E);602ExpectedStmt VisitExpressionTraitExpr(ExpressionTraitExpr *E);603ExpectedStmt VisitArraySubscriptExpr(ArraySubscriptExpr *E);604ExpectedStmt VisitCompoundAssignOperator(CompoundAssignOperator *E);605ExpectedStmt VisitImplicitCastExpr(ImplicitCastExpr *E);606ExpectedStmt VisitExplicitCastExpr(ExplicitCastExpr *E);607ExpectedStmt VisitOffsetOfExpr(OffsetOfExpr *OE);608ExpectedStmt VisitCXXThrowExpr(CXXThrowExpr *E);609ExpectedStmt VisitCXXNoexceptExpr(CXXNoexceptExpr *E);610ExpectedStmt VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E);611ExpectedStmt VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E);612ExpectedStmt VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E);613ExpectedStmt VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E);614ExpectedStmt VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *E);615ExpectedStmt VisitPackExpansionExpr(PackExpansionExpr *E);616ExpectedStmt VisitSizeOfPackExpr(SizeOfPackExpr *E);617ExpectedStmt VisitCXXNewExpr(CXXNewExpr *E);618ExpectedStmt VisitCXXDeleteExpr(CXXDeleteExpr *E);619ExpectedStmt VisitCXXConstructExpr(CXXConstructExpr *E);620ExpectedStmt VisitCXXMemberCallExpr(CXXMemberCallExpr *E);621ExpectedStmt VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E);622ExpectedStmt VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E);623ExpectedStmt VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr *E);624ExpectedStmt VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E);625ExpectedStmt VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E);626ExpectedStmt VisitExprWithCleanups(ExprWithCleanups *E);627ExpectedStmt VisitCXXThisExpr(CXXThisExpr *E);628ExpectedStmt VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E);629ExpectedStmt VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E);630ExpectedStmt VisitMemberExpr(MemberExpr *E);631ExpectedStmt VisitCallExpr(CallExpr *E);632ExpectedStmt VisitLambdaExpr(LambdaExpr *LE);633ExpectedStmt VisitInitListExpr(InitListExpr *E);634ExpectedStmt VisitCXXStdInitializerListExpr(CXXStdInitializerListExpr *E);635ExpectedStmt VisitCXXInheritedCtorInitExpr(CXXInheritedCtorInitExpr *E);636ExpectedStmt VisitArrayInitLoopExpr(ArrayInitLoopExpr *E);637ExpectedStmt VisitArrayInitIndexExpr(ArrayInitIndexExpr *E);638ExpectedStmt VisitCXXDefaultInitExpr(CXXDefaultInitExpr *E);639ExpectedStmt VisitCXXNamedCastExpr(CXXNamedCastExpr *E);640ExpectedStmt VisitSubstNonTypeTemplateParmExpr(SubstNonTypeTemplateParmExpr *E);641ExpectedStmt VisitTypeTraitExpr(TypeTraitExpr *E);642ExpectedStmt VisitCXXTypeidExpr(CXXTypeidExpr *E);643ExpectedStmt VisitCXXFoldExpr(CXXFoldExpr *E);644645// Helper for chaining together multiple imports. If an error is detected,646// subsequent imports will return default constructed nodes, so that failure647// can be detected with a single conditional branch after a sequence of648// imports.649template <typename T> T importChecked(Error &Err, const T &From) {650// Don't attempt to import nodes if we hit an error earlier.651if (Err)652return T{};653Expected<T> MaybeVal = import(From);654if (!MaybeVal) {655Err = MaybeVal.takeError();656return T{};657}658return *MaybeVal;659}660661template<typename IIter, typename OIter>662Error ImportArrayChecked(IIter Ibegin, IIter Iend, OIter Obegin) {663using ItemT = std::remove_reference_t<decltype(*Obegin)>;664for (; Ibegin != Iend; ++Ibegin, ++Obegin) {665Expected<ItemT> ToOrErr = import(*Ibegin);666if (!ToOrErr)667return ToOrErr.takeError();668*Obegin = *ToOrErr;669}670return Error::success();671}672673// Import every item from a container structure into an output container.674// If error occurs, stops at first error and returns the error.675// The output container should have space for all needed elements (it is not676// expanded, new items are put into from the beginning).677template<typename InContainerTy, typename OutContainerTy>678Error ImportContainerChecked(679const InContainerTy &InContainer, OutContainerTy &OutContainer) {680return ImportArrayChecked(681InContainer.begin(), InContainer.end(), OutContainer.begin());682}683684template<typename InContainerTy, typename OIter>685Error ImportArrayChecked(const InContainerTy &InContainer, OIter Obegin) {686return ImportArrayChecked(InContainer.begin(), InContainer.end(), Obegin);687}688689Error ImportOverriddenMethods(CXXMethodDecl *ToMethod,690CXXMethodDecl *FromMethod);691692Expected<FunctionDecl *> FindFunctionTemplateSpecialization(693FunctionDecl *FromFD);694695// Returns true if the given function has a placeholder return type and696// that type is declared inside the body of the function.697// E.g. auto f() { struct X{}; return X(); }698bool hasReturnTypeDeclaredInside(FunctionDecl *D);699};700701template <typename InContainerTy>702Error ASTNodeImporter::ImportTemplateArgumentListInfo(703SourceLocation FromLAngleLoc, SourceLocation FromRAngleLoc,704const InContainerTy &Container, TemplateArgumentListInfo &Result) {705auto ToLAngleLocOrErr = import(FromLAngleLoc);706if (!ToLAngleLocOrErr)707return ToLAngleLocOrErr.takeError();708auto ToRAngleLocOrErr = import(FromRAngleLoc);709if (!ToRAngleLocOrErr)710return ToRAngleLocOrErr.takeError();711712TemplateArgumentListInfo ToTAInfo(*ToLAngleLocOrErr, *ToRAngleLocOrErr);713if (auto Err = ImportTemplateArgumentListInfo(Container, ToTAInfo))714return Err;715Result = ToTAInfo;716return Error::success();717}718719template <>720Error ASTNodeImporter::ImportTemplateArgumentListInfo<TemplateArgumentListInfo>(721const TemplateArgumentListInfo &From, TemplateArgumentListInfo &Result) {722return ImportTemplateArgumentListInfo(723From.getLAngleLoc(), From.getRAngleLoc(), From.arguments(), Result);724}725726template <>727Error ASTNodeImporter::ImportTemplateArgumentListInfo<728ASTTemplateArgumentListInfo>(729const ASTTemplateArgumentListInfo &From,730TemplateArgumentListInfo &Result) {731return ImportTemplateArgumentListInfo(732From.LAngleLoc, From.RAngleLoc, From.arguments(), Result);733}734735Expected<ASTNodeImporter::FunctionTemplateAndArgsTy>736ASTNodeImporter::ImportFunctionTemplateWithTemplateArgsFromSpecialization(737FunctionDecl *FromFD) {738assert(FromFD->getTemplatedKind() ==739FunctionDecl::TK_FunctionTemplateSpecialization);740741FunctionTemplateAndArgsTy Result;742743auto *FTSInfo = FromFD->getTemplateSpecializationInfo();744if (Error Err = importInto(std::get<0>(Result), FTSInfo->getTemplate()))745return std::move(Err);746747// Import template arguments.748if (Error Err = ImportTemplateArguments(FTSInfo->TemplateArguments->asArray(),749std::get<1>(Result)))750return std::move(Err);751752return Result;753}754755template <>756Expected<TemplateParameterList *>757ASTNodeImporter::import(TemplateParameterList *From) {758SmallVector<NamedDecl *, 4> To(From->size());759if (Error Err = ImportContainerChecked(*From, To))760return std::move(Err);761762ExpectedExpr ToRequiresClause = import(From->getRequiresClause());763if (!ToRequiresClause)764return ToRequiresClause.takeError();765766auto ToTemplateLocOrErr = import(From->getTemplateLoc());767if (!ToTemplateLocOrErr)768return ToTemplateLocOrErr.takeError();769auto ToLAngleLocOrErr = import(From->getLAngleLoc());770if (!ToLAngleLocOrErr)771return ToLAngleLocOrErr.takeError();772auto ToRAngleLocOrErr = import(From->getRAngleLoc());773if (!ToRAngleLocOrErr)774return ToRAngleLocOrErr.takeError();775776return TemplateParameterList::Create(777Importer.getToContext(),778*ToTemplateLocOrErr,779*ToLAngleLocOrErr,780To,781*ToRAngleLocOrErr,782*ToRequiresClause);783}784785template <>786Expected<TemplateArgument>787ASTNodeImporter::import(const TemplateArgument &From) {788switch (From.getKind()) {789case TemplateArgument::Null:790return TemplateArgument();791792case TemplateArgument::Type: {793ExpectedType ToTypeOrErr = import(From.getAsType());794if (!ToTypeOrErr)795return ToTypeOrErr.takeError();796return TemplateArgument(*ToTypeOrErr, /*isNullPtr*/ false,797From.getIsDefaulted());798}799800case TemplateArgument::Integral: {801ExpectedType ToTypeOrErr = import(From.getIntegralType());802if (!ToTypeOrErr)803return ToTypeOrErr.takeError();804return TemplateArgument(From, *ToTypeOrErr);805}806807case TemplateArgument::Declaration: {808Expected<ValueDecl *> ToOrErr = import(From.getAsDecl());809if (!ToOrErr)810return ToOrErr.takeError();811ExpectedType ToTypeOrErr = import(From.getParamTypeForDecl());812if (!ToTypeOrErr)813return ToTypeOrErr.takeError();814return TemplateArgument(dyn_cast<ValueDecl>((*ToOrErr)->getCanonicalDecl()),815*ToTypeOrErr, From.getIsDefaulted());816}817818case TemplateArgument::NullPtr: {819ExpectedType ToTypeOrErr = import(From.getNullPtrType());820if (!ToTypeOrErr)821return ToTypeOrErr.takeError();822return TemplateArgument(*ToTypeOrErr, /*isNullPtr*/ true,823From.getIsDefaulted());824}825826case TemplateArgument::StructuralValue: {827ExpectedType ToTypeOrErr = import(From.getStructuralValueType());828if (!ToTypeOrErr)829return ToTypeOrErr.takeError();830Expected<APValue> ToValueOrErr = import(From.getAsStructuralValue());831if (!ToValueOrErr)832return ToValueOrErr.takeError();833return TemplateArgument(Importer.getToContext(), *ToTypeOrErr,834*ToValueOrErr);835}836837case TemplateArgument::Template: {838Expected<TemplateName> ToTemplateOrErr = import(From.getAsTemplate());839if (!ToTemplateOrErr)840return ToTemplateOrErr.takeError();841842return TemplateArgument(*ToTemplateOrErr, From.getIsDefaulted());843}844845case TemplateArgument::TemplateExpansion: {846Expected<TemplateName> ToTemplateOrErr =847import(From.getAsTemplateOrTemplatePattern());848if (!ToTemplateOrErr)849return ToTemplateOrErr.takeError();850851return TemplateArgument(*ToTemplateOrErr, From.getNumTemplateExpansions(),852From.getIsDefaulted());853}854855case TemplateArgument::Expression:856if (ExpectedExpr ToExpr = import(From.getAsExpr()))857return TemplateArgument(*ToExpr, From.getIsDefaulted());858else859return ToExpr.takeError();860861case TemplateArgument::Pack: {862SmallVector<TemplateArgument, 2> ToPack;863ToPack.reserve(From.pack_size());864if (Error Err = ImportTemplateArguments(From.pack_elements(), ToPack))865return std::move(Err);866867return TemplateArgument(868llvm::ArrayRef(ToPack).copy(Importer.getToContext()));869}870}871872llvm_unreachable("Invalid template argument kind");873}874875template <>876Expected<TemplateArgumentLoc>877ASTNodeImporter::import(const TemplateArgumentLoc &TALoc) {878Expected<TemplateArgument> ArgOrErr = import(TALoc.getArgument());879if (!ArgOrErr)880return ArgOrErr.takeError();881TemplateArgument Arg = *ArgOrErr;882883TemplateArgumentLocInfo FromInfo = TALoc.getLocInfo();884885TemplateArgumentLocInfo ToInfo;886if (Arg.getKind() == TemplateArgument::Expression) {887ExpectedExpr E = import(FromInfo.getAsExpr());888if (!E)889return E.takeError();890ToInfo = TemplateArgumentLocInfo(*E);891} else if (Arg.getKind() == TemplateArgument::Type) {892if (auto TSIOrErr = import(FromInfo.getAsTypeSourceInfo()))893ToInfo = TemplateArgumentLocInfo(*TSIOrErr);894else895return TSIOrErr.takeError();896} else {897auto ToTemplateQualifierLocOrErr =898import(FromInfo.getTemplateQualifierLoc());899if (!ToTemplateQualifierLocOrErr)900return ToTemplateQualifierLocOrErr.takeError();901auto ToTemplateNameLocOrErr = import(FromInfo.getTemplateNameLoc());902if (!ToTemplateNameLocOrErr)903return ToTemplateNameLocOrErr.takeError();904auto ToTemplateEllipsisLocOrErr =905import(FromInfo.getTemplateEllipsisLoc());906if (!ToTemplateEllipsisLocOrErr)907return ToTemplateEllipsisLocOrErr.takeError();908ToInfo = TemplateArgumentLocInfo(909Importer.getToContext(), *ToTemplateQualifierLocOrErr,910*ToTemplateNameLocOrErr, *ToTemplateEllipsisLocOrErr);911}912913return TemplateArgumentLoc(Arg, ToInfo);914}915916template <>917Expected<DeclGroupRef> ASTNodeImporter::import(const DeclGroupRef &DG) {918if (DG.isNull())919return DeclGroupRef::Create(Importer.getToContext(), nullptr, 0);920size_t NumDecls = DG.end() - DG.begin();921SmallVector<Decl *, 1> ToDecls;922ToDecls.reserve(NumDecls);923for (Decl *FromD : DG) {924if (auto ToDOrErr = import(FromD))925ToDecls.push_back(*ToDOrErr);926else927return ToDOrErr.takeError();928}929return DeclGroupRef::Create(Importer.getToContext(),930ToDecls.begin(),931NumDecls);932}933934template <>935Expected<ASTNodeImporter::Designator>936ASTNodeImporter::import(const Designator &D) {937if (D.isFieldDesignator()) {938IdentifierInfo *ToFieldName = Importer.Import(D.getFieldName());939940ExpectedSLoc ToDotLocOrErr = import(D.getDotLoc());941if (!ToDotLocOrErr)942return ToDotLocOrErr.takeError();943944ExpectedSLoc ToFieldLocOrErr = import(D.getFieldLoc());945if (!ToFieldLocOrErr)946return ToFieldLocOrErr.takeError();947948return DesignatedInitExpr::Designator::CreateFieldDesignator(949ToFieldName, *ToDotLocOrErr, *ToFieldLocOrErr);950}951952ExpectedSLoc ToLBracketLocOrErr = import(D.getLBracketLoc());953if (!ToLBracketLocOrErr)954return ToLBracketLocOrErr.takeError();955956ExpectedSLoc ToRBracketLocOrErr = import(D.getRBracketLoc());957if (!ToRBracketLocOrErr)958return ToRBracketLocOrErr.takeError();959960if (D.isArrayDesignator())961return Designator::CreateArrayDesignator(D.getArrayIndex(),962*ToLBracketLocOrErr,963*ToRBracketLocOrErr);964965ExpectedSLoc ToEllipsisLocOrErr = import(D.getEllipsisLoc());966if (!ToEllipsisLocOrErr)967return ToEllipsisLocOrErr.takeError();968969assert(D.isArrayRangeDesignator());970return Designator::CreateArrayRangeDesignator(971D.getArrayIndex(), *ToLBracketLocOrErr, *ToEllipsisLocOrErr,972*ToRBracketLocOrErr);973}974975template <>976Expected<ConceptReference *> ASTNodeImporter::import(ConceptReference *From) {977Error Err = Error::success();978auto ToNNS = importChecked(Err, From->getNestedNameSpecifierLoc());979auto ToTemplateKWLoc = importChecked(Err, From->getTemplateKWLoc());980auto ToConceptNameLoc =981importChecked(Err, From->getConceptNameInfo().getLoc());982auto ToConceptName = importChecked(Err, From->getConceptNameInfo().getName());983auto ToFoundDecl = importChecked(Err, From->getFoundDecl());984auto ToNamedConcept = importChecked(Err, From->getNamedConcept());985if (Err)986return std::move(Err);987TemplateArgumentListInfo ToTAInfo;988const auto *ASTTemplateArgs = From->getTemplateArgsAsWritten();989if (ASTTemplateArgs)990if (Error Err = ImportTemplateArgumentListInfo(*ASTTemplateArgs, ToTAInfo))991return std::move(Err);992auto *ConceptRef = ConceptReference::Create(993Importer.getToContext(), ToNNS, ToTemplateKWLoc,994DeclarationNameInfo(ToConceptName, ToConceptNameLoc), ToFoundDecl,995ToNamedConcept,996ASTTemplateArgs ? ASTTemplateArgumentListInfo::Create(997Importer.getToContext(), ToTAInfo)998: nullptr);999return ConceptRef;1000}10011002template <>1003Expected<LambdaCapture> ASTNodeImporter::import(const LambdaCapture &From) {1004ValueDecl *Var = nullptr;1005if (From.capturesVariable()) {1006if (auto VarOrErr = import(From.getCapturedVar()))1007Var = *VarOrErr;1008else1009return VarOrErr.takeError();1010}10111012auto LocationOrErr = import(From.getLocation());1013if (!LocationOrErr)1014return LocationOrErr.takeError();10151016SourceLocation EllipsisLoc;1017if (From.isPackExpansion())1018if (Error Err = importInto(EllipsisLoc, From.getEllipsisLoc()))1019return std::move(Err);10201021return LambdaCapture(1022*LocationOrErr, From.isImplicit(), From.getCaptureKind(), Var,1023EllipsisLoc);1024}10251026template <typename T>1027bool ASTNodeImporter::hasSameVisibilityContextAndLinkage(T *Found, T *From) {1028if (Found->getLinkageInternal() != From->getLinkageInternal())1029return false;10301031if (From->hasExternalFormalLinkage())1032return Found->hasExternalFormalLinkage();1033if (Importer.GetFromTU(Found) != From->getTranslationUnitDecl())1034return false;1035if (From->isInAnonymousNamespace())1036return Found->isInAnonymousNamespace();1037else1038return !Found->isInAnonymousNamespace() &&1039!Found->hasExternalFormalLinkage();1040}10411042template <>1043bool ASTNodeImporter::hasSameVisibilityContextAndLinkage(TypedefNameDecl *Found,1044TypedefNameDecl *From) {1045if (Found->getLinkageInternal() != From->getLinkageInternal())1046return false;10471048if (From->isInAnonymousNamespace() && Found->isInAnonymousNamespace())1049return Importer.GetFromTU(Found) == From->getTranslationUnitDecl();1050return From->isInAnonymousNamespace() == Found->isInAnonymousNamespace();1051}10521053} // namespace clang10541055//----------------------------------------------------------------------------1056// Import Types1057//----------------------------------------------------------------------------10581059using namespace clang;10601061ExpectedType ASTNodeImporter::VisitType(const Type *T) {1062Importer.FromDiag(SourceLocation(), diag::err_unsupported_ast_node)1063<< T->getTypeClassName();1064return make_error<ASTImportError>(ASTImportError::UnsupportedConstruct);1065}10661067ExpectedType ASTNodeImporter::VisitAtomicType(const AtomicType *T){1068ExpectedType UnderlyingTypeOrErr = import(T->getValueType());1069if (!UnderlyingTypeOrErr)1070return UnderlyingTypeOrErr.takeError();10711072return Importer.getToContext().getAtomicType(*UnderlyingTypeOrErr);1073}10741075ExpectedType ASTNodeImporter::VisitBuiltinType(const BuiltinType *T) {1076switch (T->getKind()) {1077#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \1078case BuiltinType::Id: \1079return Importer.getToContext().SingletonId;1080#include "clang/Basic/OpenCLImageTypes.def"1081#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \1082case BuiltinType::Id: \1083return Importer.getToContext().Id##Ty;1084#include "clang/Basic/OpenCLExtensionTypes.def"1085#define SVE_TYPE(Name, Id, SingletonId) \1086case BuiltinType::Id: \1087return Importer.getToContext().SingletonId;1088#include "clang/Basic/AArch64SVEACLETypes.def"1089#define PPC_VECTOR_TYPE(Name, Id, Size) \1090case BuiltinType::Id: \1091return Importer.getToContext().Id##Ty;1092#include "clang/Basic/PPCTypes.def"1093#define RVV_TYPE(Name, Id, SingletonId) \1094case BuiltinType::Id: \1095return Importer.getToContext().SingletonId;1096#include "clang/Basic/RISCVVTypes.def"1097#define WASM_TYPE(Name, Id, SingletonId) \1098case BuiltinType::Id: \1099return Importer.getToContext().SingletonId;1100#include "clang/Basic/WebAssemblyReferenceTypes.def"1101#define AMDGPU_TYPE(Name, Id, SingletonId) \1102case BuiltinType::Id: \1103return Importer.getToContext().SingletonId;1104#include "clang/Basic/AMDGPUTypes.def"1105#define SHARED_SINGLETON_TYPE(Expansion)1106#define BUILTIN_TYPE(Id, SingletonId) \1107case BuiltinType::Id: return Importer.getToContext().SingletonId;1108#include "clang/AST/BuiltinTypes.def"11091110// FIXME: for Char16, Char32, and NullPtr, make sure that the "to"1111// context supports C++.11121113// FIXME: for ObjCId, ObjCClass, and ObjCSel, make sure that the "to"1114// context supports ObjC.11151116case BuiltinType::Char_U:1117// The context we're importing from has an unsigned 'char'. If we're1118// importing into a context with a signed 'char', translate to1119// 'unsigned char' instead.1120if (Importer.getToContext().getLangOpts().CharIsSigned)1121return Importer.getToContext().UnsignedCharTy;11221123return Importer.getToContext().CharTy;11241125case BuiltinType::Char_S:1126// The context we're importing from has an unsigned 'char'. If we're1127// importing into a context with a signed 'char', translate to1128// 'unsigned char' instead.1129if (!Importer.getToContext().getLangOpts().CharIsSigned)1130return Importer.getToContext().SignedCharTy;11311132return Importer.getToContext().CharTy;11331134case BuiltinType::WChar_S:1135case BuiltinType::WChar_U:1136// FIXME: If not in C++, shall we translate to the C equivalent of1137// wchar_t?1138return Importer.getToContext().WCharTy;1139}11401141llvm_unreachable("Invalid BuiltinType Kind!");1142}11431144ExpectedType ASTNodeImporter::VisitDecayedType(const DecayedType *T) {1145ExpectedType ToOriginalTypeOrErr = import(T->getOriginalType());1146if (!ToOriginalTypeOrErr)1147return ToOriginalTypeOrErr.takeError();11481149return Importer.getToContext().getDecayedType(*ToOriginalTypeOrErr);1150}11511152ExpectedType ASTNodeImporter::VisitComplexType(const ComplexType *T) {1153ExpectedType ToElementTypeOrErr = import(T->getElementType());1154if (!ToElementTypeOrErr)1155return ToElementTypeOrErr.takeError();11561157return Importer.getToContext().getComplexType(*ToElementTypeOrErr);1158}11591160ExpectedType ASTNodeImporter::VisitPointerType(const PointerType *T) {1161ExpectedType ToPointeeTypeOrErr = import(T->getPointeeType());1162if (!ToPointeeTypeOrErr)1163return ToPointeeTypeOrErr.takeError();11641165return Importer.getToContext().getPointerType(*ToPointeeTypeOrErr);1166}11671168ExpectedType ASTNodeImporter::VisitBlockPointerType(const BlockPointerType *T) {1169// FIXME: Check for blocks support in "to" context.1170ExpectedType ToPointeeTypeOrErr = import(T->getPointeeType());1171if (!ToPointeeTypeOrErr)1172return ToPointeeTypeOrErr.takeError();11731174return Importer.getToContext().getBlockPointerType(*ToPointeeTypeOrErr);1175}11761177ExpectedType1178ASTNodeImporter::VisitLValueReferenceType(const LValueReferenceType *T) {1179// FIXME: Check for C++ support in "to" context.1180ExpectedType ToPointeeTypeOrErr = import(T->getPointeeTypeAsWritten());1181if (!ToPointeeTypeOrErr)1182return ToPointeeTypeOrErr.takeError();11831184return Importer.getToContext().getLValueReferenceType(*ToPointeeTypeOrErr);1185}11861187ExpectedType1188ASTNodeImporter::VisitRValueReferenceType(const RValueReferenceType *T) {1189// FIXME: Check for C++0x support in "to" context.1190ExpectedType ToPointeeTypeOrErr = import(T->getPointeeTypeAsWritten());1191if (!ToPointeeTypeOrErr)1192return ToPointeeTypeOrErr.takeError();11931194return Importer.getToContext().getRValueReferenceType(*ToPointeeTypeOrErr);1195}11961197ExpectedType1198ASTNodeImporter::VisitMemberPointerType(const MemberPointerType *T) {1199// FIXME: Check for C++ support in "to" context.1200ExpectedType ToPointeeTypeOrErr = import(T->getPointeeType());1201if (!ToPointeeTypeOrErr)1202return ToPointeeTypeOrErr.takeError();12031204ExpectedTypePtr ClassTypeOrErr = import(T->getClass());1205if (!ClassTypeOrErr)1206return ClassTypeOrErr.takeError();12071208return Importer.getToContext().getMemberPointerType(*ToPointeeTypeOrErr,1209*ClassTypeOrErr);1210}12111212ExpectedType1213ASTNodeImporter::VisitConstantArrayType(const ConstantArrayType *T) {1214Error Err = Error::success();1215auto ToElementType = importChecked(Err, T->getElementType());1216auto ToSizeExpr = importChecked(Err, T->getSizeExpr());1217if (Err)1218return std::move(Err);12191220return Importer.getToContext().getConstantArrayType(1221ToElementType, T->getSize(), ToSizeExpr, T->getSizeModifier(),1222T->getIndexTypeCVRQualifiers());1223}12241225ExpectedType1226ASTNodeImporter::VisitArrayParameterType(const ArrayParameterType *T) {1227ExpectedType ToArrayTypeOrErr = VisitConstantArrayType(T);1228if (!ToArrayTypeOrErr)1229return ToArrayTypeOrErr.takeError();12301231return Importer.getToContext().getArrayParameterType(*ToArrayTypeOrErr);1232}12331234ExpectedType1235ASTNodeImporter::VisitIncompleteArrayType(const IncompleteArrayType *T) {1236ExpectedType ToElementTypeOrErr = import(T->getElementType());1237if (!ToElementTypeOrErr)1238return ToElementTypeOrErr.takeError();12391240return Importer.getToContext().getIncompleteArrayType(*ToElementTypeOrErr,1241T->getSizeModifier(),1242T->getIndexTypeCVRQualifiers());1243}12441245ExpectedType1246ASTNodeImporter::VisitVariableArrayType(const VariableArrayType *T) {1247Error Err = Error::success();1248QualType ToElementType = importChecked(Err, T->getElementType());1249Expr *ToSizeExpr = importChecked(Err, T->getSizeExpr());1250SourceRange ToBracketsRange = importChecked(Err, T->getBracketsRange());1251if (Err)1252return std::move(Err);1253return Importer.getToContext().getVariableArrayType(1254ToElementType, ToSizeExpr, T->getSizeModifier(),1255T->getIndexTypeCVRQualifiers(), ToBracketsRange);1256}12571258ExpectedType ASTNodeImporter::VisitDependentSizedArrayType(1259const DependentSizedArrayType *T) {1260Error Err = Error::success();1261QualType ToElementType = importChecked(Err, T->getElementType());1262Expr *ToSizeExpr = importChecked(Err, T->getSizeExpr());1263SourceRange ToBracketsRange = importChecked(Err, T->getBracketsRange());1264if (Err)1265return std::move(Err);1266// SizeExpr may be null if size is not specified directly.1267// For example, 'int a[]'.12681269return Importer.getToContext().getDependentSizedArrayType(1270ToElementType, ToSizeExpr, T->getSizeModifier(),1271T->getIndexTypeCVRQualifiers(), ToBracketsRange);1272}12731274ExpectedType ASTNodeImporter::VisitDependentSizedExtVectorType(1275const DependentSizedExtVectorType *T) {1276Error Err = Error::success();1277QualType ToElementType = importChecked(Err, T->getElementType());1278Expr *ToSizeExpr = importChecked(Err, T->getSizeExpr());1279SourceLocation ToAttrLoc = importChecked(Err, T->getAttributeLoc());1280if (Err)1281return std::move(Err);1282return Importer.getToContext().getDependentSizedExtVectorType(1283ToElementType, ToSizeExpr, ToAttrLoc);1284}12851286ExpectedType ASTNodeImporter::VisitVectorType(const VectorType *T) {1287ExpectedType ToElementTypeOrErr = import(T->getElementType());1288if (!ToElementTypeOrErr)1289return ToElementTypeOrErr.takeError();12901291return Importer.getToContext().getVectorType(*ToElementTypeOrErr,1292T->getNumElements(),1293T->getVectorKind());1294}12951296ExpectedType ASTNodeImporter::VisitExtVectorType(const ExtVectorType *T) {1297ExpectedType ToElementTypeOrErr = import(T->getElementType());1298if (!ToElementTypeOrErr)1299return ToElementTypeOrErr.takeError();13001301return Importer.getToContext().getExtVectorType(*ToElementTypeOrErr,1302T->getNumElements());1303}13041305ExpectedType1306ASTNodeImporter::VisitFunctionNoProtoType(const FunctionNoProtoType *T) {1307// FIXME: What happens if we're importing a function without a prototype1308// into C++? Should we make it variadic?1309ExpectedType ToReturnTypeOrErr = import(T->getReturnType());1310if (!ToReturnTypeOrErr)1311return ToReturnTypeOrErr.takeError();13121313return Importer.getToContext().getFunctionNoProtoType(*ToReturnTypeOrErr,1314T->getExtInfo());1315}13161317ExpectedType1318ASTNodeImporter::VisitFunctionProtoType(const FunctionProtoType *T) {1319ExpectedType ToReturnTypeOrErr = import(T->getReturnType());1320if (!ToReturnTypeOrErr)1321return ToReturnTypeOrErr.takeError();13221323// Import argument types1324SmallVector<QualType, 4> ArgTypes;1325for (const auto &A : T->param_types()) {1326ExpectedType TyOrErr = import(A);1327if (!TyOrErr)1328return TyOrErr.takeError();1329ArgTypes.push_back(*TyOrErr);1330}13311332// Import exception types1333SmallVector<QualType, 4> ExceptionTypes;1334for (const auto &E : T->exceptions()) {1335ExpectedType TyOrErr = import(E);1336if (!TyOrErr)1337return TyOrErr.takeError();1338ExceptionTypes.push_back(*TyOrErr);1339}13401341FunctionProtoType::ExtProtoInfo FromEPI = T->getExtProtoInfo();1342Error Err = Error::success();1343FunctionProtoType::ExtProtoInfo ToEPI;1344ToEPI.ExtInfo = FromEPI.ExtInfo;1345ToEPI.Variadic = FromEPI.Variadic;1346ToEPI.HasTrailingReturn = FromEPI.HasTrailingReturn;1347ToEPI.TypeQuals = FromEPI.TypeQuals;1348ToEPI.RefQualifier = FromEPI.RefQualifier;1349ToEPI.ExceptionSpec.Type = FromEPI.ExceptionSpec.Type;1350ToEPI.ExceptionSpec.NoexceptExpr =1351importChecked(Err, FromEPI.ExceptionSpec.NoexceptExpr);1352ToEPI.ExceptionSpec.SourceDecl =1353importChecked(Err, FromEPI.ExceptionSpec.SourceDecl);1354ToEPI.ExceptionSpec.SourceTemplate =1355importChecked(Err, FromEPI.ExceptionSpec.SourceTemplate);1356ToEPI.ExceptionSpec.Exceptions = ExceptionTypes;13571358if (Err)1359return std::move(Err);13601361return Importer.getToContext().getFunctionType(1362*ToReturnTypeOrErr, ArgTypes, ToEPI);1363}13641365ExpectedType ASTNodeImporter::VisitUnresolvedUsingType(1366const UnresolvedUsingType *T) {1367Error Err = Error::success();1368auto ToD = importChecked(Err, T->getDecl());1369auto ToPrevD = importChecked(Err, T->getDecl()->getPreviousDecl());1370if (Err)1371return std::move(Err);13721373return Importer.getToContext().getTypeDeclType(1374ToD, cast_or_null<TypeDecl>(ToPrevD));1375}13761377ExpectedType ASTNodeImporter::VisitParenType(const ParenType *T) {1378ExpectedType ToInnerTypeOrErr = import(T->getInnerType());1379if (!ToInnerTypeOrErr)1380return ToInnerTypeOrErr.takeError();13811382return Importer.getToContext().getParenType(*ToInnerTypeOrErr);1383}13841385ExpectedType1386ASTNodeImporter::VisitPackIndexingType(clang::PackIndexingType const *T) {13871388ExpectedType Pattern = import(T->getPattern());1389if (!Pattern)1390return Pattern.takeError();1391ExpectedExpr Index = import(T->getIndexExpr());1392if (!Index)1393return Index.takeError();1394return Importer.getToContext().getPackIndexingType(*Pattern, *Index);1395}13961397ExpectedType ASTNodeImporter::VisitTypedefType(const TypedefType *T) {1398Expected<TypedefNameDecl *> ToDeclOrErr = import(T->getDecl());1399if (!ToDeclOrErr)1400return ToDeclOrErr.takeError();14011402TypedefNameDecl *ToDecl = *ToDeclOrErr;1403if (ToDecl->getTypeForDecl())1404return QualType(ToDecl->getTypeForDecl(), 0);14051406ExpectedType ToUnderlyingTypeOrErr = import(T->desugar());1407if (!ToUnderlyingTypeOrErr)1408return ToUnderlyingTypeOrErr.takeError();14091410return Importer.getToContext().getTypedefType(ToDecl, *ToUnderlyingTypeOrErr);1411}14121413ExpectedType ASTNodeImporter::VisitTypeOfExprType(const TypeOfExprType *T) {1414ExpectedExpr ToExprOrErr = import(T->getUnderlyingExpr());1415if (!ToExprOrErr)1416return ToExprOrErr.takeError();1417return Importer.getToContext().getTypeOfExprType(*ToExprOrErr, T->getKind());1418}14191420ExpectedType ASTNodeImporter::VisitTypeOfType(const TypeOfType *T) {1421ExpectedType ToUnderlyingTypeOrErr = import(T->getUnmodifiedType());1422if (!ToUnderlyingTypeOrErr)1423return ToUnderlyingTypeOrErr.takeError();1424return Importer.getToContext().getTypeOfType(*ToUnderlyingTypeOrErr,1425T->getKind());1426}14271428ExpectedType ASTNodeImporter::VisitUsingType(const UsingType *T) {1429Expected<UsingShadowDecl *> FoundOrErr = import(T->getFoundDecl());1430if (!FoundOrErr)1431return FoundOrErr.takeError();1432Expected<QualType> UnderlyingOrErr = import(T->getUnderlyingType());1433if (!UnderlyingOrErr)1434return UnderlyingOrErr.takeError();14351436return Importer.getToContext().getUsingType(*FoundOrErr, *UnderlyingOrErr);1437}14381439ExpectedType ASTNodeImporter::VisitDecltypeType(const DecltypeType *T) {1440// FIXME: Make sure that the "to" context supports C++0x!1441ExpectedExpr ToExprOrErr = import(T->getUnderlyingExpr());1442if (!ToExprOrErr)1443return ToExprOrErr.takeError();14441445ExpectedType ToUnderlyingTypeOrErr = import(T->getUnderlyingType());1446if (!ToUnderlyingTypeOrErr)1447return ToUnderlyingTypeOrErr.takeError();14481449return Importer.getToContext().getDecltypeType(1450*ToExprOrErr, *ToUnderlyingTypeOrErr);1451}14521453ExpectedType1454ASTNodeImporter::VisitUnaryTransformType(const UnaryTransformType *T) {1455ExpectedType ToBaseTypeOrErr = import(T->getBaseType());1456if (!ToBaseTypeOrErr)1457return ToBaseTypeOrErr.takeError();14581459ExpectedType ToUnderlyingTypeOrErr = import(T->getUnderlyingType());1460if (!ToUnderlyingTypeOrErr)1461return ToUnderlyingTypeOrErr.takeError();14621463return Importer.getToContext().getUnaryTransformType(1464*ToBaseTypeOrErr, *ToUnderlyingTypeOrErr, T->getUTTKind());1465}14661467ExpectedType ASTNodeImporter::VisitAutoType(const AutoType *T) {1468// FIXME: Make sure that the "to" context supports C++11!1469ExpectedType ToDeducedTypeOrErr = import(T->getDeducedType());1470if (!ToDeducedTypeOrErr)1471return ToDeducedTypeOrErr.takeError();14721473ExpectedDecl ToTypeConstraintConcept = import(T->getTypeConstraintConcept());1474if (!ToTypeConstraintConcept)1475return ToTypeConstraintConcept.takeError();14761477SmallVector<TemplateArgument, 2> ToTemplateArgs;1478if (Error Err = ImportTemplateArguments(T->getTypeConstraintArguments(),1479ToTemplateArgs))1480return std::move(Err);14811482return Importer.getToContext().getAutoType(1483*ToDeducedTypeOrErr, T->getKeyword(), /*IsDependent*/false,1484/*IsPack=*/false, cast_or_null<ConceptDecl>(*ToTypeConstraintConcept),1485ToTemplateArgs);1486}14871488ExpectedType ASTNodeImporter::VisitDeducedTemplateSpecializationType(1489const DeducedTemplateSpecializationType *T) {1490// FIXME: Make sure that the "to" context supports C++17!1491Expected<TemplateName> ToTemplateNameOrErr = import(T->getTemplateName());1492if (!ToTemplateNameOrErr)1493return ToTemplateNameOrErr.takeError();1494ExpectedType ToDeducedTypeOrErr = import(T->getDeducedType());1495if (!ToDeducedTypeOrErr)1496return ToDeducedTypeOrErr.takeError();14971498return Importer.getToContext().getDeducedTemplateSpecializationType(1499*ToTemplateNameOrErr, *ToDeducedTypeOrErr, T->isDependentType());1500}15011502ExpectedType ASTNodeImporter::VisitInjectedClassNameType(1503const InjectedClassNameType *T) {1504Expected<CXXRecordDecl *> ToDeclOrErr = import(T->getDecl());1505if (!ToDeclOrErr)1506return ToDeclOrErr.takeError();15071508// The InjectedClassNameType is created in VisitRecordDecl when the1509// T->getDecl() is imported. Here we can return the existing type.1510const Type *Ty = (*ToDeclOrErr)->getTypeForDecl();1511assert(isa_and_nonnull<InjectedClassNameType>(Ty));1512return QualType(Ty, 0);1513}15141515ExpectedType ASTNodeImporter::VisitRecordType(const RecordType *T) {1516Expected<RecordDecl *> ToDeclOrErr = import(T->getDecl());1517if (!ToDeclOrErr)1518return ToDeclOrErr.takeError();15191520return Importer.getToContext().getTagDeclType(*ToDeclOrErr);1521}15221523ExpectedType ASTNodeImporter::VisitEnumType(const EnumType *T) {1524Expected<EnumDecl *> ToDeclOrErr = import(T->getDecl());1525if (!ToDeclOrErr)1526return ToDeclOrErr.takeError();15271528return Importer.getToContext().getTagDeclType(*ToDeclOrErr);1529}15301531ExpectedType ASTNodeImporter::VisitAttributedType(const AttributedType *T) {1532ExpectedType ToModifiedTypeOrErr = import(T->getModifiedType());1533if (!ToModifiedTypeOrErr)1534return ToModifiedTypeOrErr.takeError();1535ExpectedType ToEquivalentTypeOrErr = import(T->getEquivalentType());1536if (!ToEquivalentTypeOrErr)1537return ToEquivalentTypeOrErr.takeError();15381539return Importer.getToContext().getAttributedType(T->getAttrKind(),1540*ToModifiedTypeOrErr, *ToEquivalentTypeOrErr);1541}15421543ExpectedType1544ASTNodeImporter::VisitCountAttributedType(const CountAttributedType *T) {1545ExpectedType ToWrappedTypeOrErr = import(T->desugar());1546if (!ToWrappedTypeOrErr)1547return ToWrappedTypeOrErr.takeError();15481549Error Err = Error::success();1550Expr *CountExpr = importChecked(Err, T->getCountExpr());15511552SmallVector<TypeCoupledDeclRefInfo, 1> CoupledDecls;1553for (const TypeCoupledDeclRefInfo &TI : T->dependent_decls()) {1554Expected<ValueDecl *> ToDeclOrErr = import(TI.getDecl());1555if (!ToDeclOrErr)1556return ToDeclOrErr.takeError();1557CoupledDecls.emplace_back(*ToDeclOrErr, TI.isDeref());1558}15591560return Importer.getToContext().getCountAttributedType(1561*ToWrappedTypeOrErr, CountExpr, T->isCountInBytes(), T->isOrNull(),1562ArrayRef(CoupledDecls.data(), CoupledDecls.size()));1563}15641565ExpectedType ASTNodeImporter::VisitTemplateTypeParmType(1566const TemplateTypeParmType *T) {1567Expected<TemplateTypeParmDecl *> ToDeclOrErr = import(T->getDecl());1568if (!ToDeclOrErr)1569return ToDeclOrErr.takeError();15701571return Importer.getToContext().getTemplateTypeParmType(1572T->getDepth(), T->getIndex(), T->isParameterPack(), *ToDeclOrErr);1573}15741575ExpectedType ASTNodeImporter::VisitSubstTemplateTypeParmType(1576const SubstTemplateTypeParmType *T) {1577Expected<Decl *> ReplacedOrErr = import(T->getAssociatedDecl());1578if (!ReplacedOrErr)1579return ReplacedOrErr.takeError();15801581ExpectedType ToReplacementTypeOrErr = import(T->getReplacementType());1582if (!ToReplacementTypeOrErr)1583return ToReplacementTypeOrErr.takeError();15841585return Importer.getToContext().getSubstTemplateTypeParmType(1586*ToReplacementTypeOrErr, *ReplacedOrErr, T->getIndex(),1587T->getPackIndex());1588}15891590ExpectedType ASTNodeImporter::VisitSubstTemplateTypeParmPackType(1591const SubstTemplateTypeParmPackType *T) {1592Expected<Decl *> ReplacedOrErr = import(T->getAssociatedDecl());1593if (!ReplacedOrErr)1594return ReplacedOrErr.takeError();15951596Expected<TemplateArgument> ToArgumentPack = import(T->getArgumentPack());1597if (!ToArgumentPack)1598return ToArgumentPack.takeError();15991600return Importer.getToContext().getSubstTemplateTypeParmPackType(1601*ReplacedOrErr, T->getIndex(), T->getFinal(), *ToArgumentPack);1602}16031604ExpectedType ASTNodeImporter::VisitTemplateSpecializationType(1605const TemplateSpecializationType *T) {1606auto ToTemplateOrErr = import(T->getTemplateName());1607if (!ToTemplateOrErr)1608return ToTemplateOrErr.takeError();16091610SmallVector<TemplateArgument, 2> ToTemplateArgs;1611if (Error Err =1612ImportTemplateArguments(T->template_arguments(), ToTemplateArgs))1613return std::move(Err);16141615QualType ToCanonType;1616if (!T->isCanonicalUnqualified()) {1617QualType FromCanonType1618= Importer.getFromContext().getCanonicalType(QualType(T, 0));1619if (ExpectedType TyOrErr = import(FromCanonType))1620ToCanonType = *TyOrErr;1621else1622return TyOrErr.takeError();1623}1624return Importer.getToContext().getTemplateSpecializationType(*ToTemplateOrErr,1625ToTemplateArgs,1626ToCanonType);1627}16281629ExpectedType ASTNodeImporter::VisitElaboratedType(const ElaboratedType *T) {1630// Note: the qualifier in an ElaboratedType is optional.1631auto ToQualifierOrErr = import(T->getQualifier());1632if (!ToQualifierOrErr)1633return ToQualifierOrErr.takeError();16341635ExpectedType ToNamedTypeOrErr = import(T->getNamedType());1636if (!ToNamedTypeOrErr)1637return ToNamedTypeOrErr.takeError();16381639Expected<TagDecl *> ToOwnedTagDeclOrErr = import(T->getOwnedTagDecl());1640if (!ToOwnedTagDeclOrErr)1641return ToOwnedTagDeclOrErr.takeError();16421643return Importer.getToContext().getElaboratedType(T->getKeyword(),1644*ToQualifierOrErr,1645*ToNamedTypeOrErr,1646*ToOwnedTagDeclOrErr);1647}16481649ExpectedType1650ASTNodeImporter::VisitPackExpansionType(const PackExpansionType *T) {1651ExpectedType ToPatternOrErr = import(T->getPattern());1652if (!ToPatternOrErr)1653return ToPatternOrErr.takeError();16541655return Importer.getToContext().getPackExpansionType(*ToPatternOrErr,1656T->getNumExpansions(),1657/*ExpactPack=*/false);1658}16591660ExpectedType ASTNodeImporter::VisitDependentTemplateSpecializationType(1661const DependentTemplateSpecializationType *T) {1662auto ToQualifierOrErr = import(T->getQualifier());1663if (!ToQualifierOrErr)1664return ToQualifierOrErr.takeError();16651666IdentifierInfo *ToName = Importer.Import(T->getIdentifier());16671668SmallVector<TemplateArgument, 2> ToPack;1669ToPack.reserve(T->template_arguments().size());1670if (Error Err = ImportTemplateArguments(T->template_arguments(), ToPack))1671return std::move(Err);16721673return Importer.getToContext().getDependentTemplateSpecializationType(1674T->getKeyword(), *ToQualifierOrErr, ToName, ToPack);1675}16761677ExpectedType1678ASTNodeImporter::VisitDependentNameType(const DependentNameType *T) {1679auto ToQualifierOrErr = import(T->getQualifier());1680if (!ToQualifierOrErr)1681return ToQualifierOrErr.takeError();16821683IdentifierInfo *Name = Importer.Import(T->getIdentifier());16841685QualType Canon;1686if (T != T->getCanonicalTypeInternal().getTypePtr()) {1687if (ExpectedType TyOrErr = import(T->getCanonicalTypeInternal()))1688Canon = (*TyOrErr).getCanonicalType();1689else1690return TyOrErr.takeError();1691}16921693return Importer.getToContext().getDependentNameType(T->getKeyword(),1694*ToQualifierOrErr,1695Name, Canon);1696}16971698ExpectedType1699ASTNodeImporter::VisitObjCInterfaceType(const ObjCInterfaceType *T) {1700Expected<ObjCInterfaceDecl *> ToDeclOrErr = import(T->getDecl());1701if (!ToDeclOrErr)1702return ToDeclOrErr.takeError();17031704return Importer.getToContext().getObjCInterfaceType(*ToDeclOrErr);1705}17061707ExpectedType ASTNodeImporter::VisitObjCObjectType(const ObjCObjectType *T) {1708ExpectedType ToBaseTypeOrErr = import(T->getBaseType());1709if (!ToBaseTypeOrErr)1710return ToBaseTypeOrErr.takeError();17111712SmallVector<QualType, 4> TypeArgs;1713for (auto TypeArg : T->getTypeArgsAsWritten()) {1714if (ExpectedType TyOrErr = import(TypeArg))1715TypeArgs.push_back(*TyOrErr);1716else1717return TyOrErr.takeError();1718}17191720SmallVector<ObjCProtocolDecl *, 4> Protocols;1721for (auto *P : T->quals()) {1722if (Expected<ObjCProtocolDecl *> ProtocolOrErr = import(P))1723Protocols.push_back(*ProtocolOrErr);1724else1725return ProtocolOrErr.takeError();17261727}17281729return Importer.getToContext().getObjCObjectType(*ToBaseTypeOrErr, TypeArgs,1730Protocols,1731T->isKindOfTypeAsWritten());1732}17331734ExpectedType1735ASTNodeImporter::VisitObjCObjectPointerType(const ObjCObjectPointerType *T) {1736ExpectedType ToPointeeTypeOrErr = import(T->getPointeeType());1737if (!ToPointeeTypeOrErr)1738return ToPointeeTypeOrErr.takeError();17391740return Importer.getToContext().getObjCObjectPointerType(*ToPointeeTypeOrErr);1741}17421743ExpectedType1744ASTNodeImporter::VisitMacroQualifiedType(const MacroQualifiedType *T) {1745ExpectedType ToUnderlyingTypeOrErr = import(T->getUnderlyingType());1746if (!ToUnderlyingTypeOrErr)1747return ToUnderlyingTypeOrErr.takeError();17481749IdentifierInfo *ToIdentifier = Importer.Import(T->getMacroIdentifier());1750return Importer.getToContext().getMacroQualifiedType(*ToUnderlyingTypeOrErr,1751ToIdentifier);1752}17531754ExpectedType clang::ASTNodeImporter::VisitAdjustedType(const AdjustedType *T) {1755Error Err = Error::success();1756QualType ToOriginalType = importChecked(Err, T->getOriginalType());1757QualType ToAdjustedType = importChecked(Err, T->getAdjustedType());1758if (Err)1759return std::move(Err);17601761return Importer.getToContext().getAdjustedType(ToOriginalType,1762ToAdjustedType);1763}17641765ExpectedType clang::ASTNodeImporter::VisitBitIntType(const BitIntType *T) {1766return Importer.getToContext().getBitIntType(T->isUnsigned(),1767T->getNumBits());1768}17691770ExpectedType clang::ASTNodeImporter::VisitBTFTagAttributedType(1771const clang::BTFTagAttributedType *T) {1772Error Err = Error::success();1773const BTFTypeTagAttr *ToBTFAttr = importChecked(Err, T->getAttr());1774QualType ToWrappedType = importChecked(Err, T->getWrappedType());1775if (Err)1776return std::move(Err);17771778return Importer.getToContext().getBTFTagAttributedType(ToBTFAttr,1779ToWrappedType);1780}17811782ExpectedType clang::ASTNodeImporter::VisitConstantMatrixType(1783const clang::ConstantMatrixType *T) {1784ExpectedType ToElementTypeOrErr = import(T->getElementType());1785if (!ToElementTypeOrErr)1786return ToElementTypeOrErr.takeError();17871788return Importer.getToContext().getConstantMatrixType(1789*ToElementTypeOrErr, T->getNumRows(), T->getNumColumns());1790}17911792ExpectedType clang::ASTNodeImporter::VisitDependentAddressSpaceType(1793const clang::DependentAddressSpaceType *T) {1794Error Err = Error::success();1795QualType ToPointeeType = importChecked(Err, T->getPointeeType());1796Expr *ToAddrSpaceExpr = importChecked(Err, T->getAddrSpaceExpr());1797SourceLocation ToAttrLoc = importChecked(Err, T->getAttributeLoc());1798if (Err)1799return std::move(Err);18001801return Importer.getToContext().getDependentAddressSpaceType(1802ToPointeeType, ToAddrSpaceExpr, ToAttrLoc);1803}18041805ExpectedType clang::ASTNodeImporter::VisitDependentBitIntType(1806const clang::DependentBitIntType *T) {1807ExpectedExpr ToNumBitsExprOrErr = import(T->getNumBitsExpr());1808if (!ToNumBitsExprOrErr)1809return ToNumBitsExprOrErr.takeError();1810return Importer.getToContext().getDependentBitIntType(T->isUnsigned(),1811*ToNumBitsExprOrErr);1812}18131814ExpectedType clang::ASTNodeImporter::VisitDependentSizedMatrixType(1815const clang::DependentSizedMatrixType *T) {1816Error Err = Error::success();1817QualType ToElementType = importChecked(Err, T->getElementType());1818Expr *ToRowExpr = importChecked(Err, T->getRowExpr());1819Expr *ToColumnExpr = importChecked(Err, T->getColumnExpr());1820SourceLocation ToAttrLoc = importChecked(Err, T->getAttributeLoc());1821if (Err)1822return std::move(Err);18231824return Importer.getToContext().getDependentSizedMatrixType(1825ToElementType, ToRowExpr, ToColumnExpr, ToAttrLoc);1826}18271828ExpectedType clang::ASTNodeImporter::VisitDependentVectorType(1829const clang::DependentVectorType *T) {1830Error Err = Error::success();1831QualType ToElementType = importChecked(Err, T->getElementType());1832Expr *ToSizeExpr = importChecked(Err, T->getSizeExpr());1833SourceLocation ToAttrLoc = importChecked(Err, T->getAttributeLoc());1834if (Err)1835return std::move(Err);18361837return Importer.getToContext().getDependentVectorType(1838ToElementType, ToSizeExpr, ToAttrLoc, T->getVectorKind());1839}18401841ExpectedType clang::ASTNodeImporter::VisitObjCTypeParamType(1842const clang::ObjCTypeParamType *T) {1843Expected<ObjCTypeParamDecl *> ToDeclOrErr = import(T->getDecl());1844if (!ToDeclOrErr)1845return ToDeclOrErr.takeError();18461847SmallVector<ObjCProtocolDecl *, 4> ToProtocols;1848for (ObjCProtocolDecl *FromProtocol : T->getProtocols()) {1849Expected<ObjCProtocolDecl *> ToProtocolOrErr = import(FromProtocol);1850if (!ToProtocolOrErr)1851return ToProtocolOrErr.takeError();1852ToProtocols.push_back(*ToProtocolOrErr);1853}18541855return Importer.getToContext().getObjCTypeParamType(*ToDeclOrErr,1856ToProtocols);1857}18581859ExpectedType clang::ASTNodeImporter::VisitPipeType(const clang::PipeType *T) {1860ExpectedType ToElementTypeOrErr = import(T->getElementType());1861if (!ToElementTypeOrErr)1862return ToElementTypeOrErr.takeError();18631864ASTContext &ToCtx = Importer.getToContext();1865if (T->isReadOnly())1866return ToCtx.getReadPipeType(*ToElementTypeOrErr);1867else1868return ToCtx.getWritePipeType(*ToElementTypeOrErr);1869}18701871//----------------------------------------------------------------------------1872// Import Declarations1873//----------------------------------------------------------------------------1874Error ASTNodeImporter::ImportDeclParts(1875NamedDecl *D, DeclContext *&DC, DeclContext *&LexicalDC,1876DeclarationName &Name, NamedDecl *&ToD, SourceLocation &Loc) {1877// Check if RecordDecl is in FunctionDecl parameters to avoid infinite loop.1878// example: int struct_in_proto(struct data_t{int a;int b;} *d);1879// FIXME: We could support these constructs by importing a different type of1880// this parameter and by importing the original type of the parameter only1881// after the FunctionDecl is created. See1882// VisitFunctionDecl::UsedDifferentProtoType.1883DeclContext *OrigDC = D->getDeclContext();1884FunctionDecl *FunDecl;1885if (isa<RecordDecl>(D) && (FunDecl = dyn_cast<FunctionDecl>(OrigDC)) &&1886FunDecl->hasBody()) {1887auto getLeafPointeeType = [](const Type *T) {1888while (T->isPointerType() || T->isArrayType()) {1889T = T->getPointeeOrArrayElementType();1890}1891return T;1892};1893for (const ParmVarDecl *P : FunDecl->parameters()) {1894const Type *LeafT =1895getLeafPointeeType(P->getType().getCanonicalType().getTypePtr());1896auto *RT = dyn_cast<RecordType>(LeafT);1897if (RT && RT->getDecl() == D) {1898Importer.FromDiag(D->getLocation(), diag::err_unsupported_ast_node)1899<< D->getDeclKindName();1900return make_error<ASTImportError>(ASTImportError::UnsupportedConstruct);1901}1902}1903}19041905// Import the context of this declaration.1906if (Error Err = ImportDeclContext(D, DC, LexicalDC))1907return Err;19081909// Import the name of this declaration.1910if (Error Err = importInto(Name, D->getDeclName()))1911return Err;19121913// Import the location of this declaration.1914if (Error Err = importInto(Loc, D->getLocation()))1915return Err;19161917ToD = cast_or_null<NamedDecl>(Importer.GetAlreadyImportedOrNull(D));1918if (ToD)1919if (Error Err = ASTNodeImporter(*this).ImportDefinitionIfNeeded(D, ToD))1920return Err;19211922return Error::success();1923}19241925Error ASTNodeImporter::ImportDeclParts(NamedDecl *D, DeclarationName &Name,1926NamedDecl *&ToD, SourceLocation &Loc) {19271928// Import the name of this declaration.1929if (Error Err = importInto(Name, D->getDeclName()))1930return Err;19311932// Import the location of this declaration.1933if (Error Err = importInto(Loc, D->getLocation()))1934return Err;19351936ToD = cast_or_null<NamedDecl>(Importer.GetAlreadyImportedOrNull(D));1937if (ToD)1938if (Error Err = ASTNodeImporter(*this).ImportDefinitionIfNeeded(D, ToD))1939return Err;19401941return Error::success();1942}19431944Error ASTNodeImporter::ImportDefinitionIfNeeded(Decl *FromD, Decl *ToD) {1945if (!FromD)1946return Error::success();19471948if (!ToD)1949if (Error Err = importInto(ToD, FromD))1950return Err;19511952if (RecordDecl *FromRecord = dyn_cast<RecordDecl>(FromD)) {1953if (RecordDecl *ToRecord = cast<RecordDecl>(ToD)) {1954if (FromRecord->getDefinition() && FromRecord->isCompleteDefinition() &&1955!ToRecord->getDefinition()) {1956if (Error Err = ImportDefinition(FromRecord, ToRecord))1957return Err;1958}1959}1960return Error::success();1961}19621963if (EnumDecl *FromEnum = dyn_cast<EnumDecl>(FromD)) {1964if (EnumDecl *ToEnum = cast<EnumDecl>(ToD)) {1965if (FromEnum->getDefinition() && !ToEnum->getDefinition()) {1966if (Error Err = ImportDefinition(FromEnum, ToEnum))1967return Err;1968}1969}1970return Error::success();1971}19721973return Error::success();1974}19751976Error1977ASTNodeImporter::ImportDeclarationNameLoc(1978const DeclarationNameInfo &From, DeclarationNameInfo& To) {1979// NOTE: To.Name and To.Loc are already imported.1980// We only have to import To.LocInfo.1981switch (To.getName().getNameKind()) {1982case DeclarationName::Identifier:1983case DeclarationName::ObjCZeroArgSelector:1984case DeclarationName::ObjCOneArgSelector:1985case DeclarationName::ObjCMultiArgSelector:1986case DeclarationName::CXXUsingDirective:1987case DeclarationName::CXXDeductionGuideName:1988return Error::success();19891990case DeclarationName::CXXOperatorName: {1991if (auto ToRangeOrErr = import(From.getCXXOperatorNameRange()))1992To.setCXXOperatorNameRange(*ToRangeOrErr);1993else1994return ToRangeOrErr.takeError();1995return Error::success();1996}1997case DeclarationName::CXXLiteralOperatorName: {1998if (ExpectedSLoc LocOrErr = import(From.getCXXLiteralOperatorNameLoc()))1999To.setCXXLiteralOperatorNameLoc(*LocOrErr);2000else2001return LocOrErr.takeError();2002return Error::success();2003}2004case DeclarationName::CXXConstructorName:2005case DeclarationName::CXXDestructorName:2006case DeclarationName::CXXConversionFunctionName: {2007if (auto ToTInfoOrErr = import(From.getNamedTypeInfo()))2008To.setNamedTypeInfo(*ToTInfoOrErr);2009else2010return ToTInfoOrErr.takeError();2011return Error::success();2012}2013}2014llvm_unreachable("Unknown name kind.");2015}20162017Error2018ASTNodeImporter::ImportDeclContext(DeclContext *FromDC, bool ForceImport) {2019if (Importer.isMinimalImport() && !ForceImport) {2020auto ToDCOrErr = Importer.ImportContext(FromDC);2021return ToDCOrErr.takeError();2022}20232024// We use strict error handling in case of records and enums, but not2025// with e.g. namespaces.2026//2027// FIXME Clients of the ASTImporter should be able to choose an2028// appropriate error handling strategy for their needs. For instance,2029// they may not want to mark an entire namespace as erroneous merely2030// because there is an ODR error with two typedefs. As another example,2031// the client may allow EnumConstantDecls with same names but with2032// different values in two distinct translation units.2033ChildErrorHandlingStrategy HandleChildErrors(FromDC);20342035auto MightNeedReordering = [](const Decl *D) {2036return isa<FieldDecl>(D) || isa<IndirectFieldDecl>(D) || isa<FriendDecl>(D);2037};20382039// Import everything that might need reordering first.2040Error ChildErrors = Error::success();2041for (auto *From : FromDC->decls()) {2042if (!MightNeedReordering(From))2043continue;20442045ExpectedDecl ImportedOrErr = import(From);20462047// If we are in the process of ImportDefinition(...) for a RecordDecl we2048// want to make sure that we are also completing each FieldDecl. There2049// are currently cases where this does not happen and this is correctness2050// fix since operations such as code generation will expect this to be so.2051if (!ImportedOrErr) {2052HandleChildErrors.handleChildImportResult(ChildErrors,2053ImportedOrErr.takeError());2054continue;2055}2056FieldDecl *FieldFrom = dyn_cast_or_null<FieldDecl>(From);2057Decl *ImportedDecl = *ImportedOrErr;2058FieldDecl *FieldTo = dyn_cast_or_null<FieldDecl>(ImportedDecl);2059if (FieldFrom && FieldTo) {2060Error Err = ImportFieldDeclDefinition(FieldFrom, FieldTo);2061HandleChildErrors.handleChildImportResult(ChildErrors, std::move(Err));2062}2063}20642065// We reorder declarations in RecordDecls because they may have another order2066// in the "to" context than they have in the "from" context. This may happen2067// e.g when we import a class like this:2068// struct declToImport {2069// int a = c + b;2070// int b = 1;2071// int c = 2;2072// };2073// During the import of `a` we import first the dependencies in sequence,2074// thus the order would be `c`, `b`, `a`. We will get the normal order by2075// first removing the already imported members and then adding them in the2076// order as they appear in the "from" context.2077//2078// Keeping field order is vital because it determines structure layout.2079//2080// Here and below, we cannot call field_begin() method and its callers on2081// ToDC if it has an external storage. Calling field_begin() will2082// automatically load all the fields by calling2083// LoadFieldsFromExternalStorage(). LoadFieldsFromExternalStorage() would2084// call ASTImporter::Import(). This is because the ExternalASTSource2085// interface in LLDB is implemented by the means of the ASTImporter. However,2086// calling an import at this point would result in an uncontrolled import, we2087// must avoid that.20882089auto ToDCOrErr = Importer.ImportContext(FromDC);2090if (!ToDCOrErr) {2091consumeError(std::move(ChildErrors));2092return ToDCOrErr.takeError();2093}20942095if (const auto *FromRD = dyn_cast<RecordDecl>(FromDC)) {2096DeclContext *ToDC = *ToDCOrErr;2097// Remove all declarations, which may be in wrong order in the2098// lexical DeclContext and then add them in the proper order.2099for (auto *D : FromRD->decls()) {2100if (!MightNeedReordering(D))2101continue;21022103assert(D && "DC contains a null decl");2104if (Decl *ToD = Importer.GetAlreadyImportedOrNull(D)) {2105// Remove only the decls which we successfully imported.2106assert(ToDC == ToD->getLexicalDeclContext() && ToDC->containsDecl(ToD));2107// Remove the decl from its wrong place in the linked list.2108ToDC->removeDecl(ToD);2109// Add the decl to the end of the linked list.2110// This time it will be at the proper place because the enclosing for2111// loop iterates in the original (good) order of the decls.2112ToDC->addDeclInternal(ToD);2113}2114}2115}21162117// Import everything else.2118for (auto *From : FromDC->decls()) {2119if (MightNeedReordering(From))2120continue;21212122ExpectedDecl ImportedOrErr = import(From);2123if (!ImportedOrErr)2124HandleChildErrors.handleChildImportResult(ChildErrors,2125ImportedOrErr.takeError());2126}21272128return ChildErrors;2129}21302131Error ASTNodeImporter::ImportFieldDeclDefinition(const FieldDecl *From,2132const FieldDecl *To) {2133RecordDecl *FromRecordDecl = nullptr;2134RecordDecl *ToRecordDecl = nullptr;2135// If we have a field that is an ArrayType we need to check if the array2136// element is a RecordDecl and if so we need to import the definition.2137QualType FromType = From->getType();2138QualType ToType = To->getType();2139if (FromType->isArrayType()) {2140// getBaseElementTypeUnsafe(...) handles multi-dimensonal arrays for us.2141FromRecordDecl = FromType->getBaseElementTypeUnsafe()->getAsRecordDecl();2142ToRecordDecl = ToType->getBaseElementTypeUnsafe()->getAsRecordDecl();2143}21442145if (!FromRecordDecl || !ToRecordDecl) {2146const RecordType *RecordFrom = FromType->getAs<RecordType>();2147const RecordType *RecordTo = ToType->getAs<RecordType>();21482149if (RecordFrom && RecordTo) {2150FromRecordDecl = RecordFrom->getDecl();2151ToRecordDecl = RecordTo->getDecl();2152}2153}21542155if (FromRecordDecl && ToRecordDecl) {2156if (FromRecordDecl->isCompleteDefinition() &&2157!ToRecordDecl->isCompleteDefinition())2158return ImportDefinition(FromRecordDecl, ToRecordDecl);2159}21602161return Error::success();2162}21632164Error ASTNodeImporter::ImportDeclContext(2165Decl *FromD, DeclContext *&ToDC, DeclContext *&ToLexicalDC) {2166auto ToDCOrErr = Importer.ImportContext(FromD->getDeclContext());2167if (!ToDCOrErr)2168return ToDCOrErr.takeError();2169ToDC = *ToDCOrErr;21702171if (FromD->getDeclContext() != FromD->getLexicalDeclContext()) {2172auto ToLexicalDCOrErr = Importer.ImportContext(2173FromD->getLexicalDeclContext());2174if (!ToLexicalDCOrErr)2175return ToLexicalDCOrErr.takeError();2176ToLexicalDC = *ToLexicalDCOrErr;2177} else2178ToLexicalDC = ToDC;21792180return Error::success();2181}21822183Error ASTNodeImporter::ImportImplicitMethods(2184const CXXRecordDecl *From, CXXRecordDecl *To) {2185assert(From->isCompleteDefinition() && To->getDefinition() == To &&2186"Import implicit methods to or from non-definition");21872188for (CXXMethodDecl *FromM : From->methods())2189if (FromM->isImplicit()) {2190Expected<CXXMethodDecl *> ToMOrErr = import(FromM);2191if (!ToMOrErr)2192return ToMOrErr.takeError();2193}21942195return Error::success();2196}21972198static Error setTypedefNameForAnonDecl(TagDecl *From, TagDecl *To,2199ASTImporter &Importer) {2200if (TypedefNameDecl *FromTypedef = From->getTypedefNameForAnonDecl()) {2201if (ExpectedDecl ToTypedefOrErr = Importer.Import(FromTypedef))2202To->setTypedefNameForAnonDecl(cast<TypedefNameDecl>(*ToTypedefOrErr));2203else2204return ToTypedefOrErr.takeError();2205}2206return Error::success();2207}22082209Error ASTNodeImporter::ImportDefinition(2210RecordDecl *From, RecordDecl *To, ImportDefinitionKind Kind) {2211auto DefinitionCompleter = [To]() {2212// There are cases in LLDB when we first import a class without its2213// members. The class will have DefinitionData, but no members. Then,2214// importDefinition is called from LLDB, which tries to get the members, so2215// when we get here, the class already has the DefinitionData set, so we2216// must unset the CompleteDefinition here to be able to complete again the2217// definition.2218To->setCompleteDefinition(false);2219To->completeDefinition();2220};22212222if (To->getDefinition() || To->isBeingDefined()) {2223if (Kind == IDK_Everything ||2224// In case of lambdas, the class already has a definition ptr set, but2225// the contained decls are not imported yet. Also, isBeingDefined was2226// set in CXXRecordDecl::CreateLambda. We must import the contained2227// decls here and finish the definition.2228(To->isLambda() && shouldForceImportDeclContext(Kind))) {2229if (To->isLambda()) {2230auto *FromCXXRD = cast<CXXRecordDecl>(From);2231SmallVector<LambdaCapture, 8> ToCaptures;2232ToCaptures.reserve(FromCXXRD->capture_size());2233for (const auto &FromCapture : FromCXXRD->captures()) {2234if (auto ToCaptureOrErr = import(FromCapture))2235ToCaptures.push_back(*ToCaptureOrErr);2236else2237return ToCaptureOrErr.takeError();2238}2239cast<CXXRecordDecl>(To)->setCaptures(Importer.getToContext(),2240ToCaptures);2241}22422243Error Result = ImportDeclContext(From, /*ForceImport=*/true);2244// Finish the definition of the lambda, set isBeingDefined to false.2245if (To->isLambda())2246DefinitionCompleter();2247return Result;2248}22492250return Error::success();2251}22522253To->startDefinition();2254// Set the definition to complete even if it is really not complete during2255// import. Some AST constructs (expressions) require the record layout2256// to be calculated (see 'clang::computeDependence') at the time they are2257// constructed. Import of such AST node is possible during import of the2258// same record, there is no way to have a completely defined record (all2259// fields imported) at that time without multiple AST import passes.2260if (!Importer.isMinimalImport())2261To->setCompleteDefinition(true);2262// Complete the definition even if error is returned.2263// The RecordDecl may be already part of the AST so it is better to2264// have it in complete state even if something is wrong with it.2265auto DefinitionCompleterScopeExit =2266llvm::make_scope_exit(DefinitionCompleter);22672268if (Error Err = setTypedefNameForAnonDecl(From, To, Importer))2269return Err;22702271// Add base classes.2272auto *ToCXX = dyn_cast<CXXRecordDecl>(To);2273auto *FromCXX = dyn_cast<CXXRecordDecl>(From);2274if (ToCXX && FromCXX && ToCXX->dataPtr() && FromCXX->dataPtr()) {22752276struct CXXRecordDecl::DefinitionData &ToData = ToCXX->data();2277struct CXXRecordDecl::DefinitionData &FromData = FromCXX->data();22782279#define FIELD(Name, Width, Merge) \2280ToData.Name = FromData.Name;2281#include "clang/AST/CXXRecordDeclDefinitionBits.def"22822283// Copy over the data stored in RecordDeclBits2284ToCXX->setArgPassingRestrictions(FromCXX->getArgPassingRestrictions());22852286SmallVector<CXXBaseSpecifier *, 4> Bases;2287for (const auto &Base1 : FromCXX->bases()) {2288ExpectedType TyOrErr = import(Base1.getType());2289if (!TyOrErr)2290return TyOrErr.takeError();22912292SourceLocation EllipsisLoc;2293if (Base1.isPackExpansion()) {2294if (ExpectedSLoc LocOrErr = import(Base1.getEllipsisLoc()))2295EllipsisLoc = *LocOrErr;2296else2297return LocOrErr.takeError();2298}22992300// Ensure that we have a definition for the base.2301if (Error Err =2302ImportDefinitionIfNeeded(Base1.getType()->getAsCXXRecordDecl()))2303return Err;23042305auto RangeOrErr = import(Base1.getSourceRange());2306if (!RangeOrErr)2307return RangeOrErr.takeError();23082309auto TSIOrErr = import(Base1.getTypeSourceInfo());2310if (!TSIOrErr)2311return TSIOrErr.takeError();23122313Bases.push_back(2314new (Importer.getToContext()) CXXBaseSpecifier(2315*RangeOrErr,2316Base1.isVirtual(),2317Base1.isBaseOfClass(),2318Base1.getAccessSpecifierAsWritten(),2319*TSIOrErr,2320EllipsisLoc));2321}2322if (!Bases.empty())2323ToCXX->setBases(Bases.data(), Bases.size());2324}23252326if (shouldForceImportDeclContext(Kind)) {2327if (Error Err = ImportDeclContext(From, /*ForceImport=*/true))2328return Err;2329}23302331return Error::success();2332}23332334Error ASTNodeImporter::ImportInitializer(VarDecl *From, VarDecl *To) {2335if (To->getAnyInitializer())2336return Error::success();23372338Expr *FromInit = From->getInit();2339if (!FromInit)2340return Error::success();23412342ExpectedExpr ToInitOrErr = import(FromInit);2343if (!ToInitOrErr)2344return ToInitOrErr.takeError();23452346To->setInit(*ToInitOrErr);2347if (EvaluatedStmt *FromEval = From->getEvaluatedStmt()) {2348EvaluatedStmt *ToEval = To->ensureEvaluatedStmt();2349ToEval->HasConstantInitialization = FromEval->HasConstantInitialization;2350ToEval->HasConstantDestruction = FromEval->HasConstantDestruction;2351// FIXME: Also import the initializer value.2352}23532354// FIXME: Other bits to merge?2355return Error::success();2356}23572358Error ASTNodeImporter::ImportDefinition(2359EnumDecl *From, EnumDecl *To, ImportDefinitionKind Kind) {2360if (To->getDefinition() || To->isBeingDefined()) {2361if (Kind == IDK_Everything)2362return ImportDeclContext(From, /*ForceImport=*/true);2363return Error::success();2364}23652366To->startDefinition();23672368if (Error Err = setTypedefNameForAnonDecl(From, To, Importer))2369return Err;23702371ExpectedType ToTypeOrErr =2372import(Importer.getFromContext().getTypeDeclType(From));2373if (!ToTypeOrErr)2374return ToTypeOrErr.takeError();23752376ExpectedType ToPromotionTypeOrErr = import(From->getPromotionType());2377if (!ToPromotionTypeOrErr)2378return ToPromotionTypeOrErr.takeError();23792380if (shouldForceImportDeclContext(Kind))2381if (Error Err = ImportDeclContext(From, /*ForceImport=*/true))2382return Err;23832384// FIXME: we might need to merge the number of positive or negative bits2385// if the enumerator lists don't match.2386To->completeDefinition(*ToTypeOrErr, *ToPromotionTypeOrErr,2387From->getNumPositiveBits(),2388From->getNumNegativeBits());2389return Error::success();2390}23912392Error ASTNodeImporter::ImportTemplateArguments(2393ArrayRef<TemplateArgument> FromArgs,2394SmallVectorImpl<TemplateArgument> &ToArgs) {2395for (const auto &Arg : FromArgs) {2396if (auto ToOrErr = import(Arg))2397ToArgs.push_back(*ToOrErr);2398else2399return ToOrErr.takeError();2400}24012402return Error::success();2403}24042405// FIXME: Do not forget to remove this and use only 'import'.2406Expected<TemplateArgument>2407ASTNodeImporter::ImportTemplateArgument(const TemplateArgument &From) {2408return import(From);2409}24102411template <typename InContainerTy>2412Error ASTNodeImporter::ImportTemplateArgumentListInfo(2413const InContainerTy &Container, TemplateArgumentListInfo &ToTAInfo) {2414for (const auto &FromLoc : Container) {2415if (auto ToLocOrErr = import(FromLoc))2416ToTAInfo.addArgument(*ToLocOrErr);2417else2418return ToLocOrErr.takeError();2419}2420return Error::success();2421}24222423static StructuralEquivalenceKind2424getStructuralEquivalenceKind(const ASTImporter &Importer) {2425return Importer.isMinimalImport() ? StructuralEquivalenceKind::Minimal2426: StructuralEquivalenceKind::Default;2427}24282429bool ASTNodeImporter::IsStructuralMatch(Decl *From, Decl *To, bool Complain,2430bool IgnoreTemplateParmDepth) {2431// Eliminate a potential failure point where we attempt to re-import2432// something we're trying to import while completing ToRecord.2433Decl *ToOrigin = Importer.GetOriginalDecl(To);2434if (ToOrigin) {2435To = ToOrigin;2436}24372438StructuralEquivalenceContext Ctx(2439Importer.getFromContext(), Importer.getToContext(),2440Importer.getNonEquivalentDecls(), getStructuralEquivalenceKind(Importer),2441/*StrictTypeSpelling=*/false, Complain, /*ErrorOnTagTypeMismatch=*/false,2442IgnoreTemplateParmDepth);2443return Ctx.IsEquivalent(From, To);2444}24452446ExpectedDecl ASTNodeImporter::VisitDecl(Decl *D) {2447Importer.FromDiag(D->getLocation(), diag::err_unsupported_ast_node)2448<< D->getDeclKindName();2449return make_error<ASTImportError>(ASTImportError::UnsupportedConstruct);2450}24512452ExpectedDecl ASTNodeImporter::VisitImportDecl(ImportDecl *D) {2453Importer.FromDiag(D->getLocation(), diag::err_unsupported_ast_node)2454<< D->getDeclKindName();2455return make_error<ASTImportError>(ASTImportError::UnsupportedConstruct);2456}24572458ExpectedDecl ASTNodeImporter::VisitEmptyDecl(EmptyDecl *D) {2459// Import the context of this declaration.2460DeclContext *DC, *LexicalDC;2461if (Error Err = ImportDeclContext(D, DC, LexicalDC))2462return std::move(Err);24632464// Import the location of this declaration.2465ExpectedSLoc LocOrErr = import(D->getLocation());2466if (!LocOrErr)2467return LocOrErr.takeError();24682469EmptyDecl *ToD;2470if (GetImportedOrCreateDecl(ToD, D, Importer.getToContext(), DC, *LocOrErr))2471return ToD;24722473ToD->setLexicalDeclContext(LexicalDC);2474LexicalDC->addDeclInternal(ToD);2475return ToD;2476}24772478ExpectedDecl ASTNodeImporter::VisitTranslationUnitDecl(TranslationUnitDecl *D) {2479TranslationUnitDecl *ToD =2480Importer.getToContext().getTranslationUnitDecl();24812482Importer.MapImported(D, ToD);24832484return ToD;2485}24862487ExpectedDecl ASTNodeImporter::VisitBindingDecl(BindingDecl *D) {2488DeclContext *DC, *LexicalDC;2489DeclarationName Name;2490SourceLocation Loc;2491NamedDecl *ToND;2492if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToND, Loc))2493return std::move(Err);2494if (ToND)2495return ToND;24962497BindingDecl *ToD;2498if (GetImportedOrCreateDecl(ToD, D, Importer.getToContext(), DC, Loc,2499Name.getAsIdentifierInfo()))2500return ToD;25012502Error Err = Error::success();2503QualType ToType = importChecked(Err, D->getType());2504Expr *ToBinding = importChecked(Err, D->getBinding());2505ValueDecl *ToDecomposedDecl = importChecked(Err, D->getDecomposedDecl());2506if (Err)2507return std::move(Err);25082509ToD->setBinding(ToType, ToBinding);2510ToD->setDecomposedDecl(ToDecomposedDecl);2511addDeclToContexts(D, ToD);25122513return ToD;2514}25152516ExpectedDecl ASTNodeImporter::VisitAccessSpecDecl(AccessSpecDecl *D) {2517ExpectedSLoc LocOrErr = import(D->getLocation());2518if (!LocOrErr)2519return LocOrErr.takeError();2520auto ColonLocOrErr = import(D->getColonLoc());2521if (!ColonLocOrErr)2522return ColonLocOrErr.takeError();25232524// Import the context of this declaration.2525auto DCOrErr = Importer.ImportContext(D->getDeclContext());2526if (!DCOrErr)2527return DCOrErr.takeError();2528DeclContext *DC = *DCOrErr;25292530AccessSpecDecl *ToD;2531if (GetImportedOrCreateDecl(ToD, D, Importer.getToContext(), D->getAccess(),2532DC, *LocOrErr, *ColonLocOrErr))2533return ToD;25342535// Lexical DeclContext and Semantic DeclContext2536// is always the same for the accessSpec.2537ToD->setLexicalDeclContext(DC);2538DC->addDeclInternal(ToD);25392540return ToD;2541}25422543ExpectedDecl ASTNodeImporter::VisitStaticAssertDecl(StaticAssertDecl *D) {2544auto DCOrErr = Importer.ImportContext(D->getDeclContext());2545if (!DCOrErr)2546return DCOrErr.takeError();2547DeclContext *DC = *DCOrErr;2548DeclContext *LexicalDC = DC;25492550Error Err = Error::success();2551auto ToLocation = importChecked(Err, D->getLocation());2552auto ToRParenLoc = importChecked(Err, D->getRParenLoc());2553auto ToAssertExpr = importChecked(Err, D->getAssertExpr());2554auto ToMessage = importChecked(Err, D->getMessage());2555if (Err)2556return std::move(Err);25572558StaticAssertDecl *ToD;2559if (GetImportedOrCreateDecl(2560ToD, D, Importer.getToContext(), DC, ToLocation, ToAssertExpr, ToMessage,2561ToRParenLoc, D->isFailed()))2562return ToD;25632564ToD->setLexicalDeclContext(LexicalDC);2565LexicalDC->addDeclInternal(ToD);2566return ToD;2567}25682569ExpectedDecl ASTNodeImporter::VisitNamespaceDecl(NamespaceDecl *D) {2570// Import the major distinguishing characteristics of this namespace.2571DeclContext *DC, *LexicalDC;2572DeclarationName Name;2573SourceLocation Loc;2574NamedDecl *ToD;2575if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))2576return std::move(Err);2577if (ToD)2578return ToD;25792580NamespaceDecl *MergeWithNamespace = nullptr;2581if (!Name) {2582// This is an anonymous namespace. Adopt an existing anonymous2583// namespace if we can.2584// FIXME: Not testable.2585if (auto *TU = dyn_cast<TranslationUnitDecl>(DC))2586MergeWithNamespace = TU->getAnonymousNamespace();2587else2588MergeWithNamespace = cast<NamespaceDecl>(DC)->getAnonymousNamespace();2589} else {2590SmallVector<NamedDecl *, 4> ConflictingDecls;2591auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);2592for (auto *FoundDecl : FoundDecls) {2593if (!FoundDecl->isInIdentifierNamespace(Decl::IDNS_Namespace))2594continue;25952596if (auto *FoundNS = dyn_cast<NamespaceDecl>(FoundDecl)) {2597MergeWithNamespace = FoundNS;2598ConflictingDecls.clear();2599break;2600}26012602ConflictingDecls.push_back(FoundDecl);2603}26042605if (!ConflictingDecls.empty()) {2606ExpectedName NameOrErr = Importer.HandleNameConflict(2607Name, DC, Decl::IDNS_Namespace, ConflictingDecls.data(),2608ConflictingDecls.size());2609if (NameOrErr)2610Name = NameOrErr.get();2611else2612return NameOrErr.takeError();2613}2614}26152616ExpectedSLoc BeginLocOrErr = import(D->getBeginLoc());2617if (!BeginLocOrErr)2618return BeginLocOrErr.takeError();2619ExpectedSLoc RBraceLocOrErr = import(D->getRBraceLoc());2620if (!RBraceLocOrErr)2621return RBraceLocOrErr.takeError();26222623// Create the "to" namespace, if needed.2624NamespaceDecl *ToNamespace = MergeWithNamespace;2625if (!ToNamespace) {2626if (GetImportedOrCreateDecl(ToNamespace, D, Importer.getToContext(), DC,2627D->isInline(), *BeginLocOrErr, Loc,2628Name.getAsIdentifierInfo(),2629/*PrevDecl=*/nullptr, D->isNested()))2630return ToNamespace;2631ToNamespace->setRBraceLoc(*RBraceLocOrErr);2632ToNamespace->setLexicalDeclContext(LexicalDC);2633LexicalDC->addDeclInternal(ToNamespace);26342635// If this is an anonymous namespace, register it as the anonymous2636// namespace within its context.2637if (!Name) {2638if (auto *TU = dyn_cast<TranslationUnitDecl>(DC))2639TU->setAnonymousNamespace(ToNamespace);2640else2641cast<NamespaceDecl>(DC)->setAnonymousNamespace(ToNamespace);2642}2643}2644Importer.MapImported(D, ToNamespace);26452646if (Error Err = ImportDeclContext(D))2647return std::move(Err);26482649return ToNamespace;2650}26512652ExpectedDecl ASTNodeImporter::VisitNamespaceAliasDecl(NamespaceAliasDecl *D) {2653// Import the major distinguishing characteristics of this namespace.2654DeclContext *DC, *LexicalDC;2655DeclarationName Name;2656SourceLocation Loc;2657NamedDecl *LookupD;2658if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, LookupD, Loc))2659return std::move(Err);2660if (LookupD)2661return LookupD;26622663// NOTE: No conflict resolution is done for namespace aliases now.26642665Error Err = Error::success();2666auto ToNamespaceLoc = importChecked(Err, D->getNamespaceLoc());2667auto ToAliasLoc = importChecked(Err, D->getAliasLoc());2668auto ToQualifierLoc = importChecked(Err, D->getQualifierLoc());2669auto ToTargetNameLoc = importChecked(Err, D->getTargetNameLoc());2670auto ToNamespace = importChecked(Err, D->getNamespace());2671if (Err)2672return std::move(Err);26732674IdentifierInfo *ToIdentifier = Importer.Import(D->getIdentifier());26752676NamespaceAliasDecl *ToD;2677if (GetImportedOrCreateDecl(2678ToD, D, Importer.getToContext(), DC, ToNamespaceLoc, ToAliasLoc,2679ToIdentifier, ToQualifierLoc, ToTargetNameLoc, ToNamespace))2680return ToD;26812682ToD->setLexicalDeclContext(LexicalDC);2683LexicalDC->addDeclInternal(ToD);26842685return ToD;2686}26872688ExpectedDecl2689ASTNodeImporter::VisitTypedefNameDecl(TypedefNameDecl *D, bool IsAlias) {2690// Import the major distinguishing characteristics of this typedef.2691DeclarationName Name;2692SourceLocation Loc;2693NamedDecl *ToD;2694// Do not import the DeclContext, we will import it once the TypedefNameDecl2695// is created.2696if (Error Err = ImportDeclParts(D, Name, ToD, Loc))2697return std::move(Err);2698if (ToD)2699return ToD;27002701DeclContext *DC = cast_or_null<DeclContext>(2702Importer.GetAlreadyImportedOrNull(cast<Decl>(D->getDeclContext())));2703DeclContext *LexicalDC =2704cast_or_null<DeclContext>(Importer.GetAlreadyImportedOrNull(2705cast<Decl>(D->getLexicalDeclContext())));27062707// If this typedef is not in block scope, determine whether we've2708// seen a typedef with the same name (that we can merge with) or any2709// other entity by that name (which name lookup could conflict with).2710// Note: Repeated typedefs are not valid in C99:2711// 'typedef int T; typedef int T;' is invalid2712// We do not care about this now.2713if (DC && !DC->isFunctionOrMethod()) {2714SmallVector<NamedDecl *, 4> ConflictingDecls;2715unsigned IDNS = Decl::IDNS_Ordinary;2716auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);2717for (auto *FoundDecl : FoundDecls) {2718if (!FoundDecl->isInIdentifierNamespace(IDNS))2719continue;2720if (auto *FoundTypedef = dyn_cast<TypedefNameDecl>(FoundDecl)) {2721if (!hasSameVisibilityContextAndLinkage(FoundTypedef, D))2722continue;27232724QualType FromUT = D->getUnderlyingType();2725QualType FoundUT = FoundTypedef->getUnderlyingType();2726if (Importer.IsStructurallyEquivalent(FromUT, FoundUT)) {2727// If the underlying declarations are unnamed records these can be2728// imported as different types. We should create a distinct typedef2729// node in this case.2730// If we found an existing underlying type with a record in a2731// different context (than the imported), this is already reason for2732// having distinct typedef nodes for these.2733// Again this can create situation like2734// 'typedef int T; typedef int T;' but this is hard to avoid without2735// a rename strategy at import.2736if (!FromUT.isNull() && !FoundUT.isNull()) {2737RecordDecl *FromR = FromUT->getAsRecordDecl();2738RecordDecl *FoundR = FoundUT->getAsRecordDecl();2739if (FromR && FoundR &&2740!hasSameVisibilityContextAndLinkage(FoundR, FromR))2741continue;2742}2743// If the "From" context has a complete underlying type but we2744// already have a complete underlying type then return with that.2745if (!FromUT->isIncompleteType() && !FoundUT->isIncompleteType())2746return Importer.MapImported(D, FoundTypedef);2747// FIXME Handle redecl chain. When you do that make consistent changes2748// in ASTImporterLookupTable too.2749} else {2750ConflictingDecls.push_back(FoundDecl);2751}2752}2753}27542755if (!ConflictingDecls.empty()) {2756ExpectedName NameOrErr = Importer.HandleNameConflict(2757Name, DC, IDNS, ConflictingDecls.data(), ConflictingDecls.size());2758if (NameOrErr)2759Name = NameOrErr.get();2760else2761return NameOrErr.takeError();2762}2763}27642765Error Err = Error::success();2766auto ToUnderlyingType = importChecked(Err, D->getUnderlyingType());2767auto ToTypeSourceInfo = importChecked(Err, D->getTypeSourceInfo());2768auto ToBeginLoc = importChecked(Err, D->getBeginLoc());2769if (Err)2770return std::move(Err);27712772// Create the new typedef node.2773// FIXME: ToUnderlyingType is not used.2774(void)ToUnderlyingType;2775TypedefNameDecl *ToTypedef;2776if (IsAlias) {2777if (GetImportedOrCreateDecl<TypeAliasDecl>(2778ToTypedef, D, Importer.getToContext(), DC, ToBeginLoc, Loc,2779Name.getAsIdentifierInfo(), ToTypeSourceInfo))2780return ToTypedef;2781} else if (GetImportedOrCreateDecl<TypedefDecl>(2782ToTypedef, D, Importer.getToContext(), DC, ToBeginLoc, Loc,2783Name.getAsIdentifierInfo(), ToTypeSourceInfo))2784return ToTypedef;27852786// Import the DeclContext and set it to the Typedef.2787if ((Err = ImportDeclContext(D, DC, LexicalDC)))2788return std::move(Err);2789ToTypedef->setDeclContext(DC);2790ToTypedef->setLexicalDeclContext(LexicalDC);2791// Add to the lookupTable because we could not do that in MapImported.2792Importer.AddToLookupTable(ToTypedef);27932794ToTypedef->setAccess(D->getAccess());27952796// Templated declarations should not appear in DeclContext.2797TypeAliasDecl *FromAlias = IsAlias ? cast<TypeAliasDecl>(D) : nullptr;2798if (!FromAlias || !FromAlias->getDescribedAliasTemplate())2799LexicalDC->addDeclInternal(ToTypedef);28002801return ToTypedef;2802}28032804ExpectedDecl ASTNodeImporter::VisitTypedefDecl(TypedefDecl *D) {2805return VisitTypedefNameDecl(D, /*IsAlias=*/false);2806}28072808ExpectedDecl ASTNodeImporter::VisitTypeAliasDecl(TypeAliasDecl *D) {2809return VisitTypedefNameDecl(D, /*IsAlias=*/true);2810}28112812ExpectedDecl2813ASTNodeImporter::VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D) {2814// Import the major distinguishing characteristics of this typedef.2815DeclContext *DC, *LexicalDC;2816DeclarationName Name;2817SourceLocation Loc;2818NamedDecl *FoundD;2819if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, FoundD, Loc))2820return std::move(Err);2821if (FoundD)2822return FoundD;28232824// If this typedef is not in block scope, determine whether we've2825// seen a typedef with the same name (that we can merge with) or any2826// other entity by that name (which name lookup could conflict with).2827if (!DC->isFunctionOrMethod()) {2828SmallVector<NamedDecl *, 4> ConflictingDecls;2829unsigned IDNS = Decl::IDNS_Ordinary;2830auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);2831for (auto *FoundDecl : FoundDecls) {2832if (!FoundDecl->isInIdentifierNamespace(IDNS))2833continue;2834if (auto *FoundAlias = dyn_cast<TypeAliasTemplateDecl>(FoundDecl)) {2835if (IsStructuralMatch(D, FoundAlias))2836return Importer.MapImported(D, FoundAlias);2837ConflictingDecls.push_back(FoundDecl);2838}2839}28402841if (!ConflictingDecls.empty()) {2842ExpectedName NameOrErr = Importer.HandleNameConflict(2843Name, DC, IDNS, ConflictingDecls.data(), ConflictingDecls.size());2844if (NameOrErr)2845Name = NameOrErr.get();2846else2847return NameOrErr.takeError();2848}2849}28502851Error Err = Error::success();2852auto ToTemplateParameters = importChecked(Err, D->getTemplateParameters());2853auto ToTemplatedDecl = importChecked(Err, D->getTemplatedDecl());2854if (Err)2855return std::move(Err);28562857TypeAliasTemplateDecl *ToAlias;2858if (GetImportedOrCreateDecl(ToAlias, D, Importer.getToContext(), DC, Loc,2859Name, ToTemplateParameters, ToTemplatedDecl))2860return ToAlias;28612862ToTemplatedDecl->setDescribedAliasTemplate(ToAlias);28632864ToAlias->setAccess(D->getAccess());2865ToAlias->setLexicalDeclContext(LexicalDC);2866LexicalDC->addDeclInternal(ToAlias);2867if (DC != Importer.getToContext().getTranslationUnitDecl())2868updateLookupTableForTemplateParameters(*ToTemplateParameters);2869return ToAlias;2870}28712872ExpectedDecl ASTNodeImporter::VisitLabelDecl(LabelDecl *D) {2873// Import the major distinguishing characteristics of this label.2874DeclContext *DC, *LexicalDC;2875DeclarationName Name;2876SourceLocation Loc;2877NamedDecl *ToD;2878if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))2879return std::move(Err);2880if (ToD)2881return ToD;28822883assert(LexicalDC->isFunctionOrMethod());28842885LabelDecl *ToLabel;2886if (D->isGnuLocal()) {2887ExpectedSLoc BeginLocOrErr = import(D->getBeginLoc());2888if (!BeginLocOrErr)2889return BeginLocOrErr.takeError();2890if (GetImportedOrCreateDecl(ToLabel, D, Importer.getToContext(), DC, Loc,2891Name.getAsIdentifierInfo(), *BeginLocOrErr))2892return ToLabel;28932894} else {2895if (GetImportedOrCreateDecl(ToLabel, D, Importer.getToContext(), DC, Loc,2896Name.getAsIdentifierInfo()))2897return ToLabel;28982899}29002901Expected<LabelStmt *> ToStmtOrErr = import(D->getStmt());2902if (!ToStmtOrErr)2903return ToStmtOrErr.takeError();29042905ToLabel->setStmt(*ToStmtOrErr);2906ToLabel->setLexicalDeclContext(LexicalDC);2907LexicalDC->addDeclInternal(ToLabel);2908return ToLabel;2909}29102911ExpectedDecl ASTNodeImporter::VisitEnumDecl(EnumDecl *D) {2912// Import the major distinguishing characteristics of this enum.2913DeclContext *DC, *LexicalDC;2914DeclarationName Name;2915SourceLocation Loc;2916NamedDecl *ToD;2917if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))2918return std::move(Err);2919if (ToD)2920return ToD;29212922// Figure out what enum name we're looking for.2923unsigned IDNS = Decl::IDNS_Tag;2924DeclarationName SearchName = Name;2925if (!SearchName && D->getTypedefNameForAnonDecl()) {2926if (Error Err = importInto(2927SearchName, D->getTypedefNameForAnonDecl()->getDeclName()))2928return std::move(Err);2929IDNS = Decl::IDNS_Ordinary;2930} else if (Importer.getToContext().getLangOpts().CPlusPlus)2931IDNS |= Decl::IDNS_Ordinary;29322933// We may already have an enum of the same name; try to find and match it.2934EnumDecl *PrevDecl = nullptr;2935if (!DC->isFunctionOrMethod()) {2936SmallVector<NamedDecl *, 4> ConflictingDecls;2937auto FoundDecls =2938Importer.findDeclsInToCtx(DC, SearchName);2939for (auto *FoundDecl : FoundDecls) {2940if (!FoundDecl->isInIdentifierNamespace(IDNS))2941continue;29422943if (auto *Typedef = dyn_cast<TypedefNameDecl>(FoundDecl)) {2944if (const auto *Tag = Typedef->getUnderlyingType()->getAs<TagType>())2945FoundDecl = Tag->getDecl();2946}29472948if (auto *FoundEnum = dyn_cast<EnumDecl>(FoundDecl)) {2949if (!hasSameVisibilityContextAndLinkage(FoundEnum, D))2950continue;2951if (IsStructuralMatch(D, FoundEnum, !SearchName.isEmpty())) {2952EnumDecl *FoundDef = FoundEnum->getDefinition();2953if (D->isThisDeclarationADefinition() && FoundDef)2954return Importer.MapImported(D, FoundDef);2955PrevDecl = FoundEnum->getMostRecentDecl();2956break;2957}2958ConflictingDecls.push_back(FoundDecl);2959}2960}29612962// In case of unnamed enums, we try to find an existing similar one, if none2963// was found, perform the import always.2964// Structural in-equivalence is not detected in this way here, but it may2965// be found when the parent decl is imported (if the enum is part of a2966// class). To make this totally exact a more difficult solution is needed.2967if (SearchName && !ConflictingDecls.empty()) {2968ExpectedName NameOrErr = Importer.HandleNameConflict(2969SearchName, DC, IDNS, ConflictingDecls.data(),2970ConflictingDecls.size());2971if (NameOrErr)2972Name = NameOrErr.get();2973else2974return NameOrErr.takeError();2975}2976}29772978Error Err = Error::success();2979auto ToBeginLoc = importChecked(Err, D->getBeginLoc());2980auto ToQualifierLoc = importChecked(Err, D->getQualifierLoc());2981auto ToIntegerType = importChecked(Err, D->getIntegerType());2982auto ToBraceRange = importChecked(Err, D->getBraceRange());2983if (Err)2984return std::move(Err);29852986// Create the enum declaration.2987EnumDecl *D2;2988if (GetImportedOrCreateDecl(2989D2, D, Importer.getToContext(), DC, ToBeginLoc,2990Loc, Name.getAsIdentifierInfo(), PrevDecl, D->isScoped(),2991D->isScopedUsingClassTag(), D->isFixed()))2992return D2;29932994D2->setQualifierInfo(ToQualifierLoc);2995D2->setIntegerType(ToIntegerType);2996D2->setBraceRange(ToBraceRange);2997D2->setAccess(D->getAccess());2998D2->setLexicalDeclContext(LexicalDC);2999addDeclToContexts(D, D2);30003001if (MemberSpecializationInfo *MemberInfo = D->getMemberSpecializationInfo()) {3002TemplateSpecializationKind SK = MemberInfo->getTemplateSpecializationKind();3003EnumDecl *FromInst = D->getInstantiatedFromMemberEnum();3004if (Expected<EnumDecl *> ToInstOrErr = import(FromInst))3005D2->setInstantiationOfMemberEnum(*ToInstOrErr, SK);3006else3007return ToInstOrErr.takeError();3008if (ExpectedSLoc POIOrErr = import(MemberInfo->getPointOfInstantiation()))3009D2->getMemberSpecializationInfo()->setPointOfInstantiation(*POIOrErr);3010else3011return POIOrErr.takeError();3012}30133014// Import the definition3015if (D->isCompleteDefinition())3016if (Error Err = ImportDefinition(D, D2))3017return std::move(Err);30183019return D2;3020}30213022ExpectedDecl ASTNodeImporter::VisitRecordDecl(RecordDecl *D) {3023bool IsFriendTemplate = false;3024if (auto *DCXX = dyn_cast<CXXRecordDecl>(D)) {3025IsFriendTemplate =3026DCXX->getDescribedClassTemplate() &&3027DCXX->getDescribedClassTemplate()->getFriendObjectKind() !=3028Decl::FOK_None;3029}30303031// Import the major distinguishing characteristics of this record.3032DeclContext *DC = nullptr, *LexicalDC = nullptr;3033DeclarationName Name;3034SourceLocation Loc;3035NamedDecl *ToD = nullptr;3036if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))3037return std::move(Err);3038if (ToD)3039return ToD;30403041// Figure out what structure name we're looking for.3042unsigned IDNS = Decl::IDNS_Tag;3043DeclarationName SearchName = Name;3044if (!SearchName && D->getTypedefNameForAnonDecl()) {3045if (Error Err = importInto(3046SearchName, D->getTypedefNameForAnonDecl()->getDeclName()))3047return std::move(Err);3048IDNS = Decl::IDNS_Ordinary;3049} else if (Importer.getToContext().getLangOpts().CPlusPlus)3050IDNS |= Decl::IDNS_Ordinary | Decl::IDNS_TagFriend;30513052bool IsDependentContext = DC != LexicalDC ? LexicalDC->isDependentContext()3053: DC->isDependentContext();3054bool DependentFriend = IsFriendTemplate && IsDependentContext;30553056// We may already have a record of the same name; try to find and match it.3057RecordDecl *PrevDecl = nullptr;3058if (!DependentFriend && !DC->isFunctionOrMethod() && !D->isLambda()) {3059SmallVector<NamedDecl *, 4> ConflictingDecls;3060auto FoundDecls =3061Importer.findDeclsInToCtx(DC, SearchName);3062if (!FoundDecls.empty()) {3063// We're going to have to compare D against potentially conflicting Decls,3064// so complete it.3065if (D->hasExternalLexicalStorage() && !D->isCompleteDefinition())3066D->getASTContext().getExternalSource()->CompleteType(D);3067}30683069for (auto *FoundDecl : FoundDecls) {3070if (!FoundDecl->isInIdentifierNamespace(IDNS))3071continue;30723073Decl *Found = FoundDecl;3074if (auto *Typedef = dyn_cast<TypedefNameDecl>(Found)) {3075if (const auto *Tag = Typedef->getUnderlyingType()->getAs<TagType>())3076Found = Tag->getDecl();3077}30783079if (auto *FoundRecord = dyn_cast<RecordDecl>(Found)) {3080// Do not emit false positive diagnostic in case of unnamed3081// struct/union and in case of anonymous structs. Would be false3082// because there may be several anonymous/unnamed structs in a class.3083// E.g. these are both valid:3084// struct A { // unnamed structs3085// struct { struct A *next; } entry0;3086// struct { struct A *next; } entry1;3087// };3088// struct X { struct { int a; }; struct { int b; }; }; // anon structs3089if (!SearchName)3090if (!IsStructuralMatch(D, FoundRecord, false))3091continue;30923093if (!hasSameVisibilityContextAndLinkage(FoundRecord, D))3094continue;30953096if (IsStructuralMatch(D, FoundRecord)) {3097RecordDecl *FoundDef = FoundRecord->getDefinition();3098if (D->isThisDeclarationADefinition() && FoundDef) {3099// FIXME: Structural equivalence check should check for same3100// user-defined methods.3101Importer.MapImported(D, FoundDef);3102if (const auto *DCXX = dyn_cast<CXXRecordDecl>(D)) {3103auto *FoundCXX = dyn_cast<CXXRecordDecl>(FoundDef);3104assert(FoundCXX && "Record type mismatch");31053106if (!Importer.isMinimalImport())3107// FoundDef may not have every implicit method that D has3108// because implicit methods are created only if they are used.3109if (Error Err = ImportImplicitMethods(DCXX, FoundCXX))3110return std::move(Err);3111}3112}3113PrevDecl = FoundRecord->getMostRecentDecl();3114break;3115}3116ConflictingDecls.push_back(FoundDecl);3117} // kind is RecordDecl3118} // for31193120if (!ConflictingDecls.empty() && SearchName) {3121ExpectedName NameOrErr = Importer.HandleNameConflict(3122SearchName, DC, IDNS, ConflictingDecls.data(),3123ConflictingDecls.size());3124if (NameOrErr)3125Name = NameOrErr.get();3126else3127return NameOrErr.takeError();3128}3129}31303131ExpectedSLoc BeginLocOrErr = import(D->getBeginLoc());3132if (!BeginLocOrErr)3133return BeginLocOrErr.takeError();31343135// Create the record declaration.3136RecordDecl *D2 = nullptr;3137CXXRecordDecl *D2CXX = nullptr;3138if (auto *DCXX = dyn_cast<CXXRecordDecl>(D)) {3139if (DCXX->isLambda()) {3140auto TInfoOrErr = import(DCXX->getLambdaTypeInfo());3141if (!TInfoOrErr)3142return TInfoOrErr.takeError();3143if (GetImportedOrCreateSpecialDecl(3144D2CXX, CXXRecordDecl::CreateLambda, D, Importer.getToContext(),3145DC, *TInfoOrErr, Loc, DCXX->getLambdaDependencyKind(),3146DCXX->isGenericLambda(), DCXX->getLambdaCaptureDefault()))3147return D2CXX;3148CXXRecordDecl::LambdaNumbering Numbering = DCXX->getLambdaNumbering();3149ExpectedDecl CDeclOrErr = import(Numbering.ContextDecl);3150if (!CDeclOrErr)3151return CDeclOrErr.takeError();3152Numbering.ContextDecl = *CDeclOrErr;3153D2CXX->setLambdaNumbering(Numbering);3154} else if (DCXX->isInjectedClassName()) {3155// We have to be careful to do a similar dance to the one in3156// Sema::ActOnStartCXXMemberDeclarations3157const bool DelayTypeCreation = true;3158if (GetImportedOrCreateDecl(3159D2CXX, D, Importer.getToContext(), D->getTagKind(), DC,3160*BeginLocOrErr, Loc, Name.getAsIdentifierInfo(),3161cast_or_null<CXXRecordDecl>(PrevDecl), DelayTypeCreation))3162return D2CXX;3163Importer.getToContext().getTypeDeclType(3164D2CXX, dyn_cast<CXXRecordDecl>(DC));3165} else {3166if (GetImportedOrCreateDecl(D2CXX, D, Importer.getToContext(),3167D->getTagKind(), DC, *BeginLocOrErr, Loc,3168Name.getAsIdentifierInfo(),3169cast_or_null<CXXRecordDecl>(PrevDecl)))3170return D2CXX;3171}31723173D2 = D2CXX;3174D2->setAccess(D->getAccess());3175D2->setLexicalDeclContext(LexicalDC);3176addDeclToContexts(D, D2);31773178if (ClassTemplateDecl *FromDescribed =3179DCXX->getDescribedClassTemplate()) {3180ClassTemplateDecl *ToDescribed;3181if (Error Err = importInto(ToDescribed, FromDescribed))3182return std::move(Err);3183D2CXX->setDescribedClassTemplate(ToDescribed);3184if (!DCXX->isInjectedClassName() && !IsFriendTemplate) {3185// In a record describing a template the type should be an3186// InjectedClassNameType (see Sema::CheckClassTemplate). Update the3187// previously set type to the correct value here (ToDescribed is not3188// available at record create).3189CXXRecordDecl *Injected = nullptr;3190for (NamedDecl *Found : D2CXX->noload_lookup(Name)) {3191auto *Record = dyn_cast<CXXRecordDecl>(Found);3192if (Record && Record->isInjectedClassName()) {3193Injected = Record;3194break;3195}3196}3197// Create an injected type for the whole redecl chain.3198// The chain may contain an already existing injected type at the start,3199// if yes this should be reused. We must ensure that only one type3200// object exists for the injected type (including the injected record3201// declaration), ASTContext does not check it.3202SmallVector<Decl *, 2> Redecls =3203getCanonicalForwardRedeclChain(D2CXX);3204const Type *FrontTy =3205cast<CXXRecordDecl>(Redecls.front())->getTypeForDecl();3206QualType InjSpec;3207if (auto *InjTy = FrontTy->getAs<InjectedClassNameType>())3208InjSpec = InjTy->getInjectedSpecializationType();3209else3210InjSpec = ToDescribed->getInjectedClassNameSpecialization();3211for (auto *R : Redecls) {3212auto *RI = cast<CXXRecordDecl>(R);3213if (R != Redecls.front() ||3214!isa<InjectedClassNameType>(RI->getTypeForDecl()))3215RI->setTypeForDecl(nullptr);3216// This function tries to get the injected type from getTypeForDecl,3217// then from the previous declaration if possible. If not, it creates3218// a new type.3219Importer.getToContext().getInjectedClassNameType(RI, InjSpec);3220}3221// Set the new type for the injected decl too.3222if (Injected) {3223Injected->setTypeForDecl(nullptr);3224// This function will copy the injected type from D2CXX into Injected.3225// The injected decl does not have a previous decl to copy from.3226Importer.getToContext().getTypeDeclType(Injected, D2CXX);3227}3228}3229} else if (MemberSpecializationInfo *MemberInfo =3230DCXX->getMemberSpecializationInfo()) {3231TemplateSpecializationKind SK =3232MemberInfo->getTemplateSpecializationKind();3233CXXRecordDecl *FromInst = DCXX->getInstantiatedFromMemberClass();32343235if (Expected<CXXRecordDecl *> ToInstOrErr = import(FromInst))3236D2CXX->setInstantiationOfMemberClass(*ToInstOrErr, SK);3237else3238return ToInstOrErr.takeError();32393240if (ExpectedSLoc POIOrErr =3241import(MemberInfo->getPointOfInstantiation()))3242D2CXX->getMemberSpecializationInfo()->setPointOfInstantiation(3243*POIOrErr);3244else3245return POIOrErr.takeError();3246}32473248} else {3249if (GetImportedOrCreateDecl(D2, D, Importer.getToContext(),3250D->getTagKind(), DC, *BeginLocOrErr, Loc,3251Name.getAsIdentifierInfo(), PrevDecl))3252return D2;3253D2->setLexicalDeclContext(LexicalDC);3254addDeclToContexts(D, D2);3255}32563257if (auto BraceRangeOrErr = import(D->getBraceRange()))3258D2->setBraceRange(*BraceRangeOrErr);3259else3260return BraceRangeOrErr.takeError();3261if (auto QualifierLocOrErr = import(D->getQualifierLoc()))3262D2->setQualifierInfo(*QualifierLocOrErr);3263else3264return QualifierLocOrErr.takeError();32653266if (D->isAnonymousStructOrUnion())3267D2->setAnonymousStructOrUnion(true);32683269if (D->isCompleteDefinition())3270if (Error Err = ImportDefinition(D, D2, IDK_Default))3271return std::move(Err);32723273return D2;3274}32753276ExpectedDecl ASTNodeImporter::VisitEnumConstantDecl(EnumConstantDecl *D) {3277// Import the major distinguishing characteristics of this enumerator.3278DeclContext *DC, *LexicalDC;3279DeclarationName Name;3280SourceLocation Loc;3281NamedDecl *ToD;3282if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))3283return std::move(Err);3284if (ToD)3285return ToD;32863287// Determine whether there are any other declarations with the same name and3288// in the same context.3289if (!LexicalDC->isFunctionOrMethod()) {3290SmallVector<NamedDecl *, 4> ConflictingDecls;3291unsigned IDNS = Decl::IDNS_Ordinary;3292auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);3293for (auto *FoundDecl : FoundDecls) {3294if (!FoundDecl->isInIdentifierNamespace(IDNS))3295continue;32963297if (auto *FoundEnumConstant = dyn_cast<EnumConstantDecl>(FoundDecl)) {3298if (IsStructuralMatch(D, FoundEnumConstant))3299return Importer.MapImported(D, FoundEnumConstant);3300ConflictingDecls.push_back(FoundDecl);3301}3302}33033304if (!ConflictingDecls.empty()) {3305ExpectedName NameOrErr = Importer.HandleNameConflict(3306Name, DC, IDNS, ConflictingDecls.data(), ConflictingDecls.size());3307if (NameOrErr)3308Name = NameOrErr.get();3309else3310return NameOrErr.takeError();3311}3312}33133314ExpectedType TypeOrErr = import(D->getType());3315if (!TypeOrErr)3316return TypeOrErr.takeError();33173318ExpectedExpr InitOrErr = import(D->getInitExpr());3319if (!InitOrErr)3320return InitOrErr.takeError();33213322EnumConstantDecl *ToEnumerator;3323if (GetImportedOrCreateDecl(3324ToEnumerator, D, Importer.getToContext(), cast<EnumDecl>(DC), Loc,3325Name.getAsIdentifierInfo(), *TypeOrErr, *InitOrErr, D->getInitVal()))3326return ToEnumerator;33273328ToEnumerator->setAccess(D->getAccess());3329ToEnumerator->setLexicalDeclContext(LexicalDC);3330LexicalDC->addDeclInternal(ToEnumerator);3331return ToEnumerator;3332}33333334template <typename DeclTy>3335Error ASTNodeImporter::ImportTemplateParameterLists(const DeclTy *FromD,3336DeclTy *ToD) {3337unsigned int Num = FromD->getNumTemplateParameterLists();3338if (Num == 0)3339return Error::success();3340SmallVector<TemplateParameterList *, 2> ToTPLists(Num);3341for (unsigned int I = 0; I < Num; ++I)3342if (Expected<TemplateParameterList *> ToTPListOrErr =3343import(FromD->getTemplateParameterList(I)))3344ToTPLists[I] = *ToTPListOrErr;3345else3346return ToTPListOrErr.takeError();3347ToD->setTemplateParameterListsInfo(Importer.ToContext, ToTPLists);3348return Error::success();3349}33503351Error ASTNodeImporter::ImportTemplateInformation(3352FunctionDecl *FromFD, FunctionDecl *ToFD) {3353switch (FromFD->getTemplatedKind()) {3354case FunctionDecl::TK_NonTemplate:3355case FunctionDecl::TK_FunctionTemplate:3356return Error::success();33573358case FunctionDecl::TK_DependentNonTemplate:3359if (Expected<FunctionDecl *> InstFDOrErr =3360import(FromFD->getInstantiatedFromDecl()))3361ToFD->setInstantiatedFromDecl(*InstFDOrErr);3362return Error::success();3363case FunctionDecl::TK_MemberSpecialization: {3364TemplateSpecializationKind TSK = FromFD->getTemplateSpecializationKind();33653366if (Expected<FunctionDecl *> InstFDOrErr =3367import(FromFD->getInstantiatedFromMemberFunction()))3368ToFD->setInstantiationOfMemberFunction(*InstFDOrErr, TSK);3369else3370return InstFDOrErr.takeError();33713372if (ExpectedSLoc POIOrErr = import(3373FromFD->getMemberSpecializationInfo()->getPointOfInstantiation()))3374ToFD->getMemberSpecializationInfo()->setPointOfInstantiation(*POIOrErr);3375else3376return POIOrErr.takeError();33773378return Error::success();3379}33803381case FunctionDecl::TK_FunctionTemplateSpecialization: {3382auto FunctionAndArgsOrErr =3383ImportFunctionTemplateWithTemplateArgsFromSpecialization(FromFD);3384if (!FunctionAndArgsOrErr)3385return FunctionAndArgsOrErr.takeError();33863387TemplateArgumentList *ToTAList = TemplateArgumentList::CreateCopy(3388Importer.getToContext(), std::get<1>(*FunctionAndArgsOrErr));33893390auto *FTSInfo = FromFD->getTemplateSpecializationInfo();3391TemplateArgumentListInfo ToTAInfo;3392const auto *FromTAArgsAsWritten = FTSInfo->TemplateArgumentsAsWritten;3393if (FromTAArgsAsWritten)3394if (Error Err = ImportTemplateArgumentListInfo(3395*FromTAArgsAsWritten, ToTAInfo))3396return Err;33973398ExpectedSLoc POIOrErr = import(FTSInfo->getPointOfInstantiation());3399if (!POIOrErr)3400return POIOrErr.takeError();34013402if (Error Err = ImportTemplateParameterLists(FromFD, ToFD))3403return Err;34043405TemplateSpecializationKind TSK = FTSInfo->getTemplateSpecializationKind();3406ToFD->setFunctionTemplateSpecialization(3407std::get<0>(*FunctionAndArgsOrErr), ToTAList, /* InsertPos= */ nullptr,3408TSK, FromTAArgsAsWritten ? &ToTAInfo : nullptr, *POIOrErr);3409return Error::success();3410}34113412case FunctionDecl::TK_DependentFunctionTemplateSpecialization: {3413auto *FromInfo = FromFD->getDependentSpecializationInfo();3414UnresolvedSet<8> Candidates;3415for (FunctionTemplateDecl *FTD : FromInfo->getCandidates()) {3416if (Expected<FunctionTemplateDecl *> ToFTDOrErr = import(FTD))3417Candidates.addDecl(*ToFTDOrErr);3418else3419return ToFTDOrErr.takeError();3420}34213422// Import TemplateArgumentListInfo.3423TemplateArgumentListInfo ToTAInfo;3424const auto *FromTAArgsAsWritten = FromInfo->TemplateArgumentsAsWritten;3425if (FromTAArgsAsWritten)3426if (Error Err =3427ImportTemplateArgumentListInfo(*FromTAArgsAsWritten, ToTAInfo))3428return Err;34293430ToFD->setDependentTemplateSpecialization(3431Importer.getToContext(), Candidates,3432FromTAArgsAsWritten ? &ToTAInfo : nullptr);3433return Error::success();3434}3435}3436llvm_unreachable("All cases should be covered!");3437}34383439Expected<FunctionDecl *>3440ASTNodeImporter::FindFunctionTemplateSpecialization(FunctionDecl *FromFD) {3441auto FunctionAndArgsOrErr =3442ImportFunctionTemplateWithTemplateArgsFromSpecialization(FromFD);3443if (!FunctionAndArgsOrErr)3444return FunctionAndArgsOrErr.takeError();34453446FunctionTemplateDecl *Template;3447TemplateArgsTy ToTemplArgs;3448std::tie(Template, ToTemplArgs) = *FunctionAndArgsOrErr;3449void *InsertPos = nullptr;3450auto *FoundSpec = Template->findSpecialization(ToTemplArgs, InsertPos);3451return FoundSpec;3452}34533454Error ASTNodeImporter::ImportFunctionDeclBody(FunctionDecl *FromFD,3455FunctionDecl *ToFD) {3456if (Stmt *FromBody = FromFD->getBody()) {3457if (ExpectedStmt ToBodyOrErr = import(FromBody))3458ToFD->setBody(*ToBodyOrErr);3459else3460return ToBodyOrErr.takeError();3461}3462return Error::success();3463}34643465// Returns true if the given D has a DeclContext up to the TranslationUnitDecl3466// which is equal to the given DC, or D is equal to DC.3467static bool isAncestorDeclContextOf(const DeclContext *DC, const Decl *D) {3468const DeclContext *DCi = dyn_cast<DeclContext>(D);3469if (!DCi)3470DCi = D->getDeclContext();3471assert(DCi && "Declaration should have a context");3472while (DCi != D->getTranslationUnitDecl()) {3473if (DCi == DC)3474return true;3475DCi = DCi->getParent();3476}3477return false;3478}34793480// Check if there is a declaration that has 'DC' as parent context and is3481// referenced from statement 'S' or one of its children. The search is done in3482// BFS order through children of 'S'.3483static bool isAncestorDeclContextOf(const DeclContext *DC, const Stmt *S) {3484SmallVector<const Stmt *> ToProcess;3485ToProcess.push_back(S);3486while (!ToProcess.empty()) {3487const Stmt *CurrentS = ToProcess.pop_back_val();3488ToProcess.append(CurrentS->child_begin(), CurrentS->child_end());3489if (const auto *DeclRef = dyn_cast<DeclRefExpr>(CurrentS)) {3490if (const Decl *D = DeclRef->getDecl())3491if (isAncestorDeclContextOf(DC, D))3492return true;3493} else if (const auto *E =3494dyn_cast_or_null<SubstNonTypeTemplateParmExpr>(CurrentS)) {3495if (const Decl *D = E->getAssociatedDecl())3496if (isAncestorDeclContextOf(DC, D))3497return true;3498}3499}3500return false;3501}35023503namespace {3504/// Check if a type has any reference to a declaration that is inside the body3505/// of a function.3506/// The \c CheckType(QualType) function should be used to determine3507/// this property.3508///3509/// The type visitor visits one type object only (not recursive).3510/// To find all referenced declarations we must discover all type objects until3511/// the canonical type is reached (walk over typedef and similar objects). This3512/// is done by loop over all "sugar" type objects. For every such type we must3513/// check all declarations that are referenced from it. For this check the3514/// visitor is used. In the visit functions all referenced declarations except3515/// the one that follows in the sugar chain (if any) must be checked. For this3516/// check the same visitor is re-used (it has no state-dependent data).3517///3518/// The visit functions have 3 possible return values:3519/// - True, found a declaration inside \c ParentDC.3520/// - False, found declarations only outside \c ParentDC and it is not possible3521/// to find more declarations (the "sugar" chain does not continue).3522/// - Empty optional value, found no declarations or only outside \c ParentDC,3523/// but it is possible to find more declarations in the type "sugar" chain.3524/// The loop over the "sugar" types can be implemented by using type visit3525/// functions only (call \c CheckType with the desugared type). With the current3526/// solution no visit function is needed if the type has only a desugared type3527/// as data.3528class IsTypeDeclaredInsideVisitor3529: public TypeVisitor<IsTypeDeclaredInsideVisitor, std::optional<bool>> {3530public:3531IsTypeDeclaredInsideVisitor(const FunctionDecl *ParentDC)3532: ParentDC(ParentDC) {}35333534bool CheckType(QualType T) {3535// Check the chain of "sugar" types.3536// The "sugar" types are typedef or similar types that have the same3537// canonical type.3538if (std::optional<bool> Res = Visit(T.getTypePtr()))3539return *Res;3540QualType DsT =3541T.getSingleStepDesugaredType(ParentDC->getParentASTContext());3542while (DsT != T) {3543if (std::optional<bool> Res = Visit(DsT.getTypePtr()))3544return *Res;3545T = DsT;3546DsT = T.getSingleStepDesugaredType(ParentDC->getParentASTContext());3547}3548return false;3549}35503551std::optional<bool> VisitTagType(const TagType *T) {3552if (auto *Spec = dyn_cast<ClassTemplateSpecializationDecl>(T->getDecl()))3553for (const auto &Arg : Spec->getTemplateArgs().asArray())3554if (checkTemplateArgument(Arg))3555return true;3556return isAncestorDeclContextOf(ParentDC, T->getDecl());3557}35583559std::optional<bool> VisitPointerType(const PointerType *T) {3560return CheckType(T->getPointeeType());3561}35623563std::optional<bool> VisitReferenceType(const ReferenceType *T) {3564return CheckType(T->getPointeeTypeAsWritten());3565}35663567std::optional<bool> VisitTypedefType(const TypedefType *T) {3568const TypedefNameDecl *TD = T->getDecl();3569assert(TD);3570return isAncestorDeclContextOf(ParentDC, TD);3571}35723573std::optional<bool> VisitUsingType(const UsingType *T) {3574if (T->getFoundDecl() &&3575isAncestorDeclContextOf(ParentDC, T->getFoundDecl()))3576return true;35773578return {};3579}35803581std::optional<bool>3582VisitTemplateSpecializationType(const TemplateSpecializationType *T) {3583for (const auto &Arg : T->template_arguments())3584if (checkTemplateArgument(Arg))3585return true;3586// This type is a "sugar" to a record type, it can have a desugared type.3587return {};3588}35893590std::optional<bool>3591VisitSubstTemplateTypeParmType(const SubstTemplateTypeParmType *T) {3592// The "associated declaration" can be the same as ParentDC.3593if (isAncestorDeclContextOf(ParentDC, T->getAssociatedDecl()))3594return true;3595return {};3596}35973598std::optional<bool> VisitConstantArrayType(const ConstantArrayType *T) {3599if (T->getSizeExpr() && isAncestorDeclContextOf(ParentDC, T->getSizeExpr()))3600return true;36013602return CheckType(T->getElementType());3603}36043605std::optional<bool> VisitVariableArrayType(const VariableArrayType *T) {3606llvm_unreachable(3607"Variable array should not occur in deduced return type of a function");3608}36093610std::optional<bool> VisitIncompleteArrayType(const IncompleteArrayType *T) {3611llvm_unreachable("Incomplete array should not occur in deduced return type "3612"of a function");3613}36143615std::optional<bool> VisitDependentArrayType(const IncompleteArrayType *T) {3616llvm_unreachable("Dependent array should not occur in deduced return type "3617"of a function");3618}36193620private:3621const DeclContext *const ParentDC;36223623bool checkTemplateArgument(const TemplateArgument &Arg) {3624switch (Arg.getKind()) {3625case TemplateArgument::Null:3626return false;3627case TemplateArgument::Integral:3628return CheckType(Arg.getIntegralType());3629case TemplateArgument::Type:3630return CheckType(Arg.getAsType());3631case TemplateArgument::Expression:3632return isAncestorDeclContextOf(ParentDC, Arg.getAsExpr());3633case TemplateArgument::Declaration:3634// FIXME: The declaration in this case is not allowed to be in a function?3635return isAncestorDeclContextOf(ParentDC, Arg.getAsDecl());3636case TemplateArgument::NullPtr:3637// FIXME: The type is not allowed to be in the function?3638return CheckType(Arg.getNullPtrType());3639case TemplateArgument::StructuralValue:3640return CheckType(Arg.getStructuralValueType());3641case TemplateArgument::Pack:3642for (const auto &PackArg : Arg.getPackAsArray())3643if (checkTemplateArgument(PackArg))3644return true;3645return false;3646case TemplateArgument::Template:3647// Templates can not be defined locally in functions.3648// A template passed as argument can be not in ParentDC.3649return false;3650case TemplateArgument::TemplateExpansion:3651// Templates can not be defined locally in functions.3652// A template passed as argument can be not in ParentDC.3653return false;3654}3655llvm_unreachable("Unknown TemplateArgument::ArgKind enum");3656};3657};3658} // namespace36593660/// This function checks if the given function has a return type that contains3661/// a reference (in any way) to a declaration inside the same function.3662bool ASTNodeImporter::hasReturnTypeDeclaredInside(FunctionDecl *D) {3663QualType FromTy = D->getType();3664const auto *FromFPT = FromTy->getAs<FunctionProtoType>();3665assert(FromFPT && "Must be called on FunctionProtoType");36663667auto IsCXX11LambdaWithouTrailingReturn = [&]() {3668if (Importer.FromContext.getLangOpts().CPlusPlus14) // C++14 or later3669return false;36703671if (FromFPT->hasTrailingReturn())3672return false;36733674if (const auto *MD = dyn_cast<CXXMethodDecl>(D))3675return cast<CXXRecordDecl>(MD->getDeclContext())->isLambda();36763677return false;3678};36793680QualType RetT = FromFPT->getReturnType();3681if (isa<AutoType>(RetT.getTypePtr()) || IsCXX11LambdaWithouTrailingReturn()) {3682FunctionDecl *Def = D->getDefinition();3683IsTypeDeclaredInsideVisitor Visitor(Def ? Def : D);3684return Visitor.CheckType(RetT);3685}36863687return false;3688}36893690ExplicitSpecifier3691ASTNodeImporter::importExplicitSpecifier(Error &Err, ExplicitSpecifier ESpec) {3692Expr *ExplicitExpr = ESpec.getExpr();3693if (ExplicitExpr)3694ExplicitExpr = importChecked(Err, ESpec.getExpr());3695return ExplicitSpecifier(ExplicitExpr, ESpec.getKind());3696}36973698ExpectedDecl ASTNodeImporter::VisitFunctionDecl(FunctionDecl *D) {36993700SmallVector<Decl *, 2> Redecls = getCanonicalForwardRedeclChain(D);3701auto RedeclIt = Redecls.begin();3702// Import the first part of the decl chain. I.e. import all previous3703// declarations starting from the canonical decl.3704for (; RedeclIt != Redecls.end() && *RedeclIt != D; ++RedeclIt) {3705ExpectedDecl ToRedeclOrErr = import(*RedeclIt);3706if (!ToRedeclOrErr)3707return ToRedeclOrErr.takeError();3708}3709assert(*RedeclIt == D);37103711// Import the major distinguishing characteristics of this function.3712DeclContext *DC, *LexicalDC;3713DeclarationName Name;3714SourceLocation Loc;3715NamedDecl *ToD;3716if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))3717return std::move(Err);3718if (ToD)3719return ToD;37203721FunctionDecl *FoundByLookup = nullptr;3722FunctionTemplateDecl *FromFT = D->getDescribedFunctionTemplate();37233724// If this is a function template specialization, then try to find the same3725// existing specialization in the "to" context. The lookup below will not3726// find any specialization, but would find the primary template; thus, we3727// have to skip normal lookup in case of specializations.3728// FIXME handle member function templates (TK_MemberSpecialization) similarly?3729if (D->getTemplatedKind() ==3730FunctionDecl::TK_FunctionTemplateSpecialization) {3731auto FoundFunctionOrErr = FindFunctionTemplateSpecialization(D);3732if (!FoundFunctionOrErr)3733return FoundFunctionOrErr.takeError();3734if (FunctionDecl *FoundFunction = *FoundFunctionOrErr) {3735if (Decl *Def = FindAndMapDefinition(D, FoundFunction))3736return Def;3737FoundByLookup = FoundFunction;3738}3739}3740// Try to find a function in our own ("to") context with the same name, same3741// type, and in the same context as the function we're importing.3742else if (!LexicalDC->isFunctionOrMethod()) {3743SmallVector<NamedDecl *, 4> ConflictingDecls;3744unsigned IDNS = Decl::IDNS_Ordinary | Decl::IDNS_OrdinaryFriend;3745auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);3746for (auto *FoundDecl : FoundDecls) {3747if (!FoundDecl->isInIdentifierNamespace(IDNS))3748continue;37493750if (auto *FoundFunction = dyn_cast<FunctionDecl>(FoundDecl)) {3751if (!hasSameVisibilityContextAndLinkage(FoundFunction, D))3752continue;37533754if (IsStructuralMatch(D, FoundFunction)) {3755if (Decl *Def = FindAndMapDefinition(D, FoundFunction))3756return Def;3757FoundByLookup = FoundFunction;3758break;3759}3760// FIXME: Check for overloading more carefully, e.g., by boosting3761// Sema::IsOverload out to the AST library.37623763// Function overloading is okay in C++.3764if (Importer.getToContext().getLangOpts().CPlusPlus)3765continue;37663767// Complain about inconsistent function types.3768Importer.ToDiag(Loc, diag::warn_odr_function_type_inconsistent)3769<< Name << D->getType() << FoundFunction->getType();3770Importer.ToDiag(FoundFunction->getLocation(), diag::note_odr_value_here)3771<< FoundFunction->getType();3772ConflictingDecls.push_back(FoundDecl);3773}3774}37753776if (!ConflictingDecls.empty()) {3777ExpectedName NameOrErr = Importer.HandleNameConflict(3778Name, DC, IDNS, ConflictingDecls.data(), ConflictingDecls.size());3779if (NameOrErr)3780Name = NameOrErr.get();3781else3782return NameOrErr.takeError();3783}3784}37853786// We do not allow more than one in-class declaration of a function. This is3787// because AST clients like VTableBuilder asserts on this. VTableBuilder3788// assumes there is only one in-class declaration. Building a redecl3789// chain would result in more than one in-class declaration for3790// overrides (even if they are part of the same redecl chain inside the3791// derived class.)3792if (FoundByLookup) {3793if (isa<CXXMethodDecl>(FoundByLookup)) {3794if (D->getLexicalDeclContext() == D->getDeclContext()) {3795if (!D->doesThisDeclarationHaveABody()) {3796if (FunctionTemplateDecl *DescribedD =3797D->getDescribedFunctionTemplate()) {3798// Handle a "templated" function together with its described3799// template. This avoids need for a similar check at import of the3800// described template.3801assert(FoundByLookup->getDescribedFunctionTemplate() &&3802"Templated function mapped to non-templated?");3803Importer.MapImported(DescribedD,3804FoundByLookup->getDescribedFunctionTemplate());3805}3806return Importer.MapImported(D, FoundByLookup);3807} else {3808// Let's continue and build up the redecl chain in this case.3809// FIXME Merge the functions into one decl.3810}3811}3812}3813}38143815DeclarationNameInfo NameInfo(Name, Loc);3816// Import additional name location/type info.3817if (Error Err = ImportDeclarationNameLoc(D->getNameInfo(), NameInfo))3818return std::move(Err);38193820QualType FromTy = D->getType();3821TypeSourceInfo *FromTSI = D->getTypeSourceInfo();3822// Set to true if we do not import the type of the function as is. There are3823// cases when the original type would result in an infinite recursion during3824// the import. To avoid an infinite recursion when importing, we create the3825// FunctionDecl with a simplified function type and update it only after the3826// relevant AST nodes are already imported.3827// The type is related to TypeSourceInfo (it references the type), so we must3828// do the same with TypeSourceInfo.3829bool UsedDifferentProtoType = false;3830if (const auto *FromFPT = FromTy->getAs<FunctionProtoType>()) {3831QualType FromReturnTy = FromFPT->getReturnType();3832// Functions with auto return type may define a struct inside their body3833// and the return type could refer to that struct.3834// E.g.: auto foo() { struct X{}; return X(); }3835// To avoid an infinite recursion when importing, create the FunctionDecl3836// with a simplified return type.3837if (hasReturnTypeDeclaredInside(D)) {3838FromReturnTy = Importer.getFromContext().VoidTy;3839UsedDifferentProtoType = true;3840}3841FunctionProtoType::ExtProtoInfo FromEPI = FromFPT->getExtProtoInfo();3842// FunctionProtoType::ExtProtoInfo's ExceptionSpecDecl can point to the3843// FunctionDecl that we are importing the FunctionProtoType for.3844// To avoid an infinite recursion when importing, create the FunctionDecl3845// with a simplified function type.3846if (FromEPI.ExceptionSpec.SourceDecl ||3847FromEPI.ExceptionSpec.SourceTemplate ||3848FromEPI.ExceptionSpec.NoexceptExpr) {3849FunctionProtoType::ExtProtoInfo DefaultEPI;3850FromEPI = DefaultEPI;3851UsedDifferentProtoType = true;3852}3853FromTy = Importer.getFromContext().getFunctionType(3854FromReturnTy, FromFPT->getParamTypes(), FromEPI);3855FromTSI = Importer.getFromContext().getTrivialTypeSourceInfo(3856FromTy, D->getBeginLoc());3857}38583859Error Err = Error::success();3860auto T = importChecked(Err, FromTy);3861auto TInfo = importChecked(Err, FromTSI);3862auto ToInnerLocStart = importChecked(Err, D->getInnerLocStart());3863auto ToEndLoc = importChecked(Err, D->getEndLoc());3864auto ToDefaultLoc = importChecked(Err, D->getDefaultLoc());3865auto ToQualifierLoc = importChecked(Err, D->getQualifierLoc());3866auto TrailingRequiresClause =3867importChecked(Err, D->getTrailingRequiresClause());3868if (Err)3869return std::move(Err);38703871// Import the function parameters.3872SmallVector<ParmVarDecl *, 8> Parameters;3873for (auto *P : D->parameters()) {3874if (Expected<ParmVarDecl *> ToPOrErr = import(P))3875Parameters.push_back(*ToPOrErr);3876else3877return ToPOrErr.takeError();3878}38793880// Create the imported function.3881FunctionDecl *ToFunction = nullptr;3882if (auto *FromConstructor = dyn_cast<CXXConstructorDecl>(D)) {3883ExplicitSpecifier ESpec =3884importExplicitSpecifier(Err, FromConstructor->getExplicitSpecifier());3885if (Err)3886return std::move(Err);3887auto ToInheritedConstructor = InheritedConstructor();3888if (FromConstructor->isInheritingConstructor()) {3889Expected<InheritedConstructor> ImportedInheritedCtor =3890import(FromConstructor->getInheritedConstructor());3891if (!ImportedInheritedCtor)3892return ImportedInheritedCtor.takeError();3893ToInheritedConstructor = *ImportedInheritedCtor;3894}3895if (GetImportedOrCreateDecl<CXXConstructorDecl>(3896ToFunction, D, Importer.getToContext(), cast<CXXRecordDecl>(DC),3897ToInnerLocStart, NameInfo, T, TInfo, ESpec, D->UsesFPIntrin(),3898D->isInlineSpecified(), D->isImplicit(), D->getConstexprKind(),3899ToInheritedConstructor, TrailingRequiresClause))3900return ToFunction;3901} else if (CXXDestructorDecl *FromDtor = dyn_cast<CXXDestructorDecl>(D)) {39023903Error Err = Error::success();3904auto ToOperatorDelete = importChecked(3905Err, const_cast<FunctionDecl *>(FromDtor->getOperatorDelete()));3906auto ToThisArg = importChecked(Err, FromDtor->getOperatorDeleteThisArg());3907if (Err)3908return std::move(Err);39093910if (GetImportedOrCreateDecl<CXXDestructorDecl>(3911ToFunction, D, Importer.getToContext(), cast<CXXRecordDecl>(DC),3912ToInnerLocStart, NameInfo, T, TInfo, D->UsesFPIntrin(),3913D->isInlineSpecified(), D->isImplicit(), D->getConstexprKind(),3914TrailingRequiresClause))3915return ToFunction;39163917CXXDestructorDecl *ToDtor = cast<CXXDestructorDecl>(ToFunction);39183919ToDtor->setOperatorDelete(ToOperatorDelete, ToThisArg);3920} else if (CXXConversionDecl *FromConversion =3921dyn_cast<CXXConversionDecl>(D)) {3922ExplicitSpecifier ESpec =3923importExplicitSpecifier(Err, FromConversion->getExplicitSpecifier());3924if (Err)3925return std::move(Err);3926if (GetImportedOrCreateDecl<CXXConversionDecl>(3927ToFunction, D, Importer.getToContext(), cast<CXXRecordDecl>(DC),3928ToInnerLocStart, NameInfo, T, TInfo, D->UsesFPIntrin(),3929D->isInlineSpecified(), ESpec, D->getConstexprKind(),3930SourceLocation(), TrailingRequiresClause))3931return ToFunction;3932} else if (auto *Method = dyn_cast<CXXMethodDecl>(D)) {3933if (GetImportedOrCreateDecl<CXXMethodDecl>(3934ToFunction, D, Importer.getToContext(), cast<CXXRecordDecl>(DC),3935ToInnerLocStart, NameInfo, T, TInfo, Method->getStorageClass(),3936Method->UsesFPIntrin(), Method->isInlineSpecified(),3937D->getConstexprKind(), SourceLocation(), TrailingRequiresClause))3938return ToFunction;3939} else if (auto *Guide = dyn_cast<CXXDeductionGuideDecl>(D)) {3940ExplicitSpecifier ESpec =3941importExplicitSpecifier(Err, Guide->getExplicitSpecifier());3942CXXConstructorDecl *Ctor =3943importChecked(Err, Guide->getCorrespondingConstructor());3944if (Err)3945return std::move(Err);3946if (GetImportedOrCreateDecl<CXXDeductionGuideDecl>(3947ToFunction, D, Importer.getToContext(), DC, ToInnerLocStart, ESpec,3948NameInfo, T, TInfo, ToEndLoc, Ctor))3949return ToFunction;3950cast<CXXDeductionGuideDecl>(ToFunction)3951->setDeductionCandidateKind(Guide->getDeductionCandidateKind());3952} else {3953if (GetImportedOrCreateDecl(3954ToFunction, D, Importer.getToContext(), DC, ToInnerLocStart,3955NameInfo, T, TInfo, D->getStorageClass(), D->UsesFPIntrin(),3956D->isInlineSpecified(), D->hasWrittenPrototype(),3957D->getConstexprKind(), TrailingRequiresClause))3958return ToFunction;3959}39603961// Connect the redecl chain.3962if (FoundByLookup) {3963auto *Recent = const_cast<FunctionDecl *>(3964FoundByLookup->getMostRecentDecl());3965ToFunction->setPreviousDecl(Recent);3966// FIXME Probably we should merge exception specifications. E.g. In the3967// "To" context the existing function may have exception specification with3968// noexcept-unevaluated, while the newly imported function may have an3969// evaluated noexcept. A call to adjustExceptionSpec() on the imported3970// decl and its redeclarations may be required.3971}39723973StringLiteral *Msg = D->getDeletedMessage();3974if (Msg) {3975auto Imported = import(Msg);3976if (!Imported)3977return Imported.takeError();3978Msg = *Imported;3979}39803981ToFunction->setQualifierInfo(ToQualifierLoc);3982ToFunction->setAccess(D->getAccess());3983ToFunction->setLexicalDeclContext(LexicalDC);3984ToFunction->setVirtualAsWritten(D->isVirtualAsWritten());3985ToFunction->setTrivial(D->isTrivial());3986ToFunction->setIsPureVirtual(D->isPureVirtual());3987ToFunction->setDefaulted(D->isDefaulted());3988ToFunction->setExplicitlyDefaulted(D->isExplicitlyDefaulted());3989ToFunction->setDeletedAsWritten(D->isDeletedAsWritten());3990ToFunction->setFriendConstraintRefersToEnclosingTemplate(3991D->FriendConstraintRefersToEnclosingTemplate());3992ToFunction->setRangeEnd(ToEndLoc);3993ToFunction->setDefaultLoc(ToDefaultLoc);39943995if (Msg)3996ToFunction->setDefaultedOrDeletedInfo(3997FunctionDecl::DefaultedOrDeletedFunctionInfo::Create(3998Importer.getToContext(), {}, Msg));39994000// Set the parameters.4001for (auto *Param : Parameters) {4002Param->setOwningFunction(ToFunction);4003ToFunction->addDeclInternal(Param);4004if (ASTImporterLookupTable *LT = Importer.SharedState->getLookupTable())4005LT->update(Param, Importer.getToContext().getTranslationUnitDecl());4006}4007ToFunction->setParams(Parameters);40084009// We need to complete creation of FunctionProtoTypeLoc manually with setting4010// params it refers to.4011if (TInfo) {4012if (auto ProtoLoc =4013TInfo->getTypeLoc().IgnoreParens().getAs<FunctionProtoTypeLoc>()) {4014for (unsigned I = 0, N = Parameters.size(); I != N; ++I)4015ProtoLoc.setParam(I, Parameters[I]);4016}4017}40184019// Import the describing template function, if any.4020if (FromFT) {4021auto ToFTOrErr = import(FromFT);4022if (!ToFTOrErr)4023return ToFTOrErr.takeError();4024}40254026// Import Ctor initializers.4027if (auto *FromConstructor = dyn_cast<CXXConstructorDecl>(D)) {4028if (unsigned NumInitializers = FromConstructor->getNumCtorInitializers()) {4029SmallVector<CXXCtorInitializer *, 4> CtorInitializers(NumInitializers);4030// Import first, then allocate memory and copy if there was no error.4031if (Error Err = ImportContainerChecked(4032FromConstructor->inits(), CtorInitializers))4033return std::move(Err);4034auto **Memory =4035new (Importer.getToContext()) CXXCtorInitializer *[NumInitializers];4036std::copy(CtorInitializers.begin(), CtorInitializers.end(), Memory);4037auto *ToCtor = cast<CXXConstructorDecl>(ToFunction);4038ToCtor->setCtorInitializers(Memory);4039ToCtor->setNumCtorInitializers(NumInitializers);4040}4041}40424043// If it is a template, import all related things.4044if (Error Err = ImportTemplateInformation(D, ToFunction))4045return std::move(Err);40464047if (auto *FromCXXMethod = dyn_cast<CXXMethodDecl>(D))4048if (Error Err = ImportOverriddenMethods(cast<CXXMethodDecl>(ToFunction),4049FromCXXMethod))4050return std::move(Err);40514052if (D->doesThisDeclarationHaveABody()) {4053Error Err = ImportFunctionDeclBody(D, ToFunction);40544055if (Err)4056return std::move(Err);4057}40584059// Import and set the original type in case we used another type.4060if (UsedDifferentProtoType) {4061if (ExpectedType TyOrErr = import(D->getType()))4062ToFunction->setType(*TyOrErr);4063else4064return TyOrErr.takeError();4065if (Expected<TypeSourceInfo *> TSIOrErr = import(D->getTypeSourceInfo()))4066ToFunction->setTypeSourceInfo(*TSIOrErr);4067else4068return TSIOrErr.takeError();4069}40704071// FIXME: Other bits to merge?40724073addDeclToContexts(D, ToFunction);40744075// Import the rest of the chain. I.e. import all subsequent declarations.4076for (++RedeclIt; RedeclIt != Redecls.end(); ++RedeclIt) {4077ExpectedDecl ToRedeclOrErr = import(*RedeclIt);4078if (!ToRedeclOrErr)4079return ToRedeclOrErr.takeError();4080}40814082return ToFunction;4083}40844085ExpectedDecl ASTNodeImporter::VisitCXXMethodDecl(CXXMethodDecl *D) {4086return VisitFunctionDecl(D);4087}40884089ExpectedDecl ASTNodeImporter::VisitCXXConstructorDecl(CXXConstructorDecl *D) {4090return VisitCXXMethodDecl(D);4091}40924093ExpectedDecl ASTNodeImporter::VisitCXXDestructorDecl(CXXDestructorDecl *D) {4094return VisitCXXMethodDecl(D);4095}40964097ExpectedDecl ASTNodeImporter::VisitCXXConversionDecl(CXXConversionDecl *D) {4098return VisitCXXMethodDecl(D);4099}41004101ExpectedDecl4102ASTNodeImporter::VisitCXXDeductionGuideDecl(CXXDeductionGuideDecl *D) {4103return VisitFunctionDecl(D);4104}41054106ExpectedDecl ASTNodeImporter::VisitFieldDecl(FieldDecl *D) {4107// Import the major distinguishing characteristics of a variable.4108DeclContext *DC, *LexicalDC;4109DeclarationName Name;4110SourceLocation Loc;4111NamedDecl *ToD;4112if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))4113return std::move(Err);4114if (ToD)4115return ToD;41164117// Determine whether we've already imported this field.4118auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);4119for (auto *FoundDecl : FoundDecls) {4120if (FieldDecl *FoundField = dyn_cast<FieldDecl>(FoundDecl)) {4121// For anonymous fields, match up by index.4122if (!Name &&4123ASTImporter::getFieldIndex(D) !=4124ASTImporter::getFieldIndex(FoundField))4125continue;41264127if (Importer.IsStructurallyEquivalent(D->getType(),4128FoundField->getType())) {4129Importer.MapImported(D, FoundField);4130// In case of a FieldDecl of a ClassTemplateSpecializationDecl, the4131// initializer of a FieldDecl might not had been instantiated in the4132// "To" context. However, the "From" context might instantiated that,4133// thus we have to merge that.4134// Note: `hasInClassInitializer()` is not the same as non-null4135// `getInClassInitializer()` value.4136if (Expr *FromInitializer = D->getInClassInitializer()) {4137if (ExpectedExpr ToInitializerOrErr = import(FromInitializer)) {4138// Import of the FromInitializer may result in the setting of4139// InClassInitializer. If not, set it here.4140assert(FoundField->hasInClassInitializer() &&4141"Field should have an in-class initializer if it has an "4142"expression for it.");4143if (!FoundField->getInClassInitializer())4144FoundField->setInClassInitializer(*ToInitializerOrErr);4145} else {4146return ToInitializerOrErr.takeError();4147}4148}4149return FoundField;4150}41514152// FIXME: Why is this case not handled with calling HandleNameConflict?4153Importer.ToDiag(Loc, diag::warn_odr_field_type_inconsistent)4154<< Name << D->getType() << FoundField->getType();4155Importer.ToDiag(FoundField->getLocation(), diag::note_odr_value_here)4156<< FoundField->getType();41574158return make_error<ASTImportError>(ASTImportError::NameConflict);4159}4160}41614162Error Err = Error::success();4163auto ToType = importChecked(Err, D->getType());4164auto ToTInfo = importChecked(Err, D->getTypeSourceInfo());4165auto ToBitWidth = importChecked(Err, D->getBitWidth());4166auto ToInnerLocStart = importChecked(Err, D->getInnerLocStart());4167if (Err)4168return std::move(Err);4169const Type *ToCapturedVLAType = nullptr;4170if (Error Err = Importer.importInto(4171ToCapturedVLAType, cast_or_null<Type>(D->getCapturedVLAType())))4172return std::move(Err);41734174FieldDecl *ToField;4175if (GetImportedOrCreateDecl(ToField, D, Importer.getToContext(), DC,4176ToInnerLocStart, Loc, Name.getAsIdentifierInfo(),4177ToType, ToTInfo, ToBitWidth, D->isMutable(),4178D->getInClassInitStyle()))4179return ToField;41804181// We need [[no_unqiue_address]] attributes to be added to FieldDecl, before4182// we add fields in CXXRecordDecl::addedMember, otherwise record will be4183// marked as having non-zero size.4184Err = Importer.ImportAttrs(ToField, D);4185if (Err)4186return std::move(Err);4187ToField->setAccess(D->getAccess());4188ToField->setLexicalDeclContext(LexicalDC);4189ToField->setImplicit(D->isImplicit());4190if (ToCapturedVLAType)4191ToField->setCapturedVLAType(cast<VariableArrayType>(ToCapturedVLAType));4192LexicalDC->addDeclInternal(ToField);4193// Import initializer only after the field was created, it may have recursive4194// reference to the field.4195auto ToInitializer = importChecked(Err, D->getInClassInitializer());4196if (Err)4197return std::move(Err);4198if (ToInitializer) {4199auto *AlreadyImported = ToField->getInClassInitializer();4200if (AlreadyImported)4201assert(ToInitializer == AlreadyImported &&4202"Duplicate import of in-class initializer.");4203else4204ToField->setInClassInitializer(ToInitializer);4205}42064207return ToField;4208}42094210ExpectedDecl ASTNodeImporter::VisitIndirectFieldDecl(IndirectFieldDecl *D) {4211// Import the major distinguishing characteristics of a variable.4212DeclContext *DC, *LexicalDC;4213DeclarationName Name;4214SourceLocation Loc;4215NamedDecl *ToD;4216if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))4217return std::move(Err);4218if (ToD)4219return ToD;42204221// Determine whether we've already imported this field.4222auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);4223for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {4224if (auto *FoundField = dyn_cast<IndirectFieldDecl>(FoundDecls[I])) {4225// For anonymous indirect fields, match up by index.4226if (!Name &&4227ASTImporter::getFieldIndex(D) !=4228ASTImporter::getFieldIndex(FoundField))4229continue;42304231if (Importer.IsStructurallyEquivalent(D->getType(),4232FoundField->getType(),4233!Name.isEmpty())) {4234Importer.MapImported(D, FoundField);4235return FoundField;4236}42374238// If there are more anonymous fields to check, continue.4239if (!Name && I < N-1)4240continue;42414242// FIXME: Why is this case not handled with calling HandleNameConflict?4243Importer.ToDiag(Loc, diag::warn_odr_field_type_inconsistent)4244<< Name << D->getType() << FoundField->getType();4245Importer.ToDiag(FoundField->getLocation(), diag::note_odr_value_here)4246<< FoundField->getType();42474248return make_error<ASTImportError>(ASTImportError::NameConflict);4249}4250}42514252// Import the type.4253auto TypeOrErr = import(D->getType());4254if (!TypeOrErr)4255return TypeOrErr.takeError();42564257auto **NamedChain =4258new (Importer.getToContext()) NamedDecl*[D->getChainingSize()];42594260unsigned i = 0;4261for (auto *PI : D->chain())4262if (Expected<NamedDecl *> ToD = import(PI))4263NamedChain[i++] = *ToD;4264else4265return ToD.takeError();42664267llvm::MutableArrayRef<NamedDecl *> CH = {NamedChain, D->getChainingSize()};4268IndirectFieldDecl *ToIndirectField;4269if (GetImportedOrCreateDecl(ToIndirectField, D, Importer.getToContext(), DC,4270Loc, Name.getAsIdentifierInfo(), *TypeOrErr, CH))4271// FIXME here we leak `NamedChain` which is allocated before4272return ToIndirectField;42734274ToIndirectField->setAccess(D->getAccess());4275ToIndirectField->setLexicalDeclContext(LexicalDC);4276LexicalDC->addDeclInternal(ToIndirectField);4277return ToIndirectField;4278}42794280/// Used as return type of getFriendCountAndPosition.4281struct FriendCountAndPosition {4282/// Number of similar looking friends.4283unsigned int TotalCount;4284/// Index of the specific FriendDecl.4285unsigned int IndexOfDecl;4286};42874288static bool IsEquivalentFriend(ASTImporter &Importer, FriendDecl *FD1,4289FriendDecl *FD2) {4290if ((!FD1->getFriendType()) != (!FD2->getFriendType()))4291return false;42924293if (const TypeSourceInfo *TSI = FD1->getFriendType())4294return Importer.IsStructurallyEquivalent(4295TSI->getType(), FD2->getFriendType()->getType(), /*Complain=*/false);42964297ASTImporter::NonEquivalentDeclSet NonEquivalentDecls;4298StructuralEquivalenceContext Ctx(4299FD1->getASTContext(), FD2->getASTContext(), NonEquivalentDecls,4300StructuralEquivalenceKind::Default,4301/* StrictTypeSpelling = */ false, /* Complain = */ false);4302return Ctx.IsEquivalent(FD1, FD2);4303}43044305static FriendCountAndPosition getFriendCountAndPosition(ASTImporter &Importer,4306FriendDecl *FD) {4307unsigned int FriendCount = 0;4308std::optional<unsigned int> FriendPosition;4309const auto *RD = cast<CXXRecordDecl>(FD->getLexicalDeclContext());43104311for (FriendDecl *FoundFriend : RD->friends()) {4312if (FoundFriend == FD) {4313FriendPosition = FriendCount;4314++FriendCount;4315} else if (IsEquivalentFriend(Importer, FD, FoundFriend)) {4316++FriendCount;4317}4318}43194320assert(FriendPosition && "Friend decl not found in own parent.");43214322return {FriendCount, *FriendPosition};4323}43244325ExpectedDecl ASTNodeImporter::VisitFriendDecl(FriendDecl *D) {4326// Import the major distinguishing characteristics of a declaration.4327DeclContext *DC, *LexicalDC;4328if (Error Err = ImportDeclContext(D, DC, LexicalDC))4329return std::move(Err);43304331// Determine whether we've already imported this decl.4332// FriendDecl is not a NamedDecl so we cannot use lookup.4333// We try to maintain order and count of redundant friend declarations.4334const auto *RD = cast<CXXRecordDecl>(DC);4335SmallVector<FriendDecl *, 2> ImportedEquivalentFriends;4336for (FriendDecl *ImportedFriend : RD->friends())4337if (IsEquivalentFriend(Importer, D, ImportedFriend))4338ImportedEquivalentFriends.push_back(ImportedFriend);43394340FriendCountAndPosition CountAndPosition =4341getFriendCountAndPosition(Importer, D);43424343assert(ImportedEquivalentFriends.size() <= CountAndPosition.TotalCount &&4344"Class with non-matching friends is imported, ODR check wrong?");4345if (ImportedEquivalentFriends.size() == CountAndPosition.TotalCount)4346return Importer.MapImported(4347D, ImportedEquivalentFriends[CountAndPosition.IndexOfDecl]);43484349// Not found. Create it.4350// The declarations will be put into order later by ImportDeclContext.4351FriendDecl::FriendUnion ToFU;4352if (NamedDecl *FriendD = D->getFriendDecl()) {4353NamedDecl *ToFriendD;4354if (Error Err = importInto(ToFriendD, FriendD))4355return std::move(Err);43564357if (FriendD->getFriendObjectKind() != Decl::FOK_None &&4358!(FriendD->isInIdentifierNamespace(Decl::IDNS_NonMemberOperator)))4359ToFriendD->setObjectOfFriendDecl(false);43604361ToFU = ToFriendD;4362} else { // The friend is a type, not a decl.4363if (auto TSIOrErr = import(D->getFriendType()))4364ToFU = *TSIOrErr;4365else4366return TSIOrErr.takeError();4367}43684369SmallVector<TemplateParameterList *, 1> ToTPLists(D->NumTPLists);4370auto **FromTPLists = D->getTrailingObjects<TemplateParameterList *>();4371for (unsigned I = 0; I < D->NumTPLists; I++) {4372if (auto ListOrErr = import(FromTPLists[I]))4373ToTPLists[I] = *ListOrErr;4374else4375return ListOrErr.takeError();4376}43774378auto LocationOrErr = import(D->getLocation());4379if (!LocationOrErr)4380return LocationOrErr.takeError();4381auto FriendLocOrErr = import(D->getFriendLoc());4382if (!FriendLocOrErr)4383return FriendLocOrErr.takeError();43844385FriendDecl *FrD;4386if (GetImportedOrCreateDecl(FrD, D, Importer.getToContext(), DC,4387*LocationOrErr, ToFU,4388*FriendLocOrErr, ToTPLists))4389return FrD;43904391FrD->setAccess(D->getAccess());4392FrD->setLexicalDeclContext(LexicalDC);4393LexicalDC->addDeclInternal(FrD);4394return FrD;4395}43964397ExpectedDecl ASTNodeImporter::VisitObjCIvarDecl(ObjCIvarDecl *D) {4398// Import the major distinguishing characteristics of an ivar.4399DeclContext *DC, *LexicalDC;4400DeclarationName Name;4401SourceLocation Loc;4402NamedDecl *ToD;4403if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))4404return std::move(Err);4405if (ToD)4406return ToD;44074408// Determine whether we've already imported this ivar4409auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);4410for (auto *FoundDecl : FoundDecls) {4411if (ObjCIvarDecl *FoundIvar = dyn_cast<ObjCIvarDecl>(FoundDecl)) {4412if (Importer.IsStructurallyEquivalent(D->getType(),4413FoundIvar->getType())) {4414Importer.MapImported(D, FoundIvar);4415return FoundIvar;4416}44174418Importer.ToDiag(Loc, diag::warn_odr_ivar_type_inconsistent)4419<< Name << D->getType() << FoundIvar->getType();4420Importer.ToDiag(FoundIvar->getLocation(), diag::note_odr_value_here)4421<< FoundIvar->getType();44224423return make_error<ASTImportError>(ASTImportError::NameConflict);4424}4425}44264427Error Err = Error::success();4428auto ToType = importChecked(Err, D->getType());4429auto ToTypeSourceInfo = importChecked(Err, D->getTypeSourceInfo());4430auto ToBitWidth = importChecked(Err, D->getBitWidth());4431auto ToInnerLocStart = importChecked(Err, D->getInnerLocStart());4432if (Err)4433return std::move(Err);44344435ObjCIvarDecl *ToIvar;4436if (GetImportedOrCreateDecl(4437ToIvar, D, Importer.getToContext(), cast<ObjCContainerDecl>(DC),4438ToInnerLocStart, Loc, Name.getAsIdentifierInfo(),4439ToType, ToTypeSourceInfo,4440D->getAccessControl(),ToBitWidth, D->getSynthesize()))4441return ToIvar;44424443ToIvar->setLexicalDeclContext(LexicalDC);4444LexicalDC->addDeclInternal(ToIvar);4445return ToIvar;4446}44474448ExpectedDecl ASTNodeImporter::VisitVarDecl(VarDecl *D) {44494450SmallVector<Decl*, 2> Redecls = getCanonicalForwardRedeclChain(D);4451auto RedeclIt = Redecls.begin();4452// Import the first part of the decl chain. I.e. import all previous4453// declarations starting from the canonical decl.4454for (; RedeclIt != Redecls.end() && *RedeclIt != D; ++RedeclIt) {4455ExpectedDecl RedeclOrErr = import(*RedeclIt);4456if (!RedeclOrErr)4457return RedeclOrErr.takeError();4458}4459assert(*RedeclIt == D);44604461// Import the major distinguishing characteristics of a variable.4462DeclContext *DC, *LexicalDC;4463DeclarationName Name;4464SourceLocation Loc;4465NamedDecl *ToD;4466if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))4467return std::move(Err);4468if (ToD)4469return ToD;44704471// Try to find a variable in our own ("to") context with the same name and4472// in the same context as the variable we're importing.4473VarDecl *FoundByLookup = nullptr;4474if (D->isFileVarDecl()) {4475SmallVector<NamedDecl *, 4> ConflictingDecls;4476unsigned IDNS = Decl::IDNS_Ordinary;4477auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);4478for (auto *FoundDecl : FoundDecls) {4479if (!FoundDecl->isInIdentifierNamespace(IDNS))4480continue;44814482if (auto *FoundVar = dyn_cast<VarDecl>(FoundDecl)) {4483if (!hasSameVisibilityContextAndLinkage(FoundVar, D))4484continue;4485if (Importer.IsStructurallyEquivalent(D->getType(),4486FoundVar->getType())) {44874488// The VarDecl in the "From" context has a definition, but in the4489// "To" context we already have a definition.4490VarDecl *FoundDef = FoundVar->getDefinition();4491if (D->isThisDeclarationADefinition() && FoundDef)4492// FIXME Check for ODR error if the two definitions have4493// different initializers?4494return Importer.MapImported(D, FoundDef);44954496// The VarDecl in the "From" context has an initializer, but in the4497// "To" context we already have an initializer.4498const VarDecl *FoundDInit = nullptr;4499if (D->getInit() && FoundVar->getAnyInitializer(FoundDInit))4500// FIXME Diagnose ODR error if the two initializers are different?4501return Importer.MapImported(D, const_cast<VarDecl*>(FoundDInit));45024503FoundByLookup = FoundVar;4504break;4505}45064507const ArrayType *FoundArray4508= Importer.getToContext().getAsArrayType(FoundVar->getType());4509const ArrayType *TArray4510= Importer.getToContext().getAsArrayType(D->getType());4511if (FoundArray && TArray) {4512if (isa<IncompleteArrayType>(FoundArray) &&4513isa<ConstantArrayType>(TArray)) {4514// Import the type.4515if (auto TyOrErr = import(D->getType()))4516FoundVar->setType(*TyOrErr);4517else4518return TyOrErr.takeError();45194520FoundByLookup = FoundVar;4521break;4522} else if (isa<IncompleteArrayType>(TArray) &&4523isa<ConstantArrayType>(FoundArray)) {4524FoundByLookup = FoundVar;4525break;4526}4527}45284529Importer.ToDiag(Loc, diag::warn_odr_variable_type_inconsistent)4530<< Name << D->getType() << FoundVar->getType();4531Importer.ToDiag(FoundVar->getLocation(), diag::note_odr_value_here)4532<< FoundVar->getType();4533ConflictingDecls.push_back(FoundDecl);4534}4535}45364537if (!ConflictingDecls.empty()) {4538ExpectedName NameOrErr = Importer.HandleNameConflict(4539Name, DC, IDNS, ConflictingDecls.data(), ConflictingDecls.size());4540if (NameOrErr)4541Name = NameOrErr.get();4542else4543return NameOrErr.takeError();4544}4545}45464547Error Err = Error::success();4548auto ToType = importChecked(Err, D->getType());4549auto ToTypeSourceInfo = importChecked(Err, D->getTypeSourceInfo());4550auto ToInnerLocStart = importChecked(Err, D->getInnerLocStart());4551auto ToQualifierLoc = importChecked(Err, D->getQualifierLoc());4552if (Err)4553return std::move(Err);45544555VarDecl *ToVar;4556if (auto *FromDecomp = dyn_cast<DecompositionDecl>(D)) {4557SmallVector<BindingDecl *> Bindings(FromDecomp->bindings().size());4558if (Error Err =4559ImportArrayChecked(FromDecomp->bindings(), Bindings.begin()))4560return std::move(Err);4561DecompositionDecl *ToDecomp;4562if (GetImportedOrCreateDecl(4563ToDecomp, FromDecomp, Importer.getToContext(), DC, ToInnerLocStart,4564Loc, ToType, ToTypeSourceInfo, D->getStorageClass(), Bindings))4565return ToDecomp;4566ToVar = ToDecomp;4567} else {4568// Create the imported variable.4569if (GetImportedOrCreateDecl(ToVar, D, Importer.getToContext(), DC,4570ToInnerLocStart, Loc,4571Name.getAsIdentifierInfo(), ToType,4572ToTypeSourceInfo, D->getStorageClass()))4573return ToVar;4574}45754576ToVar->setTSCSpec(D->getTSCSpec());4577ToVar->setQualifierInfo(ToQualifierLoc);4578ToVar->setAccess(D->getAccess());4579ToVar->setLexicalDeclContext(LexicalDC);4580if (D->isInlineSpecified())4581ToVar->setInlineSpecified();4582if (D->isInline())4583ToVar->setImplicitlyInline();45844585if (FoundByLookup) {4586auto *Recent = const_cast<VarDecl *>(FoundByLookup->getMostRecentDecl());4587ToVar->setPreviousDecl(Recent);4588}45894590// Import the described template, if any.4591if (D->getDescribedVarTemplate()) {4592auto ToVTOrErr = import(D->getDescribedVarTemplate());4593if (!ToVTOrErr)4594return ToVTOrErr.takeError();4595} else if (MemberSpecializationInfo *MSI = D->getMemberSpecializationInfo()) {4596TemplateSpecializationKind SK = MSI->getTemplateSpecializationKind();4597VarDecl *FromInst = D->getInstantiatedFromStaticDataMember();4598if (Expected<VarDecl *> ToInstOrErr = import(FromInst))4599ToVar->setInstantiationOfStaticDataMember(*ToInstOrErr, SK);4600else4601return ToInstOrErr.takeError();4602if (ExpectedSLoc POIOrErr = import(MSI->getPointOfInstantiation()))4603ToVar->getMemberSpecializationInfo()->setPointOfInstantiation(*POIOrErr);4604else4605return POIOrErr.takeError();4606}46074608if (Error Err = ImportInitializer(D, ToVar))4609return std::move(Err);46104611if (D->isConstexpr())4612ToVar->setConstexpr(true);46134614addDeclToContexts(D, ToVar);46154616// Import the rest of the chain. I.e. import all subsequent declarations.4617for (++RedeclIt; RedeclIt != Redecls.end(); ++RedeclIt) {4618ExpectedDecl RedeclOrErr = import(*RedeclIt);4619if (!RedeclOrErr)4620return RedeclOrErr.takeError();4621}46224623return ToVar;4624}46254626ExpectedDecl ASTNodeImporter::VisitImplicitParamDecl(ImplicitParamDecl *D) {4627// Parameters are created in the translation unit's context, then moved4628// into the function declaration's context afterward.4629DeclContext *DC = Importer.getToContext().getTranslationUnitDecl();46304631Error Err = Error::success();4632auto ToDeclName = importChecked(Err, D->getDeclName());4633auto ToLocation = importChecked(Err, D->getLocation());4634auto ToType = importChecked(Err, D->getType());4635if (Err)4636return std::move(Err);46374638// Create the imported parameter.4639ImplicitParamDecl *ToParm = nullptr;4640if (GetImportedOrCreateDecl(ToParm, D, Importer.getToContext(), DC,4641ToLocation, ToDeclName.getAsIdentifierInfo(),4642ToType, D->getParameterKind()))4643return ToParm;4644return ToParm;4645}46464647Error ASTNodeImporter::ImportDefaultArgOfParmVarDecl(4648const ParmVarDecl *FromParam, ParmVarDecl *ToParam) {4649ToParam->setHasInheritedDefaultArg(FromParam->hasInheritedDefaultArg());4650ToParam->setExplicitObjectParameterLoc(4651FromParam->getExplicitObjectParamThisLoc());4652ToParam->setKNRPromoted(FromParam->isKNRPromoted());46534654if (FromParam->hasUninstantiatedDefaultArg()) {4655if (auto ToDefArgOrErr = import(FromParam->getUninstantiatedDefaultArg()))4656ToParam->setUninstantiatedDefaultArg(*ToDefArgOrErr);4657else4658return ToDefArgOrErr.takeError();4659} else if (FromParam->hasUnparsedDefaultArg()) {4660ToParam->setUnparsedDefaultArg();4661} else if (FromParam->hasDefaultArg()) {4662if (auto ToDefArgOrErr = import(FromParam->getDefaultArg()))4663ToParam->setDefaultArg(*ToDefArgOrErr);4664else4665return ToDefArgOrErr.takeError();4666}46674668return Error::success();4669}46704671Expected<InheritedConstructor>4672ASTNodeImporter::ImportInheritedConstructor(const InheritedConstructor &From) {4673Error Err = Error::success();4674CXXConstructorDecl *ToBaseCtor = importChecked(Err, From.getConstructor());4675ConstructorUsingShadowDecl *ToShadow =4676importChecked(Err, From.getShadowDecl());4677if (Err)4678return std::move(Err);4679return InheritedConstructor(ToShadow, ToBaseCtor);4680}46814682ExpectedDecl ASTNodeImporter::VisitParmVarDecl(ParmVarDecl *D) {4683// Parameters are created in the translation unit's context, then moved4684// into the function declaration's context afterward.4685DeclContext *DC = Importer.getToContext().getTranslationUnitDecl();46864687Error Err = Error::success();4688auto ToDeclName = importChecked(Err, D->getDeclName());4689auto ToLocation = importChecked(Err, D->getLocation());4690auto ToInnerLocStart = importChecked(Err, D->getInnerLocStart());4691auto ToType = importChecked(Err, D->getType());4692auto ToTypeSourceInfo = importChecked(Err, D->getTypeSourceInfo());4693if (Err)4694return std::move(Err);46954696ParmVarDecl *ToParm;4697if (GetImportedOrCreateDecl(ToParm, D, Importer.getToContext(), DC,4698ToInnerLocStart, ToLocation,4699ToDeclName.getAsIdentifierInfo(), ToType,4700ToTypeSourceInfo, D->getStorageClass(),4701/*DefaultArg*/ nullptr))4702return ToParm;47034704// Set the default argument. It should be no problem if it was already done.4705// Do not import the default expression before GetImportedOrCreateDecl call4706// to avoid possible infinite import loop because circular dependency.4707if (Error Err = ImportDefaultArgOfParmVarDecl(D, ToParm))4708return std::move(Err);47094710if (D->isObjCMethodParameter()) {4711ToParm->setObjCMethodScopeInfo(D->getFunctionScopeIndex());4712ToParm->setObjCDeclQualifier(D->getObjCDeclQualifier());4713} else {4714ToParm->setScopeInfo(D->getFunctionScopeDepth(),4715D->getFunctionScopeIndex());4716}47174718return ToParm;4719}47204721ExpectedDecl ASTNodeImporter::VisitObjCMethodDecl(ObjCMethodDecl *D) {4722// Import the major distinguishing characteristics of a method.4723DeclContext *DC, *LexicalDC;4724DeclarationName Name;4725SourceLocation Loc;4726NamedDecl *ToD;4727if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))4728return std::move(Err);4729if (ToD)4730return ToD;47314732auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);4733for (auto *FoundDecl : FoundDecls) {4734if (auto *FoundMethod = dyn_cast<ObjCMethodDecl>(FoundDecl)) {4735if (FoundMethod->isInstanceMethod() != D->isInstanceMethod())4736continue;47374738// Check return types.4739if (!Importer.IsStructurallyEquivalent(D->getReturnType(),4740FoundMethod->getReturnType())) {4741Importer.ToDiag(Loc, diag::warn_odr_objc_method_result_type_inconsistent)4742<< D->isInstanceMethod() << Name << D->getReturnType()4743<< FoundMethod->getReturnType();4744Importer.ToDiag(FoundMethod->getLocation(),4745diag::note_odr_objc_method_here)4746<< D->isInstanceMethod() << Name;47474748return make_error<ASTImportError>(ASTImportError::NameConflict);4749}47504751// Check the number of parameters.4752if (D->param_size() != FoundMethod->param_size()) {4753Importer.ToDiag(Loc, diag::warn_odr_objc_method_num_params_inconsistent)4754<< D->isInstanceMethod() << Name4755<< D->param_size() << FoundMethod->param_size();4756Importer.ToDiag(FoundMethod->getLocation(),4757diag::note_odr_objc_method_here)4758<< D->isInstanceMethod() << Name;47594760return make_error<ASTImportError>(ASTImportError::NameConflict);4761}47624763// Check parameter types.4764for (ObjCMethodDecl::param_iterator P = D->param_begin(),4765PEnd = D->param_end(), FoundP = FoundMethod->param_begin();4766P != PEnd; ++P, ++FoundP) {4767if (!Importer.IsStructurallyEquivalent((*P)->getType(),4768(*FoundP)->getType())) {4769Importer.FromDiag((*P)->getLocation(),4770diag::warn_odr_objc_method_param_type_inconsistent)4771<< D->isInstanceMethod() << Name4772<< (*P)->getType() << (*FoundP)->getType();4773Importer.ToDiag((*FoundP)->getLocation(), diag::note_odr_value_here)4774<< (*FoundP)->getType();47754776return make_error<ASTImportError>(ASTImportError::NameConflict);4777}4778}47794780// Check variadic/non-variadic.4781// Check the number of parameters.4782if (D->isVariadic() != FoundMethod->isVariadic()) {4783Importer.ToDiag(Loc, diag::warn_odr_objc_method_variadic_inconsistent)4784<< D->isInstanceMethod() << Name;4785Importer.ToDiag(FoundMethod->getLocation(),4786diag::note_odr_objc_method_here)4787<< D->isInstanceMethod() << Name;47884789return make_error<ASTImportError>(ASTImportError::NameConflict);4790}47914792// FIXME: Any other bits we need to merge?4793return Importer.MapImported(D, FoundMethod);4794}4795}47964797Error Err = Error::success();4798auto ToEndLoc = importChecked(Err, D->getEndLoc());4799auto ToReturnType = importChecked(Err, D->getReturnType());4800auto ToReturnTypeSourceInfo =4801importChecked(Err, D->getReturnTypeSourceInfo());4802if (Err)4803return std::move(Err);48044805ObjCMethodDecl *ToMethod;4806if (GetImportedOrCreateDecl(4807ToMethod, D, Importer.getToContext(), Loc, ToEndLoc,4808Name.getObjCSelector(), ToReturnType, ToReturnTypeSourceInfo, DC,4809D->isInstanceMethod(), D->isVariadic(), D->isPropertyAccessor(),4810D->isSynthesizedAccessorStub(), D->isImplicit(), D->isDefined(),4811D->getImplementationControl(), D->hasRelatedResultType()))4812return ToMethod;48134814// FIXME: When we decide to merge method definitions, we'll need to4815// deal with implicit parameters.48164817// Import the parameters4818SmallVector<ParmVarDecl *, 5> ToParams;4819for (auto *FromP : D->parameters()) {4820if (Expected<ParmVarDecl *> ToPOrErr = import(FromP))4821ToParams.push_back(*ToPOrErr);4822else4823return ToPOrErr.takeError();4824}48254826// Set the parameters.4827for (auto *ToParam : ToParams) {4828ToParam->setOwningFunction(ToMethod);4829ToMethod->addDeclInternal(ToParam);4830}48314832SmallVector<SourceLocation, 12> FromSelLocs;4833D->getSelectorLocs(FromSelLocs);4834SmallVector<SourceLocation, 12> ToSelLocs(FromSelLocs.size());4835if (Error Err = ImportContainerChecked(FromSelLocs, ToSelLocs))4836return std::move(Err);48374838ToMethod->setMethodParams(Importer.getToContext(), ToParams, ToSelLocs);48394840ToMethod->setLexicalDeclContext(LexicalDC);4841LexicalDC->addDeclInternal(ToMethod);48424843// Implicit params are declared when Sema encounters the definition but this4844// never happens when the method is imported. Manually declare the implicit4845// params now that the MethodDecl knows its class interface.4846if (D->getSelfDecl())4847ToMethod->createImplicitParams(Importer.getToContext(),4848ToMethod->getClassInterface());48494850return ToMethod;4851}48524853ExpectedDecl ASTNodeImporter::VisitObjCTypeParamDecl(ObjCTypeParamDecl *D) {4854// Import the major distinguishing characteristics of a category.4855DeclContext *DC, *LexicalDC;4856DeclarationName Name;4857SourceLocation Loc;4858NamedDecl *ToD;4859if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))4860return std::move(Err);4861if (ToD)4862return ToD;48634864Error Err = Error::success();4865auto ToVarianceLoc = importChecked(Err, D->getVarianceLoc());4866auto ToLocation = importChecked(Err, D->getLocation());4867auto ToColonLoc = importChecked(Err, D->getColonLoc());4868auto ToTypeSourceInfo = importChecked(Err, D->getTypeSourceInfo());4869if (Err)4870return std::move(Err);48714872ObjCTypeParamDecl *Result;4873if (GetImportedOrCreateDecl(4874Result, D, Importer.getToContext(), DC, D->getVariance(),4875ToVarianceLoc, D->getIndex(),4876ToLocation, Name.getAsIdentifierInfo(),4877ToColonLoc, ToTypeSourceInfo))4878return Result;48794880// Only import 'ObjCTypeParamType' after the decl is created.4881auto ToTypeForDecl = importChecked(Err, D->getTypeForDecl());4882if (Err)4883return std::move(Err);4884Result->setTypeForDecl(ToTypeForDecl);4885Result->setLexicalDeclContext(LexicalDC);4886return Result;4887}48884889ExpectedDecl ASTNodeImporter::VisitObjCCategoryDecl(ObjCCategoryDecl *D) {4890// Import the major distinguishing characteristics of a category.4891DeclContext *DC, *LexicalDC;4892DeclarationName Name;4893SourceLocation Loc;4894NamedDecl *ToD;4895if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))4896return std::move(Err);4897if (ToD)4898return ToD;48994900ObjCInterfaceDecl *ToInterface;4901if (Error Err = importInto(ToInterface, D->getClassInterface()))4902return std::move(Err);49034904// Determine if we've already encountered this category.4905ObjCCategoryDecl *MergeWithCategory4906= ToInterface->FindCategoryDeclaration(Name.getAsIdentifierInfo());4907ObjCCategoryDecl *ToCategory = MergeWithCategory;4908if (!ToCategory) {49094910Error Err = Error::success();4911auto ToAtStartLoc = importChecked(Err, D->getAtStartLoc());4912auto ToCategoryNameLoc = importChecked(Err, D->getCategoryNameLoc());4913auto ToIvarLBraceLoc = importChecked(Err, D->getIvarLBraceLoc());4914auto ToIvarRBraceLoc = importChecked(Err, D->getIvarRBraceLoc());4915if (Err)4916return std::move(Err);49174918if (GetImportedOrCreateDecl(ToCategory, D, Importer.getToContext(), DC,4919ToAtStartLoc, Loc,4920ToCategoryNameLoc,4921Name.getAsIdentifierInfo(), ToInterface,4922/*TypeParamList=*/nullptr,4923ToIvarLBraceLoc,4924ToIvarRBraceLoc))4925return ToCategory;49264927ToCategory->setLexicalDeclContext(LexicalDC);4928LexicalDC->addDeclInternal(ToCategory);4929// Import the type parameter list after MapImported, to avoid4930// loops when bringing in their DeclContext.4931if (auto PListOrErr = ImportObjCTypeParamList(D->getTypeParamList()))4932ToCategory->setTypeParamList(*PListOrErr);4933else4934return PListOrErr.takeError();49354936// Import protocols4937SmallVector<ObjCProtocolDecl *, 4> Protocols;4938SmallVector<SourceLocation, 4> ProtocolLocs;4939ObjCCategoryDecl::protocol_loc_iterator FromProtoLoc4940= D->protocol_loc_begin();4941for (ObjCCategoryDecl::protocol_iterator FromProto = D->protocol_begin(),4942FromProtoEnd = D->protocol_end();4943FromProto != FromProtoEnd;4944++FromProto, ++FromProtoLoc) {4945if (Expected<ObjCProtocolDecl *> ToProtoOrErr = import(*FromProto))4946Protocols.push_back(*ToProtoOrErr);4947else4948return ToProtoOrErr.takeError();49494950if (ExpectedSLoc ToProtoLocOrErr = import(*FromProtoLoc))4951ProtocolLocs.push_back(*ToProtoLocOrErr);4952else4953return ToProtoLocOrErr.takeError();4954}49554956// FIXME: If we're merging, make sure that the protocol list is the same.4957ToCategory->setProtocolList(Protocols.data(), Protocols.size(),4958ProtocolLocs.data(), Importer.getToContext());49594960} else {4961Importer.MapImported(D, ToCategory);4962}49634964// Import all of the members of this category.4965if (Error Err = ImportDeclContext(D))4966return std::move(Err);49674968// If we have an implementation, import it as well.4969if (D->getImplementation()) {4970if (Expected<ObjCCategoryImplDecl *> ToImplOrErr =4971import(D->getImplementation()))4972ToCategory->setImplementation(*ToImplOrErr);4973else4974return ToImplOrErr.takeError();4975}49764977return ToCategory;4978}49794980Error ASTNodeImporter::ImportDefinition(4981ObjCProtocolDecl *From, ObjCProtocolDecl *To, ImportDefinitionKind Kind) {4982if (To->getDefinition()) {4983if (shouldForceImportDeclContext(Kind))4984if (Error Err = ImportDeclContext(From))4985return Err;4986return Error::success();4987}49884989// Start the protocol definition4990To->startDefinition();49914992// Import protocols4993SmallVector<ObjCProtocolDecl *, 4> Protocols;4994SmallVector<SourceLocation, 4> ProtocolLocs;4995ObjCProtocolDecl::protocol_loc_iterator FromProtoLoc =4996From->protocol_loc_begin();4997for (ObjCProtocolDecl::protocol_iterator FromProto = From->protocol_begin(),4998FromProtoEnd = From->protocol_end();4999FromProto != FromProtoEnd;5000++FromProto, ++FromProtoLoc) {5001if (Expected<ObjCProtocolDecl *> ToProtoOrErr = import(*FromProto))5002Protocols.push_back(*ToProtoOrErr);5003else5004return ToProtoOrErr.takeError();50055006if (ExpectedSLoc ToProtoLocOrErr = import(*FromProtoLoc))5007ProtocolLocs.push_back(*ToProtoLocOrErr);5008else5009return ToProtoLocOrErr.takeError();50105011}50125013// FIXME: If we're merging, make sure that the protocol list is the same.5014To->setProtocolList(Protocols.data(), Protocols.size(),5015ProtocolLocs.data(), Importer.getToContext());50165017if (shouldForceImportDeclContext(Kind)) {5018// Import all of the members of this protocol.5019if (Error Err = ImportDeclContext(From, /*ForceImport=*/true))5020return Err;5021}5022return Error::success();5023}50245025ExpectedDecl ASTNodeImporter::VisitObjCProtocolDecl(ObjCProtocolDecl *D) {5026// If this protocol has a definition in the translation unit we're coming5027// from, but this particular declaration is not that definition, import the5028// definition and map to that.5029ObjCProtocolDecl *Definition = D->getDefinition();5030if (Definition && Definition != D) {5031if (ExpectedDecl ImportedDefOrErr = import(Definition))5032return Importer.MapImported(D, *ImportedDefOrErr);5033else5034return ImportedDefOrErr.takeError();5035}50365037// Import the major distinguishing characteristics of a protocol.5038DeclContext *DC, *LexicalDC;5039DeclarationName Name;5040SourceLocation Loc;5041NamedDecl *ToD;5042if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))5043return std::move(Err);5044if (ToD)5045return ToD;50465047ObjCProtocolDecl *MergeWithProtocol = nullptr;5048auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);5049for (auto *FoundDecl : FoundDecls) {5050if (!FoundDecl->isInIdentifierNamespace(Decl::IDNS_ObjCProtocol))5051continue;50525053if ((MergeWithProtocol = dyn_cast<ObjCProtocolDecl>(FoundDecl)))5054break;5055}50565057ObjCProtocolDecl *ToProto = MergeWithProtocol;5058if (!ToProto) {5059auto ToAtBeginLocOrErr = import(D->getAtStartLoc());5060if (!ToAtBeginLocOrErr)5061return ToAtBeginLocOrErr.takeError();50625063if (GetImportedOrCreateDecl(ToProto, D, Importer.getToContext(), DC,5064Name.getAsIdentifierInfo(), Loc,5065*ToAtBeginLocOrErr,5066/*PrevDecl=*/nullptr))5067return ToProto;5068ToProto->setLexicalDeclContext(LexicalDC);5069LexicalDC->addDeclInternal(ToProto);5070}50715072Importer.MapImported(D, ToProto);50735074if (D->isThisDeclarationADefinition())5075if (Error Err = ImportDefinition(D, ToProto))5076return std::move(Err);50775078return ToProto;5079}50805081ExpectedDecl ASTNodeImporter::VisitLinkageSpecDecl(LinkageSpecDecl *D) {5082DeclContext *DC, *LexicalDC;5083if (Error Err = ImportDeclContext(D, DC, LexicalDC))5084return std::move(Err);50855086ExpectedSLoc ExternLocOrErr = import(D->getExternLoc());5087if (!ExternLocOrErr)5088return ExternLocOrErr.takeError();50895090ExpectedSLoc LangLocOrErr = import(D->getLocation());5091if (!LangLocOrErr)5092return LangLocOrErr.takeError();50935094bool HasBraces = D->hasBraces();50955096LinkageSpecDecl *ToLinkageSpec;5097if (GetImportedOrCreateDecl(ToLinkageSpec, D, Importer.getToContext(), DC,5098*ExternLocOrErr, *LangLocOrErr,5099D->getLanguage(), HasBraces))5100return ToLinkageSpec;51015102if (HasBraces) {5103ExpectedSLoc RBraceLocOrErr = import(D->getRBraceLoc());5104if (!RBraceLocOrErr)5105return RBraceLocOrErr.takeError();5106ToLinkageSpec->setRBraceLoc(*RBraceLocOrErr);5107}51085109ToLinkageSpec->setLexicalDeclContext(LexicalDC);5110LexicalDC->addDeclInternal(ToLinkageSpec);51115112return ToLinkageSpec;5113}51145115ExpectedDecl ASTNodeImporter::ImportUsingShadowDecls(BaseUsingDecl *D,5116BaseUsingDecl *ToSI) {5117for (UsingShadowDecl *FromShadow : D->shadows()) {5118if (Expected<UsingShadowDecl *> ToShadowOrErr = import(FromShadow))5119ToSI->addShadowDecl(*ToShadowOrErr);5120else5121// FIXME: We return error here but the definition is already created5122// and available with lookups. How to fix this?..5123return ToShadowOrErr.takeError();5124}5125return ToSI;5126}51275128ExpectedDecl ASTNodeImporter::VisitUsingDecl(UsingDecl *D) {5129DeclContext *DC, *LexicalDC;5130DeclarationName Name;5131SourceLocation Loc;5132NamedDecl *ToD = nullptr;5133if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))5134return std::move(Err);5135if (ToD)5136return ToD;51375138Error Err = Error::success();5139auto ToLoc = importChecked(Err, D->getNameInfo().getLoc());5140auto ToUsingLoc = importChecked(Err, D->getUsingLoc());5141auto ToQualifierLoc = importChecked(Err, D->getQualifierLoc());5142if (Err)5143return std::move(Err);51445145DeclarationNameInfo NameInfo(Name, ToLoc);5146if (Error Err = ImportDeclarationNameLoc(D->getNameInfo(), NameInfo))5147return std::move(Err);51485149UsingDecl *ToUsing;5150if (GetImportedOrCreateDecl(ToUsing, D, Importer.getToContext(), DC,5151ToUsingLoc, ToQualifierLoc, NameInfo,5152D->hasTypename()))5153return ToUsing;51545155ToUsing->setLexicalDeclContext(LexicalDC);5156LexicalDC->addDeclInternal(ToUsing);51575158if (NamedDecl *FromPattern =5159Importer.getFromContext().getInstantiatedFromUsingDecl(D)) {5160if (Expected<NamedDecl *> ToPatternOrErr = import(FromPattern))5161Importer.getToContext().setInstantiatedFromUsingDecl(5162ToUsing, *ToPatternOrErr);5163else5164return ToPatternOrErr.takeError();5165}51665167return ImportUsingShadowDecls(D, ToUsing);5168}51695170ExpectedDecl ASTNodeImporter::VisitUsingEnumDecl(UsingEnumDecl *D) {5171DeclContext *DC, *LexicalDC;5172DeclarationName Name;5173SourceLocation Loc;5174NamedDecl *ToD = nullptr;5175if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))5176return std::move(Err);5177if (ToD)5178return ToD;51795180Error Err = Error::success();5181auto ToUsingLoc = importChecked(Err, D->getUsingLoc());5182auto ToEnumLoc = importChecked(Err, D->getEnumLoc());5183auto ToNameLoc = importChecked(Err, D->getLocation());5184auto *ToEnumType = importChecked(Err, D->getEnumType());5185if (Err)5186return std::move(Err);51875188UsingEnumDecl *ToUsingEnum;5189if (GetImportedOrCreateDecl(ToUsingEnum, D, Importer.getToContext(), DC,5190ToUsingLoc, ToEnumLoc, ToNameLoc, ToEnumType))5191return ToUsingEnum;51925193ToUsingEnum->setLexicalDeclContext(LexicalDC);5194LexicalDC->addDeclInternal(ToUsingEnum);51955196if (UsingEnumDecl *FromPattern =5197Importer.getFromContext().getInstantiatedFromUsingEnumDecl(D)) {5198if (Expected<UsingEnumDecl *> ToPatternOrErr = import(FromPattern))5199Importer.getToContext().setInstantiatedFromUsingEnumDecl(ToUsingEnum,5200*ToPatternOrErr);5201else5202return ToPatternOrErr.takeError();5203}52045205return ImportUsingShadowDecls(D, ToUsingEnum);5206}52075208ExpectedDecl ASTNodeImporter::VisitUsingShadowDecl(UsingShadowDecl *D) {5209DeclContext *DC, *LexicalDC;5210DeclarationName Name;5211SourceLocation Loc;5212NamedDecl *ToD = nullptr;5213if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))5214return std::move(Err);5215if (ToD)5216return ToD;52175218Expected<BaseUsingDecl *> ToIntroducerOrErr = import(D->getIntroducer());5219if (!ToIntroducerOrErr)5220return ToIntroducerOrErr.takeError();52215222Expected<NamedDecl *> ToTargetOrErr = import(D->getTargetDecl());5223if (!ToTargetOrErr)5224return ToTargetOrErr.takeError();52255226UsingShadowDecl *ToShadow;5227if (auto *FromConstructorUsingShadow =5228dyn_cast<ConstructorUsingShadowDecl>(D)) {5229Error Err = Error::success();5230ConstructorUsingShadowDecl *Nominated = importChecked(5231Err, FromConstructorUsingShadow->getNominatedBaseClassShadowDecl());5232if (Err)5233return std::move(Err);5234// The 'Target' parameter of ConstructorUsingShadowDecl constructor5235// is really the "NominatedBaseClassShadowDecl" value if it exists5236// (see code of ConstructorUsingShadowDecl::ConstructorUsingShadowDecl).5237// We should pass the NominatedBaseClassShadowDecl to it (if non-null) to5238// get the correct values.5239if (GetImportedOrCreateDecl<ConstructorUsingShadowDecl>(5240ToShadow, D, Importer.getToContext(), DC, Loc,5241cast<UsingDecl>(*ToIntroducerOrErr),5242Nominated ? Nominated : *ToTargetOrErr,5243FromConstructorUsingShadow->constructsVirtualBase()))5244return ToShadow;5245} else {5246if (GetImportedOrCreateDecl(ToShadow, D, Importer.getToContext(), DC, Loc,5247Name, *ToIntroducerOrErr, *ToTargetOrErr))5248return ToShadow;5249}52505251ToShadow->setLexicalDeclContext(LexicalDC);5252ToShadow->setAccess(D->getAccess());52535254if (UsingShadowDecl *FromPattern =5255Importer.getFromContext().getInstantiatedFromUsingShadowDecl(D)) {5256if (Expected<UsingShadowDecl *> ToPatternOrErr = import(FromPattern))5257Importer.getToContext().setInstantiatedFromUsingShadowDecl(5258ToShadow, *ToPatternOrErr);5259else5260// FIXME: We return error here but the definition is already created5261// and available with lookups. How to fix this?..5262return ToPatternOrErr.takeError();5263}52645265LexicalDC->addDeclInternal(ToShadow);52665267return ToShadow;5268}52695270ExpectedDecl ASTNodeImporter::VisitUsingDirectiveDecl(UsingDirectiveDecl *D) {5271DeclContext *DC, *LexicalDC;5272DeclarationName Name;5273SourceLocation Loc;5274NamedDecl *ToD = nullptr;5275if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))5276return std::move(Err);5277if (ToD)5278return ToD;52795280auto ToComAncestorOrErr = Importer.ImportContext(D->getCommonAncestor());5281if (!ToComAncestorOrErr)5282return ToComAncestorOrErr.takeError();52835284Error Err = Error::success();5285auto ToNominatedNamespace = importChecked(Err, D->getNominatedNamespace());5286auto ToUsingLoc = importChecked(Err, D->getUsingLoc());5287auto ToNamespaceKeyLocation =5288importChecked(Err, D->getNamespaceKeyLocation());5289auto ToQualifierLoc = importChecked(Err, D->getQualifierLoc());5290auto ToIdentLocation = importChecked(Err, D->getIdentLocation());5291if (Err)5292return std::move(Err);52935294UsingDirectiveDecl *ToUsingDir;5295if (GetImportedOrCreateDecl(ToUsingDir, D, Importer.getToContext(), DC,5296ToUsingLoc,5297ToNamespaceKeyLocation,5298ToQualifierLoc,5299ToIdentLocation,5300ToNominatedNamespace, *ToComAncestorOrErr))5301return ToUsingDir;53025303ToUsingDir->setLexicalDeclContext(LexicalDC);5304LexicalDC->addDeclInternal(ToUsingDir);53055306return ToUsingDir;5307}53085309ExpectedDecl ASTNodeImporter::VisitUsingPackDecl(UsingPackDecl *D) {5310DeclContext *DC, *LexicalDC;5311DeclarationName Name;5312SourceLocation Loc;5313NamedDecl *ToD = nullptr;5314if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))5315return std::move(Err);5316if (ToD)5317return ToD;53185319auto ToInstantiatedFromUsingOrErr =5320Importer.Import(D->getInstantiatedFromUsingDecl());5321if (!ToInstantiatedFromUsingOrErr)5322return ToInstantiatedFromUsingOrErr.takeError();5323SmallVector<NamedDecl *, 4> Expansions(D->expansions().size());5324if (Error Err = ImportArrayChecked(D->expansions(), Expansions.begin()))5325return std::move(Err);53265327UsingPackDecl *ToUsingPack;5328if (GetImportedOrCreateDecl(ToUsingPack, D, Importer.getToContext(), DC,5329cast<NamedDecl>(*ToInstantiatedFromUsingOrErr),5330Expansions))5331return ToUsingPack;53325333addDeclToContexts(D, ToUsingPack);53345335return ToUsingPack;5336}53375338ExpectedDecl ASTNodeImporter::VisitUnresolvedUsingValueDecl(5339UnresolvedUsingValueDecl *D) {5340DeclContext *DC, *LexicalDC;5341DeclarationName Name;5342SourceLocation Loc;5343NamedDecl *ToD = nullptr;5344if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))5345return std::move(Err);5346if (ToD)5347return ToD;53485349Error Err = Error::success();5350auto ToLoc = importChecked(Err, D->getNameInfo().getLoc());5351auto ToUsingLoc = importChecked(Err, D->getUsingLoc());5352auto ToQualifierLoc = importChecked(Err, D->getQualifierLoc());5353auto ToEllipsisLoc = importChecked(Err, D->getEllipsisLoc());5354if (Err)5355return std::move(Err);53565357DeclarationNameInfo NameInfo(Name, ToLoc);5358if (Error Err = ImportDeclarationNameLoc(D->getNameInfo(), NameInfo))5359return std::move(Err);53605361UnresolvedUsingValueDecl *ToUsingValue;5362if (GetImportedOrCreateDecl(ToUsingValue, D, Importer.getToContext(), DC,5363ToUsingLoc, ToQualifierLoc, NameInfo,5364ToEllipsisLoc))5365return ToUsingValue;53665367ToUsingValue->setAccess(D->getAccess());5368ToUsingValue->setLexicalDeclContext(LexicalDC);5369LexicalDC->addDeclInternal(ToUsingValue);53705371return ToUsingValue;5372}53735374ExpectedDecl ASTNodeImporter::VisitUnresolvedUsingTypenameDecl(5375UnresolvedUsingTypenameDecl *D) {5376DeclContext *DC, *LexicalDC;5377DeclarationName Name;5378SourceLocation Loc;5379NamedDecl *ToD = nullptr;5380if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))5381return std::move(Err);5382if (ToD)5383return ToD;53845385Error Err = Error::success();5386auto ToUsingLoc = importChecked(Err, D->getUsingLoc());5387auto ToTypenameLoc = importChecked(Err, D->getTypenameLoc());5388auto ToQualifierLoc = importChecked(Err, D->getQualifierLoc());5389auto ToEllipsisLoc = importChecked(Err, D->getEllipsisLoc());5390if (Err)5391return std::move(Err);53925393UnresolvedUsingTypenameDecl *ToUsing;5394if (GetImportedOrCreateDecl(ToUsing, D, Importer.getToContext(), DC,5395ToUsingLoc, ToTypenameLoc,5396ToQualifierLoc, Loc, Name, ToEllipsisLoc))5397return ToUsing;53985399ToUsing->setAccess(D->getAccess());5400ToUsing->setLexicalDeclContext(LexicalDC);5401LexicalDC->addDeclInternal(ToUsing);54025403return ToUsing;5404}54055406ExpectedDecl ASTNodeImporter::VisitBuiltinTemplateDecl(BuiltinTemplateDecl *D) {5407Decl* ToD = nullptr;5408switch (D->getBuiltinTemplateKind()) {5409case BuiltinTemplateKind::BTK__make_integer_seq:5410ToD = Importer.getToContext().getMakeIntegerSeqDecl();5411break;5412case BuiltinTemplateKind::BTK__type_pack_element:5413ToD = Importer.getToContext().getTypePackElementDecl();5414break;5415}5416assert(ToD && "BuiltinTemplateDecl of unsupported kind!");5417Importer.MapImported(D, ToD);5418return ToD;5419}54205421Error ASTNodeImporter::ImportDefinition(5422ObjCInterfaceDecl *From, ObjCInterfaceDecl *To, ImportDefinitionKind Kind) {5423if (To->getDefinition()) {5424// Check consistency of superclass.5425ObjCInterfaceDecl *FromSuper = From->getSuperClass();5426if (FromSuper) {5427if (auto FromSuperOrErr = import(FromSuper))5428FromSuper = *FromSuperOrErr;5429else5430return FromSuperOrErr.takeError();5431}54325433ObjCInterfaceDecl *ToSuper = To->getSuperClass();5434if ((bool)FromSuper != (bool)ToSuper ||5435(FromSuper && !declaresSameEntity(FromSuper, ToSuper))) {5436Importer.ToDiag(To->getLocation(),5437diag::warn_odr_objc_superclass_inconsistent)5438<< To->getDeclName();5439if (ToSuper)5440Importer.ToDiag(To->getSuperClassLoc(), diag::note_odr_objc_superclass)5441<< To->getSuperClass()->getDeclName();5442else5443Importer.ToDiag(To->getLocation(),5444diag::note_odr_objc_missing_superclass);5445if (From->getSuperClass())5446Importer.FromDiag(From->getSuperClassLoc(),5447diag::note_odr_objc_superclass)5448<< From->getSuperClass()->getDeclName();5449else5450Importer.FromDiag(From->getLocation(),5451diag::note_odr_objc_missing_superclass);5452}54535454if (shouldForceImportDeclContext(Kind))5455if (Error Err = ImportDeclContext(From))5456return Err;5457return Error::success();5458}54595460// Start the definition.5461To->startDefinition();54625463// If this class has a superclass, import it.5464if (From->getSuperClass()) {5465if (auto SuperTInfoOrErr = import(From->getSuperClassTInfo()))5466To->setSuperClass(*SuperTInfoOrErr);5467else5468return SuperTInfoOrErr.takeError();5469}54705471// Import protocols5472SmallVector<ObjCProtocolDecl *, 4> Protocols;5473SmallVector<SourceLocation, 4> ProtocolLocs;5474ObjCInterfaceDecl::protocol_loc_iterator FromProtoLoc =5475From->protocol_loc_begin();54765477for (ObjCInterfaceDecl::protocol_iterator FromProto = From->protocol_begin(),5478FromProtoEnd = From->protocol_end();5479FromProto != FromProtoEnd;5480++FromProto, ++FromProtoLoc) {5481if (Expected<ObjCProtocolDecl *> ToProtoOrErr = import(*FromProto))5482Protocols.push_back(*ToProtoOrErr);5483else5484return ToProtoOrErr.takeError();54855486if (ExpectedSLoc ToProtoLocOrErr = import(*FromProtoLoc))5487ProtocolLocs.push_back(*ToProtoLocOrErr);5488else5489return ToProtoLocOrErr.takeError();54905491}54925493// FIXME: If we're merging, make sure that the protocol list is the same.5494To->setProtocolList(Protocols.data(), Protocols.size(),5495ProtocolLocs.data(), Importer.getToContext());54965497// Import categories. When the categories themselves are imported, they'll5498// hook themselves into this interface.5499for (auto *Cat : From->known_categories()) {5500auto ToCatOrErr = import(Cat);5501if (!ToCatOrErr)5502return ToCatOrErr.takeError();5503}55045505// If we have an @implementation, import it as well.5506if (From->getImplementation()) {5507if (Expected<ObjCImplementationDecl *> ToImplOrErr =5508import(From->getImplementation()))5509To->setImplementation(*ToImplOrErr);5510else5511return ToImplOrErr.takeError();5512}55135514// Import all of the members of this class.5515if (Error Err = ImportDeclContext(From, /*ForceImport=*/true))5516return Err;55175518return Error::success();5519}55205521Expected<ObjCTypeParamList *>5522ASTNodeImporter::ImportObjCTypeParamList(ObjCTypeParamList *list) {5523if (!list)5524return nullptr;55255526SmallVector<ObjCTypeParamDecl *, 4> toTypeParams;5527for (auto *fromTypeParam : *list) {5528if (auto toTypeParamOrErr = import(fromTypeParam))5529toTypeParams.push_back(*toTypeParamOrErr);5530else5531return toTypeParamOrErr.takeError();5532}55335534auto LAngleLocOrErr = import(list->getLAngleLoc());5535if (!LAngleLocOrErr)5536return LAngleLocOrErr.takeError();55375538auto RAngleLocOrErr = import(list->getRAngleLoc());5539if (!RAngleLocOrErr)5540return RAngleLocOrErr.takeError();55415542return ObjCTypeParamList::create(Importer.getToContext(),5543*LAngleLocOrErr,5544toTypeParams,5545*RAngleLocOrErr);5546}55475548ExpectedDecl ASTNodeImporter::VisitObjCInterfaceDecl(ObjCInterfaceDecl *D) {5549// If this class has a definition in the translation unit we're coming from,5550// but this particular declaration is not that definition, import the5551// definition and map to that.5552ObjCInterfaceDecl *Definition = D->getDefinition();5553if (Definition && Definition != D) {5554if (ExpectedDecl ImportedDefOrErr = import(Definition))5555return Importer.MapImported(D, *ImportedDefOrErr);5556else5557return ImportedDefOrErr.takeError();5558}55595560// Import the major distinguishing characteristics of an @interface.5561DeclContext *DC, *LexicalDC;5562DeclarationName Name;5563SourceLocation Loc;5564NamedDecl *ToD;5565if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))5566return std::move(Err);5567if (ToD)5568return ToD;55695570// Look for an existing interface with the same name.5571ObjCInterfaceDecl *MergeWithIface = nullptr;5572auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);5573for (auto *FoundDecl : FoundDecls) {5574if (!FoundDecl->isInIdentifierNamespace(Decl::IDNS_Ordinary))5575continue;55765577if ((MergeWithIface = dyn_cast<ObjCInterfaceDecl>(FoundDecl)))5578break;5579}55805581// Create an interface declaration, if one does not already exist.5582ObjCInterfaceDecl *ToIface = MergeWithIface;5583if (!ToIface) {5584ExpectedSLoc AtBeginLocOrErr = import(D->getAtStartLoc());5585if (!AtBeginLocOrErr)5586return AtBeginLocOrErr.takeError();55875588if (GetImportedOrCreateDecl(5589ToIface, D, Importer.getToContext(), DC,5590*AtBeginLocOrErr, Name.getAsIdentifierInfo(),5591/*TypeParamList=*/nullptr,5592/*PrevDecl=*/nullptr, Loc, D->isImplicitInterfaceDecl()))5593return ToIface;5594ToIface->setLexicalDeclContext(LexicalDC);5595LexicalDC->addDeclInternal(ToIface);5596}5597Importer.MapImported(D, ToIface);5598// Import the type parameter list after MapImported, to avoid5599// loops when bringing in their DeclContext.5600if (auto ToPListOrErr =5601ImportObjCTypeParamList(D->getTypeParamListAsWritten()))5602ToIface->setTypeParamList(*ToPListOrErr);5603else5604return ToPListOrErr.takeError();56055606if (D->isThisDeclarationADefinition())5607if (Error Err = ImportDefinition(D, ToIface))5608return std::move(Err);56095610return ToIface;5611}56125613ExpectedDecl5614ASTNodeImporter::VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D) {5615ObjCCategoryDecl *Category;5616if (Error Err = importInto(Category, D->getCategoryDecl()))5617return std::move(Err);56185619ObjCCategoryImplDecl *ToImpl = Category->getImplementation();5620if (!ToImpl) {5621DeclContext *DC, *LexicalDC;5622if (Error Err = ImportDeclContext(D, DC, LexicalDC))5623return std::move(Err);56245625Error Err = Error::success();5626auto ToLocation = importChecked(Err, D->getLocation());5627auto ToAtStartLoc = importChecked(Err, D->getAtStartLoc());5628auto ToCategoryNameLoc = importChecked(Err, D->getCategoryNameLoc());5629if (Err)5630return std::move(Err);56315632if (GetImportedOrCreateDecl(5633ToImpl, D, Importer.getToContext(), DC,5634Importer.Import(D->getIdentifier()), Category->getClassInterface(),5635ToLocation, ToAtStartLoc, ToCategoryNameLoc))5636return ToImpl;56375638ToImpl->setLexicalDeclContext(LexicalDC);5639LexicalDC->addDeclInternal(ToImpl);5640Category->setImplementation(ToImpl);5641}56425643Importer.MapImported(D, ToImpl);5644if (Error Err = ImportDeclContext(D))5645return std::move(Err);56465647return ToImpl;5648}56495650ExpectedDecl5651ASTNodeImporter::VisitObjCImplementationDecl(ObjCImplementationDecl *D) {5652// Find the corresponding interface.5653ObjCInterfaceDecl *Iface;5654if (Error Err = importInto(Iface, D->getClassInterface()))5655return std::move(Err);56565657// Import the superclass, if any.5658ObjCInterfaceDecl *Super;5659if (Error Err = importInto(Super, D->getSuperClass()))5660return std::move(Err);56615662ObjCImplementationDecl *Impl = Iface->getImplementation();5663if (!Impl) {5664// We haven't imported an implementation yet. Create a new @implementation5665// now.5666DeclContext *DC, *LexicalDC;5667if (Error Err = ImportDeclContext(D, DC, LexicalDC))5668return std::move(Err);56695670Error Err = Error::success();5671auto ToLocation = importChecked(Err, D->getLocation());5672auto ToAtStartLoc = importChecked(Err, D->getAtStartLoc());5673auto ToSuperClassLoc = importChecked(Err, D->getSuperClassLoc());5674auto ToIvarLBraceLoc = importChecked(Err, D->getIvarLBraceLoc());5675auto ToIvarRBraceLoc = importChecked(Err, D->getIvarRBraceLoc());5676if (Err)5677return std::move(Err);56785679if (GetImportedOrCreateDecl(Impl, D, Importer.getToContext(),5680DC, Iface, Super,5681ToLocation,5682ToAtStartLoc,5683ToSuperClassLoc,5684ToIvarLBraceLoc,5685ToIvarRBraceLoc))5686return Impl;56875688Impl->setLexicalDeclContext(LexicalDC);56895690// Associate the implementation with the class it implements.5691Iface->setImplementation(Impl);5692Importer.MapImported(D, Iface->getImplementation());5693} else {5694Importer.MapImported(D, Iface->getImplementation());56955696// Verify that the existing @implementation has the same superclass.5697if ((Super && !Impl->getSuperClass()) ||5698(!Super && Impl->getSuperClass()) ||5699(Super && Impl->getSuperClass() &&5700!declaresSameEntity(Super->getCanonicalDecl(),5701Impl->getSuperClass()))) {5702Importer.ToDiag(Impl->getLocation(),5703diag::warn_odr_objc_superclass_inconsistent)5704<< Iface->getDeclName();5705// FIXME: It would be nice to have the location of the superclass5706// below.5707if (Impl->getSuperClass())5708Importer.ToDiag(Impl->getLocation(),5709diag::note_odr_objc_superclass)5710<< Impl->getSuperClass()->getDeclName();5711else5712Importer.ToDiag(Impl->getLocation(),5713diag::note_odr_objc_missing_superclass);5714if (D->getSuperClass())5715Importer.FromDiag(D->getLocation(),5716diag::note_odr_objc_superclass)5717<< D->getSuperClass()->getDeclName();5718else5719Importer.FromDiag(D->getLocation(),5720diag::note_odr_objc_missing_superclass);57215722return make_error<ASTImportError>(ASTImportError::NameConflict);5723}5724}57255726// Import all of the members of this @implementation.5727if (Error Err = ImportDeclContext(D))5728return std::move(Err);57295730return Impl;5731}57325733ExpectedDecl ASTNodeImporter::VisitObjCPropertyDecl(ObjCPropertyDecl *D) {5734// Import the major distinguishing characteristics of an @property.5735DeclContext *DC, *LexicalDC;5736DeclarationName Name;5737SourceLocation Loc;5738NamedDecl *ToD;5739if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))5740return std::move(Err);5741if (ToD)5742return ToD;57435744// Check whether we have already imported this property.5745auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);5746for (auto *FoundDecl : FoundDecls) {5747if (auto *FoundProp = dyn_cast<ObjCPropertyDecl>(FoundDecl)) {5748// Instance and class properties can share the same name but are different5749// declarations.5750if (FoundProp->isInstanceProperty() != D->isInstanceProperty())5751continue;57525753// Check property types.5754if (!Importer.IsStructurallyEquivalent(D->getType(),5755FoundProp->getType())) {5756Importer.ToDiag(Loc, diag::warn_odr_objc_property_type_inconsistent)5757<< Name << D->getType() << FoundProp->getType();5758Importer.ToDiag(FoundProp->getLocation(), diag::note_odr_value_here)5759<< FoundProp->getType();57605761return make_error<ASTImportError>(ASTImportError::NameConflict);5762}57635764// FIXME: Check property attributes, getters, setters, etc.?57655766// Consider these properties to be equivalent.5767Importer.MapImported(D, FoundProp);5768return FoundProp;5769}5770}57715772Error Err = Error::success();5773auto ToType = importChecked(Err, D->getType());5774auto ToTypeSourceInfo = importChecked(Err, D->getTypeSourceInfo());5775auto ToAtLoc = importChecked(Err, D->getAtLoc());5776auto ToLParenLoc = importChecked(Err, D->getLParenLoc());5777if (Err)5778return std::move(Err);57795780// Create the new property.5781ObjCPropertyDecl *ToProperty;5782if (GetImportedOrCreateDecl(5783ToProperty, D, Importer.getToContext(), DC, Loc,5784Name.getAsIdentifierInfo(), ToAtLoc,5785ToLParenLoc, ToType,5786ToTypeSourceInfo, D->getPropertyImplementation()))5787return ToProperty;57885789auto ToGetterName = importChecked(Err, D->getGetterName());5790auto ToSetterName = importChecked(Err, D->getSetterName());5791auto ToGetterNameLoc = importChecked(Err, D->getGetterNameLoc());5792auto ToSetterNameLoc = importChecked(Err, D->getSetterNameLoc());5793auto ToGetterMethodDecl = importChecked(Err, D->getGetterMethodDecl());5794auto ToSetterMethodDecl = importChecked(Err, D->getSetterMethodDecl());5795auto ToPropertyIvarDecl = importChecked(Err, D->getPropertyIvarDecl());5796if (Err)5797return std::move(Err);57985799ToProperty->setLexicalDeclContext(LexicalDC);5800LexicalDC->addDeclInternal(ToProperty);58015802ToProperty->setPropertyAttributes(D->getPropertyAttributes());5803ToProperty->setPropertyAttributesAsWritten(5804D->getPropertyAttributesAsWritten());5805ToProperty->setGetterName(ToGetterName, ToGetterNameLoc);5806ToProperty->setSetterName(ToSetterName, ToSetterNameLoc);5807ToProperty->setGetterMethodDecl(ToGetterMethodDecl);5808ToProperty->setSetterMethodDecl(ToSetterMethodDecl);5809ToProperty->setPropertyIvarDecl(ToPropertyIvarDecl);5810return ToProperty;5811}58125813ExpectedDecl5814ASTNodeImporter::VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D) {5815ObjCPropertyDecl *Property;5816if (Error Err = importInto(Property, D->getPropertyDecl()))5817return std::move(Err);58185819DeclContext *DC, *LexicalDC;5820if (Error Err = ImportDeclContext(D, DC, LexicalDC))5821return std::move(Err);58225823auto *InImpl = cast<ObjCImplDecl>(LexicalDC);58245825// Import the ivar (for an @synthesize).5826ObjCIvarDecl *Ivar = nullptr;5827if (Error Err = importInto(Ivar, D->getPropertyIvarDecl()))5828return std::move(Err);58295830ObjCPropertyImplDecl *ToImpl5831= InImpl->FindPropertyImplDecl(Property->getIdentifier(),5832Property->getQueryKind());5833if (!ToImpl) {58345835Error Err = Error::success();5836auto ToBeginLoc = importChecked(Err, D->getBeginLoc());5837auto ToLocation = importChecked(Err, D->getLocation());5838auto ToPropertyIvarDeclLoc =5839importChecked(Err, D->getPropertyIvarDeclLoc());5840if (Err)5841return std::move(Err);58425843if (GetImportedOrCreateDecl(ToImpl, D, Importer.getToContext(), DC,5844ToBeginLoc,5845ToLocation, Property,5846D->getPropertyImplementation(), Ivar,5847ToPropertyIvarDeclLoc))5848return ToImpl;58495850ToImpl->setLexicalDeclContext(LexicalDC);5851LexicalDC->addDeclInternal(ToImpl);5852} else {5853// Check that we have the same kind of property implementation (@synthesize5854// vs. @dynamic).5855if (D->getPropertyImplementation() != ToImpl->getPropertyImplementation()) {5856Importer.ToDiag(ToImpl->getLocation(),5857diag::warn_odr_objc_property_impl_kind_inconsistent)5858<< Property->getDeclName()5859<< (ToImpl->getPropertyImplementation()5860== ObjCPropertyImplDecl::Dynamic);5861Importer.FromDiag(D->getLocation(),5862diag::note_odr_objc_property_impl_kind)5863<< D->getPropertyDecl()->getDeclName()5864<< (D->getPropertyImplementation() == ObjCPropertyImplDecl::Dynamic);58655866return make_error<ASTImportError>(ASTImportError::NameConflict);5867}58685869// For @synthesize, check that we have the same5870if (D->getPropertyImplementation() == ObjCPropertyImplDecl::Synthesize &&5871Ivar != ToImpl->getPropertyIvarDecl()) {5872Importer.ToDiag(ToImpl->getPropertyIvarDeclLoc(),5873diag::warn_odr_objc_synthesize_ivar_inconsistent)5874<< Property->getDeclName()5875<< ToImpl->getPropertyIvarDecl()->getDeclName()5876<< Ivar->getDeclName();5877Importer.FromDiag(D->getPropertyIvarDeclLoc(),5878diag::note_odr_objc_synthesize_ivar_here)5879<< D->getPropertyIvarDecl()->getDeclName();58805881return make_error<ASTImportError>(ASTImportError::NameConflict);5882}58835884// Merge the existing implementation with the new implementation.5885Importer.MapImported(D, ToImpl);5886}58875888return ToImpl;5889}58905891ExpectedDecl5892ASTNodeImporter::VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D) {5893// For template arguments, we adopt the translation unit as our declaration5894// context. This context will be fixed when the actual template declaration5895// is created.58965897ExpectedSLoc BeginLocOrErr = import(D->getBeginLoc());5898if (!BeginLocOrErr)5899return BeginLocOrErr.takeError();59005901ExpectedSLoc LocationOrErr = import(D->getLocation());5902if (!LocationOrErr)5903return LocationOrErr.takeError();59045905TemplateTypeParmDecl *ToD = nullptr;5906if (GetImportedOrCreateDecl(5907ToD, D, Importer.getToContext(),5908Importer.getToContext().getTranslationUnitDecl(),5909*BeginLocOrErr, *LocationOrErr,5910D->getDepth(), D->getIndex(), Importer.Import(D->getIdentifier()),5911D->wasDeclaredWithTypename(), D->isParameterPack(),5912D->hasTypeConstraint()))5913return ToD;59145915// Import the type-constraint5916if (const TypeConstraint *TC = D->getTypeConstraint()) {59175918Error Err = Error::success();5919auto ToConceptRef = importChecked(Err, TC->getConceptReference());5920auto ToIDC = importChecked(Err, TC->getImmediatelyDeclaredConstraint());5921if (Err)5922return std::move(Err);59235924ToD->setTypeConstraint(ToConceptRef, ToIDC);5925}59265927if (D->hasDefaultArgument()) {5928Expected<TemplateArgumentLoc> ToDefaultArgOrErr =5929import(D->getDefaultArgument());5930if (!ToDefaultArgOrErr)5931return ToDefaultArgOrErr.takeError();5932ToD->setDefaultArgument(ToD->getASTContext(), *ToDefaultArgOrErr);5933}59345935return ToD;5936}59375938ExpectedDecl5939ASTNodeImporter::VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D) {59405941Error Err = Error::success();5942auto ToDeclName = importChecked(Err, D->getDeclName());5943auto ToLocation = importChecked(Err, D->getLocation());5944auto ToType = importChecked(Err, D->getType());5945auto ToTypeSourceInfo = importChecked(Err, D->getTypeSourceInfo());5946auto ToInnerLocStart = importChecked(Err, D->getInnerLocStart());5947if (Err)5948return std::move(Err);59495950NonTypeTemplateParmDecl *ToD = nullptr;5951if (GetImportedOrCreateDecl(ToD, D, Importer.getToContext(),5952Importer.getToContext().getTranslationUnitDecl(),5953ToInnerLocStart, ToLocation, D->getDepth(),5954D->getPosition(),5955ToDeclName.getAsIdentifierInfo(), ToType,5956D->isParameterPack(), ToTypeSourceInfo))5957return ToD;59585959if (D->hasDefaultArgument()) {5960Expected<TemplateArgumentLoc> ToDefaultArgOrErr =5961import(D->getDefaultArgument());5962if (!ToDefaultArgOrErr)5963return ToDefaultArgOrErr.takeError();5964ToD->setDefaultArgument(Importer.getToContext(), *ToDefaultArgOrErr);5965}59665967return ToD;5968}59695970ExpectedDecl5971ASTNodeImporter::VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D) {5972// Import the name of this declaration.5973auto NameOrErr = import(D->getDeclName());5974if (!NameOrErr)5975return NameOrErr.takeError();59765977// Import the location of this declaration.5978ExpectedSLoc LocationOrErr = import(D->getLocation());5979if (!LocationOrErr)5980return LocationOrErr.takeError();59815982// Import template parameters.5983auto TemplateParamsOrErr = import(D->getTemplateParameters());5984if (!TemplateParamsOrErr)5985return TemplateParamsOrErr.takeError();59865987TemplateTemplateParmDecl *ToD = nullptr;5988if (GetImportedOrCreateDecl(5989ToD, D, Importer.getToContext(),5990Importer.getToContext().getTranslationUnitDecl(), *LocationOrErr,5991D->getDepth(), D->getPosition(), D->isParameterPack(),5992(*NameOrErr).getAsIdentifierInfo(), D->wasDeclaredWithTypename(),5993*TemplateParamsOrErr))5994return ToD;59955996if (D->hasDefaultArgument()) {5997Expected<TemplateArgumentLoc> ToDefaultArgOrErr =5998import(D->getDefaultArgument());5999if (!ToDefaultArgOrErr)6000return ToDefaultArgOrErr.takeError();6001ToD->setDefaultArgument(Importer.getToContext(), *ToDefaultArgOrErr);6002}60036004return ToD;6005}60066007// Returns the definition for a (forward) declaration of a TemplateDecl, if6008// it has any definition in the redecl chain.6009template <typename T> static auto getTemplateDefinition(T *D) -> T * {6010assert(D->getTemplatedDecl() && "Should be called on templates only");6011auto *ToTemplatedDef = D->getTemplatedDecl()->getDefinition();6012if (!ToTemplatedDef)6013return nullptr;6014auto *TemplateWithDef = ToTemplatedDef->getDescribedTemplate();6015return cast_or_null<T>(TemplateWithDef);6016}60176018ExpectedDecl ASTNodeImporter::VisitClassTemplateDecl(ClassTemplateDecl *D) {60196020// Import the major distinguishing characteristics of this class template.6021DeclContext *DC, *LexicalDC;6022DeclarationName Name;6023SourceLocation Loc;6024NamedDecl *ToD;6025if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))6026return std::move(Err);6027if (ToD)6028return ToD;60296030// Should check if a declaration is friend in a dependent context.6031// Such templates are not linked together in a declaration chain.6032// The ASTImporter strategy is to map existing forward declarations to6033// imported ones only if strictly necessary, otherwise import these as new6034// forward declarations. In case of the "dependent friend" declarations, new6035// declarations are created, but not linked in a declaration chain.6036auto IsDependentFriend = [](ClassTemplateDecl *TD) {6037return TD->getFriendObjectKind() != Decl::FOK_None &&6038TD->getLexicalDeclContext()->isDependentContext();6039};6040bool DependentFriend = IsDependentFriend(D);60416042ClassTemplateDecl *FoundByLookup = nullptr;60436044// We may already have a template of the same name; try to find and match it.6045if (!DC->isFunctionOrMethod()) {6046SmallVector<NamedDecl *, 4> ConflictingDecls;6047auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);6048for (auto *FoundDecl : FoundDecls) {6049if (!FoundDecl->isInIdentifierNamespace(Decl::IDNS_Ordinary |6050Decl::IDNS_TagFriend))6051continue;60526053Decl *Found = FoundDecl;6054auto *FoundTemplate = dyn_cast<ClassTemplateDecl>(Found);6055if (FoundTemplate) {6056if (!hasSameVisibilityContextAndLinkage(FoundTemplate, D))6057continue;60586059// FIXME: sufficient conditon for 'IgnoreTemplateParmDepth'?6060bool IgnoreTemplateParmDepth =6061(FoundTemplate->getFriendObjectKind() != Decl::FOK_None) !=6062(D->getFriendObjectKind() != Decl::FOK_None);6063if (IsStructuralMatch(D, FoundTemplate, /*Complain=*/true,6064IgnoreTemplateParmDepth)) {6065if (DependentFriend || IsDependentFriend(FoundTemplate))6066continue;60676068ClassTemplateDecl *TemplateWithDef =6069getTemplateDefinition(FoundTemplate);6070if (D->isThisDeclarationADefinition() && TemplateWithDef)6071return Importer.MapImported(D, TemplateWithDef);6072if (!FoundByLookup)6073FoundByLookup = FoundTemplate;6074// Search in all matches because there may be multiple decl chains,6075// see ASTTests test ImportExistingFriendClassTemplateDef.6076continue;6077}6078ConflictingDecls.push_back(FoundDecl);6079}6080}60816082if (!ConflictingDecls.empty()) {6083ExpectedName NameOrErr = Importer.HandleNameConflict(6084Name, DC, Decl::IDNS_Ordinary, ConflictingDecls.data(),6085ConflictingDecls.size());6086if (NameOrErr)6087Name = NameOrErr.get();6088else6089return NameOrErr.takeError();6090}6091}60926093CXXRecordDecl *FromTemplated = D->getTemplatedDecl();60946095auto TemplateParamsOrErr = import(D->getTemplateParameters());6096if (!TemplateParamsOrErr)6097return TemplateParamsOrErr.takeError();60986099// Create the declaration that is being templated.6100CXXRecordDecl *ToTemplated;6101if (Error Err = importInto(ToTemplated, FromTemplated))6102return std::move(Err);61036104// Create the class template declaration itself.6105ClassTemplateDecl *D2;6106if (GetImportedOrCreateDecl(D2, D, Importer.getToContext(), DC, Loc, Name,6107*TemplateParamsOrErr, ToTemplated))6108return D2;61096110ToTemplated->setDescribedClassTemplate(D2);61116112D2->setAccess(D->getAccess());6113D2->setLexicalDeclContext(LexicalDC);61146115addDeclToContexts(D, D2);6116updateLookupTableForTemplateParameters(**TemplateParamsOrErr);61176118if (FoundByLookup) {6119auto *Recent =6120const_cast<ClassTemplateDecl *>(FoundByLookup->getMostRecentDecl());61216122// It is possible that during the import of the class template definition6123// we start the import of a fwd friend decl of the very same class template6124// and we add the fwd friend decl to the lookup table. But the ToTemplated6125// had been created earlier and by that time the lookup could not find6126// anything existing, so it has no previous decl. Later, (still during the6127// import of the fwd friend decl) we start to import the definition again6128// and this time the lookup finds the previous fwd friend class template.6129// In this case we must set up the previous decl for the templated decl.6130if (!ToTemplated->getPreviousDecl()) {6131assert(FoundByLookup->getTemplatedDecl() &&6132"Found decl must have its templated decl set");6133CXXRecordDecl *PrevTemplated =6134FoundByLookup->getTemplatedDecl()->getMostRecentDecl();6135if (ToTemplated != PrevTemplated)6136ToTemplated->setPreviousDecl(PrevTemplated);6137}61386139D2->setPreviousDecl(Recent);6140}61416142return D2;6143}61446145ExpectedDecl ASTNodeImporter::VisitClassTemplateSpecializationDecl(6146ClassTemplateSpecializationDecl *D) {6147ClassTemplateDecl *ClassTemplate;6148if (Error Err = importInto(ClassTemplate, D->getSpecializedTemplate()))6149return std::move(Err);61506151// Import the context of this declaration.6152DeclContext *DC, *LexicalDC;6153if (Error Err = ImportDeclContext(D, DC, LexicalDC))6154return std::move(Err);61556156// Import template arguments.6157SmallVector<TemplateArgument, 2> TemplateArgs;6158if (Error Err =6159ImportTemplateArguments(D->getTemplateArgs().asArray(), TemplateArgs))6160return std::move(Err);6161// Try to find an existing specialization with these template arguments and6162// template parameter list.6163void *InsertPos = nullptr;6164ClassTemplateSpecializationDecl *PrevDecl = nullptr;6165ClassTemplatePartialSpecializationDecl *PartialSpec =6166dyn_cast<ClassTemplatePartialSpecializationDecl>(D);61676168// Import template parameters.6169TemplateParameterList *ToTPList = nullptr;61706171if (PartialSpec) {6172auto ToTPListOrErr = import(PartialSpec->getTemplateParameters());6173if (!ToTPListOrErr)6174return ToTPListOrErr.takeError();6175ToTPList = *ToTPListOrErr;6176PrevDecl = ClassTemplate->findPartialSpecialization(TemplateArgs,6177*ToTPListOrErr,6178InsertPos);6179} else6180PrevDecl = ClassTemplate->findSpecialization(TemplateArgs, InsertPos);61816182if (PrevDecl) {6183if (IsStructuralMatch(D, PrevDecl)) {6184CXXRecordDecl *PrevDefinition = PrevDecl->getDefinition();6185if (D->isThisDeclarationADefinition() && PrevDefinition) {6186Importer.MapImported(D, PrevDefinition);6187// Import those default field initializers which have been6188// instantiated in the "From" context, but not in the "To" context.6189for (auto *FromField : D->fields()) {6190auto ToOrErr = import(FromField);6191if (!ToOrErr)6192return ToOrErr.takeError();6193}61946195// Import those methods which have been instantiated in the6196// "From" context, but not in the "To" context.6197for (CXXMethodDecl *FromM : D->methods()) {6198auto ToOrErr = import(FromM);6199if (!ToOrErr)6200return ToOrErr.takeError();6201}62026203// TODO Import instantiated default arguments.6204// TODO Import instantiated exception specifications.6205//6206// Generally, ASTCommon.h/DeclUpdateKind enum gives a very good hint6207// what else could be fused during an AST merge.6208return PrevDefinition;6209}6210} else { // ODR violation.6211// FIXME HandleNameConflict6212return make_error<ASTImportError>(ASTImportError::NameConflict);6213}6214}62156216// Import the location of this declaration.6217ExpectedSLoc BeginLocOrErr = import(D->getBeginLoc());6218if (!BeginLocOrErr)6219return BeginLocOrErr.takeError();6220ExpectedSLoc IdLocOrErr = import(D->getLocation());6221if (!IdLocOrErr)6222return IdLocOrErr.takeError();62236224// Import TemplateArgumentListInfo.6225TemplateArgumentListInfo ToTAInfo;6226if (const auto *ASTTemplateArgs = D->getTemplateArgsAsWritten()) {6227if (Error Err = ImportTemplateArgumentListInfo(*ASTTemplateArgs, ToTAInfo))6228return std::move(Err);6229}62306231// Create the specialization.6232ClassTemplateSpecializationDecl *D2 = nullptr;6233if (PartialSpec) {6234QualType CanonInjType;6235if (Error Err = importInto(6236CanonInjType, PartialSpec->getInjectedSpecializationType()))6237return std::move(Err);6238CanonInjType = CanonInjType.getCanonicalType();62396240if (GetImportedOrCreateDecl<ClassTemplatePartialSpecializationDecl>(6241D2, D, Importer.getToContext(), D->getTagKind(), DC, *BeginLocOrErr,6242*IdLocOrErr, ToTPList, ClassTemplate,6243llvm::ArrayRef(TemplateArgs.data(), TemplateArgs.size()),6244CanonInjType,6245cast_or_null<ClassTemplatePartialSpecializationDecl>(PrevDecl)))6246return D2;62476248// Update InsertPos, because preceding import calls may have invalidated6249// it by adding new specializations.6250auto *PartSpec2 = cast<ClassTemplatePartialSpecializationDecl>(D2);6251if (!ClassTemplate->findPartialSpecialization(TemplateArgs, ToTPList,6252InsertPos))6253// Add this partial specialization to the class template.6254ClassTemplate->AddPartialSpecialization(PartSpec2, InsertPos);6255if (Expected<ClassTemplatePartialSpecializationDecl *> ToInstOrErr =6256import(PartialSpec->getInstantiatedFromMember()))6257PartSpec2->setInstantiatedFromMember(*ToInstOrErr);6258else6259return ToInstOrErr.takeError();62606261updateLookupTableForTemplateParameters(*ToTPList);6262} else { // Not a partial specialization.6263if (GetImportedOrCreateDecl(6264D2, D, Importer.getToContext(), D->getTagKind(), DC,6265*BeginLocOrErr, *IdLocOrErr, ClassTemplate, TemplateArgs,6266PrevDecl))6267return D2;62686269// Update InsertPos, because preceding import calls may have invalidated6270// it by adding new specializations.6271if (!ClassTemplate->findSpecialization(TemplateArgs, InsertPos))6272// Add this specialization to the class template.6273ClassTemplate->AddSpecialization(D2, InsertPos);6274}62756276D2->setSpecializationKind(D->getSpecializationKind());62776278// Set the context of this specialization/instantiation.6279D2->setLexicalDeclContext(LexicalDC);62806281// Add to the DC only if it was an explicit specialization/instantiation.6282if (D2->isExplicitInstantiationOrSpecialization()) {6283LexicalDC->addDeclInternal(D2);6284}62856286if (auto BraceRangeOrErr = import(D->getBraceRange()))6287D2->setBraceRange(*BraceRangeOrErr);6288else6289return BraceRangeOrErr.takeError();62906291if (Error Err = ImportTemplateParameterLists(D, D2))6292return std::move(Err);62936294// Import the qualifier, if any.6295if (auto LocOrErr = import(D->getQualifierLoc()))6296D2->setQualifierInfo(*LocOrErr);6297else6298return LocOrErr.takeError();62996300if (D->getTemplateArgsAsWritten())6301D2->setTemplateArgsAsWritten(ToTAInfo);63026303if (auto LocOrErr = import(D->getTemplateKeywordLoc()))6304D2->setTemplateKeywordLoc(*LocOrErr);6305else6306return LocOrErr.takeError();63076308if (auto LocOrErr = import(D->getExternKeywordLoc()))6309D2->setExternKeywordLoc(*LocOrErr);6310else6311return LocOrErr.takeError();63126313if (D->getPointOfInstantiation().isValid()) {6314if (auto POIOrErr = import(D->getPointOfInstantiation()))6315D2->setPointOfInstantiation(*POIOrErr);6316else6317return POIOrErr.takeError();6318}63196320D2->setTemplateSpecializationKind(D->getTemplateSpecializationKind());63216322if (auto P = D->getInstantiatedFrom()) {6323if (auto *CTD = P.dyn_cast<ClassTemplateDecl *>()) {6324if (auto CTDorErr = import(CTD))6325D2->setInstantiationOf(*CTDorErr);6326} else {6327auto *CTPSD = cast<ClassTemplatePartialSpecializationDecl *>(P);6328auto CTPSDOrErr = import(CTPSD);6329if (!CTPSDOrErr)6330return CTPSDOrErr.takeError();6331const TemplateArgumentList &DArgs = D->getTemplateInstantiationArgs();6332SmallVector<TemplateArgument, 2> D2ArgsVec(DArgs.size());6333for (unsigned I = 0; I < DArgs.size(); ++I) {6334const TemplateArgument &DArg = DArgs[I];6335if (auto ArgOrErr = import(DArg))6336D2ArgsVec[I] = *ArgOrErr;6337else6338return ArgOrErr.takeError();6339}6340D2->setInstantiationOf(6341*CTPSDOrErr,6342TemplateArgumentList::CreateCopy(Importer.getToContext(), D2ArgsVec));6343}6344}63456346if (D->isCompleteDefinition())6347if (Error Err = ImportDefinition(D, D2))6348return std::move(Err);63496350return D2;6351}63526353ExpectedDecl ASTNodeImporter::VisitVarTemplateDecl(VarTemplateDecl *D) {6354// Import the major distinguishing characteristics of this variable template.6355DeclContext *DC, *LexicalDC;6356DeclarationName Name;6357SourceLocation Loc;6358NamedDecl *ToD;6359if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))6360return std::move(Err);6361if (ToD)6362return ToD;63636364// We may already have a template of the same name; try to find and match it.6365assert(!DC->isFunctionOrMethod() &&6366"Variable templates cannot be declared at function scope");63676368SmallVector<NamedDecl *, 4> ConflictingDecls;6369auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);6370VarTemplateDecl *FoundByLookup = nullptr;6371for (auto *FoundDecl : FoundDecls) {6372if (!FoundDecl->isInIdentifierNamespace(Decl::IDNS_Ordinary))6373continue;63746375if (VarTemplateDecl *FoundTemplate = dyn_cast<VarTemplateDecl>(FoundDecl)) {6376// Use the templated decl, some linkage flags are set only there.6377if (!hasSameVisibilityContextAndLinkage(FoundTemplate->getTemplatedDecl(),6378D->getTemplatedDecl()))6379continue;6380if (IsStructuralMatch(D, FoundTemplate)) {6381// FIXME Check for ODR error if the two definitions have6382// different initializers?6383VarTemplateDecl *FoundDef = getTemplateDefinition(FoundTemplate);6384if (D->getDeclContext()->isRecord()) {6385assert(FoundTemplate->getDeclContext()->isRecord() &&6386"Member variable template imported as non-member, "6387"inconsistent imported AST?");6388if (FoundDef)6389return Importer.MapImported(D, FoundDef);6390if (!D->isThisDeclarationADefinition())6391return Importer.MapImported(D, FoundTemplate);6392} else {6393if (FoundDef && D->isThisDeclarationADefinition())6394return Importer.MapImported(D, FoundDef);6395}6396FoundByLookup = FoundTemplate;6397break;6398}6399ConflictingDecls.push_back(FoundDecl);6400}6401}64026403if (!ConflictingDecls.empty()) {6404ExpectedName NameOrErr = Importer.HandleNameConflict(6405Name, DC, Decl::IDNS_Ordinary, ConflictingDecls.data(),6406ConflictingDecls.size());6407if (NameOrErr)6408Name = NameOrErr.get();6409else6410return NameOrErr.takeError();6411}64126413VarDecl *DTemplated = D->getTemplatedDecl();64146415// Import the type.6416// FIXME: Value not used?6417ExpectedType TypeOrErr = import(DTemplated->getType());6418if (!TypeOrErr)6419return TypeOrErr.takeError();64206421// Create the declaration that is being templated.6422VarDecl *ToTemplated;6423if (Error Err = importInto(ToTemplated, DTemplated))6424return std::move(Err);64256426// Create the variable template declaration itself.6427auto TemplateParamsOrErr = import(D->getTemplateParameters());6428if (!TemplateParamsOrErr)6429return TemplateParamsOrErr.takeError();64306431VarTemplateDecl *ToVarTD;6432if (GetImportedOrCreateDecl(ToVarTD, D, Importer.getToContext(), DC, Loc,6433Name, *TemplateParamsOrErr, ToTemplated))6434return ToVarTD;64356436ToTemplated->setDescribedVarTemplate(ToVarTD);64376438ToVarTD->setAccess(D->getAccess());6439ToVarTD->setLexicalDeclContext(LexicalDC);6440LexicalDC->addDeclInternal(ToVarTD);6441if (DC != Importer.getToContext().getTranslationUnitDecl())6442updateLookupTableForTemplateParameters(**TemplateParamsOrErr);64436444if (FoundByLookup) {6445auto *Recent =6446const_cast<VarTemplateDecl *>(FoundByLookup->getMostRecentDecl());6447if (!ToTemplated->getPreviousDecl()) {6448auto *PrevTemplated =6449FoundByLookup->getTemplatedDecl()->getMostRecentDecl();6450if (ToTemplated != PrevTemplated)6451ToTemplated->setPreviousDecl(PrevTemplated);6452}6453ToVarTD->setPreviousDecl(Recent);6454}64556456return ToVarTD;6457}64586459ExpectedDecl ASTNodeImporter::VisitVarTemplateSpecializationDecl(6460VarTemplateSpecializationDecl *D) {6461// A VarTemplateSpecializationDecl inherits from VarDecl, the import is done6462// in an analog way (but specialized for this case).64636464SmallVector<Decl *, 2> Redecls = getCanonicalForwardRedeclChain(D);6465auto RedeclIt = Redecls.begin();6466// Import the first part of the decl chain. I.e. import all previous6467// declarations starting from the canonical decl.6468for (; RedeclIt != Redecls.end() && *RedeclIt != D; ++RedeclIt) {6469ExpectedDecl RedeclOrErr = import(*RedeclIt);6470if (!RedeclOrErr)6471return RedeclOrErr.takeError();6472}6473assert(*RedeclIt == D);64746475VarTemplateDecl *VarTemplate = nullptr;6476if (Error Err = importInto(VarTemplate, D->getSpecializedTemplate()))6477return std::move(Err);64786479// Import the context of this declaration.6480DeclContext *DC, *LexicalDC;6481if (Error Err = ImportDeclContext(D, DC, LexicalDC))6482return std::move(Err);64836484// Import the location of this declaration.6485ExpectedSLoc BeginLocOrErr = import(D->getBeginLoc());6486if (!BeginLocOrErr)6487return BeginLocOrErr.takeError();64886489auto IdLocOrErr = import(D->getLocation());6490if (!IdLocOrErr)6491return IdLocOrErr.takeError();64926493// Import template arguments.6494SmallVector<TemplateArgument, 2> TemplateArgs;6495if (Error Err =6496ImportTemplateArguments(D->getTemplateArgs().asArray(), TemplateArgs))6497return std::move(Err);64986499// Try to find an existing specialization with these template arguments.6500void *InsertPos = nullptr;6501VarTemplateSpecializationDecl *FoundSpecialization =6502VarTemplate->findSpecialization(TemplateArgs, InsertPos);6503if (FoundSpecialization) {6504if (IsStructuralMatch(D, FoundSpecialization)) {6505VarDecl *FoundDef = FoundSpecialization->getDefinition();6506if (D->getDeclContext()->isRecord()) {6507// In a record, it is allowed only to have one optional declaration and6508// one definition of the (static or constexpr) variable template.6509assert(6510FoundSpecialization->getDeclContext()->isRecord() &&6511"Member variable template specialization imported as non-member, "6512"inconsistent imported AST?");6513if (FoundDef)6514return Importer.MapImported(D, FoundDef);6515if (!D->isThisDeclarationADefinition())6516return Importer.MapImported(D, FoundSpecialization);6517} else {6518// If definition is imported and there is already one, map to it.6519// Otherwise create a new variable and link it to the existing.6520if (FoundDef && D->isThisDeclarationADefinition())6521return Importer.MapImported(D, FoundDef);6522}6523} else {6524return make_error<ASTImportError>(ASTImportError::NameConflict);6525}6526}65276528VarTemplateSpecializationDecl *D2 = nullptr;65296530TemplateArgumentListInfo ToTAInfo;6531if (const auto *Args = D->getTemplateArgsAsWritten()) {6532if (Error Err = ImportTemplateArgumentListInfo(*Args, ToTAInfo))6533return std::move(Err);6534}65356536using PartVarSpecDecl = VarTemplatePartialSpecializationDecl;6537// Create a new specialization.6538if (auto *FromPartial = dyn_cast<PartVarSpecDecl>(D)) {6539auto ToTPListOrErr = import(FromPartial->getTemplateParameters());6540if (!ToTPListOrErr)6541return ToTPListOrErr.takeError();65426543PartVarSpecDecl *ToPartial;6544if (GetImportedOrCreateDecl(ToPartial, D, Importer.getToContext(), DC,6545*BeginLocOrErr, *IdLocOrErr, *ToTPListOrErr,6546VarTemplate, QualType(), nullptr,6547D->getStorageClass(), TemplateArgs))6548return ToPartial;65496550if (Expected<PartVarSpecDecl *> ToInstOrErr =6551import(FromPartial->getInstantiatedFromMember()))6552ToPartial->setInstantiatedFromMember(*ToInstOrErr);6553else6554return ToInstOrErr.takeError();65556556if (FromPartial->isMemberSpecialization())6557ToPartial->setMemberSpecialization();65586559D2 = ToPartial;65606561// FIXME: Use this update if VarTemplatePartialSpecializationDecl is fixed6562// to adopt template parameters.6563// updateLookupTableForTemplateParameters(**ToTPListOrErr);6564} else { // Full specialization6565if (GetImportedOrCreateDecl(D2, D, Importer.getToContext(), DC,6566*BeginLocOrErr, *IdLocOrErr, VarTemplate,6567QualType(), nullptr, D->getStorageClass(),6568TemplateArgs))6569return D2;6570}65716572// Update InsertPos, because preceding import calls may have invalidated6573// it by adding new specializations.6574if (!VarTemplate->findSpecialization(TemplateArgs, InsertPos))6575VarTemplate->AddSpecialization(D2, InsertPos);65766577QualType T;6578if (Error Err = importInto(T, D->getType()))6579return std::move(Err);6580D2->setType(T);65816582auto TInfoOrErr = import(D->getTypeSourceInfo());6583if (!TInfoOrErr)6584return TInfoOrErr.takeError();6585D2->setTypeSourceInfo(*TInfoOrErr);65866587if (D->getPointOfInstantiation().isValid()) {6588if (ExpectedSLoc POIOrErr = import(D->getPointOfInstantiation()))6589D2->setPointOfInstantiation(*POIOrErr);6590else6591return POIOrErr.takeError();6592}65936594D2->setSpecializationKind(D->getSpecializationKind());65956596if (D->getTemplateArgsAsWritten())6597D2->setTemplateArgsAsWritten(ToTAInfo);65986599if (auto LocOrErr = import(D->getQualifierLoc()))6600D2->setQualifierInfo(*LocOrErr);6601else6602return LocOrErr.takeError();66036604if (D->isConstexpr())6605D2->setConstexpr(true);66066607D2->setAccess(D->getAccess());66086609if (Error Err = ImportInitializer(D, D2))6610return std::move(Err);66116612if (FoundSpecialization)6613D2->setPreviousDecl(FoundSpecialization->getMostRecentDecl());66146615addDeclToContexts(D, D2);66166617// Import the rest of the chain. I.e. import all subsequent declarations.6618for (++RedeclIt; RedeclIt != Redecls.end(); ++RedeclIt) {6619ExpectedDecl RedeclOrErr = import(*RedeclIt);6620if (!RedeclOrErr)6621return RedeclOrErr.takeError();6622}66236624return D2;6625}66266627ExpectedDecl6628ASTNodeImporter::VisitFunctionTemplateDecl(FunctionTemplateDecl *D) {6629DeclContext *DC, *LexicalDC;6630DeclarationName Name;6631SourceLocation Loc;6632NamedDecl *ToD;66336634if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))6635return std::move(Err);66366637if (ToD)6638return ToD;66396640const FunctionTemplateDecl *FoundByLookup = nullptr;66416642// Try to find a function in our own ("to") context with the same name, same6643// type, and in the same context as the function we're importing.6644// FIXME Split this into a separate function.6645if (!LexicalDC->isFunctionOrMethod()) {6646unsigned IDNS = Decl::IDNS_Ordinary | Decl::IDNS_OrdinaryFriend;6647auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);6648for (auto *FoundDecl : FoundDecls) {6649if (!FoundDecl->isInIdentifierNamespace(IDNS))6650continue;66516652if (auto *FoundTemplate = dyn_cast<FunctionTemplateDecl>(FoundDecl)) {6653if (!hasSameVisibilityContextAndLinkage(FoundTemplate, D))6654continue;6655if (IsStructuralMatch(D, FoundTemplate)) {6656FunctionTemplateDecl *TemplateWithDef =6657getTemplateDefinition(FoundTemplate);6658if (D->isThisDeclarationADefinition() && TemplateWithDef)6659return Importer.MapImported(D, TemplateWithDef);66606661FoundByLookup = FoundTemplate;6662break;6663// TODO: handle conflicting names6664}6665}6666}6667}66686669auto ParamsOrErr = import(D->getTemplateParameters());6670if (!ParamsOrErr)6671return ParamsOrErr.takeError();6672TemplateParameterList *Params = *ParamsOrErr;66736674FunctionDecl *TemplatedFD;6675if (Error Err = importInto(TemplatedFD, D->getTemplatedDecl()))6676return std::move(Err);66776678// At creation of the template the template parameters are "adopted"6679// (DeclContext is changed). After this possible change the lookup table6680// must be updated.6681// At deduction guides the DeclContext of the template parameters may be6682// different from what we would expect, it may be the class template, or a6683// probably different CXXDeductionGuideDecl. This may come from the fact that6684// the template parameter objects may be shared between deduction guides or6685// the class template, and at creation of multiple FunctionTemplateDecl6686// objects (for deduction guides) the same parameters are re-used. The6687// "adoption" happens multiple times with different parent, even recursively6688// for TemplateTemplateParmDecl. The same happens at import when the6689// FunctionTemplateDecl objects are created, but in different order.6690// In this way the DeclContext of these template parameters is not necessarily6691// the same as in the "from" context.6692SmallVector<DeclContext *, 2> OldParamDC;6693OldParamDC.reserve(Params->size());6694llvm::transform(*Params, std::back_inserter(OldParamDC),6695[](NamedDecl *ND) { return ND->getDeclContext(); });66966697FunctionTemplateDecl *ToFunc;6698if (GetImportedOrCreateDecl(ToFunc, D, Importer.getToContext(), DC, Loc, Name,6699Params, TemplatedFD))6700return ToFunc;67016702TemplatedFD->setDescribedFunctionTemplate(ToFunc);67036704ToFunc->setAccess(D->getAccess());6705ToFunc->setLexicalDeclContext(LexicalDC);6706addDeclToContexts(D, ToFunc);67076708ASTImporterLookupTable *LT = Importer.SharedState->getLookupTable();6709if (LT && !OldParamDC.empty()) {6710for (unsigned int I = 0; I < OldParamDC.size(); ++I)6711LT->updateForced(Params->getParam(I), OldParamDC[I]);6712}67136714if (FoundByLookup) {6715auto *Recent =6716const_cast<FunctionTemplateDecl *>(FoundByLookup->getMostRecentDecl());6717if (!TemplatedFD->getPreviousDecl()) {6718assert(FoundByLookup->getTemplatedDecl() &&6719"Found decl must have its templated decl set");6720auto *PrevTemplated =6721FoundByLookup->getTemplatedDecl()->getMostRecentDecl();6722if (TemplatedFD != PrevTemplated)6723TemplatedFD->setPreviousDecl(PrevTemplated);6724}6725ToFunc->setPreviousDecl(Recent);6726}67276728return ToFunc;6729}67306731//----------------------------------------------------------------------------6732// Import Statements6733//----------------------------------------------------------------------------67346735ExpectedStmt ASTNodeImporter::VisitStmt(Stmt *S) {6736Importer.FromDiag(S->getBeginLoc(), diag::err_unsupported_ast_node)6737<< S->getStmtClassName();6738return make_error<ASTImportError>(ASTImportError::UnsupportedConstruct);6739}674067416742ExpectedStmt ASTNodeImporter::VisitGCCAsmStmt(GCCAsmStmt *S) {6743if (Importer.returnWithErrorInTest())6744return make_error<ASTImportError>(ASTImportError::UnsupportedConstruct);6745SmallVector<IdentifierInfo *, 4> Names;6746for (unsigned I = 0, E = S->getNumOutputs(); I != E; I++) {6747IdentifierInfo *ToII = Importer.Import(S->getOutputIdentifier(I));6748// ToII is nullptr when no symbolic name is given for output operand6749// see ParseStmtAsm::ParseAsmOperandsOpt6750Names.push_back(ToII);6751}67526753for (unsigned I = 0, E = S->getNumInputs(); I != E; I++) {6754IdentifierInfo *ToII = Importer.Import(S->getInputIdentifier(I));6755// ToII is nullptr when no symbolic name is given for input operand6756// see ParseStmtAsm::ParseAsmOperandsOpt6757Names.push_back(ToII);6758}67596760SmallVector<StringLiteral *, 4> Clobbers;6761for (unsigned I = 0, E = S->getNumClobbers(); I != E; I++) {6762if (auto ClobberOrErr = import(S->getClobberStringLiteral(I)))6763Clobbers.push_back(*ClobberOrErr);6764else6765return ClobberOrErr.takeError();67666767}67686769SmallVector<StringLiteral *, 4> Constraints;6770for (unsigned I = 0, E = S->getNumOutputs(); I != E; I++) {6771if (auto OutputOrErr = import(S->getOutputConstraintLiteral(I)))6772Constraints.push_back(*OutputOrErr);6773else6774return OutputOrErr.takeError();6775}67766777for (unsigned I = 0, E = S->getNumInputs(); I != E; I++) {6778if (auto InputOrErr = import(S->getInputConstraintLiteral(I)))6779Constraints.push_back(*InputOrErr);6780else6781return InputOrErr.takeError();6782}67836784SmallVector<Expr *, 4> Exprs(S->getNumOutputs() + S->getNumInputs() +6785S->getNumLabels());6786if (Error Err = ImportContainerChecked(S->outputs(), Exprs))6787return std::move(Err);67886789if (Error Err =6790ImportArrayChecked(S->inputs(), Exprs.begin() + S->getNumOutputs()))6791return std::move(Err);67926793if (Error Err = ImportArrayChecked(6794S->labels(), Exprs.begin() + S->getNumOutputs() + S->getNumInputs()))6795return std::move(Err);67966797ExpectedSLoc AsmLocOrErr = import(S->getAsmLoc());6798if (!AsmLocOrErr)6799return AsmLocOrErr.takeError();6800auto AsmStrOrErr = import(S->getAsmString());6801if (!AsmStrOrErr)6802return AsmStrOrErr.takeError();6803ExpectedSLoc RParenLocOrErr = import(S->getRParenLoc());6804if (!RParenLocOrErr)6805return RParenLocOrErr.takeError();68066807return new (Importer.getToContext()) GCCAsmStmt(6808Importer.getToContext(),6809*AsmLocOrErr,6810S->isSimple(),6811S->isVolatile(),6812S->getNumOutputs(),6813S->getNumInputs(),6814Names.data(),6815Constraints.data(),6816Exprs.data(),6817*AsmStrOrErr,6818S->getNumClobbers(),6819Clobbers.data(),6820S->getNumLabels(),6821*RParenLocOrErr);6822}68236824ExpectedStmt ASTNodeImporter::VisitDeclStmt(DeclStmt *S) {68256826Error Err = Error::success();6827auto ToDG = importChecked(Err, S->getDeclGroup());6828auto ToBeginLoc = importChecked(Err, S->getBeginLoc());6829auto ToEndLoc = importChecked(Err, S->getEndLoc());6830if (Err)6831return std::move(Err);6832return new (Importer.getToContext()) DeclStmt(ToDG, ToBeginLoc, ToEndLoc);6833}68346835ExpectedStmt ASTNodeImporter::VisitNullStmt(NullStmt *S) {6836ExpectedSLoc ToSemiLocOrErr = import(S->getSemiLoc());6837if (!ToSemiLocOrErr)6838return ToSemiLocOrErr.takeError();6839return new (Importer.getToContext()) NullStmt(6840*ToSemiLocOrErr, S->hasLeadingEmptyMacro());6841}68426843ExpectedStmt ASTNodeImporter::VisitCompoundStmt(CompoundStmt *S) {6844SmallVector<Stmt *, 8> ToStmts(S->size());68456846if (Error Err = ImportContainerChecked(S->body(), ToStmts))6847return std::move(Err);68486849ExpectedSLoc ToLBracLocOrErr = import(S->getLBracLoc());6850if (!ToLBracLocOrErr)6851return ToLBracLocOrErr.takeError();68526853ExpectedSLoc ToRBracLocOrErr = import(S->getRBracLoc());6854if (!ToRBracLocOrErr)6855return ToRBracLocOrErr.takeError();68566857FPOptionsOverride FPO =6858S->hasStoredFPFeatures() ? S->getStoredFPFeatures() : FPOptionsOverride();6859return CompoundStmt::Create(Importer.getToContext(), ToStmts, FPO,6860*ToLBracLocOrErr, *ToRBracLocOrErr);6861}68626863ExpectedStmt ASTNodeImporter::VisitCaseStmt(CaseStmt *S) {68646865Error Err = Error::success();6866auto ToLHS = importChecked(Err, S->getLHS());6867auto ToRHS = importChecked(Err, S->getRHS());6868auto ToSubStmt = importChecked(Err, S->getSubStmt());6869auto ToCaseLoc = importChecked(Err, S->getCaseLoc());6870auto ToEllipsisLoc = importChecked(Err, S->getEllipsisLoc());6871auto ToColonLoc = importChecked(Err, S->getColonLoc());6872if (Err)6873return std::move(Err);68746875auto *ToStmt = CaseStmt::Create(Importer.getToContext(), ToLHS, ToRHS,6876ToCaseLoc, ToEllipsisLoc, ToColonLoc);6877ToStmt->setSubStmt(ToSubStmt);68786879return ToStmt;6880}68816882ExpectedStmt ASTNodeImporter::VisitDefaultStmt(DefaultStmt *S) {68836884Error Err = Error::success();6885auto ToDefaultLoc = importChecked(Err, S->getDefaultLoc());6886auto ToColonLoc = importChecked(Err, S->getColonLoc());6887auto ToSubStmt = importChecked(Err, S->getSubStmt());6888if (Err)6889return std::move(Err);68906891return new (Importer.getToContext()) DefaultStmt(6892ToDefaultLoc, ToColonLoc, ToSubStmt);6893}68946895ExpectedStmt ASTNodeImporter::VisitLabelStmt(LabelStmt *S) {68966897Error Err = Error::success();6898auto ToIdentLoc = importChecked(Err, S->getIdentLoc());6899auto ToLabelDecl = importChecked(Err, S->getDecl());6900auto ToSubStmt = importChecked(Err, S->getSubStmt());6901if (Err)6902return std::move(Err);69036904return new (Importer.getToContext()) LabelStmt(6905ToIdentLoc, ToLabelDecl, ToSubStmt);6906}69076908ExpectedStmt ASTNodeImporter::VisitAttributedStmt(AttributedStmt *S) {6909ExpectedSLoc ToAttrLocOrErr = import(S->getAttrLoc());6910if (!ToAttrLocOrErr)6911return ToAttrLocOrErr.takeError();6912ArrayRef<const Attr*> FromAttrs(S->getAttrs());6913SmallVector<const Attr *, 1> ToAttrs(FromAttrs.size());6914if (Error Err = ImportContainerChecked(FromAttrs, ToAttrs))6915return std::move(Err);6916ExpectedStmt ToSubStmtOrErr = import(S->getSubStmt());6917if (!ToSubStmtOrErr)6918return ToSubStmtOrErr.takeError();69196920return AttributedStmt::Create(6921Importer.getToContext(), *ToAttrLocOrErr, ToAttrs, *ToSubStmtOrErr);6922}69236924ExpectedStmt ASTNodeImporter::VisitIfStmt(IfStmt *S) {69256926Error Err = Error::success();6927auto ToIfLoc = importChecked(Err, S->getIfLoc());6928auto ToInit = importChecked(Err, S->getInit());6929auto ToConditionVariable = importChecked(Err, S->getConditionVariable());6930auto ToCond = importChecked(Err, S->getCond());6931auto ToLParenLoc = importChecked(Err, S->getLParenLoc());6932auto ToRParenLoc = importChecked(Err, S->getRParenLoc());6933auto ToThen = importChecked(Err, S->getThen());6934auto ToElseLoc = importChecked(Err, S->getElseLoc());6935auto ToElse = importChecked(Err, S->getElse());6936if (Err)6937return std::move(Err);69386939return IfStmt::Create(Importer.getToContext(), ToIfLoc, S->getStatementKind(),6940ToInit, ToConditionVariable, ToCond, ToLParenLoc,6941ToRParenLoc, ToThen, ToElseLoc, ToElse);6942}69436944ExpectedStmt ASTNodeImporter::VisitSwitchStmt(SwitchStmt *S) {69456946Error Err = Error::success();6947auto ToInit = importChecked(Err, S->getInit());6948auto ToConditionVariable = importChecked(Err, S->getConditionVariable());6949auto ToCond = importChecked(Err, S->getCond());6950auto ToLParenLoc = importChecked(Err, S->getLParenLoc());6951auto ToRParenLoc = importChecked(Err, S->getRParenLoc());6952auto ToBody = importChecked(Err, S->getBody());6953auto ToSwitchLoc = importChecked(Err, S->getSwitchLoc());6954if (Err)6955return std::move(Err);69566957auto *ToStmt =6958SwitchStmt::Create(Importer.getToContext(), ToInit, ToConditionVariable,6959ToCond, ToLParenLoc, ToRParenLoc);6960ToStmt->setBody(ToBody);6961ToStmt->setSwitchLoc(ToSwitchLoc);69626963// Now we have to re-chain the cases.6964SwitchCase *LastChainedSwitchCase = nullptr;6965for (SwitchCase *SC = S->getSwitchCaseList(); SC != nullptr;6966SC = SC->getNextSwitchCase()) {6967Expected<SwitchCase *> ToSCOrErr = import(SC);6968if (!ToSCOrErr)6969return ToSCOrErr.takeError();6970if (LastChainedSwitchCase)6971LastChainedSwitchCase->setNextSwitchCase(*ToSCOrErr);6972else6973ToStmt->setSwitchCaseList(*ToSCOrErr);6974LastChainedSwitchCase = *ToSCOrErr;6975}69766977return ToStmt;6978}69796980ExpectedStmt ASTNodeImporter::VisitWhileStmt(WhileStmt *S) {69816982Error Err = Error::success();6983auto ToConditionVariable = importChecked(Err, S->getConditionVariable());6984auto ToCond = importChecked(Err, S->getCond());6985auto ToBody = importChecked(Err, S->getBody());6986auto ToWhileLoc = importChecked(Err, S->getWhileLoc());6987auto ToLParenLoc = importChecked(Err, S->getLParenLoc());6988auto ToRParenLoc = importChecked(Err, S->getRParenLoc());6989if (Err)6990return std::move(Err);69916992return WhileStmt::Create(Importer.getToContext(), ToConditionVariable, ToCond,6993ToBody, ToWhileLoc, ToLParenLoc, ToRParenLoc);6994}69956996ExpectedStmt ASTNodeImporter::VisitDoStmt(DoStmt *S) {69976998Error Err = Error::success();6999auto ToBody = importChecked(Err, S->getBody());7000auto ToCond = importChecked(Err, S->getCond());7001auto ToDoLoc = importChecked(Err, S->getDoLoc());7002auto ToWhileLoc = importChecked(Err, S->getWhileLoc());7003auto ToRParenLoc = importChecked(Err, S->getRParenLoc());7004if (Err)7005return std::move(Err);70067007return new (Importer.getToContext()) DoStmt(7008ToBody, ToCond, ToDoLoc, ToWhileLoc, ToRParenLoc);7009}70107011ExpectedStmt ASTNodeImporter::VisitForStmt(ForStmt *S) {70127013Error Err = Error::success();7014auto ToInit = importChecked(Err, S->getInit());7015auto ToCond = importChecked(Err, S->getCond());7016auto ToConditionVariable = importChecked(Err, S->getConditionVariable());7017auto ToInc = importChecked(Err, S->getInc());7018auto ToBody = importChecked(Err, S->getBody());7019auto ToForLoc = importChecked(Err, S->getForLoc());7020auto ToLParenLoc = importChecked(Err, S->getLParenLoc());7021auto ToRParenLoc = importChecked(Err, S->getRParenLoc());7022if (Err)7023return std::move(Err);70247025return new (Importer.getToContext()) ForStmt(7026Importer.getToContext(),7027ToInit, ToCond, ToConditionVariable, ToInc, ToBody, ToForLoc, ToLParenLoc,7028ToRParenLoc);7029}70307031ExpectedStmt ASTNodeImporter::VisitGotoStmt(GotoStmt *S) {70327033Error Err = Error::success();7034auto ToLabel = importChecked(Err, S->getLabel());7035auto ToGotoLoc = importChecked(Err, S->getGotoLoc());7036auto ToLabelLoc = importChecked(Err, S->getLabelLoc());7037if (Err)7038return std::move(Err);70397040return new (Importer.getToContext()) GotoStmt(7041ToLabel, ToGotoLoc, ToLabelLoc);7042}70437044ExpectedStmt ASTNodeImporter::VisitIndirectGotoStmt(IndirectGotoStmt *S) {70457046Error Err = Error::success();7047auto ToGotoLoc = importChecked(Err, S->getGotoLoc());7048auto ToStarLoc = importChecked(Err, S->getStarLoc());7049auto ToTarget = importChecked(Err, S->getTarget());7050if (Err)7051return std::move(Err);70527053return new (Importer.getToContext()) IndirectGotoStmt(7054ToGotoLoc, ToStarLoc, ToTarget);7055}70567057ExpectedStmt ASTNodeImporter::VisitContinueStmt(ContinueStmt *S) {7058ExpectedSLoc ToContinueLocOrErr = import(S->getContinueLoc());7059if (!ToContinueLocOrErr)7060return ToContinueLocOrErr.takeError();7061return new (Importer.getToContext()) ContinueStmt(*ToContinueLocOrErr);7062}70637064ExpectedStmt ASTNodeImporter::VisitBreakStmt(BreakStmt *S) {7065auto ToBreakLocOrErr = import(S->getBreakLoc());7066if (!ToBreakLocOrErr)7067return ToBreakLocOrErr.takeError();7068return new (Importer.getToContext()) BreakStmt(*ToBreakLocOrErr);7069}70707071ExpectedStmt ASTNodeImporter::VisitReturnStmt(ReturnStmt *S) {70727073Error Err = Error::success();7074auto ToReturnLoc = importChecked(Err, S->getReturnLoc());7075auto ToRetValue = importChecked(Err, S->getRetValue());7076auto ToNRVOCandidate = importChecked(Err, S->getNRVOCandidate());7077if (Err)7078return std::move(Err);70797080return ReturnStmt::Create(Importer.getToContext(), ToReturnLoc, ToRetValue,7081ToNRVOCandidate);7082}70837084ExpectedStmt ASTNodeImporter::VisitCXXCatchStmt(CXXCatchStmt *S) {70857086Error Err = Error::success();7087auto ToCatchLoc = importChecked(Err, S->getCatchLoc());7088auto ToExceptionDecl = importChecked(Err, S->getExceptionDecl());7089auto ToHandlerBlock = importChecked(Err, S->getHandlerBlock());7090if (Err)7091return std::move(Err);70927093return new (Importer.getToContext()) CXXCatchStmt (7094ToCatchLoc, ToExceptionDecl, ToHandlerBlock);7095}70967097ExpectedStmt ASTNodeImporter::VisitCXXTryStmt(CXXTryStmt *S) {7098ExpectedSLoc ToTryLocOrErr = import(S->getTryLoc());7099if (!ToTryLocOrErr)7100return ToTryLocOrErr.takeError();71017102ExpectedStmt ToTryBlockOrErr = import(S->getTryBlock());7103if (!ToTryBlockOrErr)7104return ToTryBlockOrErr.takeError();71057106SmallVector<Stmt *, 1> ToHandlers(S->getNumHandlers());7107for (unsigned HI = 0, HE = S->getNumHandlers(); HI != HE; ++HI) {7108CXXCatchStmt *FromHandler = S->getHandler(HI);7109if (auto ToHandlerOrErr = import(FromHandler))7110ToHandlers[HI] = *ToHandlerOrErr;7111else7112return ToHandlerOrErr.takeError();7113}71147115return CXXTryStmt::Create(Importer.getToContext(), *ToTryLocOrErr,7116cast<CompoundStmt>(*ToTryBlockOrErr), ToHandlers);7117}71187119ExpectedStmt ASTNodeImporter::VisitCXXForRangeStmt(CXXForRangeStmt *S) {71207121Error Err = Error::success();7122auto ToInit = importChecked(Err, S->getInit());7123auto ToRangeStmt = importChecked(Err, S->getRangeStmt());7124auto ToBeginStmt = importChecked(Err, S->getBeginStmt());7125auto ToEndStmt = importChecked(Err, S->getEndStmt());7126auto ToCond = importChecked(Err, S->getCond());7127auto ToInc = importChecked(Err, S->getInc());7128auto ToLoopVarStmt = importChecked(Err, S->getLoopVarStmt());7129auto ToBody = importChecked(Err, S->getBody());7130auto ToForLoc = importChecked(Err, S->getForLoc());7131auto ToCoawaitLoc = importChecked(Err, S->getCoawaitLoc());7132auto ToColonLoc = importChecked(Err, S->getColonLoc());7133auto ToRParenLoc = importChecked(Err, S->getRParenLoc());7134if (Err)7135return std::move(Err);71367137return new (Importer.getToContext()) CXXForRangeStmt(7138ToInit, ToRangeStmt, ToBeginStmt, ToEndStmt, ToCond, ToInc, ToLoopVarStmt,7139ToBody, ToForLoc, ToCoawaitLoc, ToColonLoc, ToRParenLoc);7140}71417142ExpectedStmt7143ASTNodeImporter::VisitObjCForCollectionStmt(ObjCForCollectionStmt *S) {7144Error Err = Error::success();7145auto ToElement = importChecked(Err, S->getElement());7146auto ToCollection = importChecked(Err, S->getCollection());7147auto ToBody = importChecked(Err, S->getBody());7148auto ToForLoc = importChecked(Err, S->getForLoc());7149auto ToRParenLoc = importChecked(Err, S->getRParenLoc());7150if (Err)7151return std::move(Err);71527153return new (Importer.getToContext()) ObjCForCollectionStmt(ToElement,7154ToCollection,7155ToBody,7156ToForLoc,7157ToRParenLoc);7158}71597160ExpectedStmt ASTNodeImporter::VisitObjCAtCatchStmt(ObjCAtCatchStmt *S) {71617162Error Err = Error::success();7163auto ToAtCatchLoc = importChecked(Err, S->getAtCatchLoc());7164auto ToRParenLoc = importChecked(Err, S->getRParenLoc());7165auto ToCatchParamDecl = importChecked(Err, S->getCatchParamDecl());7166auto ToCatchBody = importChecked(Err, S->getCatchBody());7167if (Err)7168return std::move(Err);71697170return new (Importer.getToContext()) ObjCAtCatchStmt (7171ToAtCatchLoc, ToRParenLoc, ToCatchParamDecl, ToCatchBody);7172}71737174ExpectedStmt ASTNodeImporter::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {7175ExpectedSLoc ToAtFinallyLocOrErr = import(S->getAtFinallyLoc());7176if (!ToAtFinallyLocOrErr)7177return ToAtFinallyLocOrErr.takeError();7178ExpectedStmt ToAtFinallyStmtOrErr = import(S->getFinallyBody());7179if (!ToAtFinallyStmtOrErr)7180return ToAtFinallyStmtOrErr.takeError();7181return new (Importer.getToContext()) ObjCAtFinallyStmt(*ToAtFinallyLocOrErr,7182*ToAtFinallyStmtOrErr);7183}71847185ExpectedStmt ASTNodeImporter::VisitObjCAtTryStmt(ObjCAtTryStmt *S) {71867187Error Err = Error::success();7188auto ToAtTryLoc = importChecked(Err, S->getAtTryLoc());7189auto ToTryBody = importChecked(Err, S->getTryBody());7190auto ToFinallyStmt = importChecked(Err, S->getFinallyStmt());7191if (Err)7192return std::move(Err);71937194SmallVector<Stmt *, 1> ToCatchStmts(S->getNumCatchStmts());7195for (unsigned CI = 0, CE = S->getNumCatchStmts(); CI != CE; ++CI) {7196ObjCAtCatchStmt *FromCatchStmt = S->getCatchStmt(CI);7197if (ExpectedStmt ToCatchStmtOrErr = import(FromCatchStmt))7198ToCatchStmts[CI] = *ToCatchStmtOrErr;7199else7200return ToCatchStmtOrErr.takeError();7201}72027203return ObjCAtTryStmt::Create(Importer.getToContext(),7204ToAtTryLoc, ToTryBody,7205ToCatchStmts.begin(), ToCatchStmts.size(),7206ToFinallyStmt);7207}72087209ExpectedStmt7210ASTNodeImporter::VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *S) {72117212Error Err = Error::success();7213auto ToAtSynchronizedLoc = importChecked(Err, S->getAtSynchronizedLoc());7214auto ToSynchExpr = importChecked(Err, S->getSynchExpr());7215auto ToSynchBody = importChecked(Err, S->getSynchBody());7216if (Err)7217return std::move(Err);72187219return new (Importer.getToContext()) ObjCAtSynchronizedStmt(7220ToAtSynchronizedLoc, ToSynchExpr, ToSynchBody);7221}72227223ExpectedStmt ASTNodeImporter::VisitObjCAtThrowStmt(ObjCAtThrowStmt *S) {7224ExpectedSLoc ToThrowLocOrErr = import(S->getThrowLoc());7225if (!ToThrowLocOrErr)7226return ToThrowLocOrErr.takeError();7227ExpectedExpr ToThrowExprOrErr = import(S->getThrowExpr());7228if (!ToThrowExprOrErr)7229return ToThrowExprOrErr.takeError();7230return new (Importer.getToContext()) ObjCAtThrowStmt(7231*ToThrowLocOrErr, *ToThrowExprOrErr);7232}72337234ExpectedStmt ASTNodeImporter::VisitObjCAutoreleasePoolStmt(7235ObjCAutoreleasePoolStmt *S) {7236ExpectedSLoc ToAtLocOrErr = import(S->getAtLoc());7237if (!ToAtLocOrErr)7238return ToAtLocOrErr.takeError();7239ExpectedStmt ToSubStmtOrErr = import(S->getSubStmt());7240if (!ToSubStmtOrErr)7241return ToSubStmtOrErr.takeError();7242return new (Importer.getToContext()) ObjCAutoreleasePoolStmt(*ToAtLocOrErr,7243*ToSubStmtOrErr);7244}72457246//----------------------------------------------------------------------------7247// Import Expressions7248//----------------------------------------------------------------------------7249ExpectedStmt ASTNodeImporter::VisitExpr(Expr *E) {7250Importer.FromDiag(E->getBeginLoc(), diag::err_unsupported_ast_node)7251<< E->getStmtClassName();7252return make_error<ASTImportError>(ASTImportError::UnsupportedConstruct);7253}72547255ExpectedStmt ASTNodeImporter::VisitSourceLocExpr(SourceLocExpr *E) {7256Error Err = Error::success();7257auto ToType = importChecked(Err, E->getType());7258auto BLoc = importChecked(Err, E->getBeginLoc());7259auto RParenLoc = importChecked(Err, E->getEndLoc());7260if (Err)7261return std::move(Err);7262auto ParentContextOrErr = Importer.ImportContext(E->getParentContext());7263if (!ParentContextOrErr)7264return ParentContextOrErr.takeError();72657266return new (Importer.getToContext())7267SourceLocExpr(Importer.getToContext(), E->getIdentKind(), ToType, BLoc,7268RParenLoc, *ParentContextOrErr);7269}72707271ExpectedStmt ASTNodeImporter::VisitVAArgExpr(VAArgExpr *E) {72727273Error Err = Error::success();7274auto ToBuiltinLoc = importChecked(Err, E->getBuiltinLoc());7275auto ToSubExpr = importChecked(Err, E->getSubExpr());7276auto ToWrittenTypeInfo = importChecked(Err, E->getWrittenTypeInfo());7277auto ToRParenLoc = importChecked(Err, E->getRParenLoc());7278auto ToType = importChecked(Err, E->getType());7279if (Err)7280return std::move(Err);72817282return new (Importer.getToContext()) VAArgExpr(7283ToBuiltinLoc, ToSubExpr, ToWrittenTypeInfo, ToRParenLoc, ToType,7284E->isMicrosoftABI());7285}72867287ExpectedStmt ASTNodeImporter::VisitChooseExpr(ChooseExpr *E) {72887289Error Err = Error::success();7290auto ToCond = importChecked(Err, E->getCond());7291auto ToLHS = importChecked(Err, E->getLHS());7292auto ToRHS = importChecked(Err, E->getRHS());7293auto ToBuiltinLoc = importChecked(Err, E->getBuiltinLoc());7294auto ToRParenLoc = importChecked(Err, E->getRParenLoc());7295auto ToType = importChecked(Err, E->getType());7296if (Err)7297return std::move(Err);72987299ExprValueKind VK = E->getValueKind();7300ExprObjectKind OK = E->getObjectKind();73017302// The value of CondIsTrue only matters if the value is not7303// condition-dependent.7304bool CondIsTrue = !E->isConditionDependent() && E->isConditionTrue();73057306return new (Importer.getToContext())7307ChooseExpr(ToBuiltinLoc, ToCond, ToLHS, ToRHS, ToType, VK, OK,7308ToRParenLoc, CondIsTrue);7309}73107311ExpectedStmt ASTNodeImporter::VisitConvertVectorExpr(ConvertVectorExpr *E) {7312Error Err = Error::success();7313auto *ToSrcExpr = importChecked(Err, E->getSrcExpr());7314auto ToRParenLoc = importChecked(Err, E->getRParenLoc());7315auto ToBuiltinLoc = importChecked(Err, E->getBuiltinLoc());7316auto ToType = importChecked(Err, E->getType());7317auto *ToTSI = importChecked(Err, E->getTypeSourceInfo());7318if (Err)7319return std::move(Err);73207321return new (Importer.getToContext())7322ConvertVectorExpr(ToSrcExpr, ToTSI, ToType, E->getValueKind(),7323E->getObjectKind(), ToBuiltinLoc, ToRParenLoc);7324}73257326ExpectedStmt ASTNodeImporter::VisitShuffleVectorExpr(ShuffleVectorExpr *E) {7327Error Err = Error::success();7328auto ToRParenLoc = importChecked(Err, E->getRParenLoc());7329auto ToBeginLoc = importChecked(Err, E->getBeginLoc());7330auto ToType = importChecked(Err, E->getType());7331const unsigned NumSubExprs = E->getNumSubExprs();73327333llvm::SmallVector<Expr *, 8> ToSubExprs;7334llvm::ArrayRef<Expr *> FromSubExprs(E->getSubExprs(), NumSubExprs);7335ToSubExprs.resize(NumSubExprs);73367337if ((Err = ImportContainerChecked(FromSubExprs, ToSubExprs)))7338return std::move(Err);73397340return new (Importer.getToContext()) ShuffleVectorExpr(7341Importer.getToContext(), ToSubExprs, ToType, ToBeginLoc, ToRParenLoc);7342}73437344ExpectedStmt ASTNodeImporter::VisitGNUNullExpr(GNUNullExpr *E) {7345ExpectedType TypeOrErr = import(E->getType());7346if (!TypeOrErr)7347return TypeOrErr.takeError();73487349ExpectedSLoc BeginLocOrErr = import(E->getBeginLoc());7350if (!BeginLocOrErr)7351return BeginLocOrErr.takeError();73527353return new (Importer.getToContext()) GNUNullExpr(*TypeOrErr, *BeginLocOrErr);7354}73557356ExpectedStmt7357ASTNodeImporter::VisitGenericSelectionExpr(GenericSelectionExpr *E) {7358Error Err = Error::success();7359auto ToGenericLoc = importChecked(Err, E->getGenericLoc());7360Expr *ToControllingExpr = nullptr;7361TypeSourceInfo *ToControllingType = nullptr;7362if (E->isExprPredicate())7363ToControllingExpr = importChecked(Err, E->getControllingExpr());7364else7365ToControllingType = importChecked(Err, E->getControllingType());7366assert((ToControllingExpr || ToControllingType) &&7367"Either the controlling expr or type must be nonnull");7368auto ToDefaultLoc = importChecked(Err, E->getDefaultLoc());7369auto ToRParenLoc = importChecked(Err, E->getRParenLoc());7370if (Err)7371return std::move(Err);73727373ArrayRef<const TypeSourceInfo *> FromAssocTypes(E->getAssocTypeSourceInfos());7374SmallVector<TypeSourceInfo *, 1> ToAssocTypes(FromAssocTypes.size());7375if (Error Err = ImportContainerChecked(FromAssocTypes, ToAssocTypes))7376return std::move(Err);73777378ArrayRef<const Expr *> FromAssocExprs(E->getAssocExprs());7379SmallVector<Expr *, 1> ToAssocExprs(FromAssocExprs.size());7380if (Error Err = ImportContainerChecked(FromAssocExprs, ToAssocExprs))7381return std::move(Err);73827383const ASTContext &ToCtx = Importer.getToContext();7384if (E->isResultDependent()) {7385if (ToControllingExpr) {7386return GenericSelectionExpr::Create(7387ToCtx, ToGenericLoc, ToControllingExpr, llvm::ArrayRef(ToAssocTypes),7388llvm::ArrayRef(ToAssocExprs), ToDefaultLoc, ToRParenLoc,7389E->containsUnexpandedParameterPack());7390}7391return GenericSelectionExpr::Create(7392ToCtx, ToGenericLoc, ToControllingType, llvm::ArrayRef(ToAssocTypes),7393llvm::ArrayRef(ToAssocExprs), ToDefaultLoc, ToRParenLoc,7394E->containsUnexpandedParameterPack());7395}73967397if (ToControllingExpr) {7398return GenericSelectionExpr::Create(7399ToCtx, ToGenericLoc, ToControllingExpr, llvm::ArrayRef(ToAssocTypes),7400llvm::ArrayRef(ToAssocExprs), ToDefaultLoc, ToRParenLoc,7401E->containsUnexpandedParameterPack(), E->getResultIndex());7402}7403return GenericSelectionExpr::Create(7404ToCtx, ToGenericLoc, ToControllingType, llvm::ArrayRef(ToAssocTypes),7405llvm::ArrayRef(ToAssocExprs), ToDefaultLoc, ToRParenLoc,7406E->containsUnexpandedParameterPack(), E->getResultIndex());7407}74087409ExpectedStmt ASTNodeImporter::VisitPredefinedExpr(PredefinedExpr *E) {74107411Error Err = Error::success();7412auto ToBeginLoc = importChecked(Err, E->getBeginLoc());7413auto ToType = importChecked(Err, E->getType());7414auto ToFunctionName = importChecked(Err, E->getFunctionName());7415if (Err)7416return std::move(Err);74177418return PredefinedExpr::Create(Importer.getToContext(), ToBeginLoc, ToType,7419E->getIdentKind(), E->isTransparent(),7420ToFunctionName);7421}74227423ExpectedStmt ASTNodeImporter::VisitDeclRefExpr(DeclRefExpr *E) {74247425Error Err = Error::success();7426auto ToQualifierLoc = importChecked(Err, E->getQualifierLoc());7427auto ToTemplateKeywordLoc = importChecked(Err, E->getTemplateKeywordLoc());7428auto ToDecl = importChecked(Err, E->getDecl());7429auto ToLocation = importChecked(Err, E->getLocation());7430auto ToType = importChecked(Err, E->getType());7431if (Err)7432return std::move(Err);74337434NamedDecl *ToFoundD = nullptr;7435if (E->getDecl() != E->getFoundDecl()) {7436auto FoundDOrErr = import(E->getFoundDecl());7437if (!FoundDOrErr)7438return FoundDOrErr.takeError();7439ToFoundD = *FoundDOrErr;7440}74417442TemplateArgumentListInfo ToTAInfo;7443TemplateArgumentListInfo *ToResInfo = nullptr;7444if (E->hasExplicitTemplateArgs()) {7445if (Error Err =7446ImportTemplateArgumentListInfo(E->getLAngleLoc(), E->getRAngleLoc(),7447E->template_arguments(), ToTAInfo))7448return std::move(Err);7449ToResInfo = &ToTAInfo;7450}74517452auto *ToE = DeclRefExpr::Create(7453Importer.getToContext(), ToQualifierLoc, ToTemplateKeywordLoc, ToDecl,7454E->refersToEnclosingVariableOrCapture(), ToLocation, ToType,7455E->getValueKind(), ToFoundD, ToResInfo, E->isNonOdrUse());7456if (E->hadMultipleCandidates())7457ToE->setHadMultipleCandidates(true);7458ToE->setIsImmediateEscalating(E->isImmediateEscalating());7459return ToE;7460}74617462ExpectedStmt ASTNodeImporter::VisitImplicitValueInitExpr(ImplicitValueInitExpr *E) {7463ExpectedType TypeOrErr = import(E->getType());7464if (!TypeOrErr)7465return TypeOrErr.takeError();74667467return new (Importer.getToContext()) ImplicitValueInitExpr(*TypeOrErr);7468}74697470ExpectedStmt ASTNodeImporter::VisitDesignatedInitExpr(DesignatedInitExpr *E) {7471ExpectedExpr ToInitOrErr = import(E->getInit());7472if (!ToInitOrErr)7473return ToInitOrErr.takeError();74747475ExpectedSLoc ToEqualOrColonLocOrErr = import(E->getEqualOrColonLoc());7476if (!ToEqualOrColonLocOrErr)7477return ToEqualOrColonLocOrErr.takeError();74787479SmallVector<Expr *, 4> ToIndexExprs(E->getNumSubExprs() - 1);7480// List elements from the second, the first is Init itself7481for (unsigned I = 1, N = E->getNumSubExprs(); I < N; I++) {7482if (ExpectedExpr ToArgOrErr = import(E->getSubExpr(I)))7483ToIndexExprs[I - 1] = *ToArgOrErr;7484else7485return ToArgOrErr.takeError();7486}74877488SmallVector<Designator, 4> ToDesignators(E->size());7489if (Error Err = ImportContainerChecked(E->designators(), ToDesignators))7490return std::move(Err);74917492return DesignatedInitExpr::Create(7493Importer.getToContext(), ToDesignators,7494ToIndexExprs, *ToEqualOrColonLocOrErr,7495E->usesGNUSyntax(), *ToInitOrErr);7496}74977498ExpectedStmt7499ASTNodeImporter::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E) {7500ExpectedType ToTypeOrErr = import(E->getType());7501if (!ToTypeOrErr)7502return ToTypeOrErr.takeError();75037504ExpectedSLoc ToLocationOrErr = import(E->getLocation());7505if (!ToLocationOrErr)7506return ToLocationOrErr.takeError();75077508return new (Importer.getToContext()) CXXNullPtrLiteralExpr(7509*ToTypeOrErr, *ToLocationOrErr);7510}75117512ExpectedStmt ASTNodeImporter::VisitIntegerLiteral(IntegerLiteral *E) {7513ExpectedType ToTypeOrErr = import(E->getType());7514if (!ToTypeOrErr)7515return ToTypeOrErr.takeError();75167517ExpectedSLoc ToLocationOrErr = import(E->getLocation());7518if (!ToLocationOrErr)7519return ToLocationOrErr.takeError();75207521return IntegerLiteral::Create(7522Importer.getToContext(), E->getValue(), *ToTypeOrErr, *ToLocationOrErr);7523}752475257526ExpectedStmt ASTNodeImporter::VisitFloatingLiteral(FloatingLiteral *E) {7527ExpectedType ToTypeOrErr = import(E->getType());7528if (!ToTypeOrErr)7529return ToTypeOrErr.takeError();75307531ExpectedSLoc ToLocationOrErr = import(E->getLocation());7532if (!ToLocationOrErr)7533return ToLocationOrErr.takeError();75347535return FloatingLiteral::Create(7536Importer.getToContext(), E->getValue(), E->isExact(),7537*ToTypeOrErr, *ToLocationOrErr);7538}75397540ExpectedStmt ASTNodeImporter::VisitImaginaryLiteral(ImaginaryLiteral *E) {7541auto ToTypeOrErr = import(E->getType());7542if (!ToTypeOrErr)7543return ToTypeOrErr.takeError();75447545ExpectedExpr ToSubExprOrErr = import(E->getSubExpr());7546if (!ToSubExprOrErr)7547return ToSubExprOrErr.takeError();75487549return new (Importer.getToContext()) ImaginaryLiteral(7550*ToSubExprOrErr, *ToTypeOrErr);7551}75527553ExpectedStmt ASTNodeImporter::VisitFixedPointLiteral(FixedPointLiteral *E) {7554auto ToTypeOrErr = import(E->getType());7555if (!ToTypeOrErr)7556return ToTypeOrErr.takeError();75577558ExpectedSLoc ToLocationOrErr = import(E->getLocation());7559if (!ToLocationOrErr)7560return ToLocationOrErr.takeError();75617562return new (Importer.getToContext()) FixedPointLiteral(7563Importer.getToContext(), E->getValue(), *ToTypeOrErr, *ToLocationOrErr,7564Importer.getToContext().getFixedPointScale(*ToTypeOrErr));7565}75667567ExpectedStmt ASTNodeImporter::VisitCharacterLiteral(CharacterLiteral *E) {7568ExpectedType ToTypeOrErr = import(E->getType());7569if (!ToTypeOrErr)7570return ToTypeOrErr.takeError();75717572ExpectedSLoc ToLocationOrErr = import(E->getLocation());7573if (!ToLocationOrErr)7574return ToLocationOrErr.takeError();75757576return new (Importer.getToContext()) CharacterLiteral(7577E->getValue(), E->getKind(), *ToTypeOrErr, *ToLocationOrErr);7578}75797580ExpectedStmt ASTNodeImporter::VisitStringLiteral(StringLiteral *E) {7581ExpectedType ToTypeOrErr = import(E->getType());7582if (!ToTypeOrErr)7583return ToTypeOrErr.takeError();75847585SmallVector<SourceLocation, 4> ToLocations(E->getNumConcatenated());7586if (Error Err = ImportArrayChecked(7587E->tokloc_begin(), E->tokloc_end(), ToLocations.begin()))7588return std::move(Err);75897590return StringLiteral::Create(7591Importer.getToContext(), E->getBytes(), E->getKind(), E->isPascal(),7592*ToTypeOrErr, ToLocations.data(), ToLocations.size());7593}75947595ExpectedStmt ASTNodeImporter::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {75967597Error Err = Error::success();7598auto ToLParenLoc = importChecked(Err, E->getLParenLoc());7599auto ToTypeSourceInfo = importChecked(Err, E->getTypeSourceInfo());7600auto ToType = importChecked(Err, E->getType());7601auto ToInitializer = importChecked(Err, E->getInitializer());7602if (Err)7603return std::move(Err);76047605return new (Importer.getToContext()) CompoundLiteralExpr(7606ToLParenLoc, ToTypeSourceInfo, ToType, E->getValueKind(),7607ToInitializer, E->isFileScope());7608}76097610ExpectedStmt ASTNodeImporter::VisitAtomicExpr(AtomicExpr *E) {76117612Error Err = Error::success();7613auto ToBuiltinLoc = importChecked(Err, E->getBuiltinLoc());7614auto ToType = importChecked(Err, E->getType());7615auto ToRParenLoc = importChecked(Err, E->getRParenLoc());7616if (Err)7617return std::move(Err);76187619SmallVector<Expr *, 6> ToExprs(E->getNumSubExprs());7620if (Error Err = ImportArrayChecked(7621E->getSubExprs(), E->getSubExprs() + E->getNumSubExprs(),7622ToExprs.begin()))7623return std::move(Err);76247625return new (Importer.getToContext()) AtomicExpr(76267627ToBuiltinLoc, ToExprs, ToType, E->getOp(), ToRParenLoc);7628}76297630ExpectedStmt ASTNodeImporter::VisitAddrLabelExpr(AddrLabelExpr *E) {7631Error Err = Error::success();7632auto ToAmpAmpLoc = importChecked(Err, E->getAmpAmpLoc());7633auto ToLabelLoc = importChecked(Err, E->getLabelLoc());7634auto ToLabel = importChecked(Err, E->getLabel());7635auto ToType = importChecked(Err, E->getType());7636if (Err)7637return std::move(Err);76387639return new (Importer.getToContext()) AddrLabelExpr(7640ToAmpAmpLoc, ToLabelLoc, ToLabel, ToType);7641}7642ExpectedStmt ASTNodeImporter::VisitConstantExpr(ConstantExpr *E) {7643Error Err = Error::success();7644auto ToSubExpr = importChecked(Err, E->getSubExpr());7645auto ToResult = importChecked(Err, E->getAPValueResult());7646if (Err)7647return std::move(Err);76487649return ConstantExpr::Create(Importer.getToContext(), ToSubExpr, ToResult);7650}7651ExpectedStmt ASTNodeImporter::VisitParenExpr(ParenExpr *E) {7652Error Err = Error::success();7653auto ToLParen = importChecked(Err, E->getLParen());7654auto ToRParen = importChecked(Err, E->getRParen());7655auto ToSubExpr = importChecked(Err, E->getSubExpr());7656if (Err)7657return std::move(Err);76587659return new (Importer.getToContext())7660ParenExpr(ToLParen, ToRParen, ToSubExpr);7661}76627663ExpectedStmt ASTNodeImporter::VisitParenListExpr(ParenListExpr *E) {7664SmallVector<Expr *, 4> ToExprs(E->getNumExprs());7665if (Error Err = ImportContainerChecked(E->exprs(), ToExprs))7666return std::move(Err);76677668ExpectedSLoc ToLParenLocOrErr = import(E->getLParenLoc());7669if (!ToLParenLocOrErr)7670return ToLParenLocOrErr.takeError();76717672ExpectedSLoc ToRParenLocOrErr = import(E->getRParenLoc());7673if (!ToRParenLocOrErr)7674return ToRParenLocOrErr.takeError();76757676return ParenListExpr::Create(Importer.getToContext(), *ToLParenLocOrErr,7677ToExprs, *ToRParenLocOrErr);7678}76797680ExpectedStmt ASTNodeImporter::VisitStmtExpr(StmtExpr *E) {7681Error Err = Error::success();7682auto ToSubStmt = importChecked(Err, E->getSubStmt());7683auto ToType = importChecked(Err, E->getType());7684auto ToLParenLoc = importChecked(Err, E->getLParenLoc());7685auto ToRParenLoc = importChecked(Err, E->getRParenLoc());7686if (Err)7687return std::move(Err);76887689return new (Importer.getToContext())7690StmtExpr(ToSubStmt, ToType, ToLParenLoc, ToRParenLoc,7691E->getTemplateDepth());7692}76937694ExpectedStmt ASTNodeImporter::VisitUnaryOperator(UnaryOperator *E) {7695Error Err = Error::success();7696auto ToSubExpr = importChecked(Err, E->getSubExpr());7697auto ToType = importChecked(Err, E->getType());7698auto ToOperatorLoc = importChecked(Err, E->getOperatorLoc());7699if (Err)7700return std::move(Err);77017702auto *UO = UnaryOperator::CreateEmpty(Importer.getToContext(),7703E->hasStoredFPFeatures());7704UO->setType(ToType);7705UO->setSubExpr(ToSubExpr);7706UO->setOpcode(E->getOpcode());7707UO->setOperatorLoc(ToOperatorLoc);7708UO->setCanOverflow(E->canOverflow());7709if (E->hasStoredFPFeatures())7710UO->setStoredFPFeatures(E->getStoredFPFeatures());77117712return UO;7713}77147715ExpectedStmt77167717ASTNodeImporter::VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *E) {7718Error Err = Error::success();7719auto ToType = importChecked(Err, E->getType());7720auto ToOperatorLoc = importChecked(Err, E->getOperatorLoc());7721auto ToRParenLoc = importChecked(Err, E->getRParenLoc());7722if (Err)7723return std::move(Err);77247725if (E->isArgumentType()) {7726Expected<TypeSourceInfo *> ToArgumentTypeInfoOrErr =7727import(E->getArgumentTypeInfo());7728if (!ToArgumentTypeInfoOrErr)7729return ToArgumentTypeInfoOrErr.takeError();77307731return new (Importer.getToContext()) UnaryExprOrTypeTraitExpr(7732E->getKind(), *ToArgumentTypeInfoOrErr, ToType, ToOperatorLoc,7733ToRParenLoc);7734}77357736ExpectedExpr ToArgumentExprOrErr = import(E->getArgumentExpr());7737if (!ToArgumentExprOrErr)7738return ToArgumentExprOrErr.takeError();77397740return new (Importer.getToContext()) UnaryExprOrTypeTraitExpr(7741E->getKind(), *ToArgumentExprOrErr, ToType, ToOperatorLoc, ToRParenLoc);7742}77437744ExpectedStmt ASTNodeImporter::VisitBinaryOperator(BinaryOperator *E) {7745Error Err = Error::success();7746auto ToLHS = importChecked(Err, E->getLHS());7747auto ToRHS = importChecked(Err, E->getRHS());7748auto ToType = importChecked(Err, E->getType());7749auto ToOperatorLoc = importChecked(Err, E->getOperatorLoc());7750if (Err)7751return std::move(Err);77527753return BinaryOperator::Create(7754Importer.getToContext(), ToLHS, ToRHS, E->getOpcode(), ToType,7755E->getValueKind(), E->getObjectKind(), ToOperatorLoc,7756E->getFPFeatures());7757}77587759ExpectedStmt ASTNodeImporter::VisitConditionalOperator(ConditionalOperator *E) {7760Error Err = Error::success();7761auto ToCond = importChecked(Err, E->getCond());7762auto ToQuestionLoc = importChecked(Err, E->getQuestionLoc());7763auto ToLHS = importChecked(Err, E->getLHS());7764auto ToColonLoc = importChecked(Err, E->getColonLoc());7765auto ToRHS = importChecked(Err, E->getRHS());7766auto ToType = importChecked(Err, E->getType());7767if (Err)7768return std::move(Err);77697770return new (Importer.getToContext()) ConditionalOperator(7771ToCond, ToQuestionLoc, ToLHS, ToColonLoc, ToRHS, ToType,7772E->getValueKind(), E->getObjectKind());7773}77747775ExpectedStmt7776ASTNodeImporter::VisitBinaryConditionalOperator(BinaryConditionalOperator *E) {7777Error Err = Error::success();7778auto ToCommon = importChecked(Err, E->getCommon());7779auto ToOpaqueValue = importChecked(Err, E->getOpaqueValue());7780auto ToCond = importChecked(Err, E->getCond());7781auto ToTrueExpr = importChecked(Err, E->getTrueExpr());7782auto ToFalseExpr = importChecked(Err, E->getFalseExpr());7783auto ToQuestionLoc = importChecked(Err, E->getQuestionLoc());7784auto ToColonLoc = importChecked(Err, E->getColonLoc());7785auto ToType = importChecked(Err, E->getType());7786if (Err)7787return std::move(Err);77887789return new (Importer.getToContext()) BinaryConditionalOperator(7790ToCommon, ToOpaqueValue, ToCond, ToTrueExpr, ToFalseExpr,7791ToQuestionLoc, ToColonLoc, ToType, E->getValueKind(),7792E->getObjectKind());7793}77947795ExpectedStmt ASTNodeImporter::VisitCXXRewrittenBinaryOperator(7796CXXRewrittenBinaryOperator *E) {7797Error Err = Error::success();7798auto ToSemanticForm = importChecked(Err, E->getSemanticForm());7799if (Err)7800return std::move(Err);78017802return new (Importer.getToContext())7803CXXRewrittenBinaryOperator(ToSemanticForm, E->isReversed());7804}78057806ExpectedStmt ASTNodeImporter::VisitArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {7807Error Err = Error::success();7808auto ToBeginLoc = importChecked(Err, E->getBeginLoc());7809auto ToQueriedTypeSourceInfo =7810importChecked(Err, E->getQueriedTypeSourceInfo());7811auto ToDimensionExpression = importChecked(Err, E->getDimensionExpression());7812auto ToEndLoc = importChecked(Err, E->getEndLoc());7813auto ToType = importChecked(Err, E->getType());7814if (Err)7815return std::move(Err);78167817return new (Importer.getToContext()) ArrayTypeTraitExpr(7818ToBeginLoc, E->getTrait(), ToQueriedTypeSourceInfo, E->getValue(),7819ToDimensionExpression, ToEndLoc, ToType);7820}78217822ExpectedStmt ASTNodeImporter::VisitExpressionTraitExpr(ExpressionTraitExpr *E) {7823Error Err = Error::success();7824auto ToBeginLoc = importChecked(Err, E->getBeginLoc());7825auto ToQueriedExpression = importChecked(Err, E->getQueriedExpression());7826auto ToEndLoc = importChecked(Err, E->getEndLoc());7827auto ToType = importChecked(Err, E->getType());7828if (Err)7829return std::move(Err);78307831return new (Importer.getToContext()) ExpressionTraitExpr(7832ToBeginLoc, E->getTrait(), ToQueriedExpression, E->getValue(),7833ToEndLoc, ToType);7834}78357836ExpectedStmt ASTNodeImporter::VisitOpaqueValueExpr(OpaqueValueExpr *E) {7837Error Err = Error::success();7838auto ToLocation = importChecked(Err, E->getLocation());7839auto ToType = importChecked(Err, E->getType());7840auto ToSourceExpr = importChecked(Err, E->getSourceExpr());7841if (Err)7842return std::move(Err);78437844return new (Importer.getToContext()) OpaqueValueExpr(7845ToLocation, ToType, E->getValueKind(), E->getObjectKind(), ToSourceExpr);7846}78477848ExpectedStmt ASTNodeImporter::VisitArraySubscriptExpr(ArraySubscriptExpr *E) {7849Error Err = Error::success();7850auto ToLHS = importChecked(Err, E->getLHS());7851auto ToRHS = importChecked(Err, E->getRHS());7852auto ToType = importChecked(Err, E->getType());7853auto ToRBracketLoc = importChecked(Err, E->getRBracketLoc());7854if (Err)7855return std::move(Err);78567857return new (Importer.getToContext()) ArraySubscriptExpr(7858ToLHS, ToRHS, ToType, E->getValueKind(), E->getObjectKind(),7859ToRBracketLoc);7860}78617862ExpectedStmt7863ASTNodeImporter::VisitCompoundAssignOperator(CompoundAssignOperator *E) {7864Error Err = Error::success();7865auto ToLHS = importChecked(Err, E->getLHS());7866auto ToRHS = importChecked(Err, E->getRHS());7867auto ToType = importChecked(Err, E->getType());7868auto ToComputationLHSType = importChecked(Err, E->getComputationLHSType());7869auto ToComputationResultType =7870importChecked(Err, E->getComputationResultType());7871auto ToOperatorLoc = importChecked(Err, E->getOperatorLoc());7872if (Err)7873return std::move(Err);78747875return CompoundAssignOperator::Create(7876Importer.getToContext(), ToLHS, ToRHS, E->getOpcode(), ToType,7877E->getValueKind(), E->getObjectKind(), ToOperatorLoc,7878E->getFPFeatures(),7879ToComputationLHSType, ToComputationResultType);7880}78817882Expected<CXXCastPath>7883ASTNodeImporter::ImportCastPath(CastExpr *CE) {7884CXXCastPath Path;7885for (auto I = CE->path_begin(), E = CE->path_end(); I != E; ++I) {7886if (auto SpecOrErr = import(*I))7887Path.push_back(*SpecOrErr);7888else7889return SpecOrErr.takeError();7890}7891return Path;7892}78937894ExpectedStmt ASTNodeImporter::VisitImplicitCastExpr(ImplicitCastExpr *E) {7895ExpectedType ToTypeOrErr = import(E->getType());7896if (!ToTypeOrErr)7897return ToTypeOrErr.takeError();78987899ExpectedExpr ToSubExprOrErr = import(E->getSubExpr());7900if (!ToSubExprOrErr)7901return ToSubExprOrErr.takeError();79027903Expected<CXXCastPath> ToBasePathOrErr = ImportCastPath(E);7904if (!ToBasePathOrErr)7905return ToBasePathOrErr.takeError();79067907return ImplicitCastExpr::Create(7908Importer.getToContext(), *ToTypeOrErr, E->getCastKind(), *ToSubExprOrErr,7909&(*ToBasePathOrErr), E->getValueKind(), E->getFPFeatures());7910}79117912ExpectedStmt ASTNodeImporter::VisitExplicitCastExpr(ExplicitCastExpr *E) {7913Error Err = Error::success();7914auto ToType = importChecked(Err, E->getType());7915auto ToSubExpr = importChecked(Err, E->getSubExpr());7916auto ToTypeInfoAsWritten = importChecked(Err, E->getTypeInfoAsWritten());7917if (Err)7918return std::move(Err);79197920Expected<CXXCastPath> ToBasePathOrErr = ImportCastPath(E);7921if (!ToBasePathOrErr)7922return ToBasePathOrErr.takeError();7923CXXCastPath *ToBasePath = &(*ToBasePathOrErr);79247925switch (E->getStmtClass()) {7926case Stmt::CStyleCastExprClass: {7927auto *CCE = cast<CStyleCastExpr>(E);7928ExpectedSLoc ToLParenLocOrErr = import(CCE->getLParenLoc());7929if (!ToLParenLocOrErr)7930return ToLParenLocOrErr.takeError();7931ExpectedSLoc ToRParenLocOrErr = import(CCE->getRParenLoc());7932if (!ToRParenLocOrErr)7933return ToRParenLocOrErr.takeError();7934return CStyleCastExpr::Create(7935Importer.getToContext(), ToType, E->getValueKind(), E->getCastKind(),7936ToSubExpr, ToBasePath, CCE->getFPFeatures(), ToTypeInfoAsWritten,7937*ToLParenLocOrErr, *ToRParenLocOrErr);7938}79397940case Stmt::CXXFunctionalCastExprClass: {7941auto *FCE = cast<CXXFunctionalCastExpr>(E);7942ExpectedSLoc ToLParenLocOrErr = import(FCE->getLParenLoc());7943if (!ToLParenLocOrErr)7944return ToLParenLocOrErr.takeError();7945ExpectedSLoc ToRParenLocOrErr = import(FCE->getRParenLoc());7946if (!ToRParenLocOrErr)7947return ToRParenLocOrErr.takeError();7948return CXXFunctionalCastExpr::Create(7949Importer.getToContext(), ToType, E->getValueKind(), ToTypeInfoAsWritten,7950E->getCastKind(), ToSubExpr, ToBasePath, FCE->getFPFeatures(),7951*ToLParenLocOrErr, *ToRParenLocOrErr);7952}79537954case Stmt::ObjCBridgedCastExprClass: {7955auto *OCE = cast<ObjCBridgedCastExpr>(E);7956ExpectedSLoc ToLParenLocOrErr = import(OCE->getLParenLoc());7957if (!ToLParenLocOrErr)7958return ToLParenLocOrErr.takeError();7959ExpectedSLoc ToBridgeKeywordLocOrErr = import(OCE->getBridgeKeywordLoc());7960if (!ToBridgeKeywordLocOrErr)7961return ToBridgeKeywordLocOrErr.takeError();7962return new (Importer.getToContext()) ObjCBridgedCastExpr(7963*ToLParenLocOrErr, OCE->getBridgeKind(), E->getCastKind(),7964*ToBridgeKeywordLocOrErr, ToTypeInfoAsWritten, ToSubExpr);7965}7966case Stmt::BuiltinBitCastExprClass: {7967auto *BBC = cast<BuiltinBitCastExpr>(E);7968ExpectedSLoc ToKWLocOrErr = import(BBC->getBeginLoc());7969if (!ToKWLocOrErr)7970return ToKWLocOrErr.takeError();7971ExpectedSLoc ToRParenLocOrErr = import(BBC->getEndLoc());7972if (!ToRParenLocOrErr)7973return ToRParenLocOrErr.takeError();7974return new (Importer.getToContext()) BuiltinBitCastExpr(7975ToType, E->getValueKind(), E->getCastKind(), ToSubExpr,7976ToTypeInfoAsWritten, *ToKWLocOrErr, *ToRParenLocOrErr);7977}7978default:7979llvm_unreachable("Cast expression of unsupported type!");7980return make_error<ASTImportError>(ASTImportError::UnsupportedConstruct);7981}7982}79837984ExpectedStmt ASTNodeImporter::VisitOffsetOfExpr(OffsetOfExpr *E) {7985SmallVector<OffsetOfNode, 4> ToNodes;7986for (int I = 0, N = E->getNumComponents(); I < N; ++I) {7987const OffsetOfNode &FromNode = E->getComponent(I);79887989SourceLocation ToBeginLoc, ToEndLoc;79907991if (FromNode.getKind() != OffsetOfNode::Base) {7992Error Err = Error::success();7993ToBeginLoc = importChecked(Err, FromNode.getBeginLoc());7994ToEndLoc = importChecked(Err, FromNode.getEndLoc());7995if (Err)7996return std::move(Err);7997}79987999switch (FromNode.getKind()) {8000case OffsetOfNode::Array:8001ToNodes.push_back(8002OffsetOfNode(ToBeginLoc, FromNode.getArrayExprIndex(), ToEndLoc));8003break;8004case OffsetOfNode::Base: {8005auto ToBSOrErr = import(FromNode.getBase());8006if (!ToBSOrErr)8007return ToBSOrErr.takeError();8008ToNodes.push_back(OffsetOfNode(*ToBSOrErr));8009break;8010}8011case OffsetOfNode::Field: {8012auto ToFieldOrErr = import(FromNode.getField());8013if (!ToFieldOrErr)8014return ToFieldOrErr.takeError();8015ToNodes.push_back(OffsetOfNode(ToBeginLoc, *ToFieldOrErr, ToEndLoc));8016break;8017}8018case OffsetOfNode::Identifier: {8019IdentifierInfo *ToII = Importer.Import(FromNode.getFieldName());8020ToNodes.push_back(OffsetOfNode(ToBeginLoc, ToII, ToEndLoc));8021break;8022}8023}8024}80258026SmallVector<Expr *, 4> ToExprs(E->getNumExpressions());8027for (int I = 0, N = E->getNumExpressions(); I < N; ++I) {8028ExpectedExpr ToIndexExprOrErr = import(E->getIndexExpr(I));8029if (!ToIndexExprOrErr)8030return ToIndexExprOrErr.takeError();8031ToExprs[I] = *ToIndexExprOrErr;8032}80338034Error Err = Error::success();8035auto ToType = importChecked(Err, E->getType());8036auto ToTypeSourceInfo = importChecked(Err, E->getTypeSourceInfo());8037auto ToOperatorLoc = importChecked(Err, E->getOperatorLoc());8038auto ToRParenLoc = importChecked(Err, E->getRParenLoc());8039if (Err)8040return std::move(Err);80418042return OffsetOfExpr::Create(8043Importer.getToContext(), ToType, ToOperatorLoc, ToTypeSourceInfo, ToNodes,8044ToExprs, ToRParenLoc);8045}80468047ExpectedStmt ASTNodeImporter::VisitCXXNoexceptExpr(CXXNoexceptExpr *E) {8048Error Err = Error::success();8049auto ToType = importChecked(Err, E->getType());8050auto ToOperand = importChecked(Err, E->getOperand());8051auto ToBeginLoc = importChecked(Err, E->getBeginLoc());8052auto ToEndLoc = importChecked(Err, E->getEndLoc());8053if (Err)8054return std::move(Err);80558056CanThrowResult ToCanThrow;8057if (E->isValueDependent())8058ToCanThrow = CT_Dependent;8059else8060ToCanThrow = E->getValue() ? CT_Can : CT_Cannot;80618062return new (Importer.getToContext()) CXXNoexceptExpr(8063ToType, ToOperand, ToCanThrow, ToBeginLoc, ToEndLoc);8064}80658066ExpectedStmt ASTNodeImporter::VisitCXXThrowExpr(CXXThrowExpr *E) {8067Error Err = Error::success();8068auto ToSubExpr = importChecked(Err, E->getSubExpr());8069auto ToType = importChecked(Err, E->getType());8070auto ToThrowLoc = importChecked(Err, E->getThrowLoc());8071if (Err)8072return std::move(Err);80738074return new (Importer.getToContext()) CXXThrowExpr(8075ToSubExpr, ToType, ToThrowLoc, E->isThrownVariableInScope());8076}80778078ExpectedStmt ASTNodeImporter::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E) {8079ExpectedSLoc ToUsedLocOrErr = import(E->getUsedLocation());8080if (!ToUsedLocOrErr)8081return ToUsedLocOrErr.takeError();80828083auto ToParamOrErr = import(E->getParam());8084if (!ToParamOrErr)8085return ToParamOrErr.takeError();80868087auto UsedContextOrErr = Importer.ImportContext(E->getUsedContext());8088if (!UsedContextOrErr)8089return UsedContextOrErr.takeError();80908091// Import the default arg if it was not imported yet.8092// This is needed because it can happen that during the import of the8093// default expression (from VisitParmVarDecl) the same ParmVarDecl is8094// encountered here. The default argument for a ParmVarDecl is set in the8095// ParmVarDecl only after it is imported (set in VisitParmVarDecl if not here,8096// see VisitParmVarDecl).8097ParmVarDecl *ToParam = *ToParamOrErr;8098if (!ToParam->getDefaultArg()) {8099std::optional<ParmVarDecl *> FromParam =8100Importer.getImportedFromDecl(ToParam);8101assert(FromParam && "ParmVarDecl was not imported?");81028103if (Error Err = ImportDefaultArgOfParmVarDecl(*FromParam, ToParam))8104return std::move(Err);8105}8106Expr *RewrittenInit = nullptr;8107if (E->hasRewrittenInit()) {8108ExpectedExpr ExprOrErr = import(E->getRewrittenExpr());8109if (!ExprOrErr)8110return ExprOrErr.takeError();8111RewrittenInit = ExprOrErr.get();8112}8113return CXXDefaultArgExpr::Create(Importer.getToContext(), *ToUsedLocOrErr,8114*ToParamOrErr, RewrittenInit,8115*UsedContextOrErr);8116}81178118ExpectedStmt8119ASTNodeImporter::VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E) {8120Error Err = Error::success();8121auto ToType = importChecked(Err, E->getType());8122auto ToTypeSourceInfo = importChecked(Err, E->getTypeSourceInfo());8123auto ToRParenLoc = importChecked(Err, E->getRParenLoc());8124if (Err)8125return std::move(Err);81268127return new (Importer.getToContext()) CXXScalarValueInitExpr(8128ToType, ToTypeSourceInfo, ToRParenLoc);8129}81308131ExpectedStmt8132ASTNodeImporter::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {8133ExpectedExpr ToSubExprOrErr = import(E->getSubExpr());8134if (!ToSubExprOrErr)8135return ToSubExprOrErr.takeError();81368137auto ToDtorOrErr = import(E->getTemporary()->getDestructor());8138if (!ToDtorOrErr)8139return ToDtorOrErr.takeError();81408141ASTContext &ToCtx = Importer.getToContext();8142CXXTemporary *Temp = CXXTemporary::Create(ToCtx, *ToDtorOrErr);8143return CXXBindTemporaryExpr::Create(ToCtx, Temp, *ToSubExprOrErr);8144}81458146ExpectedStmt81478148ASTNodeImporter::VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E) {8149Error Err = Error::success();8150auto ToConstructor = importChecked(Err, E->getConstructor());8151auto ToType = importChecked(Err, E->getType());8152auto ToTypeSourceInfo = importChecked(Err, E->getTypeSourceInfo());8153auto ToParenOrBraceRange = importChecked(Err, E->getParenOrBraceRange());8154if (Err)8155return std::move(Err);81568157SmallVector<Expr *, 8> ToArgs(E->getNumArgs());8158if (Error Err = ImportContainerChecked(E->arguments(), ToArgs))8159return std::move(Err);81608161return CXXTemporaryObjectExpr::Create(8162Importer.getToContext(), ToConstructor, ToType, ToTypeSourceInfo, ToArgs,8163ToParenOrBraceRange, E->hadMultipleCandidates(),8164E->isListInitialization(), E->isStdInitListInitialization(),8165E->requiresZeroInitialization());8166}81678168ExpectedDecl ASTNodeImporter::VisitLifetimeExtendedTemporaryDecl(8169LifetimeExtendedTemporaryDecl *D) {8170DeclContext *DC, *LexicalDC;8171if (Error Err = ImportDeclContext(D, DC, LexicalDC))8172return std::move(Err);81738174Error Err = Error::success();8175auto Temporary = importChecked(Err, D->getTemporaryExpr());8176auto ExtendingDecl = importChecked(Err, D->getExtendingDecl());8177if (Err)8178return std::move(Err);8179// FIXME: Should ManglingNumber get numbers associated with 'to' context?81808181LifetimeExtendedTemporaryDecl *To;8182if (GetImportedOrCreateDecl(To, D, Temporary, ExtendingDecl,8183D->getManglingNumber()))8184return To;81858186To->setLexicalDeclContext(LexicalDC);8187LexicalDC->addDeclInternal(To);8188return To;8189}81908191ExpectedStmt8192ASTNodeImporter::VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *E) {8193Error Err = Error::success();8194auto ToType = importChecked(Err, E->getType());8195Expr *ToTemporaryExpr = importChecked(8196Err, E->getLifetimeExtendedTemporaryDecl() ? nullptr : E->getSubExpr());8197auto ToMaterializedDecl =8198importChecked(Err, E->getLifetimeExtendedTemporaryDecl());8199if (Err)8200return std::move(Err);82018202if (!ToTemporaryExpr)8203ToTemporaryExpr = cast<Expr>(ToMaterializedDecl->getTemporaryExpr());82048205auto *ToMTE = new (Importer.getToContext()) MaterializeTemporaryExpr(8206ToType, ToTemporaryExpr, E->isBoundToLvalueReference(),8207ToMaterializedDecl);82088209return ToMTE;8210}82118212ExpectedStmt ASTNodeImporter::VisitPackExpansionExpr(PackExpansionExpr *E) {8213Error Err = Error::success();8214auto ToType = importChecked(Err, E->getType());8215auto ToPattern = importChecked(Err, E->getPattern());8216auto ToEllipsisLoc = importChecked(Err, E->getEllipsisLoc());8217if (Err)8218return std::move(Err);82198220return new (Importer.getToContext()) PackExpansionExpr(8221ToType, ToPattern, ToEllipsisLoc, E->getNumExpansions());8222}82238224ExpectedStmt ASTNodeImporter::VisitSizeOfPackExpr(SizeOfPackExpr *E) {8225Error Err = Error::success();8226auto ToOperatorLoc = importChecked(Err, E->getOperatorLoc());8227auto ToPack = importChecked(Err, E->getPack());8228auto ToPackLoc = importChecked(Err, E->getPackLoc());8229auto ToRParenLoc = importChecked(Err, E->getRParenLoc());8230if (Err)8231return std::move(Err);82328233std::optional<unsigned> Length;8234if (!E->isValueDependent())8235Length = E->getPackLength();82368237SmallVector<TemplateArgument, 8> ToPartialArguments;8238if (E->isPartiallySubstituted()) {8239if (Error Err = ImportTemplateArguments(E->getPartialArguments(),8240ToPartialArguments))8241return std::move(Err);8242}82438244return SizeOfPackExpr::Create(8245Importer.getToContext(), ToOperatorLoc, ToPack, ToPackLoc, ToRParenLoc,8246Length, ToPartialArguments);8247}824882498250ExpectedStmt ASTNodeImporter::VisitCXXNewExpr(CXXNewExpr *E) {8251Error Err = Error::success();8252auto ToOperatorNew = importChecked(Err, E->getOperatorNew());8253auto ToOperatorDelete = importChecked(Err, E->getOperatorDelete());8254auto ToTypeIdParens = importChecked(Err, E->getTypeIdParens());8255auto ToArraySize = importChecked(Err, E->getArraySize());8256auto ToInitializer = importChecked(Err, E->getInitializer());8257auto ToType = importChecked(Err, E->getType());8258auto ToAllocatedTypeSourceInfo =8259importChecked(Err, E->getAllocatedTypeSourceInfo());8260auto ToSourceRange = importChecked(Err, E->getSourceRange());8261auto ToDirectInitRange = importChecked(Err, E->getDirectInitRange());8262if (Err)8263return std::move(Err);82648265SmallVector<Expr *, 4> ToPlacementArgs(E->getNumPlacementArgs());8266if (Error Err =8267ImportContainerChecked(E->placement_arguments(), ToPlacementArgs))8268return std::move(Err);82698270return CXXNewExpr::Create(8271Importer.getToContext(), E->isGlobalNew(), ToOperatorNew,8272ToOperatorDelete, E->passAlignment(), E->doesUsualArrayDeleteWantSize(),8273ToPlacementArgs, ToTypeIdParens, ToArraySize, E->getInitializationStyle(),8274ToInitializer, ToType, ToAllocatedTypeSourceInfo, ToSourceRange,8275ToDirectInitRange);8276}82778278ExpectedStmt ASTNodeImporter::VisitCXXDeleteExpr(CXXDeleteExpr *E) {8279Error Err = Error::success();8280auto ToType = importChecked(Err, E->getType());8281auto ToOperatorDelete = importChecked(Err, E->getOperatorDelete());8282auto ToArgument = importChecked(Err, E->getArgument());8283auto ToBeginLoc = importChecked(Err, E->getBeginLoc());8284if (Err)8285return std::move(Err);82868287return new (Importer.getToContext()) CXXDeleteExpr(8288ToType, E->isGlobalDelete(), E->isArrayForm(), E->isArrayFormAsWritten(),8289E->doesUsualArrayDeleteWantSize(), ToOperatorDelete, ToArgument,8290ToBeginLoc);8291}82928293ExpectedStmt ASTNodeImporter::VisitCXXConstructExpr(CXXConstructExpr *E) {8294Error Err = Error::success();8295auto ToType = importChecked(Err, E->getType());8296auto ToLocation = importChecked(Err, E->getLocation());8297auto ToConstructor = importChecked(Err, E->getConstructor());8298auto ToParenOrBraceRange = importChecked(Err, E->getParenOrBraceRange());8299if (Err)8300return std::move(Err);83018302SmallVector<Expr *, 6> ToArgs(E->getNumArgs());8303if (Error Err = ImportContainerChecked(E->arguments(), ToArgs))8304return std::move(Err);83058306CXXConstructExpr *ToE = CXXConstructExpr::Create(8307Importer.getToContext(), ToType, ToLocation, ToConstructor,8308E->isElidable(), ToArgs, E->hadMultipleCandidates(),8309E->isListInitialization(), E->isStdInitListInitialization(),8310E->requiresZeroInitialization(), E->getConstructionKind(),8311ToParenOrBraceRange);8312ToE->setIsImmediateEscalating(E->isImmediateEscalating());8313return ToE;8314}83158316ExpectedStmt ASTNodeImporter::VisitExprWithCleanups(ExprWithCleanups *E) {8317ExpectedExpr ToSubExprOrErr = import(E->getSubExpr());8318if (!ToSubExprOrErr)8319return ToSubExprOrErr.takeError();83208321SmallVector<ExprWithCleanups::CleanupObject, 8> ToObjects(E->getNumObjects());8322if (Error Err = ImportContainerChecked(E->getObjects(), ToObjects))8323return std::move(Err);83248325return ExprWithCleanups::Create(8326Importer.getToContext(), *ToSubExprOrErr, E->cleanupsHaveSideEffects(),8327ToObjects);8328}83298330ExpectedStmt ASTNodeImporter::VisitCXXMemberCallExpr(CXXMemberCallExpr *E) {8331Error Err = Error::success();8332auto ToCallee = importChecked(Err, E->getCallee());8333auto ToType = importChecked(Err, E->getType());8334auto ToRParenLoc = importChecked(Err, E->getRParenLoc());8335if (Err)8336return std::move(Err);83378338SmallVector<Expr *, 4> ToArgs(E->getNumArgs());8339if (Error Err = ImportContainerChecked(E->arguments(), ToArgs))8340return std::move(Err);83418342return CXXMemberCallExpr::Create(Importer.getToContext(), ToCallee, ToArgs,8343ToType, E->getValueKind(), ToRParenLoc,8344E->getFPFeatures());8345}83468347ExpectedStmt ASTNodeImporter::VisitCXXThisExpr(CXXThisExpr *E) {8348ExpectedType ToTypeOrErr = import(E->getType());8349if (!ToTypeOrErr)8350return ToTypeOrErr.takeError();83518352ExpectedSLoc ToLocationOrErr = import(E->getLocation());8353if (!ToLocationOrErr)8354return ToLocationOrErr.takeError();83558356return CXXThisExpr::Create(Importer.getToContext(), *ToLocationOrErr,8357*ToTypeOrErr, E->isImplicit());8358}83598360ExpectedStmt ASTNodeImporter::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {8361ExpectedType ToTypeOrErr = import(E->getType());8362if (!ToTypeOrErr)8363return ToTypeOrErr.takeError();83648365ExpectedSLoc ToLocationOrErr = import(E->getLocation());8366if (!ToLocationOrErr)8367return ToLocationOrErr.takeError();83688369return CXXBoolLiteralExpr::Create(Importer.getToContext(), E->getValue(),8370*ToTypeOrErr, *ToLocationOrErr);8371}83728373ExpectedStmt ASTNodeImporter::VisitMemberExpr(MemberExpr *E) {8374Error Err = Error::success();8375auto ToBase = importChecked(Err, E->getBase());8376auto ToOperatorLoc = importChecked(Err, E->getOperatorLoc());8377auto ToQualifierLoc = importChecked(Err, E->getQualifierLoc());8378auto ToTemplateKeywordLoc = importChecked(Err, E->getTemplateKeywordLoc());8379auto ToMemberDecl = importChecked(Err, E->getMemberDecl());8380auto ToType = importChecked(Err, E->getType());8381auto ToDecl = importChecked(Err, E->getFoundDecl().getDecl());8382auto ToName = importChecked(Err, E->getMemberNameInfo().getName());8383auto ToLoc = importChecked(Err, E->getMemberNameInfo().getLoc());8384if (Err)8385return std::move(Err);83868387DeclAccessPair ToFoundDecl =8388DeclAccessPair::make(ToDecl, E->getFoundDecl().getAccess());83898390DeclarationNameInfo ToMemberNameInfo(ToName, ToLoc);83918392TemplateArgumentListInfo ToTAInfo, *ResInfo = nullptr;8393if (E->hasExplicitTemplateArgs()) {8394if (Error Err =8395ImportTemplateArgumentListInfo(E->getLAngleLoc(), E->getRAngleLoc(),8396E->template_arguments(), ToTAInfo))8397return std::move(Err);8398ResInfo = &ToTAInfo;8399}84008401return MemberExpr::Create(Importer.getToContext(), ToBase, E->isArrow(),8402ToOperatorLoc, ToQualifierLoc, ToTemplateKeywordLoc,8403ToMemberDecl, ToFoundDecl, ToMemberNameInfo,8404ResInfo, ToType, E->getValueKind(),8405E->getObjectKind(), E->isNonOdrUse());8406}84078408ExpectedStmt8409ASTNodeImporter::VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E) {8410Error Err = Error::success();8411auto ToBase = importChecked(Err, E->getBase());8412auto ToOperatorLoc = importChecked(Err, E->getOperatorLoc());8413auto ToQualifierLoc = importChecked(Err, E->getQualifierLoc());8414auto ToScopeTypeInfo = importChecked(Err, E->getScopeTypeInfo());8415auto ToColonColonLoc = importChecked(Err, E->getColonColonLoc());8416auto ToTildeLoc = importChecked(Err, E->getTildeLoc());8417if (Err)8418return std::move(Err);84198420PseudoDestructorTypeStorage Storage;8421if (const IdentifierInfo *FromII = E->getDestroyedTypeIdentifier()) {8422const IdentifierInfo *ToII = Importer.Import(FromII);8423ExpectedSLoc ToDestroyedTypeLocOrErr = import(E->getDestroyedTypeLoc());8424if (!ToDestroyedTypeLocOrErr)8425return ToDestroyedTypeLocOrErr.takeError();8426Storage = PseudoDestructorTypeStorage(ToII, *ToDestroyedTypeLocOrErr);8427} else {8428if (auto ToTIOrErr = import(E->getDestroyedTypeInfo()))8429Storage = PseudoDestructorTypeStorage(*ToTIOrErr);8430else8431return ToTIOrErr.takeError();8432}84338434return new (Importer.getToContext()) CXXPseudoDestructorExpr(8435Importer.getToContext(), ToBase, E->isArrow(), ToOperatorLoc,8436ToQualifierLoc, ToScopeTypeInfo, ToColonColonLoc, ToTildeLoc, Storage);8437}84388439ExpectedStmt ASTNodeImporter::VisitCXXDependentScopeMemberExpr(8440CXXDependentScopeMemberExpr *E) {8441Error Err = Error::success();8442auto ToType = importChecked(Err, E->getType());8443auto ToOperatorLoc = importChecked(Err, E->getOperatorLoc());8444auto ToQualifierLoc = importChecked(Err, E->getQualifierLoc());8445auto ToTemplateKeywordLoc = importChecked(Err, E->getTemplateKeywordLoc());8446auto ToFirstQualifierFoundInScope =8447importChecked(Err, E->getFirstQualifierFoundInScope());8448if (Err)8449return std::move(Err);84508451Expr *ToBase = nullptr;8452if (!E->isImplicitAccess()) {8453if (ExpectedExpr ToBaseOrErr = import(E->getBase()))8454ToBase = *ToBaseOrErr;8455else8456return ToBaseOrErr.takeError();8457}84588459TemplateArgumentListInfo ToTAInfo, *ResInfo = nullptr;84608461if (E->hasExplicitTemplateArgs()) {8462if (Error Err =8463ImportTemplateArgumentListInfo(E->getLAngleLoc(), E->getRAngleLoc(),8464E->template_arguments(), ToTAInfo))8465return std::move(Err);8466ResInfo = &ToTAInfo;8467}8468auto ToMember = importChecked(Err, E->getMember());8469auto ToMemberLoc = importChecked(Err, E->getMemberLoc());8470if (Err)8471return std::move(Err);8472DeclarationNameInfo ToMemberNameInfo(ToMember, ToMemberLoc);84738474// Import additional name location/type info.8475if (Error Err =8476ImportDeclarationNameLoc(E->getMemberNameInfo(), ToMemberNameInfo))8477return std::move(Err);84788479return CXXDependentScopeMemberExpr::Create(8480Importer.getToContext(), ToBase, ToType, E->isArrow(), ToOperatorLoc,8481ToQualifierLoc, ToTemplateKeywordLoc, ToFirstQualifierFoundInScope,8482ToMemberNameInfo, ResInfo);8483}84848485ExpectedStmt8486ASTNodeImporter::VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E) {8487Error Err = Error::success();8488auto ToQualifierLoc = importChecked(Err, E->getQualifierLoc());8489auto ToTemplateKeywordLoc = importChecked(Err, E->getTemplateKeywordLoc());8490auto ToDeclName = importChecked(Err, E->getDeclName());8491auto ToNameLoc = importChecked(Err, E->getNameInfo().getLoc());8492auto ToLAngleLoc = importChecked(Err, E->getLAngleLoc());8493auto ToRAngleLoc = importChecked(Err, E->getRAngleLoc());8494if (Err)8495return std::move(Err);84968497DeclarationNameInfo ToNameInfo(ToDeclName, ToNameLoc);8498if (Error Err = ImportDeclarationNameLoc(E->getNameInfo(), ToNameInfo))8499return std::move(Err);85008501TemplateArgumentListInfo ToTAInfo(ToLAngleLoc, ToRAngleLoc);8502TemplateArgumentListInfo *ResInfo = nullptr;8503if (E->hasExplicitTemplateArgs()) {8504if (Error Err =8505ImportTemplateArgumentListInfo(E->template_arguments(), ToTAInfo))8506return std::move(Err);8507ResInfo = &ToTAInfo;8508}85098510return DependentScopeDeclRefExpr::Create(8511Importer.getToContext(), ToQualifierLoc, ToTemplateKeywordLoc,8512ToNameInfo, ResInfo);8513}85148515ExpectedStmt ASTNodeImporter::VisitCXXUnresolvedConstructExpr(8516CXXUnresolvedConstructExpr *E) {8517Error Err = Error::success();8518auto ToLParenLoc = importChecked(Err, E->getLParenLoc());8519auto ToRParenLoc = importChecked(Err, E->getRParenLoc());8520auto ToType = importChecked(Err, E->getType());8521auto ToTypeSourceInfo = importChecked(Err, E->getTypeSourceInfo());8522if (Err)8523return std::move(Err);85248525SmallVector<Expr *, 8> ToArgs(E->getNumArgs());8526if (Error Err =8527ImportArrayChecked(E->arg_begin(), E->arg_end(), ToArgs.begin()))8528return std::move(Err);85298530return CXXUnresolvedConstructExpr::Create(8531Importer.getToContext(), ToType, ToTypeSourceInfo, ToLParenLoc,8532llvm::ArrayRef(ToArgs), ToRParenLoc, E->isListInitialization());8533}85348535ExpectedStmt8536ASTNodeImporter::VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E) {8537Expected<CXXRecordDecl *> ToNamingClassOrErr = import(E->getNamingClass());8538if (!ToNamingClassOrErr)8539return ToNamingClassOrErr.takeError();85408541auto ToQualifierLocOrErr = import(E->getQualifierLoc());8542if (!ToQualifierLocOrErr)8543return ToQualifierLocOrErr.takeError();85448545Error Err = Error::success();8546auto ToName = importChecked(Err, E->getName());8547auto ToNameLoc = importChecked(Err, E->getNameLoc());8548if (Err)8549return std::move(Err);8550DeclarationNameInfo ToNameInfo(ToName, ToNameLoc);85518552// Import additional name location/type info.8553if (Error Err = ImportDeclarationNameLoc(E->getNameInfo(), ToNameInfo))8554return std::move(Err);85558556UnresolvedSet<8> ToDecls;8557for (auto *D : E->decls())8558if (auto ToDOrErr = import(D))8559ToDecls.addDecl(cast<NamedDecl>(*ToDOrErr));8560else8561return ToDOrErr.takeError();85628563if (E->hasExplicitTemplateArgs()) {8564TemplateArgumentListInfo ToTAInfo;8565if (Error Err = ImportTemplateArgumentListInfo(8566E->getLAngleLoc(), E->getRAngleLoc(), E->template_arguments(),8567ToTAInfo))8568return std::move(Err);85698570ExpectedSLoc ToTemplateKeywordLocOrErr = import(E->getTemplateKeywordLoc());8571if (!ToTemplateKeywordLocOrErr)8572return ToTemplateKeywordLocOrErr.takeError();85738574const bool KnownDependent =8575(E->getDependence() & ExprDependence::TypeValue) ==8576ExprDependence::TypeValue;8577return UnresolvedLookupExpr::Create(8578Importer.getToContext(), *ToNamingClassOrErr, *ToQualifierLocOrErr,8579*ToTemplateKeywordLocOrErr, ToNameInfo, E->requiresADL(), &ToTAInfo,8580ToDecls.begin(), ToDecls.end(), KnownDependent,8581/*KnownInstantiationDependent=*/E->isInstantiationDependent());8582}85838584return UnresolvedLookupExpr::Create(8585Importer.getToContext(), *ToNamingClassOrErr, *ToQualifierLocOrErr,8586ToNameInfo, E->requiresADL(), ToDecls.begin(), ToDecls.end(),8587/*KnownDependent=*/E->isTypeDependent(),8588/*KnownInstantiationDependent=*/E->isInstantiationDependent());8589}85908591ExpectedStmt8592ASTNodeImporter::VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E) {8593Error Err = Error::success();8594auto ToType = importChecked(Err, E->getType());8595auto ToOperatorLoc = importChecked(Err, E->getOperatorLoc());8596auto ToQualifierLoc = importChecked(Err, E->getQualifierLoc());8597auto ToTemplateKeywordLoc = importChecked(Err, E->getTemplateKeywordLoc());8598auto ToName = importChecked(Err, E->getName());8599auto ToNameLoc = importChecked(Err, E->getNameLoc());8600if (Err)8601return std::move(Err);86028603DeclarationNameInfo ToNameInfo(ToName, ToNameLoc);8604// Import additional name location/type info.8605if (Error Err = ImportDeclarationNameLoc(E->getNameInfo(), ToNameInfo))8606return std::move(Err);86078608UnresolvedSet<8> ToDecls;8609for (Decl *D : E->decls())8610if (auto ToDOrErr = import(D))8611ToDecls.addDecl(cast<NamedDecl>(*ToDOrErr));8612else8613return ToDOrErr.takeError();86148615TemplateArgumentListInfo ToTAInfo;8616TemplateArgumentListInfo *ResInfo = nullptr;8617if (E->hasExplicitTemplateArgs()) {8618TemplateArgumentListInfo FromTAInfo;8619E->copyTemplateArgumentsInto(FromTAInfo);8620if (Error Err = ImportTemplateArgumentListInfo(FromTAInfo, ToTAInfo))8621return std::move(Err);8622ResInfo = &ToTAInfo;8623}86248625Expr *ToBase = nullptr;8626if (!E->isImplicitAccess()) {8627if (ExpectedExpr ToBaseOrErr = import(E->getBase()))8628ToBase = *ToBaseOrErr;8629else8630return ToBaseOrErr.takeError();8631}86328633return UnresolvedMemberExpr::Create(8634Importer.getToContext(), E->hasUnresolvedUsing(), ToBase, ToType,8635E->isArrow(), ToOperatorLoc, ToQualifierLoc, ToTemplateKeywordLoc,8636ToNameInfo, ResInfo, ToDecls.begin(), ToDecls.end());8637}86388639ExpectedStmt ASTNodeImporter::VisitCallExpr(CallExpr *E) {8640Error Err = Error::success();8641auto ToCallee = importChecked(Err, E->getCallee());8642auto ToType = importChecked(Err, E->getType());8643auto ToRParenLoc = importChecked(Err, E->getRParenLoc());8644if (Err)8645return std::move(Err);86468647unsigned NumArgs = E->getNumArgs();8648llvm::SmallVector<Expr *, 2> ToArgs(NumArgs);8649if (Error Err = ImportContainerChecked(E->arguments(), ToArgs))8650return std::move(Err);86518652if (const auto *OCE = dyn_cast<CXXOperatorCallExpr>(E)) {8653return CXXOperatorCallExpr::Create(8654Importer.getToContext(), OCE->getOperator(), ToCallee, ToArgs, ToType,8655OCE->getValueKind(), ToRParenLoc, OCE->getFPFeatures(),8656OCE->getADLCallKind());8657}86588659return CallExpr::Create(Importer.getToContext(), ToCallee, ToArgs, ToType,8660E->getValueKind(), ToRParenLoc, E->getFPFeatures(),8661/*MinNumArgs=*/0, E->getADLCallKind());8662}86638664ExpectedStmt ASTNodeImporter::VisitLambdaExpr(LambdaExpr *E) {8665CXXRecordDecl *FromClass = E->getLambdaClass();8666auto ToClassOrErr = import(FromClass);8667if (!ToClassOrErr)8668return ToClassOrErr.takeError();8669CXXRecordDecl *ToClass = *ToClassOrErr;86708671auto ToCallOpOrErr = import(E->getCallOperator());8672if (!ToCallOpOrErr)8673return ToCallOpOrErr.takeError();86748675SmallVector<Expr *, 8> ToCaptureInits(E->capture_size());8676if (Error Err = ImportContainerChecked(E->capture_inits(), ToCaptureInits))8677return std::move(Err);86788679Error Err = Error::success();8680auto ToIntroducerRange = importChecked(Err, E->getIntroducerRange());8681auto ToCaptureDefaultLoc = importChecked(Err, E->getCaptureDefaultLoc());8682auto ToEndLoc = importChecked(Err, E->getEndLoc());8683if (Err)8684return std::move(Err);86858686return LambdaExpr::Create(Importer.getToContext(), ToClass, ToIntroducerRange,8687E->getCaptureDefault(), ToCaptureDefaultLoc,8688E->hasExplicitParameters(),8689E->hasExplicitResultType(), ToCaptureInits,8690ToEndLoc, E->containsUnexpandedParameterPack());8691}869286938694ExpectedStmt ASTNodeImporter::VisitInitListExpr(InitListExpr *E) {8695Error Err = Error::success();8696auto ToLBraceLoc = importChecked(Err, E->getLBraceLoc());8697auto ToRBraceLoc = importChecked(Err, E->getRBraceLoc());8698auto ToType = importChecked(Err, E->getType());8699if (Err)8700return std::move(Err);87018702SmallVector<Expr *, 4> ToExprs(E->getNumInits());8703if (Error Err = ImportContainerChecked(E->inits(), ToExprs))8704return std::move(Err);87058706ASTContext &ToCtx = Importer.getToContext();8707InitListExpr *To = new (ToCtx) InitListExpr(8708ToCtx, ToLBraceLoc, ToExprs, ToRBraceLoc);8709To->setType(ToType);87108711if (E->hasArrayFiller()) {8712if (ExpectedExpr ToFillerOrErr = import(E->getArrayFiller()))8713To->setArrayFiller(*ToFillerOrErr);8714else8715return ToFillerOrErr.takeError();8716}87178718if (FieldDecl *FromFD = E->getInitializedFieldInUnion()) {8719if (auto ToFDOrErr = import(FromFD))8720To->setInitializedFieldInUnion(*ToFDOrErr);8721else8722return ToFDOrErr.takeError();8723}87248725if (InitListExpr *SyntForm = E->getSyntacticForm()) {8726if (auto ToSyntFormOrErr = import(SyntForm))8727To->setSyntacticForm(*ToSyntFormOrErr);8728else8729return ToSyntFormOrErr.takeError();8730}87318732// Copy InitListExprBitfields, which are not handled in the ctor of8733// InitListExpr.8734To->sawArrayRangeDesignator(E->hadArrayRangeDesignator());87358736return To;8737}87388739ExpectedStmt ASTNodeImporter::VisitCXXStdInitializerListExpr(8740CXXStdInitializerListExpr *E) {8741ExpectedType ToTypeOrErr = import(E->getType());8742if (!ToTypeOrErr)8743return ToTypeOrErr.takeError();87448745ExpectedExpr ToSubExprOrErr = import(E->getSubExpr());8746if (!ToSubExprOrErr)8747return ToSubExprOrErr.takeError();87488749return new (Importer.getToContext()) CXXStdInitializerListExpr(8750*ToTypeOrErr, *ToSubExprOrErr);8751}87528753ExpectedStmt ASTNodeImporter::VisitCXXInheritedCtorInitExpr(8754CXXInheritedCtorInitExpr *E) {8755Error Err = Error::success();8756auto ToLocation = importChecked(Err, E->getLocation());8757auto ToType = importChecked(Err, E->getType());8758auto ToConstructor = importChecked(Err, E->getConstructor());8759if (Err)8760return std::move(Err);87618762return new (Importer.getToContext()) CXXInheritedCtorInitExpr(8763ToLocation, ToType, ToConstructor, E->constructsVBase(),8764E->inheritedFromVBase());8765}87668767ExpectedStmt ASTNodeImporter::VisitArrayInitLoopExpr(ArrayInitLoopExpr *E) {8768Error Err = Error::success();8769auto ToType = importChecked(Err, E->getType());8770auto ToCommonExpr = importChecked(Err, E->getCommonExpr());8771auto ToSubExpr = importChecked(Err, E->getSubExpr());8772if (Err)8773return std::move(Err);87748775return new (Importer.getToContext()) ArrayInitLoopExpr(8776ToType, ToCommonExpr, ToSubExpr);8777}87788779ExpectedStmt ASTNodeImporter::VisitArrayInitIndexExpr(ArrayInitIndexExpr *E) {8780ExpectedType ToTypeOrErr = import(E->getType());8781if (!ToTypeOrErr)8782return ToTypeOrErr.takeError();8783return new (Importer.getToContext()) ArrayInitIndexExpr(*ToTypeOrErr);8784}87858786ExpectedStmt ASTNodeImporter::VisitCXXDefaultInitExpr(CXXDefaultInitExpr *E) {8787ExpectedSLoc ToBeginLocOrErr = import(E->getBeginLoc());8788if (!ToBeginLocOrErr)8789return ToBeginLocOrErr.takeError();87908791auto ToFieldOrErr = import(E->getField());8792if (!ToFieldOrErr)8793return ToFieldOrErr.takeError();87948795auto UsedContextOrErr = Importer.ImportContext(E->getUsedContext());8796if (!UsedContextOrErr)8797return UsedContextOrErr.takeError();87988799FieldDecl *ToField = *ToFieldOrErr;8800assert(ToField->hasInClassInitializer() &&8801"Field should have in-class initializer if there is a default init "8802"expression that uses it.");8803if (!ToField->getInClassInitializer()) {8804// The in-class initializer may be not yet set in "To" AST even if the8805// field is already there. This must be set here to make construction of8806// CXXDefaultInitExpr work.8807auto ToInClassInitializerOrErr =8808import(E->getField()->getInClassInitializer());8809if (!ToInClassInitializerOrErr)8810return ToInClassInitializerOrErr.takeError();8811ToField->setInClassInitializer(*ToInClassInitializerOrErr);8812}88138814Expr *RewrittenInit = nullptr;8815if (E->hasRewrittenInit()) {8816ExpectedExpr ExprOrErr = import(E->getRewrittenExpr());8817if (!ExprOrErr)8818return ExprOrErr.takeError();8819RewrittenInit = ExprOrErr.get();8820}88218822return CXXDefaultInitExpr::Create(Importer.getToContext(), *ToBeginLocOrErr,8823ToField, *UsedContextOrErr, RewrittenInit);8824}88258826ExpectedStmt ASTNodeImporter::VisitCXXNamedCastExpr(CXXNamedCastExpr *E) {8827Error Err = Error::success();8828auto ToType = importChecked(Err, E->getType());8829auto ToSubExpr = importChecked(Err, E->getSubExpr());8830auto ToTypeInfoAsWritten = importChecked(Err, E->getTypeInfoAsWritten());8831auto ToOperatorLoc = importChecked(Err, E->getOperatorLoc());8832auto ToRParenLoc = importChecked(Err, E->getRParenLoc());8833auto ToAngleBrackets = importChecked(Err, E->getAngleBrackets());8834if (Err)8835return std::move(Err);88368837ExprValueKind VK = E->getValueKind();8838CastKind CK = E->getCastKind();8839auto ToBasePathOrErr = ImportCastPath(E);8840if (!ToBasePathOrErr)8841return ToBasePathOrErr.takeError();88428843if (auto CCE = dyn_cast<CXXStaticCastExpr>(E)) {8844return CXXStaticCastExpr::Create(8845Importer.getToContext(), ToType, VK, CK, ToSubExpr, &(*ToBasePathOrErr),8846ToTypeInfoAsWritten, CCE->getFPFeatures(), ToOperatorLoc, ToRParenLoc,8847ToAngleBrackets);8848} else if (isa<CXXDynamicCastExpr>(E)) {8849return CXXDynamicCastExpr::Create(8850Importer.getToContext(), ToType, VK, CK, ToSubExpr, &(*ToBasePathOrErr),8851ToTypeInfoAsWritten, ToOperatorLoc, ToRParenLoc, ToAngleBrackets);8852} else if (isa<CXXReinterpretCastExpr>(E)) {8853return CXXReinterpretCastExpr::Create(8854Importer.getToContext(), ToType, VK, CK, ToSubExpr, &(*ToBasePathOrErr),8855ToTypeInfoAsWritten, ToOperatorLoc, ToRParenLoc, ToAngleBrackets);8856} else if (isa<CXXConstCastExpr>(E)) {8857return CXXConstCastExpr::Create(8858Importer.getToContext(), ToType, VK, ToSubExpr, ToTypeInfoAsWritten,8859ToOperatorLoc, ToRParenLoc, ToAngleBrackets);8860} else {8861llvm_unreachable("Unknown cast type");8862return make_error<ASTImportError>();8863}8864}88658866ExpectedStmt ASTNodeImporter::VisitSubstNonTypeTemplateParmExpr(8867SubstNonTypeTemplateParmExpr *E) {8868Error Err = Error::success();8869auto ToType = importChecked(Err, E->getType());8870auto ToExprLoc = importChecked(Err, E->getExprLoc());8871auto ToAssociatedDecl = importChecked(Err, E->getAssociatedDecl());8872auto ToReplacement = importChecked(Err, E->getReplacement());8873if (Err)8874return std::move(Err);88758876return new (Importer.getToContext()) SubstNonTypeTemplateParmExpr(8877ToType, E->getValueKind(), ToExprLoc, ToReplacement, ToAssociatedDecl,8878E->getIndex(), E->getPackIndex(), E->isReferenceParameter());8879}88808881ExpectedStmt ASTNodeImporter::VisitTypeTraitExpr(TypeTraitExpr *E) {8882Error Err = Error::success();8883auto ToType = importChecked(Err, E->getType());8884auto ToBeginLoc = importChecked(Err, E->getBeginLoc());8885auto ToEndLoc = importChecked(Err, E->getEndLoc());8886if (Err)8887return std::move(Err);88888889SmallVector<TypeSourceInfo *, 4> ToArgs(E->getNumArgs());8890if (Error Err = ImportContainerChecked(E->getArgs(), ToArgs))8891return std::move(Err);88928893// According to Sema::BuildTypeTrait(), if E is value-dependent,8894// Value is always false.8895bool ToValue = (E->isValueDependent() ? false : E->getValue());88968897return TypeTraitExpr::Create(8898Importer.getToContext(), ToType, ToBeginLoc, E->getTrait(), ToArgs,8899ToEndLoc, ToValue);8900}89018902ExpectedStmt ASTNodeImporter::VisitCXXTypeidExpr(CXXTypeidExpr *E) {8903ExpectedType ToTypeOrErr = import(E->getType());8904if (!ToTypeOrErr)8905return ToTypeOrErr.takeError();89068907auto ToSourceRangeOrErr = import(E->getSourceRange());8908if (!ToSourceRangeOrErr)8909return ToSourceRangeOrErr.takeError();89108911if (E->isTypeOperand()) {8912if (auto ToTSIOrErr = import(E->getTypeOperandSourceInfo()))8913return new (Importer.getToContext()) CXXTypeidExpr(8914*ToTypeOrErr, *ToTSIOrErr, *ToSourceRangeOrErr);8915else8916return ToTSIOrErr.takeError();8917}89188919ExpectedExpr ToExprOperandOrErr = import(E->getExprOperand());8920if (!ToExprOperandOrErr)8921return ToExprOperandOrErr.takeError();89228923return new (Importer.getToContext()) CXXTypeidExpr(8924*ToTypeOrErr, *ToExprOperandOrErr, *ToSourceRangeOrErr);8925}89268927ExpectedStmt ASTNodeImporter::VisitCXXFoldExpr(CXXFoldExpr *E) {8928Error Err = Error::success();89298930QualType ToType = importChecked(Err, E->getType());8931UnresolvedLookupExpr *ToCallee = importChecked(Err, E->getCallee());8932SourceLocation ToLParenLoc = importChecked(Err, E->getLParenLoc());8933Expr *ToLHS = importChecked(Err, E->getLHS());8934SourceLocation ToEllipsisLoc = importChecked(Err, E->getEllipsisLoc());8935Expr *ToRHS = importChecked(Err, E->getRHS());8936SourceLocation ToRParenLoc = importChecked(Err, E->getRParenLoc());89378938if (Err)8939return std::move(Err);89408941return new (Importer.getToContext())8942CXXFoldExpr(ToType, ToCallee, ToLParenLoc, ToLHS, E->getOperator(),8943ToEllipsisLoc, ToRHS, ToRParenLoc, E->getNumExpansions());8944}89458946Error ASTNodeImporter::ImportOverriddenMethods(CXXMethodDecl *ToMethod,8947CXXMethodDecl *FromMethod) {8948Error ImportErrors = Error::success();8949for (auto *FromOverriddenMethod : FromMethod->overridden_methods()) {8950if (auto ImportedOrErr = import(FromOverriddenMethod))8951ToMethod->getCanonicalDecl()->addOverriddenMethod(cast<CXXMethodDecl>(8952(*ImportedOrErr)->getCanonicalDecl()));8953else8954ImportErrors =8955joinErrors(std::move(ImportErrors), ImportedOrErr.takeError());8956}8957return ImportErrors;8958}89598960ASTImporter::ASTImporter(ASTContext &ToContext, FileManager &ToFileManager,8961ASTContext &FromContext, FileManager &FromFileManager,8962bool MinimalImport,8963std::shared_ptr<ASTImporterSharedState> SharedState)8964: SharedState(SharedState), ToContext(ToContext), FromContext(FromContext),8965ToFileManager(ToFileManager), FromFileManager(FromFileManager),8966Minimal(MinimalImport), ODRHandling(ODRHandlingType::Conservative) {89678968// Create a default state without the lookup table: LLDB case.8969if (!SharedState) {8970this->SharedState = std::make_shared<ASTImporterSharedState>();8971}89728973ImportedDecls[FromContext.getTranslationUnitDecl()] =8974ToContext.getTranslationUnitDecl();8975}89768977ASTImporter::~ASTImporter() = default;89788979std::optional<unsigned> ASTImporter::getFieldIndex(Decl *F) {8980assert(F && (isa<FieldDecl>(*F) || isa<IndirectFieldDecl>(*F)) &&8981"Try to get field index for non-field.");89828983auto *Owner = dyn_cast<RecordDecl>(F->getDeclContext());8984if (!Owner)8985return std::nullopt;89868987unsigned Index = 0;8988for (const auto *D : Owner->decls()) {8989if (D == F)8990return Index;89918992if (isa<FieldDecl>(*D) || isa<IndirectFieldDecl>(*D))8993++Index;8994}89958996llvm_unreachable("Field was not found in its parent context.");89978998return std::nullopt;8999}90009001ASTImporter::FoundDeclsTy9002ASTImporter::findDeclsInToCtx(DeclContext *DC, DeclarationName Name) {9003// We search in the redecl context because of transparent contexts.9004// E.g. a simple C language enum is a transparent context:9005// enum E { A, B };9006// Now if we had a global variable in the TU9007// int A;9008// then the enum constant 'A' and the variable 'A' violates ODR.9009// We can diagnose this only if we search in the redecl context.9010DeclContext *ReDC = DC->getRedeclContext();9011if (SharedState->getLookupTable()) {9012ASTImporterLookupTable::LookupResult LookupResult =9013SharedState->getLookupTable()->lookup(ReDC, Name);9014return FoundDeclsTy(LookupResult.begin(), LookupResult.end());9015} else {9016DeclContext::lookup_result NoloadLookupResult = ReDC->noload_lookup(Name);9017FoundDeclsTy Result(NoloadLookupResult.begin(), NoloadLookupResult.end());9018// We must search by the slow case of localUncachedLookup because that is9019// working even if there is no LookupPtr for the DC. We could use9020// DC::buildLookup() to create the LookupPtr, but that would load external9021// decls again, we must avoid that case.9022// Also, even if we had the LookupPtr, we must find Decls which are not9023// in the LookupPtr, so we need the slow case.9024// These cases are handled in ASTImporterLookupTable, but we cannot use9025// that with LLDB since that traverses through the AST which initiates the9026// load of external decls again via DC::decls(). And again, we must avoid9027// loading external decls during the import.9028if (Result.empty())9029ReDC->localUncachedLookup(Name, Result);9030return Result;9031}9032}90339034void ASTImporter::AddToLookupTable(Decl *ToD) {9035SharedState->addDeclToLookup(ToD);9036}90379038Expected<Decl *> ASTImporter::ImportImpl(Decl *FromD) {9039// Import the decl using ASTNodeImporter.9040ASTNodeImporter Importer(*this);9041return Importer.Visit(FromD);9042}90439044void ASTImporter::RegisterImportedDecl(Decl *FromD, Decl *ToD) {9045MapImported(FromD, ToD);9046}90479048llvm::Expected<ExprWithCleanups::CleanupObject>9049ASTImporter::Import(ExprWithCleanups::CleanupObject From) {9050if (auto *CLE = From.dyn_cast<CompoundLiteralExpr *>()) {9051if (Expected<Expr *> R = Import(CLE))9052return ExprWithCleanups::CleanupObject(cast<CompoundLiteralExpr>(*R));9053}90549055// FIXME: Handle BlockDecl when we implement importing BlockExpr in9056// ASTNodeImporter.9057return make_error<ASTImportError>(ASTImportError::UnsupportedConstruct);9058}90599060ExpectedTypePtr ASTImporter::Import(const Type *FromT) {9061if (!FromT)9062return FromT;90639064// Check whether we've already imported this type.9065llvm::DenseMap<const Type *, const Type *>::iterator Pos =9066ImportedTypes.find(FromT);9067if (Pos != ImportedTypes.end())9068return Pos->second;90699070// Import the type.9071ASTNodeImporter Importer(*this);9072ExpectedType ToTOrErr = Importer.Visit(FromT);9073if (!ToTOrErr)9074return ToTOrErr.takeError();90759076// Record the imported type.9077ImportedTypes[FromT] = ToTOrErr->getTypePtr();90789079return ToTOrErr->getTypePtr();9080}90819082Expected<QualType> ASTImporter::Import(QualType FromT) {9083if (FromT.isNull())9084return QualType{};90859086ExpectedTypePtr ToTyOrErr = Import(FromT.getTypePtr());9087if (!ToTyOrErr)9088return ToTyOrErr.takeError();90899090return ToContext.getQualifiedType(*ToTyOrErr, FromT.getLocalQualifiers());9091}90929093Expected<TypeSourceInfo *> ASTImporter::Import(TypeSourceInfo *FromTSI) {9094if (!FromTSI)9095return FromTSI;90969097// FIXME: For now we just create a "trivial" type source info based9098// on the type and a single location. Implement a real version of this.9099ExpectedType TOrErr = Import(FromTSI->getType());9100if (!TOrErr)9101return TOrErr.takeError();9102ExpectedSLoc BeginLocOrErr = Import(FromTSI->getTypeLoc().getBeginLoc());9103if (!BeginLocOrErr)9104return BeginLocOrErr.takeError();91059106return ToContext.getTrivialTypeSourceInfo(*TOrErr, *BeginLocOrErr);9107}91089109namespace {9110// To use this object, it should be created before the new attribute is created,9111// and destructed after it is created. The construction already performs the9112// import of the data.9113template <typename T> struct AttrArgImporter {9114AttrArgImporter(const AttrArgImporter<T> &) = delete;9115AttrArgImporter(AttrArgImporter<T> &&) = default;9116AttrArgImporter<T> &operator=(const AttrArgImporter<T> &) = delete;9117AttrArgImporter<T> &operator=(AttrArgImporter<T> &&) = default;91189119AttrArgImporter(ASTNodeImporter &I, Error &Err, const T &From)9120: To(I.importChecked(Err, From)) {}91219122const T &value() { return To; }91239124private:9125T To;9126};91279128// To use this object, it should be created before the new attribute is created,9129// and destructed after it is created. The construction already performs the9130// import of the data. The array data is accessible in a pointer form, this form9131// is used by the attribute classes. This object should be created once for the9132// array data to be imported (the array size is not imported, just copied).9133template <typename T> struct AttrArgArrayImporter {9134AttrArgArrayImporter(const AttrArgArrayImporter<T> &) = delete;9135AttrArgArrayImporter(AttrArgArrayImporter<T> &&) = default;9136AttrArgArrayImporter<T> &operator=(const AttrArgArrayImporter<T> &) = delete;9137AttrArgArrayImporter<T> &operator=(AttrArgArrayImporter<T> &&) = default;91389139AttrArgArrayImporter(ASTNodeImporter &I, Error &Err,9140const llvm::iterator_range<T *> &From,9141unsigned ArraySize) {9142if (Err)9143return;9144To.reserve(ArraySize);9145Err = I.ImportContainerChecked(From, To);9146}91479148T *value() { return To.data(); }91499150private:9151llvm::SmallVector<T, 2> To;9152};91539154class AttrImporter {9155Error Err{Error::success()};9156Attr *ToAttr = nullptr;9157ASTImporter &Importer;9158ASTNodeImporter NImporter;91599160public:9161AttrImporter(ASTImporter &I) : Importer(I), NImporter(I) {}91629163// Useful for accessing the imported attribute.9164template <typename T> T *castAttrAs() { return cast<T>(ToAttr); }9165template <typename T> const T *castAttrAs() const { return cast<T>(ToAttr); }91669167// Create an "importer" for an attribute parameter.9168// Result of the 'value()' of that object is to be passed to the function9169// 'importAttr', in the order that is expected by the attribute class.9170template <class T> AttrArgImporter<T> importArg(const T &From) {9171return AttrArgImporter<T>(NImporter, Err, From);9172}91739174// Create an "importer" for an attribute parameter that has array type.9175// Result of the 'value()' of that object is to be passed to the function9176// 'importAttr', then the size of the array as next argument.9177template <typename T>9178AttrArgArrayImporter<T> importArrayArg(const llvm::iterator_range<T *> &From,9179unsigned ArraySize) {9180return AttrArgArrayImporter<T>(NImporter, Err, From, ArraySize);9181}91829183// Create an attribute object with the specified arguments.9184// The 'FromAttr' is the original (not imported) attribute, the 'ImportedArg'9185// should be values that are passed to the 'Create' function of the attribute.9186// (The 'Create' with 'ASTContext' first and 'AttributeCommonInfo' last is9187// used here.) As much data is copied or imported from the old attribute9188// as possible. The passed arguments should be already imported.9189// If an import error happens, the internal error is set to it, and any9190// further import attempt is ignored.9191template <typename T, typename... Arg>9192void importAttr(const T *FromAttr, Arg &&...ImportedArg) {9193static_assert(std::is_base_of<Attr, T>::value,9194"T should be subclass of Attr.");9195assert(!ToAttr && "Use one AttrImporter to import one Attribute object.");91969197const IdentifierInfo *ToAttrName = Importer.Import(FromAttr->getAttrName());9198const IdentifierInfo *ToScopeName =9199Importer.Import(FromAttr->getScopeName());9200SourceRange ToAttrRange =9201NImporter.importChecked(Err, FromAttr->getRange());9202SourceLocation ToScopeLoc =9203NImporter.importChecked(Err, FromAttr->getScopeLoc());92049205if (Err)9206return;92079208AttributeCommonInfo ToI(ToAttrName, ToScopeName, ToAttrRange, ToScopeLoc,9209FromAttr->getParsedKind(), FromAttr->getForm());9210// The "SemanticSpelling" is not needed to be passed to the constructor.9211// That value is recalculated from the SpellingListIndex if needed.9212ToAttr = T::Create(Importer.getToContext(),9213std::forward<Arg>(ImportedArg)..., ToI);92149215ToAttr->setImplicit(FromAttr->isImplicit());9216ToAttr->setPackExpansion(FromAttr->isPackExpansion());9217if (auto *ToInheritableAttr = dyn_cast<InheritableAttr>(ToAttr))9218ToInheritableAttr->setInherited(FromAttr->isInherited());9219}92209221// Create a clone of the 'FromAttr' and import its source range only.9222// This causes objects with invalid references to be created if the 'FromAttr'9223// contains other data that should be imported.9224void cloneAttr(const Attr *FromAttr) {9225assert(!ToAttr && "Use one AttrImporter to import one Attribute object.");92269227SourceRange ToRange = NImporter.importChecked(Err, FromAttr->getRange());9228if (Err)9229return;92309231ToAttr = FromAttr->clone(Importer.getToContext());9232ToAttr->setRange(ToRange);9233ToAttr->setAttrName(Importer.Import(FromAttr->getAttrName()));9234}92359236// Get the result of the previous import attempt (can be used only once).9237llvm::Expected<Attr *> getResult() && {9238if (Err)9239return std::move(Err);9240assert(ToAttr && "Attribute should be created.");9241return ToAttr;9242}9243};9244} // namespace92459246Expected<Attr *> ASTImporter::Import(const Attr *FromAttr) {9247AttrImporter AI(*this);92489249// FIXME: Is there some kind of AttrVisitor to use here?9250switch (FromAttr->getKind()) {9251case attr::Aligned: {9252auto *From = cast<AlignedAttr>(FromAttr);9253if (From->isAlignmentExpr())9254AI.importAttr(From, true, AI.importArg(From->getAlignmentExpr()).value());9255else9256AI.importAttr(From, false,9257AI.importArg(From->getAlignmentType()).value());9258break;9259}92609261case attr::AlignValue: {9262auto *From = cast<AlignValueAttr>(FromAttr);9263AI.importAttr(From, AI.importArg(From->getAlignment()).value());9264break;9265}92669267case attr::Format: {9268const auto *From = cast<FormatAttr>(FromAttr);9269AI.importAttr(From, Import(From->getType()), From->getFormatIdx(),9270From->getFirstArg());9271break;9272}92739274case attr::EnableIf: {9275const auto *From = cast<EnableIfAttr>(FromAttr);9276AI.importAttr(From, AI.importArg(From->getCond()).value(),9277From->getMessage());9278break;9279}92809281case attr::AssertCapability: {9282const auto *From = cast<AssertCapabilityAttr>(FromAttr);9283AI.importAttr(From,9284AI.importArrayArg(From->args(), From->args_size()).value(),9285From->args_size());9286break;9287}9288case attr::AcquireCapability: {9289const auto *From = cast<AcquireCapabilityAttr>(FromAttr);9290AI.importAttr(From,9291AI.importArrayArg(From->args(), From->args_size()).value(),9292From->args_size());9293break;9294}9295case attr::TryAcquireCapability: {9296const auto *From = cast<TryAcquireCapabilityAttr>(FromAttr);9297AI.importAttr(From, AI.importArg(From->getSuccessValue()).value(),9298AI.importArrayArg(From->args(), From->args_size()).value(),9299From->args_size());9300break;9301}9302case attr::ReleaseCapability: {9303const auto *From = cast<ReleaseCapabilityAttr>(FromAttr);9304AI.importAttr(From,9305AI.importArrayArg(From->args(), From->args_size()).value(),9306From->args_size());9307break;9308}9309case attr::RequiresCapability: {9310const auto *From = cast<RequiresCapabilityAttr>(FromAttr);9311AI.importAttr(From,9312AI.importArrayArg(From->args(), From->args_size()).value(),9313From->args_size());9314break;9315}9316case attr::GuardedBy: {9317const auto *From = cast<GuardedByAttr>(FromAttr);9318AI.importAttr(From, AI.importArg(From->getArg()).value());9319break;9320}9321case attr::PtGuardedBy: {9322const auto *From = cast<PtGuardedByAttr>(FromAttr);9323AI.importAttr(From, AI.importArg(From->getArg()).value());9324break;9325}9326case attr::AcquiredAfter: {9327const auto *From = cast<AcquiredAfterAttr>(FromAttr);9328AI.importAttr(From,9329AI.importArrayArg(From->args(), From->args_size()).value(),9330From->args_size());9331break;9332}9333case attr::AcquiredBefore: {9334const auto *From = cast<AcquiredBeforeAttr>(FromAttr);9335AI.importAttr(From,9336AI.importArrayArg(From->args(), From->args_size()).value(),9337From->args_size());9338break;9339}9340case attr::AssertExclusiveLock: {9341const auto *From = cast<AssertExclusiveLockAttr>(FromAttr);9342AI.importAttr(From,9343AI.importArrayArg(From->args(), From->args_size()).value(),9344From->args_size());9345break;9346}9347case attr::AssertSharedLock: {9348const auto *From = cast<AssertSharedLockAttr>(FromAttr);9349AI.importAttr(From,9350AI.importArrayArg(From->args(), From->args_size()).value(),9351From->args_size());9352break;9353}9354case attr::ExclusiveTrylockFunction: {9355const auto *From = cast<ExclusiveTrylockFunctionAttr>(FromAttr);9356AI.importAttr(From, AI.importArg(From->getSuccessValue()).value(),9357AI.importArrayArg(From->args(), From->args_size()).value(),9358From->args_size());9359break;9360}9361case attr::SharedTrylockFunction: {9362const auto *From = cast<SharedTrylockFunctionAttr>(FromAttr);9363AI.importAttr(From, AI.importArg(From->getSuccessValue()).value(),9364AI.importArrayArg(From->args(), From->args_size()).value(),9365From->args_size());9366break;9367}9368case attr::LockReturned: {9369const auto *From = cast<LockReturnedAttr>(FromAttr);9370AI.importAttr(From, AI.importArg(From->getArg()).value());9371break;9372}9373case attr::LocksExcluded: {9374const auto *From = cast<LocksExcludedAttr>(FromAttr);9375AI.importAttr(From,9376AI.importArrayArg(From->args(), From->args_size()).value(),9377From->args_size());9378break;9379}9380default: {9381// The default branch works for attributes that have no arguments to import.9382// FIXME: Handle every attribute type that has arguments of type to import9383// (most often Expr* or Decl* or type) in the switch above.9384AI.cloneAttr(FromAttr);9385break;9386}9387}93889389return std::move(AI).getResult();9390}93919392Decl *ASTImporter::GetAlreadyImportedOrNull(const Decl *FromD) const {9393return ImportedDecls.lookup(FromD);9394}93959396TranslationUnitDecl *ASTImporter::GetFromTU(Decl *ToD) {9397auto FromDPos = ImportedFromDecls.find(ToD);9398if (FromDPos == ImportedFromDecls.end())9399return nullptr;9400return FromDPos->second->getTranslationUnitDecl();9401}94029403Error ASTImporter::ImportAttrs(Decl *ToD, Decl *FromD) {9404if (!FromD->hasAttrs() || ToD->hasAttrs())9405return Error::success();9406for (const Attr *FromAttr : FromD->getAttrs()) {9407auto ToAttrOrErr = Import(FromAttr);9408if (ToAttrOrErr)9409ToD->addAttr(*ToAttrOrErr);9410else9411return ToAttrOrErr.takeError();9412}9413return Error::success();9414}94159416Expected<Decl *> ASTImporter::Import(Decl *FromD) {9417if (!FromD)9418return nullptr;94199420// Push FromD to the stack, and remove that when we return.9421ImportPath.push(FromD);9422auto ImportPathBuilder =9423llvm::make_scope_exit([this]() { ImportPath.pop(); });94249425// Check whether there was a previous failed import.9426// If yes return the existing error.9427if (auto Error = getImportDeclErrorIfAny(FromD))9428return make_error<ASTImportError>(*Error);94299430// Check whether we've already imported this declaration.9431Decl *ToD = GetAlreadyImportedOrNull(FromD);9432if (ToD) {9433// Already imported (possibly from another TU) and with an error.9434if (auto Error = SharedState->getImportDeclErrorIfAny(ToD)) {9435setImportDeclError(FromD, *Error);9436return make_error<ASTImportError>(*Error);9437}94389439// If FromD has some updated flags after last import, apply it.9440updateFlags(FromD, ToD);9441// If we encounter a cycle during an import then we save the relevant part9442// of the import path associated to the Decl.9443if (ImportPath.hasCycleAtBack())9444SavedImportPaths[FromD].push_back(ImportPath.copyCycleAtBack());9445return ToD;9446}94479448// Import the declaration.9449ExpectedDecl ToDOrErr = ImportImpl(FromD);9450if (!ToDOrErr) {9451// Failed to import.94529453auto Pos = ImportedDecls.find(FromD);9454if (Pos != ImportedDecls.end()) {9455// Import failed after the object was created.9456// Remove all references to it.9457auto *ToD = Pos->second;9458ImportedDecls.erase(Pos);94599460// ImportedDecls and ImportedFromDecls are not symmetric. It may happen9461// (e.g. with namespaces) that several decls from the 'from' context are9462// mapped to the same decl in the 'to' context. If we removed entries9463// from the LookupTable here then we may end up removing them multiple9464// times.94659466// The Lookuptable contains decls only which are in the 'to' context.9467// Remove from the Lookuptable only if it is *imported* into the 'to'9468// context (and do not remove it if it was added during the initial9469// traverse of the 'to' context).9470auto PosF = ImportedFromDecls.find(ToD);9471if (PosF != ImportedFromDecls.end()) {9472// In the case of TypedefNameDecl we create the Decl first and only9473// then we import and set its DeclContext. So, the DC might not be set9474// when we reach here.9475if (ToD->getDeclContext())9476SharedState->removeDeclFromLookup(ToD);9477ImportedFromDecls.erase(PosF);9478}94799480// FIXME: AST may contain remaining references to the failed object.9481// However, the ImportDeclErrors in the shared state contains all the9482// failed objects together with their error.9483}94849485// Error encountered for the first time.9486// After takeError the error is not usable any more in ToDOrErr.9487// Get a copy of the error object (any more simple solution for this?).9488ASTImportError ErrOut;9489handleAllErrors(ToDOrErr.takeError(),9490[&ErrOut](const ASTImportError &E) { ErrOut = E; });9491setImportDeclError(FromD, ErrOut);9492// Set the error for the mapped to Decl, which is in the "to" context.9493if (Pos != ImportedDecls.end())9494SharedState->setImportDeclError(Pos->second, ErrOut);94959496// Set the error for all nodes which have been created before we9497// recognized the error.9498for (const auto &Path : SavedImportPaths[FromD]) {9499// The import path contains import-dependency nodes first.9500// Save the node that was imported as dependency of the current node.9501Decl *PrevFromDi = FromD;9502for (Decl *FromDi : Path) {9503// Begin and end of the path equals 'FromD', skip it.9504if (FromDi == FromD)9505continue;9506// We should not set import error on a node and all following nodes in9507// the path if child import errors are ignored.9508if (ChildErrorHandlingStrategy(FromDi).ignoreChildErrorOnParent(9509PrevFromDi))9510break;9511PrevFromDi = FromDi;9512setImportDeclError(FromDi, ErrOut);9513//FIXME Should we remove these Decls from ImportedDecls?9514// Set the error for the mapped to Decl, which is in the "to" context.9515auto Ii = ImportedDecls.find(FromDi);9516if (Ii != ImportedDecls.end())9517SharedState->setImportDeclError(Ii->second, ErrOut);9518// FIXME Should we remove these Decls from the LookupTable,9519// and from ImportedFromDecls?9520}9521}9522SavedImportPaths.erase(FromD);95239524// Do not return ToDOrErr, error was taken out of it.9525return make_error<ASTImportError>(ErrOut);9526}95279528ToD = *ToDOrErr;95299530// FIXME: Handle the "already imported with error" case. We can get here9531// nullptr only if GetImportedOrCreateDecl returned nullptr (after a9532// previously failed create was requested).9533// Later GetImportedOrCreateDecl can be updated to return the error.9534if (!ToD) {9535auto Err = getImportDeclErrorIfAny(FromD);9536assert(Err);9537return make_error<ASTImportError>(*Err);9538}95399540// We could import from the current TU without error. But previously we9541// already had imported a Decl as `ToD` from another TU (with another9542// ASTImporter object) and with an error.9543if (auto Error = SharedState->getImportDeclErrorIfAny(ToD)) {9544setImportDeclError(FromD, *Error);9545return make_error<ASTImportError>(*Error);9546}9547// Make sure that ImportImpl registered the imported decl.9548assert(ImportedDecls.count(FromD) != 0 && "Missing call to MapImported?");9549if (auto Error = ImportAttrs(ToD, FromD))9550return std::move(Error);95519552// Notify subclasses.9553Imported(FromD, ToD);95549555updateFlags(FromD, ToD);9556SavedImportPaths.erase(FromD);9557return ToDOrErr;9558}95599560llvm::Expected<InheritedConstructor>9561ASTImporter::Import(const InheritedConstructor &From) {9562return ASTNodeImporter(*this).ImportInheritedConstructor(From);9563}95649565Expected<DeclContext *> ASTImporter::ImportContext(DeclContext *FromDC) {9566if (!FromDC)9567return FromDC;95689569ExpectedDecl ToDCOrErr = Import(cast<Decl>(FromDC));9570if (!ToDCOrErr)9571return ToDCOrErr.takeError();9572auto *ToDC = cast<DeclContext>(*ToDCOrErr);95739574// When we're using a record/enum/Objective-C class/protocol as a context, we9575// need it to have a definition.9576if (auto *ToRecord = dyn_cast<RecordDecl>(ToDC)) {9577auto *FromRecord = cast<RecordDecl>(FromDC);9578if (ToRecord->isCompleteDefinition())9579return ToDC;95809581// If FromRecord is not defined we need to force it to be.9582// Simply calling CompleteDecl(...) for a RecordDecl will break some cases9583// it will start the definition but we never finish it.9584// If there are base classes they won't be imported and we will9585// be missing anything that we inherit from those bases.9586if (FromRecord->getASTContext().getExternalSource() &&9587!FromRecord->isCompleteDefinition())9588FromRecord->getASTContext().getExternalSource()->CompleteType(FromRecord);95899590if (FromRecord->isCompleteDefinition())9591if (Error Err = ASTNodeImporter(*this).ImportDefinition(9592FromRecord, ToRecord, ASTNodeImporter::IDK_Basic))9593return std::move(Err);9594} else if (auto *ToEnum = dyn_cast<EnumDecl>(ToDC)) {9595auto *FromEnum = cast<EnumDecl>(FromDC);9596if (ToEnum->isCompleteDefinition()) {9597// Do nothing.9598} else if (FromEnum->isCompleteDefinition()) {9599if (Error Err = ASTNodeImporter(*this).ImportDefinition(9600FromEnum, ToEnum, ASTNodeImporter::IDK_Basic))9601return std::move(Err);9602} else {9603CompleteDecl(ToEnum);9604}9605} else if (auto *ToClass = dyn_cast<ObjCInterfaceDecl>(ToDC)) {9606auto *FromClass = cast<ObjCInterfaceDecl>(FromDC);9607if (ToClass->getDefinition()) {9608// Do nothing.9609} else if (ObjCInterfaceDecl *FromDef = FromClass->getDefinition()) {9610if (Error Err = ASTNodeImporter(*this).ImportDefinition(9611FromDef, ToClass, ASTNodeImporter::IDK_Basic))9612return std::move(Err);9613} else {9614CompleteDecl(ToClass);9615}9616} else if (auto *ToProto = dyn_cast<ObjCProtocolDecl>(ToDC)) {9617auto *FromProto = cast<ObjCProtocolDecl>(FromDC);9618if (ToProto->getDefinition()) {9619// Do nothing.9620} else if (ObjCProtocolDecl *FromDef = FromProto->getDefinition()) {9621if (Error Err = ASTNodeImporter(*this).ImportDefinition(9622FromDef, ToProto, ASTNodeImporter::IDK_Basic))9623return std::move(Err);9624} else {9625CompleteDecl(ToProto);9626}9627}96289629return ToDC;9630}96319632Expected<Expr *> ASTImporter::Import(Expr *FromE) {9633if (ExpectedStmt ToSOrErr = Import(cast_or_null<Stmt>(FromE)))9634return cast_or_null<Expr>(*ToSOrErr);9635else9636return ToSOrErr.takeError();9637}96389639Expected<Stmt *> ASTImporter::Import(Stmt *FromS) {9640if (!FromS)9641return nullptr;96429643// Check whether we've already imported this statement.9644llvm::DenseMap<Stmt *, Stmt *>::iterator Pos = ImportedStmts.find(FromS);9645if (Pos != ImportedStmts.end())9646return Pos->second;96479648// Import the statement.9649ASTNodeImporter Importer(*this);9650ExpectedStmt ToSOrErr = Importer.Visit(FromS);9651if (!ToSOrErr)9652return ToSOrErr;96539654if (auto *ToE = dyn_cast<Expr>(*ToSOrErr)) {9655auto *FromE = cast<Expr>(FromS);9656// Copy ExprBitfields, which may not be handled in Expr subclasses9657// constructors.9658ToE->setValueKind(FromE->getValueKind());9659ToE->setObjectKind(FromE->getObjectKind());9660ToE->setDependence(FromE->getDependence());9661}96629663// Record the imported statement object.9664ImportedStmts[FromS] = *ToSOrErr;9665return ToSOrErr;9666}96679668Expected<NestedNameSpecifier *>9669ASTImporter::Import(NestedNameSpecifier *FromNNS) {9670if (!FromNNS)9671return nullptr;96729673NestedNameSpecifier *Prefix = nullptr;9674if (Error Err = importInto(Prefix, FromNNS->getPrefix()))9675return std::move(Err);96769677switch (FromNNS->getKind()) {9678case NestedNameSpecifier::Identifier:9679assert(FromNNS->getAsIdentifier() && "NNS should contain identifier.");9680return NestedNameSpecifier::Create(ToContext, Prefix,9681Import(FromNNS->getAsIdentifier()));96829683case NestedNameSpecifier::Namespace:9684if (ExpectedDecl NSOrErr = Import(FromNNS->getAsNamespace())) {9685return NestedNameSpecifier::Create(ToContext, Prefix,9686cast<NamespaceDecl>(*NSOrErr));9687} else9688return NSOrErr.takeError();96899690case NestedNameSpecifier::NamespaceAlias:9691if (ExpectedDecl NSADOrErr = Import(FromNNS->getAsNamespaceAlias()))9692return NestedNameSpecifier::Create(ToContext, Prefix,9693cast<NamespaceAliasDecl>(*NSADOrErr));9694else9695return NSADOrErr.takeError();96969697case NestedNameSpecifier::Global:9698return NestedNameSpecifier::GlobalSpecifier(ToContext);96999700case NestedNameSpecifier::Super:9701if (ExpectedDecl RDOrErr = Import(FromNNS->getAsRecordDecl()))9702return NestedNameSpecifier::SuperSpecifier(ToContext,9703cast<CXXRecordDecl>(*RDOrErr));9704else9705return RDOrErr.takeError();97069707case NestedNameSpecifier::TypeSpec:9708case NestedNameSpecifier::TypeSpecWithTemplate:9709if (ExpectedTypePtr TyOrErr = Import(FromNNS->getAsType())) {9710bool TSTemplate =9711FromNNS->getKind() == NestedNameSpecifier::TypeSpecWithTemplate;9712return NestedNameSpecifier::Create(ToContext, Prefix, TSTemplate,9713*TyOrErr);9714} else {9715return TyOrErr.takeError();9716}9717}97189719llvm_unreachable("Invalid nested name specifier kind");9720}97219722Expected<NestedNameSpecifierLoc>9723ASTImporter::Import(NestedNameSpecifierLoc FromNNS) {9724// Copied from NestedNameSpecifier mostly.9725SmallVector<NestedNameSpecifierLoc , 8> NestedNames;9726NestedNameSpecifierLoc NNS = FromNNS;97279728// Push each of the nested-name-specifiers's onto a stack for9729// serialization in reverse order.9730while (NNS) {9731NestedNames.push_back(NNS);9732NNS = NNS.getPrefix();9733}97349735NestedNameSpecifierLocBuilder Builder;97369737while (!NestedNames.empty()) {9738NNS = NestedNames.pop_back_val();9739NestedNameSpecifier *Spec = nullptr;9740if (Error Err = importInto(Spec, NNS.getNestedNameSpecifier()))9741return std::move(Err);97429743NestedNameSpecifier::SpecifierKind Kind = Spec->getKind();97449745SourceLocation ToLocalBeginLoc, ToLocalEndLoc;9746if (Kind != NestedNameSpecifier::Super) {9747if (Error Err = importInto(ToLocalBeginLoc, NNS.getLocalBeginLoc()))9748return std::move(Err);97499750if (Kind != NestedNameSpecifier::Global)9751if (Error Err = importInto(ToLocalEndLoc, NNS.getLocalEndLoc()))9752return std::move(Err);9753}97549755switch (Kind) {9756case NestedNameSpecifier::Identifier:9757Builder.Extend(getToContext(), Spec->getAsIdentifier(), ToLocalBeginLoc,9758ToLocalEndLoc);9759break;97609761case NestedNameSpecifier::Namespace:9762Builder.Extend(getToContext(), Spec->getAsNamespace(), ToLocalBeginLoc,9763ToLocalEndLoc);9764break;97659766case NestedNameSpecifier::NamespaceAlias:9767Builder.Extend(getToContext(), Spec->getAsNamespaceAlias(),9768ToLocalBeginLoc, ToLocalEndLoc);9769break;97709771case NestedNameSpecifier::TypeSpec:9772case NestedNameSpecifier::TypeSpecWithTemplate: {9773SourceLocation ToTLoc;9774if (Error Err = importInto(ToTLoc, NNS.getTypeLoc().getBeginLoc()))9775return std::move(Err);9776TypeSourceInfo *TSI = getToContext().getTrivialTypeSourceInfo(9777QualType(Spec->getAsType(), 0), ToTLoc);9778if (Kind == NestedNameSpecifier::TypeSpecWithTemplate)9779// ToLocalBeginLoc is here the location of the 'template' keyword.9780Builder.Extend(getToContext(), ToLocalBeginLoc, TSI->getTypeLoc(),9781ToLocalEndLoc);9782else9783// No location for 'template' keyword here.9784Builder.Extend(getToContext(), SourceLocation{}, TSI->getTypeLoc(),9785ToLocalEndLoc);9786break;9787}97889789case NestedNameSpecifier::Global:9790Builder.MakeGlobal(getToContext(), ToLocalBeginLoc);9791break;97929793case NestedNameSpecifier::Super: {9794auto ToSourceRangeOrErr = Import(NNS.getSourceRange());9795if (!ToSourceRangeOrErr)9796return ToSourceRangeOrErr.takeError();97979798Builder.MakeSuper(getToContext(), Spec->getAsRecordDecl(),9799ToSourceRangeOrErr->getBegin(),9800ToSourceRangeOrErr->getEnd());9801}9802}9803}98049805return Builder.getWithLocInContext(getToContext());9806}98079808Expected<TemplateName> ASTImporter::Import(TemplateName From) {9809switch (From.getKind()) {9810case TemplateName::Template:9811if (ExpectedDecl ToTemplateOrErr = Import(From.getAsTemplateDecl()))9812return TemplateName(cast<TemplateDecl>((*ToTemplateOrErr)->getCanonicalDecl()));9813else9814return ToTemplateOrErr.takeError();98159816case TemplateName::OverloadedTemplate: {9817OverloadedTemplateStorage *FromStorage = From.getAsOverloadedTemplate();9818UnresolvedSet<2> ToTemplates;9819for (auto *I : *FromStorage) {9820if (auto ToOrErr = Import(I))9821ToTemplates.addDecl(cast<NamedDecl>(*ToOrErr));9822else9823return ToOrErr.takeError();9824}9825return ToContext.getOverloadedTemplateName(ToTemplates.begin(),9826ToTemplates.end());9827}98289829case TemplateName::AssumedTemplate: {9830AssumedTemplateStorage *FromStorage = From.getAsAssumedTemplateName();9831auto DeclNameOrErr = Import(FromStorage->getDeclName());9832if (!DeclNameOrErr)9833return DeclNameOrErr.takeError();9834return ToContext.getAssumedTemplateName(*DeclNameOrErr);9835}98369837case TemplateName::QualifiedTemplate: {9838QualifiedTemplateName *QTN = From.getAsQualifiedTemplateName();9839auto QualifierOrErr = Import(QTN->getQualifier());9840if (!QualifierOrErr)9841return QualifierOrErr.takeError();9842auto TNOrErr = Import(QTN->getUnderlyingTemplate());9843if (!TNOrErr)9844return TNOrErr.takeError();9845return ToContext.getQualifiedTemplateName(9846*QualifierOrErr, QTN->hasTemplateKeyword(), *TNOrErr);9847}98489849case TemplateName::DependentTemplate: {9850DependentTemplateName *DTN = From.getAsDependentTemplateName();9851auto QualifierOrErr = Import(DTN->getQualifier());9852if (!QualifierOrErr)9853return QualifierOrErr.takeError();98549855if (DTN->isIdentifier()) {9856return ToContext.getDependentTemplateName(*QualifierOrErr,9857Import(DTN->getIdentifier()));9858}98599860return ToContext.getDependentTemplateName(*QualifierOrErr,9861DTN->getOperator());9862}98639864case TemplateName::SubstTemplateTemplateParm: {9865SubstTemplateTemplateParmStorage *Subst =9866From.getAsSubstTemplateTemplateParm();9867auto ReplacementOrErr = Import(Subst->getReplacement());9868if (!ReplacementOrErr)9869return ReplacementOrErr.takeError();98709871auto AssociatedDeclOrErr = Import(Subst->getAssociatedDecl());9872if (!AssociatedDeclOrErr)9873return AssociatedDeclOrErr.takeError();98749875return ToContext.getSubstTemplateTemplateParm(9876*ReplacementOrErr, *AssociatedDeclOrErr, Subst->getIndex(),9877Subst->getPackIndex());9878}98799880case TemplateName::SubstTemplateTemplateParmPack: {9881SubstTemplateTemplateParmPackStorage *SubstPack =9882From.getAsSubstTemplateTemplateParmPack();9883ASTNodeImporter Importer(*this);9884auto ArgPackOrErr =9885Importer.ImportTemplateArgument(SubstPack->getArgumentPack());9886if (!ArgPackOrErr)9887return ArgPackOrErr.takeError();98889889auto AssociatedDeclOrErr = Import(SubstPack->getAssociatedDecl());9890if (!AssociatedDeclOrErr)9891return AssociatedDeclOrErr.takeError();98929893return ToContext.getSubstTemplateTemplateParmPack(9894*ArgPackOrErr, *AssociatedDeclOrErr, SubstPack->getIndex(),9895SubstPack->getFinal());9896}9897case TemplateName::UsingTemplate: {9898auto UsingOrError = Import(From.getAsUsingShadowDecl());9899if (!UsingOrError)9900return UsingOrError.takeError();9901return TemplateName(cast<UsingShadowDecl>(*UsingOrError));9902}9903}99049905llvm_unreachable("Invalid template name kind");9906}99079908Expected<SourceLocation> ASTImporter::Import(SourceLocation FromLoc) {9909if (FromLoc.isInvalid())9910return SourceLocation{};99119912SourceManager &FromSM = FromContext.getSourceManager();9913bool IsBuiltin = FromSM.isWrittenInBuiltinFile(FromLoc);99149915std::pair<FileID, unsigned> Decomposed = FromSM.getDecomposedLoc(FromLoc);9916Expected<FileID> ToFileIDOrErr = Import(Decomposed.first, IsBuiltin);9917if (!ToFileIDOrErr)9918return ToFileIDOrErr.takeError();9919SourceManager &ToSM = ToContext.getSourceManager();9920return ToSM.getComposedLoc(*ToFileIDOrErr, Decomposed.second);9921}99229923Expected<SourceRange> ASTImporter::Import(SourceRange FromRange) {9924SourceLocation ToBegin, ToEnd;9925if (Error Err = importInto(ToBegin, FromRange.getBegin()))9926return std::move(Err);9927if (Error Err = importInto(ToEnd, FromRange.getEnd()))9928return std::move(Err);99299930return SourceRange(ToBegin, ToEnd);9931}99329933Expected<FileID> ASTImporter::Import(FileID FromID, bool IsBuiltin) {9934llvm::DenseMap<FileID, FileID>::iterator Pos = ImportedFileIDs.find(FromID);9935if (Pos != ImportedFileIDs.end())9936return Pos->second;99379938SourceManager &FromSM = FromContext.getSourceManager();9939SourceManager &ToSM = ToContext.getSourceManager();9940const SrcMgr::SLocEntry &FromSLoc = FromSM.getSLocEntry(FromID);99419942// Map the FromID to the "to" source manager.9943FileID ToID;9944if (FromSLoc.isExpansion()) {9945const SrcMgr::ExpansionInfo &FromEx = FromSLoc.getExpansion();9946ExpectedSLoc ToSpLoc = Import(FromEx.getSpellingLoc());9947if (!ToSpLoc)9948return ToSpLoc.takeError();9949ExpectedSLoc ToExLocS = Import(FromEx.getExpansionLocStart());9950if (!ToExLocS)9951return ToExLocS.takeError();9952unsigned ExLength = FromSM.getFileIDSize(FromID);9953SourceLocation MLoc;9954if (FromEx.isMacroArgExpansion()) {9955MLoc = ToSM.createMacroArgExpansionLoc(*ToSpLoc, *ToExLocS, ExLength);9956} else {9957if (ExpectedSLoc ToExLocE = Import(FromEx.getExpansionLocEnd()))9958MLoc = ToSM.createExpansionLoc(*ToSpLoc, *ToExLocS, *ToExLocE, ExLength,9959FromEx.isExpansionTokenRange());9960else9961return ToExLocE.takeError();9962}9963ToID = ToSM.getFileID(MLoc);9964} else {9965const SrcMgr::ContentCache *Cache = &FromSLoc.getFile().getContentCache();99669967if (!IsBuiltin && !Cache->BufferOverridden) {9968// Include location of this file.9969ExpectedSLoc ToIncludeLoc = Import(FromSLoc.getFile().getIncludeLoc());9970if (!ToIncludeLoc)9971return ToIncludeLoc.takeError();99729973// Every FileID that is not the main FileID needs to have a valid include9974// location so that the include chain points to the main FileID. When9975// importing the main FileID (which has no include location), we need to9976// create a fake include location in the main file to keep this property9977// intact.9978SourceLocation ToIncludeLocOrFakeLoc = *ToIncludeLoc;9979if (FromID == FromSM.getMainFileID())9980ToIncludeLocOrFakeLoc = ToSM.getLocForStartOfFile(ToSM.getMainFileID());99819982if (Cache->OrigEntry && Cache->OrigEntry->getDir()) {9983// FIXME: We probably want to use getVirtualFile(), so we don't hit the9984// disk again9985// FIXME: We definitely want to re-use the existing MemoryBuffer, rather9986// than mmap the files several times.9987auto Entry =9988ToFileManager.getOptionalFileRef(Cache->OrigEntry->getName());9989// FIXME: The filename may be a virtual name that does probably not9990// point to a valid file and we get no Entry here. In this case try with9991// the memory buffer below.9992if (Entry)9993ToID = ToSM.createFileID(*Entry, ToIncludeLocOrFakeLoc,9994FromSLoc.getFile().getFileCharacteristic());9995}9996}99979998if (ToID.isInvalid() || IsBuiltin) {9999// FIXME: We want to re-use the existing MemoryBuffer!10000std::optional<llvm::MemoryBufferRef> FromBuf =10001Cache->getBufferOrNone(FromContext.getDiagnostics(),10002FromSM.getFileManager(), SourceLocation{});10003if (!FromBuf)10004return llvm::make_error<ASTImportError>(ASTImportError::Unknown);1000510006std::unique_ptr<llvm::MemoryBuffer> ToBuf =10007llvm::MemoryBuffer::getMemBufferCopy(FromBuf->getBuffer(),10008FromBuf->getBufferIdentifier());10009ToID = ToSM.createFileID(std::move(ToBuf),10010FromSLoc.getFile().getFileCharacteristic());10011}10012}1001310014assert(ToID.isValid() && "Unexpected invalid fileID was created.");1001510016ImportedFileIDs[FromID] = ToID;10017return ToID;10018}1001910020Expected<CXXCtorInitializer *> ASTImporter::Import(CXXCtorInitializer *From) {10021ExpectedExpr ToExprOrErr = Import(From->getInit());10022if (!ToExprOrErr)10023return ToExprOrErr.takeError();1002410025auto LParenLocOrErr = Import(From->getLParenLoc());10026if (!LParenLocOrErr)10027return LParenLocOrErr.takeError();1002810029auto RParenLocOrErr = Import(From->getRParenLoc());10030if (!RParenLocOrErr)10031return RParenLocOrErr.takeError();1003210033if (From->isBaseInitializer()) {10034auto ToTInfoOrErr = Import(From->getTypeSourceInfo());10035if (!ToTInfoOrErr)10036return ToTInfoOrErr.takeError();1003710038SourceLocation EllipsisLoc;10039if (From->isPackExpansion())10040if (Error Err = importInto(EllipsisLoc, From->getEllipsisLoc()))10041return std::move(Err);1004210043return new (ToContext) CXXCtorInitializer(10044ToContext, *ToTInfoOrErr, From->isBaseVirtual(), *LParenLocOrErr,10045*ToExprOrErr, *RParenLocOrErr, EllipsisLoc);10046} else if (From->isMemberInitializer()) {10047ExpectedDecl ToFieldOrErr = Import(From->getMember());10048if (!ToFieldOrErr)10049return ToFieldOrErr.takeError();1005010051auto MemberLocOrErr = Import(From->getMemberLocation());10052if (!MemberLocOrErr)10053return MemberLocOrErr.takeError();1005410055return new (ToContext) CXXCtorInitializer(10056ToContext, cast_or_null<FieldDecl>(*ToFieldOrErr), *MemberLocOrErr,10057*LParenLocOrErr, *ToExprOrErr, *RParenLocOrErr);10058} else if (From->isIndirectMemberInitializer()) {10059ExpectedDecl ToIFieldOrErr = Import(From->getIndirectMember());10060if (!ToIFieldOrErr)10061return ToIFieldOrErr.takeError();1006210063auto MemberLocOrErr = Import(From->getMemberLocation());10064if (!MemberLocOrErr)10065return MemberLocOrErr.takeError();1006610067return new (ToContext) CXXCtorInitializer(10068ToContext, cast_or_null<IndirectFieldDecl>(*ToIFieldOrErr),10069*MemberLocOrErr, *LParenLocOrErr, *ToExprOrErr, *RParenLocOrErr);10070} else if (From->isDelegatingInitializer()) {10071auto ToTInfoOrErr = Import(From->getTypeSourceInfo());10072if (!ToTInfoOrErr)10073return ToTInfoOrErr.takeError();1007410075return new (ToContext)10076CXXCtorInitializer(ToContext, *ToTInfoOrErr, *LParenLocOrErr,10077*ToExprOrErr, *RParenLocOrErr);10078} else {10079// FIXME: assert?10080return make_error<ASTImportError>();10081}10082}1008310084Expected<CXXBaseSpecifier *>10085ASTImporter::Import(const CXXBaseSpecifier *BaseSpec) {10086auto Pos = ImportedCXXBaseSpecifiers.find(BaseSpec);10087if (Pos != ImportedCXXBaseSpecifiers.end())10088return Pos->second;1008910090Expected<SourceRange> ToSourceRange = Import(BaseSpec->getSourceRange());10091if (!ToSourceRange)10092return ToSourceRange.takeError();10093Expected<TypeSourceInfo *> ToTSI = Import(BaseSpec->getTypeSourceInfo());10094if (!ToTSI)10095return ToTSI.takeError();10096ExpectedSLoc ToEllipsisLoc = Import(BaseSpec->getEllipsisLoc());10097if (!ToEllipsisLoc)10098return ToEllipsisLoc.takeError();10099CXXBaseSpecifier *Imported = new (ToContext) CXXBaseSpecifier(10100*ToSourceRange, BaseSpec->isVirtual(), BaseSpec->isBaseOfClass(),10101BaseSpec->getAccessSpecifierAsWritten(), *ToTSI, *ToEllipsisLoc);10102ImportedCXXBaseSpecifiers[BaseSpec] = Imported;10103return Imported;10104}1010510106llvm::Expected<APValue> ASTImporter::Import(const APValue &FromValue) {10107ASTNodeImporter Importer(*this);10108return Importer.ImportAPValue(FromValue);10109}1011010111Error ASTImporter::ImportDefinition(Decl *From) {10112ExpectedDecl ToOrErr = Import(From);10113if (!ToOrErr)10114return ToOrErr.takeError();10115Decl *To = *ToOrErr;1011610117auto *FromDC = cast<DeclContext>(From);10118ASTNodeImporter Importer(*this);1011910120if (auto *ToRecord = dyn_cast<RecordDecl>(To)) {10121if (!ToRecord->getDefinition()) {10122return Importer.ImportDefinition(10123cast<RecordDecl>(FromDC), ToRecord,10124ASTNodeImporter::IDK_Everything);10125}10126}1012710128if (auto *ToEnum = dyn_cast<EnumDecl>(To)) {10129if (!ToEnum->getDefinition()) {10130return Importer.ImportDefinition(10131cast<EnumDecl>(FromDC), ToEnum, ASTNodeImporter::IDK_Everything);10132}10133}1013410135if (auto *ToIFace = dyn_cast<ObjCInterfaceDecl>(To)) {10136if (!ToIFace->getDefinition()) {10137return Importer.ImportDefinition(10138cast<ObjCInterfaceDecl>(FromDC), ToIFace,10139ASTNodeImporter::IDK_Everything);10140}10141}1014210143if (auto *ToProto = dyn_cast<ObjCProtocolDecl>(To)) {10144if (!ToProto->getDefinition()) {10145return Importer.ImportDefinition(10146cast<ObjCProtocolDecl>(FromDC), ToProto,10147ASTNodeImporter::IDK_Everything);10148}10149}1015010151return Importer.ImportDeclContext(FromDC, true);10152}1015310154Expected<DeclarationName> ASTImporter::Import(DeclarationName FromName) {10155if (!FromName)10156return DeclarationName{};1015710158switch (FromName.getNameKind()) {10159case DeclarationName::Identifier:10160return DeclarationName(Import(FromName.getAsIdentifierInfo()));1016110162case DeclarationName::ObjCZeroArgSelector:10163case DeclarationName::ObjCOneArgSelector:10164case DeclarationName::ObjCMultiArgSelector:10165if (auto ToSelOrErr = Import(FromName.getObjCSelector()))10166return DeclarationName(*ToSelOrErr);10167else10168return ToSelOrErr.takeError();1016910170case DeclarationName::CXXConstructorName: {10171if (auto ToTyOrErr = Import(FromName.getCXXNameType()))10172return ToContext.DeclarationNames.getCXXConstructorName(10173ToContext.getCanonicalType(*ToTyOrErr));10174else10175return ToTyOrErr.takeError();10176}1017710178case DeclarationName::CXXDestructorName: {10179if (auto ToTyOrErr = Import(FromName.getCXXNameType()))10180return ToContext.DeclarationNames.getCXXDestructorName(10181ToContext.getCanonicalType(*ToTyOrErr));10182else10183return ToTyOrErr.takeError();10184}1018510186case DeclarationName::CXXDeductionGuideName: {10187if (auto ToTemplateOrErr = Import(FromName.getCXXDeductionGuideTemplate()))10188return ToContext.DeclarationNames.getCXXDeductionGuideName(10189cast<TemplateDecl>(*ToTemplateOrErr));10190else10191return ToTemplateOrErr.takeError();10192}1019310194case DeclarationName::CXXConversionFunctionName: {10195if (auto ToTyOrErr = Import(FromName.getCXXNameType()))10196return ToContext.DeclarationNames.getCXXConversionFunctionName(10197ToContext.getCanonicalType(*ToTyOrErr));10198else10199return ToTyOrErr.takeError();10200}1020110202case DeclarationName::CXXOperatorName:10203return ToContext.DeclarationNames.getCXXOperatorName(10204FromName.getCXXOverloadedOperator());1020510206case DeclarationName::CXXLiteralOperatorName:10207return ToContext.DeclarationNames.getCXXLiteralOperatorName(10208Import(FromName.getCXXLiteralIdentifier()));1020910210case DeclarationName::CXXUsingDirective:10211// FIXME: STATICS!10212return DeclarationName::getUsingDirectiveName();10213}1021410215llvm_unreachable("Invalid DeclarationName Kind!");10216}1021710218IdentifierInfo *ASTImporter::Import(const IdentifierInfo *FromId) {10219if (!FromId)10220return nullptr;1022110222IdentifierInfo *ToId = &ToContext.Idents.get(FromId->getName());1022310224if (!ToId->getBuiltinID() && FromId->getBuiltinID())10225ToId->setBuiltinID(FromId->getBuiltinID());1022610227return ToId;10228}1022910230Expected<Selector> ASTImporter::Import(Selector FromSel) {10231if (FromSel.isNull())10232return Selector{};1023310234SmallVector<const IdentifierInfo *, 4> Idents;10235Idents.push_back(Import(FromSel.getIdentifierInfoForSlot(0)));10236for (unsigned I = 1, N = FromSel.getNumArgs(); I < N; ++I)10237Idents.push_back(Import(FromSel.getIdentifierInfoForSlot(I)));10238return ToContext.Selectors.getSelector(FromSel.getNumArgs(), Idents.data());10239}1024010241llvm::Expected<APValue>10242ASTNodeImporter::ImportAPValue(const APValue &FromValue) {10243APValue Result;10244llvm::Error Err = llvm::Error::success();10245auto ImportLoop = [&](const APValue *From, APValue *To, unsigned Size) {10246for (unsigned Idx = 0; Idx < Size; Idx++) {10247APValue Tmp = importChecked(Err, From[Idx]);10248To[Idx] = Tmp;10249}10250};10251switch (FromValue.getKind()) {10252case APValue::None:10253case APValue::Indeterminate:10254case APValue::Int:10255case APValue::Float:10256case APValue::FixedPoint:10257case APValue::ComplexInt:10258case APValue::ComplexFloat:10259Result = FromValue;10260break;10261case APValue::Vector: {10262Result.MakeVector();10263MutableArrayRef<APValue> Elts =10264Result.setVectorUninit(FromValue.getVectorLength());10265ImportLoop(((const APValue::Vec *)(const char *)&FromValue.Data)->Elts,10266Elts.data(), FromValue.getVectorLength());10267break;10268}10269case APValue::Array:10270Result.MakeArray(FromValue.getArrayInitializedElts(),10271FromValue.getArraySize());10272ImportLoop(((const APValue::Arr *)(const char *)&FromValue.Data)->Elts,10273((const APValue::Arr *)(const char *)&Result.Data)->Elts,10274FromValue.getArrayInitializedElts());10275break;10276case APValue::Struct:10277Result.MakeStruct(FromValue.getStructNumBases(),10278FromValue.getStructNumFields());10279ImportLoop(10280((const APValue::StructData *)(const char *)&FromValue.Data)->Elts,10281((const APValue::StructData *)(const char *)&Result.Data)->Elts,10282FromValue.getStructNumBases() + FromValue.getStructNumFields());10283break;10284case APValue::Union: {10285Result.MakeUnion();10286const Decl *ImpFDecl = importChecked(Err, FromValue.getUnionField());10287APValue ImpValue = importChecked(Err, FromValue.getUnionValue());10288if (Err)10289return std::move(Err);10290Result.setUnion(cast<FieldDecl>(ImpFDecl), ImpValue);10291break;10292}10293case APValue::AddrLabelDiff: {10294Result.MakeAddrLabelDiff();10295const Expr *ImpLHS = importChecked(Err, FromValue.getAddrLabelDiffLHS());10296const Expr *ImpRHS = importChecked(Err, FromValue.getAddrLabelDiffRHS());10297if (Err)10298return std::move(Err);10299Result.setAddrLabelDiff(cast<AddrLabelExpr>(ImpLHS),10300cast<AddrLabelExpr>(ImpRHS));10301break;10302}10303case APValue::MemberPointer: {10304const Decl *ImpMemPtrDecl =10305importChecked(Err, FromValue.getMemberPointerDecl());10306if (Err)10307return std::move(Err);10308MutableArrayRef<const CXXRecordDecl *> ToPath =10309Result.setMemberPointerUninit(10310cast<const ValueDecl>(ImpMemPtrDecl),10311FromValue.isMemberPointerToDerivedMember(),10312FromValue.getMemberPointerPath().size());10313llvm::ArrayRef<const CXXRecordDecl *> FromPath =10314Result.getMemberPointerPath();10315for (unsigned Idx = 0; Idx < FromValue.getMemberPointerPath().size();10316Idx++) {10317const Decl *ImpDecl = importChecked(Err, FromPath[Idx]);10318if (Err)10319return std::move(Err);10320ToPath[Idx] = cast<const CXXRecordDecl>(ImpDecl->getCanonicalDecl());10321}10322break;10323}10324case APValue::LValue:10325APValue::LValueBase Base;10326QualType FromElemTy;10327if (FromValue.getLValueBase()) {10328assert(!FromValue.getLValueBase().is<DynamicAllocLValue>() &&10329"in C++20 dynamic allocation are transient so they shouldn't "10330"appear in the AST");10331if (!FromValue.getLValueBase().is<TypeInfoLValue>()) {10332if (const auto *E =10333FromValue.getLValueBase().dyn_cast<const Expr *>()) {10334FromElemTy = E->getType();10335const Expr *ImpExpr = importChecked(Err, E);10336if (Err)10337return std::move(Err);10338Base = APValue::LValueBase(ImpExpr,10339FromValue.getLValueBase().getCallIndex(),10340FromValue.getLValueBase().getVersion());10341} else {10342FromElemTy =10343FromValue.getLValueBase().get<const ValueDecl *>()->getType();10344const Decl *ImpDecl = importChecked(10345Err, FromValue.getLValueBase().get<const ValueDecl *>());10346if (Err)10347return std::move(Err);10348Base = APValue::LValueBase(cast<ValueDecl>(ImpDecl),10349FromValue.getLValueBase().getCallIndex(),10350FromValue.getLValueBase().getVersion());10351}10352} else {10353FromElemTy = FromValue.getLValueBase().getTypeInfoType();10354const Type *ImpTypeInfo = importChecked(10355Err, FromValue.getLValueBase().get<TypeInfoLValue>().getType());10356QualType ImpType =10357importChecked(Err, FromValue.getLValueBase().getTypeInfoType());10358if (Err)10359return std::move(Err);10360Base = APValue::LValueBase::getTypeInfo(TypeInfoLValue(ImpTypeInfo),10361ImpType);10362}10363}10364CharUnits Offset = FromValue.getLValueOffset();10365unsigned PathLength = FromValue.getLValuePath().size();10366Result.MakeLValue();10367if (FromValue.hasLValuePath()) {10368MutableArrayRef<APValue::LValuePathEntry> ToPath = Result.setLValueUninit(10369Base, Offset, PathLength, FromValue.isLValueOnePastTheEnd(),10370FromValue.isNullPointer());10371llvm::ArrayRef<APValue::LValuePathEntry> FromPath =10372FromValue.getLValuePath();10373for (unsigned LoopIdx = 0; LoopIdx < PathLength; LoopIdx++) {10374if (FromElemTy->isRecordType()) {10375const Decl *FromDecl =10376FromPath[LoopIdx].getAsBaseOrMember().getPointer();10377const Decl *ImpDecl = importChecked(Err, FromDecl);10378if (Err)10379return std::move(Err);10380if (auto *RD = dyn_cast<CXXRecordDecl>(FromDecl))10381FromElemTy = Importer.FromContext.getRecordType(RD);10382else10383FromElemTy = cast<ValueDecl>(FromDecl)->getType();10384ToPath[LoopIdx] = APValue::LValuePathEntry(APValue::BaseOrMemberType(10385ImpDecl, FromPath[LoopIdx].getAsBaseOrMember().getInt()));10386} else {10387FromElemTy =10388Importer.FromContext.getAsArrayType(FromElemTy)->getElementType();10389ToPath[LoopIdx] = APValue::LValuePathEntry::ArrayIndex(10390FromPath[LoopIdx].getAsArrayIndex());10391}10392}10393} else10394Result.setLValue(Base, Offset, APValue::NoLValuePath{},10395FromValue.isNullPointer());10396}10397if (Err)10398return std::move(Err);10399return Result;10400}1040110402Expected<DeclarationName> ASTImporter::HandleNameConflict(DeclarationName Name,10403DeclContext *DC,10404unsigned IDNS,10405NamedDecl **Decls,10406unsigned NumDecls) {10407if (ODRHandling == ODRHandlingType::Conservative)10408// Report error at any name conflict.10409return make_error<ASTImportError>(ASTImportError::NameConflict);10410else10411// Allow to create the new Decl with the same name.10412return Name;10413}1041410415DiagnosticBuilder ASTImporter::ToDiag(SourceLocation Loc, unsigned DiagID) {10416if (LastDiagFromFrom)10417ToContext.getDiagnostics().notePriorDiagnosticFrom(10418FromContext.getDiagnostics());10419LastDiagFromFrom = false;10420return ToContext.getDiagnostics().Report(Loc, DiagID);10421}1042210423DiagnosticBuilder ASTImporter::FromDiag(SourceLocation Loc, unsigned DiagID) {10424if (!LastDiagFromFrom)10425FromContext.getDiagnostics().notePriorDiagnosticFrom(10426ToContext.getDiagnostics());10427LastDiagFromFrom = true;10428return FromContext.getDiagnostics().Report(Loc, DiagID);10429}1043010431void ASTImporter::CompleteDecl (Decl *D) {10432if (auto *ID = dyn_cast<ObjCInterfaceDecl>(D)) {10433if (!ID->getDefinition())10434ID->startDefinition();10435}10436else if (auto *PD = dyn_cast<ObjCProtocolDecl>(D)) {10437if (!PD->getDefinition())10438PD->startDefinition();10439}10440else if (auto *TD = dyn_cast<TagDecl>(D)) {10441if (!TD->getDefinition() && !TD->isBeingDefined()) {10442TD->startDefinition();10443TD->setCompleteDefinition(true);10444}10445}10446else {10447assert(0 && "CompleteDecl called on a Decl that can't be completed");10448}10449}1045010451Decl *ASTImporter::MapImported(Decl *From, Decl *To) {10452llvm::DenseMap<Decl *, Decl *>::iterator Pos = ImportedDecls.find(From);10453assert((Pos == ImportedDecls.end() || Pos->second == To) &&10454"Try to import an already imported Decl");10455if (Pos != ImportedDecls.end())10456return Pos->second;10457ImportedDecls[From] = To;10458// This mapping should be maintained only in this function. Therefore do not10459// check for additional consistency.10460ImportedFromDecls[To] = From;10461// In the case of TypedefNameDecl we create the Decl first and only then we10462// import and set its DeclContext. So, the DC is still not set when we reach10463// here from GetImportedOrCreateDecl.10464if (To->getDeclContext())10465AddToLookupTable(To);10466return To;10467}1046810469std::optional<ASTImportError>10470ASTImporter::getImportDeclErrorIfAny(Decl *FromD) const {10471auto Pos = ImportDeclErrors.find(FromD);10472if (Pos != ImportDeclErrors.end())10473return Pos->second;10474else10475return std::nullopt;10476}1047710478void ASTImporter::setImportDeclError(Decl *From, ASTImportError Error) {10479auto InsertRes = ImportDeclErrors.insert({From, Error});10480(void)InsertRes;10481// Either we set the error for the first time, or we already had set one and10482// now we want to set the same error.10483assert(InsertRes.second || InsertRes.first->second.Error == Error.Error);10484}1048510486bool ASTImporter::IsStructurallyEquivalent(QualType From, QualType To,10487bool Complain) {10488llvm::DenseMap<const Type *, const Type *>::iterator Pos =10489ImportedTypes.find(From.getTypePtr());10490if (Pos != ImportedTypes.end()) {10491if (ExpectedType ToFromOrErr = Import(From)) {10492if (ToContext.hasSameType(*ToFromOrErr, To))10493return true;10494} else {10495llvm::consumeError(ToFromOrErr.takeError());10496}10497}1049810499StructuralEquivalenceContext Ctx(FromContext, ToContext, NonEquivalentDecls,10500getStructuralEquivalenceKind(*this), false,10501Complain);10502return Ctx.IsEquivalent(From, To);10503}105041050510506