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