brintos

brintos / llvm-project-archived public Read only

0
0
Text · 398.0 KiB · c144174 Raw
10853 lines · cpp
1//===- ASTImporter.cpp - Importing ASTs from other Contexts ---------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9//  This file defines the ASTImporter class which imports AST nodes from one10//  context into another context.11//12//===----------------------------------------------------------------------===//13 14#include "clang/AST/ASTImporter.h"15#include "clang/AST/ASTContext.h"16#include "clang/AST/ASTDiagnostic.h"17#include "clang/AST/ASTImporterSharedState.h"18#include "clang/AST/ASTLambda.h"19#include "clang/AST/ASTStructuralEquivalence.h"20#include "clang/AST/Attr.h"21#include "clang/AST/Decl.h"22#include "clang/AST/DeclAccessPair.h"23#include "clang/AST/DeclBase.h"24#include "clang/AST/DeclCXX.h"25#include "clang/AST/DeclFriend.h"26#include "clang/AST/DeclGroup.h"27#include "clang/AST/DeclObjC.h"28#include "clang/AST/DeclTemplate.h"29#include "clang/AST/DeclVisitor.h"30#include "clang/AST/DeclarationName.h"31#include "clang/AST/Expr.h"32#include "clang/AST/ExprCXX.h"33#include "clang/AST/ExprObjC.h"34#include "clang/AST/ExternalASTSource.h"35#include "clang/AST/LambdaCapture.h"36#include "clang/AST/NestedNameSpecifier.h"37#include "clang/AST/OperationKinds.h"38#include "clang/AST/Stmt.h"39#include "clang/AST/StmtCXX.h"40#include "clang/AST/StmtObjC.h"41#include "clang/AST/StmtVisitor.h"42#include "clang/AST/TemplateBase.h"43#include "clang/AST/TemplateName.h"44#include "clang/AST/Type.h"45#include "clang/AST/TypeLoc.h"46#include "clang/AST/TypeVisitor.h"47#include "clang/AST/UnresolvedSet.h"48#include "clang/Basic/Builtins.h"49#include "clang/Basic/ExceptionSpecificationType.h"50#include "clang/Basic/FileManager.h"51#include "clang/Basic/IdentifierTable.h"52#include "clang/Basic/LLVM.h"53#include "clang/Basic/LangOptions.h"54#include "clang/Basic/SourceLocation.h"55#include "clang/Basic/SourceManager.h"56#include "clang/Basic/Specifiers.h"57#include "llvm/ADT/ArrayRef.h"58#include "llvm/ADT/DenseMap.h"59#include "llvm/ADT/STLExtras.h"60#include "llvm/ADT/ScopeExit.h"61#include "llvm/ADT/SmallVector.h"62#include "llvm/Support/ErrorHandling.h"63#include "llvm/Support/MemoryBuffer.h"64#include <algorithm>65#include <cassert>66#include <cstddef>67#include <memory>68#include <optional>69#include <type_traits>70#include <utility>71 72namespace clang {73 74  using llvm::make_error;75  using llvm::Error;76  using llvm::Expected;77  using ExpectedTypePtr = llvm::Expected<const Type *>;78  using ExpectedType = llvm::Expected<QualType>;79  using ExpectedStmt = llvm::Expected<Stmt *>;80  using ExpectedExpr = llvm::Expected<Expr *>;81  using ExpectedDecl = llvm::Expected<Decl *>;82  using ExpectedSLoc = llvm::Expected<SourceLocation>;83  using ExpectedName = llvm::Expected<DeclarationName>;84 85  std::string ASTImportError::toString() const {86    // FIXME: Improve error texts.87    switch (Error) {88    case NameConflict:89      return "NameConflict";90    case UnsupportedConstruct:91      return "UnsupportedConstruct";92    case Unknown:93      return "Unknown error";94    }95    llvm_unreachable("Invalid error code.");96    return "Invalid error code.";97  }98 99  void ASTImportError::log(raw_ostream &OS) const { OS << toString(); }100 101  std::error_code ASTImportError::convertToErrorCode() const {102    llvm_unreachable("Function not implemented.");103  }104 105  char ASTImportError::ID;106 107  template <class T>108  static SmallVector<Decl *, 2>109  getCanonicalForwardRedeclChain(Redeclarable<T> *D) {110    SmallVector<Decl *, 2> Redecls;111    for (auto *R : D->getFirstDecl()->redecls()) {112      if (R != D->getFirstDecl())113        Redecls.push_back(R);114    }115    Redecls.push_back(D->getFirstDecl());116    std::reverse(Redecls.begin(), Redecls.end());117    return Redecls;118  }119 120  SmallVector<Decl*, 2> getCanonicalForwardRedeclChain(Decl* D) {121    if (auto *FD = dyn_cast<FunctionDecl>(D))122      return getCanonicalForwardRedeclChain<FunctionDecl>(FD);123    if (auto *VD = dyn_cast<VarDecl>(D))124      return getCanonicalForwardRedeclChain<VarDecl>(VD);125    if (auto *TD = dyn_cast<TagDecl>(D))126      return getCanonicalForwardRedeclChain<TagDecl>(TD);127    llvm_unreachable("Bad declaration kind");128  }129 130  static void 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?133    if (From->isUsed(false) && !To->isUsed(false))134      To->setIsUsed();135  }136 137  /// How to handle import errors that occur when import of a child declaration138  /// of a DeclContext fails.139  class ChildErrorHandlingStrategy {140    /// This context is imported (in the 'from' domain).141    /// It is nullptr if a non-DeclContext is imported.142    const 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.)148    bool const IgnoreChildErrors;149 150  public:151    ChildErrorHandlingStrategy(const DeclContext *FromDC)152        : FromDC(FromDC), IgnoreChildErrors(!isa<TagDecl>(FromDC)) {}153    ChildErrorHandlingStrategy(const Decl *FromD)154        : FromDC(dyn_cast<DeclContext>(FromD)),155          IgnoreChildErrors(!isa<TagDecl>(FromD)) {}156 157    /// 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.161    void handleChildImportResult(Error &ResultErr, Error &&ChildErr) {162      if (ChildErr && !IgnoreChildErrors)163        ResultErr = joinErrors(std::move(ResultErr), std::move(ChildErr));164      else165        consumeError(std::move(ChildErr));166    }167 168    /// Determine if import failure of a child does not cause import failure of169    /// its parent.170    bool ignoreChildErrorOnParent(Decl *FromChildD) const {171      if (!IgnoreChildErrors || !FromDC)172        return false;173      return FromDC->containsDecl(FromChildD);174    }175  };176 177  class ASTNodeImporter : public TypeVisitor<ASTNodeImporter, ExpectedType>,178                          public DeclVisitor<ASTNodeImporter, ExpectedDecl>,179                          public StmtVisitor<ASTNodeImporter, ExpectedStmt> {180    ASTImporter &Importer;181 182    // Use this instead of Importer.importInto .183    template <typename ImportT>184    [[nodiscard]] Error importInto(ImportT &To, const ImportT &From) {185      return Importer.importInto(To, From);186    }187 188    // Use this to import pointers of specific type.189    template <typename ImportT>190    [[nodiscard]] Error importInto(ImportT *&To, ImportT *From) {191      auto ToOrErr = Importer.Import(From);192      if (ToOrErr)193        To = cast_or_null<ImportT>(*ToOrErr);194      return ToOrErr.takeError();195    }196 197    // Call the import function of ASTImporter for a baseclass of type `T` and198    // cast the return value to `T`.199    template <typename T>200    auto import(T *From)201        -> std::conditional_t<std::is_base_of_v<Type, T>, Expected<const T *>,202                              Expected<T *>> {203      auto ToOrErr = Importer.Import(From);204      if (!ToOrErr)205        return ToOrErr.takeError();206      return cast_or_null<T>(*ToOrErr);207    }208 209    template <typename T>210    auto import(const T *From) {211      return import(const_cast<T *>(From));212    }213 214    // Call the import function of ASTImporter for type `T`.215    template <typename T>216    Expected<T> import(const T &From) {217      return Importer.Import(From);218    }219 220    // Import an std::optional<T> by importing the contained T, if any.221    template <typename T>222    Expected<std::optional<T>> import(std::optional<T> From) {223      if (!From)224        return std::nullopt;225      return import(*From);226    }227 228    ExplicitSpecifier importExplicitSpecifier(Error &Err,229                                              ExplicitSpecifier ESpec);230 231    // Wrapper for an overload set.232    template <typename ToDeclT> struct CallOverloadedCreateFun {233      template <typename... Args> decltype(auto) operator()(Args &&... args) {234        return ToDeclT::Create(std::forward<Args>(args)...);235      }236    };237 238    // 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.244    template <typename ToDeclT, typename FromDeclT, typename... Args>245    [[nodiscard]] bool GetImportedOrCreateDecl(ToDeclT *&ToD, FromDeclT *FromD,246                                               Args &&...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.250      CallOverloadedCreateFun<ToDeclT> OC;251      return GetImportedOrCreateSpecialDecl(ToD, OC, FromD,252                                            std::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, ...);259    template <typename NewDeclT, typename ToDeclT, typename FromDeclT,260              typename... Args>261    [[nodiscard]] bool GetImportedOrCreateDecl(ToDeclT *&ToD, FromDeclT *FromD,262                                               Args &&...args) {263      CallOverloadedCreateFun<NewDeclT> OC;264      return GetImportedOrCreateSpecialDecl(ToD, OC, FromD,265                                            std::forward<Args>(args)...);266    }267    // Use this version if a special create function must be268    // used, e.g. CXXRecordDecl::CreateLambda .269    template <typename ToDeclT, typename CreateFunT, typename FromDeclT,270              typename... Args>271    [[nodiscard]] bool272    GetImportedOrCreateSpecialDecl(ToDeclT *&ToD, CreateFunT CreateFun,273                                   FromDeclT *FromD, Args &&...args) {274      if (Importer.getImportDeclErrorIfAny(FromD)) {275        ToD = nullptr;276        return true; // Already imported but with error.277      }278      ToD = cast_or_null<ToDeclT>(Importer.GetAlreadyImportedOrNull(FromD));279      if (ToD)280        return true; // Already imported.281      ToD = CreateFun(std::forward<Args>(args)...);282      // Keep track of imported Decls.283      Importer.RegisterImportedDecl(FromD, ToD);284      Importer.SharedState->markAsNewDecl(ToD);285      InitializeImportedDecl(FromD, ToD);286      return false; // A new Decl is created.287    }288 289    void InitializeImportedDecl(Decl *FromD, Decl *ToD) {290      ToD->IdentifierNamespace = FromD->IdentifierNamespace;291      if (FromD->isUsed())292        ToD->setIsUsed();293      if (FromD->isImplicit())294        ToD->setImplicit();295    }296 297    // Check if we have found an existing definition.  Returns with that298    // definition if yes, otherwise returns null.299    Decl *FindAndMapDefinition(FunctionDecl *D, FunctionDecl *FoundFunction) {300      const FunctionDecl *Definition = nullptr;301      if (D->doesThisDeclarationHaveABody() &&302          FoundFunction->hasBody(Definition))303        return Importer.MapImported(D, const_cast<FunctionDecl *>(Definition));304      return nullptr;305    }306 307    void addDeclToContexts(Decl *FromD, Decl *ToD) {308      if (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.312        if (!FromD->getDescribedTemplate() &&313            FromD->getFriendObjectKind() == Decl::FOK_None)314          ToD->getLexicalDeclContext()->addDeclInternal(ToD);315        return;316      }317 318      DeclContext *FromDC = FromD->getDeclContext();319      DeclContext *FromLexicalDC = FromD->getLexicalDeclContext();320      DeclContext *ToDC = ToD->getDeclContext();321      DeclContext *ToLexicalDC = ToD->getLexicalDeclContext();322 323      bool Visible = false;324      if (FromDC->containsDeclAndLoad(FromD)) {325        ToDC->addDeclInternal(ToD);326        Visible = true;327      }328      if (ToDC != ToLexicalDC && FromLexicalDC->containsDeclAndLoad(FromD)) {329        ToLexicalDC->addDeclInternal(ToD);330        Visible = true;331      }332 333      // If the Decl was added to any context, it was made already visible.334      // Otherwise it is still possible that it should be visible.335      if (!Visible) {336        if (auto *FromNamed = dyn_cast<NamedDecl>(FromD)) {337          auto *ToNamed = cast<NamedDecl>(ToD);338          DeclContextLookupResult FromLookup =339              FromDC->lookup(FromNamed->getDeclName());340          if (llvm::is_contained(FromLookup, FromNamed))341            ToDC->makeDeclVisibleInContext(ToNamed);342        }343      }344    }345 346    void updateLookupTableForTemplateParameters(TemplateParameterList &Params,347                                                DeclContext *OldDC) {348      ASTImporterLookupTable *LT = Importer.SharedState->getLookupTable();349      if (!LT)350        return;351 352      for (NamedDecl *TP : Params)353        LT->update(TP, OldDC);354    }355 356    void updateLookupTableForTemplateParameters(TemplateParameterList &Params) {357      updateLookupTableForTemplateParameters(358          Params, Importer.getToContext().getTranslationUnitDecl());359    }360 361    template <typename TemplateParmDeclT>362    Error importTemplateParameterDefaultArgument(const TemplateParmDeclT *D,363                                                 TemplateParmDeclT *ToD) {364      if (D->hasDefaultArgument()) {365        if (D->defaultArgumentWasInherited()) {366          Expected<TemplateParmDeclT *> ToInheritedFromOrErr =367              import(D->getDefaultArgStorage().getInheritedFrom());368          if (!ToInheritedFromOrErr)369            return ToInheritedFromOrErr.takeError();370          TemplateParmDeclT *ToInheritedFrom = *ToInheritedFromOrErr;371          if (!ToInheritedFrom->hasDefaultArgument()) {372            // Resolve possible circular dependency between default value of the373            // template argument and the template declaration.374            Expected<TemplateArgumentLoc> ToInheritedDefaultArgOrErr =375                import(D->getDefaultArgStorage()376                           .getInheritedFrom()377                           ->getDefaultArgument());378            if (!ToInheritedDefaultArgOrErr)379              return ToInheritedDefaultArgOrErr.takeError();380            ToInheritedFrom->setDefaultArgument(Importer.getToContext(),381                                                *ToInheritedDefaultArgOrErr);382          }383          ToD->setInheritedDefaultArgument(ToD->getASTContext(),384                                           ToInheritedFrom);385        } else {386          Expected<TemplateArgumentLoc> ToDefaultArgOrErr =387              import(D->getDefaultArgument());388          if (!ToDefaultArgOrErr)389            return ToDefaultArgOrErr.takeError();390          // Default argument could have been set in the391          // '!ToInheritedFrom->hasDefaultArgument()' branch above.392          if (!ToD->hasDefaultArgument())393            ToD->setDefaultArgument(Importer.getToContext(),394                                    *ToDefaultArgOrErr);395        }396      }397      return Error::success();398    }399 400  public:401    explicit ASTNodeImporter(ASTImporter &Importer) : Importer(Importer) {}402 403    using TypeVisitor<ASTNodeImporter, ExpectedType>::Visit;404    using DeclVisitor<ASTNodeImporter, ExpectedDecl>::Visit;405    using StmtVisitor<ASTNodeImporter, ExpectedStmt>::Visit;406 407    // Importing types408    ExpectedType VisitType(const Type *T);409#define TYPE(Class, Base)                                                    \410    ExpectedType Visit##Class##Type(const Class##Type *T);411#include "clang/AST/TypeNodes.inc"412 413    // Importing declarations414    Error ImportDeclParts(NamedDecl *D, DeclarationName &Name, NamedDecl *&ToD,415                          SourceLocation &Loc);416    Error ImportDeclParts(417        NamedDecl *D, DeclContext *&DC, DeclContext *&LexicalDC,418        DeclarationName &Name, NamedDecl *&ToD, SourceLocation &Loc);419    Error ImportDefinitionIfNeeded(Decl *FromD, Decl *ToD = nullptr);420    Error ImportDeclarationNameLoc(421        const DeclarationNameInfo &From, DeclarationNameInfo &To);422    Error ImportDeclContext(DeclContext *FromDC, bool ForceImport = false);423    Error ImportDeclContext(424        Decl *From, DeclContext *&ToDC, DeclContext *&ToLexicalDC);425    Error ImportImplicitMethods(const CXXRecordDecl *From, CXXRecordDecl *To);426 427    Error ImportFieldDeclDefinition(const FieldDecl *From, const FieldDecl *To);428    Expected<CXXCastPath> ImportCastPath(CastExpr *E);429    Expected<APValue> ImportAPValue(const APValue &FromValue);430 431    using Designator = DesignatedInitExpr::Designator;432 433    /// What we should import from the definition.434    enum ImportDefinitionKind {435      /// Import the default subset of the definition, which might be436      /// nothing (if minimal import is set) or might be everything (if minimal437      /// import is not set).438      IDK_Default,439      /// Import everything.440      IDK_Everything,441      /// Import only the bare bones needed to establish a valid442      /// DeclContext.443      IDK_Basic444    };445 446    bool shouldForceImportDeclContext(ImportDefinitionKind IDK) {447      return IDK == IDK_Everything ||448             (IDK == IDK_Default && !Importer.isMinimalImport());449    }450 451    Error ImportInitializer(VarDecl *From, VarDecl *To);452    Error ImportDefinition(453        RecordDecl *From, RecordDecl *To,454        ImportDefinitionKind Kind = IDK_Default);455    Error ImportDefinition(456        EnumDecl *From, EnumDecl *To,457        ImportDefinitionKind Kind = IDK_Default);458    Error ImportDefinition(459        ObjCInterfaceDecl *From, ObjCInterfaceDecl *To,460        ImportDefinitionKind Kind = IDK_Default);461    Error ImportDefinition(462        ObjCProtocolDecl *From, ObjCProtocolDecl *To,463        ImportDefinitionKind Kind = IDK_Default);464    Error ImportTemplateArguments(ArrayRef<TemplateArgument> FromArgs,465                                  SmallVectorImpl<TemplateArgument> &ToArgs);466    Expected<TemplateArgument>467    ImportTemplateArgument(const TemplateArgument &From);468 469    template <typename InContainerTy>470    Error ImportTemplateArgumentListInfo(471        const InContainerTy &Container, TemplateArgumentListInfo &ToTAInfo);472 473    template<typename InContainerTy>474    Error ImportTemplateArgumentListInfo(475      SourceLocation FromLAngleLoc, SourceLocation FromRAngleLoc,476      const InContainerTy &Container, TemplateArgumentListInfo &Result);477 478    using TemplateArgsTy = SmallVector<TemplateArgument, 8>;479    using FunctionTemplateAndArgsTy =480        std::tuple<FunctionTemplateDecl *, TemplateArgsTy>;481    Expected<FunctionTemplateAndArgsTy>482    ImportFunctionTemplateWithTemplateArgsFromSpecialization(483        FunctionDecl *FromFD);484 485    template <typename DeclTy>486    Error ImportTemplateParameterLists(const DeclTy *FromD, DeclTy *ToD);487 488    Error ImportTemplateInformation(FunctionDecl *FromFD, FunctionDecl *ToFD);489 490    Error ImportFunctionDeclBody(FunctionDecl *FromFD, FunctionDecl *ToFD);491 492    Error ImportDefaultArgOfParmVarDecl(const ParmVarDecl *FromParam,493                                        ParmVarDecl *ToParam);494 495    Expected<InheritedConstructor>496    ImportInheritedConstructor(const InheritedConstructor &From);497 498    // Use for allocating string for newly imported object.499    StringRef ImportASTStringRef(StringRef FromStr);500    Error ImportConstraintSatisfaction(const ASTConstraintSatisfaction &FromSat,501                                       ConstraintSatisfaction &ToSat);502    Expected<concepts::Requirement *>503    ImportTypeRequirement(concepts::TypeRequirement *From);504    Expected<concepts::Requirement *>505    ImportExprRequirement(concepts::ExprRequirement *From);506    Expected<concepts::Requirement *>507    ImportNestedRequirement(concepts::NestedRequirement *From);508 509    template <typename T>510    bool hasSameVisibilityContextAndLinkage(T *Found, T *From);511 512    bool IsStructuralMatch(Decl *From, Decl *To, bool Complain = true,513                           bool IgnoreTemplateParmDepth = false);514    ExpectedDecl VisitDecl(Decl *D);515    ExpectedDecl VisitImportDecl(ImportDecl *D);516    ExpectedDecl VisitEmptyDecl(EmptyDecl *D);517    ExpectedDecl VisitAccessSpecDecl(AccessSpecDecl *D);518    ExpectedDecl VisitStaticAssertDecl(StaticAssertDecl *D);519    ExpectedDecl VisitTranslationUnitDecl(TranslationUnitDecl *D);520    ExpectedDecl VisitBindingDecl(BindingDecl *D);521    ExpectedDecl VisitNamespaceDecl(NamespaceDecl *D);522    ExpectedDecl VisitNamespaceAliasDecl(NamespaceAliasDecl *D);523    ExpectedDecl VisitTypedefNameDecl(TypedefNameDecl *D, bool IsAlias);524    ExpectedDecl VisitTypedefDecl(TypedefDecl *D);525    ExpectedDecl VisitTypeAliasDecl(TypeAliasDecl *D);526    ExpectedDecl VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D);527    ExpectedDecl VisitLabelDecl(LabelDecl *D);528    ExpectedDecl VisitEnumDecl(EnumDecl *D);529    ExpectedDecl VisitRecordDecl(RecordDecl *D);530    ExpectedDecl VisitEnumConstantDecl(EnumConstantDecl *D);531    ExpectedDecl VisitFunctionDecl(FunctionDecl *D);532    ExpectedDecl VisitCXXMethodDecl(CXXMethodDecl *D);533    ExpectedDecl VisitCXXConstructorDecl(CXXConstructorDecl *D);534    ExpectedDecl VisitCXXDestructorDecl(CXXDestructorDecl *D);535    ExpectedDecl VisitCXXConversionDecl(CXXConversionDecl *D);536    ExpectedDecl VisitCXXDeductionGuideDecl(CXXDeductionGuideDecl *D);537    ExpectedDecl VisitFieldDecl(FieldDecl *D);538    ExpectedDecl VisitIndirectFieldDecl(IndirectFieldDecl *D);539    ExpectedDecl VisitFriendDecl(FriendDecl *D);540    ExpectedDecl VisitObjCIvarDecl(ObjCIvarDecl *D);541    ExpectedDecl VisitVarDecl(VarDecl *D);542    ExpectedDecl VisitImplicitParamDecl(ImplicitParamDecl *D);543    ExpectedDecl VisitParmVarDecl(ParmVarDecl *D);544    ExpectedDecl VisitObjCMethodDecl(ObjCMethodDecl *D);545    ExpectedDecl VisitObjCTypeParamDecl(ObjCTypeParamDecl *D);546    ExpectedDecl VisitObjCCategoryDecl(ObjCCategoryDecl *D);547    ExpectedDecl VisitObjCProtocolDecl(ObjCProtocolDecl *D);548    ExpectedDecl VisitLinkageSpecDecl(LinkageSpecDecl *D);549    ExpectedDecl VisitUsingDecl(UsingDecl *D);550    ExpectedDecl VisitUsingShadowDecl(UsingShadowDecl *D);551    ExpectedDecl VisitUsingDirectiveDecl(UsingDirectiveDecl *D);552    ExpectedDecl VisitUsingPackDecl(UsingPackDecl *D);553    ExpectedDecl ImportUsingShadowDecls(BaseUsingDecl *D, BaseUsingDecl *ToSI);554    ExpectedDecl VisitUsingEnumDecl(UsingEnumDecl *D);555    ExpectedDecl VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D);556    ExpectedDecl VisitUnresolvedUsingTypenameDecl(UnresolvedUsingTypenameDecl *D);557    ExpectedDecl VisitBuiltinTemplateDecl(BuiltinTemplateDecl *D);558    ExpectedDecl559    VisitLifetimeExtendedTemporaryDecl(LifetimeExtendedTemporaryDecl *D);560 561    Expected<ObjCTypeParamList *>562    ImportObjCTypeParamList(ObjCTypeParamList *list);563 564    ExpectedDecl VisitObjCInterfaceDecl(ObjCInterfaceDecl *D);565    ExpectedDecl VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D);566    ExpectedDecl VisitObjCImplementationDecl(ObjCImplementationDecl *D);567    ExpectedDecl VisitObjCPropertyDecl(ObjCPropertyDecl *D);568    ExpectedDecl VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D);569    ExpectedDecl VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D);570    ExpectedDecl VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D);571    ExpectedDecl VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D);572    ExpectedDecl VisitClassTemplateDecl(ClassTemplateDecl *D);573    ExpectedDecl VisitClassTemplateSpecializationDecl(574                                            ClassTemplateSpecializationDecl *D);575    ExpectedDecl VisitVarTemplateDecl(VarTemplateDecl *D);576    ExpectedDecl VisitVarTemplateSpecializationDecl(VarTemplateSpecializationDecl *D);577    ExpectedDecl VisitFunctionTemplateDecl(FunctionTemplateDecl *D);578    ExpectedDecl VisitConceptDecl(ConceptDecl* D);579    ExpectedDecl VisitRequiresExprBodyDecl(RequiresExprBodyDecl* E);580    ExpectedDecl VisitImplicitConceptSpecializationDecl(ImplicitConceptSpecializationDecl* D);581 582    // Importing statements583    ExpectedStmt VisitStmt(Stmt *S);584    ExpectedStmt VisitGCCAsmStmt(GCCAsmStmt *S);585    ExpectedStmt VisitDeclStmt(DeclStmt *S);586    ExpectedStmt VisitNullStmt(NullStmt *S);587    ExpectedStmt VisitCompoundStmt(CompoundStmt *S);588    ExpectedStmt VisitCaseStmt(CaseStmt *S);589    ExpectedStmt VisitDefaultStmt(DefaultStmt *S);590    ExpectedStmt VisitLabelStmt(LabelStmt *S);591    ExpectedStmt VisitAttributedStmt(AttributedStmt *S);592    ExpectedStmt VisitIfStmt(IfStmt *S);593    ExpectedStmt VisitSwitchStmt(SwitchStmt *S);594    ExpectedStmt VisitWhileStmt(WhileStmt *S);595    ExpectedStmt VisitDoStmt(DoStmt *S);596    ExpectedStmt VisitForStmt(ForStmt *S);597    ExpectedStmt VisitGotoStmt(GotoStmt *S);598    ExpectedStmt VisitIndirectGotoStmt(IndirectGotoStmt *S);599    ExpectedStmt VisitContinueStmt(ContinueStmt *S);600    ExpectedStmt VisitBreakStmt(BreakStmt *S);601    ExpectedStmt VisitReturnStmt(ReturnStmt *S);602    // FIXME: MSAsmStmt603    // FIXME: SEHExceptStmt604    // FIXME: SEHFinallyStmt605    // FIXME: SEHTryStmt606    // FIXME: SEHLeaveStmt607    // FIXME: CapturedStmt608    ExpectedStmt VisitCXXCatchStmt(CXXCatchStmt *S);609    ExpectedStmt VisitCXXTryStmt(CXXTryStmt *S);610    ExpectedStmt VisitCXXForRangeStmt(CXXForRangeStmt *S);611    // FIXME: MSDependentExistsStmt612    ExpectedStmt VisitObjCForCollectionStmt(ObjCForCollectionStmt *S);613    ExpectedStmt VisitObjCAtCatchStmt(ObjCAtCatchStmt *S);614    ExpectedStmt VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S);615    ExpectedStmt VisitObjCAtTryStmt(ObjCAtTryStmt *S);616    ExpectedStmt VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *S);617    ExpectedStmt VisitObjCAtThrowStmt(ObjCAtThrowStmt *S);618    ExpectedStmt VisitObjCAutoreleasePoolStmt(ObjCAutoreleasePoolStmt *S);619 620    // Importing expressions621    ExpectedStmt VisitExpr(Expr *E);622    ExpectedStmt VisitSourceLocExpr(SourceLocExpr *E);623    ExpectedStmt VisitVAArgExpr(VAArgExpr *E);624    ExpectedStmt VisitChooseExpr(ChooseExpr *E);625    ExpectedStmt VisitConvertVectorExpr(ConvertVectorExpr *E);626    ExpectedStmt VisitShuffleVectorExpr(ShuffleVectorExpr *E);627    ExpectedStmt VisitGNUNullExpr(GNUNullExpr *E);628    ExpectedStmt VisitGenericSelectionExpr(GenericSelectionExpr *E);629    ExpectedStmt VisitPredefinedExpr(PredefinedExpr *E);630    ExpectedStmt VisitDeclRefExpr(DeclRefExpr *E);631    ExpectedStmt VisitImplicitValueInitExpr(ImplicitValueInitExpr *E);632    ExpectedStmt VisitDesignatedInitExpr(DesignatedInitExpr *E);633    ExpectedStmt VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E);634    ExpectedStmt VisitIntegerLiteral(IntegerLiteral *E);635    ExpectedStmt VisitFloatingLiteral(FloatingLiteral *E);636    ExpectedStmt VisitImaginaryLiteral(ImaginaryLiteral *E);637    ExpectedStmt VisitFixedPointLiteral(FixedPointLiteral *E);638    ExpectedStmt VisitCharacterLiteral(CharacterLiteral *E);639    ExpectedStmt VisitStringLiteral(StringLiteral *E);640    ExpectedStmt VisitCompoundLiteralExpr(CompoundLiteralExpr *E);641    ExpectedStmt VisitAtomicExpr(AtomicExpr *E);642    ExpectedStmt VisitAddrLabelExpr(AddrLabelExpr *E);643    ExpectedStmt VisitConstantExpr(ConstantExpr *E);644    ExpectedStmt VisitParenExpr(ParenExpr *E);645    ExpectedStmt VisitParenListExpr(ParenListExpr *E);646    ExpectedStmt VisitStmtExpr(StmtExpr *E);647    ExpectedStmt VisitUnaryOperator(UnaryOperator *E);648    ExpectedStmt VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *E);649    ExpectedStmt VisitBinaryOperator(BinaryOperator *E);650    ExpectedStmt VisitConditionalOperator(ConditionalOperator *E);651    ExpectedStmt VisitBinaryConditionalOperator(BinaryConditionalOperator *E);652    ExpectedStmt VisitCXXRewrittenBinaryOperator(CXXRewrittenBinaryOperator *E);653    ExpectedStmt VisitOpaqueValueExpr(OpaqueValueExpr *E);654    ExpectedStmt VisitArrayTypeTraitExpr(ArrayTypeTraitExpr *E);655    ExpectedStmt VisitExpressionTraitExpr(ExpressionTraitExpr *E);656    ExpectedStmt VisitArraySubscriptExpr(ArraySubscriptExpr *E);657    ExpectedStmt VisitCompoundAssignOperator(CompoundAssignOperator *E);658    ExpectedStmt VisitImplicitCastExpr(ImplicitCastExpr *E);659    ExpectedStmt VisitExplicitCastExpr(ExplicitCastExpr *E);660    ExpectedStmt VisitOffsetOfExpr(OffsetOfExpr *OE);661    ExpectedStmt VisitCXXThrowExpr(CXXThrowExpr *E);662    ExpectedStmt VisitCXXNoexceptExpr(CXXNoexceptExpr *E);663    ExpectedStmt VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E);664    ExpectedStmt VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E);665    ExpectedStmt VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E);666    ExpectedStmt VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E);667    ExpectedStmt VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *E);668    ExpectedStmt VisitPackExpansionExpr(PackExpansionExpr *E);669    ExpectedStmt VisitSizeOfPackExpr(SizeOfPackExpr *E);670    ExpectedStmt VisitCXXNewExpr(CXXNewExpr *E);671    ExpectedStmt VisitCXXDeleteExpr(CXXDeleteExpr *E);672    ExpectedStmt VisitCXXConstructExpr(CXXConstructExpr *E);673    ExpectedStmt VisitCXXMemberCallExpr(CXXMemberCallExpr *E);674    ExpectedStmt VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E);675    ExpectedStmt VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E);676    ExpectedStmt VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr *E);677    ExpectedStmt VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E);678    ExpectedStmt VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E);679    ExpectedStmt VisitExprWithCleanups(ExprWithCleanups *E);680    ExpectedStmt VisitCXXThisExpr(CXXThisExpr *E);681    ExpectedStmt VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E);682    ExpectedStmt VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E);683    ExpectedStmt VisitMemberExpr(MemberExpr *E);684    ExpectedStmt VisitCallExpr(CallExpr *E);685    ExpectedStmt VisitLambdaExpr(LambdaExpr *LE);686    ExpectedStmt VisitInitListExpr(InitListExpr *E);687    ExpectedStmt VisitCXXStdInitializerListExpr(CXXStdInitializerListExpr *E);688    ExpectedStmt VisitCXXInheritedCtorInitExpr(CXXInheritedCtorInitExpr *E);689    ExpectedStmt VisitArrayInitLoopExpr(ArrayInitLoopExpr *E);690    ExpectedStmt VisitArrayInitIndexExpr(ArrayInitIndexExpr *E);691    ExpectedStmt VisitCXXDefaultInitExpr(CXXDefaultInitExpr *E);692    ExpectedStmt VisitCXXNamedCastExpr(CXXNamedCastExpr *E);693    ExpectedStmt VisitSubstNonTypeTemplateParmExpr(SubstNonTypeTemplateParmExpr *E);694    ExpectedStmt VisitTypeTraitExpr(TypeTraitExpr *E);695    ExpectedStmt VisitCXXTypeidExpr(CXXTypeidExpr *E);696    ExpectedStmt VisitCXXFoldExpr(CXXFoldExpr *E);697    ExpectedStmt VisitRequiresExpr(RequiresExpr* E);698    ExpectedStmt VisitConceptSpecializationExpr(ConceptSpecializationExpr* E);699    ExpectedStmt700    VisitSubstNonTypeTemplateParmPackExpr(SubstNonTypeTemplateParmPackExpr *E);701    ExpectedStmt VisitPseudoObjectExpr(PseudoObjectExpr *E);702    ExpectedStmt VisitCXXParenListInitExpr(CXXParenListInitExpr *E);703 704    // Helper for chaining together multiple imports. If an error is detected,705    // subsequent imports will return default constructed nodes, so that failure706    // can be detected with a single conditional branch after a sequence of707    // imports.708    template <typename T> T importChecked(Error &Err, const T &From) {709      // Don't attempt to import nodes if we hit an error earlier.710      if (Err)711        return T{};712      Expected<T> MaybeVal = import(From);713      if (!MaybeVal) {714        Err = MaybeVal.takeError();715        return T{};716      }717      return *MaybeVal;718    }719 720    template<typename IIter, typename OIter>721    Error ImportArrayChecked(IIter Ibegin, IIter Iend, OIter Obegin) {722      using ItemT = std::remove_reference_t<decltype(*Obegin)>;723      for (; Ibegin != Iend; ++Ibegin, ++Obegin) {724        Expected<ItemT> ToOrErr = import(*Ibegin);725        if (!ToOrErr)726          return ToOrErr.takeError();727        *Obegin = *ToOrErr;728      }729      return Error::success();730    }731 732    // Import every item from a container structure into an output container.733    // If error occurs, stops at first error and returns the error.734    // The output container should have space for all needed elements (it is not735    // expanded, new items are put into from the beginning).736    template<typename InContainerTy, typename OutContainerTy>737    Error ImportContainerChecked(738        const InContainerTy &InContainer, OutContainerTy &OutContainer) {739      return ImportArrayChecked(740          InContainer.begin(), InContainer.end(), OutContainer.begin());741    }742 743    template<typename InContainerTy, typename OIter>744    Error ImportArrayChecked(const InContainerTy &InContainer, OIter Obegin) {745      return ImportArrayChecked(InContainer.begin(), InContainer.end(), Obegin);746    }747 748    Error ImportOverriddenMethods(CXXMethodDecl *ToMethod,749                                  CXXMethodDecl *FromMethod);750 751    Expected<FunctionDecl *> FindFunctionTemplateSpecialization(752        FunctionDecl *FromFD);753 754    // Returns true if the given function has a placeholder return type and755    // that type is declared inside the body of the function.756    // E.g. auto f() { struct X{}; return X(); }757    bool hasReturnTypeDeclaredInside(FunctionDecl *D);758  };759 760template <typename InContainerTy>761Error ASTNodeImporter::ImportTemplateArgumentListInfo(762    SourceLocation FromLAngleLoc, SourceLocation FromRAngleLoc,763    const InContainerTy &Container, TemplateArgumentListInfo &Result) {764  auto ToLAngleLocOrErr = import(FromLAngleLoc);765  if (!ToLAngleLocOrErr)766    return ToLAngleLocOrErr.takeError();767  auto ToRAngleLocOrErr = import(FromRAngleLoc);768  if (!ToRAngleLocOrErr)769    return ToRAngleLocOrErr.takeError();770 771  TemplateArgumentListInfo ToTAInfo(*ToLAngleLocOrErr, *ToRAngleLocOrErr);772  if (auto Err = ImportTemplateArgumentListInfo(Container, ToTAInfo))773    return Err;774  Result = ToTAInfo;775  return Error::success();776}777 778template <>779Error ASTNodeImporter::ImportTemplateArgumentListInfo<TemplateArgumentListInfo>(780    const TemplateArgumentListInfo &From, TemplateArgumentListInfo &Result) {781  return ImportTemplateArgumentListInfo(782      From.getLAngleLoc(), From.getRAngleLoc(), From.arguments(), Result);783}784 785template <>786Error ASTNodeImporter::ImportTemplateArgumentListInfo<787    ASTTemplateArgumentListInfo>(788        const ASTTemplateArgumentListInfo &From,789        TemplateArgumentListInfo &Result) {790  return ImportTemplateArgumentListInfo(791      From.LAngleLoc, From.RAngleLoc, From.arguments(), Result);792}793 794Expected<ASTNodeImporter::FunctionTemplateAndArgsTy>795ASTNodeImporter::ImportFunctionTemplateWithTemplateArgsFromSpecialization(796    FunctionDecl *FromFD) {797  assert(FromFD->getTemplatedKind() ==798      FunctionDecl::TK_FunctionTemplateSpecialization);799 800  FunctionTemplateAndArgsTy Result;801 802  auto *FTSInfo = FromFD->getTemplateSpecializationInfo();803  if (Error Err = importInto(std::get<0>(Result), FTSInfo->getTemplate()))804    return std::move(Err);805 806  // Import template arguments.807  if (Error Err = ImportTemplateArguments(FTSInfo->TemplateArguments->asArray(),808                                          std::get<1>(Result)))809    return std::move(Err);810 811  return Result;812}813 814template <>815Expected<TemplateParameterList *>816ASTNodeImporter::import(TemplateParameterList *From) {817  SmallVector<NamedDecl *, 4> To(From->size());818  if (Error Err = ImportContainerChecked(*From, To))819    return std::move(Err);820 821  ExpectedExpr ToRequiresClause = import(From->getRequiresClause());822  if (!ToRequiresClause)823    return ToRequiresClause.takeError();824 825  auto ToTemplateLocOrErr = import(From->getTemplateLoc());826  if (!ToTemplateLocOrErr)827    return ToTemplateLocOrErr.takeError();828  auto ToLAngleLocOrErr = import(From->getLAngleLoc());829  if (!ToLAngleLocOrErr)830    return ToLAngleLocOrErr.takeError();831  auto ToRAngleLocOrErr = import(From->getRAngleLoc());832  if (!ToRAngleLocOrErr)833    return ToRAngleLocOrErr.takeError();834 835  return TemplateParameterList::Create(836      Importer.getToContext(),837      *ToTemplateLocOrErr,838      *ToLAngleLocOrErr,839      To,840      *ToRAngleLocOrErr,841      *ToRequiresClause);842}843 844template <>845Expected<TemplateArgument>846ASTNodeImporter::import(const TemplateArgument &From) {847  switch (From.getKind()) {848  case TemplateArgument::Null:849    return TemplateArgument();850 851  case TemplateArgument::Type: {852    ExpectedType ToTypeOrErr = import(From.getAsType());853    if (!ToTypeOrErr)854      return ToTypeOrErr.takeError();855    return TemplateArgument(*ToTypeOrErr, /*isNullPtr*/ false,856                            From.getIsDefaulted());857  }858 859  case TemplateArgument::Integral: {860    ExpectedType ToTypeOrErr = import(From.getIntegralType());861    if (!ToTypeOrErr)862      return ToTypeOrErr.takeError();863    return TemplateArgument(From, *ToTypeOrErr);864  }865 866  case TemplateArgument::Declaration: {867    Expected<ValueDecl *> ToOrErr = import(From.getAsDecl());868    if (!ToOrErr)869      return ToOrErr.takeError();870    ExpectedType ToTypeOrErr = import(From.getParamTypeForDecl());871    if (!ToTypeOrErr)872      return ToTypeOrErr.takeError();873    return TemplateArgument(dyn_cast<ValueDecl>((*ToOrErr)->getCanonicalDecl()),874                            *ToTypeOrErr, From.getIsDefaulted());875  }876 877  case TemplateArgument::NullPtr: {878    ExpectedType ToTypeOrErr = import(From.getNullPtrType());879    if (!ToTypeOrErr)880      return ToTypeOrErr.takeError();881    return TemplateArgument(*ToTypeOrErr, /*isNullPtr*/ true,882                            From.getIsDefaulted());883  }884 885  case TemplateArgument::StructuralValue: {886    ExpectedType ToTypeOrErr = import(From.getStructuralValueType());887    if (!ToTypeOrErr)888      return ToTypeOrErr.takeError();889    Expected<APValue> ToValueOrErr = import(From.getAsStructuralValue());890    if (!ToValueOrErr)891      return ToValueOrErr.takeError();892    return TemplateArgument(Importer.getToContext(), *ToTypeOrErr,893                            *ToValueOrErr);894  }895 896  case TemplateArgument::Template: {897    Expected<TemplateName> ToTemplateOrErr = import(From.getAsTemplate());898    if (!ToTemplateOrErr)899      return ToTemplateOrErr.takeError();900 901    return TemplateArgument(*ToTemplateOrErr, From.getIsDefaulted());902  }903 904  case TemplateArgument::TemplateExpansion: {905    Expected<TemplateName> ToTemplateOrErr =906        import(From.getAsTemplateOrTemplatePattern());907    if (!ToTemplateOrErr)908      return ToTemplateOrErr.takeError();909 910    return TemplateArgument(*ToTemplateOrErr, From.getNumTemplateExpansions(),911                            From.getIsDefaulted());912  }913 914  case TemplateArgument::Expression:915    if (ExpectedExpr ToExpr = import(From.getAsExpr()))916      return TemplateArgument(*ToExpr, From.isCanonicalExpr(),917                              From.getIsDefaulted());918    else919      return ToExpr.takeError();920 921  case TemplateArgument::Pack: {922    SmallVector<TemplateArgument, 2> ToPack;923    ToPack.reserve(From.pack_size());924    if (Error Err = ImportTemplateArguments(From.pack_elements(), ToPack))925      return std::move(Err);926 927    return TemplateArgument(ArrayRef(ToPack).copy(Importer.getToContext()));928  }929  }930 931  llvm_unreachable("Invalid template argument kind");932}933 934template <>935Expected<TemplateArgumentLoc>936ASTNodeImporter::import(const TemplateArgumentLoc &TALoc) {937  Expected<TemplateArgument> ArgOrErr = import(TALoc.getArgument());938  if (!ArgOrErr)939    return ArgOrErr.takeError();940  TemplateArgument Arg = *ArgOrErr;941 942  TemplateArgumentLocInfo FromInfo = TALoc.getLocInfo();943 944  TemplateArgumentLocInfo ToInfo;945  if (Arg.getKind() == TemplateArgument::Expression) {946    ExpectedExpr E = import(FromInfo.getAsExpr());947    if (!E)948      return E.takeError();949    ToInfo = TemplateArgumentLocInfo(*E);950  } else if (Arg.getKind() == TemplateArgument::Type) {951    if (auto TSIOrErr = import(FromInfo.getAsTypeSourceInfo()))952      ToInfo = TemplateArgumentLocInfo(*TSIOrErr);953    else954      return TSIOrErr.takeError();955  } else {956    auto ToTemplateKWLocOrErr = import(FromInfo.getTemplateKwLoc());957    if (!ToTemplateKWLocOrErr)958      return ToTemplateKWLocOrErr.takeError();959    auto ToTemplateQualifierLocOrErr = import(TALoc.getTemplateQualifierLoc());960    if (!ToTemplateQualifierLocOrErr)961      return ToTemplateQualifierLocOrErr.takeError();962    auto ToTemplateNameLocOrErr = import(FromInfo.getTemplateNameLoc());963    if (!ToTemplateNameLocOrErr)964      return ToTemplateNameLocOrErr.takeError();965    auto ToTemplateEllipsisLocOrErr =966        import(FromInfo.getTemplateEllipsisLoc());967    if (!ToTemplateEllipsisLocOrErr)968      return ToTemplateEllipsisLocOrErr.takeError();969    ToInfo = TemplateArgumentLocInfo(970        Importer.getToContext(), *ToTemplateKWLocOrErr,971        *ToTemplateQualifierLocOrErr, *ToTemplateNameLocOrErr,972        *ToTemplateEllipsisLocOrErr);973  }974 975  return TemplateArgumentLoc(Arg, ToInfo);976}977 978template <>979Expected<DeclGroupRef> ASTNodeImporter::import(const DeclGroupRef &DG) {980  if (DG.isNull())981    return DeclGroupRef::Create(Importer.getToContext(), nullptr, 0);982  size_t NumDecls = DG.end() - DG.begin();983  SmallVector<Decl *, 1> ToDecls;984  ToDecls.reserve(NumDecls);985  for (Decl *FromD : DG) {986    if (auto ToDOrErr = import(FromD))987      ToDecls.push_back(*ToDOrErr);988    else989      return ToDOrErr.takeError();990  }991  return DeclGroupRef::Create(Importer.getToContext(),992                              ToDecls.begin(),993                              NumDecls);994}995 996template <>997Expected<ASTNodeImporter::Designator>998ASTNodeImporter::import(const Designator &D) {999  if (D.isFieldDesignator()) {1000    IdentifierInfo *ToFieldName = Importer.Import(D.getFieldName());1001 1002    ExpectedSLoc ToDotLocOrErr = import(D.getDotLoc());1003    if (!ToDotLocOrErr)1004      return ToDotLocOrErr.takeError();1005 1006    ExpectedSLoc ToFieldLocOrErr = import(D.getFieldLoc());1007    if (!ToFieldLocOrErr)1008      return ToFieldLocOrErr.takeError();1009 1010    return DesignatedInitExpr::Designator::CreateFieldDesignator(1011        ToFieldName, *ToDotLocOrErr, *ToFieldLocOrErr);1012  }1013 1014  ExpectedSLoc ToLBracketLocOrErr = import(D.getLBracketLoc());1015  if (!ToLBracketLocOrErr)1016    return ToLBracketLocOrErr.takeError();1017 1018  ExpectedSLoc ToRBracketLocOrErr = import(D.getRBracketLoc());1019  if (!ToRBracketLocOrErr)1020    return ToRBracketLocOrErr.takeError();1021 1022  if (D.isArrayDesignator())1023    return Designator::CreateArrayDesignator(D.getArrayIndex(),1024                                             *ToLBracketLocOrErr,1025                                             *ToRBracketLocOrErr);1026 1027  ExpectedSLoc ToEllipsisLocOrErr = import(D.getEllipsisLoc());1028  if (!ToEllipsisLocOrErr)1029    return ToEllipsisLocOrErr.takeError();1030 1031  assert(D.isArrayRangeDesignator());1032  return Designator::CreateArrayRangeDesignator(1033      D.getArrayIndex(), *ToLBracketLocOrErr, *ToEllipsisLocOrErr,1034      *ToRBracketLocOrErr);1035}1036 1037template <>1038Expected<ConceptReference *> ASTNodeImporter::import(ConceptReference *From) {1039  Error Err = Error::success();1040  auto ToNNS = importChecked(Err, From->getNestedNameSpecifierLoc());1041  auto ToTemplateKWLoc = importChecked(Err, From->getTemplateKWLoc());1042  auto ToConceptNameLoc =1043      importChecked(Err, From->getConceptNameInfo().getLoc());1044  auto ToConceptName = importChecked(Err, From->getConceptNameInfo().getName());1045  auto ToFoundDecl = importChecked(Err, From->getFoundDecl());1046  auto ToNamedConcept = importChecked(Err, From->getNamedConcept());1047  if (Err)1048    return std::move(Err);1049  TemplateArgumentListInfo ToTAInfo;1050  const auto *ASTTemplateArgs = From->getTemplateArgsAsWritten();1051  if (ASTTemplateArgs)1052    if (Error Err = ImportTemplateArgumentListInfo(*ASTTemplateArgs, ToTAInfo))1053      return std::move(Err);1054  auto *ConceptRef = ConceptReference::Create(1055      Importer.getToContext(), ToNNS, ToTemplateKWLoc,1056      DeclarationNameInfo(ToConceptName, ToConceptNameLoc), ToFoundDecl,1057      ToNamedConcept,1058      ASTTemplateArgs ? ASTTemplateArgumentListInfo::Create(1059                            Importer.getToContext(), ToTAInfo)1060                      : nullptr);1061  return ConceptRef;1062}1063 1064StringRef ASTNodeImporter::ImportASTStringRef(StringRef FromStr) {1065  char *ToStore = new (Importer.getToContext()) char[FromStr.size()];1066  std::copy(FromStr.begin(), FromStr.end(), ToStore);1067  return StringRef(ToStore, FromStr.size());1068}1069 1070Error ASTNodeImporter::ImportConstraintSatisfaction(1071    const ASTConstraintSatisfaction &FromSat, ConstraintSatisfaction &ToSat) {1072  ToSat.IsSatisfied = FromSat.IsSatisfied;1073  ToSat.ContainsErrors = FromSat.ContainsErrors;1074  if (!ToSat.IsSatisfied) {1075    for (auto Record = FromSat.begin(); Record != FromSat.end(); ++Record) {1076      if (const Expr *E = Record->dyn_cast<const Expr *>()) {1077        ExpectedExpr ToSecondExpr = import(E);1078        if (!ToSecondExpr)1079          return ToSecondExpr.takeError();1080        ToSat.Details.emplace_back(ToSecondExpr.get());1081      } else {1082        auto Pair =1083            Record->dyn_cast<const ConstraintSubstitutionDiagnostic *>();1084 1085        ExpectedSLoc ToPairFirst = import(Pair->first);1086        if (!ToPairFirst)1087          return ToPairFirst.takeError();1088        StringRef ToPairSecond = ImportASTStringRef(Pair->second);1089        ToSat.Details.emplace_back(new (Importer.getToContext())1090                                       ConstraintSubstitutionDiagnostic{1091                                           ToPairFirst.get(), ToPairSecond});1092      }1093    }1094  }1095  return Error::success();1096}1097 1098template <>1099Expected<concepts::Requirement::SubstitutionDiagnostic *>1100ASTNodeImporter::import(1101    concepts::Requirement::SubstitutionDiagnostic *FromDiag) {1102  StringRef ToEntity = ImportASTStringRef(FromDiag->SubstitutedEntity);1103  ExpectedSLoc ToLoc = import(FromDiag->DiagLoc);1104  if (!ToLoc)1105    return ToLoc.takeError();1106  StringRef ToDiagMessage = ImportASTStringRef(FromDiag->DiagMessage);1107  return new (Importer.getToContext())1108      concepts::Requirement::SubstitutionDiagnostic{ToEntity, ToLoc.get(),1109                                                    ToDiagMessage};1110}1111 1112Expected<concepts::Requirement *>1113ASTNodeImporter::ImportTypeRequirement(concepts::TypeRequirement *From) {1114  using namespace concepts;1115 1116  if (From->isSubstitutionFailure()) {1117    auto DiagOrErr = import(From->getSubstitutionDiagnostic());1118    if (!DiagOrErr)1119      return DiagOrErr.takeError();1120    return new (Importer.getToContext()) TypeRequirement(*DiagOrErr);1121  } else {1122    Expected<TypeSourceInfo *> ToType = import(From->getType());1123    if (!ToType)1124      return ToType.takeError();1125    return new (Importer.getToContext()) TypeRequirement(*ToType);1126  }1127}1128 1129Expected<concepts::Requirement *>1130ASTNodeImporter::ImportExprRequirement(concepts::ExprRequirement *From) {1131  using namespace concepts;1132 1133  bool IsRKSimple = From->getKind() == Requirement::RK_Simple;1134  ExprRequirement::SatisfactionStatus Status = From->getSatisfactionStatus();1135 1136  std::optional<ExprRequirement::ReturnTypeRequirement> Req;1137  ConceptSpecializationExpr *SubstitutedConstraintExpr = nullptr;1138 1139  if (IsRKSimple) {1140    Req.emplace();1141  } else {1142    const ExprRequirement::ReturnTypeRequirement &FromTypeRequirement =1143        From->getReturnTypeRequirement();1144 1145    if (FromTypeRequirement.isTypeConstraint()) {1146      const bool IsDependent = FromTypeRequirement.isDependent();1147      auto ParamsOrErr =1148          import(FromTypeRequirement.getTypeConstraintTemplateParameterList());1149      if (!ParamsOrErr)1150        return ParamsOrErr.takeError();1151      if (Status >= ExprRequirement::SS_ConstraintsNotSatisfied) {1152        auto SubstConstraintExprOrErr =1153            import(From->getReturnTypeRequirementSubstitutedConstraintExpr());1154        if (!SubstConstraintExprOrErr)1155          return SubstConstraintExprOrErr.takeError();1156        SubstitutedConstraintExpr = SubstConstraintExprOrErr.get();1157      }1158      Req.emplace(ParamsOrErr.get(), IsDependent);1159    } else if (FromTypeRequirement.isSubstitutionFailure()) {1160      auto DiagOrErr = import(FromTypeRequirement.getSubstitutionDiagnostic());1161      if (!DiagOrErr)1162        return DiagOrErr.takeError();1163      Req.emplace(DiagOrErr.get());1164    } else {1165      Req.emplace();1166    }1167  }1168 1169  ExpectedSLoc NoexceptLocOrErr = import(From->getNoexceptLoc());1170  if (!NoexceptLocOrErr)1171    return NoexceptLocOrErr.takeError();1172 1173  if (Status == ExprRequirement::SS_ExprSubstitutionFailure) {1174    auto DiagOrErr = import(From->getExprSubstitutionDiagnostic());1175    if (!DiagOrErr)1176      return DiagOrErr.takeError();1177    return new (Importer.getToContext()) ExprRequirement(1178        *DiagOrErr, IsRKSimple, *NoexceptLocOrErr, std::move(*Req));1179  } else {1180    Expected<Expr *> ExprOrErr = import(From->getExpr());1181    if (!ExprOrErr)1182      return ExprOrErr.takeError();1183    return new (Importer.getToContext()) concepts::ExprRequirement(1184        *ExprOrErr, IsRKSimple, *NoexceptLocOrErr, std::move(*Req), Status,1185        SubstitutedConstraintExpr);1186  }1187}1188 1189Expected<concepts::Requirement *>1190ASTNodeImporter::ImportNestedRequirement(concepts::NestedRequirement *From) {1191  using namespace concepts;1192 1193  const ASTConstraintSatisfaction &FromSatisfaction =1194      From->getConstraintSatisfaction();1195  if (From->hasInvalidConstraint()) {1196    StringRef ToEntity = ImportASTStringRef(From->getInvalidConstraintEntity());1197    ASTConstraintSatisfaction *ToSatisfaction =1198        ASTConstraintSatisfaction::Rebuild(Importer.getToContext(),1199                                           FromSatisfaction);1200    return new (Importer.getToContext())1201        NestedRequirement(ToEntity, ToSatisfaction);1202  } else {1203    ExpectedExpr ToExpr = import(From->getConstraintExpr());1204    if (!ToExpr)1205      return ToExpr.takeError();1206    if (ToExpr.get()->isInstantiationDependent()) {1207      return new (Importer.getToContext()) NestedRequirement(ToExpr.get());1208    } else {1209      ConstraintSatisfaction Satisfaction;1210      if (Error Err =1211              ImportConstraintSatisfaction(FromSatisfaction, Satisfaction))1212        return std::move(Err);1213      return new (Importer.getToContext()) NestedRequirement(1214          Importer.getToContext(), ToExpr.get(), Satisfaction);1215    }1216  }1217}1218 1219template <>1220Expected<concepts::Requirement *>1221ASTNodeImporter::import(concepts::Requirement *FromRequire) {1222  switch (FromRequire->getKind()) {1223  case concepts::Requirement::RequirementKind::RK_Type:1224    return ImportTypeRequirement(cast<concepts::TypeRequirement>(FromRequire));1225  case concepts::Requirement::RequirementKind::RK_Compound:1226  case concepts::Requirement::RequirementKind::RK_Simple:1227    return ImportExprRequirement(cast<concepts::ExprRequirement>(FromRequire));1228  case concepts::Requirement::RequirementKind::RK_Nested:1229    return ImportNestedRequirement(1230        cast<concepts::NestedRequirement>(FromRequire));1231  }1232  llvm_unreachable("Unhandled requirement kind");1233}1234 1235template <>1236Expected<LambdaCapture> ASTNodeImporter::import(const LambdaCapture &From) {1237  ValueDecl *Var = nullptr;1238  if (From.capturesVariable()) {1239    if (auto VarOrErr = import(From.getCapturedVar()))1240      Var = *VarOrErr;1241    else1242      return VarOrErr.takeError();1243  }1244 1245  auto LocationOrErr = import(From.getLocation());1246  if (!LocationOrErr)1247    return LocationOrErr.takeError();1248 1249  SourceLocation EllipsisLoc;1250  if (From.isPackExpansion())1251    if (Error Err = importInto(EllipsisLoc, From.getEllipsisLoc()))1252      return std::move(Err);1253 1254  return LambdaCapture(1255      *LocationOrErr, From.isImplicit(), From.getCaptureKind(), Var,1256      EllipsisLoc);1257}1258 1259template <typename T>1260bool ASTNodeImporter::hasSameVisibilityContextAndLinkage(T *Found, T *From) {1261  if (Found->getLinkageInternal() != From->getLinkageInternal())1262    return false;1263 1264  if (From->hasExternalFormalLinkage())1265    return Found->hasExternalFormalLinkage();1266  if (Importer.GetFromTU(Found) != From->getTranslationUnitDecl())1267    return false;1268  if (From->isInAnonymousNamespace())1269    return Found->isInAnonymousNamespace();1270  else1271    return !Found->isInAnonymousNamespace() &&1272           !Found->hasExternalFormalLinkage();1273}1274 1275template <>1276bool ASTNodeImporter::hasSameVisibilityContextAndLinkage(TypedefNameDecl *Found,1277                                               TypedefNameDecl *From) {1278  if (Found->getLinkageInternal() != From->getLinkageInternal())1279    return false;1280 1281  if (From->isInAnonymousNamespace() && Found->isInAnonymousNamespace())1282    return Importer.GetFromTU(Found) == From->getTranslationUnitDecl();1283  return From->isInAnonymousNamespace() == Found->isInAnonymousNamespace();1284}1285 1286} // namespace clang1287 1288//----------------------------------------------------------------------------1289// Import Types1290//----------------------------------------------------------------------------1291 1292using namespace clang;1293 1294auto ASTImporter::FunctionDeclImportCycleDetector::makeScopedCycleDetection(1295    const FunctionDecl *D) {1296  const FunctionDecl *LambdaD = nullptr;1297  if (!isCycle(D) && D) {1298    FunctionDeclsWithImportInProgress.insert(D);1299    LambdaD = D;1300  }1301  return llvm::make_scope_exit([this, LambdaD]() {1302    if (LambdaD) {1303      FunctionDeclsWithImportInProgress.erase(LambdaD);1304    }1305  });1306}1307 1308bool ASTImporter::FunctionDeclImportCycleDetector::isCycle(1309    const FunctionDecl *D) const {1310  return FunctionDeclsWithImportInProgress.find(D) !=1311         FunctionDeclsWithImportInProgress.end();1312}1313 1314ExpectedType ASTNodeImporter::VisitType(const Type *T) {1315  Importer.FromDiag(SourceLocation(), diag::err_unsupported_ast_node)1316    << T->getTypeClassName();1317  return make_error<ASTImportError>(ASTImportError::UnsupportedConstruct);1318}1319 1320ExpectedType ASTNodeImporter::VisitAtomicType(const AtomicType *T){1321  ExpectedType UnderlyingTypeOrErr = import(T->getValueType());1322  if (!UnderlyingTypeOrErr)1323    return UnderlyingTypeOrErr.takeError();1324 1325  return Importer.getToContext().getAtomicType(*UnderlyingTypeOrErr);1326}1327 1328ExpectedType ASTNodeImporter::VisitBuiltinType(const BuiltinType *T) {1329  switch (T->getKind()) {1330#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \1331  case BuiltinType::Id: \1332    return Importer.getToContext().SingletonId;1333#include "clang/Basic/OpenCLImageTypes.def"1334#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \1335  case BuiltinType::Id: \1336    return Importer.getToContext().Id##Ty;1337#include "clang/Basic/OpenCLExtensionTypes.def"1338#define SVE_TYPE(Name, Id, SingletonId) \1339  case BuiltinType::Id: \1340    return Importer.getToContext().SingletonId;1341#include "clang/Basic/AArch64ACLETypes.def"1342#define PPC_VECTOR_TYPE(Name, Id, Size) \1343  case BuiltinType::Id: \1344    return Importer.getToContext().Id##Ty;1345#include "clang/Basic/PPCTypes.def"1346#define RVV_TYPE(Name, Id, SingletonId)                                        \1347  case BuiltinType::Id:                                                        \1348    return Importer.getToContext().SingletonId;1349#include "clang/Basic/RISCVVTypes.def"1350#define WASM_TYPE(Name, Id, SingletonId)                                       \1351  case BuiltinType::Id:                                                        \1352    return Importer.getToContext().SingletonId;1353#include "clang/Basic/WebAssemblyReferenceTypes.def"1354#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align)                       \1355  case BuiltinType::Id:                                                        \1356    return Importer.getToContext().SingletonId;1357#include "clang/Basic/AMDGPUTypes.def"1358#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId)                            \1359  case BuiltinType::Id:                                                        \1360    return Importer.getToContext().SingletonId;1361#include "clang/Basic/HLSLIntangibleTypes.def"1362#define SHARED_SINGLETON_TYPE(Expansion)1363#define BUILTIN_TYPE(Id, SingletonId) \1364  case BuiltinType::Id: return Importer.getToContext().SingletonId;1365#include "clang/AST/BuiltinTypes.def"1366 1367  // FIXME: for Char16, Char32, and NullPtr, make sure that the "to"1368  // context supports C++.1369 1370  // FIXME: for ObjCId, ObjCClass, and ObjCSel, make sure that the "to"1371  // context supports ObjC.1372 1373  case BuiltinType::Char_U:1374    // The context we're importing from has an unsigned 'char'. If we're1375    // importing into a context with a signed 'char', translate to1376    // 'unsigned char' instead.1377    if (Importer.getToContext().getLangOpts().CharIsSigned)1378      return Importer.getToContext().UnsignedCharTy;1379 1380    return Importer.getToContext().CharTy;1381 1382  case BuiltinType::Char_S:1383    // The context we're importing from has an unsigned 'char'. If we're1384    // importing into a context with a signed 'char', translate to1385    // 'unsigned char' instead.1386    if (!Importer.getToContext().getLangOpts().CharIsSigned)1387      return Importer.getToContext().SignedCharTy;1388 1389    return Importer.getToContext().CharTy;1390 1391  case BuiltinType::WChar_S:1392  case BuiltinType::WChar_U:1393    // FIXME: If not in C++, shall we translate to the C equivalent of1394    // wchar_t?1395    return Importer.getToContext().WCharTy;1396  }1397 1398  llvm_unreachable("Invalid BuiltinType Kind!");1399}1400 1401ExpectedType ASTNodeImporter::VisitDecayedType(const DecayedType *T) {1402  ExpectedType ToOriginalTypeOrErr = import(T->getOriginalType());1403  if (!ToOriginalTypeOrErr)1404    return ToOriginalTypeOrErr.takeError();1405 1406  return Importer.getToContext().getDecayedType(*ToOriginalTypeOrErr);1407}1408 1409ExpectedType ASTNodeImporter::VisitComplexType(const ComplexType *T) {1410  ExpectedType ToElementTypeOrErr = import(T->getElementType());1411  if (!ToElementTypeOrErr)1412    return ToElementTypeOrErr.takeError();1413 1414  return Importer.getToContext().getComplexType(*ToElementTypeOrErr);1415}1416 1417ExpectedType ASTNodeImporter::VisitPointerType(const PointerType *T) {1418  ExpectedType ToPointeeTypeOrErr = import(T->getPointeeType());1419  if (!ToPointeeTypeOrErr)1420    return ToPointeeTypeOrErr.takeError();1421 1422  return Importer.getToContext().getPointerType(*ToPointeeTypeOrErr);1423}1424 1425ExpectedType ASTNodeImporter::VisitBlockPointerType(const BlockPointerType *T) {1426  // FIXME: Check for blocks support in "to" context.1427  ExpectedType ToPointeeTypeOrErr = import(T->getPointeeType());1428  if (!ToPointeeTypeOrErr)1429    return ToPointeeTypeOrErr.takeError();1430 1431  return Importer.getToContext().getBlockPointerType(*ToPointeeTypeOrErr);1432}1433 1434ExpectedType1435ASTNodeImporter::VisitLValueReferenceType(const LValueReferenceType *T) {1436  // FIXME: Check for C++ support in "to" context.1437  ExpectedType ToPointeeTypeOrErr = import(T->getPointeeTypeAsWritten());1438  if (!ToPointeeTypeOrErr)1439    return ToPointeeTypeOrErr.takeError();1440 1441  return Importer.getToContext().getLValueReferenceType(*ToPointeeTypeOrErr);1442}1443 1444ExpectedType1445ASTNodeImporter::VisitRValueReferenceType(const RValueReferenceType *T) {1446  // FIXME: Check for C++0x support in "to" context.1447  ExpectedType ToPointeeTypeOrErr = import(T->getPointeeTypeAsWritten());1448  if (!ToPointeeTypeOrErr)1449    return ToPointeeTypeOrErr.takeError();1450 1451  return Importer.getToContext().getRValueReferenceType(*ToPointeeTypeOrErr);1452}1453 1454ExpectedType1455ASTNodeImporter::VisitMemberPointerType(const MemberPointerType *T) {1456  // FIXME: Check for C++ support in "to" context.1457  ExpectedType ToPointeeTypeOrErr = import(T->getPointeeType());1458  if (!ToPointeeTypeOrErr)1459    return ToPointeeTypeOrErr.takeError();1460 1461  auto QualifierOrErr = import(T->getQualifier());1462  if (!QualifierOrErr)1463    return QualifierOrErr.takeError();1464 1465  auto ClsOrErr = import(T->getMostRecentCXXRecordDecl());1466  if (!ClsOrErr)1467    return ClsOrErr.takeError();1468 1469  return Importer.getToContext().getMemberPointerType(1470      *ToPointeeTypeOrErr, *QualifierOrErr, *ClsOrErr);1471}1472 1473ExpectedType1474ASTNodeImporter::VisitConstantArrayType(const ConstantArrayType *T) {1475  Error Err = Error::success();1476  auto ToElementType = importChecked(Err, T->getElementType());1477  auto ToSizeExpr = importChecked(Err, T->getSizeExpr());1478  if (Err)1479    return std::move(Err);1480 1481  return Importer.getToContext().getConstantArrayType(1482      ToElementType, T->getSize(), ToSizeExpr, T->getSizeModifier(),1483      T->getIndexTypeCVRQualifiers());1484}1485 1486ExpectedType1487ASTNodeImporter::VisitArrayParameterType(const ArrayParameterType *T) {1488  ExpectedType ToArrayTypeOrErr = VisitConstantArrayType(T);1489  if (!ToArrayTypeOrErr)1490    return ToArrayTypeOrErr.takeError();1491 1492  return Importer.getToContext().getArrayParameterType(*ToArrayTypeOrErr);1493}1494 1495ExpectedType1496ASTNodeImporter::VisitIncompleteArrayType(const IncompleteArrayType *T) {1497  ExpectedType ToElementTypeOrErr = import(T->getElementType());1498  if (!ToElementTypeOrErr)1499    return ToElementTypeOrErr.takeError();1500 1501  return Importer.getToContext().getIncompleteArrayType(*ToElementTypeOrErr,1502                                                        T->getSizeModifier(),1503                                                T->getIndexTypeCVRQualifiers());1504}1505 1506ExpectedType1507ASTNodeImporter::VisitVariableArrayType(const VariableArrayType *T) {1508  Error Err = Error::success();1509  QualType ToElementType = importChecked(Err, T->getElementType());1510  Expr *ToSizeExpr = importChecked(Err, T->getSizeExpr());1511  if (Err)1512    return std::move(Err);1513  return Importer.getToContext().getVariableArrayType(1514      ToElementType, ToSizeExpr, T->getSizeModifier(),1515      T->getIndexTypeCVRQualifiers());1516}1517 1518ExpectedType ASTNodeImporter::VisitDependentSizedArrayType(1519    const DependentSizedArrayType *T) {1520  Error Err = Error::success();1521  QualType ToElementType = importChecked(Err, T->getElementType());1522  Expr *ToSizeExpr = importChecked(Err, T->getSizeExpr());1523  if (Err)1524    return std::move(Err);1525  // SizeExpr may be null if size is not specified directly.1526  // For example, 'int a[]'.1527 1528  return Importer.getToContext().getDependentSizedArrayType(1529      ToElementType, ToSizeExpr, T->getSizeModifier(),1530      T->getIndexTypeCVRQualifiers());1531}1532 1533ExpectedType ASTNodeImporter::VisitDependentSizedExtVectorType(1534    const DependentSizedExtVectorType *T) {1535  Error Err = Error::success();1536  QualType ToElementType = importChecked(Err, T->getElementType());1537  Expr *ToSizeExpr = importChecked(Err, T->getSizeExpr());1538  SourceLocation ToAttrLoc = importChecked(Err, T->getAttributeLoc());1539  if (Err)1540    return std::move(Err);1541  return Importer.getToContext().getDependentSizedExtVectorType(1542      ToElementType, ToSizeExpr, ToAttrLoc);1543}1544 1545ExpectedType ASTNodeImporter::VisitVectorType(const VectorType *T) {1546  ExpectedType ToElementTypeOrErr = import(T->getElementType());1547  if (!ToElementTypeOrErr)1548    return ToElementTypeOrErr.takeError();1549 1550  return Importer.getToContext().getVectorType(*ToElementTypeOrErr,1551                                               T->getNumElements(),1552                                               T->getVectorKind());1553}1554 1555ExpectedType ASTNodeImporter::VisitExtVectorType(const ExtVectorType *T) {1556  ExpectedType ToElementTypeOrErr = import(T->getElementType());1557  if (!ToElementTypeOrErr)1558    return ToElementTypeOrErr.takeError();1559 1560  return Importer.getToContext().getExtVectorType(*ToElementTypeOrErr,1561                                                  T->getNumElements());1562}1563 1564ExpectedType1565ASTNodeImporter::VisitFunctionNoProtoType(const FunctionNoProtoType *T) {1566  // FIXME: What happens if we're importing a function without a prototype1567  // into C++? Should we make it variadic?1568  ExpectedType ToReturnTypeOrErr = import(T->getReturnType());1569  if (!ToReturnTypeOrErr)1570    return ToReturnTypeOrErr.takeError();1571 1572  return Importer.getToContext().getFunctionNoProtoType(*ToReturnTypeOrErr,1573                                                        T->getExtInfo());1574}1575 1576ExpectedType1577ASTNodeImporter::VisitFunctionProtoType(const FunctionProtoType *T) {1578  ExpectedType ToReturnTypeOrErr = import(T->getReturnType());1579  if (!ToReturnTypeOrErr)1580    return ToReturnTypeOrErr.takeError();1581 1582  // Import argument types1583  SmallVector<QualType, 4> ArgTypes;1584  for (const auto &A : T->param_types()) {1585    ExpectedType TyOrErr = import(A);1586    if (!TyOrErr)1587      return TyOrErr.takeError();1588    ArgTypes.push_back(*TyOrErr);1589  }1590 1591  // Import exception types1592  SmallVector<QualType, 4> ExceptionTypes;1593  for (const auto &E : T->exceptions()) {1594    ExpectedType TyOrErr = import(E);1595    if (!TyOrErr)1596      return TyOrErr.takeError();1597    ExceptionTypes.push_back(*TyOrErr);1598  }1599 1600  FunctionProtoType::ExtProtoInfo FromEPI = T->getExtProtoInfo();1601  Error Err = Error::success();1602  FunctionProtoType::ExtProtoInfo ToEPI;1603  ToEPI.ExtInfo = FromEPI.ExtInfo;1604  ToEPI.Variadic = FromEPI.Variadic;1605  ToEPI.HasTrailingReturn = FromEPI.HasTrailingReturn;1606  ToEPI.TypeQuals = FromEPI.TypeQuals;1607  ToEPI.RefQualifier = FromEPI.RefQualifier;1608  ToEPI.ExceptionSpec.Type = FromEPI.ExceptionSpec.Type;1609  ToEPI.ExceptionSpec.NoexceptExpr =1610      importChecked(Err, FromEPI.ExceptionSpec.NoexceptExpr);1611  ToEPI.ExceptionSpec.SourceDecl =1612      importChecked(Err, FromEPI.ExceptionSpec.SourceDecl);1613  ToEPI.ExceptionSpec.SourceTemplate =1614      importChecked(Err, FromEPI.ExceptionSpec.SourceTemplate);1615  ToEPI.ExceptionSpec.Exceptions = ExceptionTypes;1616 1617  if (Err)1618    return std::move(Err);1619 1620  return Importer.getToContext().getFunctionType(1621      *ToReturnTypeOrErr, ArgTypes, ToEPI);1622}1623 1624ExpectedType ASTNodeImporter::VisitUnresolvedUsingType(1625    const UnresolvedUsingType *T) {1626  Error Err = Error::success();1627  auto ToQualifier = importChecked(Err, T->getQualifier());1628  auto *ToD = importChecked(Err, T->getDecl());1629  if (Err)1630    return std::move(Err);1631 1632  if (T->isCanonicalUnqualified())1633    return Importer.getToContext().getCanonicalUnresolvedUsingType(ToD);1634  return Importer.getToContext().getUnresolvedUsingType(T->getKeyword(),1635                                                        ToQualifier, ToD);1636}1637 1638ExpectedType ASTNodeImporter::VisitParenType(const ParenType *T) {1639  ExpectedType ToInnerTypeOrErr = import(T->getInnerType());1640  if (!ToInnerTypeOrErr)1641    return ToInnerTypeOrErr.takeError();1642 1643  return Importer.getToContext().getParenType(*ToInnerTypeOrErr);1644}1645 1646ExpectedType1647ASTNodeImporter::VisitPackIndexingType(clang::PackIndexingType const *T) {1648 1649  ExpectedType Pattern = import(T->getPattern());1650  if (!Pattern)1651    return Pattern.takeError();1652  ExpectedExpr Index = import(T->getIndexExpr());1653  if (!Index)1654    return Index.takeError();1655  return Importer.getToContext().getPackIndexingType(*Pattern, *Index);1656}1657 1658ExpectedType ASTNodeImporter::VisitTypedefType(const TypedefType *T) {1659  Expected<TypedefNameDecl *> ToDeclOrErr = import(T->getDecl());1660  if (!ToDeclOrErr)1661    return ToDeclOrErr.takeError();1662 1663  auto ToQualifierOrErr = import(T->getQualifier());1664  if (!ToQualifierOrErr)1665    return ToQualifierOrErr.takeError();1666 1667  ExpectedType ToUnderlyingTypeOrErr =1668      T->typeMatchesDecl() ? QualType() : import(T->desugar());1669  if (!ToUnderlyingTypeOrErr)1670    return ToUnderlyingTypeOrErr.takeError();1671 1672  return Importer.getToContext().getTypedefType(1673      T->getKeyword(), *ToQualifierOrErr, *ToDeclOrErr, *ToUnderlyingTypeOrErr);1674}1675 1676ExpectedType ASTNodeImporter::VisitTypeOfExprType(const TypeOfExprType *T) {1677  ExpectedExpr ToExprOrErr = import(T->getUnderlyingExpr());1678  if (!ToExprOrErr)1679    return ToExprOrErr.takeError();1680  return Importer.getToContext().getTypeOfExprType(*ToExprOrErr, T->getKind());1681}1682 1683ExpectedType ASTNodeImporter::VisitTypeOfType(const TypeOfType *T) {1684  ExpectedType ToUnderlyingTypeOrErr = import(T->getUnmodifiedType());1685  if (!ToUnderlyingTypeOrErr)1686    return ToUnderlyingTypeOrErr.takeError();1687  return Importer.getToContext().getTypeOfType(*ToUnderlyingTypeOrErr,1688                                               T->getKind());1689}1690 1691ExpectedType ASTNodeImporter::VisitUsingType(const UsingType *T) {1692  Error Err = Error::success();1693  auto ToQualifier = importChecked(Err, T->getQualifier());1694  auto *ToD = importChecked(Err, T->getDecl());1695  QualType ToT = importChecked(Err, T->desugar());1696  if (Err)1697    return std::move(Err);1698  return Importer.getToContext().getUsingType(T->getKeyword(), ToQualifier, ToD,1699                                              ToT);1700}1701 1702ExpectedType ASTNodeImporter::VisitDecltypeType(const DecltypeType *T) {1703  // FIXME: Make sure that the "to" context supports C++0x!1704  ExpectedExpr ToExprOrErr = import(T->getUnderlyingExpr());1705  if (!ToExprOrErr)1706    return ToExprOrErr.takeError();1707 1708  ExpectedType ToUnderlyingTypeOrErr = import(T->getUnderlyingType());1709  if (!ToUnderlyingTypeOrErr)1710    return ToUnderlyingTypeOrErr.takeError();1711 1712  return Importer.getToContext().getDecltypeType(1713      *ToExprOrErr, *ToUnderlyingTypeOrErr);1714}1715 1716ExpectedType1717ASTNodeImporter::VisitUnaryTransformType(const UnaryTransformType *T) {1718  ExpectedType ToBaseTypeOrErr = import(T->getBaseType());1719  if (!ToBaseTypeOrErr)1720    return ToBaseTypeOrErr.takeError();1721 1722  ExpectedType ToUnderlyingTypeOrErr = import(T->getUnderlyingType());1723  if (!ToUnderlyingTypeOrErr)1724    return ToUnderlyingTypeOrErr.takeError();1725 1726  return Importer.getToContext().getUnaryTransformType(1727      *ToBaseTypeOrErr, *ToUnderlyingTypeOrErr, T->getUTTKind());1728}1729 1730ExpectedType ASTNodeImporter::VisitAutoType(const AutoType *T) {1731  // FIXME: Make sure that the "to" context supports C++11!1732  ExpectedType ToDeducedTypeOrErr = import(T->getDeducedType());1733  if (!ToDeducedTypeOrErr)1734    return ToDeducedTypeOrErr.takeError();1735 1736  ExpectedDecl ToTypeConstraintConcept = import(T->getTypeConstraintConcept());1737  if (!ToTypeConstraintConcept)1738    return ToTypeConstraintConcept.takeError();1739 1740  SmallVector<TemplateArgument, 2> ToTemplateArgs;1741  if (Error Err = ImportTemplateArguments(T->getTypeConstraintArguments(),1742                                          ToTemplateArgs))1743    return std::move(Err);1744 1745  return Importer.getToContext().getAutoType(1746      *ToDeducedTypeOrErr, T->getKeyword(), /*IsDependent*/false,1747      /*IsPack=*/false, cast_or_null<ConceptDecl>(*ToTypeConstraintConcept),1748      ToTemplateArgs);1749}1750 1751ExpectedType ASTNodeImporter::VisitDeducedTemplateSpecializationType(1752    const DeducedTemplateSpecializationType *T) {1753  // FIXME: Make sure that the "to" context supports C++17!1754  Expected<TemplateName> ToTemplateNameOrErr = import(T->getTemplateName());1755  if (!ToTemplateNameOrErr)1756    return ToTemplateNameOrErr.takeError();1757  ExpectedType ToDeducedTypeOrErr = import(T->getDeducedType());1758  if (!ToDeducedTypeOrErr)1759    return ToDeducedTypeOrErr.takeError();1760 1761  return Importer.getToContext().getDeducedTemplateSpecializationType(1762      T->getKeyword(), *ToTemplateNameOrErr, *ToDeducedTypeOrErr,1763      T->isDependentType());1764}1765 1766ExpectedType ASTNodeImporter::VisitTagType(const TagType *T) {1767  TagDecl *DeclForType = T->getDecl();1768  Expected<TagDecl *> ToDeclOrErr = import(DeclForType);1769  if (!ToDeclOrErr)1770    return ToDeclOrErr.takeError();1771 1772  // If there is a definition of the 'OriginalDecl', it should be imported to1773  // have all information for the type in the "To" AST. (In some cases no1774  // other reference may exist to the definition decl and it would not be1775  // imported otherwise.)1776  Expected<TagDecl *> ToDefDeclOrErr = import(DeclForType->getDefinition());1777  if (!ToDefDeclOrErr)1778    return ToDefDeclOrErr.takeError();1779 1780  if (T->isCanonicalUnqualified())1781    return Importer.getToContext().getCanonicalTagType(*ToDeclOrErr);1782 1783  auto ToQualifierOrErr = import(T->getQualifier());1784  if (!ToQualifierOrErr)1785    return ToQualifierOrErr.takeError();1786 1787  return Importer.getToContext().getTagType(T->getKeyword(), *ToQualifierOrErr,1788                                            *ToDeclOrErr, T->isTagOwned());1789}1790 1791ExpectedType ASTNodeImporter::VisitEnumType(const EnumType *T) {1792  return VisitTagType(T);1793}1794 1795ExpectedType ASTNodeImporter::VisitRecordType(const RecordType *T) {1796  return VisitTagType(T);1797}1798 1799ExpectedType1800ASTNodeImporter::VisitInjectedClassNameType(const InjectedClassNameType *T) {1801  return VisitTagType(T);1802}1803 1804ExpectedType ASTNodeImporter::VisitAttributedType(const AttributedType *T) {1805  ExpectedType ToModifiedTypeOrErr = import(T->getModifiedType());1806  if (!ToModifiedTypeOrErr)1807    return ToModifiedTypeOrErr.takeError();1808  ExpectedType ToEquivalentTypeOrErr = import(T->getEquivalentType());1809  if (!ToEquivalentTypeOrErr)1810    return ToEquivalentTypeOrErr.takeError();1811 1812  return Importer.getToContext().getAttributedType(1813      T->getAttrKind(), *ToModifiedTypeOrErr, *ToEquivalentTypeOrErr,1814      T->getAttr());1815}1816 1817ExpectedType1818ASTNodeImporter::VisitCountAttributedType(const CountAttributedType *T) {1819  ExpectedType ToWrappedTypeOrErr = import(T->desugar());1820  if (!ToWrappedTypeOrErr)1821    return ToWrappedTypeOrErr.takeError();1822 1823  Error Err = Error::success();1824  Expr *CountExpr = importChecked(Err, T->getCountExpr());1825 1826  SmallVector<TypeCoupledDeclRefInfo, 1> CoupledDecls;1827  for (const TypeCoupledDeclRefInfo &TI : T->dependent_decls()) {1828    Expected<ValueDecl *> ToDeclOrErr = import(TI.getDecl());1829    if (!ToDeclOrErr)1830      return ToDeclOrErr.takeError();1831    CoupledDecls.emplace_back(*ToDeclOrErr, TI.isDeref());1832  }1833 1834  return Importer.getToContext().getCountAttributedType(1835      *ToWrappedTypeOrErr, CountExpr, T->isCountInBytes(), T->isOrNull(),1836      ArrayRef(CoupledDecls));1837}1838 1839ExpectedType ASTNodeImporter::VisitTemplateTypeParmType(1840    const TemplateTypeParmType *T) {1841  Expected<TemplateTypeParmDecl *> ToDeclOrErr = import(T->getDecl());1842  if (!ToDeclOrErr)1843    return ToDeclOrErr.takeError();1844 1845  return Importer.getToContext().getTemplateTypeParmType(1846      T->getDepth(), T->getIndex(), T->isParameterPack(), *ToDeclOrErr);1847}1848 1849ExpectedType ASTNodeImporter::VisitSubstTemplateTypeParmType(1850    const SubstTemplateTypeParmType *T) {1851  Expected<Decl *> ReplacedOrErr = import(T->getAssociatedDecl());1852  if (!ReplacedOrErr)1853    return ReplacedOrErr.takeError();1854 1855  ExpectedType ToReplacementTypeOrErr = import(T->getReplacementType());1856  if (!ToReplacementTypeOrErr)1857    return ToReplacementTypeOrErr.takeError();1858 1859  return Importer.getToContext().getSubstTemplateTypeParmType(1860      *ToReplacementTypeOrErr, *ReplacedOrErr, T->getIndex(), T->getPackIndex(),1861      T->getFinal());1862}1863 1864ExpectedType ASTNodeImporter::VisitSubstTemplateTypeParmPackType(1865    const SubstTemplateTypeParmPackType *T) {1866  Expected<Decl *> ReplacedOrErr = import(T->getAssociatedDecl());1867  if (!ReplacedOrErr)1868    return ReplacedOrErr.takeError();1869 1870  Expected<TemplateArgument> ToArgumentPack = import(T->getArgumentPack());1871  if (!ToArgumentPack)1872    return ToArgumentPack.takeError();1873 1874  return Importer.getToContext().getSubstTemplateTypeParmPackType(1875      *ReplacedOrErr, T->getIndex(), T->getFinal(), *ToArgumentPack);1876}1877 1878ExpectedType ASTNodeImporter::VisitSubstBuiltinTemplatePackType(1879    const SubstBuiltinTemplatePackType *T) {1880  Expected<TemplateArgument> ToArgumentPack = import(T->getArgumentPack());1881  if (!ToArgumentPack)1882    return ToArgumentPack.takeError();1883  return Importer.getToContext().getSubstBuiltinTemplatePack(*ToArgumentPack);1884}1885 1886ExpectedType ASTNodeImporter::VisitTemplateSpecializationType(1887                                       const TemplateSpecializationType *T) {1888  auto ToTemplateOrErr = import(T->getTemplateName());1889  if (!ToTemplateOrErr)1890    return ToTemplateOrErr.takeError();1891 1892  SmallVector<TemplateArgument, 2> ToTemplateArgs;1893  if (Error Err =1894          ImportTemplateArguments(T->template_arguments(), ToTemplateArgs))1895    return std::move(Err);1896 1897  ExpectedType ToUnderlyingOrErr =1898      T->isCanonicalUnqualified() ? QualType() : import(T->desugar());1899  if (!ToUnderlyingOrErr)1900    return ToUnderlyingOrErr.takeError();1901  return Importer.getToContext().getTemplateSpecializationType(1902      T->getKeyword(), *ToTemplateOrErr, ToTemplateArgs, {},1903      *ToUnderlyingOrErr);1904}1905 1906ExpectedType1907ASTNodeImporter::VisitPackExpansionType(const PackExpansionType *T) {1908  ExpectedType ToPatternOrErr = import(T->getPattern());1909  if (!ToPatternOrErr)1910    return ToPatternOrErr.takeError();1911 1912  return Importer.getToContext().getPackExpansionType(*ToPatternOrErr,1913                                                      T->getNumExpansions(),1914                                                      /*ExpactPack=*/false);1915}1916 1917ExpectedType1918ASTNodeImporter::VisitDependentNameType(const DependentNameType *T) {1919  auto ToQualifierOrErr = import(T->getQualifier());1920  if (!ToQualifierOrErr)1921    return ToQualifierOrErr.takeError();1922 1923  IdentifierInfo *Name = Importer.Import(T->getIdentifier());1924  return Importer.getToContext().getDependentNameType(T->getKeyword(),1925                                                      *ToQualifierOrErr, Name);1926}1927 1928ExpectedType1929ASTNodeImporter::VisitObjCInterfaceType(const ObjCInterfaceType *T) {1930  Expected<ObjCInterfaceDecl *> ToDeclOrErr = import(T->getDecl());1931  if (!ToDeclOrErr)1932    return ToDeclOrErr.takeError();1933 1934  return Importer.getToContext().getObjCInterfaceType(*ToDeclOrErr);1935}1936 1937ExpectedType ASTNodeImporter::VisitObjCObjectType(const ObjCObjectType *T) {1938  ExpectedType ToBaseTypeOrErr = import(T->getBaseType());1939  if (!ToBaseTypeOrErr)1940    return ToBaseTypeOrErr.takeError();1941 1942  SmallVector<QualType, 4> TypeArgs;1943  for (auto TypeArg : T->getTypeArgsAsWritten()) {1944    if (ExpectedType TyOrErr = import(TypeArg))1945      TypeArgs.push_back(*TyOrErr);1946    else1947      return TyOrErr.takeError();1948  }1949 1950  SmallVector<ObjCProtocolDecl *, 4> Protocols;1951  for (auto *P : T->quals()) {1952    if (Expected<ObjCProtocolDecl *> ProtocolOrErr = import(P))1953      Protocols.push_back(*ProtocolOrErr);1954    else1955      return ProtocolOrErr.takeError();1956 1957  }1958 1959  return Importer.getToContext().getObjCObjectType(*ToBaseTypeOrErr, TypeArgs,1960                                                   Protocols,1961                                                   T->isKindOfTypeAsWritten());1962}1963 1964ExpectedType1965ASTNodeImporter::VisitObjCObjectPointerType(const ObjCObjectPointerType *T) {1966  ExpectedType ToPointeeTypeOrErr = import(T->getPointeeType());1967  if (!ToPointeeTypeOrErr)1968    return ToPointeeTypeOrErr.takeError();1969 1970  return Importer.getToContext().getObjCObjectPointerType(*ToPointeeTypeOrErr);1971}1972 1973ExpectedType1974ASTNodeImporter::VisitMacroQualifiedType(const MacroQualifiedType *T) {1975  ExpectedType ToUnderlyingTypeOrErr = import(T->getUnderlyingType());1976  if (!ToUnderlyingTypeOrErr)1977    return ToUnderlyingTypeOrErr.takeError();1978 1979  IdentifierInfo *ToIdentifier = Importer.Import(T->getMacroIdentifier());1980  return Importer.getToContext().getMacroQualifiedType(*ToUnderlyingTypeOrErr,1981                                                       ToIdentifier);1982}1983 1984ExpectedType clang::ASTNodeImporter::VisitAdjustedType(const AdjustedType *T) {1985  Error Err = Error::success();1986  QualType ToOriginalType = importChecked(Err, T->getOriginalType());1987  QualType ToAdjustedType = importChecked(Err, T->getAdjustedType());1988  if (Err)1989    return std::move(Err);1990 1991  return Importer.getToContext().getAdjustedType(ToOriginalType,1992                                                 ToAdjustedType);1993}1994 1995ExpectedType clang::ASTNodeImporter::VisitBitIntType(const BitIntType *T) {1996  return Importer.getToContext().getBitIntType(T->isUnsigned(),1997                                               T->getNumBits());1998}1999 2000ExpectedType clang::ASTNodeImporter::VisitBTFTagAttributedType(2001    const clang::BTFTagAttributedType *T) {2002  Error Err = Error::success();2003  const BTFTypeTagAttr *ToBTFAttr = importChecked(Err, T->getAttr());2004  QualType ToWrappedType = importChecked(Err, T->getWrappedType());2005  if (Err)2006    return std::move(Err);2007 2008  return Importer.getToContext().getBTFTagAttributedType(ToBTFAttr,2009                                                         ToWrappedType);2010}2011 2012ExpectedType clang::ASTNodeImporter::VisitHLSLAttributedResourceType(2013    const clang::HLSLAttributedResourceType *T) {2014  Error Err = Error::success();2015  const HLSLAttributedResourceType::Attributes &ToAttrs = T->getAttrs();2016  QualType ToWrappedType = importChecked(Err, T->getWrappedType());2017  QualType ToContainedType = importChecked(Err, T->getContainedType());2018  if (Err)2019    return std::move(Err);2020 2021  return Importer.getToContext().getHLSLAttributedResourceType(2022      ToWrappedType, ToContainedType, ToAttrs);2023}2024 2025ExpectedType clang::ASTNodeImporter::VisitHLSLInlineSpirvType(2026    const clang::HLSLInlineSpirvType *T) {2027  Error Err = Error::success();2028 2029  uint32_t ToOpcode = T->getOpcode();2030  uint32_t ToSize = T->getSize();2031  uint32_t ToAlignment = T->getAlignment();2032 2033  llvm::SmallVector<SpirvOperand> ToOperands;2034 2035  for (auto &Operand : T->getOperands()) {2036    using SpirvOperandKind = SpirvOperand::SpirvOperandKind;2037 2038    switch (Operand.getKind()) {2039    case SpirvOperandKind::ConstantId:2040      ToOperands.push_back(SpirvOperand::createConstant(2041          importChecked(Err, Operand.getResultType()), Operand.getValue()));2042      break;2043    case SpirvOperandKind::Literal:2044      ToOperands.push_back(SpirvOperand::createLiteral(Operand.getValue()));2045      break;2046    case SpirvOperandKind::TypeId:2047      ToOperands.push_back(SpirvOperand::createType(2048          importChecked(Err, Operand.getResultType())));2049      break;2050    default:2051      llvm_unreachable("Invalid SpirvOperand kind");2052    }2053 2054    if (Err)2055      return std::move(Err);2056  }2057 2058  return Importer.getToContext().getHLSLInlineSpirvType(2059      ToOpcode, ToSize, ToAlignment, ToOperands);2060}2061 2062ExpectedType clang::ASTNodeImporter::VisitConstantMatrixType(2063    const clang::ConstantMatrixType *T) {2064  ExpectedType ToElementTypeOrErr = import(T->getElementType());2065  if (!ToElementTypeOrErr)2066    return ToElementTypeOrErr.takeError();2067 2068  return Importer.getToContext().getConstantMatrixType(2069      *ToElementTypeOrErr, T->getNumRows(), T->getNumColumns());2070}2071 2072ExpectedType clang::ASTNodeImporter::VisitDependentAddressSpaceType(2073    const clang::DependentAddressSpaceType *T) {2074  Error Err = Error::success();2075  QualType ToPointeeType = importChecked(Err, T->getPointeeType());2076  Expr *ToAddrSpaceExpr = importChecked(Err, T->getAddrSpaceExpr());2077  SourceLocation ToAttrLoc = importChecked(Err, T->getAttributeLoc());2078  if (Err)2079    return std::move(Err);2080 2081  return Importer.getToContext().getDependentAddressSpaceType(2082      ToPointeeType, ToAddrSpaceExpr, ToAttrLoc);2083}2084 2085ExpectedType clang::ASTNodeImporter::VisitDependentBitIntType(2086    const clang::DependentBitIntType *T) {2087  ExpectedExpr ToNumBitsExprOrErr = import(T->getNumBitsExpr());2088  if (!ToNumBitsExprOrErr)2089    return ToNumBitsExprOrErr.takeError();2090  return Importer.getToContext().getDependentBitIntType(T->isUnsigned(),2091                                                        *ToNumBitsExprOrErr);2092}2093 2094ExpectedType clang::ASTNodeImporter::VisitPredefinedSugarType(2095    const clang::PredefinedSugarType *T) {2096  return Importer.getToContext().getPredefinedSugarType(T->getKind());2097}2098 2099ExpectedType clang::ASTNodeImporter::VisitDependentSizedMatrixType(2100    const clang::DependentSizedMatrixType *T) {2101  Error Err = Error::success();2102  QualType ToElementType = importChecked(Err, T->getElementType());2103  Expr *ToRowExpr = importChecked(Err, T->getRowExpr());2104  Expr *ToColumnExpr = importChecked(Err, T->getColumnExpr());2105  SourceLocation ToAttrLoc = importChecked(Err, T->getAttributeLoc());2106  if (Err)2107    return std::move(Err);2108 2109  return Importer.getToContext().getDependentSizedMatrixType(2110      ToElementType, ToRowExpr, ToColumnExpr, ToAttrLoc);2111}2112 2113ExpectedType clang::ASTNodeImporter::VisitDependentVectorType(2114    const clang::DependentVectorType *T) {2115  Error Err = Error::success();2116  QualType ToElementType = importChecked(Err, T->getElementType());2117  Expr *ToSizeExpr = importChecked(Err, T->getSizeExpr());2118  SourceLocation ToAttrLoc = importChecked(Err, T->getAttributeLoc());2119  if (Err)2120    return std::move(Err);2121 2122  return Importer.getToContext().getDependentVectorType(2123      ToElementType, ToSizeExpr, ToAttrLoc, T->getVectorKind());2124}2125 2126ExpectedType clang::ASTNodeImporter::VisitObjCTypeParamType(2127    const clang::ObjCTypeParamType *T) {2128  Expected<ObjCTypeParamDecl *> ToDeclOrErr = import(T->getDecl());2129  if (!ToDeclOrErr)2130    return ToDeclOrErr.takeError();2131 2132  SmallVector<ObjCProtocolDecl *, 4> ToProtocols;2133  for (ObjCProtocolDecl *FromProtocol : T->getProtocols()) {2134    Expected<ObjCProtocolDecl *> ToProtocolOrErr = import(FromProtocol);2135    if (!ToProtocolOrErr)2136      return ToProtocolOrErr.takeError();2137    ToProtocols.push_back(*ToProtocolOrErr);2138  }2139 2140  return Importer.getToContext().getObjCTypeParamType(*ToDeclOrErr,2141                                                      ToProtocols);2142}2143 2144ExpectedType clang::ASTNodeImporter::VisitPipeType(const clang::PipeType *T) {2145  ExpectedType ToElementTypeOrErr = import(T->getElementType());2146  if (!ToElementTypeOrErr)2147    return ToElementTypeOrErr.takeError();2148 2149  ASTContext &ToCtx = Importer.getToContext();2150  if (T->isReadOnly())2151    return ToCtx.getReadPipeType(*ToElementTypeOrErr);2152  else2153    return ToCtx.getWritePipeType(*ToElementTypeOrErr);2154}2155 2156//----------------------------------------------------------------------------2157// Import Declarations2158//----------------------------------------------------------------------------2159Error ASTNodeImporter::ImportDeclParts(2160    NamedDecl *D, DeclContext *&DC, DeclContext *&LexicalDC,2161    DeclarationName &Name, NamedDecl *&ToD, SourceLocation &Loc) {2162  // Check if RecordDecl is in FunctionDecl parameters to avoid infinite loop.2163  // example: int struct_in_proto(struct data_t{int a;int b;} *d);2164  // FIXME: We could support these constructs by importing a different type of2165  // this parameter and by importing the original type of the parameter only2166  // after the FunctionDecl is created. See2167  // VisitFunctionDecl::UsedDifferentProtoType.2168  DeclContext *OrigDC = D->getDeclContext();2169  FunctionDecl *FunDecl;2170  if (isa<RecordDecl>(D) && (FunDecl = dyn_cast<FunctionDecl>(OrigDC)) &&2171      FunDecl->hasBody()) {2172    auto getLeafPointeeType = [](const Type *T) {2173      while (T->isPointerType() || T->isArrayType()) {2174        T = T->getPointeeOrArrayElementType();2175      }2176      return T;2177    };2178    for (const ParmVarDecl *P : FunDecl->parameters()) {2179      const Type *LeafT =2180          getLeafPointeeType(P->getType().getCanonicalType().getTypePtr());2181      auto *RT = dyn_cast<RecordType>(LeafT);2182      if (RT && RT->getDecl() == D) {2183        Importer.FromDiag(D->getLocation(), diag::err_unsupported_ast_node)2184            << D->getDeclKindName();2185        return make_error<ASTImportError>(ASTImportError::UnsupportedConstruct);2186      }2187    }2188  }2189 2190  // Import the context of this declaration.2191  if (Error Err = ImportDeclContext(D, DC, LexicalDC))2192    return Err;2193 2194  // Import the name of this declaration.2195  if (Error Err = importInto(Name, D->getDeclName()))2196    return Err;2197 2198  // Import the location of this declaration.2199  if (Error Err = importInto(Loc, D->getLocation()))2200    return Err;2201 2202  ToD = cast_or_null<NamedDecl>(Importer.GetAlreadyImportedOrNull(D));2203  if (ToD)2204    if (Error Err = ASTNodeImporter(*this).ImportDefinitionIfNeeded(D, ToD))2205      return Err;2206 2207  return Error::success();2208}2209 2210Error ASTNodeImporter::ImportDeclParts(NamedDecl *D, DeclarationName &Name,2211                                       NamedDecl *&ToD, SourceLocation &Loc) {2212 2213  // Import the name of this declaration.2214  if (Error Err = importInto(Name, D->getDeclName()))2215    return Err;2216 2217  // Import the location of this declaration.2218  if (Error Err = importInto(Loc, D->getLocation()))2219    return Err;2220 2221  ToD = cast_or_null<NamedDecl>(Importer.GetAlreadyImportedOrNull(D));2222  if (ToD)2223    if (Error Err = ASTNodeImporter(*this).ImportDefinitionIfNeeded(D, ToD))2224      return Err;2225 2226  return Error::success();2227}2228 2229Error ASTNodeImporter::ImportDefinitionIfNeeded(Decl *FromD, Decl *ToD) {2230  if (!FromD)2231    return Error::success();2232 2233  if (!ToD)2234    if (Error Err = importInto(ToD, FromD))2235      return Err;2236 2237  if (RecordDecl *FromRecord = dyn_cast<RecordDecl>(FromD)) {2238    if (RecordDecl *ToRecord = cast<RecordDecl>(ToD)) {2239      if (FromRecord->getDefinition() && FromRecord->isCompleteDefinition() &&2240          !ToRecord->getDefinition()) {2241        if (Error Err = ImportDefinition(FromRecord, ToRecord))2242          return Err;2243      }2244    }2245    return Error::success();2246  }2247 2248  if (EnumDecl *FromEnum = dyn_cast<EnumDecl>(FromD)) {2249    if (EnumDecl *ToEnum = cast<EnumDecl>(ToD)) {2250      if (FromEnum->getDefinition() && !ToEnum->getDefinition()) {2251        if (Error Err = ImportDefinition(FromEnum, ToEnum))2252          return Err;2253      }2254    }2255    return Error::success();2256  }2257 2258  return Error::success();2259}2260 2261Error2262ASTNodeImporter::ImportDeclarationNameLoc(2263    const DeclarationNameInfo &From, DeclarationNameInfo& To) {2264  // NOTE: To.Name and To.Loc are already imported.2265  // We only have to import To.LocInfo.2266  switch (To.getName().getNameKind()) {2267  case DeclarationName::Identifier:2268  case DeclarationName::ObjCZeroArgSelector:2269  case DeclarationName::ObjCOneArgSelector:2270  case DeclarationName::ObjCMultiArgSelector:2271  case DeclarationName::CXXUsingDirective:2272  case DeclarationName::CXXDeductionGuideName:2273    return Error::success();2274 2275  case DeclarationName::CXXOperatorName: {2276    if (auto ToRangeOrErr = import(From.getCXXOperatorNameRange()))2277      To.setCXXOperatorNameRange(*ToRangeOrErr);2278    else2279      return ToRangeOrErr.takeError();2280    return Error::success();2281  }2282  case DeclarationName::CXXLiteralOperatorName: {2283    if (ExpectedSLoc LocOrErr = import(From.getCXXLiteralOperatorNameLoc()))2284      To.setCXXLiteralOperatorNameLoc(*LocOrErr);2285    else2286      return LocOrErr.takeError();2287    return Error::success();2288  }2289  case DeclarationName::CXXConstructorName:2290  case DeclarationName::CXXDestructorName:2291  case DeclarationName::CXXConversionFunctionName: {2292    if (auto ToTInfoOrErr = import(From.getNamedTypeInfo()))2293      To.setNamedTypeInfo(*ToTInfoOrErr);2294    else2295      return ToTInfoOrErr.takeError();2296    return Error::success();2297  }2298  }2299  llvm_unreachable("Unknown name kind.");2300}2301 2302Error2303ASTNodeImporter::ImportDeclContext(DeclContext *FromDC, bool ForceImport) {2304  if (Importer.isMinimalImport() && !ForceImport) {2305    auto ToDCOrErr = Importer.ImportContext(FromDC);2306    return ToDCOrErr.takeError();2307  }2308 2309  // We use strict error handling in case of records and enums, but not2310  // with e.g. namespaces.2311  //2312  // FIXME Clients of the ASTImporter should be able to choose an2313  // appropriate error handling strategy for their needs.  For instance,2314  // they may not want to mark an entire namespace as erroneous merely2315  // because there is an ODR error with two typedefs.  As another example,2316  // the client may allow EnumConstantDecls with same names but with2317  // different values in two distinct translation units.2318  ChildErrorHandlingStrategy HandleChildErrors(FromDC);2319 2320  auto MightNeedReordering = [](const Decl *D) {2321    return isa<FieldDecl>(D) || isa<IndirectFieldDecl>(D) || isa<FriendDecl>(D);2322  };2323 2324  // Import everything that might need reordering first.2325  Error ChildErrors = Error::success();2326  for (auto *From : FromDC->decls()) {2327    if (!MightNeedReordering(From))2328      continue;2329 2330    ExpectedDecl ImportedOrErr = import(From);2331 2332    // If we are in the process of ImportDefinition(...) for a RecordDecl we2333    // want to make sure that we are also completing each FieldDecl. There2334    // are currently cases where this does not happen and this is correctness2335    // fix since operations such as code generation will expect this to be so.2336    if (!ImportedOrErr) {2337      HandleChildErrors.handleChildImportResult(ChildErrors,2338                                                ImportedOrErr.takeError());2339      continue;2340    }2341    FieldDecl *FieldFrom = dyn_cast_or_null<FieldDecl>(From);2342    Decl *ImportedDecl = *ImportedOrErr;2343    FieldDecl *FieldTo = dyn_cast_or_null<FieldDecl>(ImportedDecl);2344    if (FieldFrom && FieldTo) {2345      Error Err = ImportFieldDeclDefinition(FieldFrom, FieldTo);2346      HandleChildErrors.handleChildImportResult(ChildErrors, std::move(Err));2347    }2348  }2349 2350  // We reorder declarations in RecordDecls because they may have another order2351  // in the "to" context than they have in the "from" context. This may happen2352  // e.g when we import a class like this:2353  //    struct declToImport {2354  //        int a = c + b;2355  //        int b = 1;2356  //        int c = 2;2357  //    };2358  // During the import of `a` we import first the dependencies in sequence,2359  // thus the order would be `c`, `b`, `a`. We will get the normal order by2360  // first removing the already imported members and then adding them in the2361  // order as they appear in the "from" context.2362  //2363  // Keeping field order is vital because it determines structure layout.2364  //2365  // Here and below, we cannot call field_begin() method and its callers on2366  // ToDC if it has an external storage. Calling field_begin() will2367  // automatically load all the fields by calling2368  // LoadFieldsFromExternalStorage(). LoadFieldsFromExternalStorage() would2369  // call ASTImporter::Import(). This is because the ExternalASTSource2370  // interface in LLDB is implemented by the means of the ASTImporter. However,2371  // calling an import at this point would result in an uncontrolled import, we2372  // must avoid that.2373 2374  auto ToDCOrErr = Importer.ImportContext(FromDC);2375  if (!ToDCOrErr) {2376    consumeError(std::move(ChildErrors));2377    return ToDCOrErr.takeError();2378  }2379 2380  if (const auto *FromRD = dyn_cast<RecordDecl>(FromDC)) {2381    DeclContext *ToDC = *ToDCOrErr;2382    // Remove all declarations, which may be in wrong order in the2383    // lexical DeclContext and then add them in the proper order.2384    for (auto *D : FromRD->decls()) {2385      if (!MightNeedReordering(D))2386        continue;2387 2388      assert(D && "DC contains a null decl");2389      if (Decl *ToD = Importer.GetAlreadyImportedOrNull(D)) {2390        // Remove only the decls which we successfully imported.2391        assert(ToDC == ToD->getLexicalDeclContext() && ToDC->containsDecl(ToD));2392        // Remove the decl from its wrong place in the linked list.2393        ToDC->removeDecl(ToD);2394        // Add the decl to the end of the linked list.2395        // This time it will be at the proper place because the enclosing for2396        // loop iterates in the original (good) order of the decls.2397        ToDC->addDeclInternal(ToD);2398      }2399    }2400  }2401 2402  // Import everything else.2403  for (auto *From : FromDC->decls()) {2404    if (MightNeedReordering(From))2405      continue;2406 2407    ExpectedDecl ImportedOrErr = import(From);2408    if (!ImportedOrErr)2409      HandleChildErrors.handleChildImportResult(ChildErrors,2410                                                ImportedOrErr.takeError());2411  }2412 2413  return ChildErrors;2414}2415 2416Error ASTNodeImporter::ImportFieldDeclDefinition(const FieldDecl *From,2417                                                 const FieldDecl *To) {2418  RecordDecl *FromRecordDecl = nullptr;2419  RecordDecl *ToRecordDecl = nullptr;2420  // If we have a field that is an ArrayType we need to check if the array2421  // element is a RecordDecl and if so we need to import the definition.2422  QualType FromType = From->getType();2423  QualType ToType = To->getType();2424  if (FromType->isArrayType()) {2425    // getBaseElementTypeUnsafe(...) handles multi-dimensional arrays for us.2426    FromRecordDecl = FromType->getBaseElementTypeUnsafe()->getAsRecordDecl();2427    ToRecordDecl = ToType->getBaseElementTypeUnsafe()->getAsRecordDecl();2428  }2429 2430  if (!FromRecordDecl || !ToRecordDecl) {2431    const RecordType *RecordFrom = FromType->getAs<RecordType>();2432    const RecordType *RecordTo = ToType->getAs<RecordType>();2433 2434    if (RecordFrom && RecordTo) {2435      FromRecordDecl = RecordFrom->getDecl();2436      ToRecordDecl = RecordTo->getDecl();2437    }2438  }2439 2440  if (FromRecordDecl && ToRecordDecl) {2441    if (FromRecordDecl->isCompleteDefinition() &&2442        !ToRecordDecl->isCompleteDefinition())2443      return ImportDefinition(FromRecordDecl, ToRecordDecl);2444  }2445 2446  return Error::success();2447}2448 2449Error ASTNodeImporter::ImportDeclContext(2450    Decl *FromD, DeclContext *&ToDC, DeclContext *&ToLexicalDC) {2451  auto ToDCOrErr = Importer.ImportContext(FromD->getDeclContext());2452  if (!ToDCOrErr)2453    return ToDCOrErr.takeError();2454  ToDC = *ToDCOrErr;2455 2456  if (FromD->getDeclContext() != FromD->getLexicalDeclContext()) {2457    auto ToLexicalDCOrErr = Importer.ImportContext(2458        FromD->getLexicalDeclContext());2459    if (!ToLexicalDCOrErr)2460      return ToLexicalDCOrErr.takeError();2461    ToLexicalDC = *ToLexicalDCOrErr;2462  } else2463    ToLexicalDC = ToDC;2464 2465  return Error::success();2466}2467 2468Error ASTNodeImporter::ImportImplicitMethods(2469    const CXXRecordDecl *From, CXXRecordDecl *To) {2470  assert(From->isCompleteDefinition() && To->getDefinition() == To &&2471      "Import implicit methods to or from non-definition");2472 2473  for (CXXMethodDecl *FromM : From->methods())2474    if (FromM->isImplicit()) {2475      Expected<CXXMethodDecl *> ToMOrErr = import(FromM);2476      if (!ToMOrErr)2477        return ToMOrErr.takeError();2478    }2479 2480  return Error::success();2481}2482 2483static Error setTypedefNameForAnonDecl(TagDecl *From, TagDecl *To,2484                                       ASTImporter &Importer) {2485  if (TypedefNameDecl *FromTypedef = From->getTypedefNameForAnonDecl()) {2486    if (ExpectedDecl ToTypedefOrErr = Importer.Import(FromTypedef))2487      To->setTypedefNameForAnonDecl(cast<TypedefNameDecl>(*ToTypedefOrErr));2488    else2489      return ToTypedefOrErr.takeError();2490  }2491  return Error::success();2492}2493 2494Error ASTNodeImporter::ImportDefinition(2495    RecordDecl *From, RecordDecl *To, ImportDefinitionKind Kind) {2496  auto DefinitionCompleter = [To]() {2497    // There are cases in LLDB when we first import a class without its2498    // members. The class will have DefinitionData, but no members. Then,2499    // importDefinition is called from LLDB, which tries to get the members, so2500    // when we get here, the class already has the DefinitionData set, so we2501    // must unset the CompleteDefinition here to be able to complete again the2502    // definition.2503    To->setCompleteDefinition(false);2504    To->completeDefinition();2505  };2506 2507  if (To->getDefinition() || To->isBeingDefined()) {2508    if (Kind == IDK_Everything ||2509        // In case of lambdas, the class already has a definition ptr set, but2510        // the contained decls are not imported yet. Also, isBeingDefined was2511        // set in CXXRecordDecl::CreateLambda.  We must import the contained2512        // decls here and finish the definition.2513        (To->isLambda() && shouldForceImportDeclContext(Kind))) {2514      if (To->isLambda()) {2515        auto *FromCXXRD = cast<CXXRecordDecl>(From);2516        SmallVector<LambdaCapture, 8> ToCaptures;2517        ToCaptures.reserve(FromCXXRD->capture_size());2518        for (const auto &FromCapture : FromCXXRD->captures()) {2519          if (auto ToCaptureOrErr = import(FromCapture))2520            ToCaptures.push_back(*ToCaptureOrErr);2521          else2522            return ToCaptureOrErr.takeError();2523        }2524        cast<CXXRecordDecl>(To)->setCaptures(Importer.getToContext(),2525                                             ToCaptures);2526      }2527 2528      Error Result = ImportDeclContext(From, /*ForceImport=*/true);2529      // Finish the definition of the lambda, set isBeingDefined to false.2530      if (To->isLambda())2531        DefinitionCompleter();2532      return Result;2533    }2534 2535    return Error::success();2536  }2537 2538  To->startDefinition();2539  // Set the definition to complete even if it is really not complete during2540  // import. Some AST constructs (expressions) require the record layout2541  // to be calculated (see 'clang::computeDependence') at the time they are2542  // constructed. Import of such AST node is possible during import of the2543  // same record, there is no way to have a completely defined record (all2544  // fields imported) at that time without multiple AST import passes.2545  if (!Importer.isMinimalImport())2546    To->setCompleteDefinition(true);2547  // Complete the definition even if error is returned.2548  // The RecordDecl may be already part of the AST so it is better to2549  // have it in complete state even if something is wrong with it.2550  auto DefinitionCompleterScopeExit =2551      llvm::make_scope_exit(DefinitionCompleter);2552 2553  if (Error Err = setTypedefNameForAnonDecl(From, To, Importer))2554    return Err;2555 2556  // Add base classes.2557  auto *ToCXX = dyn_cast<CXXRecordDecl>(To);2558  auto *FromCXX = dyn_cast<CXXRecordDecl>(From);2559  if (ToCXX && FromCXX && ToCXX->dataPtr() && FromCXX->dataPtr()) {2560 2561    struct CXXRecordDecl::DefinitionData &ToData = ToCXX->data();2562    struct CXXRecordDecl::DefinitionData &FromData = FromCXX->data();2563 2564    #define FIELD(Name, Width, Merge) \2565    ToData.Name = FromData.Name;2566    #include "clang/AST/CXXRecordDeclDefinitionBits.def"2567 2568    // Copy over the data stored in RecordDeclBits2569    ToCXX->setArgPassingRestrictions(FromCXX->getArgPassingRestrictions());2570 2571    SmallVector<CXXBaseSpecifier *, 4> Bases;2572    for (const auto &Base1 : FromCXX->bases()) {2573      ExpectedType TyOrErr = import(Base1.getType());2574      if (!TyOrErr)2575        return TyOrErr.takeError();2576 2577      SourceLocation EllipsisLoc;2578      if (Base1.isPackExpansion()) {2579        if (ExpectedSLoc LocOrErr = import(Base1.getEllipsisLoc()))2580          EllipsisLoc = *LocOrErr;2581        else2582          return LocOrErr.takeError();2583      }2584 2585      // Ensure that we have a definition for the base.2586      if (Error Err =2587          ImportDefinitionIfNeeded(Base1.getType()->getAsCXXRecordDecl()))2588        return Err;2589 2590      auto RangeOrErr = import(Base1.getSourceRange());2591      if (!RangeOrErr)2592        return RangeOrErr.takeError();2593 2594      auto TSIOrErr = import(Base1.getTypeSourceInfo());2595      if (!TSIOrErr)2596        return TSIOrErr.takeError();2597 2598      Bases.push_back(2599          new (Importer.getToContext()) CXXBaseSpecifier(2600              *RangeOrErr,2601              Base1.isVirtual(),2602              Base1.isBaseOfClass(),2603              Base1.getAccessSpecifierAsWritten(),2604              *TSIOrErr,2605              EllipsisLoc));2606    }2607    if (!Bases.empty())2608      ToCXX->setBases(Bases.data(), Bases.size());2609  }2610 2611  if (shouldForceImportDeclContext(Kind)) {2612    if (Error Err = ImportDeclContext(From, /*ForceImport=*/true))2613      return Err;2614  }2615 2616  return Error::success();2617}2618 2619Error ASTNodeImporter::ImportInitializer(VarDecl *From, VarDecl *To) {2620  if (To->getAnyInitializer())2621    return Error::success();2622 2623  Expr *FromInit = From->getInit();2624  if (!FromInit)2625    return Error::success();2626 2627  ExpectedExpr ToInitOrErr = import(FromInit);2628  if (!ToInitOrErr)2629    return ToInitOrErr.takeError();2630 2631  To->setInit(*ToInitOrErr);2632  if (EvaluatedStmt *FromEval = From->getEvaluatedStmt()) {2633    EvaluatedStmt *ToEval = To->ensureEvaluatedStmt();2634    ToEval->HasConstantInitialization = FromEval->HasConstantInitialization;2635    ToEval->HasConstantDestruction = FromEval->HasConstantDestruction;2636    // FIXME: Also import the initializer value.2637  }2638 2639  // FIXME: Other bits to merge?2640  return Error::success();2641}2642 2643Error ASTNodeImporter::ImportDefinition(2644    EnumDecl *From, EnumDecl *To, ImportDefinitionKind Kind) {2645  if (To->getDefinition() || To->isBeingDefined()) {2646    if (Kind == IDK_Everything)2647      return ImportDeclContext(From, /*ForceImport=*/true);2648    return Error::success();2649  }2650 2651  To->startDefinition();2652 2653  if (Error Err = setTypedefNameForAnonDecl(From, To, Importer))2654    return Err;2655 2656  ExpectedType ToTypeOrErr =2657      import(QualType(Importer.getFromContext().getCanonicalTagType(From)));2658  if (!ToTypeOrErr)2659    return ToTypeOrErr.takeError();2660 2661  ExpectedType ToPromotionTypeOrErr = import(From->getPromotionType());2662  if (!ToPromotionTypeOrErr)2663    return ToPromotionTypeOrErr.takeError();2664 2665  if (shouldForceImportDeclContext(Kind))2666    if (Error Err = ImportDeclContext(From, /*ForceImport=*/true))2667      return Err;2668 2669  // FIXME: we might need to merge the number of positive or negative bits2670  // if the enumerator lists don't match.2671  To->completeDefinition(*ToTypeOrErr, *ToPromotionTypeOrErr,2672                         From->getNumPositiveBits(),2673                         From->getNumNegativeBits());2674  return Error::success();2675}2676 2677Error ASTNodeImporter::ImportTemplateArguments(2678    ArrayRef<TemplateArgument> FromArgs,2679    SmallVectorImpl<TemplateArgument> &ToArgs) {2680  for (const auto &Arg : FromArgs) {2681    if (auto ToOrErr = import(Arg))2682      ToArgs.push_back(*ToOrErr);2683    else2684      return ToOrErr.takeError();2685  }2686 2687  return Error::success();2688}2689 2690// FIXME: Do not forget to remove this and use only 'import'.2691Expected<TemplateArgument>2692ASTNodeImporter::ImportTemplateArgument(const TemplateArgument &From) {2693  return import(From);2694}2695 2696template <typename InContainerTy>2697Error ASTNodeImporter::ImportTemplateArgumentListInfo(2698    const InContainerTy &Container, TemplateArgumentListInfo &ToTAInfo) {2699  for (const auto &FromLoc : Container) {2700    if (auto ToLocOrErr = import(FromLoc))2701      ToTAInfo.addArgument(*ToLocOrErr);2702    else2703      return ToLocOrErr.takeError();2704  }2705  return Error::success();2706}2707 2708static StructuralEquivalenceKind2709getStructuralEquivalenceKind(const ASTImporter &Importer) {2710  return Importer.isMinimalImport() ? StructuralEquivalenceKind::Minimal2711                                    : StructuralEquivalenceKind::Default;2712}2713 2714bool ASTNodeImporter::IsStructuralMatch(Decl *From, Decl *To, bool Complain,2715                                        bool IgnoreTemplateParmDepth) {2716  // Eliminate a potential failure point where we attempt to re-import2717  // something we're trying to import while completing ToRecord.2718  Decl *ToOrigin = Importer.GetOriginalDecl(To);2719  if (ToOrigin) {2720    To = ToOrigin;2721  }2722 2723  StructuralEquivalenceContext Ctx(2724      Importer.getToContext().getLangOpts(), Importer.getFromContext(),2725      Importer.getToContext(), Importer.getNonEquivalentDecls(),2726      getStructuralEquivalenceKind(Importer),2727      /*StrictTypeSpelling=*/false, Complain, /*ErrorOnTagTypeMismatch=*/false,2728      IgnoreTemplateParmDepth);2729  return Ctx.IsEquivalent(From, To);2730}2731 2732ExpectedDecl ASTNodeImporter::VisitDecl(Decl *D) {2733  Importer.FromDiag(D->getLocation(), diag::err_unsupported_ast_node)2734    << D->getDeclKindName();2735  return make_error<ASTImportError>(ASTImportError::UnsupportedConstruct);2736}2737 2738ExpectedDecl ASTNodeImporter::VisitImportDecl(ImportDecl *D) {2739  Importer.FromDiag(D->getLocation(), diag::err_unsupported_ast_node)2740      << D->getDeclKindName();2741  return make_error<ASTImportError>(ASTImportError::UnsupportedConstruct);2742}2743 2744ExpectedDecl ASTNodeImporter::VisitEmptyDecl(EmptyDecl *D) {2745  // Import the context of this declaration.2746  DeclContext *DC, *LexicalDC;2747  if (Error Err = ImportDeclContext(D, DC, LexicalDC))2748    return std::move(Err);2749 2750  // Import the location of this declaration.2751  ExpectedSLoc LocOrErr = import(D->getLocation());2752  if (!LocOrErr)2753    return LocOrErr.takeError();2754 2755  EmptyDecl *ToD;2756  if (GetImportedOrCreateDecl(ToD, D, Importer.getToContext(), DC, *LocOrErr))2757    return ToD;2758 2759  ToD->setLexicalDeclContext(LexicalDC);2760  LexicalDC->addDeclInternal(ToD);2761  return ToD;2762}2763 2764ExpectedDecl ASTNodeImporter::VisitTranslationUnitDecl(TranslationUnitDecl *D) {2765  TranslationUnitDecl *ToD =2766    Importer.getToContext().getTranslationUnitDecl();2767 2768  Importer.MapImported(D, ToD);2769 2770  return ToD;2771}2772 2773ExpectedDecl ASTNodeImporter::VisitBindingDecl(BindingDecl *D) {2774  DeclContext *DC, *LexicalDC;2775  DeclarationName Name;2776  SourceLocation Loc;2777  NamedDecl *ToND;2778  if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToND, Loc))2779    return std::move(Err);2780  if (ToND)2781    return ToND;2782 2783  BindingDecl *ToD;2784  if (GetImportedOrCreateDecl(ToD, D, Importer.getToContext(), DC, Loc,2785                              Name.getAsIdentifierInfo(), D->getType()))2786    return ToD;2787 2788  Error Err = Error::success();2789  QualType ToType = importChecked(Err, D->getType());2790  Expr *ToBinding = importChecked(Err, D->getBinding());2791  ValueDecl *ToDecomposedDecl = importChecked(Err, D->getDecomposedDecl());2792  if (Err)2793    return std::move(Err);2794 2795  ToD->setBinding(ToType, ToBinding);2796  ToD->setDecomposedDecl(ToDecomposedDecl);2797  addDeclToContexts(D, ToD);2798 2799  return ToD;2800}2801 2802ExpectedDecl ASTNodeImporter::VisitAccessSpecDecl(AccessSpecDecl *D) {2803  ExpectedSLoc LocOrErr = import(D->getLocation());2804  if (!LocOrErr)2805    return LocOrErr.takeError();2806  auto ColonLocOrErr = import(D->getColonLoc());2807  if (!ColonLocOrErr)2808    return ColonLocOrErr.takeError();2809 2810  // Import the context of this declaration.2811  auto DCOrErr = Importer.ImportContext(D->getDeclContext());2812  if (!DCOrErr)2813    return DCOrErr.takeError();2814  DeclContext *DC = *DCOrErr;2815 2816  AccessSpecDecl *ToD;2817  if (GetImportedOrCreateDecl(ToD, D, Importer.getToContext(), D->getAccess(),2818                              DC, *LocOrErr, *ColonLocOrErr))2819    return ToD;2820 2821  // Lexical DeclContext and Semantic DeclContext2822  // is always the same for the accessSpec.2823  ToD->setLexicalDeclContext(DC);2824  DC->addDeclInternal(ToD);2825 2826  return ToD;2827}2828 2829ExpectedDecl ASTNodeImporter::VisitStaticAssertDecl(StaticAssertDecl *D) {2830  auto DCOrErr = Importer.ImportContext(D->getDeclContext());2831  if (!DCOrErr)2832    return DCOrErr.takeError();2833  DeclContext *DC = *DCOrErr;2834  DeclContext *LexicalDC = DC;2835 2836  Error Err = Error::success();2837  auto ToLocation = importChecked(Err, D->getLocation());2838  auto ToRParenLoc = importChecked(Err, D->getRParenLoc());2839  auto ToAssertExpr = importChecked(Err, D->getAssertExpr());2840  auto ToMessage = importChecked(Err, D->getMessage());2841  if (Err)2842    return std::move(Err);2843 2844  StaticAssertDecl *ToD;2845  if (GetImportedOrCreateDecl(2846      ToD, D, Importer.getToContext(), DC, ToLocation, ToAssertExpr, ToMessage,2847      ToRParenLoc, D->isFailed()))2848    return ToD;2849 2850  ToD->setLexicalDeclContext(LexicalDC);2851  LexicalDC->addDeclInternal(ToD);2852  return ToD;2853}2854 2855ExpectedDecl ASTNodeImporter::VisitNamespaceDecl(NamespaceDecl *D) {2856  // Import the major distinguishing characteristics of this namespace.2857  DeclContext *DC, *LexicalDC;2858  DeclarationName Name;2859  SourceLocation Loc;2860  NamedDecl *ToD;2861  if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))2862    return std::move(Err);2863  if (ToD)2864    return ToD;2865 2866  NamespaceDecl *MergeWithNamespace = nullptr;2867  if (!Name) {2868    // This is an anonymous namespace. Adopt an existing anonymous2869    // namespace if we can.2870    DeclContext *EnclosingDC = DC->getEnclosingNamespaceContext();2871    if (auto *TU = dyn_cast<TranslationUnitDecl>(EnclosingDC))2872      MergeWithNamespace = TU->getAnonymousNamespace();2873    else2874      MergeWithNamespace =2875          cast<NamespaceDecl>(EnclosingDC)->getAnonymousNamespace();2876  } else {2877    SmallVector<NamedDecl *, 4> ConflictingDecls;2878    auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);2879    for (auto *FoundDecl : FoundDecls) {2880      if (!FoundDecl->isInIdentifierNamespace(Decl::IDNS_Namespace))2881        continue;2882 2883      if (auto *FoundNS = dyn_cast<NamespaceDecl>(FoundDecl)) {2884        MergeWithNamespace = FoundNS;2885        ConflictingDecls.clear();2886        break;2887      }2888 2889      ConflictingDecls.push_back(FoundDecl);2890    }2891 2892    if (!ConflictingDecls.empty()) {2893      ExpectedName NameOrErr = Importer.HandleNameConflict(2894          Name, DC, Decl::IDNS_Namespace, ConflictingDecls.data(),2895          ConflictingDecls.size());2896      if (NameOrErr)2897        Name = NameOrErr.get();2898      else2899        return NameOrErr.takeError();2900    }2901  }2902 2903  ExpectedSLoc BeginLocOrErr = import(D->getBeginLoc());2904  if (!BeginLocOrErr)2905    return BeginLocOrErr.takeError();2906  ExpectedSLoc RBraceLocOrErr = import(D->getRBraceLoc());2907  if (!RBraceLocOrErr)2908    return RBraceLocOrErr.takeError();2909 2910  // Create the "to" namespace, if needed.2911  NamespaceDecl *ToNamespace = MergeWithNamespace;2912  if (!ToNamespace) {2913    if (GetImportedOrCreateDecl(ToNamespace, D, Importer.getToContext(), DC,2914                                D->isInline(), *BeginLocOrErr, Loc,2915                                Name.getAsIdentifierInfo(),2916                                /*PrevDecl=*/nullptr, D->isNested()))2917      return ToNamespace;2918    ToNamespace->setRBraceLoc(*RBraceLocOrErr);2919    ToNamespace->setLexicalDeclContext(LexicalDC);2920    LexicalDC->addDeclInternal(ToNamespace);2921 2922    // If this is an anonymous namespace, register it as the anonymous2923    // namespace within its context.2924    if (!Name) {2925      if (auto *TU = dyn_cast<TranslationUnitDecl>(DC))2926        TU->setAnonymousNamespace(ToNamespace);2927      else2928        cast<NamespaceDecl>(DC)->setAnonymousNamespace(ToNamespace);2929    }2930  }2931  Importer.MapImported(D, ToNamespace);2932 2933  if (Error Err = ImportDeclContext(D))2934    return std::move(Err);2935 2936  return ToNamespace;2937}2938 2939ExpectedDecl ASTNodeImporter::VisitNamespaceAliasDecl(NamespaceAliasDecl *D) {2940  // Import the major distinguishing characteristics of this namespace.2941  DeclContext *DC, *LexicalDC;2942  DeclarationName Name;2943  SourceLocation Loc;2944  NamedDecl *LookupD;2945  if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, LookupD, Loc))2946    return std::move(Err);2947  if (LookupD)2948    return LookupD;2949 2950  // NOTE: No conflict resolution is done for namespace aliases now.2951 2952  Error Err = Error::success();2953  auto ToNamespaceLoc = importChecked(Err, D->getNamespaceLoc());2954  auto ToAliasLoc = importChecked(Err, D->getAliasLoc());2955  auto ToQualifierLoc = importChecked(Err, D->getQualifierLoc());2956  auto ToTargetNameLoc = importChecked(Err, D->getTargetNameLoc());2957  auto ToNamespace = importChecked(Err, D->getNamespace());2958  if (Err)2959    return std::move(Err);2960 2961  IdentifierInfo *ToIdentifier = Importer.Import(D->getIdentifier());2962 2963  NamespaceAliasDecl *ToD;2964  if (GetImportedOrCreateDecl(2965      ToD, D, Importer.getToContext(), DC, ToNamespaceLoc, ToAliasLoc,2966      ToIdentifier, ToQualifierLoc, ToTargetNameLoc, ToNamespace))2967    return ToD;2968 2969  ToD->setLexicalDeclContext(LexicalDC);2970  LexicalDC->addDeclInternal(ToD);2971 2972  return ToD;2973}2974 2975ExpectedDecl2976ASTNodeImporter::VisitTypedefNameDecl(TypedefNameDecl *D, bool IsAlias) {2977  // Import the major distinguishing characteristics of this typedef.2978  DeclarationName Name;2979  SourceLocation Loc;2980  NamedDecl *ToD;2981  // Do not import the DeclContext, we will import it once the TypedefNameDecl2982  // is created.2983  if (Error Err = ImportDeclParts(D, Name, ToD, Loc))2984    return std::move(Err);2985  if (ToD)2986    return ToD;2987 2988  DeclContext *DC = cast_or_null<DeclContext>(2989      Importer.GetAlreadyImportedOrNull(cast<Decl>(D->getDeclContext())));2990  DeclContext *LexicalDC =2991      cast_or_null<DeclContext>(Importer.GetAlreadyImportedOrNull(2992          cast<Decl>(D->getLexicalDeclContext())));2993 2994  // If this typedef is not in block scope, determine whether we've2995  // seen a typedef with the same name (that we can merge with) or any2996  // other entity by that name (which name lookup could conflict with).2997  // Note: Repeated typedefs are not valid in C99:2998  // 'typedef int T; typedef int T;' is invalid2999  // We do not care about this now.3000  if (DC && !DC->isFunctionOrMethod()) {3001    SmallVector<NamedDecl *, 4> ConflictingDecls;3002    unsigned IDNS = Decl::IDNS_Ordinary;3003    auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);3004    for (auto *FoundDecl : FoundDecls) {3005      if (!FoundDecl->isInIdentifierNamespace(IDNS))3006        continue;3007      if (auto *FoundTypedef = dyn_cast<TypedefNameDecl>(FoundDecl)) {3008        if (!hasSameVisibilityContextAndLinkage(FoundTypedef, D))3009          continue;3010 3011        QualType FromUT = D->getUnderlyingType();3012        QualType FoundUT = FoundTypedef->getUnderlyingType();3013        if (Importer.IsStructurallyEquivalent(FromUT, FoundUT)) {3014          // If the underlying declarations are unnamed records these can be3015          // imported as different types. We should create a distinct typedef3016          // node in this case.3017          // If we found an existing underlying type with a record in a3018          // different context (than the imported), this is already reason for3019          // having distinct typedef nodes for these.3020          // Again this can create situation like3021          // 'typedef int T; typedef int T;' but this is hard to avoid without3022          // a rename strategy at import.3023          if (!FromUT.isNull() && !FoundUT.isNull()) {3024            RecordDecl *FromR = FromUT->getAsRecordDecl();3025            RecordDecl *FoundR = FoundUT->getAsRecordDecl();3026            if (FromR && FoundR &&3027                !hasSameVisibilityContextAndLinkage(FoundR, FromR))3028              continue;3029          }3030          // If the "From" context has a complete underlying type but we3031          // already have a complete underlying type then return with that.3032          if (!FromUT->isIncompleteType() && !FoundUT->isIncompleteType())3033            return Importer.MapImported(D, FoundTypedef);3034          // FIXME Handle redecl chain. When you do that make consistent changes3035          // in ASTImporterLookupTable too.3036        } else {3037          ConflictingDecls.push_back(FoundDecl);3038        }3039      }3040    }3041 3042    if (!ConflictingDecls.empty()) {3043      ExpectedName NameOrErr = Importer.HandleNameConflict(3044          Name, DC, IDNS, ConflictingDecls.data(), ConflictingDecls.size());3045      if (NameOrErr)3046        Name = NameOrErr.get();3047      else3048        return NameOrErr.takeError();3049    }3050  }3051 3052  Error Err = Error::success();3053  auto ToUnderlyingType = importChecked(Err, D->getUnderlyingType());3054  auto ToTypeSourceInfo = importChecked(Err, D->getTypeSourceInfo());3055  auto ToBeginLoc = importChecked(Err, D->getBeginLoc());3056  if (Err)3057    return std::move(Err);3058 3059  // Create the new typedef node.3060  // FIXME: ToUnderlyingType is not used.3061  (void)ToUnderlyingType;3062  TypedefNameDecl *ToTypedef;3063  if (IsAlias) {3064    if (GetImportedOrCreateDecl<TypeAliasDecl>(3065        ToTypedef, D, Importer.getToContext(), DC, ToBeginLoc, Loc,3066        Name.getAsIdentifierInfo(), ToTypeSourceInfo))3067      return ToTypedef;3068  } else if (GetImportedOrCreateDecl<TypedefDecl>(3069      ToTypedef, D, Importer.getToContext(), DC, ToBeginLoc, Loc,3070      Name.getAsIdentifierInfo(), ToTypeSourceInfo))3071    return ToTypedef;3072 3073  // Import the DeclContext and set it to the Typedef.3074  if ((Err = ImportDeclContext(D, DC, LexicalDC)))3075    return std::move(Err);3076  ToTypedef->setDeclContext(DC);3077  ToTypedef->setLexicalDeclContext(LexicalDC);3078  // Add to the lookupTable because we could not do that in MapImported.3079  Importer.AddToLookupTable(ToTypedef);3080 3081  ToTypedef->setAccess(D->getAccess());3082 3083  // Templated declarations should not appear in DeclContext.3084  TypeAliasDecl *FromAlias = IsAlias ? cast<TypeAliasDecl>(D) : nullptr;3085  if (!FromAlias || !FromAlias->getDescribedAliasTemplate())3086    LexicalDC->addDeclInternal(ToTypedef);3087 3088  return ToTypedef;3089}3090 3091ExpectedDecl ASTNodeImporter::VisitTypedefDecl(TypedefDecl *D) {3092  return VisitTypedefNameDecl(D, /*IsAlias=*/false);3093}3094 3095ExpectedDecl ASTNodeImporter::VisitTypeAliasDecl(TypeAliasDecl *D) {3096  return VisitTypedefNameDecl(D, /*IsAlias=*/true);3097}3098 3099ExpectedDecl3100ASTNodeImporter::VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D) {3101  // Import the major distinguishing characteristics of this typedef.3102  DeclContext *DC, *LexicalDC;3103  DeclarationName Name;3104  SourceLocation Loc;3105  NamedDecl *FoundD;3106  if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, FoundD, Loc))3107    return std::move(Err);3108  if (FoundD)3109    return FoundD;3110 3111  // If this typedef is not in block scope, determine whether we've3112  // seen a typedef with the same name (that we can merge with) or any3113  // other entity by that name (which name lookup could conflict with).3114  if (!DC->isFunctionOrMethod()) {3115    SmallVector<NamedDecl *, 4> ConflictingDecls;3116    unsigned IDNS = Decl::IDNS_Ordinary;3117    auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);3118    for (auto *FoundDecl : FoundDecls) {3119      if (!FoundDecl->isInIdentifierNamespace(IDNS))3120        continue;3121      if (auto *FoundAlias = dyn_cast<TypeAliasTemplateDecl>(FoundDecl)) {3122        if (IsStructuralMatch(D, FoundAlias))3123          return Importer.MapImported(D, FoundAlias);3124        ConflictingDecls.push_back(FoundDecl);3125      }3126    }3127 3128    if (!ConflictingDecls.empty()) {3129      ExpectedName NameOrErr = Importer.HandleNameConflict(3130          Name, DC, IDNS, ConflictingDecls.data(), ConflictingDecls.size());3131      if (NameOrErr)3132        Name = NameOrErr.get();3133      else3134        return NameOrErr.takeError();3135    }3136  }3137 3138  Error Err = Error::success();3139  auto ToTemplateParameters = importChecked(Err, D->getTemplateParameters());3140  auto ToTemplatedDecl = importChecked(Err, D->getTemplatedDecl());3141  if (Err)3142    return std::move(Err);3143 3144  TypeAliasTemplateDecl *ToAlias;3145  if (GetImportedOrCreateDecl(ToAlias, D, Importer.getToContext(), DC, Loc,3146                              Name, ToTemplateParameters, ToTemplatedDecl))3147    return ToAlias;3148 3149  ToTemplatedDecl->setDescribedAliasTemplate(ToAlias);3150 3151  ToAlias->setAccess(D->getAccess());3152  ToAlias->setLexicalDeclContext(LexicalDC);3153  LexicalDC->addDeclInternal(ToAlias);3154  if (DC != Importer.getToContext().getTranslationUnitDecl())3155    updateLookupTableForTemplateParameters(*ToTemplateParameters);3156  return ToAlias;3157}3158 3159ExpectedDecl ASTNodeImporter::VisitLabelDecl(LabelDecl *D) {3160  // Import the major distinguishing characteristics of this label.3161  DeclContext *DC, *LexicalDC;3162  DeclarationName Name;3163  SourceLocation Loc;3164  NamedDecl *ToD;3165  if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))3166    return std::move(Err);3167  if (ToD)3168    return ToD;3169 3170  assert(LexicalDC->isFunctionOrMethod());3171 3172  LabelDecl *ToLabel;3173  if (D->isGnuLocal()) {3174    ExpectedSLoc BeginLocOrErr = import(D->getBeginLoc());3175    if (!BeginLocOrErr)3176      return BeginLocOrErr.takeError();3177    if (GetImportedOrCreateDecl(ToLabel, D, Importer.getToContext(), DC, Loc,3178                                Name.getAsIdentifierInfo(), *BeginLocOrErr))3179      return ToLabel;3180 3181  } else {3182    if (GetImportedOrCreateDecl(ToLabel, D, Importer.getToContext(), DC, Loc,3183                                Name.getAsIdentifierInfo()))3184      return ToLabel;3185 3186  }3187 3188  Expected<LabelStmt *> ToStmtOrErr = import(D->getStmt());3189  if (!ToStmtOrErr)3190    return ToStmtOrErr.takeError();3191 3192  ToLabel->setStmt(*ToStmtOrErr);3193  ToLabel->setLexicalDeclContext(LexicalDC);3194  LexicalDC->addDeclInternal(ToLabel);3195  return ToLabel;3196}3197 3198ExpectedDecl ASTNodeImporter::VisitEnumDecl(EnumDecl *D) {3199  // Import the major distinguishing characteristics of this enum.3200  DeclContext *DC, *LexicalDC;3201  DeclarationName Name;3202  SourceLocation Loc;3203  NamedDecl *ToD;3204  if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))3205    return std::move(Err);3206  if (ToD)3207    return ToD;3208 3209  // Figure out what enum name we're looking for.3210  unsigned IDNS = Decl::IDNS_Tag;3211  DeclarationName SearchName = Name;3212  if (!SearchName && D->getTypedefNameForAnonDecl()) {3213    if (Error Err = importInto(3214        SearchName, D->getTypedefNameForAnonDecl()->getDeclName()))3215      return std::move(Err);3216    IDNS = Decl::IDNS_Ordinary;3217  } else if (Importer.getToContext().getLangOpts().CPlusPlus)3218    IDNS |= Decl::IDNS_Ordinary;3219 3220  // We may already have an enum of the same name; try to find and match it.3221  EnumDecl *PrevDecl = nullptr;3222  if (!DC->isFunctionOrMethod()) {3223    SmallVector<NamedDecl *, 4> ConflictingDecls;3224    auto FoundDecls =3225        Importer.findDeclsInToCtx(DC, SearchName);3226    for (auto *FoundDecl : FoundDecls) {3227      if (!FoundDecl->isInIdentifierNamespace(IDNS))3228        continue;3229 3230      if (auto *Typedef = dyn_cast<TypedefNameDecl>(FoundDecl)) {3231        if (const auto *Tag = Typedef->getUnderlyingType()->getAs<TagType>())3232          FoundDecl = Tag->getDecl();3233      }3234 3235      if (auto *FoundEnum = dyn_cast<EnumDecl>(FoundDecl)) {3236        if (!hasSameVisibilityContextAndLinkage(FoundEnum, D))3237          continue;3238        if (IsStructuralMatch(D, FoundEnum, !SearchName.isEmpty())) {3239          EnumDecl *FoundDef = FoundEnum->getDefinition();3240          if (D->isThisDeclarationADefinition() && FoundDef)3241            return Importer.MapImported(D, FoundDef);3242          PrevDecl = FoundEnum->getMostRecentDecl();3243          break;3244        }3245        ConflictingDecls.push_back(FoundDecl);3246      }3247    }3248 3249    // In case of unnamed enums, we try to find an existing similar one, if none3250    // was found, perform the import always.3251    // Structural in-equivalence is not detected in this way here, but it may3252    // be found when the parent decl is imported (if the enum is part of a3253    // class). To make this totally exact a more difficult solution is needed.3254    if (SearchName && !ConflictingDecls.empty()) {3255      ExpectedName NameOrErr = Importer.HandleNameConflict(3256          SearchName, DC, IDNS, ConflictingDecls.data(),3257          ConflictingDecls.size());3258      if (NameOrErr)3259        Name = NameOrErr.get();3260      else3261        return NameOrErr.takeError();3262    }3263  }3264 3265  Error Err = Error::success();3266  auto ToBeginLoc = importChecked(Err, D->getBeginLoc());3267  auto ToQualifierLoc = importChecked(Err, D->getQualifierLoc());3268  auto ToIntegerType = importChecked(Err, D->getIntegerType());3269  auto ToBraceRange = importChecked(Err, D->getBraceRange());3270  if (Err)3271    return std::move(Err);3272 3273  // Create the enum declaration.3274  EnumDecl *D2;3275  if (GetImportedOrCreateDecl(3276          D2, D, Importer.getToContext(), DC, ToBeginLoc,3277          Loc, Name.getAsIdentifierInfo(), PrevDecl, D->isScoped(),3278          D->isScopedUsingClassTag(), D->isFixed()))3279    return D2;3280 3281  D2->setQualifierInfo(ToQualifierLoc);3282  D2->setIntegerType(ToIntegerType);3283  D2->setBraceRange(ToBraceRange);3284  D2->setAccess(D->getAccess());3285  D2->setLexicalDeclContext(LexicalDC);3286  addDeclToContexts(D, D2);3287 3288  if (MemberSpecializationInfo *MemberInfo = D->getMemberSpecializationInfo()) {3289    TemplateSpecializationKind SK = MemberInfo->getTemplateSpecializationKind();3290    EnumDecl *FromInst = D->getInstantiatedFromMemberEnum();3291    if (Expected<EnumDecl *> ToInstOrErr = import(FromInst))3292      D2->setInstantiationOfMemberEnum(*ToInstOrErr, SK);3293    else3294      return ToInstOrErr.takeError();3295    if (ExpectedSLoc POIOrErr = import(MemberInfo->getPointOfInstantiation()))3296      D2->getMemberSpecializationInfo()->setPointOfInstantiation(*POIOrErr);3297    else3298      return POIOrErr.takeError();3299  }3300 3301  // Import the definition3302  if (D->isCompleteDefinition())3303    if (Error Err = ImportDefinition(D, D2))3304      return std::move(Err);3305 3306  return D2;3307}3308 3309ExpectedDecl ASTNodeImporter::VisitRecordDecl(RecordDecl *D) {3310  bool IsFriendTemplate = false;3311  if (auto *DCXX = dyn_cast<CXXRecordDecl>(D)) {3312    IsFriendTemplate =3313        DCXX->getDescribedClassTemplate() &&3314        DCXX->getDescribedClassTemplate()->getFriendObjectKind() !=3315            Decl::FOK_None;3316  }3317 3318  // Import the major distinguishing characteristics of this record.3319  DeclContext *DC = nullptr, *LexicalDC = nullptr;3320  DeclarationName Name;3321  SourceLocation Loc;3322  NamedDecl *ToD = nullptr;3323  if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))3324    return std::move(Err);3325  if (ToD)3326    return ToD;3327 3328  // Figure out what structure name we're looking for.3329  unsigned IDNS = Decl::IDNS_Tag;3330  DeclarationName SearchName = Name;3331  if (!SearchName && D->getTypedefNameForAnonDecl()) {3332    if (Error Err = importInto(3333        SearchName, D->getTypedefNameForAnonDecl()->getDeclName()))3334      return std::move(Err);3335    IDNS = Decl::IDNS_Ordinary;3336  } else if (Importer.getToContext().getLangOpts().CPlusPlus)3337    IDNS |= Decl::IDNS_Ordinary | Decl::IDNS_TagFriend;3338 3339  bool IsDependentContext = DC != LexicalDC ? LexicalDC->isDependentContext()3340                                            : DC->isDependentContext();3341  bool DependentFriend = IsFriendTemplate && IsDependentContext;3342 3343  // We may already have a record of the same name; try to find and match it.3344  RecordDecl *PrevDecl = nullptr;3345  if (!DependentFriend && !DC->isFunctionOrMethod() && !D->isLambda()) {3346    SmallVector<NamedDecl *, 4> ConflictingDecls;3347    auto FoundDecls =3348        Importer.findDeclsInToCtx(DC, SearchName);3349    if (!FoundDecls.empty()) {3350      // We're going to have to compare D against potentially conflicting Decls,3351      // so complete it.3352      if (D->hasExternalLexicalStorage() && !D->isCompleteDefinition())3353        D->getASTContext().getExternalSource()->CompleteType(D);3354    }3355 3356    for (auto *FoundDecl : FoundDecls) {3357      if (!FoundDecl->isInIdentifierNamespace(IDNS))3358        continue;3359 3360      Decl *Found = FoundDecl;3361      if (auto *Typedef = dyn_cast<TypedefNameDecl>(Found)) {3362        if (const auto *Tag = Typedef->getUnderlyingType()->getAs<TagType>())3363          Found = Tag->getDecl();3364      }3365 3366      if (auto *FoundRecord = dyn_cast<RecordDecl>(Found)) {3367        // Do not emit false positive diagnostic in case of unnamed3368        // struct/union and in case of anonymous structs.  Would be false3369        // because there may be several anonymous/unnamed structs in a class.3370        // E.g. these are both valid:3371        //  struct A { // unnamed structs3372        //    struct { struct A *next; } entry0;3373        //    struct { struct A *next; } entry1;3374        //  };3375        //  struct X { struct { int a; }; struct { int b; }; }; // anon structs3376        if (!SearchName)3377          if (!IsStructuralMatch(D, FoundRecord, false))3378            continue;3379 3380        if (!hasSameVisibilityContextAndLinkage(FoundRecord, D))3381          continue;3382 3383        if (IsStructuralMatch(D, FoundRecord)) {3384          RecordDecl *FoundDef = FoundRecord->getDefinition();3385          if (D->isThisDeclarationADefinition() && FoundDef) {3386            // FIXME: Structural equivalence check should check for same3387            // user-defined methods.3388            Importer.MapImported(D, FoundDef);3389            if (const auto *DCXX = dyn_cast<CXXRecordDecl>(D)) {3390              auto *FoundCXX = dyn_cast<CXXRecordDecl>(FoundDef);3391              assert(FoundCXX && "Record type mismatch");3392 3393              if (!Importer.isMinimalImport())3394                // FoundDef may not have every implicit method that D has3395                // because implicit methods are created only if they are used.3396                if (Error Err = ImportImplicitMethods(DCXX, FoundCXX))3397                  return std::move(Err);3398            }3399            // FIXME: We can return FoundDef here.3400          }3401          PrevDecl = FoundRecord->getMostRecentDecl();3402          break;3403        }3404        ConflictingDecls.push_back(FoundDecl);3405      } // kind is RecordDecl3406    } // for3407 3408    if (!ConflictingDecls.empty() && SearchName) {3409      ExpectedName NameOrErr = Importer.HandleNameConflict(3410          SearchName, DC, IDNS, ConflictingDecls.data(),3411          ConflictingDecls.size());3412      if (NameOrErr)3413        Name = NameOrErr.get();3414      else3415        return NameOrErr.takeError();3416    }3417  }3418 3419  ExpectedSLoc BeginLocOrErr = import(D->getBeginLoc());3420  if (!BeginLocOrErr)3421    return BeginLocOrErr.takeError();3422 3423  // Create the record declaration.3424  RecordDecl *D2 = nullptr;3425  CXXRecordDecl *D2CXX = nullptr;3426  if (auto *DCXX = dyn_cast<CXXRecordDecl>(D)) {3427    if (DCXX->isLambda()) {3428      auto TInfoOrErr = import(DCXX->getLambdaTypeInfo());3429      if (!TInfoOrErr)3430        return TInfoOrErr.takeError();3431      if (GetImportedOrCreateSpecialDecl(3432              D2CXX, CXXRecordDecl::CreateLambda, D, Importer.getToContext(),3433              DC, *TInfoOrErr, Loc, DCXX->getLambdaDependencyKind(),3434              DCXX->isGenericLambda(), DCXX->getLambdaCaptureDefault()))3435        return D2CXX;3436      CXXRecordDecl::LambdaNumbering Numbering = DCXX->getLambdaNumbering();3437      ExpectedDecl CDeclOrErr = import(Numbering.ContextDecl);3438      if (!CDeclOrErr)3439        return CDeclOrErr.takeError();3440      Numbering.ContextDecl = *CDeclOrErr;3441      D2CXX->setLambdaNumbering(Numbering);3442    } else {3443      if (GetImportedOrCreateDecl(D2CXX, D, Importer.getToContext(),3444                                  D->getTagKind(), DC, *BeginLocOrErr, Loc,3445                                  Name.getAsIdentifierInfo(),3446                                  cast_or_null<CXXRecordDecl>(PrevDecl)))3447        return D2CXX;3448    }3449 3450    D2 = D2CXX;3451    D2->setAccess(D->getAccess());3452    D2->setLexicalDeclContext(LexicalDC);3453    addDeclToContexts(D, D2);3454 3455    if (ClassTemplateDecl *FromDescribed =3456        DCXX->getDescribedClassTemplate()) {3457      ClassTemplateDecl *ToDescribed;3458      if (Error Err = importInto(ToDescribed, FromDescribed))3459        return std::move(Err);3460      D2CXX->setDescribedClassTemplate(ToDescribed);3461    } else if (MemberSpecializationInfo *MemberInfo =3462                   DCXX->getMemberSpecializationInfo()) {3463        TemplateSpecializationKind SK =3464            MemberInfo->getTemplateSpecializationKind();3465        CXXRecordDecl *FromInst = DCXX->getInstantiatedFromMemberClass();3466 3467        if (Expected<CXXRecordDecl *> ToInstOrErr = import(FromInst))3468          D2CXX->setInstantiationOfMemberClass(*ToInstOrErr, SK);3469        else3470          return ToInstOrErr.takeError();3471 3472        if (ExpectedSLoc POIOrErr =3473            import(MemberInfo->getPointOfInstantiation()))3474          D2CXX->getMemberSpecializationInfo()->setPointOfInstantiation(3475            *POIOrErr);3476        else3477          return POIOrErr.takeError();3478    }3479 3480  } else {3481    if (GetImportedOrCreateDecl(D2, D, Importer.getToContext(),3482                                D->getTagKind(), DC, *BeginLocOrErr, Loc,3483                                Name.getAsIdentifierInfo(), PrevDecl))3484      return D2;3485    D2->setLexicalDeclContext(LexicalDC);3486    addDeclToContexts(D, D2);3487  }3488 3489  if (auto BraceRangeOrErr = import(D->getBraceRange()))3490    D2->setBraceRange(*BraceRangeOrErr);3491  else3492    return BraceRangeOrErr.takeError();3493  if (auto QualifierLocOrErr = import(D->getQualifierLoc()))3494    D2->setQualifierInfo(*QualifierLocOrErr);3495  else3496    return QualifierLocOrErr.takeError();3497 3498  if (D->isAnonymousStructOrUnion())3499    D2->setAnonymousStructOrUnion(true);3500 3501  if (D->isCompleteDefinition())3502    if (Error Err = ImportDefinition(D, D2, IDK_Default))3503      return std::move(Err);3504 3505  return D2;3506}3507 3508ExpectedDecl ASTNodeImporter::VisitEnumConstantDecl(EnumConstantDecl *D) {3509  // Import the major distinguishing characteristics of this enumerator.3510  DeclContext *DC, *LexicalDC;3511  DeclarationName Name;3512  SourceLocation Loc;3513  NamedDecl *ToD;3514  if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))3515    return std::move(Err);3516  if (ToD)3517    return ToD;3518 3519  // Determine whether there are any other declarations with the same name and3520  // in the same context.3521  if (!LexicalDC->isFunctionOrMethod()) {3522    SmallVector<NamedDecl *, 4> ConflictingDecls;3523    unsigned IDNS = Decl::IDNS_Ordinary;3524    auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);3525    for (auto *FoundDecl : FoundDecls) {3526      if (!FoundDecl->isInIdentifierNamespace(IDNS))3527        continue;3528 3529      if (auto *FoundEnumConstant = dyn_cast<EnumConstantDecl>(FoundDecl)) {3530        if (IsStructuralMatch(D, FoundEnumConstant))3531          return Importer.MapImported(D, FoundEnumConstant);3532        ConflictingDecls.push_back(FoundDecl);3533      }3534    }3535 3536    if (!ConflictingDecls.empty()) {3537      ExpectedName NameOrErr = Importer.HandleNameConflict(3538          Name, DC, IDNS, ConflictingDecls.data(), ConflictingDecls.size());3539      if (NameOrErr)3540        Name = NameOrErr.get();3541      else3542        return NameOrErr.takeError();3543    }3544  }3545 3546  ExpectedType TypeOrErr = import(D->getType());3547  if (!TypeOrErr)3548    return TypeOrErr.takeError();3549 3550  ExpectedExpr InitOrErr = import(D->getInitExpr());3551  if (!InitOrErr)3552    return InitOrErr.takeError();3553 3554  EnumConstantDecl *ToEnumerator;3555  if (GetImportedOrCreateDecl(3556          ToEnumerator, D, Importer.getToContext(), cast<EnumDecl>(DC), Loc,3557          Name.getAsIdentifierInfo(), *TypeOrErr, *InitOrErr, D->getInitVal()))3558    return ToEnumerator;3559 3560  ToEnumerator->setAccess(D->getAccess());3561  ToEnumerator->setLexicalDeclContext(LexicalDC);3562  LexicalDC->addDeclInternal(ToEnumerator);3563  return ToEnumerator;3564}3565 3566template <typename DeclTy>3567Error ASTNodeImporter::ImportTemplateParameterLists(const DeclTy *FromD,3568                                                    DeclTy *ToD) {3569  unsigned int Num = FromD->getNumTemplateParameterLists();3570  if (Num == 0)3571    return Error::success();3572  SmallVector<TemplateParameterList *, 2> ToTPLists(Num);3573  for (unsigned int I = 0; I < Num; ++I)3574    if (Expected<TemplateParameterList *> ToTPListOrErr =3575            import(FromD->getTemplateParameterList(I)))3576      ToTPLists[I] = *ToTPListOrErr;3577    else3578      return ToTPListOrErr.takeError();3579  ToD->setTemplateParameterListsInfo(Importer.ToContext, ToTPLists);3580  return Error::success();3581}3582 3583Error ASTNodeImporter::ImportTemplateInformation(3584    FunctionDecl *FromFD, FunctionDecl *ToFD) {3585  switch (FromFD->getTemplatedKind()) {3586  case FunctionDecl::TK_NonTemplate:3587  case FunctionDecl::TK_FunctionTemplate:3588    return Error::success();3589 3590  case FunctionDecl::TK_DependentNonTemplate:3591    if (Expected<FunctionDecl *> InstFDOrErr =3592            import(FromFD->getInstantiatedFromDecl()))3593      ToFD->setInstantiatedFromDecl(*InstFDOrErr);3594    return Error::success();3595  case FunctionDecl::TK_MemberSpecialization: {3596    TemplateSpecializationKind TSK = FromFD->getTemplateSpecializationKind();3597 3598    if (Expected<FunctionDecl *> InstFDOrErr =3599        import(FromFD->getInstantiatedFromMemberFunction()))3600      ToFD->setInstantiationOfMemberFunction(*InstFDOrErr, TSK);3601    else3602      return InstFDOrErr.takeError();3603 3604    if (ExpectedSLoc POIOrErr = import(3605        FromFD->getMemberSpecializationInfo()->getPointOfInstantiation()))3606      ToFD->getMemberSpecializationInfo()->setPointOfInstantiation(*POIOrErr);3607    else3608      return POIOrErr.takeError();3609 3610    return Error::success();3611  }3612 3613  case FunctionDecl::TK_FunctionTemplateSpecialization: {3614    auto FunctionAndArgsOrErr =3615        ImportFunctionTemplateWithTemplateArgsFromSpecialization(FromFD);3616    if (!FunctionAndArgsOrErr)3617      return FunctionAndArgsOrErr.takeError();3618 3619    TemplateArgumentList *ToTAList = TemplateArgumentList::CreateCopy(3620          Importer.getToContext(), std::get<1>(*FunctionAndArgsOrErr));3621 3622    auto *FTSInfo = FromFD->getTemplateSpecializationInfo();3623    TemplateArgumentListInfo ToTAInfo;3624    const auto *FromTAArgsAsWritten = FTSInfo->TemplateArgumentsAsWritten;3625    if (FromTAArgsAsWritten)3626      if (Error Err = ImportTemplateArgumentListInfo(3627          *FromTAArgsAsWritten, ToTAInfo))3628        return Err;3629 3630    ExpectedSLoc POIOrErr = import(FTSInfo->getPointOfInstantiation());3631    if (!POIOrErr)3632      return POIOrErr.takeError();3633 3634    if (Error Err = ImportTemplateParameterLists(FromFD, ToFD))3635      return Err;3636 3637    TemplateSpecializationKind TSK = FTSInfo->getTemplateSpecializationKind();3638    ToFD->setFunctionTemplateSpecialization(3639        std::get<0>(*FunctionAndArgsOrErr), ToTAList, /* InsertPos= */ nullptr,3640        TSK, FromTAArgsAsWritten ? &ToTAInfo : nullptr, *POIOrErr);3641    return Error::success();3642  }3643 3644  case FunctionDecl::TK_DependentFunctionTemplateSpecialization: {3645    auto *FromInfo = FromFD->getDependentSpecializationInfo();3646    UnresolvedSet<8> Candidates;3647    for (FunctionTemplateDecl *FTD : FromInfo->getCandidates()) {3648      if (Expected<FunctionTemplateDecl *> ToFTDOrErr = import(FTD))3649        Candidates.addDecl(*ToFTDOrErr);3650      else3651        return ToFTDOrErr.takeError();3652    }3653 3654    // Import TemplateArgumentListInfo.3655    TemplateArgumentListInfo ToTAInfo;3656    const auto *FromTAArgsAsWritten = FromInfo->TemplateArgumentsAsWritten;3657    if (FromTAArgsAsWritten)3658      if (Error Err =3659              ImportTemplateArgumentListInfo(*FromTAArgsAsWritten, ToTAInfo))3660        return Err;3661 3662    ToFD->setDependentTemplateSpecialization(3663        Importer.getToContext(), Candidates,3664        FromTAArgsAsWritten ? &ToTAInfo : nullptr);3665    return Error::success();3666  }3667  }3668  llvm_unreachable("All cases should be covered!");3669}3670 3671Expected<FunctionDecl *>3672ASTNodeImporter::FindFunctionTemplateSpecialization(FunctionDecl *FromFD) {3673  auto FunctionAndArgsOrErr =3674      ImportFunctionTemplateWithTemplateArgsFromSpecialization(FromFD);3675  if (!FunctionAndArgsOrErr)3676    return FunctionAndArgsOrErr.takeError();3677 3678  FunctionTemplateDecl *Template;3679  TemplateArgsTy ToTemplArgs;3680  std::tie(Template, ToTemplArgs) = *FunctionAndArgsOrErr;3681  void *InsertPos = nullptr;3682  auto *FoundSpec = Template->findSpecialization(ToTemplArgs, InsertPos);3683  return FoundSpec;3684}3685 3686Error ASTNodeImporter::ImportFunctionDeclBody(FunctionDecl *FromFD,3687                                              FunctionDecl *ToFD) {3688  if (Stmt *FromBody = FromFD->getBody()) {3689    if (ExpectedStmt ToBodyOrErr = import(FromBody))3690      ToFD->setBody(*ToBodyOrErr);3691    else3692      return ToBodyOrErr.takeError();3693  }3694  return Error::success();3695}3696 3697// Returns true if the given D has a DeclContext up to the TranslationUnitDecl3698// which is equal to the given DC, or D is equal to DC.3699static bool isAncestorDeclContextOf(const DeclContext *DC, const Decl *D) {3700  const DeclContext *DCi = dyn_cast<DeclContext>(D);3701  if (!DCi)3702    DCi = D->getDeclContext();3703  assert(DCi && "Declaration should have a context");3704  while (DCi != D->getTranslationUnitDecl()) {3705    if (DCi == DC)3706      return true;3707    DCi = DCi->getParent();3708  }3709  return false;3710}3711 3712// Check if there is a declaration that has 'DC' as parent context and is3713// referenced from statement 'S' or one of its children. The search is done in3714// BFS order through children of 'S'.3715static bool isAncestorDeclContextOf(const DeclContext *DC, const Stmt *S) {3716  SmallVector<const Stmt *> ToProcess;3717  ToProcess.push_back(S);3718  while (!ToProcess.empty()) {3719    const Stmt *CurrentS = ToProcess.pop_back_val();3720    ToProcess.append(CurrentS->child_begin(), CurrentS->child_end());3721    if (const auto *DeclRef = dyn_cast<DeclRefExpr>(CurrentS)) {3722      if (const Decl *D = DeclRef->getDecl())3723        if (isAncestorDeclContextOf(DC, D))3724          return true;3725    } else if (const auto *E =3726                   dyn_cast_or_null<SubstNonTypeTemplateParmExpr>(CurrentS)) {3727      if (const Decl *D = E->getAssociatedDecl())3728        if (isAncestorDeclContextOf(DC, D))3729          return true;3730    }3731  }3732  return false;3733}3734 3735namespace {3736/// Check if a type has any reference to a declaration that is inside the body3737/// of a function.3738/// The \c CheckType(QualType) function should be used to determine3739/// this property.3740///3741/// The type visitor visits one type object only (not recursive).3742/// To find all referenced declarations we must discover all type objects until3743/// the canonical type is reached (walk over typedef and similar objects). This3744/// is done by loop over all "sugar" type objects. For every such type we must3745/// check all declarations that are referenced from it. For this check the3746/// visitor is used. In the visit functions all referenced declarations except3747/// the one that follows in the sugar chain (if any) must be checked. For this3748/// check the same visitor is re-used (it has no state-dependent data).3749///3750/// The visit functions have 3 possible return values:3751///  - True, found a declaration inside \c ParentDC.3752///  - False, found declarations only outside \c ParentDC and it is not possible3753///    to find more declarations (the "sugar" chain does not continue).3754///  - Empty optional value, found no declarations or only outside \c ParentDC,3755///    but it is possible to find more declarations in the type "sugar" chain.3756/// The loop over the "sugar" types can be implemented by using type visit3757/// functions only (call \c CheckType with the desugared type). With the current3758/// solution no visit function is needed if the type has only a desugared type3759/// as data.3760class IsTypeDeclaredInsideVisitor3761    : public TypeVisitor<IsTypeDeclaredInsideVisitor, std::optional<bool>> {3762public:3763  IsTypeDeclaredInsideVisitor(const FunctionDecl *ParentDC)3764      : ParentDC(ParentDC) {}3765 3766  bool CheckType(QualType T) {3767    // Check the chain of "sugar" types.3768    // The "sugar" types are typedef or similar types that have the same3769    // canonical type.3770    if (std::optional<bool> Res = Visit(T.getTypePtr()))3771      return *Res;3772    QualType DsT =3773        T.getSingleStepDesugaredType(ParentDC->getParentASTContext());3774    while (DsT != T) {3775      if (std::optional<bool> Res = Visit(DsT.getTypePtr()))3776        return *Res;3777      T = DsT;3778      DsT = T.getSingleStepDesugaredType(ParentDC->getParentASTContext());3779    }3780    return false;3781  }3782 3783  std::optional<bool> VisitTagType(const TagType *T) {3784    if (auto *Spec = dyn_cast<ClassTemplateSpecializationDecl>(T->getDecl()))3785      for (const auto &Arg : Spec->getTemplateArgs().asArray())3786        if (checkTemplateArgument(Arg))3787          return true;3788    return isAncestorDeclContextOf(ParentDC, T->getDecl());3789  }3790 3791  std::optional<bool> VisitPointerType(const PointerType *T) {3792    return CheckType(T->getPointeeType());3793  }3794 3795  std::optional<bool> VisitReferenceType(const ReferenceType *T) {3796    return CheckType(T->getPointeeTypeAsWritten());3797  }3798 3799  std::optional<bool> VisitTypedefType(const TypedefType *T) {3800    return isAncestorDeclContextOf(ParentDC, T->getDecl());3801  }3802 3803  std::optional<bool> VisitUsingType(const UsingType *T) {3804    return isAncestorDeclContextOf(ParentDC, T->getDecl());3805  }3806 3807  std::optional<bool>3808  VisitTemplateSpecializationType(const TemplateSpecializationType *T) {3809    for (const auto &Arg : T->template_arguments())3810      if (checkTemplateArgument(Arg))3811        return true;3812    // This type is a "sugar" to a record type, it can have a desugared type.3813    return {};3814  }3815 3816  std::optional<bool> VisitUnaryTransformType(const UnaryTransformType *T) {3817    return CheckType(T->getBaseType());3818  }3819 3820  std::optional<bool>3821  VisitSubstTemplateTypeParmType(const SubstTemplateTypeParmType *T) {3822    // The "associated declaration" can be the same as ParentDC.3823    if (isAncestorDeclContextOf(ParentDC, T->getAssociatedDecl()))3824      return true;3825    return {};3826  }3827 3828  std::optional<bool> VisitConstantArrayType(const ConstantArrayType *T) {3829    if (T->getSizeExpr() && isAncestorDeclContextOf(ParentDC, T->getSizeExpr()))3830      return true;3831 3832    return CheckType(T->getElementType());3833  }3834 3835  std::optional<bool> VisitVariableArrayType(const VariableArrayType *T) {3836    llvm_unreachable(3837        "Variable array should not occur in deduced return type of a function");3838  }3839 3840  std::optional<bool> VisitIncompleteArrayType(const IncompleteArrayType *T) {3841    llvm_unreachable("Incomplete array should not occur in deduced return type "3842                     "of a function");3843  }3844 3845  std::optional<bool> VisitDependentArrayType(const IncompleteArrayType *T) {3846    llvm_unreachable("Dependent array should not occur in deduced return type "3847                     "of a function");3848  }3849 3850private:3851  const DeclContext *const ParentDC;3852 3853  bool checkTemplateArgument(const TemplateArgument &Arg) {3854    switch (Arg.getKind()) {3855    case TemplateArgument::Null:3856      return false;3857    case TemplateArgument::Integral:3858      return CheckType(Arg.getIntegralType());3859    case TemplateArgument::Type:3860      return CheckType(Arg.getAsType());3861    case TemplateArgument::Expression:3862      return isAncestorDeclContextOf(ParentDC, Arg.getAsExpr());3863    case TemplateArgument::Declaration:3864      // FIXME: The declaration in this case is not allowed to be in a function?3865      return isAncestorDeclContextOf(ParentDC, Arg.getAsDecl());3866    case TemplateArgument::NullPtr:3867      // FIXME: The type is not allowed to be in the function?3868      return CheckType(Arg.getNullPtrType());3869    case TemplateArgument::StructuralValue:3870      return CheckType(Arg.getStructuralValueType());3871    case TemplateArgument::Pack:3872      for (const auto &PackArg : Arg.getPackAsArray())3873        if (checkTemplateArgument(PackArg))3874          return true;3875      return false;3876    case TemplateArgument::Template:3877      // Templates can not be defined locally in functions.3878      // A template passed as argument can be not in ParentDC.3879      return false;3880    case TemplateArgument::TemplateExpansion:3881      // Templates can not be defined locally in functions.3882      // A template passed as argument can be not in ParentDC.3883      return false;3884    }3885    llvm_unreachable("Unknown TemplateArgument::ArgKind enum");3886  };3887};3888} // namespace3889 3890/// This function checks if the given function has a return type that contains3891/// a reference (in any way) to a declaration inside the same function.3892bool ASTNodeImporter::hasReturnTypeDeclaredInside(FunctionDecl *D) {3893  QualType FromTy = D->getType();3894  const auto *FromFPT = FromTy->getAs<FunctionProtoType>();3895  assert(FromFPT && "Must be called on FunctionProtoType");3896 3897  auto IsCXX11Lambda = [&]() {3898    if (Importer.FromContext.getLangOpts().CPlusPlus14) // C++14 or later3899      return false;3900 3901    return isLambdaMethod(D);3902  };3903 3904  QualType RetT = FromFPT->getReturnType();3905  if (isa<AutoType>(RetT.getTypePtr()) || IsCXX11Lambda()) {3906    FunctionDecl *Def = D->getDefinition();3907    IsTypeDeclaredInsideVisitor Visitor(Def ? Def : D);3908    return Visitor.CheckType(RetT);3909  }3910 3911  return false;3912}3913 3914ExplicitSpecifier3915ASTNodeImporter::importExplicitSpecifier(Error &Err, ExplicitSpecifier ESpec) {3916  Expr *ExplicitExpr = ESpec.getExpr();3917  if (ExplicitExpr)3918    ExplicitExpr = importChecked(Err, ESpec.getExpr());3919  return ExplicitSpecifier(ExplicitExpr, ESpec.getKind());3920}3921 3922ExpectedDecl ASTNodeImporter::VisitFunctionDecl(FunctionDecl *D) {3923 3924  SmallVector<Decl *, 2> Redecls = getCanonicalForwardRedeclChain(D);3925  auto RedeclIt = Redecls.begin();3926  // Import the first part of the decl chain. I.e. import all previous3927  // declarations starting from the canonical decl.3928  for (; RedeclIt != Redecls.end() && *RedeclIt != D; ++RedeclIt) {3929    ExpectedDecl ToRedeclOrErr = import(*RedeclIt);3930    if (!ToRedeclOrErr)3931      return ToRedeclOrErr.takeError();3932  }3933  assert(*RedeclIt == D);3934 3935  // Import the major distinguishing characteristics of this function.3936  DeclContext *DC, *LexicalDC;3937  DeclarationName Name;3938  SourceLocation Loc;3939  NamedDecl *ToD;3940  if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))3941    return std::move(Err);3942  if (ToD)3943    return ToD;3944 3945  FunctionDecl *FoundByLookup = nullptr;3946  FunctionTemplateDecl *FromFT = D->getDescribedFunctionTemplate();3947 3948  // If this is a function template specialization, then try to find the same3949  // existing specialization in the "to" context. The lookup below will not3950  // find any specialization, but would find the primary template; thus, we3951  // have to skip normal lookup in case of specializations.3952  // FIXME handle member function templates (TK_MemberSpecialization) similarly?3953  if (D->getTemplatedKind() ==3954      FunctionDecl::TK_FunctionTemplateSpecialization) {3955    auto FoundFunctionOrErr = FindFunctionTemplateSpecialization(D);3956    if (!FoundFunctionOrErr)3957      return FoundFunctionOrErr.takeError();3958    if (FunctionDecl *FoundFunction = *FoundFunctionOrErr) {3959      if (Decl *Def = FindAndMapDefinition(D, FoundFunction))3960        return Def;3961      FoundByLookup = FoundFunction;3962    }3963  }3964  // Try to find a function in our own ("to") context with the same name, same3965  // type, and in the same context as the function we're importing.3966  else if (!LexicalDC->isFunctionOrMethod()) {3967    SmallVector<NamedDecl *, 4> ConflictingDecls;3968    unsigned IDNS = Decl::IDNS_Ordinary | Decl::IDNS_OrdinaryFriend;3969    auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);3970    for (auto *FoundDecl : FoundDecls) {3971      if (!FoundDecl->isInIdentifierNamespace(IDNS))3972        continue;3973 3974      if (auto *FoundFunction = dyn_cast<FunctionDecl>(FoundDecl)) {3975        if (!hasSameVisibilityContextAndLinkage(FoundFunction, D))3976          continue;3977 3978        if (IsStructuralMatch(D, FoundFunction)) {3979          if (Decl *Def = FindAndMapDefinition(D, FoundFunction))3980            return Def;3981          FoundByLookup = FoundFunction;3982          break;3983        }3984        // FIXME: Check for overloading more carefully, e.g., by boosting3985        // Sema::IsOverload out to the AST library.3986 3987        // Function overloading is okay in C++.3988        if (Importer.getToContext().getLangOpts().CPlusPlus)3989          continue;3990 3991        // Complain about inconsistent function types.3992        Importer.ToDiag(Loc, diag::warn_odr_function_type_inconsistent)3993            << Name << D->getType() << FoundFunction->getType();3994        Importer.ToDiag(FoundFunction->getLocation(), diag::note_odr_value_here)3995            << FoundFunction->getType();3996        ConflictingDecls.push_back(FoundDecl);3997      }3998    }3999 4000    if (!ConflictingDecls.empty()) {4001      ExpectedName NameOrErr = Importer.HandleNameConflict(4002          Name, DC, IDNS, ConflictingDecls.data(), ConflictingDecls.size());4003      if (NameOrErr)4004        Name = NameOrErr.get();4005      else4006        return NameOrErr.takeError();4007    }4008  }4009 4010  // We do not allow more than one in-class declaration of a function. This is4011  // because AST clients like VTableBuilder asserts on this. VTableBuilder4012  // assumes there is only one in-class declaration. Building a redecl4013  // chain would result in more than one in-class declaration for4014  // overrides (even if they are part of the same redecl chain inside the4015  // derived class.)4016  if (FoundByLookup) {4017    if (isa<CXXMethodDecl>(FoundByLookup)) {4018      if (D->getLexicalDeclContext() == D->getDeclContext()) {4019        if (!D->doesThisDeclarationHaveABody()) {4020          if (FunctionTemplateDecl *DescribedD =4021                  D->getDescribedFunctionTemplate()) {4022            // Handle a "templated" function together with its described4023            // template. This avoids need for a similar check at import of the4024            // described template.4025            assert(FoundByLookup->getDescribedFunctionTemplate() &&4026                   "Templated function mapped to non-templated?");4027            Importer.MapImported(DescribedD,4028                                 FoundByLookup->getDescribedFunctionTemplate());4029          }4030          return Importer.MapImported(D, FoundByLookup);4031        } else {4032          // Let's continue and build up the redecl chain in this case.4033          // FIXME Merge the functions into one decl.4034        }4035      }4036    }4037  }4038 4039  DeclarationNameInfo NameInfo(Name, Loc);4040  // Import additional name location/type info.4041  if (Error Err = ImportDeclarationNameLoc(D->getNameInfo(), NameInfo))4042    return std::move(Err);4043 4044  QualType FromTy = D->getType();4045  TypeSourceInfo *FromTSI = D->getTypeSourceInfo();4046  // Set to true if we do not import the type of the function as is. There are4047  // cases when the original type would result in an infinite recursion during4048  // the import. To avoid an infinite recursion when importing, we create the4049  // FunctionDecl with a simplified function type and update it only after the4050  // relevant AST nodes are already imported.4051  // The type is related to TypeSourceInfo (it references the type), so we must4052  // do the same with TypeSourceInfo.4053  bool UsedDifferentProtoType = false;4054  if (const auto *FromFPT = FromTy->getAs<FunctionProtoType>()) {4055    QualType FromReturnTy = FromFPT->getReturnType();4056    // Functions with auto return type may define a struct inside their body4057    // and the return type could refer to that struct.4058    // E.g.: auto foo() { struct X{}; return X(); }4059    // To avoid an infinite recursion when importing, create the FunctionDecl4060    // with a simplified return type.4061    // Reuse this approach for auto return types declared as typenames from4062    // template params, tracked in FindFunctionDeclImportCycle.4063    if (hasReturnTypeDeclaredInside(D) ||4064        Importer.FindFunctionDeclImportCycle.isCycle(D)) {4065      FromReturnTy = Importer.getFromContext().VoidTy;4066      UsedDifferentProtoType = true;4067    }4068    FunctionProtoType::ExtProtoInfo FromEPI = FromFPT->getExtProtoInfo();4069    // FunctionProtoType::ExtProtoInfo's ExceptionSpecDecl can point to the4070    // FunctionDecl that we are importing the FunctionProtoType for.4071    // To avoid an infinite recursion when importing, create the FunctionDecl4072    // with a simplified function type.4073    if (FromEPI.ExceptionSpec.SourceDecl ||4074        FromEPI.ExceptionSpec.SourceTemplate ||4075        FromEPI.ExceptionSpec.NoexceptExpr) {4076      FunctionProtoType::ExtProtoInfo DefaultEPI;4077      FromEPI = DefaultEPI;4078      UsedDifferentProtoType = true;4079    }4080    FromTy = Importer.getFromContext().getFunctionType(4081        FromReturnTy, FromFPT->getParamTypes(), FromEPI);4082    FromTSI = Importer.getFromContext().getTrivialTypeSourceInfo(4083        FromTy, D->getBeginLoc());4084  }4085 4086  Error Err = Error::success();4087  auto ScopedReturnTypeDeclCycleDetector =4088      Importer.FindFunctionDeclImportCycle.makeScopedCycleDetection(D);4089  auto T = importChecked(Err, FromTy);4090  auto TInfo = importChecked(Err, FromTSI);4091  auto ToInnerLocStart = importChecked(Err, D->getInnerLocStart());4092  auto ToEndLoc = importChecked(Err, D->getEndLoc());4093  auto ToDefaultLoc = importChecked(Err, D->getDefaultLoc());4094  auto ToQualifierLoc = importChecked(Err, D->getQualifierLoc());4095  AssociatedConstraint TrailingRequiresClause = D->getTrailingRequiresClause();4096  TrailingRequiresClause.ConstraintExpr =4097      importChecked(Err, TrailingRequiresClause.ConstraintExpr);4098  if (Err)4099    return std::move(Err);4100 4101  // Import the function parameters.4102  SmallVector<ParmVarDecl *, 8> Parameters;4103  for (auto *P : D->parameters()) {4104    if (Expected<ParmVarDecl *> ToPOrErr = import(P))4105      Parameters.push_back(*ToPOrErr);4106    else4107      return ToPOrErr.takeError();4108  }4109 4110  // Create the imported function.4111  FunctionDecl *ToFunction = nullptr;4112  if (auto *FromConstructor = dyn_cast<CXXConstructorDecl>(D)) {4113    ExplicitSpecifier ESpec =4114        importExplicitSpecifier(Err, FromConstructor->getExplicitSpecifier());4115    if (Err)4116      return std::move(Err);4117    auto ToInheritedConstructor = InheritedConstructor();4118    if (FromConstructor->isInheritingConstructor()) {4119      Expected<InheritedConstructor> ImportedInheritedCtor =4120          import(FromConstructor->getInheritedConstructor());4121      if (!ImportedInheritedCtor)4122        return ImportedInheritedCtor.takeError();4123      ToInheritedConstructor = *ImportedInheritedCtor;4124    }4125    if (GetImportedOrCreateDecl<CXXConstructorDecl>(4126            ToFunction, D, Importer.getToContext(), cast<CXXRecordDecl>(DC),4127            ToInnerLocStart, NameInfo, T, TInfo, ESpec, D->UsesFPIntrin(),4128            D->isInlineSpecified(), D->isImplicit(), D->getConstexprKind(),4129            ToInheritedConstructor, TrailingRequiresClause))4130      return ToFunction;4131  } else if (CXXDestructorDecl *FromDtor = dyn_cast<CXXDestructorDecl>(D)) {4132 4133    Error Err = Error::success();4134    auto ToOperatorDelete = importChecked(4135        Err, const_cast<FunctionDecl *>(FromDtor->getOperatorDelete()));4136    auto ToThisArg = importChecked(Err, FromDtor->getOperatorDeleteThisArg());4137    if (Err)4138      return std::move(Err);4139 4140    if (GetImportedOrCreateDecl<CXXDestructorDecl>(4141            ToFunction, D, Importer.getToContext(), cast<CXXRecordDecl>(DC),4142            ToInnerLocStart, NameInfo, T, TInfo, D->UsesFPIntrin(),4143            D->isInlineSpecified(), D->isImplicit(), D->getConstexprKind(),4144            TrailingRequiresClause))4145      return ToFunction;4146 4147    CXXDestructorDecl *ToDtor = cast<CXXDestructorDecl>(ToFunction);4148 4149    ToDtor->setOperatorDelete(ToOperatorDelete, ToThisArg);4150  } else if (CXXConversionDecl *FromConversion =4151                 dyn_cast<CXXConversionDecl>(D)) {4152    ExplicitSpecifier ESpec =4153        importExplicitSpecifier(Err, FromConversion->getExplicitSpecifier());4154    if (Err)4155      return std::move(Err);4156    if (GetImportedOrCreateDecl<CXXConversionDecl>(4157            ToFunction, D, Importer.getToContext(), cast<CXXRecordDecl>(DC),4158            ToInnerLocStart, NameInfo, T, TInfo, D->UsesFPIntrin(),4159            D->isInlineSpecified(), ESpec, D->getConstexprKind(),4160            SourceLocation(), TrailingRequiresClause))4161      return ToFunction;4162  } else if (auto *Method = dyn_cast<CXXMethodDecl>(D)) {4163    if (GetImportedOrCreateDecl<CXXMethodDecl>(4164            ToFunction, D, Importer.getToContext(), cast<CXXRecordDecl>(DC),4165            ToInnerLocStart, NameInfo, T, TInfo, Method->getStorageClass(),4166            Method->UsesFPIntrin(), Method->isInlineSpecified(),4167            D->getConstexprKind(), SourceLocation(), TrailingRequiresClause))4168      return ToFunction;4169  } else if (auto *Guide = dyn_cast<CXXDeductionGuideDecl>(D)) {4170    ExplicitSpecifier ESpec =4171        importExplicitSpecifier(Err, Guide->getExplicitSpecifier());4172    CXXConstructorDecl *Ctor =4173        importChecked(Err, Guide->getCorrespondingConstructor());4174    const CXXDeductionGuideDecl *SourceDG =4175        importChecked(Err, Guide->getSourceDeductionGuide());4176    if (Err)4177      return std::move(Err);4178    if (GetImportedOrCreateDecl<CXXDeductionGuideDecl>(4179            ToFunction, D, Importer.getToContext(), DC, ToInnerLocStart, ESpec,4180            NameInfo, T, TInfo, ToEndLoc, Ctor,4181            Guide->getDeductionCandidateKind(), TrailingRequiresClause,4182            SourceDG, Guide->getSourceDeductionGuideKind()))4183      return ToFunction;4184  } else {4185    if (GetImportedOrCreateDecl(4186            ToFunction, D, Importer.getToContext(), DC, ToInnerLocStart,4187            NameInfo, T, TInfo, D->getStorageClass(), D->UsesFPIntrin(),4188            D->isInlineSpecified(), D->hasWrittenPrototype(),4189            D->getConstexprKind(), TrailingRequiresClause))4190      return ToFunction;4191  }4192 4193  // Connect the redecl chain.4194  if (FoundByLookup) {4195    auto *Recent = const_cast<FunctionDecl *>(4196          FoundByLookup->getMostRecentDecl());4197    ToFunction->setPreviousDecl(Recent);4198    // FIXME Probably we should merge exception specifications.  E.g. In the4199    // "To" context the existing function may have exception specification with4200    // noexcept-unevaluated, while the newly imported function may have an4201    // evaluated noexcept.  A call to adjustExceptionSpec() on the imported4202    // decl and its redeclarations may be required.4203  }4204 4205  StringLiteral *Msg = D->getDeletedMessage();4206  if (Msg) {4207    auto Imported = import(Msg);4208    if (!Imported)4209      return Imported.takeError();4210    Msg = *Imported;4211  }4212 4213  ToFunction->setQualifierInfo(ToQualifierLoc);4214  ToFunction->setAccess(D->getAccess());4215  ToFunction->setLexicalDeclContext(LexicalDC);4216  ToFunction->setVirtualAsWritten(D->isVirtualAsWritten());4217  ToFunction->setTrivial(D->isTrivial());4218  ToFunction->setIsPureVirtual(D->isPureVirtual());4219  ToFunction->setDefaulted(D->isDefaulted());4220  ToFunction->setExplicitlyDefaulted(D->isExplicitlyDefaulted());4221  ToFunction->setDeletedAsWritten(D->isDeletedAsWritten());4222  ToFunction->setFriendConstraintRefersToEnclosingTemplate(4223      D->FriendConstraintRefersToEnclosingTemplate());4224  ToFunction->setIsDestroyingOperatorDelete(D->isDestroyingOperatorDelete());4225  ToFunction->setIsTypeAwareOperatorNewOrDelete(4226      D->isTypeAwareOperatorNewOrDelete());4227  ToFunction->setRangeEnd(ToEndLoc);4228  ToFunction->setDefaultLoc(ToDefaultLoc);4229 4230  if (Msg)4231    ToFunction->setDefaultedOrDeletedInfo(4232        FunctionDecl::DefaultedOrDeletedFunctionInfo::Create(4233            Importer.getToContext(), {}, Msg));4234 4235  // Set the parameters.4236  for (auto *Param : Parameters) {4237    Param->setOwningFunction(ToFunction);4238    ToFunction->addDeclInternal(Param);4239    if (ASTImporterLookupTable *LT = Importer.SharedState->getLookupTable())4240      LT->update(Param, Importer.getToContext().getTranslationUnitDecl());4241  }4242  ToFunction->setParams(Parameters);4243 4244  // We need to complete creation of FunctionProtoTypeLoc manually with setting4245  // params it refers to.4246  if (TInfo) {4247    if (auto ProtoLoc =4248        TInfo->getTypeLoc().IgnoreParens().getAs<FunctionProtoTypeLoc>()) {4249      for (unsigned I = 0, N = Parameters.size(); I != N; ++I)4250        ProtoLoc.setParam(I, Parameters[I]);4251    }4252  }4253 4254  // Import the describing template function, if any.4255  if (FromFT) {4256    auto ToFTOrErr = import(FromFT);4257    if (!ToFTOrErr)4258      return ToFTOrErr.takeError();4259  }4260 4261  // Import Ctor initializers.4262  if (auto *FromConstructor = dyn_cast<CXXConstructorDecl>(D)) {4263    if (unsigned NumInitializers = FromConstructor->getNumCtorInitializers()) {4264      SmallVector<CXXCtorInitializer *, 4> CtorInitializers(NumInitializers);4265      // Import first, then allocate memory and copy if there was no error.4266      if (Error Err = ImportContainerChecked(4267          FromConstructor->inits(), CtorInitializers))4268        return std::move(Err);4269      auto **Memory =4270          new (Importer.getToContext()) CXXCtorInitializer *[NumInitializers];4271      llvm::copy(CtorInitializers, Memory);4272      auto *ToCtor = cast<CXXConstructorDecl>(ToFunction);4273      ToCtor->setCtorInitializers(Memory);4274      ToCtor->setNumCtorInitializers(NumInitializers);4275    }4276  }4277 4278  // If it is a template, import all related things.4279  if (Error Err = ImportTemplateInformation(D, ToFunction))4280    return std::move(Err);4281 4282  if (auto *FromCXXMethod = dyn_cast<CXXMethodDecl>(D))4283    if (Error Err = ImportOverriddenMethods(cast<CXXMethodDecl>(ToFunction),4284                                            FromCXXMethod))4285      return std::move(Err);4286 4287  if (D->doesThisDeclarationHaveABody()) {4288    Error Err = ImportFunctionDeclBody(D, ToFunction);4289 4290    if (Err)4291      return std::move(Err);4292  }4293 4294  // Import and set the original type in case we used another type.4295  if (UsedDifferentProtoType) {4296    if (ExpectedType TyOrErr = import(D->getType()))4297      ToFunction->setType(*TyOrErr);4298    else4299      return TyOrErr.takeError();4300    if (Expected<TypeSourceInfo *> TSIOrErr = import(D->getTypeSourceInfo()))4301      ToFunction->setTypeSourceInfo(*TSIOrErr);4302    else4303      return TSIOrErr.takeError();4304  }4305 4306  // FIXME: Other bits to merge?4307 4308  addDeclToContexts(D, ToFunction);4309 4310  // Import the rest of the chain. I.e. import all subsequent declarations.4311  for (++RedeclIt; RedeclIt != Redecls.end(); ++RedeclIt) {4312    ExpectedDecl ToRedeclOrErr = import(*RedeclIt);4313    if (!ToRedeclOrErr)4314      return ToRedeclOrErr.takeError();4315  }4316 4317  return ToFunction;4318}4319 4320ExpectedDecl ASTNodeImporter::VisitCXXMethodDecl(CXXMethodDecl *D) {4321  return VisitFunctionDecl(D);4322}4323 4324ExpectedDecl ASTNodeImporter::VisitCXXConstructorDecl(CXXConstructorDecl *D) {4325  return VisitCXXMethodDecl(D);4326}4327 4328ExpectedDecl ASTNodeImporter::VisitCXXDestructorDecl(CXXDestructorDecl *D) {4329  return VisitCXXMethodDecl(D);4330}4331 4332ExpectedDecl ASTNodeImporter::VisitCXXConversionDecl(CXXConversionDecl *D) {4333  return VisitCXXMethodDecl(D);4334}4335 4336ExpectedDecl4337ASTNodeImporter::VisitCXXDeductionGuideDecl(CXXDeductionGuideDecl *D) {4338  return VisitFunctionDecl(D);4339}4340 4341ExpectedDecl ASTNodeImporter::VisitFieldDecl(FieldDecl *D) {4342  // Import the major distinguishing characteristics of a variable.4343  DeclContext *DC, *LexicalDC;4344  DeclarationName Name;4345  SourceLocation Loc;4346  NamedDecl *ToD;4347  if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))4348    return std::move(Err);4349  if (ToD)4350    return ToD;4351 4352  // Determine whether we've already imported this field.4353  auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);4354  for (auto *FoundDecl : FoundDecls) {4355    if (FieldDecl *FoundField = dyn_cast<FieldDecl>(FoundDecl)) {4356      // For anonymous fields, match up by index.4357      if (!Name &&4358          ASTImporter::getFieldIndex(D) !=4359          ASTImporter::getFieldIndex(FoundField))4360        continue;4361 4362      if (Importer.IsStructurallyEquivalent(D->getType(),4363                                            FoundField->getType())) {4364        Importer.MapImported(D, FoundField);4365        // In case of a FieldDecl of a ClassTemplateSpecializationDecl, the4366        // initializer of a FieldDecl might not had been instantiated in the4367        // "To" context.  However, the "From" context might instantiated that,4368        // thus we have to merge that.4369        // Note: `hasInClassInitializer()` is not the same as non-null4370        // `getInClassInitializer()` value.4371        if (Expr *FromInitializer = D->getInClassInitializer()) {4372          if (ExpectedExpr ToInitializerOrErr = import(FromInitializer)) {4373            // Import of the FromInitializer may result in the setting of4374            // InClassInitializer. If not, set it here.4375            assert(FoundField->hasInClassInitializer() &&4376                   "Field should have an in-class initializer if it has an "4377                   "expression for it.");4378            if (!FoundField->getInClassInitializer())4379              FoundField->setInClassInitializer(*ToInitializerOrErr);4380          } else {4381              return ToInitializerOrErr.takeError();4382          }4383        }4384        return FoundField;4385      }4386 4387      // FIXME: Why is this case not handled with calling HandleNameConflict?4388      Importer.ToDiag(Loc, diag::warn_odr_field_type_inconsistent)4389        << Name << D->getType() << FoundField->getType();4390      Importer.ToDiag(FoundField->getLocation(), diag::note_odr_value_here)4391        << FoundField->getType();4392 4393      return make_error<ASTImportError>(ASTImportError::NameConflict);4394    }4395  }4396 4397  Error Err = Error::success();4398  auto ToType = importChecked(Err, D->getType());4399  auto ToTInfo = importChecked(Err, D->getTypeSourceInfo());4400  auto ToBitWidth = importChecked(Err, D->getBitWidth());4401  auto ToInnerLocStart = importChecked(Err, D->getInnerLocStart());4402  if (Err)4403    return std::move(Err);4404  const Type *ToCapturedVLAType = nullptr;4405  if (Error Err = Importer.importInto(4406          ToCapturedVLAType, cast_or_null<Type>(D->getCapturedVLAType())))4407    return std::move(Err);4408 4409  FieldDecl *ToField;4410  if (GetImportedOrCreateDecl(ToField, D, Importer.getToContext(), DC,4411                              ToInnerLocStart, Loc, Name.getAsIdentifierInfo(),4412                              ToType, ToTInfo, ToBitWidth, D->isMutable(),4413                              D->getInClassInitStyle()))4414    return ToField;4415 4416  ToField->setAccess(D->getAccess());4417  ToField->setLexicalDeclContext(LexicalDC);4418  ToField->setImplicit(D->isImplicit());4419  if (ToCapturedVLAType)4420    ToField->setCapturedVLAType(cast<VariableArrayType>(ToCapturedVLAType));4421  LexicalDC->addDeclInternal(ToField);4422  // Import initializer only after the field was created, it may have recursive4423  // reference to the field.4424  auto ToInitializer = importChecked(Err, D->getInClassInitializer());4425  if (Err)4426    return std::move(Err);4427  if (ToInitializer) {4428    auto *AlreadyImported = ToField->getInClassInitializer();4429    if (AlreadyImported)4430      assert(ToInitializer == AlreadyImported &&4431             "Duplicate import of in-class initializer.");4432    else4433      ToField->setInClassInitializer(ToInitializer);4434  }4435 4436  return ToField;4437}4438 4439ExpectedDecl ASTNodeImporter::VisitIndirectFieldDecl(IndirectFieldDecl *D) {4440  // Import the major distinguishing characteristics of a variable.4441  DeclContext *DC, *LexicalDC;4442  DeclarationName Name;4443  SourceLocation Loc;4444  NamedDecl *ToD;4445  if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))4446    return std::move(Err);4447  if (ToD)4448    return ToD;4449 4450  // Determine whether we've already imported this field.4451  auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);4452  for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {4453    if (auto *FoundField = dyn_cast<IndirectFieldDecl>(FoundDecls[I])) {4454      // For anonymous indirect fields, match up by index.4455      if (!Name &&4456          ASTImporter::getFieldIndex(D) !=4457          ASTImporter::getFieldIndex(FoundField))4458        continue;4459 4460      if (Importer.IsStructurallyEquivalent(D->getType(),4461                                            FoundField->getType(),4462                                            !Name.isEmpty())) {4463        Importer.MapImported(D, FoundField);4464        return FoundField;4465      }4466 4467      // If there are more anonymous fields to check, continue.4468      if (!Name && I < N-1)4469        continue;4470 4471      // FIXME: Why is this case not handled with calling HandleNameConflict?4472      Importer.ToDiag(Loc, diag::warn_odr_field_type_inconsistent)4473        << Name << D->getType() << FoundField->getType();4474      Importer.ToDiag(FoundField->getLocation(), diag::note_odr_value_here)4475        << FoundField->getType();4476 4477      return make_error<ASTImportError>(ASTImportError::NameConflict);4478    }4479  }4480 4481  // Import the type.4482  auto TypeOrErr = import(D->getType());4483  if (!TypeOrErr)4484    return TypeOrErr.takeError();4485 4486  auto **NamedChain =4487    new (Importer.getToContext()) NamedDecl*[D->getChainingSize()];4488 4489  unsigned i = 0;4490  for (auto *PI : D->chain())4491    if (Expected<NamedDecl *> ToD = import(PI))4492      NamedChain[i++] = *ToD;4493    else4494      return ToD.takeError();4495 4496  MutableArrayRef<NamedDecl *> CH = {NamedChain, D->getChainingSize()};4497  IndirectFieldDecl *ToIndirectField;4498  if (GetImportedOrCreateDecl(ToIndirectField, D, Importer.getToContext(), DC,4499                              Loc, Name.getAsIdentifierInfo(), *TypeOrErr, CH))4500    // FIXME here we leak `NamedChain` which is allocated before4501    return ToIndirectField;4502 4503  ToIndirectField->setAccess(D->getAccess());4504  ToIndirectField->setLexicalDeclContext(LexicalDC);4505  LexicalDC->addDeclInternal(ToIndirectField);4506  return ToIndirectField;4507}4508 4509/// Used as return type of getFriendCountAndPosition.4510struct FriendCountAndPosition {4511  /// Number of similar looking friends.4512  unsigned int TotalCount;4513  /// Index of the specific FriendDecl.4514  unsigned int IndexOfDecl;4515};4516 4517static bool IsEquivalentFriend(ASTImporter &Importer, FriendDecl *FD1,4518                               FriendDecl *FD2) {4519  if ((!FD1->getFriendType()) != (!FD2->getFriendType()))4520    return false;4521 4522  if (const TypeSourceInfo *TSI = FD1->getFriendType())4523    return Importer.IsStructurallyEquivalent(4524        TSI->getType(), FD2->getFriendType()->getType(), /*Complain=*/false);4525 4526  ASTImporter::NonEquivalentDeclSet NonEquivalentDecls;4527  StructuralEquivalenceContext Ctx(4528      Importer.getToContext().getLangOpts(), FD1->getASTContext(),4529      FD2->getASTContext(), NonEquivalentDecls,4530      StructuralEquivalenceKind::Default,4531      /* StrictTypeSpelling = */ false, /* Complain = */ false);4532  return Ctx.IsEquivalent(FD1, FD2);4533}4534 4535static FriendCountAndPosition getFriendCountAndPosition(ASTImporter &Importer,4536                                                        FriendDecl *FD) {4537  unsigned int FriendCount = 0;4538  UnsignedOrNone FriendPosition = std::nullopt;4539  const auto *RD = cast<CXXRecordDecl>(FD->getLexicalDeclContext());4540 4541  for (FriendDecl *FoundFriend : RD->friends()) {4542    if (FoundFriend == FD) {4543      FriendPosition = FriendCount;4544      ++FriendCount;4545    } else if (IsEquivalentFriend(Importer, FD, FoundFriend)) {4546      ++FriendCount;4547    }4548  }4549 4550  assert(FriendPosition && "Friend decl not found in own parent.");4551 4552  return {FriendCount, *FriendPosition};4553}4554 4555ExpectedDecl ASTNodeImporter::VisitFriendDecl(FriendDecl *D) {4556  // Import the major distinguishing characteristics of a declaration.4557  DeclContext *DC, *LexicalDC;4558  if (Error Err = ImportDeclContext(D, DC, LexicalDC))4559    return std::move(Err);4560 4561  // Determine whether we've already imported this decl.4562  // FriendDecl is not a NamedDecl so we cannot use lookup.4563  // We try to maintain order and count of redundant friend declarations.4564  const auto *RD = cast<CXXRecordDecl>(DC);4565  SmallVector<FriendDecl *, 2> ImportedEquivalentFriends;4566  for (FriendDecl *ImportedFriend : RD->friends())4567    if (IsEquivalentFriend(Importer, D, ImportedFriend))4568      ImportedEquivalentFriends.push_back(ImportedFriend);4569 4570  FriendCountAndPosition CountAndPosition =4571      getFriendCountAndPosition(Importer, D);4572 4573  assert(ImportedEquivalentFriends.size() <= CountAndPosition.TotalCount &&4574         "Class with non-matching friends is imported, ODR check wrong?");4575  if (ImportedEquivalentFriends.size() == CountAndPosition.TotalCount)4576    return Importer.MapImported(4577        D, ImportedEquivalentFriends[CountAndPosition.IndexOfDecl]);4578 4579  // Not found. Create it.4580  // The declarations will be put into order later by ImportDeclContext.4581  FriendDecl::FriendUnion ToFU;4582  if (NamedDecl *FriendD = D->getFriendDecl()) {4583    NamedDecl *ToFriendD;4584    if (Error Err = importInto(ToFriendD, FriendD))4585      return std::move(Err);4586 4587    if (FriendD->getFriendObjectKind() != Decl::FOK_None &&4588        !(FriendD->isInIdentifierNamespace(Decl::IDNS_NonMemberOperator)))4589      ToFriendD->setObjectOfFriendDecl(false);4590 4591    ToFU = ToFriendD;4592  } else { // The friend is a type, not a decl.4593    if (auto TSIOrErr = import(D->getFriendType()))4594      ToFU = *TSIOrErr;4595    else4596      return TSIOrErr.takeError();4597  }4598 4599  SmallVector<TemplateParameterList *, 1> ToTPLists(D->NumTPLists);4600  auto **FromTPLists = D->getTrailingObjects();4601  for (unsigned I = 0; I < D->NumTPLists; I++) {4602    if (auto ListOrErr = import(FromTPLists[I]))4603      ToTPLists[I] = *ListOrErr;4604    else4605      return ListOrErr.takeError();4606  }4607 4608  auto LocationOrErr = import(D->getLocation());4609  if (!LocationOrErr)4610    return LocationOrErr.takeError();4611  auto FriendLocOrErr = import(D->getFriendLoc());4612  if (!FriendLocOrErr)4613    return FriendLocOrErr.takeError();4614  auto EllipsisLocOrErr = import(D->getEllipsisLoc());4615  if (!EllipsisLocOrErr)4616    return EllipsisLocOrErr.takeError();4617 4618  FriendDecl *FrD;4619  if (GetImportedOrCreateDecl(FrD, D, Importer.getToContext(), DC,4620                              *LocationOrErr, ToFU, *FriendLocOrErr,4621                              *EllipsisLocOrErr, ToTPLists))4622    return FrD;4623 4624  FrD->setAccess(D->getAccess());4625  FrD->setLexicalDeclContext(LexicalDC);4626  LexicalDC->addDeclInternal(FrD);4627  return FrD;4628}4629 4630ExpectedDecl ASTNodeImporter::VisitObjCIvarDecl(ObjCIvarDecl *D) {4631  // Import the major distinguishing characteristics of an ivar.4632  DeclContext *DC, *LexicalDC;4633  DeclarationName Name;4634  SourceLocation Loc;4635  NamedDecl *ToD;4636  if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))4637    return std::move(Err);4638  if (ToD)4639    return ToD;4640 4641  // Determine whether we've already imported this ivar4642  auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);4643  for (auto *FoundDecl : FoundDecls) {4644    if (ObjCIvarDecl *FoundIvar = dyn_cast<ObjCIvarDecl>(FoundDecl)) {4645      if (Importer.IsStructurallyEquivalent(D->getType(),4646                                            FoundIvar->getType())) {4647        Importer.MapImported(D, FoundIvar);4648        return FoundIvar;4649      }4650 4651      Importer.ToDiag(Loc, diag::warn_odr_ivar_type_inconsistent)4652        << Name << D->getType() << FoundIvar->getType();4653      Importer.ToDiag(FoundIvar->getLocation(), diag::note_odr_value_here)4654        << FoundIvar->getType();4655 4656      return make_error<ASTImportError>(ASTImportError::NameConflict);4657    }4658  }4659 4660  Error Err = Error::success();4661  auto ToType = importChecked(Err, D->getType());4662  auto ToTypeSourceInfo = importChecked(Err, D->getTypeSourceInfo());4663  auto ToBitWidth = importChecked(Err, D->getBitWidth());4664  auto ToInnerLocStart = importChecked(Err, D->getInnerLocStart());4665  if (Err)4666    return std::move(Err);4667 4668  ObjCIvarDecl *ToIvar;4669  if (GetImportedOrCreateDecl(4670          ToIvar, D, Importer.getToContext(), cast<ObjCContainerDecl>(DC),4671          ToInnerLocStart, Loc, Name.getAsIdentifierInfo(),4672          ToType, ToTypeSourceInfo,4673          D->getAccessControl(),ToBitWidth, D->getSynthesize()))4674    return ToIvar;4675 4676  ToIvar->setLexicalDeclContext(LexicalDC);4677  LexicalDC->addDeclInternal(ToIvar);4678  return ToIvar;4679}4680 4681ExpectedDecl ASTNodeImporter::VisitVarDecl(VarDecl *D) {4682 4683  SmallVector<Decl*, 2> Redecls = getCanonicalForwardRedeclChain(D);4684  auto RedeclIt = Redecls.begin();4685  // Import the first part of the decl chain. I.e. import all previous4686  // declarations starting from the canonical decl.4687  for (; RedeclIt != Redecls.end() && *RedeclIt != D; ++RedeclIt) {4688    ExpectedDecl RedeclOrErr = import(*RedeclIt);4689    if (!RedeclOrErr)4690      return RedeclOrErr.takeError();4691  }4692  assert(*RedeclIt == D);4693 4694  // Import the major distinguishing characteristics of a variable.4695  DeclContext *DC, *LexicalDC;4696  DeclarationName Name;4697  SourceLocation Loc;4698  NamedDecl *ToD;4699  if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))4700    return std::move(Err);4701  if (ToD)4702    return ToD;4703 4704  // Try to find a variable in our own ("to") context with the same name and4705  // in the same context as the variable we're importing.4706  VarDecl *FoundByLookup = nullptr;4707  if (D->isFileVarDecl()) {4708    SmallVector<NamedDecl *, 4> ConflictingDecls;4709    unsigned IDNS = Decl::IDNS_Ordinary;4710    auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);4711    for (auto *FoundDecl : FoundDecls) {4712      if (!FoundDecl->isInIdentifierNamespace(IDNS))4713        continue;4714 4715      if (auto *FoundVar = dyn_cast<VarDecl>(FoundDecl)) {4716        if (!hasSameVisibilityContextAndLinkage(FoundVar, D))4717          continue;4718        if (Importer.IsStructurallyEquivalent(D->getType(),4719                                              FoundVar->getType())) {4720 4721          // The VarDecl in the "From" context has a definition, but in the4722          // "To" context we already have a definition.4723          VarDecl *FoundDef = FoundVar->getDefinition();4724          if (D->isThisDeclarationADefinition() && FoundDef)4725            // FIXME Check for ODR error if the two definitions have4726            // different initializers?4727            return Importer.MapImported(D, FoundDef);4728 4729          // The VarDecl in the "From" context has an initializer, but in the4730          // "To" context we already have an initializer.4731          const VarDecl *FoundDInit = nullptr;4732          if (D->getInit() && FoundVar->getAnyInitializer(FoundDInit))4733            // FIXME Diagnose ODR error if the two initializers are different?4734            return Importer.MapImported(D, const_cast<VarDecl*>(FoundDInit));4735 4736          FoundByLookup = FoundVar;4737          break;4738        }4739 4740        const ArrayType *FoundArray4741          = Importer.getToContext().getAsArrayType(FoundVar->getType());4742        const ArrayType *TArray4743          = Importer.getToContext().getAsArrayType(D->getType());4744        if (FoundArray && TArray) {4745          if (isa<IncompleteArrayType>(FoundArray) &&4746              isa<ConstantArrayType>(TArray)) {4747            // Import the type.4748            if (auto TyOrErr = import(D->getType()))4749              FoundVar->setType(*TyOrErr);4750            else4751              return TyOrErr.takeError();4752 4753            FoundByLookup = FoundVar;4754            break;4755          } else if (isa<IncompleteArrayType>(TArray) &&4756                     isa<ConstantArrayType>(FoundArray)) {4757            FoundByLookup = FoundVar;4758            break;4759          }4760        }4761 4762        Importer.ToDiag(Loc, diag::warn_odr_variable_type_inconsistent)4763          << Name << D->getType() << FoundVar->getType();4764        Importer.ToDiag(FoundVar->getLocation(), diag::note_odr_value_here)4765          << FoundVar->getType();4766        ConflictingDecls.push_back(FoundDecl);4767      }4768    }4769 4770    if (!ConflictingDecls.empty()) {4771      ExpectedName NameOrErr = Importer.HandleNameConflict(4772          Name, DC, IDNS, ConflictingDecls.data(), ConflictingDecls.size());4773      if (NameOrErr)4774        Name = NameOrErr.get();4775      else4776        return NameOrErr.takeError();4777    }4778  }4779 4780  Error Err = Error::success();4781  auto ToType = importChecked(Err, D->getType());4782  auto ToTypeSourceInfo = importChecked(Err, D->getTypeSourceInfo());4783  auto ToInnerLocStart = importChecked(Err, D->getInnerLocStart());4784  auto ToQualifierLoc = importChecked(Err, D->getQualifierLoc());4785  if (Err)4786    return std::move(Err);4787 4788  VarDecl *ToVar;4789  if (auto *FromDecomp = dyn_cast<DecompositionDecl>(D)) {4790    SmallVector<BindingDecl *> Bindings(FromDecomp->bindings().size());4791    if (Error Err =4792            ImportArrayChecked(FromDecomp->bindings(), Bindings.begin()))4793      return std::move(Err);4794    DecompositionDecl *ToDecomp;4795    if (GetImportedOrCreateDecl(4796            ToDecomp, FromDecomp, Importer.getToContext(), DC, ToInnerLocStart,4797            Loc, ToType, ToTypeSourceInfo, D->getStorageClass(), Bindings))4798      return ToDecomp;4799    ToVar = ToDecomp;4800  } else {4801    // Create the imported variable.4802    if (GetImportedOrCreateDecl(ToVar, D, Importer.getToContext(), DC,4803                                ToInnerLocStart, Loc,4804                                Name.getAsIdentifierInfo(), ToType,4805                                ToTypeSourceInfo, D->getStorageClass()))4806      return ToVar;4807  }4808 4809  ToVar->setTSCSpec(D->getTSCSpec());4810  ToVar->setQualifierInfo(ToQualifierLoc);4811  ToVar->setAccess(D->getAccess());4812  ToVar->setLexicalDeclContext(LexicalDC);4813  if (D->isInlineSpecified())4814    ToVar->setInlineSpecified();4815  if (D->isInline())4816    ToVar->setImplicitlyInline();4817 4818  if (FoundByLookup) {4819    auto *Recent = const_cast<VarDecl *>(FoundByLookup->getMostRecentDecl());4820    ToVar->setPreviousDecl(Recent);4821  }4822 4823  // Import the described template, if any.4824  if (D->getDescribedVarTemplate()) {4825    auto ToVTOrErr = import(D->getDescribedVarTemplate());4826    if (!ToVTOrErr)4827      return ToVTOrErr.takeError();4828  } else if (MemberSpecializationInfo *MSI = D->getMemberSpecializationInfo()) {4829    TemplateSpecializationKind SK = MSI->getTemplateSpecializationKind();4830    VarDecl *FromInst = D->getInstantiatedFromStaticDataMember();4831    if (Expected<VarDecl *> ToInstOrErr = import(FromInst))4832      ToVar->setInstantiationOfStaticDataMember(*ToInstOrErr, SK);4833    else4834      return ToInstOrErr.takeError();4835    if (ExpectedSLoc POIOrErr = import(MSI->getPointOfInstantiation()))4836      ToVar->getMemberSpecializationInfo()->setPointOfInstantiation(*POIOrErr);4837    else4838      return POIOrErr.takeError();4839  }4840 4841  if (Error Err = ImportInitializer(D, ToVar))4842    return std::move(Err);4843 4844  if (D->isConstexpr())4845    ToVar->setConstexpr(true);4846 4847  addDeclToContexts(D, ToVar);4848 4849  // Import the rest of the chain. I.e. import all subsequent declarations.4850  for (++RedeclIt; RedeclIt != Redecls.end(); ++RedeclIt) {4851    ExpectedDecl RedeclOrErr = import(*RedeclIt);4852    if (!RedeclOrErr)4853      return RedeclOrErr.takeError();4854  }4855 4856  return ToVar;4857}4858 4859ExpectedDecl ASTNodeImporter::VisitImplicitParamDecl(ImplicitParamDecl *D) {4860  // Parameters are created in the translation unit's context, then moved4861  // into the function declaration's context afterward.4862  DeclContext *DC = Importer.getToContext().getTranslationUnitDecl();4863 4864  Error Err = Error::success();4865  auto ToDeclName = importChecked(Err, D->getDeclName());4866  auto ToLocation = importChecked(Err, D->getLocation());4867  auto ToType = importChecked(Err, D->getType());4868  if (Err)4869    return std::move(Err);4870 4871  // Create the imported parameter.4872  ImplicitParamDecl *ToParm = nullptr;4873  if (GetImportedOrCreateDecl(ToParm, D, Importer.getToContext(), DC,4874                              ToLocation, ToDeclName.getAsIdentifierInfo(),4875                              ToType, D->getParameterKind()))4876    return ToParm;4877  return ToParm;4878}4879 4880Error ASTNodeImporter::ImportDefaultArgOfParmVarDecl(4881    const ParmVarDecl *FromParam, ParmVarDecl *ToParam) {4882 4883  if (auto LocOrErr = import(FromParam->getExplicitObjectParamThisLoc()))4884    ToParam->setExplicitObjectParameterLoc(*LocOrErr);4885  else4886    return LocOrErr.takeError();4887 4888  ToParam->setHasInheritedDefaultArg(FromParam->hasInheritedDefaultArg());4889  ToParam->setKNRPromoted(FromParam->isKNRPromoted());4890 4891  if (FromParam->hasUninstantiatedDefaultArg()) {4892    if (auto ToDefArgOrErr = import(FromParam->getUninstantiatedDefaultArg()))4893      ToParam->setUninstantiatedDefaultArg(*ToDefArgOrErr);4894    else4895      return ToDefArgOrErr.takeError();4896  } else if (FromParam->hasUnparsedDefaultArg()) {4897    ToParam->setUnparsedDefaultArg();4898  } else if (FromParam->hasDefaultArg()) {4899    if (auto ToDefArgOrErr = import(FromParam->getDefaultArg()))4900      ToParam->setDefaultArg(*ToDefArgOrErr);4901    else4902      return ToDefArgOrErr.takeError();4903  }4904 4905  return Error::success();4906}4907 4908Expected<InheritedConstructor>4909ASTNodeImporter::ImportInheritedConstructor(const InheritedConstructor &From) {4910  Error Err = Error::success();4911  CXXConstructorDecl *ToBaseCtor = importChecked(Err, From.getConstructor());4912  ConstructorUsingShadowDecl *ToShadow =4913      importChecked(Err, From.getShadowDecl());4914  if (Err)4915    return std::move(Err);4916  return InheritedConstructor(ToShadow, ToBaseCtor);4917}4918 4919ExpectedDecl ASTNodeImporter::VisitParmVarDecl(ParmVarDecl *D) {4920  // Parameters are created in the translation unit's context, then moved4921  // into the function declaration's context afterward.4922  DeclContext *DC = Importer.getToContext().getTranslationUnitDecl();4923 4924  Error Err = Error::success();4925  auto ToDeclName = importChecked(Err, D->getDeclName());4926  auto ToLocation = importChecked(Err, D->getLocation());4927  auto ToInnerLocStart = importChecked(Err, D->getInnerLocStart());4928  auto ToType = importChecked(Err, D->getType());4929  auto ToTypeSourceInfo = importChecked(Err, D->getTypeSourceInfo());4930  if (Err)4931    return std::move(Err);4932 4933  ParmVarDecl *ToParm;4934  if (GetImportedOrCreateDecl(ToParm, D, Importer.getToContext(), DC,4935                              ToInnerLocStart, ToLocation,4936                              ToDeclName.getAsIdentifierInfo(), ToType,4937                              ToTypeSourceInfo, D->getStorageClass(),4938                              /*DefaultArg*/ nullptr))4939    return ToParm;4940 4941  // Set the default argument. It should be no problem if it was already done.4942  // Do not import the default expression before GetImportedOrCreateDecl call4943  // to avoid possible infinite import loop because circular dependency.4944  if (Error Err = ImportDefaultArgOfParmVarDecl(D, ToParm))4945    return std::move(Err);4946 4947  if (D->isObjCMethodParameter()) {4948    ToParm->setObjCMethodScopeInfo(D->getFunctionScopeIndex());4949    ToParm->setObjCDeclQualifier(D->getObjCDeclQualifier());4950  } else {4951    ToParm->setScopeInfo(D->getFunctionScopeDepth(),4952                         D->getFunctionScopeIndex());4953  }4954 4955  return ToParm;4956}4957 4958ExpectedDecl ASTNodeImporter::VisitObjCMethodDecl(ObjCMethodDecl *D) {4959  // Import the major distinguishing characteristics of a method.4960  DeclContext *DC, *LexicalDC;4961  DeclarationName Name;4962  SourceLocation Loc;4963  NamedDecl *ToD;4964  if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))4965    return std::move(Err);4966  if (ToD)4967    return ToD;4968 4969  auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);4970  for (auto *FoundDecl : FoundDecls) {4971    if (auto *FoundMethod = dyn_cast<ObjCMethodDecl>(FoundDecl)) {4972      if (FoundMethod->isInstanceMethod() != D->isInstanceMethod())4973        continue;4974 4975      // Check return types.4976      if (!Importer.IsStructurallyEquivalent(D->getReturnType(),4977                                             FoundMethod->getReturnType())) {4978        Importer.ToDiag(Loc, diag::warn_odr_objc_method_result_type_inconsistent)4979            << D->isInstanceMethod() << Name << D->getReturnType()4980            << FoundMethod->getReturnType();4981        Importer.ToDiag(FoundMethod->getLocation(),4982                        diag::note_odr_objc_method_here)4983          << D->isInstanceMethod() << Name;4984 4985        return make_error<ASTImportError>(ASTImportError::NameConflict);4986      }4987 4988      // Check the number of parameters.4989      if (D->param_size() != FoundMethod->param_size()) {4990        Importer.ToDiag(Loc, diag::warn_odr_objc_method_num_params_inconsistent)4991          << D->isInstanceMethod() << Name4992          << D->param_size() << FoundMethod->param_size();4993        Importer.ToDiag(FoundMethod->getLocation(),4994                        diag::note_odr_objc_method_here)4995          << D->isInstanceMethod() << Name;4996 4997        return make_error<ASTImportError>(ASTImportError::NameConflict);4998      }4999 5000      // Check parameter types.5001      for (ObjCMethodDecl::param_iterator P = D->param_begin(),5002             PEnd = D->param_end(), FoundP = FoundMethod->param_begin();5003           P != PEnd; ++P, ++FoundP) {5004        if (!Importer.IsStructurallyEquivalent((*P)->getType(),5005                                               (*FoundP)->getType())) {5006          Importer.FromDiag((*P)->getLocation(),5007                            diag::warn_odr_objc_method_param_type_inconsistent)5008            << D->isInstanceMethod() << Name5009            << (*P)->getType() << (*FoundP)->getType();5010          Importer.ToDiag((*FoundP)->getLocation(), diag::note_odr_value_here)5011            << (*FoundP)->getType();5012 5013          return make_error<ASTImportError>(ASTImportError::NameConflict);5014        }5015      }5016 5017      // Check variadic/non-variadic.5018      // Check the number of parameters.5019      if (D->isVariadic() != FoundMethod->isVariadic()) {5020        Importer.ToDiag(Loc, diag::warn_odr_objc_method_variadic_inconsistent)5021          << D->isInstanceMethod() << Name;5022        Importer.ToDiag(FoundMethod->getLocation(),5023                        diag::note_odr_objc_method_here)5024          << D->isInstanceMethod() << Name;5025 5026        return make_error<ASTImportError>(ASTImportError::NameConflict);5027      }5028 5029      // FIXME: Any other bits we need to merge?5030      return Importer.MapImported(D, FoundMethod);5031    }5032  }5033 5034  Error Err = Error::success();5035  auto ToEndLoc = importChecked(Err, D->getEndLoc());5036  auto ToReturnType = importChecked(Err, D->getReturnType());5037  auto ToReturnTypeSourceInfo =5038      importChecked(Err, D->getReturnTypeSourceInfo());5039  if (Err)5040    return std::move(Err);5041 5042  ObjCMethodDecl *ToMethod;5043  if (GetImportedOrCreateDecl(5044          ToMethod, D, Importer.getToContext(), Loc, ToEndLoc,5045          Name.getObjCSelector(), ToReturnType, ToReturnTypeSourceInfo, DC,5046          D->isInstanceMethod(), D->isVariadic(), D->isPropertyAccessor(),5047          D->isSynthesizedAccessorStub(), D->isImplicit(), D->isDefined(),5048          D->getImplementationControl(), D->hasRelatedResultType()))5049    return ToMethod;5050 5051  // FIXME: When we decide to merge method definitions, we'll need to5052  // deal with implicit parameters.5053 5054  // Import the parameters5055  SmallVector<ParmVarDecl *, 5> ToParams;5056  for (auto *FromP : D->parameters()) {5057    if (Expected<ParmVarDecl *> ToPOrErr = import(FromP))5058      ToParams.push_back(*ToPOrErr);5059    else5060      return ToPOrErr.takeError();5061  }5062 5063  // Set the parameters.5064  for (auto *ToParam : ToParams) {5065    ToParam->setOwningFunction(ToMethod);5066    ToMethod->addDeclInternal(ToParam);5067  }5068 5069  SmallVector<SourceLocation, 12> FromSelLocs;5070  D->getSelectorLocs(FromSelLocs);5071  SmallVector<SourceLocation, 12> ToSelLocs(FromSelLocs.size());5072  if (Error Err = ImportContainerChecked(FromSelLocs, ToSelLocs))5073    return std::move(Err);5074 5075  ToMethod->setMethodParams(Importer.getToContext(), ToParams, ToSelLocs);5076 5077  ToMethod->setLexicalDeclContext(LexicalDC);5078  LexicalDC->addDeclInternal(ToMethod);5079 5080  // Implicit params are declared when Sema encounters the definition but this5081  // never happens when the method is imported. Manually declare the implicit5082  // params now that the MethodDecl knows its class interface.5083  if (D->getSelfDecl())5084    ToMethod->createImplicitParams(Importer.getToContext(),5085                                   ToMethod->getClassInterface());5086 5087  return ToMethod;5088}5089 5090ExpectedDecl ASTNodeImporter::VisitObjCTypeParamDecl(ObjCTypeParamDecl *D) {5091  // Import the major distinguishing characteristics of a category.5092  DeclContext *DC, *LexicalDC;5093  DeclarationName Name;5094  SourceLocation Loc;5095  NamedDecl *ToD;5096  if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))5097    return std::move(Err);5098  if (ToD)5099    return ToD;5100 5101  Error Err = Error::success();5102  auto ToVarianceLoc = importChecked(Err, D->getVarianceLoc());5103  auto ToLocation = importChecked(Err, D->getLocation());5104  auto ToColonLoc = importChecked(Err, D->getColonLoc());5105  auto ToTypeSourceInfo = importChecked(Err, D->getTypeSourceInfo());5106  if (Err)5107    return std::move(Err);5108 5109  ObjCTypeParamDecl *Result;5110  if (GetImportedOrCreateDecl(5111          Result, D, Importer.getToContext(), DC, D->getVariance(),5112          ToVarianceLoc, D->getIndex(),5113          ToLocation, Name.getAsIdentifierInfo(),5114          ToColonLoc, ToTypeSourceInfo))5115    return Result;5116 5117  // Only import 'ObjCTypeParamType' after the decl is created.5118  auto ToTypeForDecl = importChecked(Err, D->getTypeForDecl());5119  if (Err)5120    return std::move(Err);5121  Result->setTypeForDecl(ToTypeForDecl);5122  Result->setLexicalDeclContext(LexicalDC);5123  return Result;5124}5125 5126ExpectedDecl ASTNodeImporter::VisitObjCCategoryDecl(ObjCCategoryDecl *D) {5127  // Import the major distinguishing characteristics of a category.5128  DeclContext *DC, *LexicalDC;5129  DeclarationName Name;5130  SourceLocation Loc;5131  NamedDecl *ToD;5132  if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))5133    return std::move(Err);5134  if (ToD)5135    return ToD;5136 5137  ObjCInterfaceDecl *ToInterface;5138  if (Error Err = importInto(ToInterface, D->getClassInterface()))5139    return std::move(Err);5140 5141  // Determine if we've already encountered this category.5142  ObjCCategoryDecl *MergeWithCategory5143    = ToInterface->FindCategoryDeclaration(Name.getAsIdentifierInfo());5144  ObjCCategoryDecl *ToCategory = MergeWithCategory;5145  if (!ToCategory) {5146 5147    Error Err = Error::success();5148    auto ToAtStartLoc = importChecked(Err, D->getAtStartLoc());5149    auto ToCategoryNameLoc = importChecked(Err, D->getCategoryNameLoc());5150    auto ToIvarLBraceLoc = importChecked(Err, D->getIvarLBraceLoc());5151    auto ToIvarRBraceLoc = importChecked(Err, D->getIvarRBraceLoc());5152    if (Err)5153      return std::move(Err);5154 5155    if (GetImportedOrCreateDecl(ToCategory, D, Importer.getToContext(), DC,5156                                ToAtStartLoc, Loc,5157                                ToCategoryNameLoc,5158                                Name.getAsIdentifierInfo(), ToInterface,5159                                /*TypeParamList=*/nullptr,5160                                ToIvarLBraceLoc,5161                                ToIvarRBraceLoc))5162      return ToCategory;5163 5164    ToCategory->setLexicalDeclContext(LexicalDC);5165    LexicalDC->addDeclInternal(ToCategory);5166    // Import the type parameter list after MapImported, to avoid5167    // loops when bringing in their DeclContext.5168    if (auto PListOrErr = ImportObjCTypeParamList(D->getTypeParamList()))5169      ToCategory->setTypeParamList(*PListOrErr);5170    else5171      return PListOrErr.takeError();5172 5173    // Import protocols5174    SmallVector<ObjCProtocolDecl *, 4> Protocols;5175    SmallVector<SourceLocation, 4> ProtocolLocs;5176    ObjCCategoryDecl::protocol_loc_iterator FromProtoLoc5177      = D->protocol_loc_begin();5178    for (ObjCCategoryDecl::protocol_iterator FromProto = D->protocol_begin(),5179                                          FromProtoEnd = D->protocol_end();5180         FromProto != FromProtoEnd;5181         ++FromProto, ++FromProtoLoc) {5182      if (Expected<ObjCProtocolDecl *> ToProtoOrErr = import(*FromProto))5183        Protocols.push_back(*ToProtoOrErr);5184      else5185        return ToProtoOrErr.takeError();5186 5187      if (ExpectedSLoc ToProtoLocOrErr = import(*FromProtoLoc))5188        ProtocolLocs.push_back(*ToProtoLocOrErr);5189      else5190        return ToProtoLocOrErr.takeError();5191    }5192 5193    // FIXME: If we're merging, make sure that the protocol list is the same.5194    ToCategory->setProtocolList(Protocols.data(), Protocols.size(),5195                                ProtocolLocs.data(), Importer.getToContext());5196 5197  } else {5198    Importer.MapImported(D, ToCategory);5199  }5200 5201  // Import all of the members of this category.5202  if (Error Err = ImportDeclContext(D))5203    return std::move(Err);5204 5205  // If we have an implementation, import it as well.5206  if (D->getImplementation()) {5207    if (Expected<ObjCCategoryImplDecl *> ToImplOrErr =5208        import(D->getImplementation()))5209      ToCategory->setImplementation(*ToImplOrErr);5210    else5211      return ToImplOrErr.takeError();5212  }5213 5214  return ToCategory;5215}5216 5217Error ASTNodeImporter::ImportDefinition(5218    ObjCProtocolDecl *From, ObjCProtocolDecl *To, ImportDefinitionKind Kind) {5219  if (To->getDefinition()) {5220    if (shouldForceImportDeclContext(Kind))5221      if (Error Err = ImportDeclContext(From))5222        return Err;5223    return Error::success();5224  }5225 5226  // Start the protocol definition5227  To->startDefinition();5228 5229  // Import protocols5230  SmallVector<ObjCProtocolDecl *, 4> Protocols;5231  SmallVector<SourceLocation, 4> ProtocolLocs;5232  ObjCProtocolDecl::protocol_loc_iterator FromProtoLoc =5233      From->protocol_loc_begin();5234  for (ObjCProtocolDecl::protocol_iterator FromProto = From->protocol_begin(),5235                                        FromProtoEnd = From->protocol_end();5236       FromProto != FromProtoEnd;5237       ++FromProto, ++FromProtoLoc) {5238    if (Expected<ObjCProtocolDecl *> ToProtoOrErr = import(*FromProto))5239      Protocols.push_back(*ToProtoOrErr);5240    else5241      return ToProtoOrErr.takeError();5242 5243    if (ExpectedSLoc ToProtoLocOrErr = import(*FromProtoLoc))5244      ProtocolLocs.push_back(*ToProtoLocOrErr);5245    else5246      return ToProtoLocOrErr.takeError();5247 5248  }5249 5250  // FIXME: If we're merging, make sure that the protocol list is the same.5251  To->setProtocolList(Protocols.data(), Protocols.size(),5252                      ProtocolLocs.data(), Importer.getToContext());5253 5254  if (shouldForceImportDeclContext(Kind)) {5255    // Import all of the members of this protocol.5256    if (Error Err = ImportDeclContext(From, /*ForceImport=*/true))5257      return Err;5258  }5259  return Error::success();5260}5261 5262ExpectedDecl ASTNodeImporter::VisitObjCProtocolDecl(ObjCProtocolDecl *D) {5263  // If this protocol has a definition in the translation unit we're coming5264  // from, but this particular declaration is not that definition, import the5265  // definition and map to that.5266  ObjCProtocolDecl *Definition = D->getDefinition();5267  if (Definition && Definition != D) {5268    if (ExpectedDecl ImportedDefOrErr = import(Definition))5269      return Importer.MapImported(D, *ImportedDefOrErr);5270    else5271      return ImportedDefOrErr.takeError();5272  }5273 5274  // Import the major distinguishing characteristics of a protocol.5275  DeclContext *DC, *LexicalDC;5276  DeclarationName Name;5277  SourceLocation Loc;5278  NamedDecl *ToD;5279  if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))5280    return std::move(Err);5281  if (ToD)5282    return ToD;5283 5284  ObjCProtocolDecl *MergeWithProtocol = nullptr;5285  auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);5286  for (auto *FoundDecl : FoundDecls) {5287    if (!FoundDecl->isInIdentifierNamespace(Decl::IDNS_ObjCProtocol))5288      continue;5289 5290    if ((MergeWithProtocol = dyn_cast<ObjCProtocolDecl>(FoundDecl)))5291      break;5292  }5293 5294  ObjCProtocolDecl *ToProto = MergeWithProtocol;5295  if (!ToProto) {5296    auto ToAtBeginLocOrErr = import(D->getAtStartLoc());5297    if (!ToAtBeginLocOrErr)5298      return ToAtBeginLocOrErr.takeError();5299 5300    if (GetImportedOrCreateDecl(ToProto, D, Importer.getToContext(), DC,5301                                Name.getAsIdentifierInfo(), Loc,5302                                *ToAtBeginLocOrErr,5303                                /*PrevDecl=*/nullptr))5304      return ToProto;5305    ToProto->setLexicalDeclContext(LexicalDC);5306    LexicalDC->addDeclInternal(ToProto);5307  }5308 5309  Importer.MapImported(D, ToProto);5310 5311  if (D->isThisDeclarationADefinition())5312    if (Error Err = ImportDefinition(D, ToProto))5313      return std::move(Err);5314 5315  return ToProto;5316}5317 5318ExpectedDecl ASTNodeImporter::VisitLinkageSpecDecl(LinkageSpecDecl *D) {5319  DeclContext *DC, *LexicalDC;5320  if (Error Err = ImportDeclContext(D, DC, LexicalDC))5321    return std::move(Err);5322 5323  ExpectedSLoc ExternLocOrErr = import(D->getExternLoc());5324  if (!ExternLocOrErr)5325    return ExternLocOrErr.takeError();5326 5327  ExpectedSLoc LangLocOrErr = import(D->getLocation());5328  if (!LangLocOrErr)5329    return LangLocOrErr.takeError();5330 5331  bool HasBraces = D->hasBraces();5332 5333  LinkageSpecDecl *ToLinkageSpec;5334  if (GetImportedOrCreateDecl(ToLinkageSpec, D, Importer.getToContext(), DC,5335                              *ExternLocOrErr, *LangLocOrErr,5336                              D->getLanguage(), HasBraces))5337    return ToLinkageSpec;5338 5339  if (HasBraces) {5340    ExpectedSLoc RBraceLocOrErr = import(D->getRBraceLoc());5341    if (!RBraceLocOrErr)5342      return RBraceLocOrErr.takeError();5343    ToLinkageSpec->setRBraceLoc(*RBraceLocOrErr);5344  }5345 5346  ToLinkageSpec->setLexicalDeclContext(LexicalDC);5347  LexicalDC->addDeclInternal(ToLinkageSpec);5348 5349  return ToLinkageSpec;5350}5351 5352ExpectedDecl ASTNodeImporter::ImportUsingShadowDecls(BaseUsingDecl *D,5353                                                     BaseUsingDecl *ToSI) {5354  for (UsingShadowDecl *FromShadow : D->shadows()) {5355    if (Expected<UsingShadowDecl *> ToShadowOrErr = import(FromShadow))5356      ToSI->addShadowDecl(*ToShadowOrErr);5357    else5358      // FIXME: We return error here but the definition is already created5359      // and available with lookups. How to fix this?..5360      return ToShadowOrErr.takeError();5361  }5362  return ToSI;5363}5364 5365ExpectedDecl ASTNodeImporter::VisitUsingDecl(UsingDecl *D) {5366  DeclContext *DC, *LexicalDC;5367  DeclarationName Name;5368  SourceLocation Loc;5369  NamedDecl *ToD = nullptr;5370  if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))5371    return std::move(Err);5372  if (ToD)5373    return ToD;5374 5375  Error Err = Error::success();5376  auto ToLoc = importChecked(Err, D->getNameInfo().getLoc());5377  auto ToUsingLoc = importChecked(Err, D->getUsingLoc());5378  auto ToQualifierLoc = importChecked(Err, D->getQualifierLoc());5379  if (Err)5380    return std::move(Err);5381 5382  DeclarationNameInfo NameInfo(Name, ToLoc);5383  if (Error Err = ImportDeclarationNameLoc(D->getNameInfo(), NameInfo))5384    return std::move(Err);5385 5386  UsingDecl *ToUsing;5387  if (GetImportedOrCreateDecl(ToUsing, D, Importer.getToContext(), DC,5388                              ToUsingLoc, ToQualifierLoc, NameInfo,5389                              D->hasTypename()))5390    return ToUsing;5391 5392  ToUsing->setLexicalDeclContext(LexicalDC);5393  LexicalDC->addDeclInternal(ToUsing);5394 5395  if (NamedDecl *FromPattern =5396      Importer.getFromContext().getInstantiatedFromUsingDecl(D)) {5397    if (Expected<NamedDecl *> ToPatternOrErr = import(FromPattern))5398      Importer.getToContext().setInstantiatedFromUsingDecl(5399          ToUsing, *ToPatternOrErr);5400    else5401      return ToPatternOrErr.takeError();5402  }5403 5404  return ImportUsingShadowDecls(D, ToUsing);5405}5406 5407ExpectedDecl ASTNodeImporter::VisitUsingEnumDecl(UsingEnumDecl *D) {5408  DeclContext *DC, *LexicalDC;5409  DeclarationName Name;5410  SourceLocation Loc;5411  NamedDecl *ToD = nullptr;5412  if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))5413    return std::move(Err);5414  if (ToD)5415    return ToD;5416 5417  Error Err = Error::success();5418  auto ToUsingLoc = importChecked(Err, D->getUsingLoc());5419  auto ToEnumLoc = importChecked(Err, D->getEnumLoc());5420  auto ToNameLoc = importChecked(Err, D->getLocation());5421  auto *ToEnumType = importChecked(Err, D->getEnumType());5422  if (Err)5423    return std::move(Err);5424 5425  UsingEnumDecl *ToUsingEnum;5426  if (GetImportedOrCreateDecl(ToUsingEnum, D, Importer.getToContext(), DC,5427                              ToUsingLoc, ToEnumLoc, ToNameLoc, ToEnumType))5428    return ToUsingEnum;5429 5430  ToUsingEnum->setLexicalDeclContext(LexicalDC);5431  LexicalDC->addDeclInternal(ToUsingEnum);5432 5433  if (UsingEnumDecl *FromPattern =5434          Importer.getFromContext().getInstantiatedFromUsingEnumDecl(D)) {5435    if (Expected<UsingEnumDecl *> ToPatternOrErr = import(FromPattern))5436      Importer.getToContext().setInstantiatedFromUsingEnumDecl(ToUsingEnum,5437                                                               *ToPatternOrErr);5438    else5439      return ToPatternOrErr.takeError();5440  }5441 5442  return ImportUsingShadowDecls(D, ToUsingEnum);5443}5444 5445ExpectedDecl ASTNodeImporter::VisitUsingShadowDecl(UsingShadowDecl *D) {5446  DeclContext *DC, *LexicalDC;5447  DeclarationName Name;5448  SourceLocation Loc;5449  NamedDecl *ToD = nullptr;5450  if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))5451    return std::move(Err);5452  if (ToD)5453    return ToD;5454 5455  Expected<BaseUsingDecl *> ToIntroducerOrErr = import(D->getIntroducer());5456  if (!ToIntroducerOrErr)5457    return ToIntroducerOrErr.takeError();5458 5459  Expected<NamedDecl *> ToTargetOrErr = import(D->getTargetDecl());5460  if (!ToTargetOrErr)5461    return ToTargetOrErr.takeError();5462 5463  UsingShadowDecl *ToShadow;5464  if (auto *FromConstructorUsingShadow =5465          dyn_cast<ConstructorUsingShadowDecl>(D)) {5466    Error Err = Error::success();5467    ConstructorUsingShadowDecl *Nominated = importChecked(5468        Err, FromConstructorUsingShadow->getNominatedBaseClassShadowDecl());5469    if (Err)5470      return std::move(Err);5471    // The 'Target' parameter of ConstructorUsingShadowDecl constructor5472    // is really the "NominatedBaseClassShadowDecl" value if it exists5473    // (see code of ConstructorUsingShadowDecl::ConstructorUsingShadowDecl).5474    // We should pass the NominatedBaseClassShadowDecl to it (if non-null) to5475    // get the correct values.5476    if (GetImportedOrCreateDecl<ConstructorUsingShadowDecl>(5477            ToShadow, D, Importer.getToContext(), DC, Loc,5478            cast<UsingDecl>(*ToIntroducerOrErr),5479            Nominated ? Nominated : *ToTargetOrErr,5480            FromConstructorUsingShadow->constructsVirtualBase()))5481      return ToShadow;5482  } else {5483    if (GetImportedOrCreateDecl(ToShadow, D, Importer.getToContext(), DC, Loc,5484                                Name, *ToIntroducerOrErr, *ToTargetOrErr))5485      return ToShadow;5486  }5487 5488  ToShadow->setLexicalDeclContext(LexicalDC);5489  ToShadow->setAccess(D->getAccess());5490 5491  if (UsingShadowDecl *FromPattern =5492      Importer.getFromContext().getInstantiatedFromUsingShadowDecl(D)) {5493    if (Expected<UsingShadowDecl *> ToPatternOrErr = import(FromPattern))5494      Importer.getToContext().setInstantiatedFromUsingShadowDecl(5495          ToShadow, *ToPatternOrErr);5496    else5497      // FIXME: We return error here but the definition is already created5498      // and available with lookups. How to fix this?..5499      return ToPatternOrErr.takeError();5500  }5501 5502  LexicalDC->addDeclInternal(ToShadow);5503 5504  return ToShadow;5505}5506 5507ExpectedDecl ASTNodeImporter::VisitUsingDirectiveDecl(UsingDirectiveDecl *D) {5508  DeclContext *DC, *LexicalDC;5509  DeclarationName Name;5510  SourceLocation Loc;5511  NamedDecl *ToD = nullptr;5512  if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))5513    return std::move(Err);5514  if (ToD)5515    return ToD;5516 5517  auto ToComAncestorOrErr = Importer.ImportContext(D->getCommonAncestor());5518  if (!ToComAncestorOrErr)5519    return ToComAncestorOrErr.takeError();5520 5521  Error Err = Error::success();5522  auto ToNominatedNamespace = importChecked(Err, D->getNominatedNamespace());5523  auto ToUsingLoc = importChecked(Err, D->getUsingLoc());5524  auto ToNamespaceKeyLocation =5525      importChecked(Err, D->getNamespaceKeyLocation());5526  auto ToQualifierLoc = importChecked(Err, D->getQualifierLoc());5527  auto ToIdentLocation = importChecked(Err, D->getIdentLocation());5528  if (Err)5529    return std::move(Err);5530 5531  UsingDirectiveDecl *ToUsingDir;5532  if (GetImportedOrCreateDecl(ToUsingDir, D, Importer.getToContext(), DC,5533                              ToUsingLoc,5534                              ToNamespaceKeyLocation,5535                              ToQualifierLoc,5536                              ToIdentLocation,5537                              ToNominatedNamespace, *ToComAncestorOrErr))5538    return ToUsingDir;5539 5540  ToUsingDir->setLexicalDeclContext(LexicalDC);5541  LexicalDC->addDeclInternal(ToUsingDir);5542 5543  return ToUsingDir;5544}5545 5546ExpectedDecl ASTNodeImporter::VisitUsingPackDecl(UsingPackDecl *D) {5547  DeclContext *DC, *LexicalDC;5548  DeclarationName Name;5549  SourceLocation Loc;5550  NamedDecl *ToD = nullptr;5551  if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))5552    return std::move(Err);5553  if (ToD)5554    return ToD;5555 5556  auto ToInstantiatedFromUsingOrErr =5557      Importer.Import(D->getInstantiatedFromUsingDecl());5558  if (!ToInstantiatedFromUsingOrErr)5559    return ToInstantiatedFromUsingOrErr.takeError();5560  SmallVector<NamedDecl *, 4> Expansions(D->expansions().size());5561  if (Error Err = ImportArrayChecked(D->expansions(), Expansions.begin()))5562    return std::move(Err);5563 5564  UsingPackDecl *ToUsingPack;5565  if (GetImportedOrCreateDecl(ToUsingPack, D, Importer.getToContext(), DC,5566                              cast<NamedDecl>(*ToInstantiatedFromUsingOrErr),5567                              Expansions))5568    return ToUsingPack;5569 5570  addDeclToContexts(D, ToUsingPack);5571 5572  return ToUsingPack;5573}5574 5575ExpectedDecl ASTNodeImporter::VisitUnresolvedUsingValueDecl(5576    UnresolvedUsingValueDecl *D) {5577  DeclContext *DC, *LexicalDC;5578  DeclarationName Name;5579  SourceLocation Loc;5580  NamedDecl *ToD = nullptr;5581  if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))5582    return std::move(Err);5583  if (ToD)5584    return ToD;5585 5586  Error Err = Error::success();5587  auto ToLoc = importChecked(Err, D->getNameInfo().getLoc());5588  auto ToUsingLoc = importChecked(Err, D->getUsingLoc());5589  auto ToQualifierLoc = importChecked(Err, D->getQualifierLoc());5590  auto ToEllipsisLoc = importChecked(Err, D->getEllipsisLoc());5591  if (Err)5592    return std::move(Err);5593 5594  DeclarationNameInfo NameInfo(Name, ToLoc);5595  if (Error Err = ImportDeclarationNameLoc(D->getNameInfo(), NameInfo))5596    return std::move(Err);5597 5598  UnresolvedUsingValueDecl *ToUsingValue;5599  if (GetImportedOrCreateDecl(ToUsingValue, D, Importer.getToContext(), DC,5600                              ToUsingLoc, ToQualifierLoc, NameInfo,5601                              ToEllipsisLoc))5602    return ToUsingValue;5603 5604  ToUsingValue->setAccess(D->getAccess());5605  ToUsingValue->setLexicalDeclContext(LexicalDC);5606  LexicalDC->addDeclInternal(ToUsingValue);5607 5608  return ToUsingValue;5609}5610 5611ExpectedDecl ASTNodeImporter::VisitUnresolvedUsingTypenameDecl(5612    UnresolvedUsingTypenameDecl *D) {5613  DeclContext *DC, *LexicalDC;5614  DeclarationName Name;5615  SourceLocation Loc;5616  NamedDecl *ToD = nullptr;5617  if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))5618    return std::move(Err);5619  if (ToD)5620    return ToD;5621 5622  Error Err = Error::success();5623  auto ToUsingLoc = importChecked(Err, D->getUsingLoc());5624  auto ToTypenameLoc = importChecked(Err, D->getTypenameLoc());5625  auto ToQualifierLoc = importChecked(Err, D->getQualifierLoc());5626  auto ToEllipsisLoc = importChecked(Err, D->getEllipsisLoc());5627  if (Err)5628    return std::move(Err);5629 5630  UnresolvedUsingTypenameDecl *ToUsing;5631  if (GetImportedOrCreateDecl(ToUsing, D, Importer.getToContext(), DC,5632                              ToUsingLoc, ToTypenameLoc,5633                              ToQualifierLoc, Loc, Name, ToEllipsisLoc))5634    return ToUsing;5635 5636  ToUsing->setAccess(D->getAccess());5637  ToUsing->setLexicalDeclContext(LexicalDC);5638  LexicalDC->addDeclInternal(ToUsing);5639 5640  return ToUsing;5641}5642 5643ExpectedDecl ASTNodeImporter::VisitBuiltinTemplateDecl(BuiltinTemplateDecl *D) {5644  Decl* ToD = nullptr;5645  switch (D->getBuiltinTemplateKind()) {5646#define BuiltinTemplate(BTName)                                                \5647  case BuiltinTemplateKind::BTK##BTName:                                       \5648    ToD = Importer.getToContext().get##BTName##Decl();                         \5649    break;5650#include "clang/Basic/BuiltinTemplates.inc"5651  }5652  assert(ToD && "BuiltinTemplateDecl of unsupported kind!");5653  Importer.MapImported(D, ToD);5654  return ToD;5655}5656 5657Error ASTNodeImporter::ImportDefinition(5658    ObjCInterfaceDecl *From, ObjCInterfaceDecl *To, ImportDefinitionKind Kind) {5659  if (To->getDefinition()) {5660    // Check consistency of superclass.5661    ObjCInterfaceDecl *FromSuper = From->getSuperClass();5662    if (FromSuper) {5663      if (auto FromSuperOrErr = import(FromSuper))5664        FromSuper = *FromSuperOrErr;5665      else5666        return FromSuperOrErr.takeError();5667    }5668 5669    ObjCInterfaceDecl *ToSuper = To->getSuperClass();5670    if ((bool)FromSuper != (bool)ToSuper ||5671        (FromSuper && !declaresSameEntity(FromSuper, ToSuper))) {5672      Importer.ToDiag(To->getLocation(),5673                      diag::warn_odr_objc_superclass_inconsistent)5674        << To->getDeclName();5675      if (ToSuper)5676        Importer.ToDiag(To->getSuperClassLoc(), diag::note_odr_objc_superclass)5677          << To->getSuperClass()->getDeclName();5678      else5679        Importer.ToDiag(To->getLocation(),5680                        diag::note_odr_objc_missing_superclass);5681      if (From->getSuperClass())5682        Importer.FromDiag(From->getSuperClassLoc(),5683                          diag::note_odr_objc_superclass)5684        << From->getSuperClass()->getDeclName();5685      else5686        Importer.FromDiag(From->getLocation(),5687                          diag::note_odr_objc_missing_superclass);5688    }5689 5690    if (shouldForceImportDeclContext(Kind))5691      if (Error Err = ImportDeclContext(From))5692        return Err;5693    return Error::success();5694  }5695 5696  // Start the definition.5697  To->startDefinition();5698 5699  // If this class has a superclass, import it.5700  if (From->getSuperClass()) {5701    if (auto SuperTInfoOrErr = import(From->getSuperClassTInfo()))5702      To->setSuperClass(*SuperTInfoOrErr);5703    else5704      return SuperTInfoOrErr.takeError();5705  }5706 5707  // Import protocols5708  SmallVector<ObjCProtocolDecl *, 4> Protocols;5709  SmallVector<SourceLocation, 4> ProtocolLocs;5710  ObjCInterfaceDecl::protocol_loc_iterator FromProtoLoc =5711      From->protocol_loc_begin();5712 5713  for (ObjCInterfaceDecl::protocol_iterator FromProto = From->protocol_begin(),5714                                         FromProtoEnd = From->protocol_end();5715       FromProto != FromProtoEnd;5716       ++FromProto, ++FromProtoLoc) {5717    if (Expected<ObjCProtocolDecl *> ToProtoOrErr = import(*FromProto))5718      Protocols.push_back(*ToProtoOrErr);5719    else5720      return ToProtoOrErr.takeError();5721 5722    if (ExpectedSLoc ToProtoLocOrErr = import(*FromProtoLoc))5723      ProtocolLocs.push_back(*ToProtoLocOrErr);5724    else5725      return ToProtoLocOrErr.takeError();5726 5727  }5728 5729  // FIXME: If we're merging, make sure that the protocol list is the same.5730  To->setProtocolList(Protocols.data(), Protocols.size(),5731                      ProtocolLocs.data(), Importer.getToContext());5732 5733  // Import categories. When the categories themselves are imported, they'll5734  // hook themselves into this interface.5735  for (auto *Cat : From->known_categories()) {5736    auto ToCatOrErr = import(Cat);5737    if (!ToCatOrErr)5738      return ToCatOrErr.takeError();5739  }5740 5741  // If we have an @implementation, import it as well.5742  if (From->getImplementation()) {5743    if (Expected<ObjCImplementationDecl *> ToImplOrErr =5744        import(From->getImplementation()))5745      To->setImplementation(*ToImplOrErr);5746    else5747      return ToImplOrErr.takeError();5748  }5749 5750  // Import all of the members of this class.5751  if (Error Err = ImportDeclContext(From, /*ForceImport=*/true))5752    return Err;5753 5754  return Error::success();5755}5756 5757Expected<ObjCTypeParamList *>5758ASTNodeImporter::ImportObjCTypeParamList(ObjCTypeParamList *list) {5759  if (!list)5760    return nullptr;5761 5762  SmallVector<ObjCTypeParamDecl *, 4> toTypeParams;5763  for (auto *fromTypeParam : *list) {5764    if (auto toTypeParamOrErr = import(fromTypeParam))5765      toTypeParams.push_back(*toTypeParamOrErr);5766    else5767      return toTypeParamOrErr.takeError();5768  }5769 5770  auto LAngleLocOrErr = import(list->getLAngleLoc());5771  if (!LAngleLocOrErr)5772    return LAngleLocOrErr.takeError();5773 5774  auto RAngleLocOrErr = import(list->getRAngleLoc());5775  if (!RAngleLocOrErr)5776    return RAngleLocOrErr.takeError();5777 5778  return ObjCTypeParamList::create(Importer.getToContext(),5779                                   *LAngleLocOrErr,5780                                   toTypeParams,5781                                   *RAngleLocOrErr);5782}5783 5784ExpectedDecl ASTNodeImporter::VisitObjCInterfaceDecl(ObjCInterfaceDecl *D) {5785  // If this class has a definition in the translation unit we're coming from,5786  // but this particular declaration is not that definition, import the5787  // definition and map to that.5788  ObjCInterfaceDecl *Definition = D->getDefinition();5789  if (Definition && Definition != D) {5790    if (ExpectedDecl ImportedDefOrErr = import(Definition))5791      return Importer.MapImported(D, *ImportedDefOrErr);5792    else5793      return ImportedDefOrErr.takeError();5794  }5795 5796  // Import the major distinguishing characteristics of an @interface.5797  DeclContext *DC, *LexicalDC;5798  DeclarationName Name;5799  SourceLocation Loc;5800  NamedDecl *ToD;5801  if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))5802    return std::move(Err);5803  if (ToD)5804    return ToD;5805 5806  // Look for an existing interface with the same name.5807  ObjCInterfaceDecl *MergeWithIface = nullptr;5808  auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);5809  for (auto *FoundDecl : FoundDecls) {5810    if (!FoundDecl->isInIdentifierNamespace(Decl::IDNS_Ordinary))5811      continue;5812 5813    if ((MergeWithIface = dyn_cast<ObjCInterfaceDecl>(FoundDecl)))5814      break;5815  }5816 5817  // Create an interface declaration, if one does not already exist.5818  ObjCInterfaceDecl *ToIface = MergeWithIface;5819  if (!ToIface) {5820    ExpectedSLoc AtBeginLocOrErr = import(D->getAtStartLoc());5821    if (!AtBeginLocOrErr)5822      return AtBeginLocOrErr.takeError();5823 5824    if (GetImportedOrCreateDecl(5825            ToIface, D, Importer.getToContext(), DC,5826            *AtBeginLocOrErr, Name.getAsIdentifierInfo(),5827            /*TypeParamList=*/nullptr,5828            /*PrevDecl=*/nullptr, Loc, D->isImplicitInterfaceDecl()))5829      return ToIface;5830    ToIface->setLexicalDeclContext(LexicalDC);5831    LexicalDC->addDeclInternal(ToIface);5832  }5833  Importer.MapImported(D, ToIface);5834  // Import the type parameter list after MapImported, to avoid5835  // loops when bringing in their DeclContext.5836  if (auto ToPListOrErr =5837      ImportObjCTypeParamList(D->getTypeParamListAsWritten()))5838    ToIface->setTypeParamList(*ToPListOrErr);5839  else5840    return ToPListOrErr.takeError();5841 5842  if (D->isThisDeclarationADefinition())5843    if (Error Err = ImportDefinition(D, ToIface))5844      return std::move(Err);5845 5846  return ToIface;5847}5848 5849ExpectedDecl5850ASTNodeImporter::VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D) {5851  ObjCCategoryDecl *Category;5852  if (Error Err = importInto(Category, D->getCategoryDecl()))5853    return std::move(Err);5854 5855  ObjCCategoryImplDecl *ToImpl = Category->getImplementation();5856  if (!ToImpl) {5857    DeclContext *DC, *LexicalDC;5858    if (Error Err = ImportDeclContext(D, DC, LexicalDC))5859      return std::move(Err);5860 5861    Error Err = Error::success();5862    auto ToLocation = importChecked(Err, D->getLocation());5863    auto ToAtStartLoc = importChecked(Err, D->getAtStartLoc());5864    auto ToCategoryNameLoc = importChecked(Err, D->getCategoryNameLoc());5865    if (Err)5866      return std::move(Err);5867 5868    if (GetImportedOrCreateDecl(5869            ToImpl, D, Importer.getToContext(), DC,5870            Importer.Import(D->getIdentifier()), Category->getClassInterface(),5871            ToLocation, ToAtStartLoc, ToCategoryNameLoc))5872      return ToImpl;5873 5874    ToImpl->setLexicalDeclContext(LexicalDC);5875    LexicalDC->addDeclInternal(ToImpl);5876    Category->setImplementation(ToImpl);5877  }5878 5879  Importer.MapImported(D, ToImpl);5880  if (Error Err = ImportDeclContext(D))5881    return std::move(Err);5882 5883  return ToImpl;5884}5885 5886ExpectedDecl5887ASTNodeImporter::VisitObjCImplementationDecl(ObjCImplementationDecl *D) {5888  // Find the corresponding interface.5889  ObjCInterfaceDecl *Iface;5890  if (Error Err = importInto(Iface, D->getClassInterface()))5891    return std::move(Err);5892 5893  // Import the superclass, if any.5894  ObjCInterfaceDecl *Super;5895  if (Error Err = importInto(Super, D->getSuperClass()))5896    return std::move(Err);5897 5898  ObjCImplementationDecl *Impl = Iface->getImplementation();5899  if (!Impl) {5900    // We haven't imported an implementation yet. Create a new @implementation5901    // now.5902    DeclContext *DC, *LexicalDC;5903    if (Error Err = ImportDeclContext(D, DC, LexicalDC))5904      return std::move(Err);5905 5906    Error Err = Error::success();5907    auto ToLocation = importChecked(Err, D->getLocation());5908    auto ToAtStartLoc = importChecked(Err, D->getAtStartLoc());5909    auto ToSuperClassLoc = importChecked(Err, D->getSuperClassLoc());5910    auto ToIvarLBraceLoc = importChecked(Err, D->getIvarLBraceLoc());5911    auto ToIvarRBraceLoc = importChecked(Err, D->getIvarRBraceLoc());5912    if (Err)5913      return std::move(Err);5914 5915    if (GetImportedOrCreateDecl(Impl, D, Importer.getToContext(),5916                                DC, Iface, Super,5917                                ToLocation,5918                                ToAtStartLoc,5919                                ToSuperClassLoc,5920                                ToIvarLBraceLoc,5921                                ToIvarRBraceLoc))5922      return Impl;5923 5924    Impl->setLexicalDeclContext(LexicalDC);5925 5926    // Associate the implementation with the class it implements.5927    Iface->setImplementation(Impl);5928    Importer.MapImported(D, Iface->getImplementation());5929  } else {5930    Importer.MapImported(D, Iface->getImplementation());5931 5932    // Verify that the existing @implementation has the same superclass.5933    if ((Super && !Impl->getSuperClass()) ||5934        (!Super && Impl->getSuperClass()) ||5935        (Super && Impl->getSuperClass() &&5936         !declaresSameEntity(Super->getCanonicalDecl(),5937                             Impl->getSuperClass()))) {5938      Importer.ToDiag(Impl->getLocation(),5939                      diag::warn_odr_objc_superclass_inconsistent)5940        << Iface->getDeclName();5941      // FIXME: It would be nice to have the location of the superclass5942      // below.5943      if (Impl->getSuperClass())5944        Importer.ToDiag(Impl->getLocation(),5945                        diag::note_odr_objc_superclass)5946        << Impl->getSuperClass()->getDeclName();5947      else5948        Importer.ToDiag(Impl->getLocation(),5949                        diag::note_odr_objc_missing_superclass);5950      if (D->getSuperClass())5951        Importer.FromDiag(D->getLocation(),5952                          diag::note_odr_objc_superclass)5953        << D->getSuperClass()->getDeclName();5954      else5955        Importer.FromDiag(D->getLocation(),5956                          diag::note_odr_objc_missing_superclass);5957 5958      return make_error<ASTImportError>(ASTImportError::NameConflict);5959    }5960  }5961 5962  // Import all of the members of this @implementation.5963  if (Error Err = ImportDeclContext(D))5964    return std::move(Err);5965 5966  return Impl;5967}5968 5969ExpectedDecl ASTNodeImporter::VisitObjCPropertyDecl(ObjCPropertyDecl *D) {5970  // Import the major distinguishing characteristics of an @property.5971  DeclContext *DC, *LexicalDC;5972  DeclarationName Name;5973  SourceLocation Loc;5974  NamedDecl *ToD;5975  if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))5976    return std::move(Err);5977  if (ToD)5978    return ToD;5979 5980  // Check whether we have already imported this property.5981  auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);5982  for (auto *FoundDecl : FoundDecls) {5983    if (auto *FoundProp = dyn_cast<ObjCPropertyDecl>(FoundDecl)) {5984      // Instance and class properties can share the same name but are different5985      // declarations.5986      if (FoundProp->isInstanceProperty() != D->isInstanceProperty())5987        continue;5988 5989      // Check property types.5990      if (!Importer.IsStructurallyEquivalent(D->getType(),5991                                             FoundProp->getType())) {5992        Importer.ToDiag(Loc, diag::warn_odr_objc_property_type_inconsistent)5993          << Name << D->getType() << FoundProp->getType();5994        Importer.ToDiag(FoundProp->getLocation(), diag::note_odr_value_here)5995          << FoundProp->getType();5996 5997        return make_error<ASTImportError>(ASTImportError::NameConflict);5998      }5999 6000      // FIXME: Check property attributes, getters, setters, etc.?6001 6002      // Consider these properties to be equivalent.6003      Importer.MapImported(D, FoundProp);6004      return FoundProp;6005    }6006  }6007 6008  Error Err = Error::success();6009  auto ToType = importChecked(Err, D->getType());6010  auto ToTypeSourceInfo = importChecked(Err, D->getTypeSourceInfo());6011  auto ToAtLoc = importChecked(Err, D->getAtLoc());6012  auto ToLParenLoc = importChecked(Err, D->getLParenLoc());6013  if (Err)6014    return std::move(Err);6015 6016  // Create the new property.6017  ObjCPropertyDecl *ToProperty;6018  if (GetImportedOrCreateDecl(6019          ToProperty, D, Importer.getToContext(), DC, Loc,6020          Name.getAsIdentifierInfo(), ToAtLoc,6021          ToLParenLoc, ToType,6022          ToTypeSourceInfo, D->getPropertyImplementation()))6023    return ToProperty;6024 6025  auto ToGetterName = importChecked(Err, D->getGetterName());6026  auto ToSetterName = importChecked(Err, D->getSetterName());6027  auto ToGetterNameLoc = importChecked(Err, D->getGetterNameLoc());6028  auto ToSetterNameLoc = importChecked(Err, D->getSetterNameLoc());6029  auto ToGetterMethodDecl = importChecked(Err, D->getGetterMethodDecl());6030  auto ToSetterMethodDecl = importChecked(Err, D->getSetterMethodDecl());6031  auto ToPropertyIvarDecl = importChecked(Err, D->getPropertyIvarDecl());6032  if (Err)6033    return std::move(Err);6034 6035  ToProperty->setLexicalDeclContext(LexicalDC);6036  LexicalDC->addDeclInternal(ToProperty);6037 6038  ToProperty->setPropertyAttributes(D->getPropertyAttributes());6039  ToProperty->setPropertyAttributesAsWritten(6040                                      D->getPropertyAttributesAsWritten());6041  ToProperty->setGetterName(ToGetterName, ToGetterNameLoc);6042  ToProperty->setSetterName(ToSetterName, ToSetterNameLoc);6043  ToProperty->setGetterMethodDecl(ToGetterMethodDecl);6044  ToProperty->setSetterMethodDecl(ToSetterMethodDecl);6045  ToProperty->setPropertyIvarDecl(ToPropertyIvarDecl);6046  return ToProperty;6047}6048 6049ExpectedDecl6050ASTNodeImporter::VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D) {6051  ObjCPropertyDecl *Property;6052  if (Error Err = importInto(Property, D->getPropertyDecl()))6053    return std::move(Err);6054 6055  DeclContext *DC, *LexicalDC;6056  if (Error Err = ImportDeclContext(D, DC, LexicalDC))6057    return std::move(Err);6058 6059  auto *InImpl = cast<ObjCImplDecl>(LexicalDC);6060 6061  // Import the ivar (for an @synthesize).6062  ObjCIvarDecl *Ivar = nullptr;6063  if (Error Err = importInto(Ivar, D->getPropertyIvarDecl()))6064    return std::move(Err);6065 6066  ObjCPropertyImplDecl *ToImpl6067    = InImpl->FindPropertyImplDecl(Property->getIdentifier(),6068                                   Property->getQueryKind());6069  if (!ToImpl) {6070 6071    Error Err = Error::success();6072    auto ToBeginLoc = importChecked(Err, D->getBeginLoc());6073    auto ToLocation = importChecked(Err, D->getLocation());6074    auto ToPropertyIvarDeclLoc =6075        importChecked(Err, D->getPropertyIvarDeclLoc());6076    if (Err)6077      return std::move(Err);6078 6079    if (GetImportedOrCreateDecl(ToImpl, D, Importer.getToContext(), DC,6080                                ToBeginLoc,6081                                ToLocation, Property,6082                                D->getPropertyImplementation(), Ivar,6083                                ToPropertyIvarDeclLoc))6084      return ToImpl;6085 6086    ToImpl->setLexicalDeclContext(LexicalDC);6087    LexicalDC->addDeclInternal(ToImpl);6088  } else {6089    // Check that we have the same kind of property implementation (@synthesize6090    // vs. @dynamic).6091    if (D->getPropertyImplementation() != ToImpl->getPropertyImplementation()) {6092      Importer.ToDiag(ToImpl->getLocation(),6093                      diag::warn_odr_objc_property_impl_kind_inconsistent)6094        << Property->getDeclName()6095        << (ToImpl->getPropertyImplementation()6096                                              == ObjCPropertyImplDecl::Dynamic);6097      Importer.FromDiag(D->getLocation(),6098                        diag::note_odr_objc_property_impl_kind)6099        << D->getPropertyDecl()->getDeclName()6100        << (D->getPropertyImplementation() == ObjCPropertyImplDecl::Dynamic);6101 6102      return make_error<ASTImportError>(ASTImportError::NameConflict);6103    }6104 6105    // For @synthesize, check that we have the same6106    if (D->getPropertyImplementation() == ObjCPropertyImplDecl::Synthesize &&6107        Ivar != ToImpl->getPropertyIvarDecl()) {6108      Importer.ToDiag(ToImpl->getPropertyIvarDeclLoc(),6109                      diag::warn_odr_objc_synthesize_ivar_inconsistent)6110        << Property->getDeclName()6111        << ToImpl->getPropertyIvarDecl()->getDeclName()6112        << Ivar->getDeclName();6113      Importer.FromDiag(D->getPropertyIvarDeclLoc(),6114                        diag::note_odr_objc_synthesize_ivar_here)6115        << D->getPropertyIvarDecl()->getDeclName();6116 6117      return make_error<ASTImportError>(ASTImportError::NameConflict);6118    }6119 6120    // Merge the existing implementation with the new implementation.6121    Importer.MapImported(D, ToImpl);6122  }6123 6124  return ToImpl;6125}6126 6127ExpectedDecl6128ASTNodeImporter::VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D) {6129  // For template arguments, we adopt the translation unit as our declaration6130  // context. This context will be fixed when (during) the actual template6131  // declaration is created.6132 6133  ExpectedSLoc BeginLocOrErr = import(D->getBeginLoc());6134  if (!BeginLocOrErr)6135    return BeginLocOrErr.takeError();6136 6137  ExpectedSLoc LocationOrErr = import(D->getLocation());6138  if (!LocationOrErr)6139    return LocationOrErr.takeError();6140 6141  TemplateTypeParmDecl *ToD = nullptr;6142  if (GetImportedOrCreateDecl(6143      ToD, D, Importer.getToContext(),6144      Importer.getToContext().getTranslationUnitDecl(),6145      *BeginLocOrErr, *LocationOrErr,6146      D->getDepth(), D->getIndex(), Importer.Import(D->getIdentifier()),6147      D->wasDeclaredWithTypename(), D->isParameterPack(),6148      D->hasTypeConstraint()))6149    return ToD;6150 6151  // Import the type-constraint6152  if (const TypeConstraint *TC = D->getTypeConstraint()) {6153 6154    Error Err = Error::success();6155    auto ToConceptRef = importChecked(Err, TC->getConceptReference());6156    auto ToIDC = importChecked(Err, TC->getImmediatelyDeclaredConstraint());6157    if (Err)6158      return std::move(Err);6159 6160    ToD->setTypeConstraint(ToConceptRef, ToIDC, TC->getArgPackSubstIndex());6161  }6162 6163  if (Error Err = importTemplateParameterDefaultArgument(D, ToD))6164    return Err;6165 6166  return ToD;6167}6168 6169ExpectedDecl6170ASTNodeImporter::VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D) {6171 6172  Error Err = Error::success();6173  auto ToDeclName = importChecked(Err, D->getDeclName());6174  auto ToLocation = importChecked(Err, D->getLocation());6175  auto ToType = importChecked(Err, D->getType());6176  auto ToTypeSourceInfo = importChecked(Err, D->getTypeSourceInfo());6177  auto ToInnerLocStart = importChecked(Err, D->getInnerLocStart());6178  if (Err)6179    return std::move(Err);6180 6181  NonTypeTemplateParmDecl *ToD = nullptr;6182  if (GetImportedOrCreateDecl(ToD, D, Importer.getToContext(),6183                              Importer.getToContext().getTranslationUnitDecl(),6184                              ToInnerLocStart, ToLocation, D->getDepth(),6185                              D->getPosition(),6186                              ToDeclName.getAsIdentifierInfo(), ToType,6187                              D->isParameterPack(), ToTypeSourceInfo))6188    return ToD;6189 6190  Err = importTemplateParameterDefaultArgument(D, ToD);6191  if (Err)6192    return Err;6193 6194  return ToD;6195}6196 6197ExpectedDecl6198ASTNodeImporter::VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D) {6199  bool IsCanonical = false;6200  if (auto *CanonD = Importer.getFromContext()6201                         .findCanonicalTemplateTemplateParmDeclInternal(D);6202      CanonD == D)6203    IsCanonical = true;6204 6205  // Import the name of this declaration.6206  auto NameOrErr = import(D->getDeclName());6207  if (!NameOrErr)6208    return NameOrErr.takeError();6209 6210  // Import the location of this declaration.6211  ExpectedSLoc LocationOrErr = import(D->getLocation());6212  if (!LocationOrErr)6213    return LocationOrErr.takeError();6214 6215  // Import template parameters.6216  auto TemplateParamsOrErr = import(D->getTemplateParameters());6217  if (!TemplateParamsOrErr)6218    return TemplateParamsOrErr.takeError();6219 6220  TemplateTemplateParmDecl *ToD = nullptr;6221  if (GetImportedOrCreateDecl(6222          ToD, D, Importer.getToContext(),6223          Importer.getToContext().getTranslationUnitDecl(), *LocationOrErr,6224          D->getDepth(), D->getPosition(), D->isParameterPack(),6225          (*NameOrErr).getAsIdentifierInfo(), D->templateParameterKind(),6226          D->wasDeclaredWithTypename(), *TemplateParamsOrErr))6227    return ToD;6228 6229  if (Error Err = importTemplateParameterDefaultArgument(D, ToD))6230    return Err;6231 6232  if (IsCanonical)6233    return Importer.getToContext()6234        .insertCanonicalTemplateTemplateParmDeclInternal(ToD);6235 6236  return ToD;6237}6238 6239// Returns the definition for a (forward) declaration of a TemplateDecl, if6240// it has any definition in the redecl chain.6241template <typename T> static auto getTemplateDefinition(T *D) -> T * {6242  assert(D->getTemplatedDecl() && "Should be called on templates only");6243  auto *ToTemplatedDef = D->getTemplatedDecl()->getDefinition();6244  if (!ToTemplatedDef)6245    return nullptr;6246  auto *TemplateWithDef = ToTemplatedDef->getDescribedTemplate();6247  return cast_or_null<T>(TemplateWithDef);6248}6249 6250ExpectedDecl ASTNodeImporter::VisitClassTemplateDecl(ClassTemplateDecl *D) {6251 6252  // Import the major distinguishing characteristics of this class template.6253  DeclContext *DC, *LexicalDC;6254  DeclarationName Name;6255  SourceLocation Loc;6256  NamedDecl *ToD;6257  if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))6258    return std::move(Err);6259  if (ToD)6260    return ToD;6261 6262  // Should check if a declaration is friend in a dependent context.6263  // Such templates are not linked together in a declaration chain.6264  // The ASTImporter strategy is to map existing forward declarations to6265  // imported ones only if strictly necessary, otherwise import these as new6266  // forward declarations. In case of the "dependent friend" declarations, new6267  // declarations are created, but not linked in a declaration chain.6268  auto IsDependentFriend = [](ClassTemplateDecl *TD) {6269    return TD->getFriendObjectKind() != Decl::FOK_None &&6270           TD->getLexicalDeclContext()->isDependentContext();6271  };6272  bool DependentFriend = IsDependentFriend(D);6273 6274  ClassTemplateDecl *FoundByLookup = nullptr;6275 6276  // We may already have a template of the same name; try to find and match it.6277  if (!DC->isFunctionOrMethod()) {6278    SmallVector<NamedDecl *, 4> ConflictingDecls;6279    auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);6280    for (auto *FoundDecl : FoundDecls) {6281      if (!FoundDecl->isInIdentifierNamespace(Decl::IDNS_Ordinary |6282                                              Decl::IDNS_TagFriend))6283        continue;6284 6285      auto *FoundTemplate = dyn_cast<ClassTemplateDecl>(FoundDecl);6286      if (FoundTemplate) {6287        if (!hasSameVisibilityContextAndLinkage(FoundTemplate, D))6288          continue;6289 6290        // FIXME: sufficient condition for 'IgnoreTemplateParmDepth'?6291        bool IgnoreTemplateParmDepth =6292            (FoundTemplate->getFriendObjectKind() != Decl::FOK_None) !=6293            (D->getFriendObjectKind() != Decl::FOK_None);6294        if (IsStructuralMatch(D, FoundTemplate, /*Complain=*/true,6295                              IgnoreTemplateParmDepth)) {6296          if (DependentFriend || IsDependentFriend(FoundTemplate))6297            continue;6298 6299          ClassTemplateDecl *TemplateWithDef =6300              getTemplateDefinition(FoundTemplate);6301          if (D->isThisDeclarationADefinition() && TemplateWithDef)6302            return Importer.MapImported(D, TemplateWithDef);6303          if (!FoundByLookup)6304            FoundByLookup = FoundTemplate;6305          // Search in all matches because there may be multiple decl chains,6306          // see ASTTests test ImportExistingFriendClassTemplateDef.6307          continue;6308        }6309        // When importing a friend, it is possible that multiple declarations6310        // with same name can co-exist in specific cases (if a template contains6311        // a friend template and has a specialization). For this case the6312        // declarations should match, except that the "template depth" is6313        // different. No linking of previous declaration is needed in this case.6314        // FIXME: This condition may need refinement.6315        if (D->getFriendObjectKind() != Decl::FOK_None &&6316            FoundTemplate->getFriendObjectKind() != Decl::FOK_None &&6317            D->getFriendObjectKind() != FoundTemplate->getFriendObjectKind() &&6318            IsStructuralMatch(D, FoundTemplate, /*Complain=*/false,6319                              /*IgnoreTemplateParmDepth=*/true))6320          continue;6321 6322        ConflictingDecls.push_back(FoundDecl);6323      }6324    }6325 6326    if (!ConflictingDecls.empty()) {6327      ExpectedName NameOrErr = Importer.HandleNameConflict(6328          Name, DC, Decl::IDNS_Ordinary, ConflictingDecls.data(),6329          ConflictingDecls.size());6330      if (NameOrErr)6331        Name = NameOrErr.get();6332      else6333        return NameOrErr.takeError();6334    }6335  }6336 6337  CXXRecordDecl *FromTemplated = D->getTemplatedDecl();6338 6339  auto TemplateParamsOrErr = import(D->getTemplateParameters());6340  if (!TemplateParamsOrErr)6341    return TemplateParamsOrErr.takeError();6342 6343  // Create the declaration that is being templated.6344  CXXRecordDecl *ToTemplated;6345  if (Error Err = importInto(ToTemplated, FromTemplated))6346    return std::move(Err);6347 6348  // Create the class template declaration itself.6349  ClassTemplateDecl *D2;6350  if (GetImportedOrCreateDecl(D2, D, Importer.getToContext(), DC, Loc, Name,6351                              *TemplateParamsOrErr, ToTemplated))6352    return D2;6353 6354  ToTemplated->setDescribedClassTemplate(D2);6355 6356  D2->setAccess(D->getAccess());6357  D2->setLexicalDeclContext(LexicalDC);6358 6359  addDeclToContexts(D, D2);6360  updateLookupTableForTemplateParameters(**TemplateParamsOrErr);6361 6362  if (FoundByLookup) {6363    auto *Recent =6364        const_cast<ClassTemplateDecl *>(FoundByLookup->getMostRecentDecl());6365 6366    // It is possible that during the import of the class template definition6367    // we start the import of a fwd friend decl of the very same class template6368    // and we add the fwd friend decl to the lookup table. But the ToTemplated6369    // had been created earlier and by that time the lookup could not find6370    // anything existing, so it has no previous decl. Later, (still during the6371    // import of the fwd friend decl) we start to import the definition again6372    // and this time the lookup finds the previous fwd friend class template.6373    // In this case we must set up the previous decl for the templated decl.6374    if (!ToTemplated->getPreviousDecl()) {6375      assert(FoundByLookup->getTemplatedDecl() &&6376             "Found decl must have its templated decl set");6377      CXXRecordDecl *PrevTemplated =6378          FoundByLookup->getTemplatedDecl()->getMostRecentDecl();6379      if (ToTemplated != PrevTemplated)6380        ToTemplated->setPreviousDecl(PrevTemplated);6381    }6382 6383    D2->setPreviousDecl(Recent);6384  }6385 6386  return D2;6387}6388 6389ExpectedDecl ASTNodeImporter::VisitClassTemplateSpecializationDecl(6390                                          ClassTemplateSpecializationDecl *D) {6391  ClassTemplateDecl *ClassTemplate;6392  if (Error Err = importInto(ClassTemplate, D->getSpecializedTemplate()))6393    return std::move(Err);6394 6395  // Import the context of this declaration.6396  DeclContext *DC, *LexicalDC;6397  if (Error Err = ImportDeclContext(D, DC, LexicalDC))6398    return std::move(Err);6399 6400  // Import template arguments.6401  SmallVector<TemplateArgument, 2> TemplateArgs;6402  if (Error Err =6403          ImportTemplateArguments(D->getTemplateArgs().asArray(), TemplateArgs))6404    return std::move(Err);6405  // Try to find an existing specialization with these template arguments and6406  // template parameter list.6407  void *InsertPos = nullptr;6408  ClassTemplateSpecializationDecl *PrevDecl = nullptr;6409  ClassTemplatePartialSpecializationDecl *PartialSpec =6410            dyn_cast<ClassTemplatePartialSpecializationDecl>(D);6411 6412  // Import template parameters.6413  TemplateParameterList *ToTPList = nullptr;6414 6415  if (PartialSpec) {6416    auto ToTPListOrErr = import(PartialSpec->getTemplateParameters());6417    if (!ToTPListOrErr)6418      return ToTPListOrErr.takeError();6419    ToTPList = *ToTPListOrErr;6420    PrevDecl = ClassTemplate->findPartialSpecialization(TemplateArgs,6421                                                        *ToTPListOrErr,6422                                                        InsertPos);6423  } else6424    PrevDecl = ClassTemplate->findSpecialization(TemplateArgs, InsertPos);6425 6426  if (PrevDecl) {6427    if (IsStructuralMatch(D, PrevDecl)) {6428      CXXRecordDecl *PrevDefinition = PrevDecl->getDefinition();6429      if (D->isThisDeclarationADefinition() && PrevDefinition) {6430        Importer.MapImported(D, PrevDefinition);6431        // Import those default field initializers which have been6432        // instantiated in the "From" context, but not in the "To" context.6433        for (auto *FromField : D->fields()) {6434          auto ToOrErr = import(FromField);6435          if (!ToOrErr)6436            return ToOrErr.takeError();6437        }6438 6439        // Import those methods which have been instantiated in the6440        // "From" context, but not in the "To" context.6441        for (CXXMethodDecl *FromM : D->methods()) {6442          auto ToOrErr = import(FromM);6443          if (!ToOrErr)6444            return ToOrErr.takeError();6445        }6446 6447        // TODO Import instantiated default arguments.6448        // TODO Import instantiated exception specifications.6449        //6450        // Generally, ASTCommon.h/DeclUpdateKind enum gives a very good hint6451        // what else could be fused during an AST merge.6452        return PrevDefinition;6453      }6454    } else { // ODR violation.6455      // FIXME HandleNameConflict6456      return make_error<ASTImportError>(ASTImportError::NameConflict);6457    }6458  }6459 6460  // Import the location of this declaration.6461  ExpectedSLoc BeginLocOrErr = import(D->getBeginLoc());6462  if (!BeginLocOrErr)6463    return BeginLocOrErr.takeError();6464  ExpectedSLoc IdLocOrErr = import(D->getLocation());6465  if (!IdLocOrErr)6466    return IdLocOrErr.takeError();6467 6468  // Import TemplateArgumentListInfo.6469  TemplateArgumentListInfo ToTAInfo;6470  if (const auto *ASTTemplateArgs = D->getTemplateArgsAsWritten()) {6471    if (Error Err = ImportTemplateArgumentListInfo(*ASTTemplateArgs, ToTAInfo))6472      return std::move(Err);6473  }6474 6475  // Create the specialization.6476  ClassTemplateSpecializationDecl *D2 = nullptr;6477  if (PartialSpec) {6478    if (GetImportedOrCreateDecl<ClassTemplatePartialSpecializationDecl>(6479            D2, D, Importer.getToContext(), D->getTagKind(), DC, *BeginLocOrErr,6480            *IdLocOrErr, ToTPList, ClassTemplate, ArrayRef(TemplateArgs),6481            /*CanonInjectedTST=*/CanQualType(),6482            cast_or_null<ClassTemplatePartialSpecializationDecl>(PrevDecl)))6483      return D2;6484 6485    // Update InsertPos, because preceding import calls may have invalidated6486    // it by adding new specializations.6487    auto *PartSpec2 = cast<ClassTemplatePartialSpecializationDecl>(D2);6488    if (!ClassTemplate->findPartialSpecialization(TemplateArgs, ToTPList,6489                                                  InsertPos))6490      // Add this partial specialization to the class template.6491      ClassTemplate->AddPartialSpecialization(PartSpec2, InsertPos);6492    if (Expected<ClassTemplatePartialSpecializationDecl *> ToInstOrErr =6493            import(PartialSpec->getInstantiatedFromMember()))6494      PartSpec2->setInstantiatedFromMember(*ToInstOrErr);6495    else6496      return ToInstOrErr.takeError();6497 6498    updateLookupTableForTemplateParameters(*ToTPList);6499  } else { // Not a partial specialization.6500    if (GetImportedOrCreateDecl(D2, D, Importer.getToContext(), D->getTagKind(),6501                                DC, *BeginLocOrErr, *IdLocOrErr, ClassTemplate,6502                                TemplateArgs, D->hasStrictPackMatch(),6503                                PrevDecl))6504      return D2;6505 6506    // Update InsertPos, because preceding import calls may have invalidated6507    // it by adding new specializations.6508    if (!ClassTemplate->findSpecialization(TemplateArgs, InsertPos))6509      // Add this specialization to the class template.6510      ClassTemplate->AddSpecialization(D2, InsertPos);6511  }6512 6513  D2->setSpecializationKind(D->getSpecializationKind());6514 6515  // Set the context of this specialization/instantiation.6516  D2->setLexicalDeclContext(LexicalDC);6517 6518  // Add to the DC only if it was an explicit specialization/instantiation.6519  if (D2->isExplicitInstantiationOrSpecialization()) {6520    LexicalDC->addDeclInternal(D2);6521  }6522 6523  if (auto BraceRangeOrErr = import(D->getBraceRange()))6524    D2->setBraceRange(*BraceRangeOrErr);6525  else6526    return BraceRangeOrErr.takeError();6527 6528  if (Error Err = ImportTemplateParameterLists(D, D2))6529    return std::move(Err);6530 6531  // Import the qualifier, if any.6532  if (auto LocOrErr = import(D->getQualifierLoc()))6533    D2->setQualifierInfo(*LocOrErr);6534  else6535    return LocOrErr.takeError();6536 6537  if (D->getTemplateArgsAsWritten())6538    D2->setTemplateArgsAsWritten(ToTAInfo);6539 6540  if (auto LocOrErr = import(D->getTemplateKeywordLoc()))6541    D2->setTemplateKeywordLoc(*LocOrErr);6542  else6543    return LocOrErr.takeError();6544 6545  if (auto LocOrErr = import(D->getExternKeywordLoc()))6546    D2->setExternKeywordLoc(*LocOrErr);6547  else6548    return LocOrErr.takeError();6549 6550  if (D->getPointOfInstantiation().isValid()) {6551    if (auto POIOrErr = import(D->getPointOfInstantiation()))6552      D2->setPointOfInstantiation(*POIOrErr);6553    else6554      return POIOrErr.takeError();6555  }6556 6557  D2->setTemplateSpecializationKind(D->getTemplateSpecializationKind());6558 6559  if (auto P = D->getInstantiatedFrom()) {6560    if (auto *CTD = dyn_cast<ClassTemplateDecl *>(P)) {6561      if (auto CTDorErr = import(CTD))6562        D2->setInstantiationOf(*CTDorErr);6563    } else {6564      auto *CTPSD = cast<ClassTemplatePartialSpecializationDecl *>(P);6565      auto CTPSDOrErr = import(CTPSD);6566      if (!CTPSDOrErr)6567        return CTPSDOrErr.takeError();6568      const TemplateArgumentList &DArgs = D->getTemplateInstantiationArgs();6569      SmallVector<TemplateArgument, 2> D2ArgsVec(DArgs.size());6570      for (unsigned I = 0; I < DArgs.size(); ++I) {6571        const TemplateArgument &DArg = DArgs[I];6572        if (auto ArgOrErr = import(DArg))6573          D2ArgsVec[I] = *ArgOrErr;6574        else6575          return ArgOrErr.takeError();6576      }6577      D2->setInstantiationOf(6578          *CTPSDOrErr,6579          TemplateArgumentList::CreateCopy(Importer.getToContext(), D2ArgsVec));6580    }6581  }6582 6583  if (D->isCompleteDefinition())6584    if (Error Err = ImportDefinition(D, D2))6585      return std::move(Err);6586 6587  return D2;6588}6589 6590ExpectedDecl ASTNodeImporter::VisitVarTemplateDecl(VarTemplateDecl *D) {6591  // Import the major distinguishing characteristics of this variable template.6592  DeclContext *DC, *LexicalDC;6593  DeclarationName Name;6594  SourceLocation Loc;6595  NamedDecl *ToD;6596  if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))6597    return std::move(Err);6598  if (ToD)6599    return ToD;6600 6601  // We may already have a template of the same name; try to find and match it.6602  assert(!DC->isFunctionOrMethod() &&6603         "Variable templates cannot be declared at function scope");6604 6605  SmallVector<NamedDecl *, 4> ConflictingDecls;6606  auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);6607  VarTemplateDecl *FoundByLookup = nullptr;6608  for (auto *FoundDecl : FoundDecls) {6609    if (!FoundDecl->isInIdentifierNamespace(Decl::IDNS_Ordinary))6610      continue;6611 6612    if (VarTemplateDecl *FoundTemplate = dyn_cast<VarTemplateDecl>(FoundDecl)) {6613      // Use the templated decl, some linkage flags are set only there.6614      if (!hasSameVisibilityContextAndLinkage(FoundTemplate->getTemplatedDecl(),6615                                              D->getTemplatedDecl()))6616        continue;6617      if (IsStructuralMatch(D, FoundTemplate)) {6618        // FIXME Check for ODR error if the two definitions have6619        // different initializers?6620        VarTemplateDecl *FoundDef = getTemplateDefinition(FoundTemplate);6621        if (D->getDeclContext()->isRecord()) {6622          assert(FoundTemplate->getDeclContext()->isRecord() &&6623                 "Member variable template imported as non-member, "6624                 "inconsistent imported AST?");6625          if (FoundDef)6626            return Importer.MapImported(D, FoundDef);6627          if (!D->isThisDeclarationADefinition())6628            return Importer.MapImported(D, FoundTemplate);6629        } else {6630          if (FoundDef && D->isThisDeclarationADefinition())6631            return Importer.MapImported(D, FoundDef);6632        }6633        FoundByLookup = FoundTemplate;6634        break;6635      }6636      ConflictingDecls.push_back(FoundDecl);6637    }6638  }6639 6640  if (!ConflictingDecls.empty()) {6641    ExpectedName NameOrErr = Importer.HandleNameConflict(6642        Name, DC, Decl::IDNS_Ordinary, ConflictingDecls.data(),6643        ConflictingDecls.size());6644    if (NameOrErr)6645      Name = NameOrErr.get();6646    else6647      return NameOrErr.takeError();6648  }6649 6650  VarDecl *DTemplated = D->getTemplatedDecl();6651 6652  // Import the type.6653  // FIXME: Value not used?6654  ExpectedType TypeOrErr = import(DTemplated->getType());6655  if (!TypeOrErr)6656    return TypeOrErr.takeError();6657 6658  // Create the declaration that is being templated.6659  VarDecl *ToTemplated;6660  if (Error Err = importInto(ToTemplated, DTemplated))6661    return std::move(Err);6662 6663  // Create the variable template declaration itself.6664  auto TemplateParamsOrErr = import(D->getTemplateParameters());6665  if (!TemplateParamsOrErr)6666    return TemplateParamsOrErr.takeError();6667 6668  VarTemplateDecl *ToVarTD;6669  if (GetImportedOrCreateDecl(ToVarTD, D, Importer.getToContext(), DC, Loc,6670                              Name, *TemplateParamsOrErr, ToTemplated))6671    return ToVarTD;6672 6673  ToTemplated->setDescribedVarTemplate(ToVarTD);6674 6675  ToVarTD->setAccess(D->getAccess());6676  ToVarTD->setLexicalDeclContext(LexicalDC);6677  LexicalDC->addDeclInternal(ToVarTD);6678  if (DC != Importer.getToContext().getTranslationUnitDecl())6679    updateLookupTableForTemplateParameters(**TemplateParamsOrErr);6680 6681  if (FoundByLookup) {6682    auto *Recent =6683        const_cast<VarTemplateDecl *>(FoundByLookup->getMostRecentDecl());6684    if (!ToTemplated->getPreviousDecl()) {6685      auto *PrevTemplated =6686          FoundByLookup->getTemplatedDecl()->getMostRecentDecl();6687      if (ToTemplated != PrevTemplated)6688        ToTemplated->setPreviousDecl(PrevTemplated);6689    }6690    ToVarTD->setPreviousDecl(Recent);6691  }6692 6693  return ToVarTD;6694}6695 6696ExpectedDecl ASTNodeImporter::VisitVarTemplateSpecializationDecl(6697    VarTemplateSpecializationDecl *D) {6698  // A VarTemplateSpecializationDecl inherits from VarDecl, the import is done6699  // in an analog way (but specialized for this case).6700 6701  SmallVector<Decl *, 2> Redecls = getCanonicalForwardRedeclChain(D);6702  auto RedeclIt = Redecls.begin();6703  // Import the first part of the decl chain. I.e. import all previous6704  // declarations starting from the canonical decl.6705  for (; RedeclIt != Redecls.end() && *RedeclIt != D; ++RedeclIt) {6706    ExpectedDecl RedeclOrErr = import(*RedeclIt);6707    if (!RedeclOrErr)6708      return RedeclOrErr.takeError();6709  }6710  assert(*RedeclIt == D);6711 6712  VarTemplateDecl *VarTemplate = nullptr;6713  if (Error Err = importInto(VarTemplate, D->getSpecializedTemplate()))6714    return std::move(Err);6715 6716  // Import the context of this declaration.6717  DeclContext *DC, *LexicalDC;6718  if (Error Err = ImportDeclContext(D, DC, LexicalDC))6719    return std::move(Err);6720 6721  // Import the location of this declaration.6722  ExpectedSLoc BeginLocOrErr = import(D->getBeginLoc());6723  if (!BeginLocOrErr)6724    return BeginLocOrErr.takeError();6725 6726  auto IdLocOrErr = import(D->getLocation());6727  if (!IdLocOrErr)6728    return IdLocOrErr.takeError();6729 6730  // Import template arguments.6731  SmallVector<TemplateArgument, 2> TemplateArgs;6732  if (Error Err =6733          ImportTemplateArguments(D->getTemplateArgs().asArray(), TemplateArgs))6734    return std::move(Err);6735 6736  // Try to find an existing specialization with these template arguments.6737  void *InsertPos = nullptr;6738  VarTemplateSpecializationDecl *FoundSpecialization =6739      VarTemplate->findSpecialization(TemplateArgs, InsertPos);6740  if (FoundSpecialization) {6741    if (IsStructuralMatch(D, FoundSpecialization)) {6742      VarDecl *FoundDef = FoundSpecialization->getDefinition();6743      if (D->getDeclContext()->isRecord()) {6744        // In a record, it is allowed only to have one optional declaration and6745        // one definition of the (static or constexpr) variable template.6746        assert(6747            FoundSpecialization->getDeclContext()->isRecord() &&6748            "Member variable template specialization imported as non-member, "6749            "inconsistent imported AST?");6750        if (FoundDef)6751          return Importer.MapImported(D, FoundDef);6752        if (!D->isThisDeclarationADefinition())6753          return Importer.MapImported(D, FoundSpecialization);6754      } else {6755        // If definition is imported and there is already one, map to it.6756        // Otherwise create a new variable and link it to the existing.6757        if (FoundDef && D->isThisDeclarationADefinition())6758          return Importer.MapImported(D, FoundDef);6759      }6760    } else {6761      return make_error<ASTImportError>(ASTImportError::NameConflict);6762    }6763  }6764 6765  VarTemplateSpecializationDecl *D2 = nullptr;6766 6767  TemplateArgumentListInfo ToTAInfo;6768  if (const auto *Args = D->getTemplateArgsAsWritten()) {6769    if (Error Err = ImportTemplateArgumentListInfo(*Args, ToTAInfo))6770      return std::move(Err);6771  }6772 6773  using PartVarSpecDecl = VarTemplatePartialSpecializationDecl;6774  // Create a new specialization.6775  if (auto *FromPartial = dyn_cast<PartVarSpecDecl>(D)) {6776    auto ToTPListOrErr = import(FromPartial->getTemplateParameters());6777    if (!ToTPListOrErr)6778      return ToTPListOrErr.takeError();6779 6780    PartVarSpecDecl *ToPartial;6781    if (GetImportedOrCreateDecl(ToPartial, D, Importer.getToContext(), DC,6782                                *BeginLocOrErr, *IdLocOrErr, *ToTPListOrErr,6783                                VarTemplate, QualType(), nullptr,6784                                D->getStorageClass(), TemplateArgs))6785      return ToPartial;6786 6787    if (Expected<PartVarSpecDecl *> ToInstOrErr =6788            import(FromPartial->getInstantiatedFromMember()))6789      ToPartial->setInstantiatedFromMember(*ToInstOrErr);6790    else6791      return ToInstOrErr.takeError();6792 6793    if (FromPartial->isMemberSpecialization())6794      ToPartial->setMemberSpecialization();6795 6796    D2 = ToPartial;6797 6798    // FIXME: Use this update if VarTemplatePartialSpecializationDecl is fixed6799    // to adopt template parameters.6800    // updateLookupTableForTemplateParameters(**ToTPListOrErr);6801  } else { // Full specialization6802    if (GetImportedOrCreateDecl(D2, D, Importer.getToContext(), DC,6803                                *BeginLocOrErr, *IdLocOrErr, VarTemplate,6804                                QualType(), nullptr, D->getStorageClass(),6805                                TemplateArgs))6806      return D2;6807  }6808 6809  // Update InsertPos, because preceding import calls may have invalidated6810  // it by adding new specializations.6811  if (!VarTemplate->findSpecialization(TemplateArgs, InsertPos))6812    VarTemplate->AddSpecialization(D2, InsertPos);6813 6814  QualType T;6815  if (Error Err = importInto(T, D->getType()))6816    return std::move(Err);6817  D2->setType(T);6818 6819  auto TInfoOrErr = import(D->getTypeSourceInfo());6820  if (!TInfoOrErr)6821    return TInfoOrErr.takeError();6822  D2->setTypeSourceInfo(*TInfoOrErr);6823 6824  if (D->getPointOfInstantiation().isValid()) {6825    if (ExpectedSLoc POIOrErr = import(D->getPointOfInstantiation()))6826      D2->setPointOfInstantiation(*POIOrErr);6827    else6828      return POIOrErr.takeError();6829  }6830 6831  D2->setSpecializationKind(D->getSpecializationKind());6832 6833  if (D->getTemplateArgsAsWritten())6834    D2->setTemplateArgsAsWritten(ToTAInfo);6835 6836  if (auto LocOrErr = import(D->getQualifierLoc()))6837    D2->setQualifierInfo(*LocOrErr);6838  else6839    return LocOrErr.takeError();6840 6841  if (D->isConstexpr())6842    D2->setConstexpr(true);6843 6844  D2->setAccess(D->getAccess());6845 6846  if (Error Err = ImportInitializer(D, D2))6847    return std::move(Err);6848 6849  if (FoundSpecialization)6850    D2->setPreviousDecl(FoundSpecialization->getMostRecentDecl());6851 6852  addDeclToContexts(D, D2);6853 6854  // Import the rest of the chain. I.e. import all subsequent declarations.6855  for (++RedeclIt; RedeclIt != Redecls.end(); ++RedeclIt) {6856    ExpectedDecl RedeclOrErr = import(*RedeclIt);6857    if (!RedeclOrErr)6858      return RedeclOrErr.takeError();6859  }6860 6861  return D2;6862}6863 6864ExpectedDecl6865ASTNodeImporter::VisitFunctionTemplateDecl(FunctionTemplateDecl *D) {6866  DeclContext *DC, *LexicalDC;6867  DeclarationName Name;6868  SourceLocation Loc;6869  NamedDecl *ToD;6870 6871  if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))6872    return std::move(Err);6873 6874  if (ToD)6875    return ToD;6876 6877  const FunctionTemplateDecl *FoundByLookup = nullptr;6878 6879  // Try to find a function in our own ("to") context with the same name, same6880  // type, and in the same context as the function we're importing.6881  // FIXME Split this into a separate function.6882  if (!LexicalDC->isFunctionOrMethod()) {6883    unsigned IDNS = Decl::IDNS_Ordinary | Decl::IDNS_OrdinaryFriend;6884    auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);6885    for (auto *FoundDecl : FoundDecls) {6886      if (!FoundDecl->isInIdentifierNamespace(IDNS))6887        continue;6888 6889      if (auto *FoundTemplate = dyn_cast<FunctionTemplateDecl>(FoundDecl)) {6890        if (!hasSameVisibilityContextAndLinkage(FoundTemplate, D))6891          continue;6892        if (IsStructuralMatch(D, FoundTemplate)) {6893          FunctionTemplateDecl *TemplateWithDef =6894              getTemplateDefinition(FoundTemplate);6895          if (D->isThisDeclarationADefinition() && TemplateWithDef)6896            return Importer.MapImported(D, TemplateWithDef);6897 6898          FoundByLookup = FoundTemplate;6899          break;6900          // TODO: handle conflicting names6901        }6902      }6903    }6904  }6905 6906  auto ParamsOrErr = import(D->getTemplateParameters());6907  if (!ParamsOrErr)6908    return ParamsOrErr.takeError();6909  TemplateParameterList *Params = *ParamsOrErr;6910 6911  FunctionDecl *TemplatedFD;6912  if (Error Err = importInto(TemplatedFD, D->getTemplatedDecl()))6913    return std::move(Err);6914 6915  // At creation of the template the template parameters are "adopted"6916  // (DeclContext is changed). After this possible change the lookup table6917  // must be updated.6918  // At deduction guides the DeclContext of the template parameters may be6919  // different from what we would expect, it may be the class template, or a6920  // probably different CXXDeductionGuideDecl. This may come from the fact that6921  // the template parameter objects may be shared between deduction guides or6922  // the class template, and at creation of multiple FunctionTemplateDecl6923  // objects (for deduction guides) the same parameters are re-used. The6924  // "adoption" happens multiple times with different parent, even recursively6925  // for TemplateTemplateParmDecl. The same happens at import when the6926  // FunctionTemplateDecl objects are created, but in different order.6927  // In this way the DeclContext of these template parameters is not necessarily6928  // the same as in the "from" context.6929  SmallVector<DeclContext *, 2> OldParamDC;6930  OldParamDC.reserve(Params->size());6931  llvm::transform(*Params, std::back_inserter(OldParamDC),6932                  [](NamedDecl *ND) { return ND->getDeclContext(); });6933 6934  FunctionTemplateDecl *ToFunc;6935  if (GetImportedOrCreateDecl(ToFunc, D, Importer.getToContext(), DC, Loc, Name,6936                              Params, TemplatedFD))6937    return ToFunc;6938 6939  // Fail if TemplatedFD is already part of a template.6940  // The template should have been found by structural equivalence check before,6941  // or ToFunc should be already imported.6942  // If not, there is AST incompatibility that can be caused by previous import6943  // errors. (NameConflict is not exact here.)6944  if (TemplatedFD->getDescribedTemplate())6945    return make_error<ASTImportError>(ASTImportError::NameConflict);6946 6947  TemplatedFD->setDescribedFunctionTemplate(ToFunc);6948 6949  ToFunc->setAccess(D->getAccess());6950  ToFunc->setLexicalDeclContext(LexicalDC);6951  addDeclToContexts(D, ToFunc);6952 6953  ASTImporterLookupTable *LT = Importer.SharedState->getLookupTable();6954  if (LT && !OldParamDC.empty()) {6955    for (unsigned int I = 0; I < OldParamDC.size(); ++I)6956      LT->updateForced(Params->getParam(I), OldParamDC[I]);6957  }6958 6959  if (FoundByLookup) {6960    auto *Recent =6961        const_cast<FunctionTemplateDecl *>(FoundByLookup->getMostRecentDecl());6962    if (!TemplatedFD->getPreviousDecl()) {6963      assert(FoundByLookup->getTemplatedDecl() &&6964             "Found decl must have its templated decl set");6965      auto *PrevTemplated =6966          FoundByLookup->getTemplatedDecl()->getMostRecentDecl();6967      if (TemplatedFD != PrevTemplated)6968        TemplatedFD->setPreviousDecl(PrevTemplated);6969    }6970    ToFunc->setPreviousDecl(Recent);6971  }6972 6973  return ToFunc;6974}6975 6976ExpectedDecl ASTNodeImporter::VisitConceptDecl(ConceptDecl *D) {6977  DeclContext *DC, *LexicalDC;6978  Error Err = ImportDeclContext(D, DC, LexicalDC);6979  auto LocationOrErr = importChecked(Err, D->getLocation());6980  auto NameDeclOrErr = importChecked(Err, D->getDeclName());6981  auto ToTemplateParameters = importChecked(Err, D->getTemplateParameters());6982  auto ConstraintExpr = importChecked(Err, D->getConstraintExpr());6983  if (Err)6984    return std::move(Err);6985 6986  ConceptDecl *To;6987  if (GetImportedOrCreateDecl(To, D, Importer.getToContext(), DC, LocationOrErr,6988                              NameDeclOrErr, ToTemplateParameters,6989                              ConstraintExpr))6990    return To;6991  To->setLexicalDeclContext(LexicalDC);6992  LexicalDC->addDeclInternal(To);6993  return To;6994}6995 6996ExpectedDecl6997ASTNodeImporter::VisitRequiresExprBodyDecl(RequiresExprBodyDecl *D) {6998  DeclContext *DC, *LexicalDC;6999  Error Err = ImportDeclContext(D, DC, LexicalDC);7000  auto RequiresLoc = importChecked(Err, D->getLocation());7001  if (Err)7002    return std::move(Err);7003 7004  RequiresExprBodyDecl *To;7005  if (GetImportedOrCreateDecl(To, D, Importer.getToContext(), DC, RequiresLoc))7006    return To;7007  To->setLexicalDeclContext(LexicalDC);7008  LexicalDC->addDeclInternal(To);7009  return To;7010}7011 7012ExpectedDecl ASTNodeImporter::VisitImplicitConceptSpecializationDecl(7013    ImplicitConceptSpecializationDecl *D) {7014  DeclContext *DC, *LexicalDC;7015  Error Err = ImportDeclContext(D, DC, LexicalDC);7016  auto ToSL = importChecked(Err, D->getLocation());7017  if (Err)7018    return std::move(Err);7019 7020  SmallVector<TemplateArgument, 2> ToArgs(D->getTemplateArguments().size());7021  if (Error Err = ImportTemplateArguments(D->getTemplateArguments(), ToArgs))7022    return std::move(Err);7023 7024  ImplicitConceptSpecializationDecl *To;7025  if (GetImportedOrCreateDecl(To, D, Importer.getToContext(), DC, ToSL, ToArgs))7026    return To;7027  To->setLexicalDeclContext(LexicalDC);7028  LexicalDC->addDeclInternal(To);7029  return To;7030}7031 7032//----------------------------------------------------------------------------7033// Import Statements7034//----------------------------------------------------------------------------7035 7036ExpectedStmt ASTNodeImporter::VisitStmt(Stmt *S) {7037  Importer.FromDiag(S->getBeginLoc(), diag::err_unsupported_ast_node)7038      << S->getStmtClassName();7039  return make_error<ASTImportError>(ASTImportError::UnsupportedConstruct);7040}7041 7042 7043ExpectedStmt ASTNodeImporter::VisitGCCAsmStmt(GCCAsmStmt *S) {7044  if (Importer.returnWithErrorInTest())7045    return make_error<ASTImportError>(ASTImportError::UnsupportedConstruct);7046  SmallVector<IdentifierInfo *, 4> Names;7047  for (unsigned I = 0, E = S->getNumOutputs(); I != E; I++) {7048    IdentifierInfo *ToII = Importer.Import(S->getOutputIdentifier(I));7049    // ToII is nullptr when no symbolic name is given for output operand7050    // see ParseStmtAsm::ParseAsmOperandsOpt7051    Names.push_back(ToII);7052  }7053 7054  for (unsigned I = 0, E = S->getNumInputs(); I != E; I++) {7055    IdentifierInfo *ToII = Importer.Import(S->getInputIdentifier(I));7056    // ToII is nullptr when no symbolic name is given for input operand7057    // see ParseStmtAsm::ParseAsmOperandsOpt7058    Names.push_back(ToII);7059  }7060 7061  SmallVector<Expr *, 4> Clobbers;7062  for (unsigned I = 0, E = S->getNumClobbers(); I != E; I++) {7063    if (auto ClobberOrErr = import(S->getClobberExpr(I)))7064      Clobbers.push_back(*ClobberOrErr);7065    else7066      return ClobberOrErr.takeError();7067 7068  }7069 7070  SmallVector<Expr *, 4> Constraints;7071  for (unsigned I = 0, E = S->getNumOutputs(); I != E; I++) {7072    if (auto OutputOrErr = import(S->getOutputConstraintExpr(I)))7073      Constraints.push_back(*OutputOrErr);7074    else7075      return OutputOrErr.takeError();7076  }7077 7078  for (unsigned I = 0, E = S->getNumInputs(); I != E; I++) {7079    if (auto InputOrErr = import(S->getInputConstraintExpr(I)))7080      Constraints.push_back(*InputOrErr);7081    else7082      return InputOrErr.takeError();7083  }7084 7085  SmallVector<Expr *, 4> Exprs(S->getNumOutputs() + S->getNumInputs() +7086                               S->getNumLabels());7087  if (Error Err = ImportContainerChecked(S->outputs(), Exprs))7088    return std::move(Err);7089 7090  if (Error Err =7091          ImportArrayChecked(S->inputs(), Exprs.begin() + S->getNumOutputs()))7092    return std::move(Err);7093 7094  if (Error Err = ImportArrayChecked(7095          S->labels(), Exprs.begin() + S->getNumOutputs() + S->getNumInputs()))7096    return std::move(Err);7097 7098  ExpectedSLoc AsmLocOrErr = import(S->getAsmLoc());7099  if (!AsmLocOrErr)7100    return AsmLocOrErr.takeError();7101  auto AsmStrOrErr = import(S->getAsmStringExpr());7102  if (!AsmStrOrErr)7103    return AsmStrOrErr.takeError();7104  ExpectedSLoc RParenLocOrErr = import(S->getRParenLoc());7105  if (!RParenLocOrErr)7106    return RParenLocOrErr.takeError();7107 7108  return new (Importer.getToContext()) GCCAsmStmt(7109      Importer.getToContext(),7110      *AsmLocOrErr,7111      S->isSimple(),7112      S->isVolatile(),7113      S->getNumOutputs(),7114      S->getNumInputs(),7115      Names.data(),7116      Constraints.data(),7117      Exprs.data(),7118      *AsmStrOrErr,7119      S->getNumClobbers(),7120      Clobbers.data(),7121      S->getNumLabels(),7122      *RParenLocOrErr);7123}7124 7125ExpectedStmt ASTNodeImporter::VisitDeclStmt(DeclStmt *S) {7126 7127  Error Err = Error::success();7128  auto ToDG = importChecked(Err, S->getDeclGroup());7129  auto ToBeginLoc = importChecked(Err, S->getBeginLoc());7130  auto ToEndLoc = importChecked(Err, S->getEndLoc());7131  if (Err)7132    return std::move(Err);7133  return new (Importer.getToContext()) DeclStmt(ToDG, ToBeginLoc, ToEndLoc);7134}7135 7136ExpectedStmt ASTNodeImporter::VisitNullStmt(NullStmt *S) {7137  ExpectedSLoc ToSemiLocOrErr = import(S->getSemiLoc());7138  if (!ToSemiLocOrErr)7139    return ToSemiLocOrErr.takeError();7140  return new (Importer.getToContext()) NullStmt(7141      *ToSemiLocOrErr, S->hasLeadingEmptyMacro());7142}7143 7144ExpectedStmt ASTNodeImporter::VisitCompoundStmt(CompoundStmt *S) {7145  SmallVector<Stmt *, 8> ToStmts(S->size());7146 7147  if (Error Err = ImportContainerChecked(S->body(), ToStmts))7148    return std::move(Err);7149 7150  ExpectedSLoc ToLBracLocOrErr = import(S->getLBracLoc());7151  if (!ToLBracLocOrErr)7152    return ToLBracLocOrErr.takeError();7153 7154  ExpectedSLoc ToRBracLocOrErr = import(S->getRBracLoc());7155  if (!ToRBracLocOrErr)7156    return ToRBracLocOrErr.takeError();7157 7158  FPOptionsOverride FPO =7159      S->hasStoredFPFeatures() ? S->getStoredFPFeatures() : FPOptionsOverride();7160  return CompoundStmt::Create(Importer.getToContext(), ToStmts, FPO,7161                              *ToLBracLocOrErr, *ToRBracLocOrErr);7162}7163 7164ExpectedStmt ASTNodeImporter::VisitCaseStmt(CaseStmt *S) {7165 7166  Error Err = Error::success();7167  auto ToLHS = importChecked(Err, S->getLHS());7168  auto ToRHS = importChecked(Err, S->getRHS());7169  auto ToSubStmt = importChecked(Err, S->getSubStmt());7170  auto ToCaseLoc = importChecked(Err, S->getCaseLoc());7171  auto ToEllipsisLoc = importChecked(Err, S->getEllipsisLoc());7172  auto ToColonLoc = importChecked(Err, S->getColonLoc());7173  if (Err)7174    return std::move(Err);7175 7176  auto *ToStmt = CaseStmt::Create(Importer.getToContext(), ToLHS, ToRHS,7177                                  ToCaseLoc, ToEllipsisLoc, ToColonLoc);7178  ToStmt->setSubStmt(ToSubStmt);7179 7180  return ToStmt;7181}7182 7183ExpectedStmt ASTNodeImporter::VisitDefaultStmt(DefaultStmt *S) {7184 7185  Error Err = Error::success();7186  auto ToDefaultLoc = importChecked(Err, S->getDefaultLoc());7187  auto ToColonLoc = importChecked(Err, S->getColonLoc());7188  auto ToSubStmt = importChecked(Err, S->getSubStmt());7189  if (Err)7190    return std::move(Err);7191 7192  return new (Importer.getToContext()) DefaultStmt(7193    ToDefaultLoc, ToColonLoc, ToSubStmt);7194}7195 7196ExpectedStmt ASTNodeImporter::VisitLabelStmt(LabelStmt *S) {7197 7198  Error Err = Error::success();7199  auto ToIdentLoc = importChecked(Err, S->getIdentLoc());7200  auto ToLabelDecl = importChecked(Err, S->getDecl());7201  auto ToSubStmt = importChecked(Err, S->getSubStmt());7202  if (Err)7203    return std::move(Err);7204 7205  return new (Importer.getToContext()) LabelStmt(7206      ToIdentLoc, ToLabelDecl, ToSubStmt);7207}7208 7209ExpectedStmt ASTNodeImporter::VisitAttributedStmt(AttributedStmt *S) {7210  ExpectedSLoc ToAttrLocOrErr = import(S->getAttrLoc());7211  if (!ToAttrLocOrErr)7212    return ToAttrLocOrErr.takeError();7213  ArrayRef<const Attr*> FromAttrs(S->getAttrs());7214  SmallVector<const Attr *, 1> ToAttrs(FromAttrs.size());7215  if (Error Err = ImportContainerChecked(FromAttrs, ToAttrs))7216    return std::move(Err);7217  ExpectedStmt ToSubStmtOrErr = import(S->getSubStmt());7218  if (!ToSubStmtOrErr)7219    return ToSubStmtOrErr.takeError();7220 7221  return AttributedStmt::Create(7222      Importer.getToContext(), *ToAttrLocOrErr, ToAttrs, *ToSubStmtOrErr);7223}7224 7225ExpectedStmt ASTNodeImporter::VisitIfStmt(IfStmt *S) {7226 7227  Error Err = Error::success();7228  auto ToIfLoc = importChecked(Err, S->getIfLoc());7229  auto ToInit = importChecked(Err, S->getInit());7230  auto ToConditionVariable = importChecked(Err, S->getConditionVariable());7231  auto ToCond = importChecked(Err, S->getCond());7232  auto ToLParenLoc = importChecked(Err, S->getLParenLoc());7233  auto ToRParenLoc = importChecked(Err, S->getRParenLoc());7234  auto ToThen = importChecked(Err, S->getThen());7235  auto ToElseLoc = importChecked(Err, S->getElseLoc());7236  auto ToElse = importChecked(Err, S->getElse());7237  if (Err)7238    return std::move(Err);7239 7240  return IfStmt::Create(Importer.getToContext(), ToIfLoc, S->getStatementKind(),7241                        ToInit, ToConditionVariable, ToCond, ToLParenLoc,7242                        ToRParenLoc, ToThen, ToElseLoc, ToElse);7243}7244 7245ExpectedStmt ASTNodeImporter::VisitSwitchStmt(SwitchStmt *S) {7246 7247  Error Err = Error::success();7248  auto ToInit = importChecked(Err, S->getInit());7249  auto ToConditionVariable = importChecked(Err, S->getConditionVariable());7250  auto ToCond = importChecked(Err, S->getCond());7251  auto ToLParenLoc = importChecked(Err, S->getLParenLoc());7252  auto ToRParenLoc = importChecked(Err, S->getRParenLoc());7253  auto ToBody = importChecked(Err, S->getBody());7254  auto ToSwitchLoc = importChecked(Err, S->getSwitchLoc());7255  if (Err)7256    return std::move(Err);7257 7258  auto *ToStmt =7259      SwitchStmt::Create(Importer.getToContext(), ToInit, ToConditionVariable,7260                         ToCond, ToLParenLoc, ToRParenLoc);7261  ToStmt->setBody(ToBody);7262  ToStmt->setSwitchLoc(ToSwitchLoc);7263 7264  // Now we have to re-chain the cases.7265  SwitchCase *LastChainedSwitchCase = nullptr;7266  for (SwitchCase *SC = S->getSwitchCaseList(); SC != nullptr;7267       SC = SC->getNextSwitchCase()) {7268    Expected<SwitchCase *> ToSCOrErr = import(SC);7269    if (!ToSCOrErr)7270      return ToSCOrErr.takeError();7271    if (LastChainedSwitchCase)7272      LastChainedSwitchCase->setNextSwitchCase(*ToSCOrErr);7273    else7274      ToStmt->setSwitchCaseList(*ToSCOrErr);7275    LastChainedSwitchCase = *ToSCOrErr;7276  }7277 7278  return ToStmt;7279}7280 7281ExpectedStmt ASTNodeImporter::VisitWhileStmt(WhileStmt *S) {7282 7283  Error Err = Error::success();7284  auto ToConditionVariable = importChecked(Err, S->getConditionVariable());7285  auto ToCond = importChecked(Err, S->getCond());7286  auto ToBody = importChecked(Err, S->getBody());7287  auto ToWhileLoc = importChecked(Err, S->getWhileLoc());7288  auto ToLParenLoc = importChecked(Err, S->getLParenLoc());7289  auto ToRParenLoc = importChecked(Err, S->getRParenLoc());7290  if (Err)7291    return std::move(Err);7292 7293  return WhileStmt::Create(Importer.getToContext(), ToConditionVariable, ToCond,7294                           ToBody, ToWhileLoc, ToLParenLoc, ToRParenLoc);7295}7296 7297ExpectedStmt ASTNodeImporter::VisitDoStmt(DoStmt *S) {7298 7299  Error Err = Error::success();7300  auto ToBody = importChecked(Err, S->getBody());7301  auto ToCond = importChecked(Err, S->getCond());7302  auto ToDoLoc = importChecked(Err, S->getDoLoc());7303  auto ToWhileLoc = importChecked(Err, S->getWhileLoc());7304  auto ToRParenLoc = importChecked(Err, S->getRParenLoc());7305  if (Err)7306    return std::move(Err);7307 7308  return new (Importer.getToContext()) DoStmt(7309      ToBody, ToCond, ToDoLoc, ToWhileLoc, ToRParenLoc);7310}7311 7312ExpectedStmt ASTNodeImporter::VisitForStmt(ForStmt *S) {7313 7314  Error Err = Error::success();7315  auto ToInit = importChecked(Err, S->getInit());7316  auto ToCond = importChecked(Err, S->getCond());7317  auto ToConditionVariable = importChecked(Err, S->getConditionVariable());7318  auto ToInc = importChecked(Err, S->getInc());7319  auto ToBody = importChecked(Err, S->getBody());7320  auto ToForLoc = importChecked(Err, S->getForLoc());7321  auto ToLParenLoc = importChecked(Err, S->getLParenLoc());7322  auto ToRParenLoc = importChecked(Err, S->getRParenLoc());7323  if (Err)7324    return std::move(Err);7325 7326  return new (Importer.getToContext()) ForStmt(7327      Importer.getToContext(),7328      ToInit, ToCond, ToConditionVariable, ToInc, ToBody, ToForLoc, ToLParenLoc,7329      ToRParenLoc);7330}7331 7332ExpectedStmt ASTNodeImporter::VisitGotoStmt(GotoStmt *S) {7333 7334  Error Err = Error::success();7335  auto ToLabel = importChecked(Err, S->getLabel());7336  auto ToGotoLoc = importChecked(Err, S->getGotoLoc());7337  auto ToLabelLoc = importChecked(Err, S->getLabelLoc());7338  if (Err)7339    return std::move(Err);7340 7341  return new (Importer.getToContext()) GotoStmt(7342      ToLabel, ToGotoLoc, ToLabelLoc);7343}7344 7345ExpectedStmt ASTNodeImporter::VisitIndirectGotoStmt(IndirectGotoStmt *S) {7346 7347  Error Err = Error::success();7348  auto ToGotoLoc = importChecked(Err, S->getGotoLoc());7349  auto ToStarLoc = importChecked(Err, S->getStarLoc());7350  auto ToTarget = importChecked(Err, S->getTarget());7351  if (Err)7352    return std::move(Err);7353 7354  return new (Importer.getToContext()) IndirectGotoStmt(7355      ToGotoLoc, ToStarLoc, ToTarget);7356}7357 7358template <typename StmtClass>7359static ExpectedStmt ImportLoopControlStmt(ASTNodeImporter &NodeImporter,7360                                          ASTImporter &Importer, StmtClass *S) {7361  Error Err = Error::success();7362  auto ToLoc = NodeImporter.importChecked(Err, S->getKwLoc());7363  auto ToLabelLoc = S->hasLabelTarget()7364                        ? NodeImporter.importChecked(Err, S->getLabelLoc())7365                        : SourceLocation();7366  auto ToDecl = S->hasLabelTarget()7367                    ? NodeImporter.importChecked(Err, S->getLabelDecl())7368                    : nullptr;7369  if (Err)7370    return std::move(Err);7371  return new (Importer.getToContext()) StmtClass(ToLoc, ToLabelLoc, ToDecl);7372}7373 7374ExpectedStmt ASTNodeImporter::VisitContinueStmt(ContinueStmt *S) {7375  return ImportLoopControlStmt(*this, Importer, S);7376}7377 7378ExpectedStmt ASTNodeImporter::VisitBreakStmt(BreakStmt *S) {7379  return ImportLoopControlStmt(*this, Importer, S);7380}7381 7382ExpectedStmt ASTNodeImporter::VisitReturnStmt(ReturnStmt *S) {7383 7384  Error Err = Error::success();7385  auto ToReturnLoc = importChecked(Err, S->getReturnLoc());7386  auto ToRetValue = importChecked(Err, S->getRetValue());7387  auto ToNRVOCandidate = importChecked(Err, S->getNRVOCandidate());7388  if (Err)7389    return std::move(Err);7390 7391  return ReturnStmt::Create(Importer.getToContext(), ToReturnLoc, ToRetValue,7392                            ToNRVOCandidate);7393}7394 7395ExpectedStmt ASTNodeImporter::VisitCXXCatchStmt(CXXCatchStmt *S) {7396 7397  Error Err = Error::success();7398  auto ToCatchLoc = importChecked(Err, S->getCatchLoc());7399  auto ToExceptionDecl = importChecked(Err, S->getExceptionDecl());7400  auto ToHandlerBlock = importChecked(Err, S->getHandlerBlock());7401  if (Err)7402    return std::move(Err);7403 7404  return new (Importer.getToContext()) CXXCatchStmt (7405      ToCatchLoc, ToExceptionDecl, ToHandlerBlock);7406}7407 7408ExpectedStmt ASTNodeImporter::VisitCXXTryStmt(CXXTryStmt *S) {7409  ExpectedSLoc ToTryLocOrErr = import(S->getTryLoc());7410  if (!ToTryLocOrErr)7411    return ToTryLocOrErr.takeError();7412 7413  ExpectedStmt ToTryBlockOrErr = import(S->getTryBlock());7414  if (!ToTryBlockOrErr)7415    return ToTryBlockOrErr.takeError();7416 7417  SmallVector<Stmt *, 1> ToHandlers(S->getNumHandlers());7418  for (unsigned HI = 0, HE = S->getNumHandlers(); HI != HE; ++HI) {7419    CXXCatchStmt *FromHandler = S->getHandler(HI);7420    if (auto ToHandlerOrErr = import(FromHandler))7421      ToHandlers[HI] = *ToHandlerOrErr;7422    else7423      return ToHandlerOrErr.takeError();7424  }7425 7426  return CXXTryStmt::Create(Importer.getToContext(), *ToTryLocOrErr,7427                            cast<CompoundStmt>(*ToTryBlockOrErr), ToHandlers);7428}7429 7430ExpectedStmt ASTNodeImporter::VisitCXXForRangeStmt(CXXForRangeStmt *S) {7431 7432  Error Err = Error::success();7433  auto ToInit = importChecked(Err, S->getInit());7434  auto ToRangeStmt = importChecked(Err, S->getRangeStmt());7435  auto ToBeginStmt = importChecked(Err, S->getBeginStmt());7436  auto ToEndStmt = importChecked(Err, S->getEndStmt());7437  auto ToCond = importChecked(Err, S->getCond());7438  auto ToInc = importChecked(Err, S->getInc());7439  auto ToLoopVarStmt = importChecked(Err, S->getLoopVarStmt());7440  auto ToBody = importChecked(Err, S->getBody());7441  auto ToForLoc = importChecked(Err, S->getForLoc());7442  auto ToCoawaitLoc = importChecked(Err, S->getCoawaitLoc());7443  auto ToColonLoc = importChecked(Err, S->getColonLoc());7444  auto ToRParenLoc = importChecked(Err, S->getRParenLoc());7445  if (Err)7446    return std::move(Err);7447 7448  return new (Importer.getToContext()) CXXForRangeStmt(7449      ToInit, ToRangeStmt, ToBeginStmt, ToEndStmt, ToCond, ToInc, ToLoopVarStmt,7450      ToBody, ToForLoc, ToCoawaitLoc, ToColonLoc, ToRParenLoc);7451}7452 7453ExpectedStmt7454ASTNodeImporter::VisitObjCForCollectionStmt(ObjCForCollectionStmt *S) {7455  Error Err = Error::success();7456  auto ToElement = importChecked(Err, S->getElement());7457  auto ToCollection = importChecked(Err, S->getCollection());7458  auto ToBody = importChecked(Err, S->getBody());7459  auto ToForLoc = importChecked(Err, S->getForLoc());7460  auto ToRParenLoc = importChecked(Err, S->getRParenLoc());7461  if (Err)7462    return std::move(Err);7463 7464  return new (Importer.getToContext()) ObjCForCollectionStmt(ToElement,7465                                                             ToCollection,7466                                                             ToBody,7467                                                             ToForLoc,7468                                                             ToRParenLoc);7469}7470 7471ExpectedStmt ASTNodeImporter::VisitObjCAtCatchStmt(ObjCAtCatchStmt *S) {7472 7473  Error Err = Error::success();7474  auto ToAtCatchLoc = importChecked(Err, S->getAtCatchLoc());7475  auto ToRParenLoc = importChecked(Err, S->getRParenLoc());7476  auto ToCatchParamDecl = importChecked(Err, S->getCatchParamDecl());7477  auto ToCatchBody = importChecked(Err, S->getCatchBody());7478  if (Err)7479    return std::move(Err);7480 7481  return new (Importer.getToContext()) ObjCAtCatchStmt (7482      ToAtCatchLoc, ToRParenLoc, ToCatchParamDecl, ToCatchBody);7483}7484 7485ExpectedStmt ASTNodeImporter::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {7486  ExpectedSLoc ToAtFinallyLocOrErr = import(S->getAtFinallyLoc());7487  if (!ToAtFinallyLocOrErr)7488    return ToAtFinallyLocOrErr.takeError();7489  ExpectedStmt ToAtFinallyStmtOrErr = import(S->getFinallyBody());7490  if (!ToAtFinallyStmtOrErr)7491    return ToAtFinallyStmtOrErr.takeError();7492  return new (Importer.getToContext()) ObjCAtFinallyStmt(*ToAtFinallyLocOrErr,7493                                                         *ToAtFinallyStmtOrErr);7494}7495 7496ExpectedStmt ASTNodeImporter::VisitObjCAtTryStmt(ObjCAtTryStmt *S) {7497 7498  Error Err = Error::success();7499  auto ToAtTryLoc = importChecked(Err, S->getAtTryLoc());7500  auto ToTryBody = importChecked(Err, S->getTryBody());7501  auto ToFinallyStmt = importChecked(Err, S->getFinallyStmt());7502  if (Err)7503    return std::move(Err);7504 7505  SmallVector<Stmt *, 1> ToCatchStmts(S->getNumCatchStmts());7506  for (unsigned CI = 0, CE = S->getNumCatchStmts(); CI != CE; ++CI) {7507    ObjCAtCatchStmt *FromCatchStmt = S->getCatchStmt(CI);7508    if (ExpectedStmt ToCatchStmtOrErr = import(FromCatchStmt))7509      ToCatchStmts[CI] = *ToCatchStmtOrErr;7510    else7511      return ToCatchStmtOrErr.takeError();7512  }7513 7514  return ObjCAtTryStmt::Create(Importer.getToContext(),7515                               ToAtTryLoc, ToTryBody,7516                               ToCatchStmts.begin(), ToCatchStmts.size(),7517                               ToFinallyStmt);7518}7519 7520ExpectedStmt7521ASTNodeImporter::VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *S) {7522 7523  Error Err = Error::success();7524  auto ToAtSynchronizedLoc = importChecked(Err, S->getAtSynchronizedLoc());7525  auto ToSynchExpr = importChecked(Err, S->getSynchExpr());7526  auto ToSynchBody = importChecked(Err, S->getSynchBody());7527  if (Err)7528    return std::move(Err);7529 7530  return new (Importer.getToContext()) ObjCAtSynchronizedStmt(7531    ToAtSynchronizedLoc, ToSynchExpr, ToSynchBody);7532}7533 7534ExpectedStmt ASTNodeImporter::VisitObjCAtThrowStmt(ObjCAtThrowStmt *S) {7535  ExpectedSLoc ToThrowLocOrErr = import(S->getThrowLoc());7536  if (!ToThrowLocOrErr)7537    return ToThrowLocOrErr.takeError();7538  ExpectedExpr ToThrowExprOrErr = import(S->getThrowExpr());7539  if (!ToThrowExprOrErr)7540    return ToThrowExprOrErr.takeError();7541  return new (Importer.getToContext()) ObjCAtThrowStmt(7542      *ToThrowLocOrErr, *ToThrowExprOrErr);7543}7544 7545ExpectedStmt ASTNodeImporter::VisitObjCAutoreleasePoolStmt(7546    ObjCAutoreleasePoolStmt *S) {7547  ExpectedSLoc ToAtLocOrErr = import(S->getAtLoc());7548  if (!ToAtLocOrErr)7549    return ToAtLocOrErr.takeError();7550  ExpectedStmt ToSubStmtOrErr = import(S->getSubStmt());7551  if (!ToSubStmtOrErr)7552    return ToSubStmtOrErr.takeError();7553  return new (Importer.getToContext()) ObjCAutoreleasePoolStmt(*ToAtLocOrErr,7554                                                               *ToSubStmtOrErr);7555}7556 7557//----------------------------------------------------------------------------7558// Import Expressions7559//----------------------------------------------------------------------------7560ExpectedStmt ASTNodeImporter::VisitExpr(Expr *E) {7561  Importer.FromDiag(E->getBeginLoc(), diag::err_unsupported_ast_node)7562      << E->getStmtClassName();7563  return make_error<ASTImportError>(ASTImportError::UnsupportedConstruct);7564}7565 7566ExpectedStmt ASTNodeImporter::VisitSourceLocExpr(SourceLocExpr *E) {7567  Error Err = Error::success();7568  auto ToType = importChecked(Err, E->getType());7569  auto BLoc = importChecked(Err, E->getBeginLoc());7570  auto RParenLoc = importChecked(Err, E->getEndLoc());7571  if (Err)7572    return std::move(Err);7573  auto ParentContextOrErr = Importer.ImportContext(E->getParentContext());7574  if (!ParentContextOrErr)7575    return ParentContextOrErr.takeError();7576 7577  return new (Importer.getToContext())7578      SourceLocExpr(Importer.getToContext(), E->getIdentKind(), ToType, BLoc,7579                    RParenLoc, *ParentContextOrErr);7580}7581 7582ExpectedStmt ASTNodeImporter::VisitVAArgExpr(VAArgExpr *E) {7583 7584  Error Err = Error::success();7585  auto ToBuiltinLoc = importChecked(Err, E->getBuiltinLoc());7586  auto ToSubExpr = importChecked(Err, E->getSubExpr());7587  auto ToWrittenTypeInfo = importChecked(Err, E->getWrittenTypeInfo());7588  auto ToRParenLoc = importChecked(Err, E->getRParenLoc());7589  auto ToType = importChecked(Err, E->getType());7590  if (Err)7591    return std::move(Err);7592 7593  return new (Importer.getToContext()) VAArgExpr(7594      ToBuiltinLoc, ToSubExpr, ToWrittenTypeInfo, ToRParenLoc, ToType,7595      E->isMicrosoftABI());7596}7597 7598ExpectedStmt ASTNodeImporter::VisitChooseExpr(ChooseExpr *E) {7599 7600  Error Err = Error::success();7601  auto ToCond = importChecked(Err, E->getCond());7602  auto ToLHS = importChecked(Err, E->getLHS());7603  auto ToRHS = importChecked(Err, E->getRHS());7604  auto ToBuiltinLoc = importChecked(Err, E->getBuiltinLoc());7605  auto ToRParenLoc = importChecked(Err, E->getRParenLoc());7606  auto ToType = importChecked(Err, E->getType());7607  if (Err)7608    return std::move(Err);7609 7610  ExprValueKind VK = E->getValueKind();7611  ExprObjectKind OK = E->getObjectKind();7612 7613  // The value of CondIsTrue only matters if the value is not7614  // condition-dependent.7615  bool CondIsTrue = !E->isConditionDependent() && E->isConditionTrue();7616 7617  return new (Importer.getToContext())7618      ChooseExpr(ToBuiltinLoc, ToCond, ToLHS, ToRHS, ToType, VK, OK,7619                 ToRParenLoc, CondIsTrue);7620}7621 7622ExpectedStmt ASTNodeImporter::VisitConvertVectorExpr(ConvertVectorExpr *E) {7623  Error Err = Error::success();7624  auto *ToSrcExpr = importChecked(Err, E->getSrcExpr());7625  auto ToRParenLoc = importChecked(Err, E->getRParenLoc());7626  auto ToBuiltinLoc = importChecked(Err, E->getBuiltinLoc());7627  auto ToType = importChecked(Err, E->getType());7628  auto *ToTSI = importChecked(Err, E->getTypeSourceInfo());7629  if (Err)7630    return std::move(Err);7631 7632  return ConvertVectorExpr::Create(7633      Importer.getToContext(), ToSrcExpr, ToTSI, ToType, E->getValueKind(),7634      E->getObjectKind(), ToBuiltinLoc, ToRParenLoc,7635      E->getStoredFPFeaturesOrDefault());7636}7637 7638ExpectedStmt ASTNodeImporter::VisitShuffleVectorExpr(ShuffleVectorExpr *E) {7639  Error Err = Error::success();7640  auto ToRParenLoc = importChecked(Err, E->getRParenLoc());7641  auto ToBeginLoc = importChecked(Err, E->getBeginLoc());7642  auto ToType = importChecked(Err, E->getType());7643  const unsigned NumSubExprs = E->getNumSubExprs();7644 7645  llvm::SmallVector<Expr *, 8> ToSubExprs;7646  ArrayRef<Expr *> FromSubExprs(E->getSubExprs(), NumSubExprs);7647  ToSubExprs.resize(NumSubExprs);7648 7649  if ((Err = ImportContainerChecked(FromSubExprs, ToSubExprs)))7650    return std::move(Err);7651 7652  return new (Importer.getToContext()) ShuffleVectorExpr(7653      Importer.getToContext(), ToSubExprs, ToType, ToBeginLoc, ToRParenLoc);7654}7655 7656ExpectedStmt ASTNodeImporter::VisitGNUNullExpr(GNUNullExpr *E) {7657  ExpectedType TypeOrErr = import(E->getType());7658  if (!TypeOrErr)7659    return TypeOrErr.takeError();7660 7661  ExpectedSLoc BeginLocOrErr = import(E->getBeginLoc());7662  if (!BeginLocOrErr)7663    return BeginLocOrErr.takeError();7664 7665  return new (Importer.getToContext()) GNUNullExpr(*TypeOrErr, *BeginLocOrErr);7666}7667 7668ExpectedStmt7669ASTNodeImporter::VisitGenericSelectionExpr(GenericSelectionExpr *E) {7670  Error Err = Error::success();7671  auto ToGenericLoc = importChecked(Err, E->getGenericLoc());7672  Expr *ToControllingExpr = nullptr;7673  TypeSourceInfo *ToControllingType = nullptr;7674  if (E->isExprPredicate())7675    ToControllingExpr = importChecked(Err, E->getControllingExpr());7676  else7677    ToControllingType = importChecked(Err, E->getControllingType());7678  assert((ToControllingExpr || ToControllingType) &&7679         "Either the controlling expr or type must be nonnull");7680  auto ToDefaultLoc = importChecked(Err, E->getDefaultLoc());7681  auto ToRParenLoc = importChecked(Err, E->getRParenLoc());7682  if (Err)7683    return std::move(Err);7684 7685  ArrayRef<const TypeSourceInfo *> FromAssocTypes(E->getAssocTypeSourceInfos());7686  SmallVector<TypeSourceInfo *, 1> ToAssocTypes(FromAssocTypes.size());7687  if (Error Err = ImportContainerChecked(FromAssocTypes, ToAssocTypes))7688    return std::move(Err);7689 7690  ArrayRef<const Expr *> FromAssocExprs(E->getAssocExprs());7691  SmallVector<Expr *, 1> ToAssocExprs(FromAssocExprs.size());7692  if (Error Err = ImportContainerChecked(FromAssocExprs, ToAssocExprs))7693    return std::move(Err);7694 7695  const ASTContext &ToCtx = Importer.getToContext();7696  if (E->isResultDependent()) {7697    if (ToControllingExpr) {7698      return GenericSelectionExpr::Create(7699          ToCtx, ToGenericLoc, ToControllingExpr, ArrayRef(ToAssocTypes),7700          ArrayRef(ToAssocExprs), ToDefaultLoc, ToRParenLoc,7701          E->containsUnexpandedParameterPack());7702    }7703    return GenericSelectionExpr::Create(7704        ToCtx, ToGenericLoc, ToControllingType, ArrayRef(ToAssocTypes),7705        ArrayRef(ToAssocExprs), ToDefaultLoc, ToRParenLoc,7706        E->containsUnexpandedParameterPack());7707  }7708 7709  if (ToControllingExpr) {7710    return GenericSelectionExpr::Create(7711        ToCtx, ToGenericLoc, ToControllingExpr, ArrayRef(ToAssocTypes),7712        ArrayRef(ToAssocExprs), ToDefaultLoc, ToRParenLoc,7713        E->containsUnexpandedParameterPack(), E->getResultIndex());7714  }7715  return GenericSelectionExpr::Create(7716      ToCtx, ToGenericLoc, ToControllingType, ArrayRef(ToAssocTypes),7717      ArrayRef(ToAssocExprs), ToDefaultLoc, ToRParenLoc,7718      E->containsUnexpandedParameterPack(), E->getResultIndex());7719}7720 7721ExpectedStmt ASTNodeImporter::VisitPredefinedExpr(PredefinedExpr *E) {7722 7723  Error Err = Error::success();7724  auto ToBeginLoc = importChecked(Err, E->getBeginLoc());7725  auto ToType = importChecked(Err, E->getType());7726  auto ToFunctionName = importChecked(Err, E->getFunctionName());7727  if (Err)7728    return std::move(Err);7729 7730  return PredefinedExpr::Create(Importer.getToContext(), ToBeginLoc, ToType,7731                                E->getIdentKind(), E->isTransparent(),7732                                ToFunctionName);7733}7734 7735ExpectedStmt ASTNodeImporter::VisitDeclRefExpr(DeclRefExpr *E) {7736 7737  Error Err = Error::success();7738  auto ToQualifierLoc = importChecked(Err, E->getQualifierLoc());7739  auto ToTemplateKeywordLoc = importChecked(Err, E->getTemplateKeywordLoc());7740  auto ToDecl = importChecked(Err, E->getDecl());7741  auto ToLocation = importChecked(Err, E->getLocation());7742  auto ToType = importChecked(Err, E->getType());7743  if (Err)7744    return std::move(Err);7745 7746  NamedDecl *ToFoundD = nullptr;7747  if (E->getDecl() != E->getFoundDecl()) {7748    auto FoundDOrErr = import(E->getFoundDecl());7749    if (!FoundDOrErr)7750      return FoundDOrErr.takeError();7751    ToFoundD = *FoundDOrErr;7752  }7753 7754  TemplateArgumentListInfo ToTAInfo;7755  TemplateArgumentListInfo *ToResInfo = nullptr;7756  if (E->hasExplicitTemplateArgs()) {7757    if (Error Err =7758            ImportTemplateArgumentListInfo(E->getLAngleLoc(), E->getRAngleLoc(),7759                                           E->template_arguments(), ToTAInfo))7760      return std::move(Err);7761    ToResInfo = &ToTAInfo;7762  }7763 7764  auto *ToE = DeclRefExpr::Create(7765      Importer.getToContext(), ToQualifierLoc, ToTemplateKeywordLoc, ToDecl,7766      E->refersToEnclosingVariableOrCapture(), ToLocation, ToType,7767      E->getValueKind(), ToFoundD, ToResInfo, E->isNonOdrUse());7768  if (E->hadMultipleCandidates())7769    ToE->setHadMultipleCandidates(true);7770  ToE->setIsImmediateEscalating(E->isImmediateEscalating());7771  return ToE;7772}7773 7774ExpectedStmt ASTNodeImporter::VisitImplicitValueInitExpr(ImplicitValueInitExpr *E) {7775  ExpectedType TypeOrErr = import(E->getType());7776  if (!TypeOrErr)7777    return TypeOrErr.takeError();7778 7779  return new (Importer.getToContext()) ImplicitValueInitExpr(*TypeOrErr);7780}7781 7782ExpectedStmt ASTNodeImporter::VisitDesignatedInitExpr(DesignatedInitExpr *E) {7783  ExpectedExpr ToInitOrErr = import(E->getInit());7784  if (!ToInitOrErr)7785    return ToInitOrErr.takeError();7786 7787  ExpectedSLoc ToEqualOrColonLocOrErr = import(E->getEqualOrColonLoc());7788  if (!ToEqualOrColonLocOrErr)7789    return ToEqualOrColonLocOrErr.takeError();7790 7791  SmallVector<Expr *, 4> ToIndexExprs(E->getNumSubExprs() - 1);7792  // List elements from the second, the first is Init itself7793  for (unsigned I = 1, N = E->getNumSubExprs(); I < N; I++) {7794    if (ExpectedExpr ToArgOrErr = import(E->getSubExpr(I)))7795      ToIndexExprs[I - 1] = *ToArgOrErr;7796    else7797      return ToArgOrErr.takeError();7798  }7799 7800  SmallVector<Designator, 4> ToDesignators(E->size());7801  if (Error Err = ImportContainerChecked(E->designators(), ToDesignators))7802    return std::move(Err);7803 7804  return DesignatedInitExpr::Create(7805        Importer.getToContext(), ToDesignators,7806        ToIndexExprs, *ToEqualOrColonLocOrErr,7807        E->usesGNUSyntax(), *ToInitOrErr);7808}7809 7810ExpectedStmt7811ASTNodeImporter::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E) {7812  ExpectedType ToTypeOrErr = import(E->getType());7813  if (!ToTypeOrErr)7814    return ToTypeOrErr.takeError();7815 7816  ExpectedSLoc ToLocationOrErr = import(E->getLocation());7817  if (!ToLocationOrErr)7818    return ToLocationOrErr.takeError();7819 7820  return new (Importer.getToContext()) CXXNullPtrLiteralExpr(7821      *ToTypeOrErr, *ToLocationOrErr);7822}7823 7824ExpectedStmt ASTNodeImporter::VisitIntegerLiteral(IntegerLiteral *E) {7825  ExpectedType ToTypeOrErr = import(E->getType());7826  if (!ToTypeOrErr)7827    return ToTypeOrErr.takeError();7828 7829  ExpectedSLoc ToLocationOrErr = import(E->getLocation());7830  if (!ToLocationOrErr)7831    return ToLocationOrErr.takeError();7832 7833  return IntegerLiteral::Create(7834      Importer.getToContext(), E->getValue(), *ToTypeOrErr, *ToLocationOrErr);7835}7836 7837 7838ExpectedStmt ASTNodeImporter::VisitFloatingLiteral(FloatingLiteral *E) {7839  ExpectedType ToTypeOrErr = import(E->getType());7840  if (!ToTypeOrErr)7841    return ToTypeOrErr.takeError();7842 7843  ExpectedSLoc ToLocationOrErr = import(E->getLocation());7844  if (!ToLocationOrErr)7845    return ToLocationOrErr.takeError();7846 7847  return FloatingLiteral::Create(7848      Importer.getToContext(), E->getValue(), E->isExact(),7849      *ToTypeOrErr, *ToLocationOrErr);7850}7851 7852ExpectedStmt ASTNodeImporter::VisitImaginaryLiteral(ImaginaryLiteral *E) {7853  auto ToTypeOrErr = import(E->getType());7854  if (!ToTypeOrErr)7855    return ToTypeOrErr.takeError();7856 7857  ExpectedExpr ToSubExprOrErr = import(E->getSubExpr());7858  if (!ToSubExprOrErr)7859    return ToSubExprOrErr.takeError();7860 7861  return new (Importer.getToContext()) ImaginaryLiteral(7862      *ToSubExprOrErr, *ToTypeOrErr);7863}7864 7865ExpectedStmt ASTNodeImporter::VisitFixedPointLiteral(FixedPointLiteral *E) {7866  auto ToTypeOrErr = import(E->getType());7867  if (!ToTypeOrErr)7868    return ToTypeOrErr.takeError();7869 7870  ExpectedSLoc ToLocationOrErr = import(E->getLocation());7871  if (!ToLocationOrErr)7872    return ToLocationOrErr.takeError();7873 7874  return new (Importer.getToContext()) FixedPointLiteral(7875      Importer.getToContext(), E->getValue(), *ToTypeOrErr, *ToLocationOrErr,7876      Importer.getToContext().getFixedPointScale(*ToTypeOrErr));7877}7878 7879ExpectedStmt ASTNodeImporter::VisitCharacterLiteral(CharacterLiteral *E) {7880  ExpectedType ToTypeOrErr = import(E->getType());7881  if (!ToTypeOrErr)7882    return ToTypeOrErr.takeError();7883 7884  ExpectedSLoc ToLocationOrErr = import(E->getLocation());7885  if (!ToLocationOrErr)7886    return ToLocationOrErr.takeError();7887 7888  return new (Importer.getToContext()) CharacterLiteral(7889      E->getValue(), E->getKind(), *ToTypeOrErr, *ToLocationOrErr);7890}7891 7892ExpectedStmt ASTNodeImporter::VisitStringLiteral(StringLiteral *E) {7893  ExpectedType ToTypeOrErr = import(E->getType());7894  if (!ToTypeOrErr)7895    return ToTypeOrErr.takeError();7896 7897  SmallVector<SourceLocation, 4> ToLocations(E->getNumConcatenated());7898  if (Error Err = ImportArrayChecked(7899      E->tokloc_begin(), E->tokloc_end(), ToLocations.begin()))7900    return std::move(Err);7901 7902  return StringLiteral::Create(Importer.getToContext(), E->getBytes(),7903                               E->getKind(), E->isPascal(), *ToTypeOrErr,7904                               ToLocations);7905}7906 7907ExpectedStmt ASTNodeImporter::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {7908 7909  Error Err = Error::success();7910  auto ToLParenLoc = importChecked(Err, E->getLParenLoc());7911  auto ToTypeSourceInfo = importChecked(Err, E->getTypeSourceInfo());7912  auto ToType = importChecked(Err, E->getType());7913  auto ToInitializer = importChecked(Err, E->getInitializer());7914  if (Err)7915    return std::move(Err);7916 7917  return new (Importer.getToContext()) CompoundLiteralExpr(7918        ToLParenLoc, ToTypeSourceInfo, ToType, E->getValueKind(),7919        ToInitializer, E->isFileScope());7920}7921 7922ExpectedStmt ASTNodeImporter::VisitAtomicExpr(AtomicExpr *E) {7923 7924  Error Err = Error::success();7925  auto ToBuiltinLoc = importChecked(Err, E->getBuiltinLoc());7926  auto ToType = importChecked(Err, E->getType());7927  auto ToRParenLoc = importChecked(Err, E->getRParenLoc());7928  if (Err)7929    return std::move(Err);7930 7931  SmallVector<Expr *, 6> ToExprs(E->getNumSubExprs());7932  if (Error Err = ImportArrayChecked(7933      E->getSubExprs(), E->getSubExprs() + E->getNumSubExprs(),7934      ToExprs.begin()))7935    return std::move(Err);7936 7937  return new (Importer.getToContext()) AtomicExpr(7938 7939      ToBuiltinLoc, ToExprs, ToType, E->getOp(), ToRParenLoc);7940}7941 7942ExpectedStmt ASTNodeImporter::VisitAddrLabelExpr(AddrLabelExpr *E) {7943  Error Err = Error::success();7944  auto ToAmpAmpLoc = importChecked(Err, E->getAmpAmpLoc());7945  auto ToLabelLoc = importChecked(Err, E->getLabelLoc());7946  auto ToLabel = importChecked(Err, E->getLabel());7947  auto ToType = importChecked(Err, E->getType());7948  if (Err)7949    return std::move(Err);7950 7951  return new (Importer.getToContext()) AddrLabelExpr(7952      ToAmpAmpLoc, ToLabelLoc, ToLabel, ToType);7953}7954ExpectedStmt ASTNodeImporter::VisitConstantExpr(ConstantExpr *E) {7955  Error Err = Error::success();7956  auto ToSubExpr = importChecked(Err, E->getSubExpr());7957  auto ToResult = importChecked(Err, E->getAPValueResult());7958  if (Err)7959    return std::move(Err);7960 7961  return ConstantExpr::Create(Importer.getToContext(), ToSubExpr, ToResult);7962}7963ExpectedStmt ASTNodeImporter::VisitParenExpr(ParenExpr *E) {7964  Error Err = Error::success();7965  auto ToLParen = importChecked(Err, E->getLParen());7966  auto ToRParen = importChecked(Err, E->getRParen());7967  auto ToSubExpr = importChecked(Err, E->getSubExpr());7968  if (Err)7969    return std::move(Err);7970 7971  return new (Importer.getToContext())7972      ParenExpr(ToLParen, ToRParen, ToSubExpr);7973}7974 7975ExpectedStmt ASTNodeImporter::VisitParenListExpr(ParenListExpr *E) {7976  SmallVector<Expr *, 4> ToExprs(E->getNumExprs());7977  if (Error Err = ImportContainerChecked(E->exprs(), ToExprs))7978    return std::move(Err);7979 7980  ExpectedSLoc ToLParenLocOrErr = import(E->getLParenLoc());7981  if (!ToLParenLocOrErr)7982    return ToLParenLocOrErr.takeError();7983 7984  ExpectedSLoc ToRParenLocOrErr = import(E->getRParenLoc());7985  if (!ToRParenLocOrErr)7986    return ToRParenLocOrErr.takeError();7987 7988  return ParenListExpr::Create(Importer.getToContext(), *ToLParenLocOrErr,7989                               ToExprs, *ToRParenLocOrErr);7990}7991 7992ExpectedStmt ASTNodeImporter::VisitStmtExpr(StmtExpr *E) {7993  Error Err = Error::success();7994  auto ToSubStmt = importChecked(Err, E->getSubStmt());7995  auto ToType = importChecked(Err, E->getType());7996  auto ToLParenLoc = importChecked(Err, E->getLParenLoc());7997  auto ToRParenLoc = importChecked(Err, E->getRParenLoc());7998  if (Err)7999    return std::move(Err);8000 8001  return new (Importer.getToContext())8002      StmtExpr(ToSubStmt, ToType, ToLParenLoc, ToRParenLoc,8003               E->getTemplateDepth());8004}8005 8006ExpectedStmt ASTNodeImporter::VisitUnaryOperator(UnaryOperator *E) {8007  Error Err = Error::success();8008  auto ToSubExpr = importChecked(Err, E->getSubExpr());8009  auto ToType = importChecked(Err, E->getType());8010  auto ToOperatorLoc = importChecked(Err, E->getOperatorLoc());8011  if (Err)8012    return std::move(Err);8013 8014  auto *UO = UnaryOperator::CreateEmpty(Importer.getToContext(),8015                                        E->hasStoredFPFeatures());8016  UO->setType(ToType);8017  UO->setSubExpr(ToSubExpr);8018  UO->setOpcode(E->getOpcode());8019  UO->setOperatorLoc(ToOperatorLoc);8020  UO->setCanOverflow(E->canOverflow());8021  if (E->hasStoredFPFeatures())8022    UO->setStoredFPFeatures(E->getStoredFPFeatures());8023 8024  return UO;8025}8026 8027ExpectedStmt8028 8029ASTNodeImporter::VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *E) {8030  Error Err = Error::success();8031  auto ToType = importChecked(Err, E->getType());8032  auto ToOperatorLoc = importChecked(Err, E->getOperatorLoc());8033  auto ToRParenLoc = importChecked(Err, E->getRParenLoc());8034  if (Err)8035    return std::move(Err);8036 8037  if (E->isArgumentType()) {8038    Expected<TypeSourceInfo *> ToArgumentTypeInfoOrErr =8039        import(E->getArgumentTypeInfo());8040    if (!ToArgumentTypeInfoOrErr)8041      return ToArgumentTypeInfoOrErr.takeError();8042 8043    return new (Importer.getToContext()) UnaryExprOrTypeTraitExpr(8044        E->getKind(), *ToArgumentTypeInfoOrErr, ToType, ToOperatorLoc,8045        ToRParenLoc);8046  }8047 8048  ExpectedExpr ToArgumentExprOrErr = import(E->getArgumentExpr());8049  if (!ToArgumentExprOrErr)8050    return ToArgumentExprOrErr.takeError();8051 8052  return new (Importer.getToContext()) UnaryExprOrTypeTraitExpr(8053      E->getKind(), *ToArgumentExprOrErr, ToType, ToOperatorLoc, ToRParenLoc);8054}8055 8056ExpectedStmt ASTNodeImporter::VisitBinaryOperator(BinaryOperator *E) {8057  Error Err = Error::success();8058  auto ToLHS = importChecked(Err, E->getLHS());8059  auto ToRHS = importChecked(Err, E->getRHS());8060  auto ToType = importChecked(Err, E->getType());8061  auto ToOperatorLoc = importChecked(Err, E->getOperatorLoc());8062  if (Err)8063    return std::move(Err);8064 8065  return BinaryOperator::Create(8066      Importer.getToContext(), ToLHS, ToRHS, E->getOpcode(), ToType,8067      E->getValueKind(), E->getObjectKind(), ToOperatorLoc,8068      E->getFPFeatures());8069}8070 8071ExpectedStmt ASTNodeImporter::VisitConditionalOperator(ConditionalOperator *E) {8072  Error Err = Error::success();8073  auto ToCond = importChecked(Err, E->getCond());8074  auto ToQuestionLoc = importChecked(Err, E->getQuestionLoc());8075  auto ToLHS = importChecked(Err, E->getLHS());8076  auto ToColonLoc = importChecked(Err, E->getColonLoc());8077  auto ToRHS = importChecked(Err, E->getRHS());8078  auto ToType = importChecked(Err, E->getType());8079  if (Err)8080    return std::move(Err);8081 8082  return new (Importer.getToContext()) ConditionalOperator(8083      ToCond, ToQuestionLoc, ToLHS, ToColonLoc, ToRHS, ToType,8084      E->getValueKind(), E->getObjectKind());8085}8086 8087ExpectedStmt8088ASTNodeImporter::VisitBinaryConditionalOperator(BinaryConditionalOperator *E) {8089  Error Err = Error::success();8090  auto ToCommon = importChecked(Err, E->getCommon());8091  auto ToOpaqueValue = importChecked(Err, E->getOpaqueValue());8092  auto ToCond = importChecked(Err, E->getCond());8093  auto ToTrueExpr = importChecked(Err, E->getTrueExpr());8094  auto ToFalseExpr = importChecked(Err, E->getFalseExpr());8095  auto ToQuestionLoc = importChecked(Err, E->getQuestionLoc());8096  auto ToColonLoc = importChecked(Err, E->getColonLoc());8097  auto ToType = importChecked(Err, E->getType());8098  if (Err)8099    return std::move(Err);8100 8101  return new (Importer.getToContext()) BinaryConditionalOperator(8102      ToCommon, ToOpaqueValue, ToCond, ToTrueExpr, ToFalseExpr,8103      ToQuestionLoc, ToColonLoc, ToType, E->getValueKind(),8104      E->getObjectKind());8105}8106 8107ExpectedStmt ASTNodeImporter::VisitCXXRewrittenBinaryOperator(8108    CXXRewrittenBinaryOperator *E) {8109  Error Err = Error::success();8110  auto ToSemanticForm = importChecked(Err, E->getSemanticForm());8111  if (Err)8112    return std::move(Err);8113 8114  return new (Importer.getToContext())8115      CXXRewrittenBinaryOperator(ToSemanticForm, E->isReversed());8116}8117 8118ExpectedStmt ASTNodeImporter::VisitArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {8119  Error Err = Error::success();8120  auto ToBeginLoc = importChecked(Err, E->getBeginLoc());8121  auto ToQueriedTypeSourceInfo =8122      importChecked(Err, E->getQueriedTypeSourceInfo());8123  auto ToDimensionExpression = importChecked(Err, E->getDimensionExpression());8124  auto ToEndLoc = importChecked(Err, E->getEndLoc());8125  auto ToType = importChecked(Err, E->getType());8126  if (Err)8127    return std::move(Err);8128 8129  return new (Importer.getToContext()) ArrayTypeTraitExpr(8130      ToBeginLoc, E->getTrait(), ToQueriedTypeSourceInfo, E->getValue(),8131      ToDimensionExpression, ToEndLoc, ToType);8132}8133 8134ExpectedStmt ASTNodeImporter::VisitExpressionTraitExpr(ExpressionTraitExpr *E) {8135  Error Err = Error::success();8136  auto ToBeginLoc = importChecked(Err, E->getBeginLoc());8137  auto ToQueriedExpression = importChecked(Err, E->getQueriedExpression());8138  auto ToEndLoc = importChecked(Err, E->getEndLoc());8139  auto ToType = importChecked(Err, E->getType());8140  if (Err)8141    return std::move(Err);8142 8143  return new (Importer.getToContext()) ExpressionTraitExpr(8144      ToBeginLoc, E->getTrait(), ToQueriedExpression, E->getValue(),8145      ToEndLoc, ToType);8146}8147 8148ExpectedStmt ASTNodeImporter::VisitOpaqueValueExpr(OpaqueValueExpr *E) {8149  Error Err = Error::success();8150  auto ToLocation = importChecked(Err, E->getLocation());8151  auto ToType = importChecked(Err, E->getType());8152  auto ToSourceExpr = importChecked(Err, E->getSourceExpr());8153  if (Err)8154    return std::move(Err);8155 8156  return new (Importer.getToContext()) OpaqueValueExpr(8157      ToLocation, ToType, E->getValueKind(), E->getObjectKind(), ToSourceExpr);8158}8159 8160ExpectedStmt ASTNodeImporter::VisitArraySubscriptExpr(ArraySubscriptExpr *E) {8161  Error Err = Error::success();8162  auto ToLHS = importChecked(Err, E->getLHS());8163  auto ToRHS = importChecked(Err, E->getRHS());8164  auto ToType = importChecked(Err, E->getType());8165  auto ToRBracketLoc = importChecked(Err, E->getRBracketLoc());8166  if (Err)8167    return std::move(Err);8168 8169  return new (Importer.getToContext()) ArraySubscriptExpr(8170      ToLHS, ToRHS, ToType, E->getValueKind(), E->getObjectKind(),8171      ToRBracketLoc);8172}8173 8174ExpectedStmt8175ASTNodeImporter::VisitCompoundAssignOperator(CompoundAssignOperator *E) {8176  Error Err = Error::success();8177  auto ToLHS = importChecked(Err, E->getLHS());8178  auto ToRHS = importChecked(Err, E->getRHS());8179  auto ToType = importChecked(Err, E->getType());8180  auto ToComputationLHSType = importChecked(Err, E->getComputationLHSType());8181  auto ToComputationResultType =8182      importChecked(Err, E->getComputationResultType());8183  auto ToOperatorLoc = importChecked(Err, E->getOperatorLoc());8184  if (Err)8185    return std::move(Err);8186 8187  return CompoundAssignOperator::Create(8188      Importer.getToContext(), ToLHS, ToRHS, E->getOpcode(), ToType,8189      E->getValueKind(), E->getObjectKind(), ToOperatorLoc,8190      E->getFPFeatures(),8191      ToComputationLHSType, ToComputationResultType);8192}8193 8194Expected<CXXCastPath>8195ASTNodeImporter::ImportCastPath(CastExpr *CE) {8196  CXXCastPath Path;8197  for (auto I = CE->path_begin(), E = CE->path_end(); I != E; ++I) {8198    if (auto SpecOrErr = import(*I))8199      Path.push_back(*SpecOrErr);8200    else8201      return SpecOrErr.takeError();8202  }8203  return Path;8204}8205 8206ExpectedStmt ASTNodeImporter::VisitImplicitCastExpr(ImplicitCastExpr *E) {8207  ExpectedType ToTypeOrErr = import(E->getType());8208  if (!ToTypeOrErr)8209    return ToTypeOrErr.takeError();8210 8211  ExpectedExpr ToSubExprOrErr = import(E->getSubExpr());8212  if (!ToSubExprOrErr)8213    return ToSubExprOrErr.takeError();8214 8215  Expected<CXXCastPath> ToBasePathOrErr = ImportCastPath(E);8216  if (!ToBasePathOrErr)8217    return ToBasePathOrErr.takeError();8218 8219  return ImplicitCastExpr::Create(8220      Importer.getToContext(), *ToTypeOrErr, E->getCastKind(), *ToSubExprOrErr,8221      &(*ToBasePathOrErr), E->getValueKind(), E->getFPFeatures());8222}8223 8224ExpectedStmt ASTNodeImporter::VisitExplicitCastExpr(ExplicitCastExpr *E) {8225  Error Err = Error::success();8226  auto ToType = importChecked(Err, E->getType());8227  auto ToSubExpr = importChecked(Err, E->getSubExpr());8228  auto ToTypeInfoAsWritten = importChecked(Err, E->getTypeInfoAsWritten());8229  if (Err)8230    return std::move(Err);8231 8232  Expected<CXXCastPath> ToBasePathOrErr = ImportCastPath(E);8233  if (!ToBasePathOrErr)8234    return ToBasePathOrErr.takeError();8235  CXXCastPath *ToBasePath = &(*ToBasePathOrErr);8236 8237  switch (E->getStmtClass()) {8238  case Stmt::CStyleCastExprClass: {8239    auto *CCE = cast<CStyleCastExpr>(E);8240    ExpectedSLoc ToLParenLocOrErr = import(CCE->getLParenLoc());8241    if (!ToLParenLocOrErr)8242      return ToLParenLocOrErr.takeError();8243    ExpectedSLoc ToRParenLocOrErr = import(CCE->getRParenLoc());8244    if (!ToRParenLocOrErr)8245      return ToRParenLocOrErr.takeError();8246    return CStyleCastExpr::Create(8247        Importer.getToContext(), ToType, E->getValueKind(), E->getCastKind(),8248        ToSubExpr, ToBasePath, CCE->getFPFeatures(), ToTypeInfoAsWritten,8249        *ToLParenLocOrErr, *ToRParenLocOrErr);8250  }8251 8252  case Stmt::CXXFunctionalCastExprClass: {8253    auto *FCE = cast<CXXFunctionalCastExpr>(E);8254    ExpectedSLoc ToLParenLocOrErr = import(FCE->getLParenLoc());8255    if (!ToLParenLocOrErr)8256      return ToLParenLocOrErr.takeError();8257    ExpectedSLoc ToRParenLocOrErr = import(FCE->getRParenLoc());8258    if (!ToRParenLocOrErr)8259      return ToRParenLocOrErr.takeError();8260    return CXXFunctionalCastExpr::Create(8261        Importer.getToContext(), ToType, E->getValueKind(), ToTypeInfoAsWritten,8262        E->getCastKind(), ToSubExpr, ToBasePath, FCE->getFPFeatures(),8263        *ToLParenLocOrErr, *ToRParenLocOrErr);8264  }8265 8266  case Stmt::ObjCBridgedCastExprClass: {8267    auto *OCE = cast<ObjCBridgedCastExpr>(E);8268    ExpectedSLoc ToLParenLocOrErr = import(OCE->getLParenLoc());8269    if (!ToLParenLocOrErr)8270      return ToLParenLocOrErr.takeError();8271    ExpectedSLoc ToBridgeKeywordLocOrErr = import(OCE->getBridgeKeywordLoc());8272    if (!ToBridgeKeywordLocOrErr)8273      return ToBridgeKeywordLocOrErr.takeError();8274    return new (Importer.getToContext()) ObjCBridgedCastExpr(8275        *ToLParenLocOrErr, OCE->getBridgeKind(), E->getCastKind(),8276        *ToBridgeKeywordLocOrErr, ToTypeInfoAsWritten, ToSubExpr);8277  }8278  case Stmt::BuiltinBitCastExprClass: {8279    auto *BBC = cast<BuiltinBitCastExpr>(E);8280    ExpectedSLoc ToKWLocOrErr = import(BBC->getBeginLoc());8281    if (!ToKWLocOrErr)8282      return ToKWLocOrErr.takeError();8283    ExpectedSLoc ToRParenLocOrErr = import(BBC->getEndLoc());8284    if (!ToRParenLocOrErr)8285      return ToRParenLocOrErr.takeError();8286    return new (Importer.getToContext()) BuiltinBitCastExpr(8287        ToType, E->getValueKind(), E->getCastKind(), ToSubExpr,8288        ToTypeInfoAsWritten, *ToKWLocOrErr, *ToRParenLocOrErr);8289  }8290  default:8291    llvm_unreachable("Cast expression of unsupported type!");8292    return make_error<ASTImportError>(ASTImportError::UnsupportedConstruct);8293  }8294}8295 8296ExpectedStmt ASTNodeImporter::VisitOffsetOfExpr(OffsetOfExpr *E) {8297  SmallVector<OffsetOfNode, 4> ToNodes;8298  for (int I = 0, N = E->getNumComponents(); I < N; ++I) {8299    const OffsetOfNode &FromNode = E->getComponent(I);8300 8301    SourceLocation ToBeginLoc, ToEndLoc;8302 8303    if (FromNode.getKind() != OffsetOfNode::Base) {8304      Error Err = Error::success();8305      ToBeginLoc = importChecked(Err, FromNode.getBeginLoc());8306      ToEndLoc = importChecked(Err, FromNode.getEndLoc());8307      if (Err)8308        return std::move(Err);8309    }8310 8311    switch (FromNode.getKind()) {8312    case OffsetOfNode::Array:8313      ToNodes.push_back(8314          OffsetOfNode(ToBeginLoc, FromNode.getArrayExprIndex(), ToEndLoc));8315      break;8316    case OffsetOfNode::Base: {8317      auto ToBSOrErr = import(FromNode.getBase());8318      if (!ToBSOrErr)8319        return ToBSOrErr.takeError();8320      ToNodes.push_back(OffsetOfNode(*ToBSOrErr));8321      break;8322    }8323    case OffsetOfNode::Field: {8324      auto ToFieldOrErr = import(FromNode.getField());8325      if (!ToFieldOrErr)8326        return ToFieldOrErr.takeError();8327      ToNodes.push_back(OffsetOfNode(ToBeginLoc, *ToFieldOrErr, ToEndLoc));8328      break;8329    }8330    case OffsetOfNode::Identifier: {8331      IdentifierInfo *ToII = Importer.Import(FromNode.getFieldName());8332      ToNodes.push_back(OffsetOfNode(ToBeginLoc, ToII, ToEndLoc));8333      break;8334    }8335    }8336  }8337 8338  SmallVector<Expr *, 4> ToExprs(E->getNumExpressions());8339  for (int I = 0, N = E->getNumExpressions(); I < N; ++I) {8340    ExpectedExpr ToIndexExprOrErr = import(E->getIndexExpr(I));8341    if (!ToIndexExprOrErr)8342      return ToIndexExprOrErr.takeError();8343    ToExprs[I] = *ToIndexExprOrErr;8344  }8345 8346  Error Err = Error::success();8347  auto ToType = importChecked(Err, E->getType());8348  auto ToTypeSourceInfo = importChecked(Err, E->getTypeSourceInfo());8349  auto ToOperatorLoc = importChecked(Err, E->getOperatorLoc());8350  auto ToRParenLoc = importChecked(Err, E->getRParenLoc());8351  if (Err)8352    return std::move(Err);8353 8354  return OffsetOfExpr::Create(8355      Importer.getToContext(), ToType, ToOperatorLoc, ToTypeSourceInfo, ToNodes,8356      ToExprs, ToRParenLoc);8357}8358 8359ExpectedStmt ASTNodeImporter::VisitCXXNoexceptExpr(CXXNoexceptExpr *E) {8360  Error Err = Error::success();8361  auto ToType = importChecked(Err, E->getType());8362  auto ToOperand = importChecked(Err, E->getOperand());8363  auto ToBeginLoc = importChecked(Err, E->getBeginLoc());8364  auto ToEndLoc = importChecked(Err, E->getEndLoc());8365  if (Err)8366    return std::move(Err);8367 8368  CanThrowResult ToCanThrow;8369  if (E->isValueDependent())8370    ToCanThrow = CT_Dependent;8371  else8372    ToCanThrow = E->getValue() ? CT_Can : CT_Cannot;8373 8374  return new (Importer.getToContext()) CXXNoexceptExpr(8375      ToType, ToOperand, ToCanThrow, ToBeginLoc, ToEndLoc);8376}8377 8378ExpectedStmt ASTNodeImporter::VisitCXXThrowExpr(CXXThrowExpr *E) {8379  Error Err = Error::success();8380  auto ToSubExpr = importChecked(Err, E->getSubExpr());8381  auto ToType = importChecked(Err, E->getType());8382  auto ToThrowLoc = importChecked(Err, E->getThrowLoc());8383  if (Err)8384    return std::move(Err);8385 8386  return new (Importer.getToContext()) CXXThrowExpr(8387      ToSubExpr, ToType, ToThrowLoc, E->isThrownVariableInScope());8388}8389 8390ExpectedStmt ASTNodeImporter::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E) {8391  ExpectedSLoc ToUsedLocOrErr = import(E->getUsedLocation());8392  if (!ToUsedLocOrErr)8393    return ToUsedLocOrErr.takeError();8394 8395  auto ToParamOrErr = import(E->getParam());8396  if (!ToParamOrErr)8397    return ToParamOrErr.takeError();8398 8399  auto UsedContextOrErr = Importer.ImportContext(E->getUsedContext());8400  if (!UsedContextOrErr)8401    return UsedContextOrErr.takeError();8402 8403  // Import the default arg if it was not imported yet.8404  // This is needed because it can happen that during the import of the8405  // default expression (from VisitParmVarDecl) the same ParmVarDecl is8406  // encountered here. The default argument for a ParmVarDecl is set in the8407  // ParmVarDecl only after it is imported (set in VisitParmVarDecl if not here,8408  // see VisitParmVarDecl).8409  ParmVarDecl *ToParam = *ToParamOrErr;8410  if (!ToParam->getDefaultArg()) {8411    std::optional<ParmVarDecl *> FromParam =8412        Importer.getImportedFromDecl(ToParam);8413    assert(FromParam && "ParmVarDecl was not imported?");8414 8415    if (Error Err = ImportDefaultArgOfParmVarDecl(*FromParam, ToParam))8416      return std::move(Err);8417  }8418  Expr *RewrittenInit = nullptr;8419  if (E->hasRewrittenInit()) {8420    ExpectedExpr ExprOrErr = import(E->getRewrittenExpr());8421    if (!ExprOrErr)8422      return ExprOrErr.takeError();8423    RewrittenInit = ExprOrErr.get();8424  }8425  return CXXDefaultArgExpr::Create(Importer.getToContext(), *ToUsedLocOrErr,8426                                   *ToParamOrErr, RewrittenInit,8427                                   *UsedContextOrErr);8428}8429 8430ExpectedStmt8431ASTNodeImporter::VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E) {8432  Error Err = Error::success();8433  auto ToType = importChecked(Err, E->getType());8434  auto ToTypeSourceInfo = importChecked(Err, E->getTypeSourceInfo());8435  auto ToRParenLoc = importChecked(Err, E->getRParenLoc());8436  if (Err)8437    return std::move(Err);8438 8439  return new (Importer.getToContext()) CXXScalarValueInitExpr(8440      ToType, ToTypeSourceInfo, ToRParenLoc);8441}8442 8443ExpectedStmt8444ASTNodeImporter::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {8445  ExpectedExpr ToSubExprOrErr = import(E->getSubExpr());8446  if (!ToSubExprOrErr)8447    return ToSubExprOrErr.takeError();8448 8449  auto ToDtorOrErr = import(E->getTemporary()->getDestructor());8450  if (!ToDtorOrErr)8451    return ToDtorOrErr.takeError();8452 8453  ASTContext &ToCtx = Importer.getToContext();8454  CXXTemporary *Temp = CXXTemporary::Create(ToCtx, *ToDtorOrErr);8455  return CXXBindTemporaryExpr::Create(ToCtx, Temp, *ToSubExprOrErr);8456}8457 8458ExpectedStmt8459 8460ASTNodeImporter::VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E) {8461  Error Err = Error::success();8462  auto ToConstructor = importChecked(Err, E->getConstructor());8463  auto ToType = importChecked(Err, E->getType());8464  auto ToTypeSourceInfo = importChecked(Err, E->getTypeSourceInfo());8465  auto ToParenOrBraceRange = importChecked(Err, E->getParenOrBraceRange());8466  if (Err)8467    return std::move(Err);8468 8469  SmallVector<Expr *, 8> ToArgs(E->getNumArgs());8470  if (Error Err = ImportContainerChecked(E->arguments(), ToArgs))8471    return std::move(Err);8472 8473  return CXXTemporaryObjectExpr::Create(8474      Importer.getToContext(), ToConstructor, ToType, ToTypeSourceInfo, ToArgs,8475      ToParenOrBraceRange, E->hadMultipleCandidates(),8476      E->isListInitialization(), E->isStdInitListInitialization(),8477      E->requiresZeroInitialization());8478}8479 8480ExpectedDecl ASTNodeImporter::VisitLifetimeExtendedTemporaryDecl(8481    LifetimeExtendedTemporaryDecl *D) {8482  DeclContext *DC, *LexicalDC;8483  if (Error Err = ImportDeclContext(D, DC, LexicalDC))8484    return std::move(Err);8485 8486  Error Err = Error::success();8487  auto Temporary = importChecked(Err, D->getTemporaryExpr());8488  auto ExtendingDecl = importChecked(Err, D->getExtendingDecl());8489  if (Err)8490    return std::move(Err);8491  // FIXME: Should ManglingNumber get numbers associated with 'to' context?8492 8493  LifetimeExtendedTemporaryDecl *To;8494  if (GetImportedOrCreateDecl(To, D, Temporary, ExtendingDecl,8495                              D->getManglingNumber()))8496    return To;8497 8498  To->setLexicalDeclContext(LexicalDC);8499  LexicalDC->addDeclInternal(To);8500  return To;8501}8502 8503ExpectedStmt8504ASTNodeImporter::VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *E) {8505  Error Err = Error::success();8506  auto ToType = importChecked(Err, E->getType());8507  Expr *ToTemporaryExpr = importChecked(8508      Err, E->getLifetimeExtendedTemporaryDecl() ? nullptr : E->getSubExpr());8509  auto ToMaterializedDecl =8510      importChecked(Err, E->getLifetimeExtendedTemporaryDecl());8511  if (Err)8512    return std::move(Err);8513 8514  if (!ToTemporaryExpr)8515    ToTemporaryExpr = cast<Expr>(ToMaterializedDecl->getTemporaryExpr());8516 8517  auto *ToMTE = new (Importer.getToContext()) MaterializeTemporaryExpr(8518      ToType, ToTemporaryExpr, E->isBoundToLvalueReference(),8519      ToMaterializedDecl);8520 8521  return ToMTE;8522}8523 8524ExpectedStmt ASTNodeImporter::VisitPackExpansionExpr(PackExpansionExpr *E) {8525  Error Err = Error::success();8526  auto *ToPattern = importChecked(Err, E->getPattern());8527  auto ToEllipsisLoc = importChecked(Err, E->getEllipsisLoc());8528  if (Err)8529    return std::move(Err);8530 8531  return new (Importer.getToContext())8532      PackExpansionExpr(ToPattern, ToEllipsisLoc, E->getNumExpansions());8533}8534 8535ExpectedStmt ASTNodeImporter::VisitSizeOfPackExpr(SizeOfPackExpr *E) {8536  Error Err = Error::success();8537  auto ToOperatorLoc = importChecked(Err, E->getOperatorLoc());8538  auto ToPack = importChecked(Err, E->getPack());8539  auto ToPackLoc = importChecked(Err, E->getPackLoc());8540  auto ToRParenLoc = importChecked(Err, E->getRParenLoc());8541  if (Err)8542    return std::move(Err);8543 8544  UnsignedOrNone Length = std::nullopt;8545  if (!E->isValueDependent())8546    Length = E->getPackLength();8547 8548  SmallVector<TemplateArgument, 8> ToPartialArguments;8549  if (E->isPartiallySubstituted()) {8550    if (Error Err = ImportTemplateArguments(E->getPartialArguments(),8551                                            ToPartialArguments))8552      return std::move(Err);8553  }8554 8555  return SizeOfPackExpr::Create(8556      Importer.getToContext(), ToOperatorLoc, ToPack, ToPackLoc, ToRParenLoc,8557      Length, ToPartialArguments);8558}8559 8560 8561ExpectedStmt ASTNodeImporter::VisitCXXNewExpr(CXXNewExpr *E) {8562  Error Err = Error::success();8563  auto ToOperatorNew = importChecked(Err, E->getOperatorNew());8564  auto ToOperatorDelete = importChecked(Err, E->getOperatorDelete());8565  auto ToTypeIdParens = importChecked(Err, E->getTypeIdParens());8566  auto ToArraySize = importChecked(Err, E->getArraySize());8567  auto ToInitializer = importChecked(Err, E->getInitializer());8568  auto ToType = importChecked(Err, E->getType());8569  auto ToAllocatedTypeSourceInfo =8570      importChecked(Err, E->getAllocatedTypeSourceInfo());8571  auto ToSourceRange = importChecked(Err, E->getSourceRange());8572  auto ToDirectInitRange = importChecked(Err, E->getDirectInitRange());8573  if (Err)8574    return std::move(Err);8575 8576  SmallVector<Expr *, 4> ToPlacementArgs(E->getNumPlacementArgs());8577  if (Error Err =8578      ImportContainerChecked(E->placement_arguments(), ToPlacementArgs))8579    return std::move(Err);8580 8581  return CXXNewExpr::Create(8582      Importer.getToContext(), E->isGlobalNew(), ToOperatorNew,8583      ToOperatorDelete, E->implicitAllocationParameters(),8584      E->doesUsualArrayDeleteWantSize(), ToPlacementArgs, ToTypeIdParens,8585      ToArraySize, E->getInitializationStyle(), ToInitializer, ToType,8586      ToAllocatedTypeSourceInfo, ToSourceRange, ToDirectInitRange);8587}8588 8589ExpectedStmt ASTNodeImporter::VisitCXXDeleteExpr(CXXDeleteExpr *E) {8590  Error Err = Error::success();8591  auto ToType = importChecked(Err, E->getType());8592  auto ToOperatorDelete = importChecked(Err, E->getOperatorDelete());8593  auto ToArgument = importChecked(Err, E->getArgument());8594  auto ToBeginLoc = importChecked(Err, E->getBeginLoc());8595  if (Err)8596    return std::move(Err);8597 8598  return new (Importer.getToContext()) CXXDeleteExpr(8599      ToType, E->isGlobalDelete(), E->isArrayForm(), E->isArrayFormAsWritten(),8600      E->doesUsualArrayDeleteWantSize(), ToOperatorDelete, ToArgument,8601      ToBeginLoc);8602}8603 8604ExpectedStmt ASTNodeImporter::VisitCXXConstructExpr(CXXConstructExpr *E) {8605  Error Err = Error::success();8606  auto ToType = importChecked(Err, E->getType());8607  auto ToLocation = importChecked(Err, E->getLocation());8608  auto ToConstructor = importChecked(Err, E->getConstructor());8609  auto ToParenOrBraceRange = importChecked(Err, E->getParenOrBraceRange());8610  if (Err)8611    return std::move(Err);8612 8613  SmallVector<Expr *, 6> ToArgs(E->getNumArgs());8614  if (Error Err = ImportContainerChecked(E->arguments(), ToArgs))8615    return std::move(Err);8616 8617  CXXConstructExpr *ToE = CXXConstructExpr::Create(8618      Importer.getToContext(), ToType, ToLocation, ToConstructor,8619      E->isElidable(), ToArgs, E->hadMultipleCandidates(),8620      E->isListInitialization(), E->isStdInitListInitialization(),8621      E->requiresZeroInitialization(), E->getConstructionKind(),8622      ToParenOrBraceRange);8623  ToE->setIsImmediateEscalating(E->isImmediateEscalating());8624  return ToE;8625}8626 8627ExpectedStmt ASTNodeImporter::VisitExprWithCleanups(ExprWithCleanups *E) {8628  ExpectedExpr ToSubExprOrErr = import(E->getSubExpr());8629  if (!ToSubExprOrErr)8630    return ToSubExprOrErr.takeError();8631 8632  SmallVector<ExprWithCleanups::CleanupObject, 8> ToObjects(E->getNumObjects());8633  if (Error Err = ImportContainerChecked(E->getObjects(), ToObjects))8634    return std::move(Err);8635 8636  return ExprWithCleanups::Create(8637      Importer.getToContext(), *ToSubExprOrErr, E->cleanupsHaveSideEffects(),8638      ToObjects);8639}8640 8641ExpectedStmt ASTNodeImporter::VisitCXXMemberCallExpr(CXXMemberCallExpr *E) {8642  Error Err = Error::success();8643  auto ToCallee = importChecked(Err, E->getCallee());8644  auto ToType = importChecked(Err, E->getType());8645  auto ToRParenLoc = importChecked(Err, E->getRParenLoc());8646  if (Err)8647    return std::move(Err);8648 8649  SmallVector<Expr *, 4> ToArgs(E->getNumArgs());8650  if (Error Err = ImportContainerChecked(E->arguments(), ToArgs))8651    return std::move(Err);8652 8653  return CXXMemberCallExpr::Create(Importer.getToContext(), ToCallee, ToArgs,8654                                   ToType, E->getValueKind(), ToRParenLoc,8655                                   E->getFPFeatures());8656}8657 8658ExpectedStmt ASTNodeImporter::VisitCXXThisExpr(CXXThisExpr *E) {8659  ExpectedType ToTypeOrErr = import(E->getType());8660  if (!ToTypeOrErr)8661    return ToTypeOrErr.takeError();8662 8663  ExpectedSLoc ToLocationOrErr = import(E->getLocation());8664  if (!ToLocationOrErr)8665    return ToLocationOrErr.takeError();8666 8667  return CXXThisExpr::Create(Importer.getToContext(), *ToLocationOrErr,8668                             *ToTypeOrErr, E->isImplicit());8669}8670 8671ExpectedStmt ASTNodeImporter::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {8672  ExpectedType ToTypeOrErr = import(E->getType());8673  if (!ToTypeOrErr)8674    return ToTypeOrErr.takeError();8675 8676  ExpectedSLoc ToLocationOrErr = import(E->getLocation());8677  if (!ToLocationOrErr)8678    return ToLocationOrErr.takeError();8679 8680  return CXXBoolLiteralExpr::Create(Importer.getToContext(), E->getValue(),8681                                    *ToTypeOrErr, *ToLocationOrErr);8682}8683 8684ExpectedStmt ASTNodeImporter::VisitMemberExpr(MemberExpr *E) {8685  Error Err = Error::success();8686  auto ToBase = importChecked(Err, E->getBase());8687  auto ToOperatorLoc = importChecked(Err, E->getOperatorLoc());8688  auto ToQualifierLoc = importChecked(Err, E->getQualifierLoc());8689  auto ToTemplateKeywordLoc = importChecked(Err, E->getTemplateKeywordLoc());8690  auto ToMemberDecl = importChecked(Err, E->getMemberDecl());8691  auto ToType = importChecked(Err, E->getType());8692  auto ToDecl = importChecked(Err, E->getFoundDecl().getDecl());8693  auto ToName = importChecked(Err, E->getMemberNameInfo().getName());8694  auto ToLoc = importChecked(Err, E->getMemberNameInfo().getLoc());8695  if (Err)8696    return std::move(Err);8697 8698  DeclAccessPair ToFoundDecl =8699      DeclAccessPair::make(ToDecl, E->getFoundDecl().getAccess());8700 8701  DeclarationNameInfo ToMemberNameInfo(ToName, ToLoc);8702 8703  TemplateArgumentListInfo ToTAInfo, *ResInfo = nullptr;8704  if (E->hasExplicitTemplateArgs()) {8705    if (Error Err =8706            ImportTemplateArgumentListInfo(E->getLAngleLoc(), E->getRAngleLoc(),8707                                           E->template_arguments(), ToTAInfo))8708      return std::move(Err);8709    ResInfo = &ToTAInfo;8710  }8711 8712  return MemberExpr::Create(Importer.getToContext(), ToBase, E->isArrow(),8713                            ToOperatorLoc, ToQualifierLoc, ToTemplateKeywordLoc,8714                            ToMemberDecl, ToFoundDecl, ToMemberNameInfo,8715                            ResInfo, ToType, E->getValueKind(),8716                            E->getObjectKind(), E->isNonOdrUse());8717}8718 8719ExpectedStmt8720ASTNodeImporter::VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E) {8721  Error Err = Error::success();8722  auto ToBase = importChecked(Err, E->getBase());8723  auto ToOperatorLoc = importChecked(Err, E->getOperatorLoc());8724  auto ToQualifierLoc = importChecked(Err, E->getQualifierLoc());8725  auto ToScopeTypeInfo = importChecked(Err, E->getScopeTypeInfo());8726  auto ToColonColonLoc = importChecked(Err, E->getColonColonLoc());8727  auto ToTildeLoc = importChecked(Err, E->getTildeLoc());8728  if (Err)8729    return std::move(Err);8730 8731  PseudoDestructorTypeStorage Storage;8732  if (const IdentifierInfo *FromII = E->getDestroyedTypeIdentifier()) {8733    const IdentifierInfo *ToII = Importer.Import(FromII);8734    ExpectedSLoc ToDestroyedTypeLocOrErr = import(E->getDestroyedTypeLoc());8735    if (!ToDestroyedTypeLocOrErr)8736      return ToDestroyedTypeLocOrErr.takeError();8737    Storage = PseudoDestructorTypeStorage(ToII, *ToDestroyedTypeLocOrErr);8738  } else {8739    if (auto ToTIOrErr = import(E->getDestroyedTypeInfo()))8740      Storage = PseudoDestructorTypeStorage(*ToTIOrErr);8741    else8742      return ToTIOrErr.takeError();8743  }8744 8745  return new (Importer.getToContext()) CXXPseudoDestructorExpr(8746      Importer.getToContext(), ToBase, E->isArrow(), ToOperatorLoc,8747      ToQualifierLoc, ToScopeTypeInfo, ToColonColonLoc, ToTildeLoc, Storage);8748}8749 8750ExpectedStmt ASTNodeImporter::VisitCXXDependentScopeMemberExpr(8751    CXXDependentScopeMemberExpr *E) {8752  Error Err = Error::success();8753  auto ToType = importChecked(Err, E->getType());8754  auto ToOperatorLoc = importChecked(Err, E->getOperatorLoc());8755  auto ToQualifierLoc = importChecked(Err, E->getQualifierLoc());8756  auto ToTemplateKeywordLoc = importChecked(Err, E->getTemplateKeywordLoc());8757  auto ToFirstQualifierFoundInScope =8758      importChecked(Err, E->getFirstQualifierFoundInScope());8759  if (Err)8760    return std::move(Err);8761 8762  Expr *ToBase = nullptr;8763  if (!E->isImplicitAccess()) {8764    if (ExpectedExpr ToBaseOrErr = import(E->getBase()))8765      ToBase = *ToBaseOrErr;8766    else8767      return ToBaseOrErr.takeError();8768  }8769 8770  TemplateArgumentListInfo ToTAInfo, *ResInfo = nullptr;8771 8772  if (E->hasExplicitTemplateArgs()) {8773    if (Error Err =8774            ImportTemplateArgumentListInfo(E->getLAngleLoc(), E->getRAngleLoc(),8775                                           E->template_arguments(), ToTAInfo))8776      return std::move(Err);8777    ResInfo = &ToTAInfo;8778  }8779  auto ToMember = importChecked(Err, E->getMember());8780  auto ToMemberLoc = importChecked(Err, E->getMemberLoc());8781  if (Err)8782    return std::move(Err);8783  DeclarationNameInfo ToMemberNameInfo(ToMember, ToMemberLoc);8784 8785  // Import additional name location/type info.8786  if (Error Err =8787          ImportDeclarationNameLoc(E->getMemberNameInfo(), ToMemberNameInfo))8788    return std::move(Err);8789 8790  return CXXDependentScopeMemberExpr::Create(8791      Importer.getToContext(), ToBase, ToType, E->isArrow(), ToOperatorLoc,8792      ToQualifierLoc, ToTemplateKeywordLoc, ToFirstQualifierFoundInScope,8793      ToMemberNameInfo, ResInfo);8794}8795 8796ExpectedStmt8797ASTNodeImporter::VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E) {8798  Error Err = Error::success();8799  auto ToQualifierLoc = importChecked(Err, E->getQualifierLoc());8800  auto ToTemplateKeywordLoc = importChecked(Err, E->getTemplateKeywordLoc());8801  auto ToDeclName = importChecked(Err, E->getDeclName());8802  auto ToNameLoc = importChecked(Err, E->getNameInfo().getLoc());8803  auto ToLAngleLoc = importChecked(Err, E->getLAngleLoc());8804  auto ToRAngleLoc = importChecked(Err, E->getRAngleLoc());8805  if (Err)8806    return std::move(Err);8807 8808  DeclarationNameInfo ToNameInfo(ToDeclName, ToNameLoc);8809  if (Error Err = ImportDeclarationNameLoc(E->getNameInfo(), ToNameInfo))8810    return std::move(Err);8811 8812  TemplateArgumentListInfo ToTAInfo(ToLAngleLoc, ToRAngleLoc);8813  TemplateArgumentListInfo *ResInfo = nullptr;8814  if (E->hasExplicitTemplateArgs()) {8815    if (Error Err =8816        ImportTemplateArgumentListInfo(E->template_arguments(), ToTAInfo))8817      return std::move(Err);8818    ResInfo = &ToTAInfo;8819  }8820 8821  return DependentScopeDeclRefExpr::Create(8822      Importer.getToContext(), ToQualifierLoc, ToTemplateKeywordLoc,8823      ToNameInfo, ResInfo);8824}8825 8826ExpectedStmt ASTNodeImporter::VisitCXXUnresolvedConstructExpr(8827    CXXUnresolvedConstructExpr *E) {8828  Error Err = Error::success();8829  auto ToLParenLoc = importChecked(Err, E->getLParenLoc());8830  auto ToRParenLoc = importChecked(Err, E->getRParenLoc());8831  auto ToType = importChecked(Err, E->getType());8832  auto ToTypeSourceInfo = importChecked(Err, E->getTypeSourceInfo());8833  if (Err)8834    return std::move(Err);8835 8836  SmallVector<Expr *, 8> ToArgs(E->getNumArgs());8837  if (Error Err =8838      ImportArrayChecked(E->arg_begin(), E->arg_end(), ToArgs.begin()))8839    return std::move(Err);8840 8841  return CXXUnresolvedConstructExpr::Create(8842      Importer.getToContext(), ToType, ToTypeSourceInfo, ToLParenLoc,8843      ArrayRef(ToArgs), ToRParenLoc, E->isListInitialization());8844}8845 8846ExpectedStmt8847ASTNodeImporter::VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E) {8848  Expected<CXXRecordDecl *> ToNamingClassOrErr = import(E->getNamingClass());8849  if (!ToNamingClassOrErr)8850    return ToNamingClassOrErr.takeError();8851 8852  auto ToQualifierLocOrErr = import(E->getQualifierLoc());8853  if (!ToQualifierLocOrErr)8854    return ToQualifierLocOrErr.takeError();8855 8856  Error Err = Error::success();8857  auto ToName = importChecked(Err, E->getName());8858  auto ToNameLoc = importChecked(Err, E->getNameLoc());8859  if (Err)8860    return std::move(Err);8861  DeclarationNameInfo ToNameInfo(ToName, ToNameLoc);8862 8863  // Import additional name location/type info.8864  if (Error Err = ImportDeclarationNameLoc(E->getNameInfo(), ToNameInfo))8865    return std::move(Err);8866 8867  UnresolvedSet<8> ToDecls;8868  for (auto *D : E->decls())8869    if (auto ToDOrErr = import(D))8870      ToDecls.addDecl(cast<NamedDecl>(*ToDOrErr));8871    else8872      return ToDOrErr.takeError();8873 8874  if (E->hasExplicitTemplateArgs()) {8875    TemplateArgumentListInfo ToTAInfo;8876    if (Error Err = ImportTemplateArgumentListInfo(8877        E->getLAngleLoc(), E->getRAngleLoc(), E->template_arguments(),8878        ToTAInfo))8879      return std::move(Err);8880 8881    ExpectedSLoc ToTemplateKeywordLocOrErr = import(E->getTemplateKeywordLoc());8882    if (!ToTemplateKeywordLocOrErr)8883      return ToTemplateKeywordLocOrErr.takeError();8884 8885    const bool KnownDependent =8886        (E->getDependence() & ExprDependence::TypeValue) ==8887        ExprDependence::TypeValue;8888    return UnresolvedLookupExpr::Create(8889        Importer.getToContext(), *ToNamingClassOrErr, *ToQualifierLocOrErr,8890        *ToTemplateKeywordLocOrErr, ToNameInfo, E->requiresADL(), &ToTAInfo,8891        ToDecls.begin(), ToDecls.end(), KnownDependent,8892        /*KnownInstantiationDependent=*/E->isInstantiationDependent());8893  }8894 8895  return UnresolvedLookupExpr::Create(8896      Importer.getToContext(), *ToNamingClassOrErr, *ToQualifierLocOrErr,8897      ToNameInfo, E->requiresADL(), ToDecls.begin(), ToDecls.end(),8898      /*KnownDependent=*/E->isTypeDependent(),8899      /*KnownInstantiationDependent=*/E->isInstantiationDependent());8900}8901 8902ExpectedStmt8903ASTNodeImporter::VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E) {8904  Error Err = Error::success();8905  auto ToType = importChecked(Err, E->getType());8906  auto ToOperatorLoc = importChecked(Err, E->getOperatorLoc());8907  auto ToQualifierLoc = importChecked(Err, E->getQualifierLoc());8908  auto ToTemplateKeywordLoc = importChecked(Err, E->getTemplateKeywordLoc());8909  auto ToName = importChecked(Err, E->getName());8910  auto ToNameLoc = importChecked(Err, E->getNameLoc());8911  if (Err)8912    return std::move(Err);8913 8914  DeclarationNameInfo ToNameInfo(ToName, ToNameLoc);8915  // Import additional name location/type info.8916  if (Error Err = ImportDeclarationNameLoc(E->getNameInfo(), ToNameInfo))8917    return std::move(Err);8918 8919  UnresolvedSet<8> ToDecls;8920  for (Decl *D : E->decls())8921    if (auto ToDOrErr = import(D))8922      ToDecls.addDecl(cast<NamedDecl>(*ToDOrErr));8923    else8924      return ToDOrErr.takeError();8925 8926  TemplateArgumentListInfo ToTAInfo;8927  TemplateArgumentListInfo *ResInfo = nullptr;8928  if (E->hasExplicitTemplateArgs()) {8929    TemplateArgumentListInfo FromTAInfo;8930    E->copyTemplateArgumentsInto(FromTAInfo);8931    if (Error Err = ImportTemplateArgumentListInfo(FromTAInfo, ToTAInfo))8932      return std::move(Err);8933    ResInfo = &ToTAInfo;8934  }8935 8936  Expr *ToBase = nullptr;8937  if (!E->isImplicitAccess()) {8938    if (ExpectedExpr ToBaseOrErr = import(E->getBase()))8939      ToBase = *ToBaseOrErr;8940    else8941      return ToBaseOrErr.takeError();8942  }8943 8944  return UnresolvedMemberExpr::Create(8945      Importer.getToContext(), E->hasUnresolvedUsing(), ToBase, ToType,8946      E->isArrow(), ToOperatorLoc, ToQualifierLoc, ToTemplateKeywordLoc,8947      ToNameInfo, ResInfo, ToDecls.begin(), ToDecls.end());8948}8949 8950ExpectedStmt ASTNodeImporter::VisitCallExpr(CallExpr *E) {8951  Error Err = Error::success();8952  auto ToCallee = importChecked(Err, E->getCallee());8953  auto ToType = importChecked(Err, E->getType());8954  auto ToRParenLoc = importChecked(Err, E->getRParenLoc());8955  if (Err)8956    return std::move(Err);8957 8958  unsigned NumArgs = E->getNumArgs();8959  llvm::SmallVector<Expr *, 2> ToArgs(NumArgs);8960  if (Error Err = ImportContainerChecked(E->arguments(), ToArgs))8961     return std::move(Err);8962 8963  if (const auto *OCE = dyn_cast<CXXOperatorCallExpr>(E)) {8964    return CXXOperatorCallExpr::Create(8965        Importer.getToContext(), OCE->getOperator(), ToCallee, ToArgs, ToType,8966        OCE->getValueKind(), ToRParenLoc, OCE->getFPFeatures(),8967        OCE->getADLCallKind());8968  }8969 8970  return CallExpr::Create(Importer.getToContext(), ToCallee, ToArgs, ToType,8971                          E->getValueKind(), ToRParenLoc, E->getFPFeatures(),8972                          /*MinNumArgs=*/0, E->getADLCallKind());8973}8974 8975ExpectedStmt ASTNodeImporter::VisitLambdaExpr(LambdaExpr *E) {8976  CXXRecordDecl *FromClass = E->getLambdaClass();8977  auto ToClassOrErr = import(FromClass);8978  if (!ToClassOrErr)8979    return ToClassOrErr.takeError();8980  CXXRecordDecl *ToClass = *ToClassOrErr;8981 8982  auto ToCallOpOrErr = import(E->getCallOperator());8983  if (!ToCallOpOrErr)8984    return ToCallOpOrErr.takeError();8985 8986  SmallVector<Expr *, 8> ToCaptureInits(E->capture_size());8987  if (Error Err = ImportContainerChecked(E->capture_inits(), ToCaptureInits))8988    return std::move(Err);8989 8990  Error Err = Error::success();8991  auto ToIntroducerRange = importChecked(Err, E->getIntroducerRange());8992  auto ToCaptureDefaultLoc = importChecked(Err, E->getCaptureDefaultLoc());8993  auto ToEndLoc = importChecked(Err, E->getEndLoc());8994  if (Err)8995    return std::move(Err);8996 8997  return LambdaExpr::Create(Importer.getToContext(), ToClass, ToIntroducerRange,8998                            E->getCaptureDefault(), ToCaptureDefaultLoc,8999                            E->hasExplicitParameters(),9000                            E->hasExplicitResultType(), ToCaptureInits,9001                            ToEndLoc, E->containsUnexpandedParameterPack());9002}9003 9004 9005ExpectedStmt ASTNodeImporter::VisitInitListExpr(InitListExpr *E) {9006  Error Err = Error::success();9007  auto ToLBraceLoc = importChecked(Err, E->getLBraceLoc());9008  auto ToRBraceLoc = importChecked(Err, E->getRBraceLoc());9009  auto ToType = importChecked(Err, E->getType());9010  if (Err)9011    return std::move(Err);9012 9013  SmallVector<Expr *, 4> ToExprs(E->getNumInits());9014  if (Error Err = ImportContainerChecked(E->inits(), ToExprs))9015    return std::move(Err);9016 9017  ASTContext &ToCtx = Importer.getToContext();9018  InitListExpr *To = new (ToCtx) InitListExpr(9019      ToCtx, ToLBraceLoc, ToExprs, ToRBraceLoc);9020  To->setType(ToType);9021 9022  if (E->hasArrayFiller()) {9023    if (ExpectedExpr ToFillerOrErr = import(E->getArrayFiller()))9024      To->setArrayFiller(*ToFillerOrErr);9025    else9026      return ToFillerOrErr.takeError();9027  }9028 9029  if (FieldDecl *FromFD = E->getInitializedFieldInUnion()) {9030    if (auto ToFDOrErr = import(FromFD))9031      To->setInitializedFieldInUnion(*ToFDOrErr);9032    else9033      return ToFDOrErr.takeError();9034  }9035 9036  if (InitListExpr *SyntForm = E->getSyntacticForm()) {9037    if (auto ToSyntFormOrErr = import(SyntForm))9038      To->setSyntacticForm(*ToSyntFormOrErr);9039    else9040      return ToSyntFormOrErr.takeError();9041  }9042 9043  // Copy InitListExprBitfields, which are not handled in the ctor of9044  // InitListExpr.9045  To->sawArrayRangeDesignator(E->hadArrayRangeDesignator());9046 9047  return To;9048}9049 9050ExpectedStmt ASTNodeImporter::VisitCXXStdInitializerListExpr(9051    CXXStdInitializerListExpr *E) {9052  ExpectedType ToTypeOrErr = import(E->getType());9053  if (!ToTypeOrErr)9054    return ToTypeOrErr.takeError();9055 9056  ExpectedExpr ToSubExprOrErr = import(E->getSubExpr());9057  if (!ToSubExprOrErr)9058    return ToSubExprOrErr.takeError();9059 9060  return new (Importer.getToContext()) CXXStdInitializerListExpr(9061      *ToTypeOrErr, *ToSubExprOrErr);9062}9063 9064ExpectedStmt ASTNodeImporter::VisitCXXInheritedCtorInitExpr(9065    CXXInheritedCtorInitExpr *E) {9066  Error Err = Error::success();9067  auto ToLocation = importChecked(Err, E->getLocation());9068  auto ToType = importChecked(Err, E->getType());9069  auto ToConstructor = importChecked(Err, E->getConstructor());9070  if (Err)9071    return std::move(Err);9072 9073  return new (Importer.getToContext()) CXXInheritedCtorInitExpr(9074      ToLocation, ToType, ToConstructor, E->constructsVBase(),9075      E->inheritedFromVBase());9076}9077 9078ExpectedStmt ASTNodeImporter::VisitArrayInitLoopExpr(ArrayInitLoopExpr *E) {9079  Error Err = Error::success();9080  auto ToType = importChecked(Err, E->getType());9081  auto ToCommonExpr = importChecked(Err, E->getCommonExpr());9082  auto ToSubExpr = importChecked(Err, E->getSubExpr());9083  if (Err)9084    return std::move(Err);9085 9086  return new (Importer.getToContext()) ArrayInitLoopExpr(9087      ToType, ToCommonExpr, ToSubExpr);9088}9089 9090ExpectedStmt ASTNodeImporter::VisitArrayInitIndexExpr(ArrayInitIndexExpr *E) {9091  ExpectedType ToTypeOrErr = import(E->getType());9092  if (!ToTypeOrErr)9093    return ToTypeOrErr.takeError();9094  return new (Importer.getToContext()) ArrayInitIndexExpr(*ToTypeOrErr);9095}9096 9097ExpectedStmt ASTNodeImporter::VisitCXXDefaultInitExpr(CXXDefaultInitExpr *E) {9098  ExpectedSLoc ToBeginLocOrErr = import(E->getBeginLoc());9099  if (!ToBeginLocOrErr)9100    return ToBeginLocOrErr.takeError();9101 9102  auto ToFieldOrErr = import(E->getField());9103  if (!ToFieldOrErr)9104    return ToFieldOrErr.takeError();9105 9106  auto UsedContextOrErr = Importer.ImportContext(E->getUsedContext());9107  if (!UsedContextOrErr)9108    return UsedContextOrErr.takeError();9109 9110  FieldDecl *ToField = *ToFieldOrErr;9111  assert(ToField->hasInClassInitializer() &&9112         "Field should have in-class initializer if there is a default init "9113         "expression that uses it.");9114  if (!ToField->getInClassInitializer()) {9115    // The in-class initializer may be not yet set in "To" AST even if the9116    // field is already there. This must be set here to make construction of9117    // CXXDefaultInitExpr work.9118    auto ToInClassInitializerOrErr =9119        import(E->getField()->getInClassInitializer());9120    if (!ToInClassInitializerOrErr)9121      return ToInClassInitializerOrErr.takeError();9122    ToField->setInClassInitializer(*ToInClassInitializerOrErr);9123  }9124 9125  Expr *RewrittenInit = nullptr;9126  if (E->hasRewrittenInit()) {9127    ExpectedExpr ExprOrErr = import(E->getRewrittenExpr());9128    if (!ExprOrErr)9129      return ExprOrErr.takeError();9130    RewrittenInit = ExprOrErr.get();9131  }9132 9133  return CXXDefaultInitExpr::Create(Importer.getToContext(), *ToBeginLocOrErr,9134                                    ToField, *UsedContextOrErr, RewrittenInit);9135}9136 9137ExpectedStmt ASTNodeImporter::VisitCXXNamedCastExpr(CXXNamedCastExpr *E) {9138  Error Err = Error::success();9139  auto ToType = importChecked(Err, E->getType());9140  auto ToSubExpr = importChecked(Err, E->getSubExpr());9141  auto ToTypeInfoAsWritten = importChecked(Err, E->getTypeInfoAsWritten());9142  auto ToOperatorLoc = importChecked(Err, E->getOperatorLoc());9143  auto ToRParenLoc = importChecked(Err, E->getRParenLoc());9144  auto ToAngleBrackets = importChecked(Err, E->getAngleBrackets());9145  if (Err)9146    return std::move(Err);9147 9148  ExprValueKind VK = E->getValueKind();9149  CastKind CK = E->getCastKind();9150  auto ToBasePathOrErr = ImportCastPath(E);9151  if (!ToBasePathOrErr)9152    return ToBasePathOrErr.takeError();9153 9154  if (auto CCE = dyn_cast<CXXStaticCastExpr>(E)) {9155    return CXXStaticCastExpr::Create(9156        Importer.getToContext(), ToType, VK, CK, ToSubExpr, &(*ToBasePathOrErr),9157        ToTypeInfoAsWritten, CCE->getFPFeatures(), ToOperatorLoc, ToRParenLoc,9158        ToAngleBrackets);9159  } else if (isa<CXXDynamicCastExpr>(E)) {9160    return CXXDynamicCastExpr::Create(9161        Importer.getToContext(), ToType, VK, CK, ToSubExpr, &(*ToBasePathOrErr),9162        ToTypeInfoAsWritten, ToOperatorLoc, ToRParenLoc, ToAngleBrackets);9163  } else if (isa<CXXReinterpretCastExpr>(E)) {9164    return CXXReinterpretCastExpr::Create(9165        Importer.getToContext(), ToType, VK, CK, ToSubExpr, &(*ToBasePathOrErr),9166        ToTypeInfoAsWritten, ToOperatorLoc, ToRParenLoc, ToAngleBrackets);9167  } else if (isa<CXXConstCastExpr>(E)) {9168    return CXXConstCastExpr::Create(9169        Importer.getToContext(), ToType, VK, ToSubExpr, ToTypeInfoAsWritten,9170        ToOperatorLoc, ToRParenLoc, ToAngleBrackets);9171  } else {9172    llvm_unreachable("Unknown cast type");9173    return make_error<ASTImportError>();9174  }9175}9176 9177ExpectedStmt ASTNodeImporter::VisitSubstNonTypeTemplateParmExpr(9178    SubstNonTypeTemplateParmExpr *E) {9179  Error Err = Error::success();9180  auto ToType = importChecked(Err, E->getType());9181  auto ToNameLoc = importChecked(Err, E->getNameLoc());9182  auto ToAssociatedDecl = importChecked(Err, E->getAssociatedDecl());9183  auto ToReplacement = importChecked(Err, E->getReplacement());9184  if (Err)9185    return std::move(Err);9186 9187  return new (Importer.getToContext()) SubstNonTypeTemplateParmExpr(9188      ToType, E->getValueKind(), ToNameLoc, ToReplacement, ToAssociatedDecl,9189      E->getIndex(), E->getPackIndex(), E->isReferenceParameter(),9190      E->getFinal());9191}9192 9193ExpectedStmt ASTNodeImporter::VisitTypeTraitExpr(TypeTraitExpr *E) {9194  Error Err = Error::success();9195  auto ToType = importChecked(Err, E->getType());9196  auto ToBeginLoc = importChecked(Err, E->getBeginLoc());9197  auto ToEndLoc = importChecked(Err, E->getEndLoc());9198  if (Err)9199    return std::move(Err);9200 9201  SmallVector<TypeSourceInfo *, 4> ToArgs(E->getNumArgs());9202  if (Error Err = ImportContainerChecked(E->getArgs(), ToArgs))9203    return std::move(Err);9204 9205  if (E->isStoredAsBoolean()) {9206    // According to Sema::BuildTypeTrait(), if E is value-dependent,9207    // Value is always false.9208    bool ToValue = (E->isValueDependent() ? false : E->getBoolValue());9209    return TypeTraitExpr::Create(Importer.getToContext(), ToType, ToBeginLoc,9210                                 E->getTrait(), ToArgs, ToEndLoc, ToValue);9211  }9212  return TypeTraitExpr::Create(Importer.getToContext(), ToType, ToBeginLoc,9213                               E->getTrait(), ToArgs, ToEndLoc,9214                               E->getAPValue());9215}9216 9217ExpectedStmt ASTNodeImporter::VisitCXXTypeidExpr(CXXTypeidExpr *E) {9218  ExpectedType ToTypeOrErr = import(E->getType());9219  if (!ToTypeOrErr)9220    return ToTypeOrErr.takeError();9221 9222  auto ToSourceRangeOrErr = import(E->getSourceRange());9223  if (!ToSourceRangeOrErr)9224    return ToSourceRangeOrErr.takeError();9225 9226  if (E->isTypeOperand()) {9227    if (auto ToTSIOrErr = import(E->getTypeOperandSourceInfo()))9228      return new (Importer.getToContext()) CXXTypeidExpr(9229          *ToTypeOrErr, *ToTSIOrErr, *ToSourceRangeOrErr);9230    else9231      return ToTSIOrErr.takeError();9232  }9233 9234  ExpectedExpr ToExprOperandOrErr = import(E->getExprOperand());9235  if (!ToExprOperandOrErr)9236    return ToExprOperandOrErr.takeError();9237 9238  return new (Importer.getToContext()) CXXTypeidExpr(9239      *ToTypeOrErr, *ToExprOperandOrErr, *ToSourceRangeOrErr);9240}9241 9242ExpectedStmt ASTNodeImporter::VisitCXXFoldExpr(CXXFoldExpr *E) {9243  Error Err = Error::success();9244 9245  QualType ToType = importChecked(Err, E->getType());9246  UnresolvedLookupExpr *ToCallee = importChecked(Err, E->getCallee());9247  SourceLocation ToLParenLoc = importChecked(Err, E->getLParenLoc());9248  Expr *ToLHS = importChecked(Err, E->getLHS());9249  SourceLocation ToEllipsisLoc = importChecked(Err, E->getEllipsisLoc());9250  Expr *ToRHS = importChecked(Err, E->getRHS());9251  SourceLocation ToRParenLoc = importChecked(Err, E->getRParenLoc());9252 9253  if (Err)9254    return std::move(Err);9255 9256  return new (Importer.getToContext())9257      CXXFoldExpr(ToType, ToCallee, ToLParenLoc, ToLHS, E->getOperator(),9258                  ToEllipsisLoc, ToRHS, ToRParenLoc, E->getNumExpansions());9259}9260 9261ExpectedStmt ASTNodeImporter::VisitRequiresExpr(RequiresExpr *E) {9262  Error Err = Error::success();9263  auto RequiresKWLoc = importChecked(Err, E->getRequiresKWLoc());9264  auto RParenLoc = importChecked(Err, E->getRParenLoc());9265  auto RBraceLoc = importChecked(Err, E->getRBraceLoc());9266 9267  auto Body = importChecked(Err, E->getBody());9268  auto LParenLoc = importChecked(Err, E->getLParenLoc());9269  if (Err)9270    return std::move(Err);9271  SmallVector<ParmVarDecl *, 4> LocalParameters(E->getLocalParameters().size());9272  if (Error Err =9273          ImportArrayChecked(E->getLocalParameters(), LocalParameters.begin()))9274    return std::move(Err);9275  SmallVector<concepts::Requirement *, 4> Requirements(9276      E->getRequirements().size());9277  if (Error Err =9278          ImportArrayChecked(E->getRequirements(), Requirements.begin()))9279    return std::move(Err);9280  return RequiresExpr::Create(Importer.getToContext(), RequiresKWLoc, Body,9281                              LParenLoc, LocalParameters, RParenLoc,9282                              Requirements, RBraceLoc);9283}9284 9285ExpectedStmt9286ASTNodeImporter::VisitConceptSpecializationExpr(ConceptSpecializationExpr *E) {9287  Error Err = Error::success();9288  auto CL = importChecked(Err, E->getConceptReference());9289  auto CSD = importChecked(Err, E->getSpecializationDecl());9290  if (Err)9291    return std::move(Err);9292  if (E->isValueDependent())9293    return ConceptSpecializationExpr::Create(9294        Importer.getToContext(), CL,9295        const_cast<ImplicitConceptSpecializationDecl *>(CSD), nullptr);9296  ConstraintSatisfaction Satisfaction;9297  if (Error Err =9298          ImportConstraintSatisfaction(E->getSatisfaction(), Satisfaction))9299    return std::move(Err);9300  return ConceptSpecializationExpr::Create(9301      Importer.getToContext(), CL,9302      const_cast<ImplicitConceptSpecializationDecl *>(CSD), &Satisfaction);9303}9304 9305ExpectedStmt ASTNodeImporter::VisitSubstNonTypeTemplateParmPackExpr(9306    SubstNonTypeTemplateParmPackExpr *E) {9307  Error Err = Error::success();9308  auto ToType = importChecked(Err, E->getType());9309  auto ToPackLoc = importChecked(Err, E->getParameterPackLocation());9310  auto ToArgPack = importChecked(Err, E->getArgumentPack());9311  auto ToAssociatedDecl = importChecked(Err, E->getAssociatedDecl());9312  if (Err)9313    return std::move(Err);9314 9315  return new (Importer.getToContext()) SubstNonTypeTemplateParmPackExpr(9316      ToType, E->getValueKind(), ToPackLoc, ToArgPack, ToAssociatedDecl,9317      E->getIndex(), E->getFinal());9318}9319 9320ExpectedStmt ASTNodeImporter::VisitPseudoObjectExpr(PseudoObjectExpr *E) {9321  SmallVector<Expr *, 4> ToSemantics(E->getNumSemanticExprs());9322  if (Error Err = ImportContainerChecked(E->semantics(), ToSemantics))9323    return std::move(Err);9324  auto ToSyntOrErr = import(E->getSyntacticForm());9325  if (!ToSyntOrErr)9326    return ToSyntOrErr.takeError();9327  return PseudoObjectExpr::Create(Importer.getToContext(), *ToSyntOrErr,9328                                  ToSemantics, E->getResultExprIndex());9329}9330 9331ExpectedStmt9332ASTNodeImporter::VisitCXXParenListInitExpr(CXXParenListInitExpr *E) {9333  Error Err = Error::success();9334  auto ToType = importChecked(Err, E->getType());9335  auto ToInitLoc = importChecked(Err, E->getInitLoc());9336  auto ToBeginLoc = importChecked(Err, E->getBeginLoc());9337  auto ToEndLoc = importChecked(Err, E->getEndLoc());9338  if (Err)9339    return std::move(Err);9340 9341  SmallVector<Expr *, 4> ToArgs(E->getInitExprs().size());9342  if (Error Err = ImportContainerChecked(E->getInitExprs(), ToArgs))9343    return std::move(Err);9344  return CXXParenListInitExpr::Create(Importer.getToContext(), ToArgs, ToType,9345                                      E->getUserSpecifiedInitExprs().size(),9346                                      ToInitLoc, ToBeginLoc, ToEndLoc);9347}9348 9349Error ASTNodeImporter::ImportOverriddenMethods(CXXMethodDecl *ToMethod,9350                                               CXXMethodDecl *FromMethod) {9351  Error ImportErrors = Error::success();9352  for (auto *FromOverriddenMethod : FromMethod->overridden_methods()) {9353    if (auto ImportedOrErr = import(FromOverriddenMethod))9354      ToMethod->getCanonicalDecl()->addOverriddenMethod(cast<CXXMethodDecl>(9355          (*ImportedOrErr)->getCanonicalDecl()));9356    else9357      ImportErrors =9358          joinErrors(std::move(ImportErrors), ImportedOrErr.takeError());9359  }9360  return ImportErrors;9361}9362 9363ASTImporter::ASTImporter(ASTContext &ToContext, FileManager &ToFileManager,9364                         ASTContext &FromContext, FileManager &FromFileManager,9365                         bool MinimalImport,9366                         std::shared_ptr<ASTImporterSharedState> SharedState)9367    : SharedState(SharedState), ToContext(ToContext), FromContext(FromContext),9368      ToFileManager(ToFileManager), FromFileManager(FromFileManager),9369      Minimal(MinimalImport), ODRHandling(ODRHandlingType::Conservative) {9370 9371  // Create a default state without the lookup table: LLDB case.9372  if (!SharedState) {9373    this->SharedState = std::make_shared<ASTImporterSharedState>();9374  }9375 9376  ImportedDecls[FromContext.getTranslationUnitDecl()] =9377      ToContext.getTranslationUnitDecl();9378}9379 9380ASTImporter::~ASTImporter() = default;9381 9382UnsignedOrNone ASTImporter::getFieldIndex(Decl *F) {9383  assert(F && (isa<FieldDecl>(*F) || isa<IndirectFieldDecl>(*F)) &&9384      "Try to get field index for non-field.");9385 9386  auto *Owner = dyn_cast<RecordDecl>(F->getDeclContext());9387  if (!Owner)9388    return std::nullopt;9389 9390  unsigned Index = 0;9391  for (const auto *D : Owner->decls()) {9392    if (D == F)9393      return Index;9394 9395    if (isa<FieldDecl>(*D) || isa<IndirectFieldDecl>(*D))9396      ++Index;9397  }9398 9399  llvm_unreachable("Field was not found in its parent context.");9400 9401  return std::nullopt;9402}9403 9404ASTImporter::FoundDeclsTy9405ASTImporter::findDeclsInToCtx(DeclContext *DC, DeclarationName Name) {9406  // We search in the redecl context because of transparent contexts.9407  // E.g. a simple C language enum is a transparent context:9408  //   enum E { A, B };9409  // Now if we had a global variable in the TU9410  //   int A;9411  // then the enum constant 'A' and the variable 'A' violates ODR.9412  // We can diagnose this only if we search in the redecl context.9413  DeclContext *ReDC = DC->getRedeclContext();9414  if (SharedState->getLookupTable()) {9415    if (ReDC->isNamespace()) {9416      // Namespaces can be reopened.9417      // Lookup table does not handle this, we must search here in all linked9418      // namespaces.9419      FoundDeclsTy Result;9420      SmallVector<Decl *, 2> NSChain =9421          getCanonicalForwardRedeclChain<NamespaceDecl>(9422              dyn_cast<NamespaceDecl>(ReDC));9423      for (auto *D : NSChain) {9424        ASTImporterLookupTable::LookupResult LookupResult =9425            SharedState->getLookupTable()->lookup(dyn_cast<NamespaceDecl>(D),9426                                                  Name);9427        Result.append(LookupResult.begin(), LookupResult.end());9428      }9429      return Result;9430    } else {9431      ASTImporterLookupTable::LookupResult LookupResult =9432          SharedState->getLookupTable()->lookup(ReDC, Name);9433      return FoundDeclsTy(LookupResult.begin(), LookupResult.end());9434    }9435  } else {9436    DeclContext::lookup_result NoloadLookupResult = ReDC->noload_lookup(Name);9437    FoundDeclsTy Result(NoloadLookupResult.begin(), NoloadLookupResult.end());9438    // We must search by the slow case of localUncachedLookup because that is9439    // working even if there is no LookupPtr for the DC. We could use9440    // DC::buildLookup() to create the LookupPtr, but that would load external9441    // decls again, we must avoid that case.9442    // Also, even if we had the LookupPtr, we must find Decls which are not9443    // in the LookupPtr, so we need the slow case.9444    // These cases are handled in ASTImporterLookupTable, but we cannot use9445    // that with LLDB since that traverses through the AST which initiates the9446    // load of external decls again via DC::decls().  And again, we must avoid9447    // loading external decls during the import.9448    if (Result.empty())9449      ReDC->localUncachedLookup(Name, Result);9450    return Result;9451  }9452}9453 9454void ASTImporter::AddToLookupTable(Decl *ToD) {9455  SharedState->addDeclToLookup(ToD);9456}9457 9458Expected<Decl *> ASTImporter::ImportImpl(Decl *FromD) {9459  // Import the decl using ASTNodeImporter.9460  ASTNodeImporter Importer(*this);9461  return Importer.Visit(FromD);9462}9463 9464void ASTImporter::RegisterImportedDecl(Decl *FromD, Decl *ToD) {9465  MapImported(FromD, ToD);9466}9467 9468llvm::Expected<ExprWithCleanups::CleanupObject>9469ASTImporter::Import(ExprWithCleanups::CleanupObject From) {9470  if (auto *CLE = From.dyn_cast<CompoundLiteralExpr *>()) {9471    if (Expected<Expr *> R = Import(CLE))9472      return ExprWithCleanups::CleanupObject(cast<CompoundLiteralExpr>(*R));9473  }9474 9475  // FIXME: Handle BlockDecl when we implement importing BlockExpr in9476  //        ASTNodeImporter.9477  return make_error<ASTImportError>(ASTImportError::UnsupportedConstruct);9478}9479 9480ExpectedTypePtr ASTImporter::Import(const Type *FromT) {9481  if (!FromT)9482    return FromT;9483 9484  // Check whether we've already imported this type.9485  llvm::DenseMap<const Type *, const Type *>::iterator Pos =9486      ImportedTypes.find(FromT);9487  if (Pos != ImportedTypes.end())9488    return Pos->second;9489 9490  // Import the type.9491  ASTNodeImporter Importer(*this);9492  ExpectedType ToTOrErr = Importer.Visit(FromT);9493  if (!ToTOrErr)9494    return ToTOrErr.takeError();9495 9496  // Record the imported type.9497  ImportedTypes[FromT] = ToTOrErr->getTypePtr();9498 9499  return ToTOrErr->getTypePtr();9500}9501 9502Expected<QualType> ASTImporter::Import(QualType FromT) {9503  if (FromT.isNull())9504    return QualType{};9505 9506  ExpectedTypePtr ToTyOrErr = Import(FromT.getTypePtr());9507  if (!ToTyOrErr)9508    return ToTyOrErr.takeError();9509 9510  return ToContext.getQualifiedType(*ToTyOrErr, FromT.getLocalQualifiers());9511}9512 9513Expected<TypeSourceInfo *> ASTImporter::Import(TypeSourceInfo *FromTSI) {9514  if (!FromTSI)9515    return FromTSI;9516 9517  // FIXME: For now we just create a "trivial" type source info based9518  // on the type and a single location. Implement a real version of this.9519  ExpectedType TOrErr = Import(FromTSI->getType());9520  if (!TOrErr)9521    return TOrErr.takeError();9522  ExpectedSLoc BeginLocOrErr = Import(FromTSI->getTypeLoc().getBeginLoc());9523  if (!BeginLocOrErr)9524    return BeginLocOrErr.takeError();9525 9526  return ToContext.getTrivialTypeSourceInfo(*TOrErr, *BeginLocOrErr);9527}9528 9529namespace {9530// To use this object, it should be created before the new attribute is created,9531// and destructed after it is created. The construction already performs the9532// import of the data.9533template <typename T> struct AttrArgImporter {9534  AttrArgImporter(const AttrArgImporter<T> &) = delete;9535  AttrArgImporter(AttrArgImporter<T> &&) = default;9536  AttrArgImporter<T> &operator=(const AttrArgImporter<T> &) = delete;9537  AttrArgImporter<T> &operator=(AttrArgImporter<T> &&) = default;9538 9539  AttrArgImporter(ASTNodeImporter &I, Error &Err, const T &From)9540      : To(I.importChecked(Err, From)) {}9541 9542  const T &value() { return To; }9543 9544private:9545  T To;9546};9547 9548// To use this object, it should be created before the new attribute is created,9549// and destructed after it is created. The construction already performs the9550// import of the data. The array data is accessible in a pointer form, this form9551// is used by the attribute classes. This object should be created once for the9552// array data to be imported (the array size is not imported, just copied).9553template <typename T> struct AttrArgArrayImporter {9554  AttrArgArrayImporter(const AttrArgArrayImporter<T> &) = delete;9555  AttrArgArrayImporter(AttrArgArrayImporter<T> &&) = default;9556  AttrArgArrayImporter<T> &operator=(const AttrArgArrayImporter<T> &) = delete;9557  AttrArgArrayImporter<T> &operator=(AttrArgArrayImporter<T> &&) = default;9558 9559  AttrArgArrayImporter(ASTNodeImporter &I, Error &Err,9560                       const llvm::iterator_range<T *> &From,9561                       unsigned ArraySize) {9562    if (Err)9563      return;9564    To.reserve(ArraySize);9565    Err = I.ImportContainerChecked(From, To);9566  }9567 9568  T *value() { return To.data(); }9569 9570private:9571  llvm::SmallVector<T, 2> To;9572};9573 9574class AttrImporter {9575  Error Err{Error::success()};9576  Attr *ToAttr = nullptr;9577  ASTImporter &Importer;9578  ASTNodeImporter NImporter;9579 9580public:9581  AttrImporter(ASTImporter &I) : Importer(I), NImporter(I) {}9582 9583  // Useful for accessing the imported attribute.9584  template <typename T> T *castAttrAs() { return cast<T>(ToAttr); }9585  template <typename T> const T *castAttrAs() const { return cast<T>(ToAttr); }9586 9587  // Create an "importer" for an attribute parameter.9588  // Result of the 'value()' of that object is to be passed to the function9589  // 'importAttr', in the order that is expected by the attribute class.9590  template <class T> AttrArgImporter<T> importArg(const T &From) {9591    return AttrArgImporter<T>(NImporter, Err, From);9592  }9593 9594  // Create an "importer" for an attribute parameter that has array type.9595  // Result of the 'value()' of that object is to be passed to the function9596  // 'importAttr', then the size of the array as next argument.9597  template <typename T>9598  AttrArgArrayImporter<T> importArrayArg(const llvm::iterator_range<T *> &From,9599                                         unsigned ArraySize) {9600    return AttrArgArrayImporter<T>(NImporter, Err, From, ArraySize);9601  }9602 9603  // Create an attribute object with the specified arguments.9604  // The 'FromAttr' is the original (not imported) attribute, the 'ImportedArg'9605  // should be values that are passed to the 'Create' function of the attribute.9606  // (The 'Create' with 'ASTContext' first and 'AttributeCommonInfo' last is9607  // used here.) As much data is copied or imported from the old attribute9608  // as possible. The passed arguments should be already imported.9609  // If an import error happens, the internal error is set to it, and any9610  // further import attempt is ignored.9611  template <typename T, typename... Arg>9612  void importAttr(const T *FromAttr, Arg &&...ImportedArg) {9613    static_assert(std::is_base_of<Attr, T>::value,9614                  "T should be subclass of Attr.");9615    assert(!ToAttr && "Use one AttrImporter to import one Attribute object.");9616 9617    const IdentifierInfo *ToAttrName = Importer.Import(FromAttr->getAttrName());9618    const IdentifierInfo *ToScopeName =9619        Importer.Import(FromAttr->getScopeName());9620    SourceRange ToAttrRange =9621        NImporter.importChecked(Err, FromAttr->getRange());9622    SourceLocation ToScopeLoc =9623        NImporter.importChecked(Err, FromAttr->getScopeLoc());9624 9625    if (Err)9626      return;9627 9628    AttributeCommonInfo ToI(9629        ToAttrName, AttributeScopeInfo(ToScopeName, ToScopeLoc), ToAttrRange,9630        FromAttr->getParsedKind(), FromAttr->getForm());9631    // The "SemanticSpelling" is not needed to be passed to the constructor.9632    // That value is recalculated from the SpellingListIndex if needed.9633    ToAttr = T::Create(Importer.getToContext(),9634                       std::forward<Arg>(ImportedArg)..., ToI);9635 9636    ToAttr->setImplicit(FromAttr->isImplicit());9637    ToAttr->setPackExpansion(FromAttr->isPackExpansion());9638    if (auto *ToInheritableAttr = dyn_cast<InheritableAttr>(ToAttr))9639      ToInheritableAttr->setInherited(FromAttr->isInherited());9640  }9641 9642  // Create a clone of the 'FromAttr' and import its source range only.9643  // This causes objects with invalid references to be created if the 'FromAttr'9644  // contains other data that should be imported.9645  void cloneAttr(const Attr *FromAttr) {9646    assert(!ToAttr && "Use one AttrImporter to import one Attribute object.");9647 9648    SourceRange ToRange = NImporter.importChecked(Err, FromAttr->getRange());9649    if (Err)9650      return;9651 9652    ToAttr = FromAttr->clone(Importer.getToContext());9653    ToAttr->setRange(ToRange);9654    ToAttr->setAttrName(Importer.Import(FromAttr->getAttrName()));9655  }9656 9657  // Get the result of the previous import attempt (can be used only once).9658  llvm::Expected<Attr *> getResult() && {9659    if (Err)9660      return std::move(Err);9661    assert(ToAttr && "Attribute should be created.");9662    return ToAttr;9663  }9664};9665} // namespace9666 9667Expected<Attr *> ASTImporter::Import(const Attr *FromAttr) {9668  AttrImporter AI(*this);9669 9670  // FIXME: Is there some kind of AttrVisitor to use here?9671  switch (FromAttr->getKind()) {9672  case attr::Aligned: {9673    auto *From = cast<AlignedAttr>(FromAttr);9674    if (From->isAlignmentExpr())9675      AI.importAttr(From, true, AI.importArg(From->getAlignmentExpr()).value());9676    else9677      AI.importAttr(From, false,9678                    AI.importArg(From->getAlignmentType()).value());9679    break;9680  }9681 9682  case attr::AlignValue: {9683    auto *From = cast<AlignValueAttr>(FromAttr);9684    AI.importAttr(From, AI.importArg(From->getAlignment()).value());9685    break;9686  }9687 9688  case attr::Format: {9689    const auto *From = cast<FormatAttr>(FromAttr);9690    AI.importAttr(From, Import(From->getType()), From->getFormatIdx(),9691                  From->getFirstArg());9692    break;9693  }9694 9695  case attr::EnableIf: {9696    const auto *From = cast<EnableIfAttr>(FromAttr);9697    AI.importAttr(From, AI.importArg(From->getCond()).value(),9698                  From->getMessage());9699    break;9700  }9701 9702  case attr::AssertCapability: {9703    const auto *From = cast<AssertCapabilityAttr>(FromAttr);9704    AI.importAttr(From,9705                  AI.importArrayArg(From->args(), From->args_size()).value(),9706                  From->args_size());9707    break;9708  }9709  case attr::AcquireCapability: {9710    const auto *From = cast<AcquireCapabilityAttr>(FromAttr);9711    AI.importAttr(From,9712                  AI.importArrayArg(From->args(), From->args_size()).value(),9713                  From->args_size());9714    break;9715  }9716  case attr::TryAcquireCapability: {9717    const auto *From = cast<TryAcquireCapabilityAttr>(FromAttr);9718    AI.importAttr(From, AI.importArg(From->getSuccessValue()).value(),9719                  AI.importArrayArg(From->args(), From->args_size()).value(),9720                  From->args_size());9721    break;9722  }9723  case attr::ReleaseCapability: {9724    const auto *From = cast<ReleaseCapabilityAttr>(FromAttr);9725    AI.importAttr(From,9726                  AI.importArrayArg(From->args(), From->args_size()).value(),9727                  From->args_size());9728    break;9729  }9730  case attr::RequiresCapability: {9731    const auto *From = cast<RequiresCapabilityAttr>(FromAttr);9732    AI.importAttr(From,9733                  AI.importArrayArg(From->args(), From->args_size()).value(),9734                  From->args_size());9735    break;9736  }9737  case attr::GuardedBy: {9738    const auto *From = cast<GuardedByAttr>(FromAttr);9739    AI.importAttr(From, AI.importArg(From->getArg()).value());9740    break;9741  }9742  case attr::PtGuardedBy: {9743    const auto *From = cast<PtGuardedByAttr>(FromAttr);9744    AI.importAttr(From, AI.importArg(From->getArg()).value());9745    break;9746  }9747  case attr::AcquiredAfter: {9748    const auto *From = cast<AcquiredAfterAttr>(FromAttr);9749    AI.importAttr(From,9750                  AI.importArrayArg(From->args(), From->args_size()).value(),9751                  From->args_size());9752    break;9753  }9754  case attr::AcquiredBefore: {9755    const auto *From = cast<AcquiredBeforeAttr>(FromAttr);9756    AI.importAttr(From,9757                  AI.importArrayArg(From->args(), From->args_size()).value(),9758                  From->args_size());9759    break;9760  }9761  case attr::LockReturned: {9762    const auto *From = cast<LockReturnedAttr>(FromAttr);9763    AI.importAttr(From, AI.importArg(From->getArg()).value());9764    break;9765  }9766  case attr::LocksExcluded: {9767    const auto *From = cast<LocksExcludedAttr>(FromAttr);9768    AI.importAttr(From,9769                  AI.importArrayArg(From->args(), From->args_size()).value(),9770                  From->args_size());9771    break;9772  }9773  default: {9774    // The default branch works for attributes that have no arguments to import.9775    // FIXME: Handle every attribute type that has arguments of type to import9776    // (most often Expr* or Decl* or type) in the switch above.9777    AI.cloneAttr(FromAttr);9778    break;9779  }9780  }9781 9782  return std::move(AI).getResult();9783}9784 9785Decl *ASTImporter::GetAlreadyImportedOrNull(const Decl *FromD) const {9786  return ImportedDecls.lookup(FromD);9787}9788 9789TranslationUnitDecl *ASTImporter::GetFromTU(Decl *ToD) {9790  auto FromDPos = ImportedFromDecls.find(ToD);9791  if (FromDPos == ImportedFromDecls.end())9792    return nullptr;9793  return FromDPos->second->getTranslationUnitDecl();9794}9795 9796Expected<Decl *> ASTImporter::Import(Decl *FromD) {9797  if (!FromD)9798    return nullptr;9799 9800  // Push FromD to the stack, and remove that when we return.9801  ImportPath.push(FromD);9802  auto ImportPathBuilder =9803      llvm::make_scope_exit([this]() { ImportPath.pop(); });9804 9805  // Check whether there was a previous failed import.9806  // If yes return the existing error.9807  if (auto Error = getImportDeclErrorIfAny(FromD))9808    return make_error<ASTImportError>(*Error);9809 9810  // Check whether we've already imported this declaration.9811  Decl *ToD = GetAlreadyImportedOrNull(FromD);9812  if (ToD) {9813    // Already imported (possibly from another TU) and with an error.9814    if (auto Error = SharedState->getImportDeclErrorIfAny(ToD)) {9815      setImportDeclError(FromD, *Error);9816      return make_error<ASTImportError>(*Error);9817    }9818 9819    // If FromD has some updated flags after last import, apply it.9820    updateFlags(FromD, ToD);9821    // If we encounter a cycle during an import then we save the relevant part9822    // of the import path associated to the Decl.9823    if (ImportPath.hasCycleAtBack())9824      SavedImportPaths[FromD].push_back(ImportPath.copyCycleAtBack());9825    return ToD;9826  }9827 9828  // Import the declaration.9829  ExpectedDecl ToDOrErr = ImportImpl(FromD);9830  if (!ToDOrErr) {9831    // Failed to import.9832 9833    auto Pos = ImportedDecls.find(FromD);9834    if (Pos != ImportedDecls.end()) {9835      // Import failed after the object was created.9836      // Remove all references to it.9837      auto *ToD = Pos->second;9838      ImportedDecls.erase(Pos);9839 9840      // ImportedDecls and ImportedFromDecls are not symmetric.  It may happen9841      // (e.g. with namespaces) that several decls from the 'from' context are9842      // mapped to the same decl in the 'to' context.  If we removed entries9843      // from the LookupTable here then we may end up removing them multiple9844      // times.9845 9846      // The Lookuptable contains decls only which are in the 'to' context.9847      // Remove from the Lookuptable only if it is *imported* into the 'to'9848      // context (and do not remove it if it was added during the initial9849      // traverse of the 'to' context).9850      auto PosF = ImportedFromDecls.find(ToD);9851      if (PosF != ImportedFromDecls.end()) {9852        // In the case of TypedefNameDecl we create the Decl first and only9853        // then we import and set its DeclContext. So, the DC might not be set9854        // when we reach here.9855        if (ToD->getDeclContext())9856          SharedState->removeDeclFromLookup(ToD);9857        ImportedFromDecls.erase(PosF);9858      }9859 9860      // FIXME: AST may contain remaining references to the failed object.9861      // However, the ImportDeclErrors in the shared state contains all the9862      // failed objects together with their error.9863    }9864 9865    // Error encountered for the first time.9866    // After takeError the error is not usable any more in ToDOrErr.9867    // Get a copy of the error object (any more simple solution for this?).9868    ASTImportError ErrOut;9869    handleAllErrors(ToDOrErr.takeError(),9870                    [&ErrOut](const ASTImportError &E) { ErrOut = E; });9871    setImportDeclError(FromD, ErrOut);9872    // Set the error for the mapped to Decl, which is in the "to" context.9873    if (Pos != ImportedDecls.end())9874      SharedState->setImportDeclError(Pos->second, ErrOut);9875 9876    // Set the error for all nodes which have been created before we9877    // recognized the error.9878    for (const auto &Path : SavedImportPaths[FromD]) {9879      // The import path contains import-dependency nodes first.9880      // Save the node that was imported as dependency of the current node.9881      Decl *PrevFromDi = FromD;9882      for (Decl *FromDi : Path) {9883        // Begin and end of the path equals 'FromD', skip it.9884        if (FromDi == FromD)9885          continue;9886        // We should not set import error on a node and all following nodes in9887        // the path if child import errors are ignored.9888        if (ChildErrorHandlingStrategy(FromDi).ignoreChildErrorOnParent(9889                PrevFromDi))9890          break;9891        PrevFromDi = FromDi;9892        setImportDeclError(FromDi, ErrOut);9893        //FIXME Should we remove these Decls from ImportedDecls?9894        // Set the error for the mapped to Decl, which is in the "to" context.9895        auto Ii = ImportedDecls.find(FromDi);9896        if (Ii != ImportedDecls.end())9897          SharedState->setImportDeclError(Ii->second, ErrOut);9898          // FIXME Should we remove these Decls from the LookupTable,9899          // and from ImportedFromDecls?9900      }9901    }9902    SavedImportPaths.erase(FromD);9903 9904    // Do not return ToDOrErr, error was taken out of it.9905    return make_error<ASTImportError>(ErrOut);9906  }9907 9908  ToD = *ToDOrErr;9909 9910  // FIXME: Handle the "already imported with error" case. We can get here9911  // nullptr only if GetImportedOrCreateDecl returned nullptr (after a9912  // previously failed create was requested).9913  // Later GetImportedOrCreateDecl can be updated to return the error.9914  if (!ToD) {9915    auto Err = getImportDeclErrorIfAny(FromD);9916    assert(Err);9917    return make_error<ASTImportError>(*Err);9918  }9919 9920  // We could import from the current TU without error.  But previously we9921  // already had imported a Decl as `ToD` from another TU (with another9922  // ASTImporter object) and with an error.9923  if (auto Error = SharedState->getImportDeclErrorIfAny(ToD)) {9924    setImportDeclError(FromD, *Error);9925    return make_error<ASTImportError>(*Error);9926  }9927  // Make sure that ImportImpl registered the imported decl.9928  assert(ImportedDecls.count(FromD) != 0 && "Missing call to MapImported?");9929 9930  if (FromD->hasAttrs())9931    for (const Attr *FromAttr : FromD->getAttrs()) {9932      auto ToAttrOrErr = Import(FromAttr);9933      if (ToAttrOrErr)9934        ToD->addAttr(*ToAttrOrErr);9935      else9936        return ToAttrOrErr.takeError();9937    }9938 9939  // Notify subclasses.9940  Imported(FromD, ToD);9941 9942  updateFlags(FromD, ToD);9943  SavedImportPaths.erase(FromD);9944  return ToDOrErr;9945}9946 9947llvm::Expected<InheritedConstructor>9948ASTImporter::Import(const InheritedConstructor &From) {9949  return ASTNodeImporter(*this).ImportInheritedConstructor(From);9950}9951 9952Expected<DeclContext *> ASTImporter::ImportContext(DeclContext *FromDC) {9953  if (!FromDC)9954    return FromDC;9955 9956  ExpectedDecl ToDCOrErr = Import(cast<Decl>(FromDC));9957  if (!ToDCOrErr)9958    return ToDCOrErr.takeError();9959  auto *ToDC = cast<DeclContext>(*ToDCOrErr);9960 9961  // When we're using a record/enum/Objective-C class/protocol as a context, we9962  // need it to have a definition.9963  if (auto *ToRecord = dyn_cast<RecordDecl>(ToDC)) {9964    auto *FromRecord = cast<RecordDecl>(FromDC);9965    if (ToRecord->isCompleteDefinition())9966      return ToDC;9967 9968    // If FromRecord is not defined we need to force it to be.9969    // Simply calling CompleteDecl(...) for a RecordDecl will break some cases9970    // it will start the definition but we never finish it.9971    // If there are base classes they won't be imported and we will9972    // be missing anything that we inherit from those bases.9973    if (FromRecord->getASTContext().getExternalSource() &&9974        !FromRecord->isCompleteDefinition())9975      FromRecord->getASTContext().getExternalSource()->CompleteType(FromRecord);9976 9977    if (FromRecord->isCompleteDefinition())9978      if (Error Err = ASTNodeImporter(*this).ImportDefinition(9979          FromRecord, ToRecord, ASTNodeImporter::IDK_Basic))9980        return std::move(Err);9981  } else if (auto *ToEnum = dyn_cast<EnumDecl>(ToDC)) {9982    auto *FromEnum = cast<EnumDecl>(FromDC);9983    if (ToEnum->isCompleteDefinition()) {9984      // Do nothing.9985    } else if (FromEnum->isCompleteDefinition()) {9986      if (Error Err = ASTNodeImporter(*this).ImportDefinition(9987          FromEnum, ToEnum, ASTNodeImporter::IDK_Basic))9988        return std::move(Err);9989    } else {9990      CompleteDecl(ToEnum);9991    }9992  } else if (auto *ToClass = dyn_cast<ObjCInterfaceDecl>(ToDC)) {9993    auto *FromClass = cast<ObjCInterfaceDecl>(FromDC);9994    if (ToClass->getDefinition()) {9995      // Do nothing.9996    } else if (ObjCInterfaceDecl *FromDef = FromClass->getDefinition()) {9997      if (Error Err = ASTNodeImporter(*this).ImportDefinition(9998          FromDef, ToClass, ASTNodeImporter::IDK_Basic))9999        return std::move(Err);10000    } else {10001      CompleteDecl(ToClass);10002    }10003  } else if (auto *ToProto = dyn_cast<ObjCProtocolDecl>(ToDC)) {10004    auto *FromProto = cast<ObjCProtocolDecl>(FromDC);10005    if (ToProto->getDefinition()) {10006      // Do nothing.10007    } else if (ObjCProtocolDecl *FromDef = FromProto->getDefinition()) {10008      if (Error Err = ASTNodeImporter(*this).ImportDefinition(10009          FromDef, ToProto, ASTNodeImporter::IDK_Basic))10010        return std::move(Err);10011    } else {10012      CompleteDecl(ToProto);10013    }10014  }10015 10016  return ToDC;10017}10018 10019Expected<Expr *> ASTImporter::Import(Expr *FromE) {10020  if (ExpectedStmt ToSOrErr = Import(cast_or_null<Stmt>(FromE)))10021    return cast_or_null<Expr>(*ToSOrErr);10022  else10023    return ToSOrErr.takeError();10024}10025 10026Expected<Stmt *> ASTImporter::Import(Stmt *FromS) {10027  if (!FromS)10028    return nullptr;10029 10030  // Check whether we've already imported this statement.10031  llvm::DenseMap<Stmt *, Stmt *>::iterator Pos = ImportedStmts.find(FromS);10032  if (Pos != ImportedStmts.end())10033    return Pos->second;10034 10035  // Import the statement.10036  ASTNodeImporter Importer(*this);10037  ExpectedStmt ToSOrErr = Importer.Visit(FromS);10038  if (!ToSOrErr)10039    return ToSOrErr;10040 10041  if (auto *ToE = dyn_cast<Expr>(*ToSOrErr)) {10042    auto *FromE = cast<Expr>(FromS);10043    // Copy ExprBitfields, which may not be handled in Expr subclasses10044    // constructors.10045    ToE->setValueKind(FromE->getValueKind());10046    ToE->setObjectKind(FromE->getObjectKind());10047    ToE->setDependence(FromE->getDependence());10048  }10049 10050  // Record the imported statement object.10051  ImportedStmts[FromS] = *ToSOrErr;10052  return ToSOrErr;10053}10054 10055Expected<NestedNameSpecifier> ASTImporter::Import(NestedNameSpecifier FromNNS) {10056  switch (FromNNS.getKind()) {10057  case NestedNameSpecifier::Kind::Null:10058  case NestedNameSpecifier::Kind::Global:10059    return FromNNS;10060  case NestedNameSpecifier::Kind::Namespace: {10061    auto [Namespace, Prefix] = FromNNS.getAsNamespaceAndPrefix();10062    auto NSOrErr = Import(Namespace);10063    if (!NSOrErr)10064      return NSOrErr.takeError();10065    auto PrefixOrErr = Import(Prefix);10066    if (!PrefixOrErr)10067      return PrefixOrErr.takeError();10068    return NestedNameSpecifier(ToContext, cast<NamespaceBaseDecl>(*NSOrErr),10069                               *PrefixOrErr);10070  }10071  case NestedNameSpecifier::Kind::MicrosoftSuper:10072    if (ExpectedDecl RDOrErr = Import(FromNNS.getAsMicrosoftSuper()))10073      return NestedNameSpecifier(cast<CXXRecordDecl>(*RDOrErr));10074    else10075      return RDOrErr.takeError();10076  case NestedNameSpecifier::Kind::Type:10077    if (ExpectedTypePtr TyOrErr = Import(FromNNS.getAsType())) {10078      return NestedNameSpecifier(*TyOrErr);10079    } else {10080      return TyOrErr.takeError();10081    }10082  }10083  llvm_unreachable("Invalid nested name specifier kind");10084}10085 10086Expected<NestedNameSpecifierLoc>10087ASTImporter::Import(NestedNameSpecifierLoc FromNNS) {10088  // Copied from NestedNameSpecifier mostly.10089  SmallVector<NestedNameSpecifierLoc , 8> NestedNames;10090  NestedNameSpecifierLoc NNS = FromNNS;10091 10092  // Push each of the nested-name-specifiers's onto a stack for10093  // serialization in reverse order.10094  while (NNS) {10095    NestedNames.push_back(NNS);10096    NNS = NNS.getAsNamespaceAndPrefix().Prefix;10097  }10098 10099  NestedNameSpecifierLocBuilder Builder;10100 10101  while (!NestedNames.empty()) {10102    NNS = NestedNames.pop_back_val();10103    NestedNameSpecifier Spec = std::nullopt;10104    if (Error Err = importInto(Spec, NNS.getNestedNameSpecifier()))10105      return std::move(Err);10106 10107    NestedNameSpecifier::Kind Kind = Spec.getKind();10108 10109    SourceLocation ToLocalBeginLoc, ToLocalEndLoc;10110    if (Kind != NestedNameSpecifier::Kind::MicrosoftSuper) {10111      if (Error Err = importInto(ToLocalBeginLoc, NNS.getLocalBeginLoc()))10112        return std::move(Err);10113 10114      if (Kind != NestedNameSpecifier::Kind::Global)10115        if (Error Err = importInto(ToLocalEndLoc, NNS.getLocalEndLoc()))10116          return std::move(Err);10117    }10118 10119    switch (Kind) {10120    case NestedNameSpecifier::Kind::Namespace:10121      Builder.Extend(getToContext(), Spec.getAsNamespaceAndPrefix().Namespace,10122                     ToLocalBeginLoc, ToLocalEndLoc);10123      break;10124 10125    case NestedNameSpecifier::Kind::Type: {10126      SourceLocation ToTLoc;10127      if (Error Err = importInto(ToTLoc, NNS.castAsTypeLoc().getBeginLoc()))10128        return std::move(Err);10129      TypeSourceInfo *TSI = getToContext().getTrivialTypeSourceInfo(10130          QualType(Spec.getAsType(), 0), ToTLoc);10131      Builder.Make(getToContext(), TSI->getTypeLoc(), ToLocalEndLoc);10132      break;10133    }10134 10135    case NestedNameSpecifier::Kind::Global:10136      Builder.MakeGlobal(getToContext(), ToLocalBeginLoc);10137      break;10138 10139    case NestedNameSpecifier::Kind::MicrosoftSuper: {10140      auto ToSourceRangeOrErr = Import(NNS.getSourceRange());10141      if (!ToSourceRangeOrErr)10142        return ToSourceRangeOrErr.takeError();10143 10144      Builder.MakeMicrosoftSuper(getToContext(), Spec.getAsMicrosoftSuper(),10145                                 ToSourceRangeOrErr->getBegin(),10146                                 ToSourceRangeOrErr->getEnd());10147      break;10148    }10149    case NestedNameSpecifier::Kind::Null:10150      llvm_unreachable("unexpected null nested name specifier");10151    }10152  }10153 10154  return Builder.getWithLocInContext(getToContext());10155}10156 10157Expected<TemplateName> ASTImporter::Import(TemplateName From) {10158  switch (From.getKind()) {10159  case TemplateName::Template:10160    if (ExpectedDecl ToTemplateOrErr = Import(From.getAsTemplateDecl()))10161      return TemplateName(cast<TemplateDecl>((*ToTemplateOrErr)->getCanonicalDecl()));10162    else10163      return ToTemplateOrErr.takeError();10164 10165  case TemplateName::OverloadedTemplate: {10166    OverloadedTemplateStorage *FromStorage = From.getAsOverloadedTemplate();10167    UnresolvedSet<2> ToTemplates;10168    for (auto *I : *FromStorage) {10169      if (auto ToOrErr = Import(I))10170        ToTemplates.addDecl(cast<NamedDecl>(*ToOrErr));10171      else10172        return ToOrErr.takeError();10173    }10174    return ToContext.getOverloadedTemplateName(ToTemplates.begin(),10175                                               ToTemplates.end());10176  }10177 10178  case TemplateName::AssumedTemplate: {10179    AssumedTemplateStorage *FromStorage = From.getAsAssumedTemplateName();10180    auto DeclNameOrErr = Import(FromStorage->getDeclName());10181    if (!DeclNameOrErr)10182      return DeclNameOrErr.takeError();10183    return ToContext.getAssumedTemplateName(*DeclNameOrErr);10184  }10185 10186  case TemplateName::QualifiedTemplate: {10187    QualifiedTemplateName *QTN = From.getAsQualifiedTemplateName();10188    auto QualifierOrErr = Import(QTN->getQualifier());10189    if (!QualifierOrErr)10190      return QualifierOrErr.takeError();10191    auto TNOrErr = Import(QTN->getUnderlyingTemplate());10192    if (!TNOrErr)10193      return TNOrErr.takeError();10194    return ToContext.getQualifiedTemplateName(10195        *QualifierOrErr, QTN->hasTemplateKeyword(), *TNOrErr);10196  }10197 10198  case TemplateName::DependentTemplate: {10199    DependentTemplateName *DTN = From.getAsDependentTemplateName();10200    auto QualifierOrErr = Import(DTN->getQualifier());10201    if (!QualifierOrErr)10202      return QualifierOrErr.takeError();10203    return ToContext.getDependentTemplateName(10204        {*QualifierOrErr, Import(DTN->getName()), DTN->hasTemplateKeyword()});10205  }10206 10207  case TemplateName::SubstTemplateTemplateParm: {10208    SubstTemplateTemplateParmStorage *Subst =10209        From.getAsSubstTemplateTemplateParm();10210    auto ReplacementOrErr = Import(Subst->getReplacement());10211    if (!ReplacementOrErr)10212      return ReplacementOrErr.takeError();10213 10214    auto AssociatedDeclOrErr = Import(Subst->getAssociatedDecl());10215    if (!AssociatedDeclOrErr)10216      return AssociatedDeclOrErr.takeError();10217 10218    return ToContext.getSubstTemplateTemplateParm(10219        *ReplacementOrErr, *AssociatedDeclOrErr, Subst->getIndex(),10220        Subst->getPackIndex(), Subst->getFinal());10221  }10222 10223  case TemplateName::SubstTemplateTemplateParmPack: {10224    SubstTemplateTemplateParmPackStorage *SubstPack =10225        From.getAsSubstTemplateTemplateParmPack();10226    ASTNodeImporter Importer(*this);10227    auto ArgPackOrErr =10228        Importer.ImportTemplateArgument(SubstPack->getArgumentPack());10229    if (!ArgPackOrErr)10230      return ArgPackOrErr.takeError();10231 10232    auto AssociatedDeclOrErr = Import(SubstPack->getAssociatedDecl());10233    if (!AssociatedDeclOrErr)10234      return AssociatedDeclOrErr.takeError();10235 10236    return ToContext.getSubstTemplateTemplateParmPack(10237        *ArgPackOrErr, *AssociatedDeclOrErr, SubstPack->getIndex(),10238        SubstPack->getFinal());10239  }10240  case TemplateName::UsingTemplate: {10241    auto UsingOrError = Import(From.getAsUsingShadowDecl());10242    if (!UsingOrError)10243      return UsingOrError.takeError();10244    return TemplateName(cast<UsingShadowDecl>(*UsingOrError));10245  }10246  case TemplateName::DeducedTemplate:10247    llvm_unreachable("Unexpected DeducedTemplate");10248  }10249 10250  llvm_unreachable("Invalid template name kind");10251}10252 10253Expected<SourceLocation> ASTImporter::Import(SourceLocation FromLoc) {10254  if (FromLoc.isInvalid())10255    return SourceLocation{};10256 10257  SourceManager &FromSM = FromContext.getSourceManager();10258  bool IsBuiltin = FromSM.isWrittenInBuiltinFile(FromLoc);10259 10260  FileIDAndOffset Decomposed = FromSM.getDecomposedLoc(FromLoc);10261  Expected<FileID> ToFileIDOrErr = Import(Decomposed.first, IsBuiltin);10262  if (!ToFileIDOrErr)10263    return ToFileIDOrErr.takeError();10264  SourceManager &ToSM = ToContext.getSourceManager();10265  return ToSM.getComposedLoc(*ToFileIDOrErr, Decomposed.second);10266}10267 10268Expected<SourceRange> ASTImporter::Import(SourceRange FromRange) {10269  SourceLocation ToBegin, ToEnd;10270  if (Error Err = importInto(ToBegin, FromRange.getBegin()))10271    return std::move(Err);10272  if (Error Err = importInto(ToEnd, FromRange.getEnd()))10273    return std::move(Err);10274 10275  return SourceRange(ToBegin, ToEnd);10276}10277 10278Expected<FileID> ASTImporter::Import(FileID FromID, bool IsBuiltin) {10279  llvm::DenseMap<FileID, FileID>::iterator Pos = ImportedFileIDs.find(FromID);10280  if (Pos != ImportedFileIDs.end())10281    return Pos->second;10282 10283  SourceManager &FromSM = FromContext.getSourceManager();10284  SourceManager &ToSM = ToContext.getSourceManager();10285  const SrcMgr::SLocEntry &FromSLoc = FromSM.getSLocEntry(FromID);10286 10287  // Map the FromID to the "to" source manager.10288  FileID ToID;10289  if (FromSLoc.isExpansion()) {10290    const SrcMgr::ExpansionInfo &FromEx = FromSLoc.getExpansion();10291    ExpectedSLoc ToSpLoc = Import(FromEx.getSpellingLoc());10292    if (!ToSpLoc)10293      return ToSpLoc.takeError();10294    ExpectedSLoc ToExLocS = Import(FromEx.getExpansionLocStart());10295    if (!ToExLocS)10296      return ToExLocS.takeError();10297    unsigned ExLength = FromSM.getFileIDSize(FromID);10298    SourceLocation MLoc;10299    if (FromEx.isMacroArgExpansion()) {10300      MLoc = ToSM.createMacroArgExpansionLoc(*ToSpLoc, *ToExLocS, ExLength);10301    } else {10302      if (ExpectedSLoc ToExLocE = Import(FromEx.getExpansionLocEnd()))10303        MLoc = ToSM.createExpansionLoc(*ToSpLoc, *ToExLocS, *ToExLocE, ExLength,10304                                       FromEx.isExpansionTokenRange());10305      else10306        return ToExLocE.takeError();10307    }10308    ToID = ToSM.getFileID(MLoc);10309  } else {10310    const SrcMgr::ContentCache *Cache = &FromSLoc.getFile().getContentCache();10311 10312    if (!IsBuiltin && !Cache->BufferOverridden) {10313      // Include location of this file.10314      ExpectedSLoc ToIncludeLoc = Import(FromSLoc.getFile().getIncludeLoc());10315      if (!ToIncludeLoc)10316        return ToIncludeLoc.takeError();10317 10318      // Every FileID that is not the main FileID needs to have a valid include10319      // location so that the include chain points to the main FileID. When10320      // importing the main FileID (which has no include location), we need to10321      // create a fake include location in the main file to keep this property10322      // intact.10323      SourceLocation ToIncludeLocOrFakeLoc = *ToIncludeLoc;10324      if (FromID == FromSM.getMainFileID())10325        ToIncludeLocOrFakeLoc = ToSM.getLocForStartOfFile(ToSM.getMainFileID());10326 10327      if (Cache->OrigEntry && Cache->OrigEntry->getDir()) {10328        // FIXME: We probably want to use getVirtualFileRef(), so we don't hit10329        // the disk again10330        // FIXME: We definitely want to re-use the existing MemoryBuffer, rather10331        // than mmap the files several times.10332        auto Entry =10333            ToFileManager.getOptionalFileRef(Cache->OrigEntry->getName());10334        // FIXME: The filename may be a virtual name that does probably not10335        // point to a valid file and we get no Entry here. In this case try with10336        // the memory buffer below.10337        if (Entry)10338          ToID = ToSM.createFileID(*Entry, ToIncludeLocOrFakeLoc,10339                                   FromSLoc.getFile().getFileCharacteristic());10340      }10341    }10342 10343    if (ToID.isInvalid() || IsBuiltin) {10344      // FIXME: We want to re-use the existing MemoryBuffer!10345      std::optional<llvm::MemoryBufferRef> FromBuf =10346          Cache->getBufferOrNone(FromContext.getDiagnostics(),10347                                 FromSM.getFileManager(), SourceLocation{});10348      if (!FromBuf)10349        return llvm::make_error<ASTImportError>(ASTImportError::Unknown);10350 10351      std::unique_ptr<llvm::MemoryBuffer> ToBuf =10352          llvm::MemoryBuffer::getMemBufferCopy(FromBuf->getBuffer(),10353                                               FromBuf->getBufferIdentifier());10354      ToID = ToSM.createFileID(std::move(ToBuf),10355                               FromSLoc.getFile().getFileCharacteristic());10356    }10357  }10358 10359  assert(ToID.isValid() && "Unexpected invalid fileID was created.");10360 10361  ImportedFileIDs[FromID] = ToID;10362  return ToID;10363}10364 10365Expected<CXXCtorInitializer *> ASTImporter::Import(CXXCtorInitializer *From) {10366  ExpectedExpr ToExprOrErr = Import(From->getInit());10367  if (!ToExprOrErr)10368    return ToExprOrErr.takeError();10369 10370  auto LParenLocOrErr = Import(From->getLParenLoc());10371  if (!LParenLocOrErr)10372    return LParenLocOrErr.takeError();10373 10374  auto RParenLocOrErr = Import(From->getRParenLoc());10375  if (!RParenLocOrErr)10376    return RParenLocOrErr.takeError();10377 10378  if (From->isBaseInitializer()) {10379    auto ToTInfoOrErr = Import(From->getTypeSourceInfo());10380    if (!ToTInfoOrErr)10381      return ToTInfoOrErr.takeError();10382 10383    SourceLocation EllipsisLoc;10384    if (From->isPackExpansion())10385      if (Error Err = importInto(EllipsisLoc, From->getEllipsisLoc()))10386        return std::move(Err);10387 10388    return new (ToContext) CXXCtorInitializer(10389        ToContext, *ToTInfoOrErr, From->isBaseVirtual(), *LParenLocOrErr,10390        *ToExprOrErr, *RParenLocOrErr, EllipsisLoc);10391  } else if (From->isMemberInitializer()) {10392    ExpectedDecl ToFieldOrErr = Import(From->getMember());10393    if (!ToFieldOrErr)10394      return ToFieldOrErr.takeError();10395 10396    auto MemberLocOrErr = Import(From->getMemberLocation());10397    if (!MemberLocOrErr)10398      return MemberLocOrErr.takeError();10399 10400    return new (ToContext) CXXCtorInitializer(10401        ToContext, cast_or_null<FieldDecl>(*ToFieldOrErr), *MemberLocOrErr,10402        *LParenLocOrErr, *ToExprOrErr, *RParenLocOrErr);10403  } else if (From->isIndirectMemberInitializer()) {10404    ExpectedDecl ToIFieldOrErr = Import(From->getIndirectMember());10405    if (!ToIFieldOrErr)10406      return ToIFieldOrErr.takeError();10407 10408    auto MemberLocOrErr = Import(From->getMemberLocation());10409    if (!MemberLocOrErr)10410      return MemberLocOrErr.takeError();10411 10412    return new (ToContext) CXXCtorInitializer(10413        ToContext, cast_or_null<IndirectFieldDecl>(*ToIFieldOrErr),10414        *MemberLocOrErr, *LParenLocOrErr, *ToExprOrErr, *RParenLocOrErr);10415  } else if (From->isDelegatingInitializer()) {10416    auto ToTInfoOrErr = Import(From->getTypeSourceInfo());10417    if (!ToTInfoOrErr)10418      return ToTInfoOrErr.takeError();10419 10420    return new (ToContext)10421        CXXCtorInitializer(ToContext, *ToTInfoOrErr, *LParenLocOrErr,10422                           *ToExprOrErr, *RParenLocOrErr);10423  } else {10424    // FIXME: assert?10425    return make_error<ASTImportError>();10426  }10427}10428 10429Expected<CXXBaseSpecifier *>10430ASTImporter::Import(const CXXBaseSpecifier *BaseSpec) {10431  auto Pos = ImportedCXXBaseSpecifiers.find(BaseSpec);10432  if (Pos != ImportedCXXBaseSpecifiers.end())10433    return Pos->second;10434 10435  Expected<SourceRange> ToSourceRange = Import(BaseSpec->getSourceRange());10436  if (!ToSourceRange)10437    return ToSourceRange.takeError();10438  Expected<TypeSourceInfo *> ToTSI = Import(BaseSpec->getTypeSourceInfo());10439  if (!ToTSI)10440    return ToTSI.takeError();10441  ExpectedSLoc ToEllipsisLoc = Import(BaseSpec->getEllipsisLoc());10442  if (!ToEllipsisLoc)10443    return ToEllipsisLoc.takeError();10444  CXXBaseSpecifier *Imported = new (ToContext) CXXBaseSpecifier(10445      *ToSourceRange, BaseSpec->isVirtual(), BaseSpec->isBaseOfClass(),10446      BaseSpec->getAccessSpecifierAsWritten(), *ToTSI, *ToEllipsisLoc);10447  ImportedCXXBaseSpecifiers[BaseSpec] = Imported;10448  return Imported;10449}10450 10451llvm::Expected<APValue> ASTImporter::Import(const APValue &FromValue) {10452  ASTNodeImporter Importer(*this);10453  return Importer.ImportAPValue(FromValue);10454}10455 10456Error ASTImporter::ImportDefinition(Decl *From) {10457  ExpectedDecl ToOrErr = Import(From);10458  if (!ToOrErr)10459    return ToOrErr.takeError();10460  Decl *To = *ToOrErr;10461 10462  auto *FromDC = cast<DeclContext>(From);10463  ASTNodeImporter Importer(*this);10464 10465  if (auto *ToRecord = dyn_cast<RecordDecl>(To)) {10466    if (!ToRecord->getDefinition()) {10467      return Importer.ImportDefinition(10468          cast<RecordDecl>(FromDC), ToRecord,10469          ASTNodeImporter::IDK_Everything);10470    }10471  }10472 10473  if (auto *ToEnum = dyn_cast<EnumDecl>(To)) {10474    if (!ToEnum->getDefinition()) {10475      return Importer.ImportDefinition(10476          cast<EnumDecl>(FromDC), ToEnum, ASTNodeImporter::IDK_Everything);10477    }10478  }10479 10480  if (auto *ToIFace = dyn_cast<ObjCInterfaceDecl>(To)) {10481    if (!ToIFace->getDefinition()) {10482      return Importer.ImportDefinition(10483          cast<ObjCInterfaceDecl>(FromDC), ToIFace,10484          ASTNodeImporter::IDK_Everything);10485    }10486  }10487 10488  if (auto *ToProto = dyn_cast<ObjCProtocolDecl>(To)) {10489    if (!ToProto->getDefinition()) {10490      return Importer.ImportDefinition(10491          cast<ObjCProtocolDecl>(FromDC), ToProto,10492          ASTNodeImporter::IDK_Everything);10493    }10494  }10495 10496  return Importer.ImportDeclContext(FromDC, true);10497}10498 10499Expected<DeclarationName> ASTImporter::Import(DeclarationName FromName) {10500  if (!FromName)10501    return DeclarationName{};10502 10503  switch (FromName.getNameKind()) {10504  case DeclarationName::Identifier:10505    return DeclarationName(Import(FromName.getAsIdentifierInfo()));10506 10507  case DeclarationName::ObjCZeroArgSelector:10508  case DeclarationName::ObjCOneArgSelector:10509  case DeclarationName::ObjCMultiArgSelector:10510    if (auto ToSelOrErr = Import(FromName.getObjCSelector()))10511      return DeclarationName(*ToSelOrErr);10512    else10513      return ToSelOrErr.takeError();10514 10515  case DeclarationName::CXXConstructorName: {10516    if (auto ToTyOrErr = Import(FromName.getCXXNameType()))10517      return ToContext.DeclarationNames.getCXXConstructorName(10518          ToContext.getCanonicalType(*ToTyOrErr));10519    else10520      return ToTyOrErr.takeError();10521  }10522 10523  case DeclarationName::CXXDestructorName: {10524    if (auto ToTyOrErr = Import(FromName.getCXXNameType()))10525      return ToContext.DeclarationNames.getCXXDestructorName(10526          ToContext.getCanonicalType(*ToTyOrErr));10527    else10528      return ToTyOrErr.takeError();10529  }10530 10531  case DeclarationName::CXXDeductionGuideName: {10532    if (auto ToTemplateOrErr = Import(FromName.getCXXDeductionGuideTemplate()))10533      return ToContext.DeclarationNames.getCXXDeductionGuideName(10534          cast<TemplateDecl>(*ToTemplateOrErr));10535    else10536      return ToTemplateOrErr.takeError();10537  }10538 10539  case DeclarationName::CXXConversionFunctionName: {10540    if (auto ToTyOrErr = Import(FromName.getCXXNameType()))10541      return ToContext.DeclarationNames.getCXXConversionFunctionName(10542          ToContext.getCanonicalType(*ToTyOrErr));10543    else10544      return ToTyOrErr.takeError();10545  }10546 10547  case DeclarationName::CXXOperatorName:10548    return ToContext.DeclarationNames.getCXXOperatorName(10549                                          FromName.getCXXOverloadedOperator());10550 10551  case DeclarationName::CXXLiteralOperatorName:10552    return ToContext.DeclarationNames.getCXXLiteralOperatorName(10553        Import(FromName.getCXXLiteralIdentifier()));10554 10555  case DeclarationName::CXXUsingDirective:10556    // FIXME: STATICS!10557    return DeclarationName::getUsingDirectiveName();10558  }10559 10560  llvm_unreachable("Invalid DeclarationName Kind!");10561}10562 10563IdentifierInfo *ASTImporter::Import(const IdentifierInfo *FromId) {10564  if (!FromId)10565    return nullptr;10566 10567  IdentifierInfo *ToId = &ToContext.Idents.get(FromId->getName());10568 10569  if (!ToId->getBuiltinID() && FromId->getBuiltinID())10570    ToId->setBuiltinID(FromId->getBuiltinID());10571 10572  return ToId;10573}10574 10575IdentifierOrOverloadedOperator10576ASTImporter::Import(IdentifierOrOverloadedOperator FromIO) {10577  if (const IdentifierInfo *FromII = FromIO.getIdentifier())10578    return Import(FromII);10579  return FromIO.getOperator();10580}10581 10582Expected<Selector> ASTImporter::Import(Selector FromSel) {10583  if (FromSel.isNull())10584    return Selector{};10585 10586  SmallVector<const IdentifierInfo *, 4> Idents;10587  Idents.push_back(Import(FromSel.getIdentifierInfoForSlot(0)));10588  for (unsigned I = 1, N = FromSel.getNumArgs(); I < N; ++I)10589    Idents.push_back(Import(FromSel.getIdentifierInfoForSlot(I)));10590  return ToContext.Selectors.getSelector(FromSel.getNumArgs(), Idents.data());10591}10592 10593llvm::Expected<APValue>10594ASTNodeImporter::ImportAPValue(const APValue &FromValue) {10595  APValue Result;10596  llvm::Error Err = llvm::Error::success();10597  auto ImportLoop = [&](const APValue *From, APValue *To, unsigned Size) {10598    for (unsigned Idx = 0; Idx < Size; Idx++) {10599      APValue Tmp = importChecked(Err, From[Idx]);10600      To[Idx] = Tmp;10601    }10602  };10603  switch (FromValue.getKind()) {10604  case APValue::None:10605  case APValue::Indeterminate:10606  case APValue::Int:10607  case APValue::Float:10608  case APValue::FixedPoint:10609  case APValue::ComplexInt:10610  case APValue::ComplexFloat:10611    Result = FromValue;10612    break;10613  case APValue::Vector: {10614    Result.MakeVector();10615    MutableArrayRef<APValue> Elts =10616        Result.setVectorUninit(FromValue.getVectorLength());10617    ImportLoop(((const APValue::Vec *)(const char *)&FromValue.Data)->Elts,10618               Elts.data(), FromValue.getVectorLength());10619    break;10620  }10621  case APValue::Array:10622    Result.MakeArray(FromValue.getArrayInitializedElts(),10623                     FromValue.getArraySize());10624    ImportLoop(((const APValue::Arr *)(const char *)&FromValue.Data)->Elts,10625               ((const APValue::Arr *)(const char *)&Result.Data)->Elts,10626               FromValue.getArrayInitializedElts());10627    break;10628  case APValue::Struct:10629    Result.MakeStruct(FromValue.getStructNumBases(),10630                      FromValue.getStructNumFields());10631    ImportLoop(10632        ((const APValue::StructData *)(const char *)&FromValue.Data)->Elts,10633        ((const APValue::StructData *)(const char *)&Result.Data)->Elts,10634        FromValue.getStructNumBases() + FromValue.getStructNumFields());10635    break;10636  case APValue::Union: {10637    Result.MakeUnion();10638    const Decl *ImpFDecl = importChecked(Err, FromValue.getUnionField());10639    APValue ImpValue = importChecked(Err, FromValue.getUnionValue());10640    if (Err)10641      return std::move(Err);10642    Result.setUnion(cast<FieldDecl>(ImpFDecl), ImpValue);10643    break;10644  }10645  case APValue::AddrLabelDiff: {10646    Result.MakeAddrLabelDiff();10647    const Expr *ImpLHS = importChecked(Err, FromValue.getAddrLabelDiffLHS());10648    const Expr *ImpRHS = importChecked(Err, FromValue.getAddrLabelDiffRHS());10649    if (Err)10650      return std::move(Err);10651    Result.setAddrLabelDiff(cast<AddrLabelExpr>(ImpLHS),10652                            cast<AddrLabelExpr>(ImpRHS));10653    break;10654  }10655  case APValue::MemberPointer: {10656    const Decl *ImpMemPtrDecl =10657        importChecked(Err, FromValue.getMemberPointerDecl());10658    if (Err)10659      return std::move(Err);10660    MutableArrayRef<const CXXRecordDecl *> ToPath =10661        Result.setMemberPointerUninit(10662            cast<const ValueDecl>(ImpMemPtrDecl),10663            FromValue.isMemberPointerToDerivedMember(),10664            FromValue.getMemberPointerPath().size());10665    ArrayRef<const CXXRecordDecl *> FromPath = Result.getMemberPointerPath();10666    for (unsigned Idx = 0; Idx < FromValue.getMemberPointerPath().size();10667         Idx++) {10668      const Decl *ImpDecl = importChecked(Err, FromPath[Idx]);10669      if (Err)10670        return std::move(Err);10671      ToPath[Idx] = cast<const CXXRecordDecl>(ImpDecl->getCanonicalDecl());10672    }10673    break;10674  }10675  case APValue::LValue:10676    APValue::LValueBase Base;10677    QualType FromElemTy;10678    if (FromValue.getLValueBase()) {10679      assert(!FromValue.getLValueBase().is<DynamicAllocLValue>() &&10680             "in C++20 dynamic allocation are transient so they shouldn't "10681             "appear in the AST");10682      if (!FromValue.getLValueBase().is<TypeInfoLValue>()) {10683        if (const auto *E =10684                FromValue.getLValueBase().dyn_cast<const Expr *>()) {10685          FromElemTy = E->getType();10686          const Expr *ImpExpr = importChecked(Err, E);10687          if (Err)10688            return std::move(Err);10689          Base = APValue::LValueBase(ImpExpr,10690                                     FromValue.getLValueBase().getCallIndex(),10691                                     FromValue.getLValueBase().getVersion());10692        } else {10693          FromElemTy =10694              FromValue.getLValueBase().get<const ValueDecl *>()->getType();10695          const Decl *ImpDecl = importChecked(10696              Err, FromValue.getLValueBase().get<const ValueDecl *>());10697          if (Err)10698            return std::move(Err);10699          Base = APValue::LValueBase(cast<ValueDecl>(ImpDecl),10700                                     FromValue.getLValueBase().getCallIndex(),10701                                     FromValue.getLValueBase().getVersion());10702        }10703      } else {10704        FromElemTy = FromValue.getLValueBase().getTypeInfoType();10705        const Type *ImpTypeInfo = importChecked(10706            Err, FromValue.getLValueBase().get<TypeInfoLValue>().getType());10707        QualType ImpType =10708            importChecked(Err, FromValue.getLValueBase().getTypeInfoType());10709        if (Err)10710          return std::move(Err);10711        Base = APValue::LValueBase::getTypeInfo(TypeInfoLValue(ImpTypeInfo),10712                                                ImpType);10713      }10714    }10715    CharUnits Offset = FromValue.getLValueOffset();10716    unsigned PathLength = FromValue.getLValuePath().size();10717    Result.MakeLValue();10718    if (FromValue.hasLValuePath()) {10719      MutableArrayRef<APValue::LValuePathEntry> ToPath = Result.setLValueUninit(10720          Base, Offset, PathLength, FromValue.isLValueOnePastTheEnd(),10721          FromValue.isNullPointer());10722      ArrayRef<APValue::LValuePathEntry> FromPath = FromValue.getLValuePath();10723      for (unsigned LoopIdx = 0; LoopIdx < PathLength; LoopIdx++) {10724        if (FromElemTy->isRecordType()) {10725          const Decl *FromDecl =10726              FromPath[LoopIdx].getAsBaseOrMember().getPointer();10727          const Decl *ImpDecl = importChecked(Err, FromDecl);10728          if (Err)10729            return std::move(Err);10730          if (auto *RD = dyn_cast<CXXRecordDecl>(FromDecl))10731            FromElemTy = Importer.FromContext.getCanonicalTagType(RD);10732          else10733            FromElemTy = cast<ValueDecl>(FromDecl)->getType();10734          ToPath[LoopIdx] = APValue::LValuePathEntry(APValue::BaseOrMemberType(10735              ImpDecl, FromPath[LoopIdx].getAsBaseOrMember().getInt()));10736        } else {10737          FromElemTy =10738              Importer.FromContext.getAsArrayType(FromElemTy)->getElementType();10739          ToPath[LoopIdx] = APValue::LValuePathEntry::ArrayIndex(10740              FromPath[LoopIdx].getAsArrayIndex());10741        }10742      }10743    } else10744      Result.setLValue(Base, Offset, APValue::NoLValuePath{},10745                       FromValue.isNullPointer());10746  }10747  if (Err)10748    return std::move(Err);10749  return Result;10750}10751 10752Expected<DeclarationName> ASTImporter::HandleNameConflict(DeclarationName Name,10753                                                          DeclContext *DC,10754                                                          unsigned IDNS,10755                                                          NamedDecl **Decls,10756                                                          unsigned NumDecls) {10757  if (ODRHandling == ODRHandlingType::Conservative)10758    // Report error at any name conflict.10759    return make_error<ASTImportError>(ASTImportError::NameConflict);10760  else10761    // Allow to create the new Decl with the same name.10762    return Name;10763}10764 10765DiagnosticBuilder ASTImporter::ToDiag(SourceLocation Loc, unsigned DiagID) {10766  if (LastDiagFromFrom)10767    ToContext.getDiagnostics().notePriorDiagnosticFrom(10768      FromContext.getDiagnostics());10769  LastDiagFromFrom = false;10770  return ToContext.getDiagnostics().Report(Loc, DiagID);10771}10772 10773DiagnosticBuilder ASTImporter::FromDiag(SourceLocation Loc, unsigned DiagID) {10774  if (!LastDiagFromFrom)10775    FromContext.getDiagnostics().notePriorDiagnosticFrom(10776      ToContext.getDiagnostics());10777  LastDiagFromFrom = true;10778  return FromContext.getDiagnostics().Report(Loc, DiagID);10779}10780 10781void ASTImporter::CompleteDecl (Decl *D) {10782  if (auto *ID = dyn_cast<ObjCInterfaceDecl>(D)) {10783    if (!ID->getDefinition())10784      ID->startDefinition();10785  }10786  else if (auto *PD = dyn_cast<ObjCProtocolDecl>(D)) {10787    if (!PD->getDefinition())10788      PD->startDefinition();10789  }10790  else if (auto *TD = dyn_cast<TagDecl>(D)) {10791    if (!TD->getDefinition() && !TD->isBeingDefined()) {10792      TD->startDefinition();10793      TD->setCompleteDefinition(true);10794    }10795  }10796  else {10797    assert(0 && "CompleteDecl called on a Decl that can't be completed");10798  }10799}10800 10801Decl *ASTImporter::MapImported(Decl *From, Decl *To) {10802  auto [Pos, Inserted] = ImportedDecls.try_emplace(From, To);10803  assert((Inserted || Pos->second == To) &&10804         "Try to import an already imported Decl");10805  if (!Inserted)10806    return Pos->second;10807  // This mapping should be maintained only in this function. Therefore do not10808  // check for additional consistency.10809  ImportedFromDecls[To] = From;10810  // In the case of TypedefNameDecl we create the Decl first and only then we10811  // import and set its DeclContext. So, the DC is still not set when we reach10812  // here from GetImportedOrCreateDecl.10813  if (To->getDeclContext())10814    AddToLookupTable(To);10815  return To;10816}10817 10818std::optional<ASTImportError>10819ASTImporter::getImportDeclErrorIfAny(Decl *FromD) const {10820  auto Pos = ImportDeclErrors.find(FromD);10821  if (Pos != ImportDeclErrors.end())10822    return Pos->second;10823  else10824    return std::nullopt;10825}10826 10827void ASTImporter::setImportDeclError(Decl *From, ASTImportError Error) {10828  auto InsertRes = ImportDeclErrors.insert({From, Error});10829  (void)InsertRes;10830  // Either we set the error for the first time, or we already had set one and10831  // now we want to set the same error.10832  assert(InsertRes.second || InsertRes.first->second.Error == Error.Error);10833}10834 10835bool ASTImporter::IsStructurallyEquivalent(QualType From, QualType To,10836                                           bool Complain) {10837  llvm::DenseMap<const Type *, const Type *>::iterator Pos =10838      ImportedTypes.find(From.getTypePtr());10839  if (Pos != ImportedTypes.end()) {10840    if (ExpectedType ToFromOrErr = Import(From)) {10841      if (ToContext.hasSameType(*ToFromOrErr, To))10842        return true;10843    } else {10844      llvm::consumeError(ToFromOrErr.takeError());10845    }10846  }10847 10848  StructuralEquivalenceContext Ctx(10849      getToContext().getLangOpts(), FromContext, ToContext, NonEquivalentDecls,10850      getStructuralEquivalenceKind(*this), false, Complain);10851  return Ctx.IsEquivalent(From, To);10852}10853