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