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