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