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