blob: 9477e414cf5549fd3c1787011587f936382c0412 [file] [log] [blame]
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00001//===- ASTImporter.cpp - Importing ASTs from other Contexts ---------------===//
Douglas Gregor96e578d2010-02-05 17:54:41 +00002//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// 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
Douglas Gregor96e578d2010-02-05 17:54:41 +00006//
7//===----------------------------------------------------------------------===//
8//
9// This file defines the ASTImporter class which imports AST nodes from one
10// context into another context.
11//
12//===----------------------------------------------------------------------===//
Eugene Zelenko9a9c8232018-04-09 21:54:38 +000013
Douglas Gregor96e578d2010-02-05 17:54:41 +000014#include "clang/AST/ASTImporter.h"
Ilya Biryukovabc744d2019-07-18 15:43:26 +000015#include "clang/AST/ASTImporterSharedState.h"
Douglas Gregor96e578d2010-02-05 17:54:41 +000016#include "clang/AST/ASTContext.h"
Douglas Gregor811663e2010-02-10 00:15:17 +000017#include "clang/AST/ASTDiagnostic.h"
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +000018#include "clang/AST/ASTStructuralEquivalence.h"
Eugene Zelenko9a9c8232018-04-09 21:54:38 +000019#include "clang/AST/Attr.h"
20#include "clang/AST/Decl.h"
21#include "clang/AST/DeclAccessPair.h"
22#include "clang/AST/DeclBase.h"
Douglas Gregor5c73e912010-02-11 00:48:18 +000023#include "clang/AST/DeclCXX.h"
Eugene Zelenko9a9c8232018-04-09 21:54:38 +000024#include "clang/AST/DeclFriend.h"
25#include "clang/AST/DeclGroup.h"
Douglas Gregor96e578d2010-02-05 17:54:41 +000026#include "clang/AST/DeclObjC.h"
Eugene Zelenko9a9c8232018-04-09 21:54:38 +000027#include "clang/AST/DeclTemplate.h"
Douglas Gregor3aed6cd2010-02-08 21:09:39 +000028#include "clang/AST/DeclVisitor.h"
Eugene Zelenko9a9c8232018-04-09 21:54:38 +000029#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"
Douglas Gregor7eeb5972010-02-11 19:21:55 +000040#include "clang/AST/StmtVisitor.h"
Eugene Zelenko9a9c8232018-04-09 21:54:38 +000041#include "clang/AST/TemplateBase.h"
42#include "clang/AST/TemplateName.h"
43#include "clang/AST/Type.h"
44#include "clang/AST/TypeLoc.h"
Douglas Gregor96e578d2010-02-05 17:54:41 +000045#include "clang/AST/TypeVisitor.h"
Eugene Zelenko9a9c8232018-04-09 21:54:38 +000046#include "clang/AST/UnresolvedSet.h"
Raphael Isemannba7bde62019-10-30 14:50:35 +010047#include "clang/Basic/Builtins.h"
Eugene Zelenko9a9c8232018-04-09 21:54:38 +000048#include "clang/Basic/ExceptionSpecificationType.h"
Douglas Gregor811663e2010-02-10 00:15:17 +000049#include "clang/Basic/FileManager.h"
Eugene Zelenko9a9c8232018-04-09 21:54:38 +000050#include "clang/Basic/IdentifierTable.h"
51#include "clang/Basic/LLVM.h"
52#include "clang/Basic/LangOptions.h"
53#include "clang/Basic/SourceLocation.h"
Douglas Gregor811663e2010-02-10 00:15:17 +000054#include "clang/Basic/SourceManager.h"
Eugene Zelenko9a9c8232018-04-09 21:54:38 +000055#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"
Balazs Kerid2c57612019-07-18 15:23:10 +000061#include "llvm/ADT/ScopeExit.h"
Ilya Biryukovabc744d2019-07-18 15:43:26 +000062#include "llvm/ADT/STLExtras.h"
Eugene Zelenko9a9c8232018-04-09 21:54:38 +000063#include "llvm/ADT/SmallVector.h"
64#include "llvm/Support/Casting.h"
65#include "llvm/Support/ErrorHandling.h"
Douglas Gregor811663e2010-02-10 00:15:17 +000066#include "llvm/Support/MemoryBuffer.h"
Eugene Zelenko9a9c8232018-04-09 21:54:38 +000067#include <algorithm>
68#include <cassert>
69#include <cstddef>
70#include <memory>
71#include <type_traits>
72#include <utility>
Douglas Gregor96e578d2010-02-05 17:54:41 +000073
Douglas Gregor3c2404b2011-11-03 18:07:07 +000074namespace clang {
Eugene Zelenko9a9c8232018-04-09 21:54:38 +000075
Balazs Keri3b30d652018-10-19 13:32:20 +000076 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>;
Gabor Martonf035b752019-08-27 11:36:10 +000084 using ExpectedName = llvm::Expected<DeclarationName>;
Balazs Keri2544b4b2018-08-08 09:40:57 +000085
Balazs Keri3b30d652018-10-19 13:32:20 +000086 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";
Balazs Keri2544b4b2018-08-08 09:40:57 +000095 }
Balazs Keri2a13d662018-10-19 15:16:51 +000096 llvm_unreachable("Invalid error code.");
97 return "Invalid error code.";
Balazs Keri2544b4b2018-08-08 09:40:57 +000098 }
99
Balazs Keri3b30d652018-10-19 13:32:20 +0000100 void ImportError::log(raw_ostream &OS) const {
101 OS << toString();
102 }
103
104 std::error_code ImportError::convertToErrorCode() const {
105 llvm_unreachable("Function not implemented.");
106 }
107
108 char ImportError::ID;
109
Gabor Marton5254e642018-06-27 13:32:50 +0000110 template <class T>
Balazs Keri3b30d652018-10-19 13:32:20 +0000111 SmallVector<Decl *, 2>
Gabor Marton5254e642018-06-27 13:32:50 +0000112 getCanonicalForwardRedeclChain(Redeclarable<T>* D) {
Balazs Keri3b30d652018-10-19 13:32:20 +0000113 SmallVector<Decl *, 2> Redecls;
Gabor Marton5254e642018-06-27 13:32:50 +0000114 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
123 SmallVector<Decl*, 2> getCanonicalForwardRedeclChain(Decl* D) {
Gabor Martonac3a5d62018-09-17 12:04:52 +0000124 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);
Gabor Marton7df342a2018-12-17 12:42:12 +0000128 if (auto *TD = dyn_cast<TagDecl>(D))
129 return getCanonicalForwardRedeclChain<TagDecl>(TD);
Gabor Martonac3a5d62018-09-17 12:04:52 +0000130 llvm_unreachable("Bad declaration kind");
Gabor Marton5254e642018-06-27 13:32:50 +0000131 }
132
Gabor Marton26f72a92018-07-12 09:42:05 +0000133 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
Balazs Keri3b30d652018-10-19 13:32:20 +0000140 class ASTNodeImporter : public TypeVisitor<ASTNodeImporter, ExpectedType>,
141 public DeclVisitor<ASTNodeImporter, ExpectedDecl>,
142 public StmtVisitor<ASTNodeImporter, ExpectedStmt> {
Douglas Gregor96e578d2010-02-05 17:54:41 +0000143 ASTImporter &Importer;
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +0000144
Balazs Keri3b30d652018-10-19 13:32:20 +0000145 // Use this instead of Importer.importInto .
146 template <typename ImportT>
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>
153 LLVM_NODISCARD Error importInto(ImportT *&To, ImportT *From) {
Gabor Marton5ac6d492019-05-15 10:29:48 +0000154 auto ToOrErr = Importer.Import(From);
Balazs Keri57949eb2019-03-25 09:16:39 +0000155 if (ToOrErr)
156 To = cast_or_null<ImportT>(*ToOrErr);
157 return ToOrErr.takeError();
Balazs Keri3b30d652018-10-19 13:32:20 +0000158 }
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>
163 Expected<T *> import(T *From) {
Gabor Marton5ac6d492019-05-15 10:29:48 +0000164 auto ToOrErr = Importer.Import(From);
Balazs Keri57949eb2019-03-25 09:16:39 +0000165 if (!ToOrErr)
166 return ToOrErr.takeError();
167 return cast_or_null<T>(*ToOrErr);
Balazs Keri3b30d652018-10-19 13:32:20 +0000168 }
169
170 template <typename T>
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>
177 Expected<T> import(const T &From) {
Gabor Marton5ac6d492019-05-15 10:29:48 +0000178 return Importer.Import(From);
Balazs Keri3b30d652018-10-19 13:32:20 +0000179 }
180
Richard Smithb9fb1212019-05-06 03:47:15 +0000181 // Import an Optional<T> by importing the contained T, if any.
182 template<typename T>
183 Expected<Optional<T>> import(Optional<T> From) {
184 if (!From)
185 return Optional<T>();
186 return import(*From);
187 }
188
Balazs Keri3b30d652018-10-19 13:32:20 +0000189 template <class T>
190 Expected<std::tuple<T>>
191 importSeq(const T &From) {
192 Expected<T> ToOrErr = import(From);
193 if (!ToOrErr)
194 return ToOrErr.takeError();
195 return std::make_tuple<T>(std::move(*ToOrErr));
196 }
197
198 // Import multiple objects with a single function call.
199 // This should work for every type for which a variant of `import` exists.
200 // The arguments are processed from left to right and import is stopped on
201 // first error.
202 template <class THead, class... TTail>
203 Expected<std::tuple<THead, TTail...>>
204 importSeq(const THead &FromHead, const TTail &...FromTail) {
205 Expected<std::tuple<THead>> ToHeadOrErr = importSeq(FromHead);
206 if (!ToHeadOrErr)
207 return ToHeadOrErr.takeError();
208 Expected<std::tuple<TTail...>> ToTailOrErr = importSeq(FromTail...);
209 if (!ToTailOrErr)
210 return ToTailOrErr.takeError();
211 return std::tuple_cat(*ToHeadOrErr, *ToTailOrErr);
212 }
213
214// Wrapper for an overload set.
Gabor Marton26f72a92018-07-12 09:42:05 +0000215 template <typename ToDeclT> struct CallOverloadedCreateFun {
216 template <typename... Args>
217 auto operator()(Args &&... args)
218 -> decltype(ToDeclT::Create(std::forward<Args>(args)...)) {
219 return ToDeclT::Create(std::forward<Args>(args)...);
220 }
221 };
222
223 // Always use these functions to create a Decl during import. There are
224 // certain tasks which must be done after the Decl was created, e.g. we
225 // must immediately register that as an imported Decl. The parameter `ToD`
226 // will be set to the newly created Decl or if had been imported before
227 // then to the already imported Decl. Returns a bool value set to true if
228 // the `FromD` had been imported before.
229 template <typename ToDeclT, typename FromDeclT, typename... Args>
230 LLVM_NODISCARD bool GetImportedOrCreateDecl(ToDeclT *&ToD, FromDeclT *FromD,
231 Args &&... args) {
232 // There may be several overloads of ToDeclT::Create. We must make sure
233 // to call the one which would be chosen by the arguments, thus we use a
234 // wrapper for the overload set.
235 CallOverloadedCreateFun<ToDeclT> OC;
236 return GetImportedOrCreateSpecialDecl(ToD, OC, FromD,
237 std::forward<Args>(args)...);
238 }
239 // Use this overload if a special Type is needed to be created. E.g if we
240 // want to create a `TypeAliasDecl` and assign that to a `TypedefNameDecl`
241 // then:
242 // TypedefNameDecl *ToTypedef;
243 // GetImportedOrCreateDecl<TypeAliasDecl>(ToTypedef, FromD, ...);
244 template <typename NewDeclT, typename ToDeclT, typename FromDeclT,
245 typename... Args>
246 LLVM_NODISCARD bool GetImportedOrCreateDecl(ToDeclT *&ToD, FromDeclT *FromD,
247 Args &&... args) {
248 CallOverloadedCreateFun<NewDeclT> OC;
249 return GetImportedOrCreateSpecialDecl(ToD, OC, FromD,
250 std::forward<Args>(args)...);
251 }
252 // Use this version if a special create function must be
253 // used, e.g. CXXRecordDecl::CreateLambda .
254 template <typename ToDeclT, typename CreateFunT, typename FromDeclT,
255 typename... Args>
256 LLVM_NODISCARD bool
257 GetImportedOrCreateSpecialDecl(ToDeclT *&ToD, CreateFunT CreateFun,
258 FromDeclT *FromD, Args &&... args) {
Gabor Marton303c98612019-06-25 08:00:51 +0000259 if (Importer.getImportDeclErrorIfAny(FromD)) {
260 ToD = nullptr;
261 return true; // Already imported but with error.
262 }
Gabor Marton26f72a92018-07-12 09:42:05 +0000263 ToD = cast_or_null<ToDeclT>(Importer.GetAlreadyImportedOrNull(FromD));
264 if (ToD)
265 return true; // Already imported.
266 ToD = CreateFun(std::forward<Args>(args)...);
Gabor Marton54058b52018-12-17 13:53:12 +0000267 // Keep track of imported Decls.
Raphael Isemanne9bc35f2019-04-29 21:02:35 +0000268 Importer.RegisterImportedDecl(FromD, ToD);
Gabor Marton26f72a92018-07-12 09:42:05 +0000269 InitializeImportedDecl(FromD, ToD);
270 return false; // A new Decl is created.
271 }
272
273 void InitializeImportedDecl(Decl *FromD, Decl *ToD) {
Gabor Marton26f72a92018-07-12 09:42:05 +0000274 ToD->IdentifierNamespace = FromD->IdentifierNamespace;
275 if (FromD->hasAttrs())
Balazs Keri57949eb2019-03-25 09:16:39 +0000276 for (const Attr *FromAttr : FromD->getAttrs()) {
277 // FIXME: Return of the error here is not possible until store of
278 // import errors is implemented.
279 auto ToAttrOrErr = import(FromAttr);
280 if (ToAttrOrErr)
281 ToD->addAttr(*ToAttrOrErr);
282 else
283 llvm::consumeError(ToAttrOrErr.takeError());
284 }
Gabor Marton26f72a92018-07-12 09:42:05 +0000285 if (FromD->isUsed())
286 ToD->setIsUsed();
287 if (FromD->isImplicit())
288 ToD->setImplicit();
289 }
290
Gabor Martondd59d272019-03-19 14:04:50 +0000291 // Check if we have found an existing definition. Returns with that
292 // definition if yes, otherwise returns null.
293 Decl *FindAndMapDefinition(FunctionDecl *D, FunctionDecl *FoundFunction) {
294 const FunctionDecl *Definition = nullptr;
295 if (D->doesThisDeclarationHaveABody() &&
296 FoundFunction->hasBody(Definition))
297 return Importer.MapImported(D, const_cast<FunctionDecl *>(Definition));
298 return nullptr;
299 }
300
Douglas Gregor96e578d2010-02-05 17:54:41 +0000301 public:
Eugene Zelenko9a9c8232018-04-09 21:54:38 +0000302 explicit ASTNodeImporter(ASTImporter &Importer) : Importer(Importer) {}
Gabor Marton344b0992018-05-16 11:48:11 +0000303
Balazs Keri3b30d652018-10-19 13:32:20 +0000304 using TypeVisitor<ASTNodeImporter, ExpectedType>::Visit;
305 using DeclVisitor<ASTNodeImporter, ExpectedDecl>::Visit;
306 using StmtVisitor<ASTNodeImporter, ExpectedStmt>::Visit;
Douglas Gregor96e578d2010-02-05 17:54:41 +0000307
308 // Importing types
Balazs Keri3b30d652018-10-19 13:32:20 +0000309 ExpectedType VisitType(const Type *T);
310 ExpectedType VisitAtomicType(const AtomicType *T);
311 ExpectedType VisitBuiltinType(const BuiltinType *T);
312 ExpectedType VisitDecayedType(const DecayedType *T);
313 ExpectedType VisitComplexType(const ComplexType *T);
314 ExpectedType VisitPointerType(const PointerType *T);
315 ExpectedType VisitBlockPointerType(const BlockPointerType *T);
316 ExpectedType VisitLValueReferenceType(const LValueReferenceType *T);
317 ExpectedType VisitRValueReferenceType(const RValueReferenceType *T);
318 ExpectedType VisitMemberPointerType(const MemberPointerType *T);
319 ExpectedType VisitConstantArrayType(const ConstantArrayType *T);
320 ExpectedType VisitIncompleteArrayType(const IncompleteArrayType *T);
321 ExpectedType VisitVariableArrayType(const VariableArrayType *T);
322 ExpectedType VisitDependentSizedArrayType(const DependentSizedArrayType *T);
Douglas Gregor96e578d2010-02-05 17:54:41 +0000323 // FIXME: DependentSizedExtVectorType
Balazs Keri3b30d652018-10-19 13:32:20 +0000324 ExpectedType VisitVectorType(const VectorType *T);
325 ExpectedType VisitExtVectorType(const ExtVectorType *T);
326 ExpectedType VisitFunctionNoProtoType(const FunctionNoProtoType *T);
327 ExpectedType VisitFunctionProtoType(const FunctionProtoType *T);
328 ExpectedType VisitUnresolvedUsingType(const UnresolvedUsingType *T);
329 ExpectedType VisitParenType(const ParenType *T);
330 ExpectedType VisitTypedefType(const TypedefType *T);
331 ExpectedType VisitTypeOfExprType(const TypeOfExprType *T);
Douglas Gregor96e578d2010-02-05 17:54:41 +0000332 // FIXME: DependentTypeOfExprType
Balazs Keri3b30d652018-10-19 13:32:20 +0000333 ExpectedType VisitTypeOfType(const TypeOfType *T);
334 ExpectedType VisitDecltypeType(const DecltypeType *T);
335 ExpectedType VisitUnaryTransformType(const UnaryTransformType *T);
336 ExpectedType VisitAutoType(const AutoType *T);
337 ExpectedType VisitInjectedClassNameType(const InjectedClassNameType *T);
Douglas Gregor96e578d2010-02-05 17:54:41 +0000338 // FIXME: DependentDecltypeType
Balazs Keri3b30d652018-10-19 13:32:20 +0000339 ExpectedType VisitRecordType(const RecordType *T);
340 ExpectedType VisitEnumType(const EnumType *T);
341 ExpectedType VisitAttributedType(const AttributedType *T);
342 ExpectedType VisitTemplateTypeParmType(const TemplateTypeParmType *T);
343 ExpectedType VisitSubstTemplateTypeParmType(
344 const SubstTemplateTypeParmType *T);
345 ExpectedType VisitTemplateSpecializationType(
346 const TemplateSpecializationType *T);
347 ExpectedType VisitElaboratedType(const ElaboratedType *T);
348 ExpectedType VisitDependentNameType(const DependentNameType *T);
349 ExpectedType VisitPackExpansionType(const PackExpansionType *T);
350 ExpectedType VisitDependentTemplateSpecializationType(
Gabor Horvathc78d99a2018-01-27 16:11:45 +0000351 const DependentTemplateSpecializationType *T);
Balazs Keri3b30d652018-10-19 13:32:20 +0000352 ExpectedType VisitObjCInterfaceType(const ObjCInterfaceType *T);
353 ExpectedType VisitObjCObjectType(const ObjCObjectType *T);
354 ExpectedType VisitObjCObjectPointerType(const ObjCObjectPointerType *T);
Rafael Stahldf556202018-05-29 08:12:15 +0000355
356 // Importing declarations
Balazs Keri3b30d652018-10-19 13:32:20 +0000357 Error ImportDeclParts(
358 NamedDecl *D, DeclContext *&DC, DeclContext *&LexicalDC,
359 DeclarationName &Name, NamedDecl *&ToD, SourceLocation &Loc);
360 Error ImportDefinitionIfNeeded(Decl *FromD, Decl *ToD = nullptr);
361 Error ImportDeclarationNameLoc(
362 const DeclarationNameInfo &From, DeclarationNameInfo &To);
363 Error ImportDeclContext(DeclContext *FromDC, bool ForceImport = false);
364 Error ImportDeclContext(
365 Decl *From, DeclContext *&ToDC, DeclContext *&ToLexicalDC);
366 Error ImportImplicitMethods(const CXXRecordDecl *From, CXXRecordDecl *To);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +0000367
Balazs Keri3b30d652018-10-19 13:32:20 +0000368 Expected<CXXCastPath> ImportCastPath(CastExpr *E);
Aleksei Sidorina693b372016-09-28 10:16:56 +0000369
Eugene Zelenko9a9c8232018-04-09 21:54:38 +0000370 using Designator = DesignatedInitExpr::Designator;
371
Adrian Prantl9fc8faf2018-05-09 01:00:01 +0000372 /// What we should import from the definition.
Fangrui Song6907ce22018-07-30 19:24:48 +0000373 enum ImportDefinitionKind {
Adrian Prantl9fc8faf2018-05-09 01:00:01 +0000374 /// Import the default subset of the definition, which might be
Douglas Gregor95d82832012-01-24 18:36:04 +0000375 /// nothing (if minimal import is set) or might be everything (if minimal
376 /// import is not set).
377 IDK_Default,
Adrian Prantl9fc8faf2018-05-09 01:00:01 +0000378 /// Import everything.
Douglas Gregor95d82832012-01-24 18:36:04 +0000379 IDK_Everything,
Adrian Prantl9fc8faf2018-05-09 01:00:01 +0000380 /// Import only the bare bones needed to establish a valid
Douglas Gregor95d82832012-01-24 18:36:04 +0000381 /// DeclContext.
382 IDK_Basic
383 };
384
Douglas Gregor2e15c842012-02-01 21:00:38 +0000385 bool shouldForceImportDeclContext(ImportDefinitionKind IDK) {
386 return IDK == IDK_Everything ||
387 (IDK == IDK_Default && !Importer.isMinimalImport());
388 }
389
Balazs Keri3b30d652018-10-19 13:32:20 +0000390 Error ImportInitializer(VarDecl *From, VarDecl *To);
391 Error ImportDefinition(
392 RecordDecl *From, RecordDecl *To,
393 ImportDefinitionKind Kind = IDK_Default);
394 Error ImportDefinition(
395 EnumDecl *From, EnumDecl *To,
396 ImportDefinitionKind Kind = IDK_Default);
397 Error ImportDefinition(
398 ObjCInterfaceDecl *From, ObjCInterfaceDecl *To,
399 ImportDefinitionKind Kind = IDK_Default);
400 Error ImportDefinition(
401 ObjCProtocolDecl *From, ObjCProtocolDecl *To,
402 ImportDefinitionKind Kind = IDK_Default);
Balazs Keri3b30d652018-10-19 13:32:20 +0000403 Error ImportTemplateArguments(
404 const TemplateArgument *FromArgs, unsigned NumFromArgs,
405 SmallVectorImpl<TemplateArgument> &ToArgs);
406 Expected<TemplateArgument>
407 ImportTemplateArgument(const TemplateArgument &From);
Aleksei Sidorin8fc85102018-01-26 11:36:54 +0000408
Aleksei Sidorin7f758b62017-12-27 17:04:42 +0000409 template <typename InContainerTy>
Balazs Keri3b30d652018-10-19 13:32:20 +0000410 Error ImportTemplateArgumentListInfo(
411 const InContainerTy &Container, TemplateArgumentListInfo &ToTAInfo);
Aleksei Sidorin8fc85102018-01-26 11:36:54 +0000412
413 template<typename InContainerTy>
Balazs Keri3b30d652018-10-19 13:32:20 +0000414 Error ImportTemplateArgumentListInfo(
415 SourceLocation FromLAngleLoc, SourceLocation FromRAngleLoc,
416 const InContainerTy &Container, TemplateArgumentListInfo &Result);
Aleksei Sidorin8fc85102018-01-26 11:36:54 +0000417
Gabor Marton5254e642018-06-27 13:32:50 +0000418 using TemplateArgsTy = SmallVector<TemplateArgument, 8>;
Balazs Keri3b30d652018-10-19 13:32:20 +0000419 using FunctionTemplateAndArgsTy =
420 std::tuple<FunctionTemplateDecl *, TemplateArgsTy>;
421 Expected<FunctionTemplateAndArgsTy>
Gabor Marton5254e642018-06-27 13:32:50 +0000422 ImportFunctionTemplateWithTemplateArgsFromSpecialization(
423 FunctionDecl *FromFD);
Balazs Keri1efc9742019-05-07 10:55:11 +0000424 Error ImportTemplateParameterLists(const DeclaratorDecl *FromD,
425 DeclaratorDecl *ToD);
Gabor Marton5254e642018-06-27 13:32:50 +0000426
Balazs Keri3b30d652018-10-19 13:32:20 +0000427 Error ImportTemplateInformation(FunctionDecl *FromFD, FunctionDecl *ToFD);
Aleksei Sidorin8fc85102018-01-26 11:36:54 +0000428
Shafik Yaghmour96b3d202019-01-28 21:55:33 +0000429 Error ImportFunctionDeclBody(FunctionDecl *FromFD, FunctionDecl *ToFD);
430
Balazs Keric5095942019-08-14 09:41:39 +0000431 Error ImportDefaultArgOfParmVarDecl(const ParmVarDecl *FromParam,
432 ParmVarDecl *ToParam);
433
Gabor Marton458d1452019-02-14 13:07:03 +0000434 template <typename T>
435 bool hasSameVisibilityContext(T *Found, T *From);
436
Gabor Marton950fb572018-07-17 12:39:27 +0000437 bool IsStructuralMatch(Decl *From, Decl *To, bool Complain);
Douglas Gregordd6006f2012-07-17 21:16:27 +0000438 bool IsStructuralMatch(RecordDecl *FromRecord, RecordDecl *ToRecord,
439 bool Complain = true);
Larisse Voufo39a1e502013-08-06 01:03:05 +0000440 bool IsStructuralMatch(VarDecl *FromVar, VarDecl *ToVar,
441 bool Complain = true);
Douglas Gregor3996e242010-02-15 22:01:00 +0000442 bool IsStructuralMatch(EnumDecl *FromEnum, EnumDecl *ToRecord);
Douglas Gregor91155082012-11-14 22:29:20 +0000443 bool IsStructuralMatch(EnumConstantDecl *FromEC, EnumConstantDecl *ToEC);
Aleksei Sidorin7f758b62017-12-27 17:04:42 +0000444 bool IsStructuralMatch(FunctionTemplateDecl *From,
445 FunctionTemplateDecl *To);
Balazs Keric7797c42018-07-11 09:37:24 +0000446 bool IsStructuralMatch(FunctionDecl *From, FunctionDecl *To);
Douglas Gregora082a492010-11-30 19:14:50 +0000447 bool IsStructuralMatch(ClassTemplateDecl *From, ClassTemplateDecl *To);
Larisse Voufo39a1e502013-08-06 01:03:05 +0000448 bool IsStructuralMatch(VarTemplateDecl *From, VarTemplateDecl *To);
Balazs Keri3b30d652018-10-19 13:32:20 +0000449 ExpectedDecl VisitDecl(Decl *D);
450 ExpectedDecl VisitImportDecl(ImportDecl *D);
451 ExpectedDecl VisitEmptyDecl(EmptyDecl *D);
452 ExpectedDecl VisitAccessSpecDecl(AccessSpecDecl *D);
453 ExpectedDecl VisitStaticAssertDecl(StaticAssertDecl *D);
454 ExpectedDecl VisitTranslationUnitDecl(TranslationUnitDecl *D);
455 ExpectedDecl VisitNamespaceDecl(NamespaceDecl *D);
456 ExpectedDecl VisitNamespaceAliasDecl(NamespaceAliasDecl *D);
457 ExpectedDecl VisitTypedefNameDecl(TypedefNameDecl *D, bool IsAlias);
458 ExpectedDecl VisitTypedefDecl(TypedefDecl *D);
459 ExpectedDecl VisitTypeAliasDecl(TypeAliasDecl *D);
460 ExpectedDecl VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D);
461 ExpectedDecl VisitLabelDecl(LabelDecl *D);
462 ExpectedDecl VisitEnumDecl(EnumDecl *D);
463 ExpectedDecl VisitRecordDecl(RecordDecl *D);
464 ExpectedDecl VisitEnumConstantDecl(EnumConstantDecl *D);
465 ExpectedDecl VisitFunctionDecl(FunctionDecl *D);
466 ExpectedDecl VisitCXXMethodDecl(CXXMethodDecl *D);
467 ExpectedDecl VisitCXXConstructorDecl(CXXConstructorDecl *D);
468 ExpectedDecl VisitCXXDestructorDecl(CXXDestructorDecl *D);
469 ExpectedDecl VisitCXXConversionDecl(CXXConversionDecl *D);
470 ExpectedDecl VisitFieldDecl(FieldDecl *D);
471 ExpectedDecl VisitIndirectFieldDecl(IndirectFieldDecl *D);
472 ExpectedDecl VisitFriendDecl(FriendDecl *D);
473 ExpectedDecl VisitObjCIvarDecl(ObjCIvarDecl *D);
474 ExpectedDecl VisitVarDecl(VarDecl *D);
475 ExpectedDecl VisitImplicitParamDecl(ImplicitParamDecl *D);
476 ExpectedDecl VisitParmVarDecl(ParmVarDecl *D);
477 ExpectedDecl VisitObjCMethodDecl(ObjCMethodDecl *D);
478 ExpectedDecl VisitObjCTypeParamDecl(ObjCTypeParamDecl *D);
479 ExpectedDecl VisitObjCCategoryDecl(ObjCCategoryDecl *D);
480 ExpectedDecl VisitObjCProtocolDecl(ObjCProtocolDecl *D);
481 ExpectedDecl VisitLinkageSpecDecl(LinkageSpecDecl *D);
482 ExpectedDecl VisitUsingDecl(UsingDecl *D);
483 ExpectedDecl VisitUsingShadowDecl(UsingShadowDecl *D);
484 ExpectedDecl VisitUsingDirectiveDecl(UsingDirectiveDecl *D);
485 ExpectedDecl VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D);
486 ExpectedDecl VisitUnresolvedUsingTypenameDecl(UnresolvedUsingTypenameDecl *D);
Raphael Isemannba7bde62019-10-30 14:50:35 +0100487 ExpectedDecl VisitBuiltinTemplateDecl(BuiltinTemplateDecl *D);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +0000488
Balazs Keri3b30d652018-10-19 13:32:20 +0000489 Expected<ObjCTypeParamList *>
490 ImportObjCTypeParamList(ObjCTypeParamList *list);
491
492 ExpectedDecl VisitObjCInterfaceDecl(ObjCInterfaceDecl *D);
493 ExpectedDecl VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D);
494 ExpectedDecl VisitObjCImplementationDecl(ObjCImplementationDecl *D);
495 ExpectedDecl VisitObjCPropertyDecl(ObjCPropertyDecl *D);
496 ExpectedDecl VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D);
497 ExpectedDecl VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D);
498 ExpectedDecl VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D);
499 ExpectedDecl VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D);
500 ExpectedDecl VisitClassTemplateDecl(ClassTemplateDecl *D);
501 ExpectedDecl VisitClassTemplateSpecializationDecl(
Douglas Gregore2e50d332010-12-01 01:36:18 +0000502 ClassTemplateSpecializationDecl *D);
Balazs Keri3b30d652018-10-19 13:32:20 +0000503 ExpectedDecl VisitVarTemplateDecl(VarTemplateDecl *D);
504 ExpectedDecl VisitVarTemplateSpecializationDecl(VarTemplateSpecializationDecl *D);
505 ExpectedDecl VisitFunctionTemplateDecl(FunctionTemplateDecl *D);
Larisse Voufo39a1e502013-08-06 01:03:05 +0000506
Douglas Gregor7eeb5972010-02-11 19:21:55 +0000507 // Importing statements
Balazs Keri3b30d652018-10-19 13:32:20 +0000508 ExpectedStmt VisitStmt(Stmt *S);
509 ExpectedStmt VisitGCCAsmStmt(GCCAsmStmt *S);
510 ExpectedStmt VisitDeclStmt(DeclStmt *S);
511 ExpectedStmt VisitNullStmt(NullStmt *S);
512 ExpectedStmt VisitCompoundStmt(CompoundStmt *S);
513 ExpectedStmt VisitCaseStmt(CaseStmt *S);
514 ExpectedStmt VisitDefaultStmt(DefaultStmt *S);
515 ExpectedStmt VisitLabelStmt(LabelStmt *S);
516 ExpectedStmt VisitAttributedStmt(AttributedStmt *S);
517 ExpectedStmt VisitIfStmt(IfStmt *S);
518 ExpectedStmt VisitSwitchStmt(SwitchStmt *S);
519 ExpectedStmt VisitWhileStmt(WhileStmt *S);
520 ExpectedStmt VisitDoStmt(DoStmt *S);
521 ExpectedStmt VisitForStmt(ForStmt *S);
522 ExpectedStmt VisitGotoStmt(GotoStmt *S);
523 ExpectedStmt VisitIndirectGotoStmt(IndirectGotoStmt *S);
524 ExpectedStmt VisitContinueStmt(ContinueStmt *S);
525 ExpectedStmt VisitBreakStmt(BreakStmt *S);
526 ExpectedStmt VisitReturnStmt(ReturnStmt *S);
Sean Callanan59721b32015-04-28 18:41:46 +0000527 // FIXME: MSAsmStmt
528 // FIXME: SEHExceptStmt
529 // FIXME: SEHFinallyStmt
530 // FIXME: SEHTryStmt
531 // FIXME: SEHLeaveStmt
532 // FIXME: CapturedStmt
Balazs Keri3b30d652018-10-19 13:32:20 +0000533 ExpectedStmt VisitCXXCatchStmt(CXXCatchStmt *S);
534 ExpectedStmt VisitCXXTryStmt(CXXTryStmt *S);
535 ExpectedStmt VisitCXXForRangeStmt(CXXForRangeStmt *S);
Sean Callanan59721b32015-04-28 18:41:46 +0000536 // FIXME: MSDependentExistsStmt
Balazs Keri3b30d652018-10-19 13:32:20 +0000537 ExpectedStmt VisitObjCForCollectionStmt(ObjCForCollectionStmt *S);
538 ExpectedStmt VisitObjCAtCatchStmt(ObjCAtCatchStmt *S);
539 ExpectedStmt VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S);
540 ExpectedStmt VisitObjCAtTryStmt(ObjCAtTryStmt *S);
541 ExpectedStmt VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *S);
542 ExpectedStmt VisitObjCAtThrowStmt(ObjCAtThrowStmt *S);
543 ExpectedStmt VisitObjCAutoreleasePoolStmt(ObjCAutoreleasePoolStmt *S);
Douglas Gregor7eeb5972010-02-11 19:21:55 +0000544
545 // Importing expressions
Balazs Keri3b30d652018-10-19 13:32:20 +0000546 ExpectedStmt VisitExpr(Expr *E);
547 ExpectedStmt VisitVAArgExpr(VAArgExpr *E);
Tom Roeder521f0042019-02-26 19:26:41 +0000548 ExpectedStmt VisitChooseExpr(ChooseExpr *E);
Balazs Keri3b30d652018-10-19 13:32:20 +0000549 ExpectedStmt VisitGNUNullExpr(GNUNullExpr *E);
550 ExpectedStmt VisitPredefinedExpr(PredefinedExpr *E);
551 ExpectedStmt VisitDeclRefExpr(DeclRefExpr *E);
552 ExpectedStmt VisitImplicitValueInitExpr(ImplicitValueInitExpr *E);
553 ExpectedStmt VisitDesignatedInitExpr(DesignatedInitExpr *E);
554 ExpectedStmt VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E);
555 ExpectedStmt VisitIntegerLiteral(IntegerLiteral *E);
556 ExpectedStmt VisitFloatingLiteral(FloatingLiteral *E);
557 ExpectedStmt VisitImaginaryLiteral(ImaginaryLiteral *E);
558 ExpectedStmt VisitCharacterLiteral(CharacterLiteral *E);
559 ExpectedStmt VisitStringLiteral(StringLiteral *E);
560 ExpectedStmt VisitCompoundLiteralExpr(CompoundLiteralExpr *E);
561 ExpectedStmt VisitAtomicExpr(AtomicExpr *E);
562 ExpectedStmt VisitAddrLabelExpr(AddrLabelExpr *E);
Bill Wendling8003edc2018-11-09 00:41:36 +0000563 ExpectedStmt VisitConstantExpr(ConstantExpr *E);
Balazs Keri3b30d652018-10-19 13:32:20 +0000564 ExpectedStmt VisitParenExpr(ParenExpr *E);
565 ExpectedStmt VisitParenListExpr(ParenListExpr *E);
566 ExpectedStmt VisitStmtExpr(StmtExpr *E);
567 ExpectedStmt VisitUnaryOperator(UnaryOperator *E);
568 ExpectedStmt VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *E);
569 ExpectedStmt VisitBinaryOperator(BinaryOperator *E);
570 ExpectedStmt VisitConditionalOperator(ConditionalOperator *E);
571 ExpectedStmt VisitBinaryConditionalOperator(BinaryConditionalOperator *E);
572 ExpectedStmt VisitOpaqueValueExpr(OpaqueValueExpr *E);
573 ExpectedStmt VisitArrayTypeTraitExpr(ArrayTypeTraitExpr *E);
574 ExpectedStmt VisitExpressionTraitExpr(ExpressionTraitExpr *E);
575 ExpectedStmt VisitArraySubscriptExpr(ArraySubscriptExpr *E);
576 ExpectedStmt VisitCompoundAssignOperator(CompoundAssignOperator *E);
577 ExpectedStmt VisitImplicitCastExpr(ImplicitCastExpr *E);
578 ExpectedStmt VisitExplicitCastExpr(ExplicitCastExpr *E);
579 ExpectedStmt VisitOffsetOfExpr(OffsetOfExpr *OE);
580 ExpectedStmt VisitCXXThrowExpr(CXXThrowExpr *E);
581 ExpectedStmt VisitCXXNoexceptExpr(CXXNoexceptExpr *E);
582 ExpectedStmt VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E);
583 ExpectedStmt VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E);
584 ExpectedStmt VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E);
585 ExpectedStmt VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E);
586 ExpectedStmt VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *E);
587 ExpectedStmt VisitPackExpansionExpr(PackExpansionExpr *E);
588 ExpectedStmt VisitSizeOfPackExpr(SizeOfPackExpr *E);
589 ExpectedStmt VisitCXXNewExpr(CXXNewExpr *E);
590 ExpectedStmt VisitCXXDeleteExpr(CXXDeleteExpr *E);
591 ExpectedStmt VisitCXXConstructExpr(CXXConstructExpr *E);
592 ExpectedStmt VisitCXXMemberCallExpr(CXXMemberCallExpr *E);
593 ExpectedStmt VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E);
594 ExpectedStmt VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E);
595 ExpectedStmt VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr *E);
596 ExpectedStmt VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E);
597 ExpectedStmt VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E);
598 ExpectedStmt VisitExprWithCleanups(ExprWithCleanups *E);
599 ExpectedStmt VisitCXXThisExpr(CXXThisExpr *E);
600 ExpectedStmt VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E);
601 ExpectedStmt VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E);
602 ExpectedStmt VisitMemberExpr(MemberExpr *E);
603 ExpectedStmt VisitCallExpr(CallExpr *E);
604 ExpectedStmt VisitLambdaExpr(LambdaExpr *LE);
605 ExpectedStmt VisitInitListExpr(InitListExpr *E);
606 ExpectedStmt VisitCXXStdInitializerListExpr(CXXStdInitializerListExpr *E);
607 ExpectedStmt VisitCXXInheritedCtorInitExpr(CXXInheritedCtorInitExpr *E);
608 ExpectedStmt VisitArrayInitLoopExpr(ArrayInitLoopExpr *E);
609 ExpectedStmt VisitArrayInitIndexExpr(ArrayInitIndexExpr *E);
610 ExpectedStmt VisitCXXDefaultInitExpr(CXXDefaultInitExpr *E);
611 ExpectedStmt VisitCXXNamedCastExpr(CXXNamedCastExpr *E);
612 ExpectedStmt VisitSubstNonTypeTemplateParmExpr(SubstNonTypeTemplateParmExpr *E);
613 ExpectedStmt VisitTypeTraitExpr(TypeTraitExpr *E);
614 ExpectedStmt VisitCXXTypeidExpr(CXXTypeidExpr *E);
Aleksei Sidorin855086d2017-01-23 09:30:36 +0000615
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +0000616 template<typename IIter, typename OIter>
Balazs Keri3b30d652018-10-19 13:32:20 +0000617 Error ImportArrayChecked(IIter Ibegin, IIter Iend, OIter Obegin) {
Eugene Zelenko9a9c8232018-04-09 21:54:38 +0000618 using ItemT = typename std::remove_reference<decltype(*Obegin)>::type;
Balazs Keri3b30d652018-10-19 13:32:20 +0000619 for (; Ibegin != Iend; ++Ibegin, ++Obegin) {
620 Expected<ItemT> ToOrErr = import(*Ibegin);
621 if (!ToOrErr)
622 return ToOrErr.takeError();
623 *Obegin = *ToOrErr;
624 }
625 return Error::success();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +0000626 }
627
Balazs Keri3b30d652018-10-19 13:32:20 +0000628 // Import every item from a container structure into an output container.
629 // If error occurs, stops at first error and returns the error.
630 // The output container should have space for all needed elements (it is not
631 // expanded, new items are put into from the beginning).
Aleksei Sidorina693b372016-09-28 10:16:56 +0000632 template<typename InContainerTy, typename OutContainerTy>
Balazs Keri3b30d652018-10-19 13:32:20 +0000633 Error ImportContainerChecked(
634 const InContainerTy &InContainer, OutContainerTy &OutContainer) {
635 return ImportArrayChecked(
636 InContainer.begin(), InContainer.end(), OutContainer.begin());
Aleksei Sidorina693b372016-09-28 10:16:56 +0000637 }
638
639 template<typename InContainerTy, typename OIter>
Balazs Keri3b30d652018-10-19 13:32:20 +0000640 Error ImportArrayChecked(const InContainerTy &InContainer, OIter Obegin) {
Aleksei Sidorina693b372016-09-28 10:16:56 +0000641 return ImportArrayChecked(InContainer.begin(), InContainer.end(), Obegin);
642 }
Lang Hames19e07e12017-06-20 21:06:00 +0000643
Balazs Kerib4fd7d42019-08-30 10:12:14 +0000644 Error ImportOverriddenMethods(CXXMethodDecl *ToMethod,
645 CXXMethodDecl *FromMethod);
Gabor Marton5254e642018-06-27 13:32:50 +0000646
Balazs Keri3b30d652018-10-19 13:32:20 +0000647 Expected<FunctionDecl *> FindFunctionTemplateSpecialization(
648 FunctionDecl *FromFD);
Douglas Gregor96e578d2010-02-05 17:54:41 +0000649 };
Aleksei Sidorin782bfcf2018-02-14 11:39:33 +0000650
Aleksei Sidorin782bfcf2018-02-14 11:39:33 +0000651template <typename InContainerTy>
Balazs Keri3b30d652018-10-19 13:32:20 +0000652Error ASTNodeImporter::ImportTemplateArgumentListInfo(
Aleksei Sidorin782bfcf2018-02-14 11:39:33 +0000653 SourceLocation FromLAngleLoc, SourceLocation FromRAngleLoc,
654 const InContainerTy &Container, TemplateArgumentListInfo &Result) {
Balazs Keri3b30d652018-10-19 13:32:20 +0000655 auto ToLAngleLocOrErr = import(FromLAngleLoc);
656 if (!ToLAngleLocOrErr)
657 return ToLAngleLocOrErr.takeError();
658 auto ToRAngleLocOrErr = import(FromRAngleLoc);
659 if (!ToRAngleLocOrErr)
660 return ToRAngleLocOrErr.takeError();
661
662 TemplateArgumentListInfo ToTAInfo(*ToLAngleLocOrErr, *ToRAngleLocOrErr);
663 if (auto Err = ImportTemplateArgumentListInfo(Container, ToTAInfo))
664 return Err;
Aleksei Sidorin782bfcf2018-02-14 11:39:33 +0000665 Result = ToTAInfo;
Balazs Keri3b30d652018-10-19 13:32:20 +0000666 return Error::success();
Alexander Kornienkoab9db512015-06-22 23:07:51 +0000667}
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +0000668
Aleksei Sidorin782bfcf2018-02-14 11:39:33 +0000669template <>
Balazs Keri3b30d652018-10-19 13:32:20 +0000670Error ASTNodeImporter::ImportTemplateArgumentListInfo<TemplateArgumentListInfo>(
Aleksei Sidorin782bfcf2018-02-14 11:39:33 +0000671 const TemplateArgumentListInfo &From, TemplateArgumentListInfo &Result) {
672 return ImportTemplateArgumentListInfo(
673 From.getLAngleLoc(), From.getRAngleLoc(), From.arguments(), Result);
674}
675
676template <>
Balazs Keri3b30d652018-10-19 13:32:20 +0000677Error ASTNodeImporter::ImportTemplateArgumentListInfo<
678 ASTTemplateArgumentListInfo>(
679 const ASTTemplateArgumentListInfo &From,
680 TemplateArgumentListInfo &Result) {
681 return ImportTemplateArgumentListInfo(
682 From.LAngleLoc, From.RAngleLoc, From.arguments(), Result);
Aleksei Sidorin782bfcf2018-02-14 11:39:33 +0000683}
684
Balazs Keri3b30d652018-10-19 13:32:20 +0000685Expected<ASTNodeImporter::FunctionTemplateAndArgsTy>
Gabor Marton5254e642018-06-27 13:32:50 +0000686ASTNodeImporter::ImportFunctionTemplateWithTemplateArgsFromSpecialization(
687 FunctionDecl *FromFD) {
688 assert(FromFD->getTemplatedKind() ==
Balazs Keri3b30d652018-10-19 13:32:20 +0000689 FunctionDecl::TK_FunctionTemplateSpecialization);
690
691 FunctionTemplateAndArgsTy Result;
692
Gabor Marton5254e642018-06-27 13:32:50 +0000693 auto *FTSInfo = FromFD->getTemplateSpecializationInfo();
Balazs Keri3b30d652018-10-19 13:32:20 +0000694 if (Error Err = importInto(std::get<0>(Result), FTSInfo->getTemplate()))
695 return std::move(Err);
Gabor Marton5254e642018-06-27 13:32:50 +0000696
697 // Import template arguments.
698 auto TemplArgs = FTSInfo->TemplateArguments->asArray();
Balazs Keri3b30d652018-10-19 13:32:20 +0000699 if (Error Err = ImportTemplateArguments(TemplArgs.data(), TemplArgs.size(),
700 std::get<1>(Result)))
701 return std::move(Err);
Gabor Marton5254e642018-06-27 13:32:50 +0000702
Balazs Keri3b30d652018-10-19 13:32:20 +0000703 return Result;
704}
705
706template <>
707Expected<TemplateParameterList *>
708ASTNodeImporter::import(TemplateParameterList *From) {
709 SmallVector<NamedDecl *, 4> To(From->size());
710 if (Error Err = ImportContainerChecked(*From, To))
711 return std::move(Err);
712
713 ExpectedExpr ToRequiresClause = import(From->getRequiresClause());
714 if (!ToRequiresClause)
715 return ToRequiresClause.takeError();
716
717 auto ToTemplateLocOrErr = import(From->getTemplateLoc());
718 if (!ToTemplateLocOrErr)
719 return ToTemplateLocOrErr.takeError();
720 auto ToLAngleLocOrErr = import(From->getLAngleLoc());
721 if (!ToLAngleLocOrErr)
722 return ToLAngleLocOrErr.takeError();
723 auto ToRAngleLocOrErr = import(From->getRAngleLoc());
724 if (!ToRAngleLocOrErr)
725 return ToRAngleLocOrErr.takeError();
726
727 return TemplateParameterList::Create(
728 Importer.getToContext(),
729 *ToTemplateLocOrErr,
730 *ToLAngleLocOrErr,
731 To,
732 *ToRAngleLocOrErr,
733 *ToRequiresClause);
734}
735
736template <>
737Expected<TemplateArgument>
738ASTNodeImporter::import(const TemplateArgument &From) {
739 switch (From.getKind()) {
740 case TemplateArgument::Null:
741 return TemplateArgument();
742
743 case TemplateArgument::Type: {
744 ExpectedType ToTypeOrErr = import(From.getAsType());
745 if (!ToTypeOrErr)
746 return ToTypeOrErr.takeError();
747 return TemplateArgument(*ToTypeOrErr);
748 }
749
750 case TemplateArgument::Integral: {
751 ExpectedType ToTypeOrErr = import(From.getIntegralType());
752 if (!ToTypeOrErr)
753 return ToTypeOrErr.takeError();
754 return TemplateArgument(From, *ToTypeOrErr);
755 }
756
757 case TemplateArgument::Declaration: {
758 Expected<ValueDecl *> ToOrErr = import(From.getAsDecl());
759 if (!ToOrErr)
760 return ToOrErr.takeError();
761 ExpectedType ToTypeOrErr = import(From.getParamTypeForDecl());
762 if (!ToTypeOrErr)
763 return ToTypeOrErr.takeError();
764 return TemplateArgument(*ToOrErr, *ToTypeOrErr);
765 }
766
767 case TemplateArgument::NullPtr: {
768 ExpectedType ToTypeOrErr = import(From.getNullPtrType());
769 if (!ToTypeOrErr)
770 return ToTypeOrErr.takeError();
771 return TemplateArgument(*ToTypeOrErr, /*isNullPtr*/true);
772 }
773
774 case TemplateArgument::Template: {
775 Expected<TemplateName> ToTemplateOrErr = import(From.getAsTemplate());
776 if (!ToTemplateOrErr)
777 return ToTemplateOrErr.takeError();
778
779 return TemplateArgument(*ToTemplateOrErr);
780 }
781
782 case TemplateArgument::TemplateExpansion: {
783 Expected<TemplateName> ToTemplateOrErr =
784 import(From.getAsTemplateOrTemplatePattern());
785 if (!ToTemplateOrErr)
786 return ToTemplateOrErr.takeError();
787
788 return TemplateArgument(
789 *ToTemplateOrErr, From.getNumTemplateExpansions());
790 }
791
792 case TemplateArgument::Expression:
793 if (ExpectedExpr ToExpr = import(From.getAsExpr()))
794 return TemplateArgument(*ToExpr);
795 else
796 return ToExpr.takeError();
797
798 case TemplateArgument::Pack: {
799 SmallVector<TemplateArgument, 2> ToPack;
800 ToPack.reserve(From.pack_size());
801 if (Error Err = ImportTemplateArguments(
802 From.pack_begin(), From.pack_size(), ToPack))
803 return std::move(Err);
804
805 return TemplateArgument(
806 llvm::makeArrayRef(ToPack).copy(Importer.getToContext()));
807 }
808 }
809
810 llvm_unreachable("Invalid template argument kind");
811}
812
813template <>
814Expected<TemplateArgumentLoc>
815ASTNodeImporter::import(const TemplateArgumentLoc &TALoc) {
816 Expected<TemplateArgument> ArgOrErr = import(TALoc.getArgument());
817 if (!ArgOrErr)
818 return ArgOrErr.takeError();
819 TemplateArgument Arg = *ArgOrErr;
820
821 TemplateArgumentLocInfo FromInfo = TALoc.getLocInfo();
822
823 TemplateArgumentLocInfo ToInfo;
824 if (Arg.getKind() == TemplateArgument::Expression) {
825 ExpectedExpr E = import(FromInfo.getAsExpr());
826 if (!E)
827 return E.takeError();
828 ToInfo = TemplateArgumentLocInfo(*E);
829 } else if (Arg.getKind() == TemplateArgument::Type) {
830 if (auto TSIOrErr = import(FromInfo.getAsTypeSourceInfo()))
831 ToInfo = TemplateArgumentLocInfo(*TSIOrErr);
832 else
833 return TSIOrErr.takeError();
834 } else {
835 auto ToTemplateQualifierLocOrErr =
836 import(FromInfo.getTemplateQualifierLoc());
837 if (!ToTemplateQualifierLocOrErr)
838 return ToTemplateQualifierLocOrErr.takeError();
839 auto ToTemplateNameLocOrErr = import(FromInfo.getTemplateNameLoc());
840 if (!ToTemplateNameLocOrErr)
841 return ToTemplateNameLocOrErr.takeError();
842 auto ToTemplateEllipsisLocOrErr =
843 import(FromInfo.getTemplateEllipsisLoc());
844 if (!ToTemplateEllipsisLocOrErr)
845 return ToTemplateEllipsisLocOrErr.takeError();
846
847 ToInfo = TemplateArgumentLocInfo(
848 *ToTemplateQualifierLocOrErr,
849 *ToTemplateNameLocOrErr,
850 *ToTemplateEllipsisLocOrErr);
851 }
852
853 return TemplateArgumentLoc(Arg, ToInfo);
854}
855
856template <>
857Expected<DeclGroupRef> ASTNodeImporter::import(const DeclGroupRef &DG) {
858 if (DG.isNull())
859 return DeclGroupRef::Create(Importer.getToContext(), nullptr, 0);
860 size_t NumDecls = DG.end() - DG.begin();
861 SmallVector<Decl *, 1> ToDecls;
862 ToDecls.reserve(NumDecls);
863 for (Decl *FromD : DG) {
864 if (auto ToDOrErr = import(FromD))
865 ToDecls.push_back(*ToDOrErr);
866 else
867 return ToDOrErr.takeError();
868 }
869 return DeclGroupRef::Create(Importer.getToContext(),
870 ToDecls.begin(),
871 NumDecls);
872}
873
874template <>
875Expected<ASTNodeImporter::Designator>
876ASTNodeImporter::import(const Designator &D) {
877 if (D.isFieldDesignator()) {
878 IdentifierInfo *ToFieldName = Importer.Import(D.getFieldName());
879
880 ExpectedSLoc ToDotLocOrErr = import(D.getDotLoc());
881 if (!ToDotLocOrErr)
882 return ToDotLocOrErr.takeError();
883
884 ExpectedSLoc ToFieldLocOrErr = import(D.getFieldLoc());
885 if (!ToFieldLocOrErr)
886 return ToFieldLocOrErr.takeError();
887
888 return Designator(ToFieldName, *ToDotLocOrErr, *ToFieldLocOrErr);
889 }
890
891 ExpectedSLoc ToLBracketLocOrErr = import(D.getLBracketLoc());
892 if (!ToLBracketLocOrErr)
893 return ToLBracketLocOrErr.takeError();
894
895 ExpectedSLoc ToRBracketLocOrErr = import(D.getRBracketLoc());
896 if (!ToRBracketLocOrErr)
897 return ToRBracketLocOrErr.takeError();
898
899 if (D.isArrayDesignator())
900 return Designator(D.getFirstExprIndex(),
901 *ToLBracketLocOrErr, *ToRBracketLocOrErr);
902
903 ExpectedSLoc ToEllipsisLocOrErr = import(D.getEllipsisLoc());
904 if (!ToEllipsisLocOrErr)
905 return ToEllipsisLocOrErr.takeError();
906
907 assert(D.isArrayRangeDesignator());
908 return Designator(
909 D.getFirstExprIndex(), *ToLBracketLocOrErr, *ToEllipsisLocOrErr,
910 *ToRBracketLocOrErr);
911}
912
913template <>
914Expected<LambdaCapture> ASTNodeImporter::import(const LambdaCapture &From) {
915 VarDecl *Var = nullptr;
916 if (From.capturesVariable()) {
917 if (auto VarOrErr = import(From.getCapturedVar()))
918 Var = *VarOrErr;
919 else
920 return VarOrErr.takeError();
921 }
922
923 auto LocationOrErr = import(From.getLocation());
924 if (!LocationOrErr)
925 return LocationOrErr.takeError();
926
927 SourceLocation EllipsisLoc;
928 if (From.isPackExpansion())
929 if (Error Err = importInto(EllipsisLoc, From.getEllipsisLoc()))
930 return std::move(Err);
931
932 return LambdaCapture(
933 *LocationOrErr, From.isImplicit(), From.getCaptureKind(), Var,
934 EllipsisLoc);
Gabor Marton5254e642018-06-27 13:32:50 +0000935}
936
Balazs Keric86d47b2019-09-04 14:12:18 +0000937template <typename T>
938bool ASTNodeImporter::hasSameVisibilityContext(T *Found, T *From) {
939 if (From->hasExternalFormalLinkage())
940 return Found->hasExternalFormalLinkage();
941 if (Importer.GetFromTU(Found) != From->getTranslationUnitDecl())
942 return false;
943 if (From->isInAnonymousNamespace())
944 return Found->isInAnonymousNamespace();
945 else
946 return !Found->isInAnonymousNamespace() &&
947 !Found->hasExternalFormalLinkage();
948}
949
950template <>
951bool ASTNodeImporter::hasSameVisibilityContext(TypedefNameDecl *Found,
952 TypedefNameDecl *From) {
953 if (From->isInAnonymousNamespace() && Found->isInAnonymousNamespace())
954 return Importer.GetFromTU(Found) == From->getTranslationUnitDecl();
955 return From->isInAnonymousNamespace() == Found->isInAnonymousNamespace();
956}
957
Eugene Zelenko9a9c8232018-04-09 21:54:38 +0000958} // namespace clang
Aleksei Sidorin782bfcf2018-02-14 11:39:33 +0000959
Douglas Gregor3996e242010-02-15 22:01:00 +0000960//----------------------------------------------------------------------------
Douglas Gregor96e578d2010-02-05 17:54:41 +0000961// Import Types
962//----------------------------------------------------------------------------
963
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +0000964using namespace clang;
965
Balazs Keri3b30d652018-10-19 13:32:20 +0000966ExpectedType ASTNodeImporter::VisitType(const Type *T) {
Douglas Gregore4c83e42010-02-09 22:48:33 +0000967 Importer.FromDiag(SourceLocation(), diag::err_unsupported_ast_node)
968 << T->getTypeClassName();
Balazs Keri3b30d652018-10-19 13:32:20 +0000969 return make_error<ImportError>(ImportError::UnsupportedConstruct);
Douglas Gregore4c83e42010-02-09 22:48:33 +0000970}
971
Balazs Keri3b30d652018-10-19 13:32:20 +0000972ExpectedType ASTNodeImporter::VisitAtomicType(const AtomicType *T){
973 ExpectedType UnderlyingTypeOrErr = import(T->getValueType());
974 if (!UnderlyingTypeOrErr)
975 return UnderlyingTypeOrErr.takeError();
Gabor Horvath0866c2f2016-11-23 15:24:23 +0000976
Balazs Keri3b30d652018-10-19 13:32:20 +0000977 return Importer.getToContext().getAtomicType(*UnderlyingTypeOrErr);
Gabor Horvath0866c2f2016-11-23 15:24:23 +0000978}
979
Balazs Keri3b30d652018-10-19 13:32:20 +0000980ExpectedType ASTNodeImporter::VisitBuiltinType(const BuiltinType *T) {
Douglas Gregor96e578d2010-02-05 17:54:41 +0000981 switch (T->getKind()) {
Alexey Bader954ba212016-04-08 13:40:33 +0000982#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
983 case BuiltinType::Id: \
984 return Importer.getToContext().SingletonId;
Alexey Baderb62f1442016-04-13 08:33:41 +0000985#include "clang/Basic/OpenCLImageTypes.def"
Andrew Savonichev3fee3512018-11-08 11:25:41 +0000986#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
987 case BuiltinType::Id: \
988 return Importer.getToContext().Id##Ty;
989#include "clang/Basic/OpenCLExtensionTypes.def"
Richard Sandifordeb485fb2019-08-09 08:52:54 +0000990#define SVE_TYPE(Name, Id, SingletonId) \
991 case BuiltinType::Id: \
992 return Importer.getToContext().SingletonId;
993#include "clang/Basic/AArch64SVEACLETypes.def"
John McCalle314e272011-10-18 21:02:43 +0000994#define SHARED_SINGLETON_TYPE(Expansion)
995#define BUILTIN_TYPE(Id, SingletonId) \
996 case BuiltinType::Id: return Importer.getToContext().SingletonId;
997#include "clang/AST/BuiltinTypes.def"
998
999 // FIXME: for Char16, Char32, and NullPtr, make sure that the "to"
1000 // context supports C++.
1001
1002 // FIXME: for ObjCId, ObjCClass, and ObjCSel, make sure that the "to"
1003 // context supports ObjC.
1004
Douglas Gregor96e578d2010-02-05 17:54:41 +00001005 case BuiltinType::Char_U:
Fangrui Song6907ce22018-07-30 19:24:48 +00001006 // The context we're importing from has an unsigned 'char'. If we're
1007 // importing into a context with a signed 'char', translate to
Douglas Gregor96e578d2010-02-05 17:54:41 +00001008 // 'unsigned char' instead.
David Blaikiebbafb8a2012-03-11 07:00:24 +00001009 if (Importer.getToContext().getLangOpts().CharIsSigned)
Douglas Gregor96e578d2010-02-05 17:54:41 +00001010 return Importer.getToContext().UnsignedCharTy;
Fangrui Song6907ce22018-07-30 19:24:48 +00001011
Douglas Gregor96e578d2010-02-05 17:54:41 +00001012 return Importer.getToContext().CharTy;
1013
Douglas Gregor96e578d2010-02-05 17:54:41 +00001014 case BuiltinType::Char_S:
Fangrui Song6907ce22018-07-30 19:24:48 +00001015 // The context we're importing from has an unsigned 'char'. If we're
1016 // importing into a context with a signed 'char', translate to
Douglas Gregor96e578d2010-02-05 17:54:41 +00001017 // 'unsigned char' instead.
David Blaikiebbafb8a2012-03-11 07:00:24 +00001018 if (!Importer.getToContext().getLangOpts().CharIsSigned)
Douglas Gregor96e578d2010-02-05 17:54:41 +00001019 return Importer.getToContext().SignedCharTy;
Fangrui Song6907ce22018-07-30 19:24:48 +00001020
Douglas Gregor96e578d2010-02-05 17:54:41 +00001021 return Importer.getToContext().CharTy;
1022
Chris Lattnerad3467e2010-12-25 23:25:43 +00001023 case BuiltinType::WChar_S:
1024 case BuiltinType::WChar_U:
Douglas Gregor96e578d2010-02-05 17:54:41 +00001025 // FIXME: If not in C++, shall we translate to the C equivalent of
1026 // wchar_t?
1027 return Importer.getToContext().WCharTy;
Douglas Gregor96e578d2010-02-05 17:54:41 +00001028 }
David Blaikiee4d798f2012-01-20 21:50:17 +00001029
1030 llvm_unreachable("Invalid BuiltinType Kind!");
Douglas Gregor96e578d2010-02-05 17:54:41 +00001031}
1032
Balazs Keri3b30d652018-10-19 13:32:20 +00001033ExpectedType ASTNodeImporter::VisitDecayedType(const DecayedType *T) {
1034 ExpectedType ToOriginalTypeOrErr = import(T->getOriginalType());
1035 if (!ToOriginalTypeOrErr)
1036 return ToOriginalTypeOrErr.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00001037
Balazs Keri3b30d652018-10-19 13:32:20 +00001038 return Importer.getToContext().getDecayedType(*ToOriginalTypeOrErr);
Aleksei Sidorina693b372016-09-28 10:16:56 +00001039}
1040
Balazs Keri3b30d652018-10-19 13:32:20 +00001041ExpectedType ASTNodeImporter::VisitComplexType(const ComplexType *T) {
1042 ExpectedType ToElementTypeOrErr = import(T->getElementType());
1043 if (!ToElementTypeOrErr)
1044 return ToElementTypeOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001045
Balazs Keri3b30d652018-10-19 13:32:20 +00001046 return Importer.getToContext().getComplexType(*ToElementTypeOrErr);
Douglas Gregor96e578d2010-02-05 17:54:41 +00001047}
1048
Balazs Keri3b30d652018-10-19 13:32:20 +00001049ExpectedType ASTNodeImporter::VisitPointerType(const PointerType *T) {
1050 ExpectedType ToPointeeTypeOrErr = import(T->getPointeeType());
1051 if (!ToPointeeTypeOrErr)
1052 return ToPointeeTypeOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001053
Balazs Keri3b30d652018-10-19 13:32:20 +00001054 return Importer.getToContext().getPointerType(*ToPointeeTypeOrErr);
Douglas Gregor96e578d2010-02-05 17:54:41 +00001055}
1056
Balazs Keri3b30d652018-10-19 13:32:20 +00001057ExpectedType ASTNodeImporter::VisitBlockPointerType(const BlockPointerType *T) {
Douglas Gregor96e578d2010-02-05 17:54:41 +00001058 // FIXME: Check for blocks support in "to" context.
Balazs Keri3b30d652018-10-19 13:32:20 +00001059 ExpectedType ToPointeeTypeOrErr = import(T->getPointeeType());
1060 if (!ToPointeeTypeOrErr)
1061 return ToPointeeTypeOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001062
Balazs Keri3b30d652018-10-19 13:32:20 +00001063 return Importer.getToContext().getBlockPointerType(*ToPointeeTypeOrErr);
Douglas Gregor96e578d2010-02-05 17:54:41 +00001064}
1065
Balazs Keri3b30d652018-10-19 13:32:20 +00001066ExpectedType
John McCall424cec92011-01-19 06:33:43 +00001067ASTNodeImporter::VisitLValueReferenceType(const LValueReferenceType *T) {
Douglas Gregor96e578d2010-02-05 17:54:41 +00001068 // FIXME: Check for C++ support in "to" context.
Balazs Keri3b30d652018-10-19 13:32:20 +00001069 ExpectedType ToPointeeTypeOrErr = import(T->getPointeeTypeAsWritten());
1070 if (!ToPointeeTypeOrErr)
1071 return ToPointeeTypeOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001072
Balazs Keri3b30d652018-10-19 13:32:20 +00001073 return Importer.getToContext().getLValueReferenceType(*ToPointeeTypeOrErr);
Douglas Gregor96e578d2010-02-05 17:54:41 +00001074}
1075
Balazs Keri3b30d652018-10-19 13:32:20 +00001076ExpectedType
John McCall424cec92011-01-19 06:33:43 +00001077ASTNodeImporter::VisitRValueReferenceType(const RValueReferenceType *T) {
Douglas Gregor96e578d2010-02-05 17:54:41 +00001078 // FIXME: Check for C++0x support in "to" context.
Balazs Keri3b30d652018-10-19 13:32:20 +00001079 ExpectedType ToPointeeTypeOrErr = import(T->getPointeeTypeAsWritten());
1080 if (!ToPointeeTypeOrErr)
1081 return ToPointeeTypeOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001082
Balazs Keri3b30d652018-10-19 13:32:20 +00001083 return Importer.getToContext().getRValueReferenceType(*ToPointeeTypeOrErr);
Douglas Gregor96e578d2010-02-05 17:54:41 +00001084}
1085
Balazs Keri3b30d652018-10-19 13:32:20 +00001086ExpectedType
1087ASTNodeImporter::VisitMemberPointerType(const MemberPointerType *T) {
Douglas Gregor96e578d2010-02-05 17:54:41 +00001088 // FIXME: Check for C++ support in "to" context.
Balazs Keri3b30d652018-10-19 13:32:20 +00001089 ExpectedType ToPointeeTypeOrErr = import(T->getPointeeType());
1090 if (!ToPointeeTypeOrErr)
1091 return ToPointeeTypeOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001092
Balazs Keri3b30d652018-10-19 13:32:20 +00001093 ExpectedType ClassTypeOrErr = import(QualType(T->getClass(), 0));
1094 if (!ClassTypeOrErr)
1095 return ClassTypeOrErr.takeError();
1096
1097 return Importer.getToContext().getMemberPointerType(
1098 *ToPointeeTypeOrErr, (*ClassTypeOrErr).getTypePtr());
Douglas Gregor96e578d2010-02-05 17:54:41 +00001099}
1100
Balazs Keri3b30d652018-10-19 13:32:20 +00001101ExpectedType
1102ASTNodeImporter::VisitConstantArrayType(const ConstantArrayType *T) {
Richard Smith772e2662019-10-04 01:25:59 +00001103 QualType ToElementType;
1104 const Expr *ToSizeExpr;
1105 if (auto Imp = importSeq(T->getElementType(), T->getSizeExpr()))
1106 std::tie(ToElementType, ToSizeExpr) = *Imp;
1107 else
1108 return Imp.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001109
Richard Smith772e2662019-10-04 01:25:59 +00001110 return Importer.getToContext().getConstantArrayType(
1111 ToElementType, T->getSize(), ToSizeExpr, T->getSizeModifier(),
1112 T->getIndexTypeCVRQualifiers());
Douglas Gregor96e578d2010-02-05 17:54:41 +00001113}
1114
Balazs Keri3b30d652018-10-19 13:32:20 +00001115ExpectedType
John McCall424cec92011-01-19 06:33:43 +00001116ASTNodeImporter::VisitIncompleteArrayType(const IncompleteArrayType *T) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001117 ExpectedType ToElementTypeOrErr = import(T->getElementType());
1118 if (!ToElementTypeOrErr)
1119 return ToElementTypeOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001120
Balazs Keri3b30d652018-10-19 13:32:20 +00001121 return Importer.getToContext().getIncompleteArrayType(*ToElementTypeOrErr,
Douglas Gregor96e578d2010-02-05 17:54:41 +00001122 T->getSizeModifier(),
1123 T->getIndexTypeCVRQualifiers());
1124}
1125
Balazs Keri3b30d652018-10-19 13:32:20 +00001126ExpectedType
1127ASTNodeImporter::VisitVariableArrayType(const VariableArrayType *T) {
1128 QualType ToElementType;
1129 Expr *ToSizeExpr;
1130 SourceRange ToBracketsRange;
1131 if (auto Imp = importSeq(
1132 T->getElementType(), T->getSizeExpr(), T->getBracketsRange()))
1133 std::tie(ToElementType, ToSizeExpr, ToBracketsRange) = *Imp;
1134 else
1135 return Imp.takeError();
Douglas Gregor96e578d2010-02-05 17:54:41 +00001136
Balazs Keri3b30d652018-10-19 13:32:20 +00001137 return Importer.getToContext().getVariableArrayType(
1138 ToElementType, ToSizeExpr, T->getSizeModifier(),
1139 T->getIndexTypeCVRQualifiers(), ToBracketsRange);
Douglas Gregor96e578d2010-02-05 17:54:41 +00001140}
1141
Balazs Keri3b30d652018-10-19 13:32:20 +00001142ExpectedType ASTNodeImporter::VisitDependentSizedArrayType(
Gabor Horvathc78d99a2018-01-27 16:11:45 +00001143 const DependentSizedArrayType *T) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001144 QualType ToElementType;
1145 Expr *ToSizeExpr;
1146 SourceRange ToBracketsRange;
1147 if (auto Imp = importSeq(
1148 T->getElementType(), T->getSizeExpr(), T->getBracketsRange()))
1149 std::tie(ToElementType, ToSizeExpr, ToBracketsRange) = *Imp;
1150 else
1151 return Imp.takeError();
Gabor Horvathc78d99a2018-01-27 16:11:45 +00001152 // SizeExpr may be null if size is not specified directly.
1153 // For example, 'int a[]'.
Gabor Horvathc78d99a2018-01-27 16:11:45 +00001154
Gabor Horvathc78d99a2018-01-27 16:11:45 +00001155 return Importer.getToContext().getDependentSizedArrayType(
Balazs Keri3b30d652018-10-19 13:32:20 +00001156 ToElementType, ToSizeExpr, T->getSizeModifier(),
1157 T->getIndexTypeCVRQualifiers(), ToBracketsRange);
Gabor Horvathc78d99a2018-01-27 16:11:45 +00001158}
1159
Balazs Keri3b30d652018-10-19 13:32:20 +00001160ExpectedType ASTNodeImporter::VisitVectorType(const VectorType *T) {
1161 ExpectedType ToElementTypeOrErr = import(T->getElementType());
1162 if (!ToElementTypeOrErr)
1163 return ToElementTypeOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001164
Balazs Keri3b30d652018-10-19 13:32:20 +00001165 return Importer.getToContext().getVectorType(*ToElementTypeOrErr,
Douglas Gregor96e578d2010-02-05 17:54:41 +00001166 T->getNumElements(),
Bob Wilsonaeb56442010-11-10 21:56:12 +00001167 T->getVectorKind());
Douglas Gregor96e578d2010-02-05 17:54:41 +00001168}
1169
Balazs Keri3b30d652018-10-19 13:32:20 +00001170ExpectedType ASTNodeImporter::VisitExtVectorType(const ExtVectorType *T) {
1171 ExpectedType ToElementTypeOrErr = import(T->getElementType());
1172 if (!ToElementTypeOrErr)
1173 return ToElementTypeOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001174
Balazs Keri3b30d652018-10-19 13:32:20 +00001175 return Importer.getToContext().getExtVectorType(*ToElementTypeOrErr,
Douglas Gregor96e578d2010-02-05 17:54:41 +00001176 T->getNumElements());
1177}
1178
Balazs Keri3b30d652018-10-19 13:32:20 +00001179ExpectedType
John McCall424cec92011-01-19 06:33:43 +00001180ASTNodeImporter::VisitFunctionNoProtoType(const FunctionNoProtoType *T) {
Fangrui Song6907ce22018-07-30 19:24:48 +00001181 // FIXME: What happens if we're importing a function without a prototype
Douglas Gregor96e578d2010-02-05 17:54:41 +00001182 // into C++? Should we make it variadic?
Balazs Keri3b30d652018-10-19 13:32:20 +00001183 ExpectedType ToReturnTypeOrErr = import(T->getReturnType());
1184 if (!ToReturnTypeOrErr)
1185 return ToReturnTypeOrErr.takeError();
Rafael Espindolac50c27c2010-03-30 20:24:48 +00001186
Balazs Keri3b30d652018-10-19 13:32:20 +00001187 return Importer.getToContext().getFunctionNoProtoType(*ToReturnTypeOrErr,
Rafael Espindolac50c27c2010-03-30 20:24:48 +00001188 T->getExtInfo());
Douglas Gregor96e578d2010-02-05 17:54:41 +00001189}
1190
Balazs Keri3b30d652018-10-19 13:32:20 +00001191ExpectedType
1192ASTNodeImporter::VisitFunctionProtoType(const FunctionProtoType *T) {
1193 ExpectedType ToReturnTypeOrErr = import(T->getReturnType());
1194 if (!ToReturnTypeOrErr)
1195 return ToReturnTypeOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001196
Douglas Gregor96e578d2010-02-05 17:54:41 +00001197 // Import argument types
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001198 SmallVector<QualType, 4> ArgTypes;
Aaron Ballman40bd0aa2014-03-17 15:23:01 +00001199 for (const auto &A : T->param_types()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001200 ExpectedType TyOrErr = import(A);
1201 if (!TyOrErr)
1202 return TyOrErr.takeError();
1203 ArgTypes.push_back(*TyOrErr);
Douglas Gregor96e578d2010-02-05 17:54:41 +00001204 }
Fangrui Song6907ce22018-07-30 19:24:48 +00001205
Douglas Gregor96e578d2010-02-05 17:54:41 +00001206 // Import exception types
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001207 SmallVector<QualType, 4> ExceptionTypes;
Aaron Ballmanb088fbe2014-03-17 15:38:09 +00001208 for (const auto &E : T->exceptions()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001209 ExpectedType TyOrErr = import(E);
1210 if (!TyOrErr)
1211 return TyOrErr.takeError();
1212 ExceptionTypes.push_back(*TyOrErr);
Douglas Gregor96e578d2010-02-05 17:54:41 +00001213 }
John McCalldb40c7f2010-12-14 08:05:40 +00001214
Argyrios Kyrtzidisb41791d2012-09-22 01:58:06 +00001215 FunctionProtoType::ExtProtoInfo FromEPI = T->getExtProtoInfo();
1216 FunctionProtoType::ExtProtoInfo ToEPI;
1217
Balazs Keri3b30d652018-10-19 13:32:20 +00001218 auto Imp = importSeq(
1219 FromEPI.ExceptionSpec.NoexceptExpr,
1220 FromEPI.ExceptionSpec.SourceDecl,
1221 FromEPI.ExceptionSpec.SourceTemplate);
1222 if (!Imp)
1223 return Imp.takeError();
1224
Argyrios Kyrtzidisb41791d2012-09-22 01:58:06 +00001225 ToEPI.ExtInfo = FromEPI.ExtInfo;
1226 ToEPI.Variadic = FromEPI.Variadic;
1227 ToEPI.HasTrailingReturn = FromEPI.HasTrailingReturn;
1228 ToEPI.TypeQuals = FromEPI.TypeQuals;
1229 ToEPI.RefQualifier = FromEPI.RefQualifier;
Richard Smith8acb4282014-07-31 21:57:55 +00001230 ToEPI.ExceptionSpec.Type = FromEPI.ExceptionSpec.Type;
1231 ToEPI.ExceptionSpec.Exceptions = ExceptionTypes;
Balazs Keri3b30d652018-10-19 13:32:20 +00001232 std::tie(
1233 ToEPI.ExceptionSpec.NoexceptExpr,
1234 ToEPI.ExceptionSpec.SourceDecl,
1235 ToEPI.ExceptionSpec.SourceTemplate) = *Imp;
Argyrios Kyrtzidisb41791d2012-09-22 01:58:06 +00001236
Balazs Keri3b30d652018-10-19 13:32:20 +00001237 return Importer.getToContext().getFunctionType(
1238 *ToReturnTypeOrErr, ArgTypes, ToEPI);
Argyrios Kyrtzidisb41791d2012-09-22 01:58:06 +00001239}
1240
Balazs Keri3b30d652018-10-19 13:32:20 +00001241ExpectedType ASTNodeImporter::VisitUnresolvedUsingType(
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00001242 const UnresolvedUsingType *T) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001243 UnresolvedUsingTypenameDecl *ToD;
1244 Decl *ToPrevD;
1245 if (auto Imp = importSeq(T->getDecl(), T->getDecl()->getPreviousDecl()))
1246 std::tie(ToD, ToPrevD) = *Imp;
1247 else
1248 return Imp.takeError();
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00001249
Balazs Keri3b30d652018-10-19 13:32:20 +00001250 return Importer.getToContext().getTypeDeclType(
1251 ToD, cast_or_null<TypeDecl>(ToPrevD));
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00001252}
1253
Balazs Keri3b30d652018-10-19 13:32:20 +00001254ExpectedType ASTNodeImporter::VisitParenType(const ParenType *T) {
1255 ExpectedType ToInnerTypeOrErr = import(T->getInnerType());
1256 if (!ToInnerTypeOrErr)
1257 return ToInnerTypeOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001258
Balazs Keri3b30d652018-10-19 13:32:20 +00001259 return Importer.getToContext().getParenType(*ToInnerTypeOrErr);
Sean Callananda6df8a2011-08-11 16:56:07 +00001260}
1261
Balazs Keri3b30d652018-10-19 13:32:20 +00001262ExpectedType ASTNodeImporter::VisitTypedefType(const TypedefType *T) {
1263 Expected<TypedefNameDecl *> ToDeclOrErr = import(T->getDecl());
1264 if (!ToDeclOrErr)
1265 return ToDeclOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001266
Balazs Keri3b30d652018-10-19 13:32:20 +00001267 return Importer.getToContext().getTypeDeclType(*ToDeclOrErr);
Douglas Gregor96e578d2010-02-05 17:54:41 +00001268}
1269
Balazs Keri3b30d652018-10-19 13:32:20 +00001270ExpectedType ASTNodeImporter::VisitTypeOfExprType(const TypeOfExprType *T) {
1271 ExpectedExpr ToExprOrErr = import(T->getUnderlyingExpr());
1272 if (!ToExprOrErr)
1273 return ToExprOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001274
Balazs Keri3b30d652018-10-19 13:32:20 +00001275 return Importer.getToContext().getTypeOfExprType(*ToExprOrErr);
Douglas Gregor96e578d2010-02-05 17:54:41 +00001276}
1277
Balazs Keri3b30d652018-10-19 13:32:20 +00001278ExpectedType ASTNodeImporter::VisitTypeOfType(const TypeOfType *T) {
1279 ExpectedType ToUnderlyingTypeOrErr = import(T->getUnderlyingType());
1280 if (!ToUnderlyingTypeOrErr)
1281 return ToUnderlyingTypeOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001282
Balazs Keri3b30d652018-10-19 13:32:20 +00001283 return Importer.getToContext().getTypeOfType(*ToUnderlyingTypeOrErr);
Douglas Gregor96e578d2010-02-05 17:54:41 +00001284}
1285
Balazs Keri3b30d652018-10-19 13:32:20 +00001286ExpectedType ASTNodeImporter::VisitDecltypeType(const DecltypeType *T) {
Richard Smith30482bc2011-02-20 03:19:35 +00001287 // FIXME: Make sure that the "to" context supports C++0x!
Balazs Keri3b30d652018-10-19 13:32:20 +00001288 ExpectedExpr ToExprOrErr = import(T->getUnderlyingExpr());
1289 if (!ToExprOrErr)
1290 return ToExprOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001291
Balazs Keri3b30d652018-10-19 13:32:20 +00001292 ExpectedType ToUnderlyingTypeOrErr = import(T->getUnderlyingType());
1293 if (!ToUnderlyingTypeOrErr)
1294 return ToUnderlyingTypeOrErr.takeError();
Douglas Gregor81495f32012-02-12 18:42:33 +00001295
Balazs Keri3b30d652018-10-19 13:32:20 +00001296 return Importer.getToContext().getDecltypeType(
1297 *ToExprOrErr, *ToUnderlyingTypeOrErr);
Douglas Gregor96e578d2010-02-05 17:54:41 +00001298}
1299
Balazs Keri3b30d652018-10-19 13:32:20 +00001300ExpectedType
1301ASTNodeImporter::VisitUnaryTransformType(const UnaryTransformType *T) {
1302 ExpectedType ToBaseTypeOrErr = import(T->getBaseType());
1303 if (!ToBaseTypeOrErr)
1304 return ToBaseTypeOrErr.takeError();
Alexis Hunte852b102011-05-24 22:41:36 +00001305
Balazs Keri3b30d652018-10-19 13:32:20 +00001306 ExpectedType ToUnderlyingTypeOrErr = import(T->getUnderlyingType());
1307 if (!ToUnderlyingTypeOrErr)
1308 return ToUnderlyingTypeOrErr.takeError();
1309
1310 return Importer.getToContext().getUnaryTransformType(
1311 *ToBaseTypeOrErr, *ToUnderlyingTypeOrErr, T->getUTTKind());
Alexis Hunte852b102011-05-24 22:41:36 +00001312}
1313
Balazs Keri3b30d652018-10-19 13:32:20 +00001314ExpectedType ASTNodeImporter::VisitAutoType(const AutoType *T) {
Richard Smith74aeef52013-04-26 16:15:35 +00001315 // FIXME: Make sure that the "to" context supports C++11!
Balazs Keri3b30d652018-10-19 13:32:20 +00001316 ExpectedType ToDeducedTypeOrErr = import(T->getDeducedType());
1317 if (!ToDeducedTypeOrErr)
1318 return ToDeducedTypeOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001319
Balazs Keri3b30d652018-10-19 13:32:20 +00001320 return Importer.getToContext().getAutoType(*ToDeducedTypeOrErr,
1321 T->getKeyword(),
Faisal Vali2b391ab2013-09-26 19:54:12 +00001322 /*IsDependent*/false);
Richard Smith30482bc2011-02-20 03:19:35 +00001323}
1324
Balazs Keri3b30d652018-10-19 13:32:20 +00001325ExpectedType ASTNodeImporter::VisitInjectedClassNameType(
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00001326 const InjectedClassNameType *T) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001327 Expected<CXXRecordDecl *> ToDeclOrErr = import(T->getDecl());
1328 if (!ToDeclOrErr)
1329 return ToDeclOrErr.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00001330
Balazs Keri3b30d652018-10-19 13:32:20 +00001331 ExpectedType ToInjTypeOrErr = import(T->getInjectedSpecializationType());
1332 if (!ToInjTypeOrErr)
1333 return ToInjTypeOrErr.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00001334
1335 // FIXME: ASTContext::getInjectedClassNameType is not suitable for AST reading
1336 // See comments in InjectedClassNameType definition for details
1337 // return Importer.getToContext().getInjectedClassNameType(D, InjType);
1338 enum {
1339 TypeAlignmentInBits = 4,
1340 TypeAlignment = 1 << TypeAlignmentInBits
1341 };
1342
1343 return QualType(new (Importer.getToContext(), TypeAlignment)
Balazs Keri3b30d652018-10-19 13:32:20 +00001344 InjectedClassNameType(*ToDeclOrErr, *ToInjTypeOrErr), 0);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00001345}
1346
Balazs Keri3b30d652018-10-19 13:32:20 +00001347ExpectedType ASTNodeImporter::VisitRecordType(const RecordType *T) {
1348 Expected<RecordDecl *> ToDeclOrErr = import(T->getDecl());
1349 if (!ToDeclOrErr)
1350 return ToDeclOrErr.takeError();
Douglas Gregor96e578d2010-02-05 17:54:41 +00001351
Balazs Keri3b30d652018-10-19 13:32:20 +00001352 return Importer.getToContext().getTagDeclType(*ToDeclOrErr);
Douglas Gregor96e578d2010-02-05 17:54:41 +00001353}
1354
Balazs Keri3b30d652018-10-19 13:32:20 +00001355ExpectedType ASTNodeImporter::VisitEnumType(const EnumType *T) {
1356 Expected<EnumDecl *> ToDeclOrErr = import(T->getDecl());
1357 if (!ToDeclOrErr)
1358 return ToDeclOrErr.takeError();
Douglas Gregor96e578d2010-02-05 17:54:41 +00001359
Balazs Keri3b30d652018-10-19 13:32:20 +00001360 return Importer.getToContext().getTagDeclType(*ToDeclOrErr);
Douglas Gregor96e578d2010-02-05 17:54:41 +00001361}
1362
Balazs Keri3b30d652018-10-19 13:32:20 +00001363ExpectedType ASTNodeImporter::VisitAttributedType(const AttributedType *T) {
1364 ExpectedType ToModifiedTypeOrErr = import(T->getModifiedType());
1365 if (!ToModifiedTypeOrErr)
1366 return ToModifiedTypeOrErr.takeError();
1367 ExpectedType ToEquivalentTypeOrErr = import(T->getEquivalentType());
1368 if (!ToEquivalentTypeOrErr)
1369 return ToEquivalentTypeOrErr.takeError();
Sean Callanan72fe0852015-04-02 23:50:08 +00001370
1371 return Importer.getToContext().getAttributedType(T->getAttrKind(),
Balazs Keri3b30d652018-10-19 13:32:20 +00001372 *ToModifiedTypeOrErr, *ToEquivalentTypeOrErr);
Sean Callanan72fe0852015-04-02 23:50:08 +00001373}
1374
Balazs Keri3b30d652018-10-19 13:32:20 +00001375ExpectedType ASTNodeImporter::VisitTemplateTypeParmType(
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00001376 const TemplateTypeParmType *T) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001377 Expected<TemplateTypeParmDecl *> ToDeclOrErr = import(T->getDecl());
1378 if (!ToDeclOrErr)
1379 return ToDeclOrErr.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00001380
1381 return Importer.getToContext().getTemplateTypeParmType(
Balazs Keri3b30d652018-10-19 13:32:20 +00001382 T->getDepth(), T->getIndex(), T->isParameterPack(), *ToDeclOrErr);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00001383}
1384
Balazs Keri3b30d652018-10-19 13:32:20 +00001385ExpectedType ASTNodeImporter::VisitSubstTemplateTypeParmType(
Aleksei Sidorin855086d2017-01-23 09:30:36 +00001386 const SubstTemplateTypeParmType *T) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001387 ExpectedType ReplacedOrErr = import(QualType(T->getReplacedParameter(), 0));
1388 if (!ReplacedOrErr)
1389 return ReplacedOrErr.takeError();
1390 const TemplateTypeParmType *Replaced =
1391 cast<TemplateTypeParmType>((*ReplacedOrErr).getTypePtr());
Aleksei Sidorin855086d2017-01-23 09:30:36 +00001392
Balazs Keri3b30d652018-10-19 13:32:20 +00001393 ExpectedType ToReplacementTypeOrErr = import(T->getReplacementType());
1394 if (!ToReplacementTypeOrErr)
1395 return ToReplacementTypeOrErr.takeError();
Aleksei Sidorin855086d2017-01-23 09:30:36 +00001396
1397 return Importer.getToContext().getSubstTemplateTypeParmType(
Balazs Keri3b30d652018-10-19 13:32:20 +00001398 Replaced, (*ToReplacementTypeOrErr).getCanonicalType());
Aleksei Sidorin855086d2017-01-23 09:30:36 +00001399}
1400
Balazs Keri3b30d652018-10-19 13:32:20 +00001401ExpectedType ASTNodeImporter::VisitTemplateSpecializationType(
John McCall424cec92011-01-19 06:33:43 +00001402 const TemplateSpecializationType *T) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001403 auto ToTemplateOrErr = import(T->getTemplateName());
1404 if (!ToTemplateOrErr)
1405 return ToTemplateOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001406
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001407 SmallVector<TemplateArgument, 2> ToTemplateArgs;
Balazs Keri3b30d652018-10-19 13:32:20 +00001408 if (Error Err = ImportTemplateArguments(
1409 T->getArgs(), T->getNumArgs(), ToTemplateArgs))
1410 return std::move(Err);
Fangrui Song6907ce22018-07-30 19:24:48 +00001411
Douglas Gregore2e50d332010-12-01 01:36:18 +00001412 QualType ToCanonType;
1413 if (!QualType(T, 0).isCanonical()) {
Fangrui Song6907ce22018-07-30 19:24:48 +00001414 QualType FromCanonType
Douglas Gregore2e50d332010-12-01 01:36:18 +00001415 = Importer.getFromContext().getCanonicalType(QualType(T, 0));
Balazs Keri3b30d652018-10-19 13:32:20 +00001416 if (ExpectedType TyOrErr = import(FromCanonType))
1417 ToCanonType = *TyOrErr;
1418 else
1419 return TyOrErr.takeError();
Douglas Gregore2e50d332010-12-01 01:36:18 +00001420 }
Balazs Keri3b30d652018-10-19 13:32:20 +00001421 return Importer.getToContext().getTemplateSpecializationType(*ToTemplateOrErr,
David Majnemer6fbeee32016-07-07 04:43:07 +00001422 ToTemplateArgs,
Douglas Gregore2e50d332010-12-01 01:36:18 +00001423 ToCanonType);
1424}
1425
Balazs Keri3b30d652018-10-19 13:32:20 +00001426ExpectedType ASTNodeImporter::VisitElaboratedType(const ElaboratedType *T) {
Abramo Bagnara6150c882010-05-11 21:36:43 +00001427 // Note: the qualifier in an ElaboratedType is optional.
Balazs Keri3b30d652018-10-19 13:32:20 +00001428 auto ToQualifierOrErr = import(T->getQualifier());
1429 if (!ToQualifierOrErr)
1430 return ToQualifierOrErr.takeError();
Douglas Gregor96e578d2010-02-05 17:54:41 +00001431
Balazs Keri3b30d652018-10-19 13:32:20 +00001432 ExpectedType ToNamedTypeOrErr = import(T->getNamedType());
1433 if (!ToNamedTypeOrErr)
1434 return ToNamedTypeOrErr.takeError();
Douglas Gregor96e578d2010-02-05 17:54:41 +00001435
Balazs Keri3b30d652018-10-19 13:32:20 +00001436 Expected<TagDecl *> ToOwnedTagDeclOrErr = import(T->getOwnedTagDecl());
1437 if (!ToOwnedTagDeclOrErr)
1438 return ToOwnedTagDeclOrErr.takeError();
Joel E. Denny7509a2f2018-05-14 19:36:45 +00001439
Abramo Bagnara6150c882010-05-11 21:36:43 +00001440 return Importer.getToContext().getElaboratedType(T->getKeyword(),
Balazs Keri3b30d652018-10-19 13:32:20 +00001441 *ToQualifierOrErr,
1442 *ToNamedTypeOrErr,
1443 *ToOwnedTagDeclOrErr);
Douglas Gregor96e578d2010-02-05 17:54:41 +00001444}
1445
Balazs Keri3b30d652018-10-19 13:32:20 +00001446ExpectedType
1447ASTNodeImporter::VisitPackExpansionType(const PackExpansionType *T) {
1448 ExpectedType ToPatternOrErr = import(T->getPattern());
1449 if (!ToPatternOrErr)
1450 return ToPatternOrErr.takeError();
Gabor Horvath7a91c082017-11-14 11:30:38 +00001451
Balazs Keri3b30d652018-10-19 13:32:20 +00001452 return Importer.getToContext().getPackExpansionType(*ToPatternOrErr,
Gabor Horvath7a91c082017-11-14 11:30:38 +00001453 T->getNumExpansions());
1454}
1455
Balazs Keri3b30d652018-10-19 13:32:20 +00001456ExpectedType ASTNodeImporter::VisitDependentTemplateSpecializationType(
Gabor Horvathc78d99a2018-01-27 16:11:45 +00001457 const DependentTemplateSpecializationType *T) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001458 auto ToQualifierOrErr = import(T->getQualifier());
1459 if (!ToQualifierOrErr)
1460 return ToQualifierOrErr.takeError();
Gabor Horvathc78d99a2018-01-27 16:11:45 +00001461
Balazs Keri3b30d652018-10-19 13:32:20 +00001462 IdentifierInfo *ToName = Importer.Import(T->getIdentifier());
Gabor Horvathc78d99a2018-01-27 16:11:45 +00001463
1464 SmallVector<TemplateArgument, 2> ToPack;
1465 ToPack.reserve(T->getNumArgs());
Balazs Keri3b30d652018-10-19 13:32:20 +00001466 if (Error Err = ImportTemplateArguments(
1467 T->getArgs(), T->getNumArgs(), ToPack))
1468 return std::move(Err);
Gabor Horvathc78d99a2018-01-27 16:11:45 +00001469
1470 return Importer.getToContext().getDependentTemplateSpecializationType(
Balazs Keri3b30d652018-10-19 13:32:20 +00001471 T->getKeyword(), *ToQualifierOrErr, ToName, ToPack);
Gabor Horvathc78d99a2018-01-27 16:11:45 +00001472}
1473
Balazs Keri3b30d652018-10-19 13:32:20 +00001474ExpectedType
1475ASTNodeImporter::VisitDependentNameType(const DependentNameType *T) {
1476 auto ToQualifierOrErr = import(T->getQualifier());
1477 if (!ToQualifierOrErr)
1478 return ToQualifierOrErr.takeError();
Peter Szecsice7f3182018-05-07 12:08:27 +00001479
1480 IdentifierInfo *Name = Importer.Import(T->getIdentifier());
Peter Szecsice7f3182018-05-07 12:08:27 +00001481
Balazs Keri3b30d652018-10-19 13:32:20 +00001482 QualType Canon;
1483 if (T != T->getCanonicalTypeInternal().getTypePtr()) {
1484 if (ExpectedType TyOrErr = import(T->getCanonicalTypeInternal()))
1485 Canon = (*TyOrErr).getCanonicalType();
1486 else
1487 return TyOrErr.takeError();
1488 }
Peter Szecsice7f3182018-05-07 12:08:27 +00001489
Balazs Keri3b30d652018-10-19 13:32:20 +00001490 return Importer.getToContext().getDependentNameType(T->getKeyword(),
1491 *ToQualifierOrErr,
Peter Szecsice7f3182018-05-07 12:08:27 +00001492 Name, Canon);
1493}
1494
Balazs Keri3b30d652018-10-19 13:32:20 +00001495ExpectedType
1496ASTNodeImporter::VisitObjCInterfaceType(const ObjCInterfaceType *T) {
1497 Expected<ObjCInterfaceDecl *> ToDeclOrErr = import(T->getDecl());
1498 if (!ToDeclOrErr)
1499 return ToDeclOrErr.takeError();
Douglas Gregor96e578d2010-02-05 17:54:41 +00001500
Balazs Keri3b30d652018-10-19 13:32:20 +00001501 return Importer.getToContext().getObjCInterfaceType(*ToDeclOrErr);
John McCall8b07ec22010-05-15 11:32:37 +00001502}
1503
Balazs Keri3b30d652018-10-19 13:32:20 +00001504ExpectedType ASTNodeImporter::VisitObjCObjectType(const ObjCObjectType *T) {
1505 ExpectedType ToBaseTypeOrErr = import(T->getBaseType());
1506 if (!ToBaseTypeOrErr)
1507 return ToBaseTypeOrErr.takeError();
John McCall8b07ec22010-05-15 11:32:37 +00001508
Douglas Gregore9d95f12015-07-07 03:57:35 +00001509 SmallVector<QualType, 4> TypeArgs;
Douglas Gregore83b9562015-07-07 03:57:53 +00001510 for (auto TypeArg : T->getTypeArgsAsWritten()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001511 if (ExpectedType TyOrErr = import(TypeArg))
1512 TypeArgs.push_back(*TyOrErr);
1513 else
1514 return TyOrErr.takeError();
Douglas Gregore9d95f12015-07-07 03:57:35 +00001515 }
1516
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001517 SmallVector<ObjCProtocolDecl *, 4> Protocols;
Aaron Ballman1683f7b2014-03-17 15:55:30 +00001518 for (auto *P : T->quals()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001519 if (Expected<ObjCProtocolDecl *> ProtocolOrErr = import(P))
1520 Protocols.push_back(*ProtocolOrErr);
1521 else
1522 return ProtocolOrErr.takeError();
1523
Douglas Gregor96e578d2010-02-05 17:54:41 +00001524 }
1525
Balazs Keri3b30d652018-10-19 13:32:20 +00001526 return Importer.getToContext().getObjCObjectType(*ToBaseTypeOrErr, TypeArgs,
Douglas Gregorab209d82015-07-07 03:58:42 +00001527 Protocols,
1528 T->isKindOfTypeAsWritten());
Douglas Gregor96e578d2010-02-05 17:54:41 +00001529}
1530
Balazs Keri3b30d652018-10-19 13:32:20 +00001531ExpectedType
John McCall424cec92011-01-19 06:33:43 +00001532ASTNodeImporter::VisitObjCObjectPointerType(const ObjCObjectPointerType *T) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001533 ExpectedType ToPointeeTypeOrErr = import(T->getPointeeType());
1534 if (!ToPointeeTypeOrErr)
1535 return ToPointeeTypeOrErr.takeError();
Douglas Gregor96e578d2010-02-05 17:54:41 +00001536
Balazs Keri3b30d652018-10-19 13:32:20 +00001537 return Importer.getToContext().getObjCObjectPointerType(*ToPointeeTypeOrErr);
Douglas Gregor96e578d2010-02-05 17:54:41 +00001538}
1539
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00001540//----------------------------------------------------------------------------
1541// Import Declarations
1542//----------------------------------------------------------------------------
Balazs Keri3b30d652018-10-19 13:32:20 +00001543Error ASTNodeImporter::ImportDeclParts(
1544 NamedDecl *D, DeclContext *&DC, DeclContext *&LexicalDC,
1545 DeclarationName &Name, NamedDecl *&ToD, SourceLocation &Loc) {
Gabor Marton6e1510c2018-07-12 11:50:21 +00001546 // Check if RecordDecl is in FunctionDecl parameters to avoid infinite loop.
1547 // example: int struct_in_proto(struct data_t{int a;int b;} *d);
1548 DeclContext *OrigDC = D->getDeclContext();
1549 FunctionDecl *FunDecl;
1550 if (isa<RecordDecl>(D) && (FunDecl = dyn_cast<FunctionDecl>(OrigDC)) &&
1551 FunDecl->hasBody()) {
Gabor Martonfe68e292018-08-06 14:38:37 +00001552 auto getLeafPointeeType = [](const Type *T) {
1553 while (T->isPointerType() || T->isArrayType()) {
1554 T = T->getPointeeOrArrayElementType();
1555 }
1556 return T;
1557 };
1558 for (const ParmVarDecl *P : FunDecl->parameters()) {
1559 const Type *LeafT =
1560 getLeafPointeeType(P->getType().getCanonicalType().getTypePtr());
1561 auto *RT = dyn_cast<RecordType>(LeafT);
1562 if (RT && RT->getDecl() == D) {
1563 Importer.FromDiag(D->getLocation(), diag::err_unsupported_ast_node)
1564 << D->getDeclKindName();
Balazs Keri3b30d652018-10-19 13:32:20 +00001565 return make_error<ImportError>(ImportError::UnsupportedConstruct);
Gabor Martonfe68e292018-08-06 14:38:37 +00001566 }
Gabor Marton6e1510c2018-07-12 11:50:21 +00001567 }
1568 }
1569
Douglas Gregorbb7930c2010-02-10 19:54:31 +00001570 // Import the context of this declaration.
Balazs Keri3b30d652018-10-19 13:32:20 +00001571 if (Error Err = ImportDeclContext(D, DC, LexicalDC))
1572 return Err;
Fangrui Song6907ce22018-07-30 19:24:48 +00001573
Douglas Gregorbb7930c2010-02-10 19:54:31 +00001574 // Import the name of this declaration.
Balazs Keri3b30d652018-10-19 13:32:20 +00001575 if (Error Err = importInto(Name, D->getDeclName()))
1576 return Err;
Fangrui Song6907ce22018-07-30 19:24:48 +00001577
Douglas Gregorbb7930c2010-02-10 19:54:31 +00001578 // Import the location of this declaration.
Balazs Keri3b30d652018-10-19 13:32:20 +00001579 if (Error Err = importInto(Loc, D->getLocation()))
1580 return Err;
1581
Sean Callanan59721b32015-04-28 18:41:46 +00001582 ToD = cast_or_null<NamedDecl>(Importer.GetAlreadyImportedOrNull(D));
Gabor Martonbe77a982018-12-12 11:22:55 +00001583 if (ToD)
1584 if (Error Err = ASTNodeImporter(*this).ImportDefinitionIfNeeded(D, ToD))
1585 return Err;
Balazs Keri3b30d652018-10-19 13:32:20 +00001586
1587 return Error::success();
Douglas Gregorbb7930c2010-02-10 19:54:31 +00001588}
1589
Balazs Keri3b30d652018-10-19 13:32:20 +00001590Error ASTNodeImporter::ImportDefinitionIfNeeded(Decl *FromD, Decl *ToD) {
Douglas Gregord451ea92011-07-29 23:31:30 +00001591 if (!FromD)
Balazs Keri3b30d652018-10-19 13:32:20 +00001592 return Error::success();
Fangrui Song6907ce22018-07-30 19:24:48 +00001593
Balazs Keri3b30d652018-10-19 13:32:20 +00001594 if (!ToD)
1595 if (Error Err = importInto(ToD, FromD))
1596 return Err;
Fangrui Song6907ce22018-07-30 19:24:48 +00001597
Balazs Keri3b30d652018-10-19 13:32:20 +00001598 if (RecordDecl *FromRecord = dyn_cast<RecordDecl>(FromD)) {
1599 if (RecordDecl *ToRecord = cast<RecordDecl>(ToD)) {
1600 if (FromRecord->getDefinition() && FromRecord->isCompleteDefinition() &&
1601 !ToRecord->getDefinition()) {
1602 if (Error Err = ImportDefinition(FromRecord, ToRecord))
1603 return Err;
Douglas Gregord451ea92011-07-29 23:31:30 +00001604 }
1605 }
Balazs Keri3b30d652018-10-19 13:32:20 +00001606 return Error::success();
Douglas Gregord451ea92011-07-29 23:31:30 +00001607 }
1608
Balazs Keri3b30d652018-10-19 13:32:20 +00001609 if (EnumDecl *FromEnum = dyn_cast<EnumDecl>(FromD)) {
1610 if (EnumDecl *ToEnum = cast<EnumDecl>(ToD)) {
Douglas Gregord451ea92011-07-29 23:31:30 +00001611 if (FromEnum->getDefinition() && !ToEnum->getDefinition()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001612 if (Error Err = ImportDefinition(FromEnum, ToEnum))
1613 return Err;
Douglas Gregord451ea92011-07-29 23:31:30 +00001614 }
1615 }
Balazs Keri3b30d652018-10-19 13:32:20 +00001616 return Error::success();
Douglas Gregord451ea92011-07-29 23:31:30 +00001617 }
Balazs Keri3b30d652018-10-19 13:32:20 +00001618
1619 return Error::success();
Douglas Gregord451ea92011-07-29 23:31:30 +00001620}
1621
Balazs Keri3b30d652018-10-19 13:32:20 +00001622Error
1623ASTNodeImporter::ImportDeclarationNameLoc(
1624 const DeclarationNameInfo &From, DeclarationNameInfo& To) {
Abramo Bagnarad6d2f182010-08-11 22:01:17 +00001625 // NOTE: To.Name and To.Loc are already imported.
1626 // We only have to import To.LocInfo.
1627 switch (To.getName().getNameKind()) {
1628 case DeclarationName::Identifier:
1629 case DeclarationName::ObjCZeroArgSelector:
1630 case DeclarationName::ObjCOneArgSelector:
1631 case DeclarationName::ObjCMultiArgSelector:
1632 case DeclarationName::CXXUsingDirective:
Richard Smith35845152017-02-07 01:37:30 +00001633 case DeclarationName::CXXDeductionGuideName:
Balazs Keri3b30d652018-10-19 13:32:20 +00001634 return Error::success();
Abramo Bagnarad6d2f182010-08-11 22:01:17 +00001635
1636 case DeclarationName::CXXOperatorName: {
Balazs Keri3b30d652018-10-19 13:32:20 +00001637 if (auto ToRangeOrErr = import(From.getCXXOperatorNameRange()))
1638 To.setCXXOperatorNameRange(*ToRangeOrErr);
1639 else
1640 return ToRangeOrErr.takeError();
1641 return Error::success();
Abramo Bagnarad6d2f182010-08-11 22:01:17 +00001642 }
1643 case DeclarationName::CXXLiteralOperatorName: {
Balazs Keri3b30d652018-10-19 13:32:20 +00001644 if (ExpectedSLoc LocOrErr = import(From.getCXXLiteralOperatorNameLoc()))
1645 To.setCXXLiteralOperatorNameLoc(*LocOrErr);
1646 else
1647 return LocOrErr.takeError();
1648 return Error::success();
Abramo Bagnarad6d2f182010-08-11 22:01:17 +00001649 }
1650 case DeclarationName::CXXConstructorName:
1651 case DeclarationName::CXXDestructorName:
1652 case DeclarationName::CXXConversionFunctionName: {
Balazs Keri3b30d652018-10-19 13:32:20 +00001653 if (auto ToTInfoOrErr = import(From.getNamedTypeInfo()))
1654 To.setNamedTypeInfo(*ToTInfoOrErr);
1655 else
1656 return ToTInfoOrErr.takeError();
1657 return Error::success();
Abramo Bagnarad6d2f182010-08-11 22:01:17 +00001658 }
Abramo Bagnarad6d2f182010-08-11 22:01:17 +00001659 }
Douglas Gregor07216d12011-11-02 20:52:01 +00001660 llvm_unreachable("Unknown name kind.");
Abramo Bagnarad6d2f182010-08-11 22:01:17 +00001661}
1662
Balazs Keri3b30d652018-10-19 13:32:20 +00001663Error
1664ASTNodeImporter::ImportDeclContext(DeclContext *FromDC, bool ForceImport) {
Douglas Gregor0a791672011-01-18 03:11:38 +00001665 if (Importer.isMinimalImport() && !ForceImport) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001666 auto ToDCOrErr = Importer.ImportContext(FromDC);
1667 return ToDCOrErr.takeError();
1668 }
Gabor Marton17c3eaf2019-07-01 12:44:39 +00001669
1670 // We use strict error handling in case of records and enums, but not
1671 // with e.g. namespaces.
1672 //
1673 // FIXME Clients of the ASTImporter should be able to choose an
1674 // appropriate error handling strategy for their needs. For instance,
1675 // they may not want to mark an entire namespace as erroneous merely
1676 // because there is an ODR error with two typedefs. As another example,
1677 // the client may allow EnumConstantDecls with same names but with
1678 // different values in two distinct translation units.
1679 bool AccumulateChildErrors = isa<TagDecl>(FromDC);
1680
1681 Error ChildErrors = Error::success();
Balazs Keri3b30d652018-10-19 13:32:20 +00001682 for (auto *From : FromDC->decls()) {
1683 ExpectedDecl ImportedOrErr = import(From);
Gabor Marton17c3eaf2019-07-01 12:44:39 +00001684 if (!ImportedOrErr) {
1685 if (AccumulateChildErrors)
1686 ChildErrors =
1687 joinErrors(std::move(ChildErrors), ImportedOrErr.takeError());
1688 else
1689 consumeError(ImportedOrErr.takeError());
1690 }
Douglas Gregor0a791672011-01-18 03:11:38 +00001691 }
Fangrui Song6907ce22018-07-30 19:24:48 +00001692
Gabor Marton48b16e12019-07-25 09:07:17 +00001693 // We reorder declarations in RecordDecls because they may have another order
1694 // in the "to" context than they have in the "from" context. This may happen
1695 // e.g when we import a class like this:
1696 // struct declToImport {
1697 // int a = c + b;
1698 // int b = 1;
1699 // int c = 2;
1700 // };
1701 // During the import of `a` we import first the dependencies in sequence,
1702 // thus the order would be `c`, `b`, `a`. We will get the normal order by
1703 // first removing the already imported members and then adding them in the
1704 // order as they apper in the "from" context.
1705 //
1706 // Keeping field order is vital because it determines structure layout.
1707 //
1708 // Here and below, we cannot call field_begin() method and its callers on
1709 // ToDC if it has an external storage. Calling field_begin() will
1710 // automatically load all the fields by calling
1711 // LoadFieldsFromExternalStorage(). LoadFieldsFromExternalStorage() would
1712 // call ASTImporter::Import(). This is because the ExternalASTSource
1713 // interface in LLDB is implemented by the means of the ASTImporter. However,
1714 // calling an import at this point would result in an uncontrolled import, we
1715 // must avoid that.
1716 const auto *FromRD = dyn_cast<RecordDecl>(FromDC);
1717 if (!FromRD)
1718 return ChildErrors;
1719
1720 auto ToDCOrErr = Importer.ImportContext(FromDC);
1721 if (!ToDCOrErr) {
1722 consumeError(std::move(ChildErrors));
1723 return ToDCOrErr.takeError();
1724 }
1725
1726 DeclContext *ToDC = *ToDCOrErr;
1727 // Remove all declarations, which may be in wrong order in the
1728 // lexical DeclContext and then add them in the proper order.
1729 for (auto *D : FromRD->decls()) {
Balazs Keri6e086692019-09-02 07:17:01 +00001730 if (isa<FieldDecl>(D) || isa<IndirectFieldDecl>(D) || isa<FriendDecl>(D)) {
Gabor Marton48b16e12019-07-25 09:07:17 +00001731 assert(D && "DC contains a null decl");
1732 Decl *ToD = Importer.GetAlreadyImportedOrNull(D);
1733 // Remove only the decls which we successfully imported.
1734 if (ToD) {
1735 assert(ToDC == ToD->getLexicalDeclContext() && ToDC->containsDecl(ToD));
1736 // Remove the decl from its wrong place in the linked list.
1737 ToDC->removeDecl(ToD);
1738 // Add the decl to the end of the linked list.
1739 // This time it will be at the proper place because the enclosing for
1740 // loop iterates in the original (good) order of the decls.
1741 ToDC->addDeclInternal(ToD);
1742 }
1743 }
1744 }
1745
Gabor Marton17c3eaf2019-07-01 12:44:39 +00001746 return ChildErrors;
Douglas Gregor968d6332010-02-21 18:24:45 +00001747}
1748
Balazs Keri3b30d652018-10-19 13:32:20 +00001749Error ASTNodeImporter::ImportDeclContext(
1750 Decl *FromD, DeclContext *&ToDC, DeclContext *&ToLexicalDC) {
1751 auto ToDCOrErr = Importer.ImportContext(FromD->getDeclContext());
1752 if (!ToDCOrErr)
1753 return ToDCOrErr.takeError();
1754 ToDC = *ToDCOrErr;
1755
1756 if (FromD->getDeclContext() != FromD->getLexicalDeclContext()) {
1757 auto ToLexicalDCOrErr = Importer.ImportContext(
1758 FromD->getLexicalDeclContext());
1759 if (!ToLexicalDCOrErr)
1760 return ToLexicalDCOrErr.takeError();
1761 ToLexicalDC = *ToLexicalDCOrErr;
1762 } else
1763 ToLexicalDC = ToDC;
1764
1765 return Error::success();
1766}
1767
1768Error ASTNodeImporter::ImportImplicitMethods(
Balazs Keri1d20cc22018-07-16 12:16:39 +00001769 const CXXRecordDecl *From, CXXRecordDecl *To) {
1770 assert(From->isCompleteDefinition() && To->getDefinition() == To &&
1771 "Import implicit methods to or from non-definition");
Fangrui Song6907ce22018-07-30 19:24:48 +00001772
Balazs Keri1d20cc22018-07-16 12:16:39 +00001773 for (CXXMethodDecl *FromM : From->methods())
Balazs Keri3b30d652018-10-19 13:32:20 +00001774 if (FromM->isImplicit()) {
1775 Expected<CXXMethodDecl *> ToMOrErr = import(FromM);
1776 if (!ToMOrErr)
1777 return ToMOrErr.takeError();
1778 }
1779
1780 return Error::success();
Balazs Keri1d20cc22018-07-16 12:16:39 +00001781}
1782
Balazs Keri3b30d652018-10-19 13:32:20 +00001783static Error setTypedefNameForAnonDecl(TagDecl *From, TagDecl *To,
1784 ASTImporter &Importer) {
Aleksei Sidorin04fbffc2018-04-24 10:11:53 +00001785 if (TypedefNameDecl *FromTypedef = From->getTypedefNameForAnonDecl()) {
Gabor Marton5ac6d492019-05-15 10:29:48 +00001786 if (ExpectedDecl ToTypedefOrErr = Importer.Import(FromTypedef))
Balazs Keri57949eb2019-03-25 09:16:39 +00001787 To->setTypedefNameForAnonDecl(cast<TypedefNameDecl>(*ToTypedefOrErr));
1788 else
1789 return ToTypedefOrErr.takeError();
Aleksei Sidorin04fbffc2018-04-24 10:11:53 +00001790 }
Balazs Keri3b30d652018-10-19 13:32:20 +00001791 return Error::success();
Aleksei Sidorin04fbffc2018-04-24 10:11:53 +00001792}
1793
Balazs Keri3b30d652018-10-19 13:32:20 +00001794Error ASTNodeImporter::ImportDefinition(
1795 RecordDecl *From, RecordDecl *To, ImportDefinitionKind Kind) {
Gabor Martonaefcf512019-07-17 13:47:46 +00001796 auto DefinitionCompleter = [To]() {
1797 // There are cases in LLDB when we first import a class without its
1798 // members. The class will have DefinitionData, but no members. Then,
1799 // importDefinition is called from LLDB, which tries to get the members, so
1800 // when we get here, the class already has the DefinitionData set, so we
1801 // must unset the CompleteDefinition here to be able to complete again the
1802 // definition.
1803 To->setCompleteDefinition(false);
1804 To->completeDefinition();
1805 };
1806
Douglas Gregor95d82832012-01-24 18:36:04 +00001807 if (To->getDefinition() || To->isBeingDefined()) {
Gabor Martone73805f2019-07-08 12:49:13 +00001808 if (Kind == IDK_Everything ||
1809 // In case of lambdas, the class already has a definition ptr set, but
1810 // the contained decls are not imported yet. Also, isBeingDefined was
1811 // set in CXXRecordDecl::CreateLambda. We must import the contained
1812 // decls here and finish the definition.
1813 (To->isLambda() && shouldForceImportDeclContext(Kind))) {
1814 Error Result = ImportDeclContext(From, /*ForceImport=*/true);
1815 // Finish the definition of the lambda, set isBeingDefined to false.
1816 if (To->isLambda())
Gabor Martonaefcf512019-07-17 13:47:46 +00001817 DefinitionCompleter();
Gabor Martone73805f2019-07-08 12:49:13 +00001818 return Result;
1819 }
Fangrui Song6907ce22018-07-30 19:24:48 +00001820
Balazs Keri3b30d652018-10-19 13:32:20 +00001821 return Error::success();
Douglas Gregor95d82832012-01-24 18:36:04 +00001822 }
Fangrui Song6907ce22018-07-30 19:24:48 +00001823
Douglas Gregore2e50d332010-12-01 01:36:18 +00001824 To->startDefinition();
Gabor Marton17c3eaf2019-07-01 12:44:39 +00001825 // Complete the definition even if error is returned.
1826 // The RecordDecl may be already part of the AST so it is better to
1827 // have it in complete state even if something is wrong with it.
Gabor Martonaefcf512019-07-17 13:47:46 +00001828 auto DefinitionCompleterScopeExit =
1829 llvm::make_scope_exit(DefinitionCompleter);
Aleksei Sidorin04fbffc2018-04-24 10:11:53 +00001830
Balazs Keri3b30d652018-10-19 13:32:20 +00001831 if (Error Err = setTypedefNameForAnonDecl(From, To, Importer))
1832 return Err;
Fangrui Song6907ce22018-07-30 19:24:48 +00001833
Douglas Gregore2e50d332010-12-01 01:36:18 +00001834 // Add base classes.
Gabor Marton17d39672018-11-26 15:54:08 +00001835 auto *ToCXX = dyn_cast<CXXRecordDecl>(To);
1836 auto *FromCXX = dyn_cast<CXXRecordDecl>(From);
1837 if (ToCXX && FromCXX && ToCXX->dataPtr() && FromCXX->dataPtr()) {
Douglas Gregor3c2404b2011-11-03 18:07:07 +00001838
1839 struct CXXRecordDecl::DefinitionData &ToData = ToCXX->data();
1840 struct CXXRecordDecl::DefinitionData &FromData = FromCXX->data();
Richard Smith91aeacc2019-10-11 00:29:04 +00001841
1842 #define FIELD(Name, Width, Merge) \
1843 ToData.Name = FromData.Name;
1844 #include "clang/AST/CXXRecordDeclDefinitionBits.def"
Richard Smith561fb152012-02-25 07:33:38 +00001845
Shafik Yaghmour16b90732019-04-26 18:51:28 +00001846 // Copy over the data stored in RecordDeclBits
1847 ToCXX->setArgPassingRestrictions(FromCXX->getArgPassingRestrictions());
1848
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001849 SmallVector<CXXBaseSpecifier *, 4> Bases;
Aaron Ballman574705e2014-03-13 15:41:46 +00001850 for (const auto &Base1 : FromCXX->bases()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001851 ExpectedType TyOrErr = import(Base1.getType());
1852 if (!TyOrErr)
1853 return TyOrErr.takeError();
Douglas Gregor752a5952011-01-03 22:36:02 +00001854
1855 SourceLocation EllipsisLoc;
Balazs Keri3b30d652018-10-19 13:32:20 +00001856 if (Base1.isPackExpansion()) {
1857 if (ExpectedSLoc LocOrErr = import(Base1.getEllipsisLoc()))
1858 EllipsisLoc = *LocOrErr;
1859 else
1860 return LocOrErr.takeError();
1861 }
Douglas Gregord451ea92011-07-29 23:31:30 +00001862
1863 // Ensure that we have a definition for the base.
Balazs Keri3b30d652018-10-19 13:32:20 +00001864 if (Error Err =
1865 ImportDefinitionIfNeeded(Base1.getType()->getAsCXXRecordDecl()))
1866 return Err;
1867
1868 auto RangeOrErr = import(Base1.getSourceRange());
1869 if (!RangeOrErr)
1870 return RangeOrErr.takeError();
1871
1872 auto TSIOrErr = import(Base1.getTypeSourceInfo());
1873 if (!TSIOrErr)
1874 return TSIOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001875
Douglas Gregore2e50d332010-12-01 01:36:18 +00001876 Bases.push_back(
Balazs Keri3b30d652018-10-19 13:32:20 +00001877 new (Importer.getToContext()) CXXBaseSpecifier(
1878 *RangeOrErr,
1879 Base1.isVirtual(),
1880 Base1.isBaseOfClass(),
1881 Base1.getAccessSpecifierAsWritten(),
1882 *TSIOrErr,
1883 EllipsisLoc));
Douglas Gregore2e50d332010-12-01 01:36:18 +00001884 }
1885 if (!Bases.empty())
Craig Toppere6337e12015-12-25 00:36:02 +00001886 ToCXX->setBases(Bases.data(), Bases.size());
Douglas Gregore2e50d332010-12-01 01:36:18 +00001887 }
Fangrui Song6907ce22018-07-30 19:24:48 +00001888
Douglas Gregor2e15c842012-02-01 21:00:38 +00001889 if (shouldForceImportDeclContext(Kind))
Balazs Keri3b30d652018-10-19 13:32:20 +00001890 if (Error Err = ImportDeclContext(From, /*ForceImport=*/true))
1891 return Err;
Fangrui Song6907ce22018-07-30 19:24:48 +00001892
Balazs Keri3b30d652018-10-19 13:32:20 +00001893 return Error::success();
Douglas Gregore2e50d332010-12-01 01:36:18 +00001894}
1895
Balazs Keri3b30d652018-10-19 13:32:20 +00001896Error ASTNodeImporter::ImportInitializer(VarDecl *From, VarDecl *To) {
Sean Callanan59721b32015-04-28 18:41:46 +00001897 if (To->getAnyInitializer())
Balazs Keri3b30d652018-10-19 13:32:20 +00001898 return Error::success();
Larisse Voufo39a1e502013-08-06 01:03:05 +00001899
Gabor Martonac3a5d62018-09-17 12:04:52 +00001900 Expr *FromInit = From->getInit();
1901 if (!FromInit)
Balazs Keri3b30d652018-10-19 13:32:20 +00001902 return Error::success();
Gabor Martonac3a5d62018-09-17 12:04:52 +00001903
Balazs Keri3b30d652018-10-19 13:32:20 +00001904 ExpectedExpr ToInitOrErr = import(FromInit);
1905 if (!ToInitOrErr)
1906 return ToInitOrErr.takeError();
Gabor Martonac3a5d62018-09-17 12:04:52 +00001907
Balazs Keri3b30d652018-10-19 13:32:20 +00001908 To->setInit(*ToInitOrErr);
Gabor Martonac3a5d62018-09-17 12:04:52 +00001909 if (From->isInitKnownICE()) {
1910 EvaluatedStmt *Eval = To->ensureEvaluatedStmt();
1911 Eval->CheckedICE = true;
1912 Eval->IsICE = From->isInitICE();
1913 }
Larisse Voufo39a1e502013-08-06 01:03:05 +00001914
1915 // FIXME: Other bits to merge?
Balazs Keri3b30d652018-10-19 13:32:20 +00001916 return Error::success();
Larisse Voufo39a1e502013-08-06 01:03:05 +00001917}
1918
Balazs Keri3b30d652018-10-19 13:32:20 +00001919Error ASTNodeImporter::ImportDefinition(
1920 EnumDecl *From, EnumDecl *To, ImportDefinitionKind Kind) {
Douglas Gregor2e15c842012-02-01 21:00:38 +00001921 if (To->getDefinition() || To->isBeingDefined()) {
1922 if (Kind == IDK_Everything)
Balazs Keri3b30d652018-10-19 13:32:20 +00001923 return ImportDeclContext(From, /*ForceImport=*/true);
1924 return Error::success();
Douglas Gregor2e15c842012-02-01 21:00:38 +00001925 }
Fangrui Song6907ce22018-07-30 19:24:48 +00001926
Douglas Gregord451ea92011-07-29 23:31:30 +00001927 To->startDefinition();
1928
Balazs Keri3b30d652018-10-19 13:32:20 +00001929 if (Error Err = setTypedefNameForAnonDecl(From, To, Importer))
1930 return Err;
Aleksei Sidorin04fbffc2018-04-24 10:11:53 +00001931
Balazs Keri3b30d652018-10-19 13:32:20 +00001932 ExpectedType ToTypeOrErr =
1933 import(Importer.getFromContext().getTypeDeclType(From));
1934 if (!ToTypeOrErr)
1935 return ToTypeOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001936
Balazs Keri3b30d652018-10-19 13:32:20 +00001937 ExpectedType ToPromotionTypeOrErr = import(From->getPromotionType());
1938 if (!ToPromotionTypeOrErr)
1939 return ToPromotionTypeOrErr.takeError();
Douglas Gregor2e15c842012-02-01 21:00:38 +00001940
1941 if (shouldForceImportDeclContext(Kind))
Balazs Keri3b30d652018-10-19 13:32:20 +00001942 if (Error Err = ImportDeclContext(From, /*ForceImport=*/true))
1943 return Err;
Fangrui Song6907ce22018-07-30 19:24:48 +00001944
Douglas Gregord451ea92011-07-29 23:31:30 +00001945 // FIXME: we might need to merge the number of positive or negative bits
1946 // if the enumerator lists don't match.
Balazs Keri3b30d652018-10-19 13:32:20 +00001947 To->completeDefinition(*ToTypeOrErr, *ToPromotionTypeOrErr,
Douglas Gregord451ea92011-07-29 23:31:30 +00001948 From->getNumPositiveBits(),
1949 From->getNumNegativeBits());
Balazs Keri3b30d652018-10-19 13:32:20 +00001950 return Error::success();
Douglas Gregord451ea92011-07-29 23:31:30 +00001951}
1952
Balazs Keri3b30d652018-10-19 13:32:20 +00001953Error ASTNodeImporter::ImportTemplateArguments(
1954 const TemplateArgument *FromArgs, unsigned NumFromArgs,
1955 SmallVectorImpl<TemplateArgument> &ToArgs) {
Douglas Gregore2e50d332010-12-01 01:36:18 +00001956 for (unsigned I = 0; I != NumFromArgs; ++I) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001957 if (auto ToOrErr = import(FromArgs[I]))
1958 ToArgs.push_back(*ToOrErr);
1959 else
1960 return ToOrErr.takeError();
Douglas Gregore2e50d332010-12-01 01:36:18 +00001961 }
Fangrui Song6907ce22018-07-30 19:24:48 +00001962
Balazs Keri3b30d652018-10-19 13:32:20 +00001963 return Error::success();
Douglas Gregore2e50d332010-12-01 01:36:18 +00001964}
1965
Balazs Keri3b30d652018-10-19 13:32:20 +00001966// FIXME: Do not forget to remove this and use only 'import'.
1967Expected<TemplateArgument>
1968ASTNodeImporter::ImportTemplateArgument(const TemplateArgument &From) {
1969 return import(From);
1970}
1971
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00001972template <typename InContainerTy>
Balazs Keri3b30d652018-10-19 13:32:20 +00001973Error ASTNodeImporter::ImportTemplateArgumentListInfo(
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00001974 const InContainerTy &Container, TemplateArgumentListInfo &ToTAInfo) {
1975 for (const auto &FromLoc : Container) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001976 if (auto ToLocOrErr = import(FromLoc))
1977 ToTAInfo.addArgument(*ToLocOrErr);
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00001978 else
Balazs Keri3b30d652018-10-19 13:32:20 +00001979 return ToLocOrErr.takeError();
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00001980 }
Balazs Keri3b30d652018-10-19 13:32:20 +00001981 return Error::success();
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00001982}
1983
Gabor Marton26f72a92018-07-12 09:42:05 +00001984static StructuralEquivalenceKind
1985getStructuralEquivalenceKind(const ASTImporter &Importer) {
1986 return Importer.isMinimalImport() ? StructuralEquivalenceKind::Minimal
1987 : StructuralEquivalenceKind::Default;
1988}
1989
Gabor Marton950fb572018-07-17 12:39:27 +00001990bool ASTNodeImporter::IsStructuralMatch(Decl *From, Decl *To, bool Complain) {
1991 StructuralEquivalenceContext Ctx(
1992 Importer.getFromContext(), Importer.getToContext(),
1993 Importer.getNonEquivalentDecls(), getStructuralEquivalenceKind(Importer),
1994 false, Complain);
1995 return Ctx.IsEquivalent(From, To);
1996}
1997
1998bool ASTNodeImporter::IsStructuralMatch(RecordDecl *FromRecord,
Douglas Gregordd6006f2012-07-17 21:16:27 +00001999 RecordDecl *ToRecord, bool Complain) {
Sean Callananc665c9e2013-10-09 21:45:11 +00002000 // Eliminate a potential failure point where we attempt to re-import
2001 // something we're trying to import while completing ToRecord.
2002 Decl *ToOrigin = Importer.GetOriginalDecl(ToRecord);
2003 if (ToOrigin) {
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002004 auto *ToOriginRecord = dyn_cast<RecordDecl>(ToOrigin);
Sean Callananc665c9e2013-10-09 21:45:11 +00002005 if (ToOriginRecord)
2006 ToRecord = ToOriginRecord;
2007 }
2008
Benjamin Kramer26d19c52010-02-18 13:02:13 +00002009 StructuralEquivalenceContext Ctx(Importer.getFromContext(),
Sean Callananc665c9e2013-10-09 21:45:11 +00002010 ToRecord->getASTContext(),
Douglas Gregordd6006f2012-07-17 21:16:27 +00002011 Importer.getNonEquivalentDecls(),
Gabor Marton26f72a92018-07-12 09:42:05 +00002012 getStructuralEquivalenceKind(Importer),
Douglas Gregordd6006f2012-07-17 21:16:27 +00002013 false, Complain);
Gabor Marton950fb572018-07-17 12:39:27 +00002014 return Ctx.IsEquivalent(FromRecord, ToRecord);
Douglas Gregor5c73e912010-02-11 00:48:18 +00002015}
2016
Larisse Voufo39a1e502013-08-06 01:03:05 +00002017bool ASTNodeImporter::IsStructuralMatch(VarDecl *FromVar, VarDecl *ToVar,
2018 bool Complain) {
2019 StructuralEquivalenceContext Ctx(
2020 Importer.getFromContext(), Importer.getToContext(),
Gabor Marton26f72a92018-07-12 09:42:05 +00002021 Importer.getNonEquivalentDecls(), getStructuralEquivalenceKind(Importer),
2022 false, Complain);
Gabor Marton950fb572018-07-17 12:39:27 +00002023 return Ctx.IsEquivalent(FromVar, ToVar);
Larisse Voufo39a1e502013-08-06 01:03:05 +00002024}
2025
Douglas Gregor98c10182010-02-12 22:17:39 +00002026bool ASTNodeImporter::IsStructuralMatch(EnumDecl *FromEnum, EnumDecl *ToEnum) {
Shafik Yaghmoure5094d62019-03-27 17:47:36 +00002027 // Eliminate a potential failure point where we attempt to re-import
Raphael Isemannfa26c202019-04-09 14:18:23 +00002028 // something we're trying to import while completing ToEnum.
Shafik Yaghmoure5094d62019-03-27 17:47:36 +00002029 if (Decl *ToOrigin = Importer.GetOriginalDecl(ToEnum))
2030 if (auto *ToOriginEnum = dyn_cast<EnumDecl>(ToOrigin))
2031 ToEnum = ToOriginEnum;
2032
Gabor Marton26f72a92018-07-12 09:42:05 +00002033 StructuralEquivalenceContext Ctx(
2034 Importer.getFromContext(), Importer.getToContext(),
2035 Importer.getNonEquivalentDecls(), getStructuralEquivalenceKind(Importer));
Gabor Marton950fb572018-07-17 12:39:27 +00002036 return Ctx.IsEquivalent(FromEnum, ToEnum);
Douglas Gregor98c10182010-02-12 22:17:39 +00002037}
2038
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00002039bool ASTNodeImporter::IsStructuralMatch(FunctionTemplateDecl *From,
2040 FunctionTemplateDecl *To) {
2041 StructuralEquivalenceContext Ctx(
2042 Importer.getFromContext(), Importer.getToContext(),
Gabor Marton26f72a92018-07-12 09:42:05 +00002043 Importer.getNonEquivalentDecls(), getStructuralEquivalenceKind(Importer),
2044 false, false);
Gabor Marton950fb572018-07-17 12:39:27 +00002045 return Ctx.IsEquivalent(From, To);
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00002046}
2047
Balazs Keric7797c42018-07-11 09:37:24 +00002048bool ASTNodeImporter::IsStructuralMatch(FunctionDecl *From, FunctionDecl *To) {
2049 StructuralEquivalenceContext Ctx(
2050 Importer.getFromContext(), Importer.getToContext(),
Gabor Marton26f72a92018-07-12 09:42:05 +00002051 Importer.getNonEquivalentDecls(), getStructuralEquivalenceKind(Importer),
2052 false, false);
Gabor Marton950fb572018-07-17 12:39:27 +00002053 return Ctx.IsEquivalent(From, To);
Balazs Keric7797c42018-07-11 09:37:24 +00002054}
2055
Douglas Gregor91155082012-11-14 22:29:20 +00002056bool ASTNodeImporter::IsStructuralMatch(EnumConstantDecl *FromEC,
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002057 EnumConstantDecl *ToEC) {
Douglas Gregor91155082012-11-14 22:29:20 +00002058 const llvm::APSInt &FromVal = FromEC->getInitVal();
2059 const llvm::APSInt &ToVal = ToEC->getInitVal();
2060
2061 return FromVal.isSigned() == ToVal.isSigned() &&
2062 FromVal.getBitWidth() == ToVal.getBitWidth() &&
2063 FromVal == ToVal;
2064}
2065
2066bool ASTNodeImporter::IsStructuralMatch(ClassTemplateDecl *From,
Douglas Gregora082a492010-11-30 19:14:50 +00002067 ClassTemplateDecl *To) {
2068 StructuralEquivalenceContext Ctx(Importer.getFromContext(),
2069 Importer.getToContext(),
Gabor Marton26f72a92018-07-12 09:42:05 +00002070 Importer.getNonEquivalentDecls(),
2071 getStructuralEquivalenceKind(Importer));
Gabor Marton950fb572018-07-17 12:39:27 +00002072 return Ctx.IsEquivalent(From, To);
Douglas Gregora082a492010-11-30 19:14:50 +00002073}
2074
Larisse Voufo39a1e502013-08-06 01:03:05 +00002075bool ASTNodeImporter::IsStructuralMatch(VarTemplateDecl *From,
2076 VarTemplateDecl *To) {
2077 StructuralEquivalenceContext Ctx(Importer.getFromContext(),
2078 Importer.getToContext(),
Gabor Marton26f72a92018-07-12 09:42:05 +00002079 Importer.getNonEquivalentDecls(),
2080 getStructuralEquivalenceKind(Importer));
Gabor Marton950fb572018-07-17 12:39:27 +00002081 return Ctx.IsEquivalent(From, To);
Larisse Voufo39a1e502013-08-06 01:03:05 +00002082}
2083
Balazs Keri3b30d652018-10-19 13:32:20 +00002084ExpectedDecl ASTNodeImporter::VisitDecl(Decl *D) {
Douglas Gregor811663e2010-02-10 00:15:17 +00002085 Importer.FromDiag(D->getLocation(), diag::err_unsupported_ast_node)
Douglas Gregore4c83e42010-02-09 22:48:33 +00002086 << D->getDeclKindName();
Balazs Keri3b30d652018-10-19 13:32:20 +00002087 return make_error<ImportError>(ImportError::UnsupportedConstruct);
Douglas Gregore4c83e42010-02-09 22:48:33 +00002088}
2089
Balazs Keri3b30d652018-10-19 13:32:20 +00002090ExpectedDecl ASTNodeImporter::VisitImportDecl(ImportDecl *D) {
2091 Importer.FromDiag(D->getLocation(), diag::err_unsupported_ast_node)
2092 << D->getDeclKindName();
2093 return make_error<ImportError>(ImportError::UnsupportedConstruct);
2094}
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00002095
Balazs Keri3b30d652018-10-19 13:32:20 +00002096ExpectedDecl ASTNodeImporter::VisitEmptyDecl(EmptyDecl *D) {
2097 // Import the context of this declaration.
2098 DeclContext *DC, *LexicalDC;
2099 if (Error Err = ImportDeclContext(D, DC, LexicalDC))
2100 return std::move(Err);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00002101
2102 // Import the location of this declaration.
Balazs Keri3b30d652018-10-19 13:32:20 +00002103 ExpectedSLoc LocOrErr = import(D->getLocation());
2104 if (!LocOrErr)
2105 return LocOrErr.takeError();
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00002106
Gabor Marton26f72a92018-07-12 09:42:05 +00002107 EmptyDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00002108 if (GetImportedOrCreateDecl(ToD, D, Importer.getToContext(), DC, *LocOrErr))
Gabor Marton26f72a92018-07-12 09:42:05 +00002109 return ToD;
2110
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00002111 ToD->setLexicalDeclContext(LexicalDC);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00002112 LexicalDC->addDeclInternal(ToD);
2113 return ToD;
2114}
2115
Balazs Keri3b30d652018-10-19 13:32:20 +00002116ExpectedDecl ASTNodeImporter::VisitTranslationUnitDecl(TranslationUnitDecl *D) {
Fangrui Song6907ce22018-07-30 19:24:48 +00002117 TranslationUnitDecl *ToD =
Sean Callanan65198272011-11-17 23:20:56 +00002118 Importer.getToContext().getTranslationUnitDecl();
Fangrui Song6907ce22018-07-30 19:24:48 +00002119
Gabor Marton26f72a92018-07-12 09:42:05 +00002120 Importer.MapImported(D, ToD);
Fangrui Song6907ce22018-07-30 19:24:48 +00002121
Sean Callanan65198272011-11-17 23:20:56 +00002122 return ToD;
2123}
2124
Balazs Keri3b30d652018-10-19 13:32:20 +00002125ExpectedDecl ASTNodeImporter::VisitAccessSpecDecl(AccessSpecDecl *D) {
2126 ExpectedSLoc LocOrErr = import(D->getLocation());
2127 if (!LocOrErr)
2128 return LocOrErr.takeError();
2129 auto ColonLocOrErr = import(D->getColonLoc());
2130 if (!ColonLocOrErr)
2131 return ColonLocOrErr.takeError();
Argyrios Kyrtzidis544ea712016-02-18 23:08:36 +00002132
2133 // Import the context of this declaration.
Balazs Keri3b30d652018-10-19 13:32:20 +00002134 auto DCOrErr = Importer.ImportContext(D->getDeclContext());
2135 if (!DCOrErr)
2136 return DCOrErr.takeError();
2137 DeclContext *DC = *DCOrErr;
Argyrios Kyrtzidis544ea712016-02-18 23:08:36 +00002138
Gabor Marton26f72a92018-07-12 09:42:05 +00002139 AccessSpecDecl *ToD;
2140 if (GetImportedOrCreateDecl(ToD, D, Importer.getToContext(), D->getAccess(),
Balazs Keri3b30d652018-10-19 13:32:20 +00002141 DC, *LocOrErr, *ColonLocOrErr))
Gabor Marton26f72a92018-07-12 09:42:05 +00002142 return ToD;
Argyrios Kyrtzidis544ea712016-02-18 23:08:36 +00002143
2144 // Lexical DeclContext and Semantic DeclContext
2145 // is always the same for the accessSpec.
Gabor Marton26f72a92018-07-12 09:42:05 +00002146 ToD->setLexicalDeclContext(DC);
2147 DC->addDeclInternal(ToD);
Argyrios Kyrtzidis544ea712016-02-18 23:08:36 +00002148
Gabor Marton26f72a92018-07-12 09:42:05 +00002149 return ToD;
Argyrios Kyrtzidis544ea712016-02-18 23:08:36 +00002150}
2151
Balazs Keri3b30d652018-10-19 13:32:20 +00002152ExpectedDecl ASTNodeImporter::VisitStaticAssertDecl(StaticAssertDecl *D) {
2153 auto DCOrErr = Importer.ImportContext(D->getDeclContext());
2154 if (!DCOrErr)
2155 return DCOrErr.takeError();
2156 DeclContext *DC = *DCOrErr;
Aleksei Sidorina693b372016-09-28 10:16:56 +00002157 DeclContext *LexicalDC = DC;
2158
Balazs Keri3b30d652018-10-19 13:32:20 +00002159 SourceLocation ToLocation, ToRParenLoc;
2160 Expr *ToAssertExpr;
2161 StringLiteral *ToMessage;
2162 if (auto Imp = importSeq(
2163 D->getLocation(), D->getAssertExpr(), D->getMessage(), D->getRParenLoc()))
2164 std::tie(ToLocation, ToAssertExpr, ToMessage, ToRParenLoc) = *Imp;
2165 else
2166 return Imp.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00002167
Gabor Marton26f72a92018-07-12 09:42:05 +00002168 StaticAssertDecl *ToD;
2169 if (GetImportedOrCreateDecl(
Balazs Keri3b30d652018-10-19 13:32:20 +00002170 ToD, D, Importer.getToContext(), DC, ToLocation, ToAssertExpr, ToMessage,
2171 ToRParenLoc, D->isFailed()))
Gabor Marton26f72a92018-07-12 09:42:05 +00002172 return ToD;
Aleksei Sidorina693b372016-09-28 10:16:56 +00002173
2174 ToD->setLexicalDeclContext(LexicalDC);
2175 LexicalDC->addDeclInternal(ToD);
Aleksei Sidorina693b372016-09-28 10:16:56 +00002176 return ToD;
2177}
2178
Balazs Keri3b30d652018-10-19 13:32:20 +00002179ExpectedDecl ASTNodeImporter::VisitNamespaceDecl(NamespaceDecl *D) {
Douglas Gregorf18a2c72010-02-21 18:26:36 +00002180 // Import the major distinguishing characteristics of this namespace.
2181 DeclContext *DC, *LexicalDC;
2182 DeclarationName Name;
2183 SourceLocation Loc;
Sean Callanan59721b32015-04-28 18:41:46 +00002184 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00002185 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
2186 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00002187 if (ToD)
2188 return ToD;
Craig Topper36250ad2014-05-12 05:36:57 +00002189
2190 NamespaceDecl *MergeWithNamespace = nullptr;
Douglas Gregorf18a2c72010-02-21 18:26:36 +00002191 if (!Name) {
2192 // This is an anonymous namespace. Adopt an existing anonymous
2193 // namespace if we can.
2194 // FIXME: Not testable.
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002195 if (auto *TU = dyn_cast<TranslationUnitDecl>(DC))
Douglas Gregorf18a2c72010-02-21 18:26:36 +00002196 MergeWithNamespace = TU->getAnonymousNamespace();
2197 else
2198 MergeWithNamespace = cast<NamespaceDecl>(DC)->getAnonymousNamespace();
2199 } else {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002200 SmallVector<NamedDecl *, 4> ConflictingDecls;
Gabor Marton54058b52018-12-17 13:53:12 +00002201 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002202 for (auto *FoundDecl : FoundDecls) {
2203 if (!FoundDecl->isInIdentifierNamespace(Decl::IDNS_Namespace))
Douglas Gregorf18a2c72010-02-21 18:26:36 +00002204 continue;
Fangrui Song6907ce22018-07-30 19:24:48 +00002205
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002206 if (auto *FoundNS = dyn_cast<NamespaceDecl>(FoundDecl)) {
Douglas Gregorf18a2c72010-02-21 18:26:36 +00002207 MergeWithNamespace = FoundNS;
2208 ConflictingDecls.clear();
2209 break;
2210 }
Fangrui Song6907ce22018-07-30 19:24:48 +00002211
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002212 ConflictingDecls.push_back(FoundDecl);
Douglas Gregorf18a2c72010-02-21 18:26:36 +00002213 }
Fangrui Song6907ce22018-07-30 19:24:48 +00002214
Douglas Gregorf18a2c72010-02-21 18:26:36 +00002215 if (!ConflictingDecls.empty()) {
Gabor Martonf035b752019-08-27 11:36:10 +00002216 ExpectedName NameOrErr = Importer.HandleNameConflict(
2217 Name, DC, Decl::IDNS_Namespace, ConflictingDecls.data(),
2218 ConflictingDecls.size());
2219 if (NameOrErr)
2220 Name = NameOrErr.get();
2221 else
2222 return NameOrErr.takeError();
Douglas Gregorf18a2c72010-02-21 18:26:36 +00002223 }
2224 }
Fangrui Song6907ce22018-07-30 19:24:48 +00002225
Balazs Keri3b30d652018-10-19 13:32:20 +00002226 ExpectedSLoc BeginLocOrErr = import(D->getBeginLoc());
2227 if (!BeginLocOrErr)
2228 return BeginLocOrErr.takeError();
2229
Douglas Gregorf18a2c72010-02-21 18:26:36 +00002230 // Create the "to" namespace, if needed.
2231 NamespaceDecl *ToNamespace = MergeWithNamespace;
2232 if (!ToNamespace) {
Gabor Marton26f72a92018-07-12 09:42:05 +00002233 if (GetImportedOrCreateDecl(
2234 ToNamespace, D, Importer.getToContext(), DC, D->isInline(),
Balazs Keri3b30d652018-10-19 13:32:20 +00002235 *BeginLocOrErr, Loc, Name.getAsIdentifierInfo(),
Gabor Marton26f72a92018-07-12 09:42:05 +00002236 /*PrevDecl=*/nullptr))
2237 return ToNamespace;
Douglas Gregorf18a2c72010-02-21 18:26:36 +00002238 ToNamespace->setLexicalDeclContext(LexicalDC);
Sean Callanan95e74be2011-10-21 02:57:43 +00002239 LexicalDC->addDeclInternal(ToNamespace);
Fangrui Song6907ce22018-07-30 19:24:48 +00002240
Douglas Gregorf18a2c72010-02-21 18:26:36 +00002241 // If this is an anonymous namespace, register it as the anonymous
2242 // namespace within its context.
2243 if (!Name) {
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002244 if (auto *TU = dyn_cast<TranslationUnitDecl>(DC))
Douglas Gregorf18a2c72010-02-21 18:26:36 +00002245 TU->setAnonymousNamespace(ToNamespace);
2246 else
2247 cast<NamespaceDecl>(DC)->setAnonymousNamespace(ToNamespace);
2248 }
2249 }
Gabor Marton26f72a92018-07-12 09:42:05 +00002250 Importer.MapImported(D, ToNamespace);
Fangrui Song6907ce22018-07-30 19:24:48 +00002251
Balazs Keri3b30d652018-10-19 13:32:20 +00002252 if (Error Err = ImportDeclContext(D))
2253 return std::move(Err);
Fangrui Song6907ce22018-07-30 19:24:48 +00002254
Douglas Gregorf18a2c72010-02-21 18:26:36 +00002255 return ToNamespace;
2256}
2257
Balazs Keri3b30d652018-10-19 13:32:20 +00002258ExpectedDecl ASTNodeImporter::VisitNamespaceAliasDecl(NamespaceAliasDecl *D) {
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00002259 // Import the major distinguishing characteristics of this namespace.
2260 DeclContext *DC, *LexicalDC;
2261 DeclarationName Name;
2262 SourceLocation Loc;
2263 NamedDecl *LookupD;
Balazs Keri3b30d652018-10-19 13:32:20 +00002264 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, LookupD, Loc))
2265 return std::move(Err);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00002266 if (LookupD)
2267 return LookupD;
2268
2269 // NOTE: No conflict resolution is done for namespace aliases now.
2270
Balazs Keri3b30d652018-10-19 13:32:20 +00002271 SourceLocation ToNamespaceLoc, ToAliasLoc, ToTargetNameLoc;
2272 NestedNameSpecifierLoc ToQualifierLoc;
2273 NamespaceDecl *ToNamespace;
2274 if (auto Imp = importSeq(
2275 D->getNamespaceLoc(), D->getAliasLoc(), D->getQualifierLoc(),
2276 D->getTargetNameLoc(), D->getNamespace()))
2277 std::tie(
2278 ToNamespaceLoc, ToAliasLoc, ToQualifierLoc, ToTargetNameLoc,
2279 ToNamespace) = *Imp;
2280 else
2281 return Imp.takeError();
2282 IdentifierInfo *ToIdentifier = Importer.Import(D->getIdentifier());
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00002283
Gabor Marton26f72a92018-07-12 09:42:05 +00002284 NamespaceAliasDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00002285 if (GetImportedOrCreateDecl(
2286 ToD, D, Importer.getToContext(), DC, ToNamespaceLoc, ToAliasLoc,
2287 ToIdentifier, ToQualifierLoc, ToTargetNameLoc, ToNamespace))
Gabor Marton26f72a92018-07-12 09:42:05 +00002288 return ToD;
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00002289
2290 ToD->setLexicalDeclContext(LexicalDC);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00002291 LexicalDC->addDeclInternal(ToD);
2292
2293 return ToD;
2294}
2295
Balazs Keri3b30d652018-10-19 13:32:20 +00002296ExpectedDecl
2297ASTNodeImporter::VisitTypedefNameDecl(TypedefNameDecl *D, bool IsAlias) {
Douglas Gregor5fa74c32010-02-10 21:10:29 +00002298 // Import the major distinguishing characteristics of this typedef.
2299 DeclContext *DC, *LexicalDC;
2300 DeclarationName Name;
2301 SourceLocation Loc;
Sean Callanan59721b32015-04-28 18:41:46 +00002302 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00002303 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
2304 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00002305 if (ToD)
2306 return ToD;
Craig Topper36250ad2014-05-12 05:36:57 +00002307
Douglas Gregor5fa74c32010-02-10 21:10:29 +00002308 // If this typedef is not in block scope, determine whether we've
2309 // seen a typedef with the same name (that we can merge with) or any
2310 // other entity by that name (which name lookup could conflict with).
Balazs Keric86d47b2019-09-04 14:12:18 +00002311 // Note: Repeated typedefs are not valid in C99:
2312 // 'typedef int T; typedef int T;' is invalid
2313 // We do not care about this now.
Douglas Gregor5fa74c32010-02-10 21:10:29 +00002314 if (!DC->isFunctionOrMethod()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002315 SmallVector<NamedDecl *, 4> ConflictingDecls;
Douglas Gregor5fa74c32010-02-10 21:10:29 +00002316 unsigned IDNS = Decl::IDNS_Ordinary;
Gabor Marton54058b52018-12-17 13:53:12 +00002317 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002318 for (auto *FoundDecl : FoundDecls) {
2319 if (!FoundDecl->isInIdentifierNamespace(IDNS))
Douglas Gregor5fa74c32010-02-10 21:10:29 +00002320 continue;
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002321 if (auto *FoundTypedef = dyn_cast<TypedefNameDecl>(FoundDecl)) {
Balazs Keric86d47b2019-09-04 14:12:18 +00002322 if (!hasSameVisibilityContext(FoundTypedef, D))
2323 continue;
2324
Gabor Martonb93baf62018-11-27 09:51:36 +00002325 QualType FromUT = D->getUnderlyingType();
2326 QualType FoundUT = FoundTypedef->getUnderlyingType();
2327 if (Importer.IsStructurallyEquivalent(FromUT, FoundUT)) {
2328 // If the "From" context has a complete underlying type but we
2329 // already have a complete underlying type then return with that.
2330 if (!FromUT->isIncompleteType() && !FoundUT->isIncompleteType())
Balazs Keri3b30d652018-10-19 13:32:20 +00002331 return Importer.MapImported(D, FoundTypedef);
Gabor Martonf035b752019-08-27 11:36:10 +00002332 // FIXME Handle redecl chain. When you do that make consistent changes
2333 // in ASTImporterLookupTable too.
2334 } else {
2335 ConflictingDecls.push_back(FoundDecl);
Gabor Martonb93baf62018-11-27 09:51:36 +00002336 }
Douglas Gregor5fa74c32010-02-10 21:10:29 +00002337 }
Douglas Gregor5fa74c32010-02-10 21:10:29 +00002338 }
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00002339
Douglas Gregor5fa74c32010-02-10 21:10:29 +00002340 if (!ConflictingDecls.empty()) {
Gabor Martonf035b752019-08-27 11:36:10 +00002341 ExpectedName NameOrErr = Importer.HandleNameConflict(
2342 Name, DC, IDNS, ConflictingDecls.data(), ConflictingDecls.size());
2343 if (NameOrErr)
2344 Name = NameOrErr.get();
2345 else
2346 return NameOrErr.takeError();
Douglas Gregor5fa74c32010-02-10 21:10:29 +00002347 }
2348 }
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00002349
Balazs Keri3b30d652018-10-19 13:32:20 +00002350 QualType ToUnderlyingType;
2351 TypeSourceInfo *ToTypeSourceInfo;
2352 SourceLocation ToBeginLoc;
2353 if (auto Imp = importSeq(
2354 D->getUnderlyingType(), D->getTypeSourceInfo(), D->getBeginLoc()))
2355 std::tie(ToUnderlyingType, ToTypeSourceInfo, ToBeginLoc) = *Imp;
2356 else
2357 return Imp.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00002358
Douglas Gregor5fa74c32010-02-10 21:10:29 +00002359 // Create the new typedef node.
Balazs Keri3b30d652018-10-19 13:32:20 +00002360 // FIXME: ToUnderlyingType is not used.
Richard Smithdda56e42011-04-15 14:24:37 +00002361 TypedefNameDecl *ToTypedef;
Gabor Marton26f72a92018-07-12 09:42:05 +00002362 if (IsAlias) {
2363 if (GetImportedOrCreateDecl<TypeAliasDecl>(
Balazs Keri3b30d652018-10-19 13:32:20 +00002364 ToTypedef, D, Importer.getToContext(), DC, ToBeginLoc, Loc,
2365 Name.getAsIdentifierInfo(), ToTypeSourceInfo))
Gabor Marton26f72a92018-07-12 09:42:05 +00002366 return ToTypedef;
2367 } else if (GetImportedOrCreateDecl<TypedefDecl>(
Balazs Keri3b30d652018-10-19 13:32:20 +00002368 ToTypedef, D, Importer.getToContext(), DC, ToBeginLoc, Loc,
2369 Name.getAsIdentifierInfo(), ToTypeSourceInfo))
Gabor Marton26f72a92018-07-12 09:42:05 +00002370 return ToTypedef;
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00002371
Douglas Gregordd483172010-02-22 17:42:47 +00002372 ToTypedef->setAccess(D->getAccess());
Douglas Gregor5fa74c32010-02-10 21:10:29 +00002373 ToTypedef->setLexicalDeclContext(LexicalDC);
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00002374
2375 // Templated declarations should not appear in DeclContext.
2376 TypeAliasDecl *FromAlias = IsAlias ? cast<TypeAliasDecl>(D) : nullptr;
2377 if (!FromAlias || !FromAlias->getDescribedAliasTemplate())
2378 LexicalDC->addDeclInternal(ToTypedef);
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00002379
Douglas Gregor5fa74c32010-02-10 21:10:29 +00002380 return ToTypedef;
2381}
2382
Balazs Keri3b30d652018-10-19 13:32:20 +00002383ExpectedDecl ASTNodeImporter::VisitTypedefDecl(TypedefDecl *D) {
Richard Smithdda56e42011-04-15 14:24:37 +00002384 return VisitTypedefNameDecl(D, /*IsAlias=*/false);
2385}
2386
Balazs Keri3b30d652018-10-19 13:32:20 +00002387ExpectedDecl ASTNodeImporter::VisitTypeAliasDecl(TypeAliasDecl *D) {
Richard Smithdda56e42011-04-15 14:24:37 +00002388 return VisitTypedefNameDecl(D, /*IsAlias=*/true);
2389}
2390
Balazs Keri3b30d652018-10-19 13:32:20 +00002391ExpectedDecl
2392ASTNodeImporter::VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D) {
Gabor Horvath7a91c082017-11-14 11:30:38 +00002393 // Import the major distinguishing characteristics of this typedef.
2394 DeclContext *DC, *LexicalDC;
2395 DeclarationName Name;
2396 SourceLocation Loc;
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00002397 NamedDecl *FoundD;
Balazs Keri3b30d652018-10-19 13:32:20 +00002398 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, FoundD, Loc))
2399 return std::move(Err);
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00002400 if (FoundD)
2401 return FoundD;
Gabor Horvath7a91c082017-11-14 11:30:38 +00002402
2403 // If this typedef is not in block scope, determine whether we've
2404 // seen a typedef with the same name (that we can merge with) or any
2405 // other entity by that name (which name lookup could conflict with).
2406 if (!DC->isFunctionOrMethod()) {
2407 SmallVector<NamedDecl *, 4> ConflictingDecls;
2408 unsigned IDNS = Decl::IDNS_Ordinary;
Gabor Marton54058b52018-12-17 13:53:12 +00002409 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002410 for (auto *FoundDecl : FoundDecls) {
2411 if (!FoundDecl->isInIdentifierNamespace(IDNS))
Gabor Horvath7a91c082017-11-14 11:30:38 +00002412 continue;
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002413 if (auto *FoundAlias = dyn_cast<TypeAliasTemplateDecl>(FoundDecl))
Gabor Marton26f72a92018-07-12 09:42:05 +00002414 return Importer.MapImported(D, FoundAlias);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002415 ConflictingDecls.push_back(FoundDecl);
Gabor Horvath7a91c082017-11-14 11:30:38 +00002416 }
2417
2418 if (!ConflictingDecls.empty()) {
Gabor Martonf035b752019-08-27 11:36:10 +00002419 ExpectedName NameOrErr = Importer.HandleNameConflict(
2420 Name, DC, IDNS, ConflictingDecls.data(), ConflictingDecls.size());
2421 if (NameOrErr)
2422 Name = NameOrErr.get();
2423 else
2424 return NameOrErr.takeError();
Gabor Horvath7a91c082017-11-14 11:30:38 +00002425 }
2426 }
2427
Balazs Keri3b30d652018-10-19 13:32:20 +00002428 TemplateParameterList *ToTemplateParameters;
2429 TypeAliasDecl *ToTemplatedDecl;
2430 if (auto Imp = importSeq(D->getTemplateParameters(), D->getTemplatedDecl()))
2431 std::tie(ToTemplateParameters, ToTemplatedDecl) = *Imp;
2432 else
2433 return Imp.takeError();
Gabor Horvath7a91c082017-11-14 11:30:38 +00002434
Gabor Marton26f72a92018-07-12 09:42:05 +00002435 TypeAliasTemplateDecl *ToAlias;
2436 if (GetImportedOrCreateDecl(ToAlias, D, Importer.getToContext(), DC, Loc,
Balazs Keri3b30d652018-10-19 13:32:20 +00002437 Name, ToTemplateParameters, ToTemplatedDecl))
Gabor Marton26f72a92018-07-12 09:42:05 +00002438 return ToAlias;
Gabor Horvath7a91c082017-11-14 11:30:38 +00002439
Balazs Keri3b30d652018-10-19 13:32:20 +00002440 ToTemplatedDecl->setDescribedAliasTemplate(ToAlias);
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00002441
Gabor Horvath7a91c082017-11-14 11:30:38 +00002442 ToAlias->setAccess(D->getAccess());
2443 ToAlias->setLexicalDeclContext(LexicalDC);
Gabor Horvath7a91c082017-11-14 11:30:38 +00002444 LexicalDC->addDeclInternal(ToAlias);
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00002445 return ToAlias;
Gabor Horvath7a91c082017-11-14 11:30:38 +00002446}
2447
Balazs Keri3b30d652018-10-19 13:32:20 +00002448ExpectedDecl ASTNodeImporter::VisitLabelDecl(LabelDecl *D) {
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00002449 // Import the major distinguishing characteristics of this label.
2450 DeclContext *DC, *LexicalDC;
2451 DeclarationName Name;
2452 SourceLocation Loc;
2453 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00002454 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
2455 return std::move(Err);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00002456 if (ToD)
2457 return ToD;
2458
2459 assert(LexicalDC->isFunctionOrMethod());
2460
Gabor Marton26f72a92018-07-12 09:42:05 +00002461 LabelDecl *ToLabel;
Balazs Keri3b30d652018-10-19 13:32:20 +00002462 if (D->isGnuLocal()) {
2463 ExpectedSLoc BeginLocOrErr = import(D->getBeginLoc());
2464 if (!BeginLocOrErr)
2465 return BeginLocOrErr.takeError();
2466 if (GetImportedOrCreateDecl(ToLabel, D, Importer.getToContext(), DC, Loc,
2467 Name.getAsIdentifierInfo(), *BeginLocOrErr))
2468 return ToLabel;
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00002469
Balazs Keri3b30d652018-10-19 13:32:20 +00002470 } else {
2471 if (GetImportedOrCreateDecl(ToLabel, D, Importer.getToContext(), DC, Loc,
2472 Name.getAsIdentifierInfo()))
2473 return ToLabel;
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00002474
Balazs Keri3b30d652018-10-19 13:32:20 +00002475 }
2476
2477 Expected<LabelStmt *> ToStmtOrErr = import(D->getStmt());
2478 if (!ToStmtOrErr)
2479 return ToStmtOrErr.takeError();
2480
2481 ToLabel->setStmt(*ToStmtOrErr);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00002482 ToLabel->setLexicalDeclContext(LexicalDC);
2483 LexicalDC->addDeclInternal(ToLabel);
2484 return ToLabel;
2485}
2486
Balazs Keri3b30d652018-10-19 13:32:20 +00002487ExpectedDecl ASTNodeImporter::VisitEnumDecl(EnumDecl *D) {
Douglas Gregor98c10182010-02-12 22:17:39 +00002488 // Import the major distinguishing characteristics of this enum.
2489 DeclContext *DC, *LexicalDC;
2490 DeclarationName Name;
2491 SourceLocation Loc;
Sean Callanan59721b32015-04-28 18:41:46 +00002492 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00002493 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
2494 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00002495 if (ToD)
2496 return ToD;
Craig Topper36250ad2014-05-12 05:36:57 +00002497
Douglas Gregor98c10182010-02-12 22:17:39 +00002498 // Figure out what enum name we're looking for.
2499 unsigned IDNS = Decl::IDNS_Tag;
2500 DeclarationName SearchName = Name;
Richard Smithdda56e42011-04-15 14:24:37 +00002501 if (!SearchName && D->getTypedefNameForAnonDecl()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00002502 if (Error Err = importInto(
2503 SearchName, D->getTypedefNameForAnonDecl()->getDeclName()))
2504 return std::move(Err);
Douglas Gregor98c10182010-02-12 22:17:39 +00002505 IDNS = Decl::IDNS_Ordinary;
David Blaikiebbafb8a2012-03-11 07:00:24 +00002506 } else if (Importer.getToContext().getLangOpts().CPlusPlus)
Douglas Gregor98c10182010-02-12 22:17:39 +00002507 IDNS |= Decl::IDNS_Ordinary;
Fangrui Song6907ce22018-07-30 19:24:48 +00002508
Douglas Gregor98c10182010-02-12 22:17:39 +00002509 // We may already have an enum of the same name; try to find and match it.
2510 if (!DC->isFunctionOrMethod() && SearchName) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002511 SmallVector<NamedDecl *, 4> ConflictingDecls;
Gabor Marton54058b52018-12-17 13:53:12 +00002512 auto FoundDecls =
2513 Importer.findDeclsInToCtx(DC, SearchName);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002514 for (auto *FoundDecl : FoundDecls) {
2515 if (!FoundDecl->isInIdentifierNamespace(IDNS))
Douglas Gregor98c10182010-02-12 22:17:39 +00002516 continue;
Fangrui Song6907ce22018-07-30 19:24:48 +00002517
Balazs Keri3b30d652018-10-19 13:32:20 +00002518 if (auto *Typedef = dyn_cast<TypedefNameDecl>(FoundDecl)) {
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002519 if (const auto *Tag = Typedef->getUnderlyingType()->getAs<TagType>())
Balazs Keri3b30d652018-10-19 13:32:20 +00002520 FoundDecl = Tag->getDecl();
Douglas Gregor98c10182010-02-12 22:17:39 +00002521 }
Fangrui Song6907ce22018-07-30 19:24:48 +00002522
Balazs Keri3b30d652018-10-19 13:32:20 +00002523 if (auto *FoundEnum = dyn_cast<EnumDecl>(FoundDecl)) {
Balazs Kerieb79b252019-07-09 11:08:18 +00002524 if (!hasSameVisibilityContext(FoundEnum, D))
2525 continue;
Douglas Gregor8cdbe642010-02-12 23:44:20 +00002526 if (IsStructuralMatch(D, FoundEnum))
Gabor Marton26f72a92018-07-12 09:42:05 +00002527 return Importer.MapImported(D, FoundEnum);
Gabor Martonf035b752019-08-27 11:36:10 +00002528 ConflictingDecls.push_back(FoundDecl);
Douglas Gregor98c10182010-02-12 22:17:39 +00002529 }
Douglas Gregor98c10182010-02-12 22:17:39 +00002530 }
Fangrui Song6907ce22018-07-30 19:24:48 +00002531
Douglas Gregor98c10182010-02-12 22:17:39 +00002532 if (!ConflictingDecls.empty()) {
Gabor Martonf035b752019-08-27 11:36:10 +00002533 ExpectedName NameOrErr = Importer.HandleNameConflict(
2534 SearchName, DC, IDNS, ConflictingDecls.data(),
2535 ConflictingDecls.size());
2536 if (NameOrErr)
2537 Name = NameOrErr.get();
2538 else
2539 return NameOrErr.takeError();
Douglas Gregor98c10182010-02-12 22:17:39 +00002540 }
2541 }
Gabor Marton26f72a92018-07-12 09:42:05 +00002542
Balazs Keri3b30d652018-10-19 13:32:20 +00002543 SourceLocation ToBeginLoc;
2544 NestedNameSpecifierLoc ToQualifierLoc;
2545 QualType ToIntegerType;
2546 if (auto Imp = importSeq(
2547 D->getBeginLoc(), D->getQualifierLoc(), D->getIntegerType()))
2548 std::tie(ToBeginLoc, ToQualifierLoc, ToIntegerType) = *Imp;
2549 else
2550 return Imp.takeError();
2551
Douglas Gregor98c10182010-02-12 22:17:39 +00002552 // Create the enum declaration.
Gabor Marton26f72a92018-07-12 09:42:05 +00002553 EnumDecl *D2;
2554 if (GetImportedOrCreateDecl(
Balazs Keri3b30d652018-10-19 13:32:20 +00002555 D2, D, Importer.getToContext(), DC, ToBeginLoc,
Gabor Marton26f72a92018-07-12 09:42:05 +00002556 Loc, Name.getAsIdentifierInfo(), nullptr, D->isScoped(),
2557 D->isScopedUsingClassTag(), D->isFixed()))
2558 return D2;
2559
Balazs Keri3b30d652018-10-19 13:32:20 +00002560 D2->setQualifierInfo(ToQualifierLoc);
2561 D2->setIntegerType(ToIntegerType);
Douglas Gregordd483172010-02-22 17:42:47 +00002562 D2->setAccess(D->getAccess());
Douglas Gregor3996e242010-02-15 22:01:00 +00002563 D2->setLexicalDeclContext(LexicalDC);
Sean Callanan95e74be2011-10-21 02:57:43 +00002564 LexicalDC->addDeclInternal(D2);
Douglas Gregor98c10182010-02-12 22:17:39 +00002565
Douglas Gregor98c10182010-02-12 22:17:39 +00002566 // Import the definition
Balazs Keri3b30d652018-10-19 13:32:20 +00002567 if (D->isCompleteDefinition())
2568 if (Error Err = ImportDefinition(D, D2))
2569 return std::move(Err);
Douglas Gregor98c10182010-02-12 22:17:39 +00002570
Douglas Gregor3996e242010-02-15 22:01:00 +00002571 return D2;
Douglas Gregor98c10182010-02-12 22:17:39 +00002572}
2573
Balazs Keri3b30d652018-10-19 13:32:20 +00002574ExpectedDecl ASTNodeImporter::VisitRecordDecl(RecordDecl *D) {
Balazs Keri0c23dc52018-08-13 13:08:37 +00002575 bool IsFriendTemplate = false;
2576 if (auto *DCXX = dyn_cast<CXXRecordDecl>(D)) {
2577 IsFriendTemplate =
2578 DCXX->getDescribedClassTemplate() &&
2579 DCXX->getDescribedClassTemplate()->getFriendObjectKind() !=
2580 Decl::FOK_None;
2581 }
2582
Douglas Gregor5c73e912010-02-11 00:48:18 +00002583 // Import the major distinguishing characteristics of this record.
Simon Pilgrim4706f3b2019-10-15 10:23:05 +00002584 DeclContext *DC = nullptr, *LexicalDC = nullptr;
Douglas Gregor5c73e912010-02-11 00:48:18 +00002585 DeclarationName Name;
2586 SourceLocation Loc;
Simon Pilgrim4706f3b2019-10-15 10:23:05 +00002587 NamedDecl *ToD = nullptr;
Balazs Keri3b30d652018-10-19 13:32:20 +00002588 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
2589 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00002590 if (ToD)
2591 return ToD;
Craig Topper36250ad2014-05-12 05:36:57 +00002592
Douglas Gregor5c73e912010-02-11 00:48:18 +00002593 // Figure out what structure name we're looking for.
2594 unsigned IDNS = Decl::IDNS_Tag;
2595 DeclarationName SearchName = Name;
Richard Smithdda56e42011-04-15 14:24:37 +00002596 if (!SearchName && D->getTypedefNameForAnonDecl()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00002597 if (Error Err = importInto(
2598 SearchName, D->getTypedefNameForAnonDecl()->getDeclName()))
2599 return std::move(Err);
Douglas Gregor5c73e912010-02-11 00:48:18 +00002600 IDNS = Decl::IDNS_Ordinary;
David Blaikiebbafb8a2012-03-11 07:00:24 +00002601 } else if (Importer.getToContext().getLangOpts().CPlusPlus)
Gabor Marton7df342a2018-12-17 12:42:12 +00002602 IDNS |= Decl::IDNS_Ordinary | Decl::IDNS_TagFriend;
Douglas Gregor5c73e912010-02-11 00:48:18 +00002603
2604 // We may already have a record of the same name; try to find and match it.
Sean Callanan9092d472017-05-13 00:46:33 +00002605 RecordDecl *PrevDecl = nullptr;
Gabor Martone3e83d72019-08-30 10:55:41 +00002606 if (!DC->isFunctionOrMethod() && !D->isLambda()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002607 SmallVector<NamedDecl *, 4> ConflictingDecls;
Gabor Marton54058b52018-12-17 13:53:12 +00002608 auto FoundDecls =
2609 Importer.findDeclsInToCtx(DC, SearchName);
Sean Callanan9092d472017-05-13 00:46:33 +00002610 if (!FoundDecls.empty()) {
Gabor Marton41e38922019-03-05 11:23:24 +00002611 // We're going to have to compare D against potentially conflicting Decls,
2612 // so complete it.
Sean Callanan9092d472017-05-13 00:46:33 +00002613 if (D->hasExternalLexicalStorage() && !D->isCompleteDefinition())
2614 D->getASTContext().getExternalSource()->CompleteType(D);
2615 }
2616
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002617 for (auto *FoundDecl : FoundDecls) {
2618 if (!FoundDecl->isInIdentifierNamespace(IDNS))
Douglas Gregor5c73e912010-02-11 00:48:18 +00002619 continue;
Fangrui Song6907ce22018-07-30 19:24:48 +00002620
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002621 Decl *Found = FoundDecl;
2622 if (auto *Typedef = dyn_cast<TypedefNameDecl>(Found)) {
2623 if (const auto *Tag = Typedef->getUnderlyingType()->getAs<TagType>())
Douglas Gregor5c73e912010-02-11 00:48:18 +00002624 Found = Tag->getDecl();
2625 }
Gabor Martona0df7a92018-05-30 09:19:26 +00002626
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002627 if (auto *FoundRecord = dyn_cast<RecordDecl>(Found)) {
Gabor Marton7df342a2018-12-17 12:42:12 +00002628 // Do not emit false positive diagnostic in case of unnamed
2629 // struct/union and in case of anonymous structs. Would be false
2630 // because there may be several anonymous/unnamed structs in a class.
2631 // E.g. these are both valid:
2632 // struct A { // unnamed structs
2633 // struct { struct A *next; } entry0;
2634 // struct { struct A *next; } entry1;
2635 // };
2636 // struct X { struct { int a; }; struct { int b; }; }; // anon structs
2637 if (!SearchName)
Gabor Marton0bebf952018-07-05 09:51:13 +00002638 if (!IsStructuralMatch(D, FoundRecord, false))
2639 continue;
Douglas Gregorceb32bf2012-10-26 16:45:11 +00002640
Balazs Keric8272192019-05-27 09:36:00 +00002641 if (!hasSameVisibilityContext(FoundRecord, D))
2642 continue;
2643
Gabor Marton7df342a2018-12-17 12:42:12 +00002644 if (IsStructuralMatch(D, FoundRecord)) {
2645 RecordDecl *FoundDef = FoundRecord->getDefinition();
2646 if (D->isThisDeclarationADefinition() && FoundDef) {
Balazs Keri1d20cc22018-07-16 12:16:39 +00002647 // FIXME: Structural equivalence check should check for same
2648 // user-defined methods.
2649 Importer.MapImported(D, FoundDef);
2650 if (const auto *DCXX = dyn_cast<CXXRecordDecl>(D)) {
2651 auto *FoundCXX = dyn_cast<CXXRecordDecl>(FoundDef);
2652 assert(FoundCXX && "Record type mismatch");
2653
Gabor Marton7df342a2018-12-17 12:42:12 +00002654 if (!Importer.isMinimalImport())
Balazs Keri1d20cc22018-07-16 12:16:39 +00002655 // FoundDef may not have every implicit method that D has
2656 // because implicit methods are created only if they are used.
Balazs Keri3b30d652018-10-19 13:32:20 +00002657 if (Error Err = ImportImplicitMethods(DCXX, FoundCXX))
2658 return std::move(Err);
Balazs Keri1d20cc22018-07-16 12:16:39 +00002659 }
Douglas Gregor25791052010-02-12 00:09:27 +00002660 }
Gabor Marton7df342a2018-12-17 12:42:12 +00002661 PrevDecl = FoundRecord->getMostRecentDecl();
2662 break;
Douglas Gregordd6006f2012-07-17 21:16:27 +00002663 }
Gabor Martonf035b752019-08-27 11:36:10 +00002664 ConflictingDecls.push_back(FoundDecl);
2665 } // kind is RecordDecl
Gabor Marton7df342a2018-12-17 12:42:12 +00002666 } // for
Fangrui Song6907ce22018-07-30 19:24:48 +00002667
Douglas Gregordd6006f2012-07-17 21:16:27 +00002668 if (!ConflictingDecls.empty() && SearchName) {
Gabor Martonf035b752019-08-27 11:36:10 +00002669 ExpectedName NameOrErr = Importer.HandleNameConflict(
2670 SearchName, DC, IDNS, ConflictingDecls.data(),
2671 ConflictingDecls.size());
2672 if (NameOrErr)
2673 Name = NameOrErr.get();
2674 else
2675 return NameOrErr.takeError();
Douglas Gregor5c73e912010-02-11 00:48:18 +00002676 }
2677 }
Fangrui Song6907ce22018-07-30 19:24:48 +00002678
Balazs Keri3b30d652018-10-19 13:32:20 +00002679 ExpectedSLoc BeginLocOrErr = import(D->getBeginLoc());
2680 if (!BeginLocOrErr)
2681 return BeginLocOrErr.takeError();
2682
Douglas Gregor5c73e912010-02-11 00:48:18 +00002683 // Create the record declaration.
Gabor Marton7df342a2018-12-17 12:42:12 +00002684 RecordDecl *D2 = nullptr;
2685 CXXRecordDecl *D2CXX = nullptr;
2686 if (auto *DCXX = dyn_cast<CXXRecordDecl>(D)) {
2687 if (DCXX->isLambda()) {
2688 auto TInfoOrErr = import(DCXX->getLambdaTypeInfo());
2689 if (!TInfoOrErr)
2690 return TInfoOrErr.takeError();
2691 if (GetImportedOrCreateSpecialDecl(
2692 D2CXX, CXXRecordDecl::CreateLambda, D, Importer.getToContext(),
2693 DC, *TInfoOrErr, Loc, DCXX->isDependentLambda(),
2694 DCXX->isGenericLambda(), DCXX->getLambdaCaptureDefault()))
2695 return D2CXX;
2696 ExpectedDecl CDeclOrErr = import(DCXX->getLambdaContextDecl());
2697 if (!CDeclOrErr)
2698 return CDeclOrErr.takeError();
Michael Liao243ebfb2019-10-19 00:15:19 +00002699 D2CXX->setLambdaMangling(DCXX->getLambdaManglingNumber(), *CDeclOrErr,
2700 DCXX->hasKnownLambdaInternalLinkage());
Gabor Marton7df342a2018-12-17 12:42:12 +00002701 } else if (DCXX->isInjectedClassName()) {
2702 // We have to be careful to do a similar dance to the one in
2703 // Sema::ActOnStartCXXMemberDeclarations
2704 const bool DelayTypeCreation = true;
2705 if (GetImportedOrCreateDecl(
2706 D2CXX, D, Importer.getToContext(), D->getTagKind(), DC,
2707 *BeginLocOrErr, Loc, Name.getAsIdentifierInfo(),
2708 cast_or_null<CXXRecordDecl>(PrevDecl), DelayTypeCreation))
2709 return D2CXX;
2710 Importer.getToContext().getTypeDeclType(
2711 D2CXX, dyn_cast<CXXRecordDecl>(DC));
2712 } else {
2713 if (GetImportedOrCreateDecl(D2CXX, D, Importer.getToContext(),
2714 D->getTagKind(), DC, *BeginLocOrErr, Loc,
2715 Name.getAsIdentifierInfo(),
2716 cast_or_null<CXXRecordDecl>(PrevDecl)))
2717 return D2CXX;
2718 }
Gabor Marton26f72a92018-07-12 09:42:05 +00002719
Gabor Marton7df342a2018-12-17 12:42:12 +00002720 D2 = D2CXX;
2721 D2->setAccess(D->getAccess());
2722 D2->setLexicalDeclContext(LexicalDC);
2723 if (!DCXX->getDescribedClassTemplate() || DCXX->isImplicit())
2724 LexicalDC->addDeclInternal(D2);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00002725
Gabor Marton7df342a2018-12-17 12:42:12 +00002726 if (LexicalDC != DC && D->isInIdentifierNamespace(Decl::IDNS_TagFriend))
2727 DC->makeDeclVisibleInContext(D2);
2728
2729 if (ClassTemplateDecl *FromDescribed =
2730 DCXX->getDescribedClassTemplate()) {
2731 ClassTemplateDecl *ToDescribed;
2732 if (Error Err = importInto(ToDescribed, FromDescribed))
2733 return std::move(Err);
2734 D2CXX->setDescribedClassTemplate(ToDescribed);
2735 if (!DCXX->isInjectedClassName() && !IsFriendTemplate) {
2736 // In a record describing a template the type should be an
2737 // InjectedClassNameType (see Sema::CheckClassTemplate). Update the
2738 // previously set type to the correct value here (ToDescribed is not
2739 // available at record create).
2740 // FIXME: The previous type is cleared but not removed from
2741 // ASTContext's internal storage.
2742 CXXRecordDecl *Injected = nullptr;
2743 for (NamedDecl *Found : D2CXX->noload_lookup(Name)) {
2744 auto *Record = dyn_cast<CXXRecordDecl>(Found);
2745 if (Record && Record->isInjectedClassName()) {
2746 Injected = Record;
2747 break;
Gabor Marton5915777e2018-06-26 13:44:24 +00002748 }
2749 }
Gabor Marton7df342a2018-12-17 12:42:12 +00002750 // Create an injected type for the whole redecl chain.
2751 SmallVector<Decl *, 2> Redecls =
2752 getCanonicalForwardRedeclChain(D2CXX);
2753 for (auto *R : Redecls) {
2754 auto *RI = cast<CXXRecordDecl>(R);
2755 RI->setTypeForDecl(nullptr);
2756 // Below we create a new injected type and assign that to the
2757 // canonical decl, subsequent declarations in the chain will reuse
2758 // that type.
2759 Importer.getToContext().getInjectedClassNameType(
2760 RI, ToDescribed->getInjectedClassNameSpecialization());
2761 }
2762 // Set the new type for the previous injected decl too.
2763 if (Injected) {
2764 Injected->setTypeForDecl(nullptr);
2765 Importer.getToContext().getTypeDeclType(Injected, D2CXX);
2766 }
2767 }
2768 } else if (MemberSpecializationInfo *MemberInfo =
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00002769 DCXX->getMemberSpecializationInfo()) {
2770 TemplateSpecializationKind SK =
2771 MemberInfo->getTemplateSpecializationKind();
2772 CXXRecordDecl *FromInst = DCXX->getInstantiatedFromMemberClass();
Balazs Keri3b30d652018-10-19 13:32:20 +00002773
2774 if (Expected<CXXRecordDecl *> ToInstOrErr = import(FromInst))
2775 D2CXX->setInstantiationOfMemberClass(*ToInstOrErr, SK);
2776 else
2777 return ToInstOrErr.takeError();
2778
2779 if (ExpectedSLoc POIOrErr =
2780 import(MemberInfo->getPointOfInstantiation()))
2781 D2CXX->getMemberSpecializationInfo()->setPointOfInstantiation(
2782 *POIOrErr);
2783 else
2784 return POIOrErr.takeError();
Douglas Gregor5c73e912010-02-11 00:48:18 +00002785 }
Gabor Marton26f72a92018-07-12 09:42:05 +00002786
Gabor Marton7df342a2018-12-17 12:42:12 +00002787 } else {
2788 if (GetImportedOrCreateDecl(D2, D, Importer.getToContext(),
2789 D->getTagKind(), DC, *BeginLocOrErr, Loc,
2790 Name.getAsIdentifierInfo(), PrevDecl))
2791 return D2;
2792 D2->setLexicalDeclContext(LexicalDC);
2793 LexicalDC->addDeclInternal(D2);
Douglas Gregor5c73e912010-02-11 00:48:18 +00002794 }
Gabor Marton26f72a92018-07-12 09:42:05 +00002795
Gabor Marton7df342a2018-12-17 12:42:12 +00002796 if (auto QualifierLocOrErr = import(D->getQualifierLoc()))
2797 D2->setQualifierInfo(*QualifierLocOrErr);
2798 else
2799 return QualifierLocOrErr.takeError();
2800
2801 if (D->isAnonymousStructOrUnion())
2802 D2->setAnonymousStructOrUnion(true);
Douglas Gregor25791052010-02-12 00:09:27 +00002803
Balazs Keri3b30d652018-10-19 13:32:20 +00002804 if (D->isCompleteDefinition())
2805 if (Error Err = ImportDefinition(D, D2, IDK_Default))
2806 return std::move(Err);
Craig Topper36250ad2014-05-12 05:36:57 +00002807
Douglas Gregor3996e242010-02-15 22:01:00 +00002808 return D2;
Douglas Gregor5c73e912010-02-11 00:48:18 +00002809}
2810
Balazs Keri3b30d652018-10-19 13:32:20 +00002811ExpectedDecl ASTNodeImporter::VisitEnumConstantDecl(EnumConstantDecl *D) {
Douglas Gregor98c10182010-02-12 22:17:39 +00002812 // Import the major distinguishing characteristics of this enumerator.
2813 DeclContext *DC, *LexicalDC;
2814 DeclarationName Name;
2815 SourceLocation Loc;
Sean Callanan59721b32015-04-28 18:41:46 +00002816 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00002817 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
2818 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00002819 if (ToD)
2820 return ToD;
Douglas Gregorb4964f72010-02-15 23:54:17 +00002821
Fangrui Song6907ce22018-07-30 19:24:48 +00002822 // Determine whether there are any other declarations with the same name and
Douglas Gregor98c10182010-02-12 22:17:39 +00002823 // in the same context.
2824 if (!LexicalDC->isFunctionOrMethod()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002825 SmallVector<NamedDecl *, 4> ConflictingDecls;
Douglas Gregor98c10182010-02-12 22:17:39 +00002826 unsigned IDNS = Decl::IDNS_Ordinary;
Gabor Marton54058b52018-12-17 13:53:12 +00002827 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002828 for (auto *FoundDecl : FoundDecls) {
2829 if (!FoundDecl->isInIdentifierNamespace(IDNS))
Douglas Gregor98c10182010-02-12 22:17:39 +00002830 continue;
Douglas Gregor91155082012-11-14 22:29:20 +00002831
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002832 if (auto *FoundEnumConstant = dyn_cast<EnumConstantDecl>(FoundDecl)) {
Douglas Gregor91155082012-11-14 22:29:20 +00002833 if (IsStructuralMatch(D, FoundEnumConstant))
Gabor Marton26f72a92018-07-12 09:42:05 +00002834 return Importer.MapImported(D, FoundEnumConstant);
Gabor Martonf035b752019-08-27 11:36:10 +00002835 ConflictingDecls.push_back(FoundDecl);
Douglas Gregor91155082012-11-14 22:29:20 +00002836 }
Douglas Gregor98c10182010-02-12 22:17:39 +00002837 }
Fangrui Song6907ce22018-07-30 19:24:48 +00002838
Douglas Gregor98c10182010-02-12 22:17:39 +00002839 if (!ConflictingDecls.empty()) {
Gabor Martonf035b752019-08-27 11:36:10 +00002840 ExpectedName NameOrErr = Importer.HandleNameConflict(
2841 Name, DC, IDNS, ConflictingDecls.data(), ConflictingDecls.size());
2842 if (NameOrErr)
2843 Name = NameOrErr.get();
2844 else
2845 return NameOrErr.takeError();
Douglas Gregor98c10182010-02-12 22:17:39 +00002846 }
2847 }
Fangrui Song6907ce22018-07-30 19:24:48 +00002848
Balazs Keri3b30d652018-10-19 13:32:20 +00002849 ExpectedType TypeOrErr = import(D->getType());
2850 if (!TypeOrErr)
2851 return TypeOrErr.takeError();
2852
2853 ExpectedExpr InitOrErr = import(D->getInitExpr());
2854 if (!InitOrErr)
2855 return InitOrErr.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00002856
Gabor Marton26f72a92018-07-12 09:42:05 +00002857 EnumConstantDecl *ToEnumerator;
2858 if (GetImportedOrCreateDecl(
2859 ToEnumerator, D, Importer.getToContext(), cast<EnumDecl>(DC), Loc,
Balazs Keri3b30d652018-10-19 13:32:20 +00002860 Name.getAsIdentifierInfo(), *TypeOrErr, *InitOrErr, D->getInitVal()))
Gabor Marton26f72a92018-07-12 09:42:05 +00002861 return ToEnumerator;
2862
Douglas Gregordd483172010-02-22 17:42:47 +00002863 ToEnumerator->setAccess(D->getAccess());
Douglas Gregor98c10182010-02-12 22:17:39 +00002864 ToEnumerator->setLexicalDeclContext(LexicalDC);
Sean Callanan95e74be2011-10-21 02:57:43 +00002865 LexicalDC->addDeclInternal(ToEnumerator);
Douglas Gregor98c10182010-02-12 22:17:39 +00002866 return ToEnumerator;
2867}
Douglas Gregor5c73e912010-02-11 00:48:18 +00002868
Balazs Keri1efc9742019-05-07 10:55:11 +00002869Error ASTNodeImporter::ImportTemplateParameterLists(const DeclaratorDecl *FromD,
2870 DeclaratorDecl *ToD) {
2871 unsigned int Num = FromD->getNumTemplateParameterLists();
2872 if (Num == 0)
2873 return Error::success();
2874 SmallVector<TemplateParameterList *, 2> ToTPLists(Num);
2875 for (unsigned int I = 0; I < Num; ++I)
2876 if (Expected<TemplateParameterList *> ToTPListOrErr =
2877 import(FromD->getTemplateParameterList(I)))
2878 ToTPLists[I] = *ToTPListOrErr;
2879 else
2880 return ToTPListOrErr.takeError();
2881 ToD->setTemplateParameterListsInfo(Importer.ToContext, ToTPLists);
2882 return Error::success();
2883}
2884
Balazs Keri3b30d652018-10-19 13:32:20 +00002885Error ASTNodeImporter::ImportTemplateInformation(
2886 FunctionDecl *FromFD, FunctionDecl *ToFD) {
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00002887 switch (FromFD->getTemplatedKind()) {
2888 case FunctionDecl::TK_NonTemplate:
2889 case FunctionDecl::TK_FunctionTemplate:
Balazs Keri3b30d652018-10-19 13:32:20 +00002890 return Error::success();
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00002891
2892 case FunctionDecl::TK_MemberSpecialization: {
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00002893 TemplateSpecializationKind TSK = FromFD->getTemplateSpecializationKind();
Balazs Keri3b30d652018-10-19 13:32:20 +00002894
2895 if (Expected<FunctionDecl *> InstFDOrErr =
2896 import(FromFD->getInstantiatedFromMemberFunction()))
2897 ToFD->setInstantiationOfMemberFunction(*InstFDOrErr, TSK);
2898 else
2899 return InstFDOrErr.takeError();
2900
2901 if (ExpectedSLoc POIOrErr = import(
2902 FromFD->getMemberSpecializationInfo()->getPointOfInstantiation()))
2903 ToFD->getMemberSpecializationInfo()->setPointOfInstantiation(*POIOrErr);
2904 else
2905 return POIOrErr.takeError();
2906
2907 return Error::success();
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00002908 }
2909
2910 case FunctionDecl::TK_FunctionTemplateSpecialization: {
Balazs Keri3b30d652018-10-19 13:32:20 +00002911 auto FunctionAndArgsOrErr =
Gabor Marton5254e642018-06-27 13:32:50 +00002912 ImportFunctionTemplateWithTemplateArgsFromSpecialization(FromFD);
Balazs Keri3b30d652018-10-19 13:32:20 +00002913 if (!FunctionAndArgsOrErr)
2914 return FunctionAndArgsOrErr.takeError();
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00002915
2916 TemplateArgumentList *ToTAList = TemplateArgumentList::CreateCopy(
Balazs Keri3b30d652018-10-19 13:32:20 +00002917 Importer.getToContext(), std::get<1>(*FunctionAndArgsOrErr));
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00002918
Gabor Marton5254e642018-06-27 13:32:50 +00002919 auto *FTSInfo = FromFD->getTemplateSpecializationInfo();
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00002920 TemplateArgumentListInfo ToTAInfo;
2921 const auto *FromTAArgsAsWritten = FTSInfo->TemplateArgumentsAsWritten;
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00002922 if (FromTAArgsAsWritten)
Balazs Keri3b30d652018-10-19 13:32:20 +00002923 if (Error Err = ImportTemplateArgumentListInfo(
2924 *FromTAArgsAsWritten, ToTAInfo))
2925 return Err;
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00002926
Balazs Keri3b30d652018-10-19 13:32:20 +00002927 ExpectedSLoc POIOrErr = import(FTSInfo->getPointOfInstantiation());
2928 if (!POIOrErr)
2929 return POIOrErr.takeError();
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00002930
Balazs Keri1efc9742019-05-07 10:55:11 +00002931 if (Error Err = ImportTemplateParameterLists(FromFD, ToFD))
2932 return Err;
2933
Gabor Marton5254e642018-06-27 13:32:50 +00002934 TemplateSpecializationKind TSK = FTSInfo->getTemplateSpecializationKind();
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00002935 ToFD->setFunctionTemplateSpecialization(
Balazs Keri3b30d652018-10-19 13:32:20 +00002936 std::get<0>(*FunctionAndArgsOrErr), ToTAList, /* InsertPos= */ nullptr,
2937 TSK, FromTAArgsAsWritten ? &ToTAInfo : nullptr, *POIOrErr);
2938 return Error::success();
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00002939 }
2940
2941 case FunctionDecl::TK_DependentFunctionTemplateSpecialization: {
2942 auto *FromInfo = FromFD->getDependentSpecializationInfo();
2943 UnresolvedSet<8> TemplDecls;
2944 unsigned NumTemplates = FromInfo->getNumTemplates();
2945 for (unsigned I = 0; I < NumTemplates; I++) {
Balazs Keri3b30d652018-10-19 13:32:20 +00002946 if (Expected<FunctionTemplateDecl *> ToFTDOrErr =
2947 import(FromInfo->getTemplate(I)))
2948 TemplDecls.addDecl(*ToFTDOrErr);
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00002949 else
Balazs Keri3b30d652018-10-19 13:32:20 +00002950 return ToFTDOrErr.takeError();
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00002951 }
2952
2953 // Import TemplateArgumentListInfo.
2954 TemplateArgumentListInfo ToTAInfo;
Balazs Keri3b30d652018-10-19 13:32:20 +00002955 if (Error Err = ImportTemplateArgumentListInfo(
2956 FromInfo->getLAngleLoc(), FromInfo->getRAngleLoc(),
2957 llvm::makeArrayRef(
2958 FromInfo->getTemplateArgs(), FromInfo->getNumTemplateArgs()),
2959 ToTAInfo))
2960 return Err;
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00002961
2962 ToFD->setDependentTemplateSpecialization(Importer.getToContext(),
2963 TemplDecls, ToTAInfo);
Balazs Keri3b30d652018-10-19 13:32:20 +00002964 return Error::success();
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00002965 }
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00002966 }
Sam McCallfdc32072018-01-26 12:06:44 +00002967 llvm_unreachable("All cases should be covered!");
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00002968}
2969
Balazs Keri3b30d652018-10-19 13:32:20 +00002970Expected<FunctionDecl *>
Gabor Marton5254e642018-06-27 13:32:50 +00002971ASTNodeImporter::FindFunctionTemplateSpecialization(FunctionDecl *FromFD) {
Balazs Keri3b30d652018-10-19 13:32:20 +00002972 auto FunctionAndArgsOrErr =
Gabor Marton5254e642018-06-27 13:32:50 +00002973 ImportFunctionTemplateWithTemplateArgsFromSpecialization(FromFD);
Balazs Keri3b30d652018-10-19 13:32:20 +00002974 if (!FunctionAndArgsOrErr)
2975 return FunctionAndArgsOrErr.takeError();
Gabor Marton5254e642018-06-27 13:32:50 +00002976
Balazs Keri3b30d652018-10-19 13:32:20 +00002977 FunctionTemplateDecl *Template;
2978 TemplateArgsTy ToTemplArgs;
2979 std::tie(Template, ToTemplArgs) = *FunctionAndArgsOrErr;
Gabor Marton5254e642018-06-27 13:32:50 +00002980 void *InsertPos = nullptr;
Balazs Keri3b30d652018-10-19 13:32:20 +00002981 auto *FoundSpec = Template->findSpecialization(ToTemplArgs, InsertPos);
Gabor Marton5254e642018-06-27 13:32:50 +00002982 return FoundSpec;
2983}
2984
Shafik Yaghmour96b3d202019-01-28 21:55:33 +00002985Error ASTNodeImporter::ImportFunctionDeclBody(FunctionDecl *FromFD,
2986 FunctionDecl *ToFD) {
2987 if (Stmt *FromBody = FromFD->getBody()) {
2988 if (ExpectedStmt ToBodyOrErr = import(FromBody))
2989 ToFD->setBody(*ToBodyOrErr);
2990 else
2991 return ToBodyOrErr.takeError();
2992 }
2993 return Error::success();
2994}
2995
Balazs Keri3b30d652018-10-19 13:32:20 +00002996ExpectedDecl ASTNodeImporter::VisitFunctionDecl(FunctionDecl *D) {
Gabor Marton5254e642018-06-27 13:32:50 +00002997
Balazs Keri3b30d652018-10-19 13:32:20 +00002998 SmallVector<Decl *, 2> Redecls = getCanonicalForwardRedeclChain(D);
Gabor Marton5254e642018-06-27 13:32:50 +00002999 auto RedeclIt = Redecls.begin();
3000 // Import the first part of the decl chain. I.e. import all previous
3001 // declarations starting from the canonical decl.
Balazs Keri3b30d652018-10-19 13:32:20 +00003002 for (; RedeclIt != Redecls.end() && *RedeclIt != D; ++RedeclIt) {
3003 ExpectedDecl ToRedeclOrErr = import(*RedeclIt);
3004 if (!ToRedeclOrErr)
3005 return ToRedeclOrErr.takeError();
3006 }
Gabor Marton5254e642018-06-27 13:32:50 +00003007 assert(*RedeclIt == D);
3008
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003009 // Import the major distinguishing characteristics of this function.
3010 DeclContext *DC, *LexicalDC;
3011 DeclarationName Name;
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003012 SourceLocation Loc;
Sean Callanan59721b32015-04-28 18:41:46 +00003013 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00003014 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
3015 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00003016 if (ToD)
3017 return ToD;
Abramo Bagnarad6d2f182010-08-11 22:01:17 +00003018
Shafik Yaghmour96b3d202019-01-28 21:55:33 +00003019 FunctionDecl *FoundByLookup = nullptr;
Balazs Keria35798d2018-07-17 09:52:41 +00003020 FunctionTemplateDecl *FromFT = D->getDescribedFunctionTemplate();
Gabor Horvathe350b0a2017-09-22 11:11:01 +00003021
Gabor Marton5254e642018-06-27 13:32:50 +00003022 // If this is a function template specialization, then try to find the same
Gabor Marton54058b52018-12-17 13:53:12 +00003023 // existing specialization in the "to" context. The lookup below will not
3024 // find any specialization, but would find the primary template; thus, we
3025 // have to skip normal lookup in case of specializations.
Gabor Marton5254e642018-06-27 13:32:50 +00003026 // FIXME handle member function templates (TK_MemberSpecialization) similarly?
3027 if (D->getTemplatedKind() ==
3028 FunctionDecl::TK_FunctionTemplateSpecialization) {
Balazs Keri3b30d652018-10-19 13:32:20 +00003029 auto FoundFunctionOrErr = FindFunctionTemplateSpecialization(D);
3030 if (!FoundFunctionOrErr)
3031 return FoundFunctionOrErr.takeError();
3032 if (FunctionDecl *FoundFunction = *FoundFunctionOrErr) {
Gabor Martondd59d272019-03-19 14:04:50 +00003033 if (Decl *Def = FindAndMapDefinition(D, FoundFunction))
3034 return Def;
Gabor Marton5254e642018-06-27 13:32:50 +00003035 FoundByLookup = FoundFunction;
3036 }
3037 }
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003038 // Try to find a function in our own ("to") context with the same name, same
3039 // type, and in the same context as the function we're importing.
Gabor Marton5254e642018-06-27 13:32:50 +00003040 else if (!LexicalDC->isFunctionOrMethod()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003041 SmallVector<NamedDecl *, 4> ConflictingDecls;
Gabor Marton5254e642018-06-27 13:32:50 +00003042 unsigned IDNS = Decl::IDNS_Ordinary | Decl::IDNS_OrdinaryFriend;
Gabor Marton54058b52018-12-17 13:53:12 +00003043 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00003044 for (auto *FoundDecl : FoundDecls) {
3045 if (!FoundDecl->isInIdentifierNamespace(IDNS))
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003046 continue;
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00003047
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00003048 if (auto *FoundFunction = dyn_cast<FunctionDecl>(FoundDecl)) {
Gabor Marton458d1452019-02-14 13:07:03 +00003049 if (!hasSameVisibilityContext(FoundFunction, D))
3050 continue;
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00003051
Gabor Marton458d1452019-02-14 13:07:03 +00003052 if (IsStructuralMatch(D, FoundFunction)) {
Gabor Martondd59d272019-03-19 14:04:50 +00003053 if (Decl *Def = FindAndMapDefinition(D, FoundFunction))
3054 return Def;
Gabor Marton458d1452019-02-14 13:07:03 +00003055 FoundByLookup = FoundFunction;
3056 break;
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003057 }
Gabor Marton458d1452019-02-14 13:07:03 +00003058 // FIXME: Check for overloading more carefully, e.g., by boosting
3059 // Sema::IsOverload out to the AST library.
3060
3061 // Function overloading is okay in C++.
3062 if (Importer.getToContext().getLangOpts().CPlusPlus)
3063 continue;
3064
3065 // Complain about inconsistent function types.
Gabor Marton410f32c2019-04-01 15:29:55 +00003066 Importer.ToDiag(Loc, diag::warn_odr_function_type_inconsistent)
Gabor Marton458d1452019-02-14 13:07:03 +00003067 << Name << D->getType() << FoundFunction->getType();
3068 Importer.ToDiag(FoundFunction->getLocation(), diag::note_odr_value_here)
3069 << FoundFunction->getType();
Gabor Martonf035b752019-08-27 11:36:10 +00003070 ConflictingDecls.push_back(FoundDecl);
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003071 }
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003072 }
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00003073
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003074 if (!ConflictingDecls.empty()) {
Gabor Martonf035b752019-08-27 11:36:10 +00003075 ExpectedName NameOrErr = Importer.HandleNameConflict(
3076 Name, DC, IDNS, ConflictingDecls.data(), ConflictingDecls.size());
3077 if (NameOrErr)
3078 Name = NameOrErr.get();
3079 else
3080 return NameOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00003081 }
Douglas Gregor62d311f2010-02-09 19:21:46 +00003082 }
Douglas Gregorb4964f72010-02-15 23:54:17 +00003083
Shafik Yaghmour96b3d202019-01-28 21:55:33 +00003084 // We do not allow more than one in-class declaration of a function. This is
3085 // because AST clients like VTableBuilder asserts on this. VTableBuilder
3086 // assumes there is only one in-class declaration. Building a redecl
3087 // chain would result in more than one in-class declaration for
3088 // overrides (even if they are part of the same redecl chain inside the
3089 // derived class.)
3090 if (FoundByLookup) {
Mikael Holmenc1c97aa2019-01-29 06:53:31 +00003091 if (isa<CXXMethodDecl>(FoundByLookup)) {
Shafik Yaghmour96b3d202019-01-28 21:55:33 +00003092 if (D->getLexicalDeclContext() == D->getDeclContext()) {
Balazs Kerie9719f92019-08-07 12:40:17 +00003093 if (!D->doesThisDeclarationHaveABody()) {
3094 if (FunctionTemplateDecl *DescribedD =
3095 D->getDescribedFunctionTemplate()) {
3096 // Handle a "templated" function together with its described
3097 // template. This avoids need for a similar check at import of the
3098 // described template.
3099 assert(FoundByLookup->getDescribedFunctionTemplate() &&
3100 "Templated function mapped to non-templated?");
3101 Importer.MapImported(DescribedD,
3102 FoundByLookup->getDescribedFunctionTemplate());
3103 }
Shafik Yaghmour96b3d202019-01-28 21:55:33 +00003104 return Importer.MapImported(D, FoundByLookup);
Balazs Kerie9719f92019-08-07 12:40:17 +00003105 } else {
Shafik Yaghmour96b3d202019-01-28 21:55:33 +00003106 // Let's continue and build up the redecl chain in this case.
3107 // FIXME Merge the functions into one decl.
3108 }
3109 }
3110 }
3111 }
3112
Abramo Bagnarad6d2f182010-08-11 22:01:17 +00003113 DeclarationNameInfo NameInfo(Name, Loc);
3114 // Import additional name location/type info.
Balazs Keri3b30d652018-10-19 13:32:20 +00003115 if (Error Err = ImportDeclarationNameLoc(D->getNameInfo(), NameInfo))
3116 return std::move(Err);
Abramo Bagnarad6d2f182010-08-11 22:01:17 +00003117
Argyrios Kyrtzidis2f458532012-09-25 19:26:39 +00003118 QualType FromTy = D->getType();
3119 bool usedDifferentExceptionSpec = false;
3120
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00003121 if (const auto *FromFPT = D->getType()->getAs<FunctionProtoType>()) {
Argyrios Kyrtzidis2f458532012-09-25 19:26:39 +00003122 FunctionProtoType::ExtProtoInfo FromEPI = FromFPT->getExtProtoInfo();
3123 // FunctionProtoType::ExtProtoInfo's ExceptionSpecDecl can point to the
3124 // FunctionDecl that we are importing the FunctionProtoType for.
3125 // To avoid an infinite recursion when importing, create the FunctionDecl
3126 // with a simplified function type and update it afterwards.
Richard Smith8acb4282014-07-31 21:57:55 +00003127 if (FromEPI.ExceptionSpec.SourceDecl ||
3128 FromEPI.ExceptionSpec.SourceTemplate ||
3129 FromEPI.ExceptionSpec.NoexceptExpr) {
Argyrios Kyrtzidis2f458532012-09-25 19:26:39 +00003130 FunctionProtoType::ExtProtoInfo DefaultEPI;
3131 FromTy = Importer.getFromContext().getFunctionType(
Alp Toker314cc812014-01-25 16:55:45 +00003132 FromFPT->getReturnType(), FromFPT->getParamTypes(), DefaultEPI);
Argyrios Kyrtzidis2f458532012-09-25 19:26:39 +00003133 usedDifferentExceptionSpec = true;
3134 }
3135 }
3136
Balazs Keri3b30d652018-10-19 13:32:20 +00003137 QualType T;
3138 TypeSourceInfo *TInfo;
3139 SourceLocation ToInnerLocStart, ToEndLoc;
3140 NestedNameSpecifierLoc ToQualifierLoc;
3141 if (auto Imp = importSeq(
3142 FromTy, D->getTypeSourceInfo(), D->getInnerLocStart(),
3143 D->getQualifierLoc(), D->getEndLoc()))
3144 std::tie(T, TInfo, ToInnerLocStart, ToQualifierLoc, ToEndLoc) = *Imp;
3145 else
3146 return Imp.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00003147
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003148 // Import the function parameters.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003149 SmallVector<ParmVarDecl *, 8> Parameters;
David Majnemer59f77922016-06-24 04:05:48 +00003150 for (auto P : D->parameters()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00003151 if (Expected<ParmVarDecl *> ToPOrErr = import(P))
3152 Parameters.push_back(*ToPOrErr);
3153 else
3154 return ToPOrErr.takeError();
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003155 }
Fangrui Song6907ce22018-07-30 19:24:48 +00003156
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00003157 // Create the imported function.
Craig Topper36250ad2014-05-12 05:36:57 +00003158 FunctionDecl *ToFunction = nullptr;
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00003159 if (auto *FromConstructor = dyn_cast<CXXConstructorDecl>(D)) {
Richard Smith76b90272019-05-09 03:59:21 +00003160 Expr *ExplicitExpr = nullptr;
3161 if (FromConstructor->getExplicitSpecifier().getExpr()) {
3162 auto Imp = importSeq(FromConstructor->getExplicitSpecifier().getExpr());
3163 if (!Imp)
3164 return Imp.takeError();
3165 std::tie(ExplicitExpr) = *Imp;
3166 }
Gabor Marton26f72a92018-07-12 09:42:05 +00003167 if (GetImportedOrCreateDecl<CXXConstructorDecl>(
Richard Smith76b90272019-05-09 03:59:21 +00003168 ToFunction, D, Importer.getToContext(), cast<CXXRecordDecl>(DC),
3169 ToInnerLocStart, NameInfo, T, TInfo,
3170 ExplicitSpecifier(
3171 ExplicitExpr,
3172 FromConstructor->getExplicitSpecifier().getKind()),
Gauthier Harnisch796ed032019-06-14 08:56:20 +00003173 D->isInlineSpecified(), D->isImplicit(), D->getConstexprKind()))
Gabor Marton26f72a92018-07-12 09:42:05 +00003174 return ToFunction;
Raphael Isemann1c5d23f2019-01-22 17:59:45 +00003175 } else if (CXXDestructorDecl *FromDtor = dyn_cast<CXXDestructorDecl>(D)) {
3176
3177 auto Imp =
3178 importSeq(const_cast<FunctionDecl *>(FromDtor->getOperatorDelete()),
3179 FromDtor->getOperatorDeleteThisArg());
3180
3181 if (!Imp)
3182 return Imp.takeError();
3183
3184 FunctionDecl *ToOperatorDelete;
3185 Expr *ToThisArg;
3186 std::tie(ToOperatorDelete, ToThisArg) = *Imp;
3187
Gabor Marton26f72a92018-07-12 09:42:05 +00003188 if (GetImportedOrCreateDecl<CXXDestructorDecl>(
Balazs Keri3b30d652018-10-19 13:32:20 +00003189 ToFunction, D, Importer.getToContext(), cast<CXXRecordDecl>(DC),
3190 ToInnerLocStart, NameInfo, T, TInfo, D->isInlineSpecified(),
Richard Smith457226e2019-09-23 03:48:44 +00003191 D->isImplicit(), D->getConstexprKind()))
Gabor Marton26f72a92018-07-12 09:42:05 +00003192 return ToFunction;
Raphael Isemann1c5d23f2019-01-22 17:59:45 +00003193
3194 CXXDestructorDecl *ToDtor = cast<CXXDestructorDecl>(ToFunction);
3195
3196 ToDtor->setOperatorDelete(ToOperatorDelete, ToThisArg);
Gabor Marton26f72a92018-07-12 09:42:05 +00003197 } else if (CXXConversionDecl *FromConversion =
3198 dyn_cast<CXXConversionDecl>(D)) {
Richard Smith76b90272019-05-09 03:59:21 +00003199 Expr *ExplicitExpr = nullptr;
3200 if (FromConversion->getExplicitSpecifier().getExpr()) {
3201 auto Imp = importSeq(FromConversion->getExplicitSpecifier().getExpr());
3202 if (!Imp)
3203 return Imp.takeError();
3204 std::tie(ExplicitExpr) = *Imp;
3205 }
Gabor Marton26f72a92018-07-12 09:42:05 +00003206 if (GetImportedOrCreateDecl<CXXConversionDecl>(
3207 ToFunction, D, Importer.getToContext(), cast<CXXRecordDecl>(DC),
Balazs Keri3b30d652018-10-19 13:32:20 +00003208 ToInnerLocStart, NameInfo, T, TInfo, D->isInlineSpecified(),
Richard Smith76b90272019-05-09 03:59:21 +00003209 ExplicitSpecifier(ExplicitExpr,
3210 FromConversion->getExplicitSpecifier().getKind()),
Gauthier Harnisch796ed032019-06-14 08:56:20 +00003211 D->getConstexprKind(), SourceLocation()))
Gabor Marton26f72a92018-07-12 09:42:05 +00003212 return ToFunction;
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00003213 } else if (auto *Method = dyn_cast<CXXMethodDecl>(D)) {
Gabor Marton26f72a92018-07-12 09:42:05 +00003214 if (GetImportedOrCreateDecl<CXXMethodDecl>(
3215 ToFunction, D, Importer.getToContext(), cast<CXXRecordDecl>(DC),
Balazs Keri3b30d652018-10-19 13:32:20 +00003216 ToInnerLocStart, NameInfo, T, TInfo, Method->getStorageClass(),
Gauthier Harnisch796ed032019-06-14 08:56:20 +00003217 Method->isInlineSpecified(), D->getConstexprKind(),
3218 SourceLocation()))
Gabor Marton26f72a92018-07-12 09:42:05 +00003219 return ToFunction;
Douglas Gregor00eace12010-02-21 18:29:16 +00003220 } else {
Gauthier Harnisch796ed032019-06-14 08:56:20 +00003221 if (GetImportedOrCreateDecl(
3222 ToFunction, D, Importer.getToContext(), DC, ToInnerLocStart,
3223 NameInfo, T, TInfo, D->getStorageClass(), D->isInlineSpecified(),
3224 D->hasWrittenPrototype(), D->getConstexprKind()))
Gabor Marton26f72a92018-07-12 09:42:05 +00003225 return ToFunction;
Douglas Gregor00eace12010-02-21 18:29:16 +00003226 }
John McCall3e11ebe2010-03-15 10:12:16 +00003227
Gabor Martonf5e4f0a2018-11-20 14:19:39 +00003228 // Connect the redecl chain.
3229 if (FoundByLookup) {
3230 auto *Recent = const_cast<FunctionDecl *>(
3231 FoundByLookup->getMostRecentDecl());
3232 ToFunction->setPreviousDecl(Recent);
Gabor Martonce6b7812019-05-08 15:23:48 +00003233 // FIXME Probably we should merge exception specifications. E.g. In the
3234 // "To" context the existing function may have exception specification with
3235 // noexcept-unevaluated, while the newly imported function may have an
3236 // evaluated noexcept. A call to adjustExceptionSpec() on the imported
3237 // decl and its redeclarations may be required.
Gabor Martonf5e4f0a2018-11-20 14:19:39 +00003238 }
3239
Balazs Keri3b30d652018-10-19 13:32:20 +00003240 ToFunction->setQualifierInfo(ToQualifierLoc);
Douglas Gregordd483172010-02-22 17:42:47 +00003241 ToFunction->setAccess(D->getAccess());
Douglas Gregor43f54792010-02-17 02:12:47 +00003242 ToFunction->setLexicalDeclContext(LexicalDC);
John McCall08432c82011-01-27 02:37:01 +00003243 ToFunction->setVirtualAsWritten(D->isVirtualAsWritten());
3244 ToFunction->setTrivial(D->isTrivial());
3245 ToFunction->setPure(D->isPure());
Balazs Kerib427c062019-08-13 08:04:06 +00003246 ToFunction->setDefaulted(D->isDefaulted());
3247 ToFunction->setExplicitlyDefaulted(D->isExplicitlyDefaulted());
3248 ToFunction->setDeletedAsWritten(D->isDeletedAsWritten());
Balazs Keri3b30d652018-10-19 13:32:20 +00003249 ToFunction->setRangeEnd(ToEndLoc);
Douglas Gregor62d311f2010-02-09 19:21:46 +00003250
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003251 // Set the parameters.
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00003252 for (auto *Param : Parameters) {
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00003253 Param->setOwningFunction(ToFunction);
3254 ToFunction->addDeclInternal(Param);
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003255 }
David Blaikie9c70e042011-09-21 18:16:56 +00003256 ToFunction->setParams(Parameters);
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003257
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00003258 // We need to complete creation of FunctionProtoTypeLoc manually with setting
3259 // params it refers to.
3260 if (TInfo) {
3261 if (auto ProtoLoc =
3262 TInfo->getTypeLoc().IgnoreParens().getAs<FunctionProtoTypeLoc>()) {
3263 for (unsigned I = 0, N = Parameters.size(); I != N; ++I)
3264 ProtoLoc.setParam(I, Parameters[I]);
3265 }
3266 }
3267
Argyrios Kyrtzidis2f458532012-09-25 19:26:39 +00003268 if (usedDifferentExceptionSpec) {
3269 // Update FunctionProtoType::ExtProtoInfo.
Balazs Keri3b30d652018-10-19 13:32:20 +00003270 if (ExpectedType TyOrErr = import(D->getType()))
3271 ToFunction->setType(*TyOrErr);
3272 else
3273 return TyOrErr.takeError();
Argyrios Kyrtzidisb41791d2012-09-22 01:58:06 +00003274 }
3275
Balazs Keria35798d2018-07-17 09:52:41 +00003276 // Import the describing template function, if any.
Balazs Keri3b30d652018-10-19 13:32:20 +00003277 if (FromFT) {
3278 auto ToFTOrErr = import(FromFT);
3279 if (!ToFTOrErr)
3280 return ToFTOrErr.takeError();
3281 }
Balazs Keria35798d2018-07-17 09:52:41 +00003282
Balazs Kerie13e8362019-08-16 12:10:03 +00003283 // Import Ctor initializers.
3284 if (auto *FromConstructor = dyn_cast<CXXConstructorDecl>(D)) {
3285 if (unsigned NumInitializers = FromConstructor->getNumCtorInitializers()) {
3286 SmallVector<CXXCtorInitializer *, 4> CtorInitializers(NumInitializers);
3287 // Import first, then allocate memory and copy if there was no error.
3288 if (Error Err = ImportContainerChecked(
3289 FromConstructor->inits(), CtorInitializers))
3290 return std::move(Err);
3291 auto **Memory =
3292 new (Importer.getToContext()) CXXCtorInitializer *[NumInitializers];
3293 std::copy(CtorInitializers.begin(), CtorInitializers.end(), Memory);
3294 auto *ToCtor = cast<CXXConstructorDecl>(ToFunction);
3295 ToCtor->setCtorInitializers(Memory);
3296 ToCtor->setNumCtorInitializers(NumInitializers);
3297 }
3298 }
3299
Gabor Marton5254e642018-06-27 13:32:50 +00003300 if (D->doesThisDeclarationHaveABody()) {
Shafik Yaghmour96b3d202019-01-28 21:55:33 +00003301 Error Err = ImportFunctionDeclBody(D, ToFunction);
3302
3303 if (Err)
3304 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00003305 }
3306
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003307 // FIXME: Other bits to merge?
Douglas Gregor0eaa2bf2010-10-01 23:55:07 +00003308
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00003309 // If it is a template, import all related things.
Balazs Keri3b30d652018-10-19 13:32:20 +00003310 if (Error Err = ImportTemplateInformation(D, ToFunction))
3311 return std::move(Err);
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00003312
Gabor Marton5254e642018-06-27 13:32:50 +00003313 bool IsFriend = D->isInIdentifierNamespace(Decl::IDNS_OrdinaryFriend);
3314
3315 // TODO Can we generalize this approach to other AST nodes as well?
3316 if (D->getDeclContext()->containsDeclAndLoad(D))
3317 DC->addDeclInternal(ToFunction);
3318 if (DC != LexicalDC && D->getLexicalDeclContext()->containsDeclAndLoad(D))
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00003319 LexicalDC->addDeclInternal(ToFunction);
Douglas Gregor0eaa2bf2010-10-01 23:55:07 +00003320
Gabor Marton5254e642018-06-27 13:32:50 +00003321 // Friend declaration's lexical context is the befriending class, but the
3322 // semantic context is the enclosing scope of the befriending class.
3323 // We want the friend functions to be found in the semantic context by lookup.
3324 // FIXME should we handle this generically in VisitFriendDecl?
3325 // In Other cases when LexicalDC != DC we don't want it to be added,
3326 // e.g out-of-class definitions like void B::f() {} .
3327 if (LexicalDC != DC && IsFriend) {
3328 DC->makeDeclVisibleInContext(ToFunction);
3329 }
3330
Gabor Marton7a0841e2018-10-29 10:18:28 +00003331 if (auto *FromCXXMethod = dyn_cast<CXXMethodDecl>(D))
Balazs Kerib4fd7d42019-08-30 10:12:14 +00003332 if (Error Err = ImportOverriddenMethods(cast<CXXMethodDecl>(ToFunction),
3333 FromCXXMethod))
3334 return std::move(Err);
Gabor Marton7a0841e2018-10-29 10:18:28 +00003335
Gabor Marton5254e642018-06-27 13:32:50 +00003336 // Import the rest of the chain. I.e. import all subsequent declarations.
Balazs Keri3b30d652018-10-19 13:32:20 +00003337 for (++RedeclIt; RedeclIt != Redecls.end(); ++RedeclIt) {
3338 ExpectedDecl ToRedeclOrErr = import(*RedeclIt);
3339 if (!ToRedeclOrErr)
3340 return ToRedeclOrErr.takeError();
3341 }
Gabor Marton5254e642018-06-27 13:32:50 +00003342
Douglas Gregor43f54792010-02-17 02:12:47 +00003343 return ToFunction;
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003344}
3345
Balazs Keri3b30d652018-10-19 13:32:20 +00003346ExpectedDecl ASTNodeImporter::VisitCXXMethodDecl(CXXMethodDecl *D) {
Douglas Gregor00eace12010-02-21 18:29:16 +00003347 return VisitFunctionDecl(D);
3348}
3349
Balazs Keri3b30d652018-10-19 13:32:20 +00003350ExpectedDecl ASTNodeImporter::VisitCXXConstructorDecl(CXXConstructorDecl *D) {
Douglas Gregor00eace12010-02-21 18:29:16 +00003351 return VisitCXXMethodDecl(D);
3352}
3353
Balazs Keri3b30d652018-10-19 13:32:20 +00003354ExpectedDecl ASTNodeImporter::VisitCXXDestructorDecl(CXXDestructorDecl *D) {
Douglas Gregor00eace12010-02-21 18:29:16 +00003355 return VisitCXXMethodDecl(D);
3356}
3357
Balazs Keri3b30d652018-10-19 13:32:20 +00003358ExpectedDecl ASTNodeImporter::VisitCXXConversionDecl(CXXConversionDecl *D) {
Douglas Gregor00eace12010-02-21 18:29:16 +00003359 return VisitCXXMethodDecl(D);
3360}
3361
Balazs Keri3b30d652018-10-19 13:32:20 +00003362ExpectedDecl ASTNodeImporter::VisitFieldDecl(FieldDecl *D) {
Douglas Gregor5c73e912010-02-11 00:48:18 +00003363 // Import the major distinguishing characteristics of a variable.
3364 DeclContext *DC, *LexicalDC;
3365 DeclarationName Name;
Douglas Gregor5c73e912010-02-11 00:48:18 +00003366 SourceLocation Loc;
Sean Callanan59721b32015-04-28 18:41:46 +00003367 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00003368 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
3369 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00003370 if (ToD)
3371 return ToD;
Craig Topper36250ad2014-05-12 05:36:57 +00003372
Fangrui Song6907ce22018-07-30 19:24:48 +00003373 // Determine whether we've already imported this field.
Gabor Marton54058b52018-12-17 13:53:12 +00003374 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00003375 for (auto *FoundDecl : FoundDecls) {
Balazs Keri3b30d652018-10-19 13:32:20 +00003376 if (FieldDecl *FoundField = dyn_cast<FieldDecl>(FoundDecl)) {
Douglas Gregorceb32bf2012-10-26 16:45:11 +00003377 // For anonymous fields, match up by index.
Balazs Keri2544b4b2018-08-08 09:40:57 +00003378 if (!Name &&
3379 ASTImporter::getFieldIndex(D) !=
3380 ASTImporter::getFieldIndex(FoundField))
Douglas Gregorceb32bf2012-10-26 16:45:11 +00003381 continue;
3382
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00003383 if (Importer.IsStructurallyEquivalent(D->getType(),
Douglas Gregor03d1ed32011-10-14 21:54:42 +00003384 FoundField->getType())) {
Gabor Marton26f72a92018-07-12 09:42:05 +00003385 Importer.MapImported(D, FoundField);
Gabor Marton42e15de2018-08-22 11:52:14 +00003386 // In case of a FieldDecl of a ClassTemplateSpecializationDecl, the
3387 // initializer of a FieldDecl might not had been instantiated in the
3388 // "To" context. However, the "From" context might instantiated that,
3389 // thus we have to merge that.
3390 if (Expr *FromInitializer = D->getInClassInitializer()) {
3391 // We don't have yet the initializer set.
3392 if (FoundField->hasInClassInitializer() &&
3393 !FoundField->getInClassInitializer()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00003394 if (ExpectedExpr ToInitializerOrErr = import(FromInitializer))
3395 FoundField->setInClassInitializer(*ToInitializerOrErr);
3396 else {
3397 // We can't return error here,
Gabor Marton42e15de2018-08-22 11:52:14 +00003398 // since we already mapped D as imported.
Balazs Keri3b30d652018-10-19 13:32:20 +00003399 // FIXME: warning message?
3400 consumeError(ToInitializerOrErr.takeError());
Gabor Marton42e15de2018-08-22 11:52:14 +00003401 return FoundField;
Balazs Keri3b30d652018-10-19 13:32:20 +00003402 }
Gabor Marton42e15de2018-08-22 11:52:14 +00003403 }
3404 }
Douglas Gregor03d1ed32011-10-14 21:54:42 +00003405 return FoundField;
3406 }
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00003407
Balazs Keri3b30d652018-10-19 13:32:20 +00003408 // FIXME: Why is this case not handled with calling HandleNameConflict?
Gabor Marton410f32c2019-04-01 15:29:55 +00003409 Importer.ToDiag(Loc, diag::warn_odr_field_type_inconsistent)
Douglas Gregor03d1ed32011-10-14 21:54:42 +00003410 << Name << D->getType() << FoundField->getType();
3411 Importer.ToDiag(FoundField->getLocation(), diag::note_odr_value_here)
3412 << FoundField->getType();
Balazs Keri3b30d652018-10-19 13:32:20 +00003413
3414 return make_error<ImportError>(ImportError::NameConflict);
Douglas Gregor03d1ed32011-10-14 21:54:42 +00003415 }
3416 }
3417
Balazs Keri3b30d652018-10-19 13:32:20 +00003418 QualType ToType;
3419 TypeSourceInfo *ToTInfo;
3420 Expr *ToBitWidth;
3421 SourceLocation ToInnerLocStart;
3422 Expr *ToInitializer;
3423 if (auto Imp = importSeq(
3424 D->getType(), D->getTypeSourceInfo(), D->getBitWidth(),
3425 D->getInnerLocStart(), D->getInClassInitializer()))
3426 std::tie(
3427 ToType, ToTInfo, ToBitWidth, ToInnerLocStart, ToInitializer) = *Imp;
3428 else
3429 return Imp.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00003430
Gabor Marton26f72a92018-07-12 09:42:05 +00003431 FieldDecl *ToField;
3432 if (GetImportedOrCreateDecl(ToField, D, Importer.getToContext(), DC,
Balazs Keri3b30d652018-10-19 13:32:20 +00003433 ToInnerLocStart, Loc, Name.getAsIdentifierInfo(),
3434 ToType, ToTInfo, ToBitWidth, D->isMutable(),
3435 D->getInClassInitStyle()))
Gabor Marton26f72a92018-07-12 09:42:05 +00003436 return ToField;
3437
Douglas Gregordd483172010-02-22 17:42:47 +00003438 ToField->setAccess(D->getAccess());
Douglas Gregor5c73e912010-02-11 00:48:18 +00003439 ToField->setLexicalDeclContext(LexicalDC);
Balazs Keri3b30d652018-10-19 13:32:20 +00003440 if (ToInitializer)
3441 ToField->setInClassInitializer(ToInitializer);
Douglas Gregorceb32bf2012-10-26 16:45:11 +00003442 ToField->setImplicit(D->isImplicit());
Sean Callanan95e74be2011-10-21 02:57:43 +00003443 LexicalDC->addDeclInternal(ToField);
Douglas Gregor5c73e912010-02-11 00:48:18 +00003444 return ToField;
3445}
3446
Balazs Keri3b30d652018-10-19 13:32:20 +00003447ExpectedDecl ASTNodeImporter::VisitIndirectFieldDecl(IndirectFieldDecl *D) {
Francois Pichet783dd6e2010-11-21 06:08:52 +00003448 // Import the major distinguishing characteristics of a variable.
3449 DeclContext *DC, *LexicalDC;
3450 DeclarationName Name;
3451 SourceLocation Loc;
Sean Callanan59721b32015-04-28 18:41:46 +00003452 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00003453 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
3454 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00003455 if (ToD)
3456 return ToD;
Francois Pichet783dd6e2010-11-21 06:08:52 +00003457
Fangrui Song6907ce22018-07-30 19:24:48 +00003458 // Determine whether we've already imported this field.
Gabor Marton54058b52018-12-17 13:53:12 +00003459 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
Douglas Gregor9e0a5b32011-10-15 00:10:27 +00003460 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00003461 if (auto *FoundField = dyn_cast<IndirectFieldDecl>(FoundDecls[I])) {
Douglas Gregorceb32bf2012-10-26 16:45:11 +00003462 // For anonymous indirect fields, match up by index.
Balazs Keri2544b4b2018-08-08 09:40:57 +00003463 if (!Name &&
3464 ASTImporter::getFieldIndex(D) !=
3465 ASTImporter::getFieldIndex(FoundField))
Douglas Gregorceb32bf2012-10-26 16:45:11 +00003466 continue;
3467
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00003468 if (Importer.IsStructurallyEquivalent(D->getType(),
Douglas Gregordd6006f2012-07-17 21:16:27 +00003469 FoundField->getType(),
David Blaikie7d170102013-05-15 07:37:26 +00003470 !Name.isEmpty())) {
Gabor Marton26f72a92018-07-12 09:42:05 +00003471 Importer.MapImported(D, FoundField);
Douglas Gregor03d1ed32011-10-14 21:54:42 +00003472 return FoundField;
3473 }
Douglas Gregordd6006f2012-07-17 21:16:27 +00003474
3475 // If there are more anonymous fields to check, continue.
3476 if (!Name && I < N-1)
3477 continue;
3478
Balazs Keri3b30d652018-10-19 13:32:20 +00003479 // FIXME: Why is this case not handled with calling HandleNameConflict?
Gabor Marton410f32c2019-04-01 15:29:55 +00003480 Importer.ToDiag(Loc, diag::warn_odr_field_type_inconsistent)
Douglas Gregor03d1ed32011-10-14 21:54:42 +00003481 << Name << D->getType() << FoundField->getType();
3482 Importer.ToDiag(FoundField->getLocation(), diag::note_odr_value_here)
3483 << FoundField->getType();
Balazs Keri3b30d652018-10-19 13:32:20 +00003484
3485 return make_error<ImportError>(ImportError::NameConflict);
Douglas Gregor03d1ed32011-10-14 21:54:42 +00003486 }
3487 }
3488
Francois Pichet783dd6e2010-11-21 06:08:52 +00003489 // Import the type.
Balazs Keri3b30d652018-10-19 13:32:20 +00003490 auto TypeOrErr = import(D->getType());
3491 if (!TypeOrErr)
3492 return TypeOrErr.takeError();
Francois Pichet783dd6e2010-11-21 06:08:52 +00003493
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00003494 auto **NamedChain =
3495 new (Importer.getToContext()) NamedDecl*[D->getChainingSize()];
Francois Pichet783dd6e2010-11-21 06:08:52 +00003496
3497 unsigned i = 0;
Balazs Keri3b30d652018-10-19 13:32:20 +00003498 for (auto *PI : D->chain())
3499 if (Expected<NamedDecl *> ToD = import(PI))
3500 NamedChain[i++] = *ToD;
3501 else
3502 return ToD.takeError();
Francois Pichet783dd6e2010-11-21 06:08:52 +00003503
Gabor Marton26f72a92018-07-12 09:42:05 +00003504 llvm::MutableArrayRef<NamedDecl *> CH = {NamedChain, D->getChainingSize()};
3505 IndirectFieldDecl *ToIndirectField;
3506 if (GetImportedOrCreateDecl(ToIndirectField, D, Importer.getToContext(), DC,
Balazs Keri3b30d652018-10-19 13:32:20 +00003507 Loc, Name.getAsIdentifierInfo(), *TypeOrErr, CH))
Gabor Marton26f72a92018-07-12 09:42:05 +00003508 // FIXME here we leak `NamedChain` which is allocated before
3509 return ToIndirectField;
Aaron Ballman260995b2014-10-15 16:58:18 +00003510
Francois Pichet783dd6e2010-11-21 06:08:52 +00003511 ToIndirectField->setAccess(D->getAccess());
3512 ToIndirectField->setLexicalDeclContext(LexicalDC);
Sean Callanan95e74be2011-10-21 02:57:43 +00003513 LexicalDC->addDeclInternal(ToIndirectField);
Francois Pichet783dd6e2010-11-21 06:08:52 +00003514 return ToIndirectField;
3515}
3516
Balazs Keri3b30d652018-10-19 13:32:20 +00003517ExpectedDecl ASTNodeImporter::VisitFriendDecl(FriendDecl *D) {
Aleksei Sidorina693b372016-09-28 10:16:56 +00003518 // Import the major distinguishing characteristics of a declaration.
Balazs Keri3b30d652018-10-19 13:32:20 +00003519 DeclContext *DC, *LexicalDC;
3520 if (Error Err = ImportDeclContext(D, DC, LexicalDC))
3521 return std::move(Err);
Aleksei Sidorina693b372016-09-28 10:16:56 +00003522
3523 // Determine whether we've already imported this decl.
Gabor Marton54058b52018-12-17 13:53:12 +00003524 // FriendDecl is not a NamedDecl so we cannot use lookup.
Aleksei Sidorina693b372016-09-28 10:16:56 +00003525 auto *RD = cast<CXXRecordDecl>(DC);
3526 FriendDecl *ImportedFriend = RD->getFirstFriend();
Aleksei Sidorina693b372016-09-28 10:16:56 +00003527
3528 while (ImportedFriend) {
3529 if (D->getFriendDecl() && ImportedFriend->getFriendDecl()) {
Gabor Marton950fb572018-07-17 12:39:27 +00003530 if (IsStructuralMatch(D->getFriendDecl(), ImportedFriend->getFriendDecl(),
3531 /*Complain=*/false))
Gabor Marton26f72a92018-07-12 09:42:05 +00003532 return Importer.MapImported(D, ImportedFriend);
Aleksei Sidorina693b372016-09-28 10:16:56 +00003533
3534 } else if (D->getFriendType() && ImportedFriend->getFriendType()) {
3535 if (Importer.IsStructurallyEquivalent(
3536 D->getFriendType()->getType(),
3537 ImportedFriend->getFriendType()->getType(), true))
Gabor Marton26f72a92018-07-12 09:42:05 +00003538 return Importer.MapImported(D, ImportedFriend);
Aleksei Sidorina693b372016-09-28 10:16:56 +00003539 }
3540 ImportedFriend = ImportedFriend->getNextFriend();
3541 }
3542
3543 // Not found. Create it.
3544 FriendDecl::FriendUnion ToFU;
Peter Szecsib180eeb2018-04-25 17:28:03 +00003545 if (NamedDecl *FriendD = D->getFriendDecl()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00003546 NamedDecl *ToFriendD;
3547 if (Error Err = importInto(ToFriendD, FriendD))
3548 return std::move(Err);
3549
3550 if (FriendD->getFriendObjectKind() != Decl::FOK_None &&
Peter Szecsib180eeb2018-04-25 17:28:03 +00003551 !(FriendD->isInIdentifierNamespace(Decl::IDNS_NonMemberOperator)))
3552 ToFriendD->setObjectOfFriendDecl(false);
3553
3554 ToFU = ToFriendD;
Balazs Keri3b30d652018-10-19 13:32:20 +00003555 } else { // The friend is a type, not a decl.
3556 if (auto TSIOrErr = import(D->getFriendType()))
3557 ToFU = *TSIOrErr;
3558 else
3559 return TSIOrErr.takeError();
3560 }
Aleksei Sidorina693b372016-09-28 10:16:56 +00003561
3562 SmallVector<TemplateParameterList *, 1> ToTPLists(D->NumTPLists);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00003563 auto **FromTPLists = D->getTrailingObjects<TemplateParameterList *>();
Aleksei Sidorina693b372016-09-28 10:16:56 +00003564 for (unsigned I = 0; I < D->NumTPLists; I++) {
Balazs Keridec09162019-03-20 15:42:42 +00003565 if (auto ListOrErr = import(FromTPLists[I]))
Balazs Keri3b30d652018-10-19 13:32:20 +00003566 ToTPLists[I] = *ListOrErr;
3567 else
3568 return ListOrErr.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00003569 }
3570
Balazs Keri3b30d652018-10-19 13:32:20 +00003571 auto LocationOrErr = import(D->getLocation());
3572 if (!LocationOrErr)
3573 return LocationOrErr.takeError();
3574 auto FriendLocOrErr = import(D->getFriendLoc());
3575 if (!FriendLocOrErr)
3576 return FriendLocOrErr.takeError();
3577
Gabor Marton26f72a92018-07-12 09:42:05 +00003578 FriendDecl *FrD;
3579 if (GetImportedOrCreateDecl(FrD, D, Importer.getToContext(), DC,
Balazs Keri3b30d652018-10-19 13:32:20 +00003580 *LocationOrErr, ToFU,
3581 *FriendLocOrErr, ToTPLists))
Gabor Marton26f72a92018-07-12 09:42:05 +00003582 return FrD;
Aleksei Sidorina693b372016-09-28 10:16:56 +00003583
3584 FrD->setAccess(D->getAccess());
3585 FrD->setLexicalDeclContext(LexicalDC);
3586 LexicalDC->addDeclInternal(FrD);
3587 return FrD;
3588}
3589
Balazs Keri3b30d652018-10-19 13:32:20 +00003590ExpectedDecl ASTNodeImporter::VisitObjCIvarDecl(ObjCIvarDecl *D) {
Douglas Gregor7244b0b2010-02-17 00:34:30 +00003591 // Import the major distinguishing characteristics of an ivar.
3592 DeclContext *DC, *LexicalDC;
3593 DeclarationName Name;
3594 SourceLocation Loc;
Sean Callanan59721b32015-04-28 18:41:46 +00003595 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00003596 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
3597 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00003598 if (ToD)
3599 return ToD;
Craig Topper36250ad2014-05-12 05:36:57 +00003600
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00003601 // Determine whether we've already imported this ivar
Gabor Marton54058b52018-12-17 13:53:12 +00003602 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00003603 for (auto *FoundDecl : FoundDecls) {
Balazs Keri3b30d652018-10-19 13:32:20 +00003604 if (ObjCIvarDecl *FoundIvar = dyn_cast<ObjCIvarDecl>(FoundDecl)) {
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00003605 if (Importer.IsStructurallyEquivalent(D->getType(),
Douglas Gregor7244b0b2010-02-17 00:34:30 +00003606 FoundIvar->getType())) {
Gabor Marton26f72a92018-07-12 09:42:05 +00003607 Importer.MapImported(D, FoundIvar);
Douglas Gregor7244b0b2010-02-17 00:34:30 +00003608 return FoundIvar;
3609 }
3610
Gabor Marton410f32c2019-04-01 15:29:55 +00003611 Importer.ToDiag(Loc, diag::warn_odr_ivar_type_inconsistent)
Douglas Gregor7244b0b2010-02-17 00:34:30 +00003612 << Name << D->getType() << FoundIvar->getType();
3613 Importer.ToDiag(FoundIvar->getLocation(), diag::note_odr_value_here)
3614 << FoundIvar->getType();
Balazs Keri3b30d652018-10-19 13:32:20 +00003615
3616 return make_error<ImportError>(ImportError::NameConflict);
Douglas Gregor7244b0b2010-02-17 00:34:30 +00003617 }
3618 }
3619
Balazs Keri3b30d652018-10-19 13:32:20 +00003620 QualType ToType;
3621 TypeSourceInfo *ToTypeSourceInfo;
3622 Expr *ToBitWidth;
3623 SourceLocation ToInnerLocStart;
3624 if (auto Imp = importSeq(
3625 D->getType(), D->getTypeSourceInfo(), D->getBitWidth(), D->getInnerLocStart()))
3626 std::tie(ToType, ToTypeSourceInfo, ToBitWidth, ToInnerLocStart) = *Imp;
3627 else
3628 return Imp.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00003629
Gabor Marton26f72a92018-07-12 09:42:05 +00003630 ObjCIvarDecl *ToIvar;
3631 if (GetImportedOrCreateDecl(
3632 ToIvar, D, Importer.getToContext(), cast<ObjCContainerDecl>(DC),
Balazs Keri3b30d652018-10-19 13:32:20 +00003633 ToInnerLocStart, Loc, Name.getAsIdentifierInfo(),
3634 ToType, ToTypeSourceInfo,
3635 D->getAccessControl(),ToBitWidth, D->getSynthesize()))
Gabor Marton26f72a92018-07-12 09:42:05 +00003636 return ToIvar;
3637
Douglas Gregor7244b0b2010-02-17 00:34:30 +00003638 ToIvar->setLexicalDeclContext(LexicalDC);
Sean Callanan95e74be2011-10-21 02:57:43 +00003639 LexicalDC->addDeclInternal(ToIvar);
Douglas Gregor7244b0b2010-02-17 00:34:30 +00003640 return ToIvar;
Douglas Gregor7244b0b2010-02-17 00:34:30 +00003641}
3642
Balazs Keri3b30d652018-10-19 13:32:20 +00003643ExpectedDecl ASTNodeImporter::VisitVarDecl(VarDecl *D) {
Gabor Martonac3a5d62018-09-17 12:04:52 +00003644
3645 SmallVector<Decl*, 2> Redecls = getCanonicalForwardRedeclChain(D);
3646 auto RedeclIt = Redecls.begin();
3647 // Import the first part of the decl chain. I.e. import all previous
3648 // declarations starting from the canonical decl.
Balazs Keri3b30d652018-10-19 13:32:20 +00003649 for (; RedeclIt != Redecls.end() && *RedeclIt != D; ++RedeclIt) {
3650 ExpectedDecl RedeclOrErr = import(*RedeclIt);
3651 if (!RedeclOrErr)
3652 return RedeclOrErr.takeError();
3653 }
Gabor Martonac3a5d62018-09-17 12:04:52 +00003654 assert(*RedeclIt == D);
3655
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003656 // Import the major distinguishing characteristics of a variable.
3657 DeclContext *DC, *LexicalDC;
3658 DeclarationName Name;
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003659 SourceLocation Loc;
Sean Callanan59721b32015-04-28 18:41:46 +00003660 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00003661 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
3662 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00003663 if (ToD)
3664 return ToD;
Craig Topper36250ad2014-05-12 05:36:57 +00003665
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00003666 // Try to find a variable in our own ("to") context with the same name and
3667 // in the same context as the variable we're importing.
Gabor Martonac3a5d62018-09-17 12:04:52 +00003668 VarDecl *FoundByLookup = nullptr;
Douglas Gregor62d311f2010-02-09 19:21:46 +00003669 if (D->isFileVarDecl()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003670 SmallVector<NamedDecl *, 4> ConflictingDecls;
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00003671 unsigned IDNS = Decl::IDNS_Ordinary;
Gabor Marton54058b52018-12-17 13:53:12 +00003672 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00003673 for (auto *FoundDecl : FoundDecls) {
3674 if (!FoundDecl->isInIdentifierNamespace(IDNS))
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00003675 continue;
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00003676
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00003677 if (auto *FoundVar = dyn_cast<VarDecl>(FoundDecl)) {
Gabor Marton458d1452019-02-14 13:07:03 +00003678 if (!hasSameVisibilityContext(FoundVar, D))
3679 continue;
3680 if (Importer.IsStructurallyEquivalent(D->getType(),
3681 FoundVar->getType())) {
Gabor Martonac3a5d62018-09-17 12:04:52 +00003682
Gabor Marton458d1452019-02-14 13:07:03 +00003683 // The VarDecl in the "From" context has a definition, but in the
3684 // "To" context we already have a definition.
3685 VarDecl *FoundDef = FoundVar->getDefinition();
3686 if (D->isThisDeclarationADefinition() && FoundDef)
3687 // FIXME Check for ODR error if the two definitions have
3688 // different initializers?
3689 return Importer.MapImported(D, FoundDef);
Gabor Martonac3a5d62018-09-17 12:04:52 +00003690
Gabor Marton458d1452019-02-14 13:07:03 +00003691 // The VarDecl in the "From" context has an initializer, but in the
3692 // "To" context we already have an initializer.
3693 const VarDecl *FoundDInit = nullptr;
3694 if (D->getInit() && FoundVar->getAnyInitializer(FoundDInit))
3695 // FIXME Diagnose ODR error if the two initializers are different?
3696 return Importer.MapImported(D, const_cast<VarDecl*>(FoundDInit));
3697
3698 FoundByLookup = FoundVar;
3699 break;
3700 }
3701
3702 const ArrayType *FoundArray
3703 = Importer.getToContext().getAsArrayType(FoundVar->getType());
3704 const ArrayType *TArray
3705 = Importer.getToContext().getAsArrayType(D->getType());
3706 if (FoundArray && TArray) {
3707 if (isa<IncompleteArrayType>(FoundArray) &&
3708 isa<ConstantArrayType>(TArray)) {
3709 // Import the type.
3710 if (auto TyOrErr = import(D->getType()))
3711 FoundVar->setType(*TyOrErr);
3712 else
3713 return TyOrErr.takeError();
Gabor Martonac3a5d62018-09-17 12:04:52 +00003714
3715 FoundByLookup = FoundVar;
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00003716 break;
Gabor Marton458d1452019-02-14 13:07:03 +00003717 } else if (isa<IncompleteArrayType>(TArray) &&
3718 isa<ConstantArrayType>(FoundArray)) {
3719 FoundByLookup = FoundVar;
3720 break;
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00003721 }
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00003722 }
Gabor Marton458d1452019-02-14 13:07:03 +00003723
Gabor Marton410f32c2019-04-01 15:29:55 +00003724 Importer.ToDiag(Loc, diag::warn_odr_variable_type_inconsistent)
Gabor Marton458d1452019-02-14 13:07:03 +00003725 << Name << D->getType() << FoundVar->getType();
3726 Importer.ToDiag(FoundVar->getLocation(), diag::note_odr_value_here)
3727 << FoundVar->getType();
Gabor Martonf035b752019-08-27 11:36:10 +00003728 ConflictingDecls.push_back(FoundDecl);
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00003729 }
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00003730 }
3731
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00003732 if (!ConflictingDecls.empty()) {
Gabor Martonf035b752019-08-27 11:36:10 +00003733 ExpectedName NameOrErr = Importer.HandleNameConflict(
3734 Name, DC, IDNS, ConflictingDecls.data(), ConflictingDecls.size());
3735 if (NameOrErr)
3736 Name = NameOrErr.get();
3737 else
3738 return NameOrErr.takeError();
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00003739 }
3740 }
Fangrui Song6907ce22018-07-30 19:24:48 +00003741
Balazs Keri3b30d652018-10-19 13:32:20 +00003742 QualType ToType;
3743 TypeSourceInfo *ToTypeSourceInfo;
3744 SourceLocation ToInnerLocStart;
3745 NestedNameSpecifierLoc ToQualifierLoc;
3746 if (auto Imp = importSeq(
3747 D->getType(), D->getTypeSourceInfo(), D->getInnerLocStart(),
3748 D->getQualifierLoc()))
3749 std::tie(ToType, ToTypeSourceInfo, ToInnerLocStart, ToQualifierLoc) = *Imp;
3750 else
3751 return Imp.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00003752
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00003753 // Create the imported variable.
Gabor Marton26f72a92018-07-12 09:42:05 +00003754 VarDecl *ToVar;
3755 if (GetImportedOrCreateDecl(ToVar, D, Importer.getToContext(), DC,
Balazs Keri3b30d652018-10-19 13:32:20 +00003756 ToInnerLocStart, Loc,
3757 Name.getAsIdentifierInfo(),
3758 ToType, ToTypeSourceInfo,
Gabor Marton26f72a92018-07-12 09:42:05 +00003759 D->getStorageClass()))
3760 return ToVar;
3761
Balazs Keri3b30d652018-10-19 13:32:20 +00003762 ToVar->setQualifierInfo(ToQualifierLoc);
Douglas Gregordd483172010-02-22 17:42:47 +00003763 ToVar->setAccess(D->getAccess());
Douglas Gregor62d311f2010-02-09 19:21:46 +00003764 ToVar->setLexicalDeclContext(LexicalDC);
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00003765
Gabor Martonac3a5d62018-09-17 12:04:52 +00003766 if (FoundByLookup) {
3767 auto *Recent = const_cast<VarDecl *>(FoundByLookup->getMostRecentDecl());
3768 ToVar->setPreviousDecl(Recent);
3769 }
Douglas Gregor62d311f2010-02-09 19:21:46 +00003770
Balazs Keri3b30d652018-10-19 13:32:20 +00003771 if (Error Err = ImportInitializer(D, ToVar))
3772 return std::move(Err);
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00003773
Aleksei Sidorin855086d2017-01-23 09:30:36 +00003774 if (D->isConstexpr())
3775 ToVar->setConstexpr(true);
3776
Gabor Martonac3a5d62018-09-17 12:04:52 +00003777 if (D->getDeclContext()->containsDeclAndLoad(D))
3778 DC->addDeclInternal(ToVar);
3779 if (DC != LexicalDC && D->getLexicalDeclContext()->containsDeclAndLoad(D))
3780 LexicalDC->addDeclInternal(ToVar);
3781
3782 // Import the rest of the chain. I.e. import all subsequent declarations.
Balazs Keri3b30d652018-10-19 13:32:20 +00003783 for (++RedeclIt; RedeclIt != Redecls.end(); ++RedeclIt) {
3784 ExpectedDecl RedeclOrErr = import(*RedeclIt);
3785 if (!RedeclOrErr)
3786 return RedeclOrErr.takeError();
3787 }
Gabor Martonac3a5d62018-09-17 12:04:52 +00003788
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00003789 return ToVar;
3790}
3791
Balazs Keri3b30d652018-10-19 13:32:20 +00003792ExpectedDecl ASTNodeImporter::VisitImplicitParamDecl(ImplicitParamDecl *D) {
Douglas Gregor8b228d72010-02-17 21:22:52 +00003793 // Parameters are created in the translation unit's context, then moved
3794 // into the function declaration's context afterward.
3795 DeclContext *DC = Importer.getToContext().getTranslationUnitDecl();
Fangrui Song6907ce22018-07-30 19:24:48 +00003796
Balazs Keri3b30d652018-10-19 13:32:20 +00003797 DeclarationName ToDeclName;
3798 SourceLocation ToLocation;
3799 QualType ToType;
3800 if (auto Imp = importSeq(D->getDeclName(), D->getLocation(), D->getType()))
3801 std::tie(ToDeclName, ToLocation, ToType) = *Imp;
3802 else
3803 return Imp.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00003804
Douglas Gregor8b228d72010-02-17 21:22:52 +00003805 // Create the imported parameter.
Gabor Marton26f72a92018-07-12 09:42:05 +00003806 ImplicitParamDecl *ToParm = nullptr;
Balazs Keri3b30d652018-10-19 13:32:20 +00003807 if (GetImportedOrCreateDecl(ToParm, D, Importer.getToContext(), DC,
3808 ToLocation, ToDeclName.getAsIdentifierInfo(),
3809 ToType, D->getParameterKind()))
Gabor Marton26f72a92018-07-12 09:42:05 +00003810 return ToParm;
3811 return ToParm;
Douglas Gregor8b228d72010-02-17 21:22:52 +00003812}
3813
Balazs Keric5095942019-08-14 09:41:39 +00003814Error ASTNodeImporter::ImportDefaultArgOfParmVarDecl(
3815 const ParmVarDecl *FromParam, ParmVarDecl *ToParam) {
3816 ToParam->setHasInheritedDefaultArg(FromParam->hasInheritedDefaultArg());
3817 ToParam->setKNRPromoted(FromParam->isKNRPromoted());
3818
3819 if (FromParam->hasUninstantiatedDefaultArg()) {
3820 if (auto ToDefArgOrErr = import(FromParam->getUninstantiatedDefaultArg()))
3821 ToParam->setUninstantiatedDefaultArg(*ToDefArgOrErr);
3822 else
3823 return ToDefArgOrErr.takeError();
3824 } else if (FromParam->hasUnparsedDefaultArg()) {
3825 ToParam->setUnparsedDefaultArg();
3826 } else if (FromParam->hasDefaultArg()) {
3827 if (auto ToDefArgOrErr = import(FromParam->getDefaultArg()))
3828 ToParam->setDefaultArg(*ToDefArgOrErr);
3829 else
3830 return ToDefArgOrErr.takeError();
3831 }
3832
3833 return Error::success();
3834}
3835
Balazs Keri3b30d652018-10-19 13:32:20 +00003836ExpectedDecl ASTNodeImporter::VisitParmVarDecl(ParmVarDecl *D) {
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003837 // Parameters are created in the translation unit's context, then moved
3838 // into the function declaration's context afterward.
3839 DeclContext *DC = Importer.getToContext().getTranslationUnitDecl();
Fangrui Song6907ce22018-07-30 19:24:48 +00003840
Balazs Keri3b30d652018-10-19 13:32:20 +00003841 DeclarationName ToDeclName;
3842 SourceLocation ToLocation, ToInnerLocStart;
3843 QualType ToType;
3844 TypeSourceInfo *ToTypeSourceInfo;
3845 if (auto Imp = importSeq(
3846 D->getDeclName(), D->getLocation(), D->getType(), D->getInnerLocStart(),
3847 D->getTypeSourceInfo()))
3848 std::tie(
3849 ToDeclName, ToLocation, ToType, ToInnerLocStart,
3850 ToTypeSourceInfo) = *Imp;
3851 else
3852 return Imp.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00003853
Gabor Marton26f72a92018-07-12 09:42:05 +00003854 ParmVarDecl *ToParm;
3855 if (GetImportedOrCreateDecl(ToParm, D, Importer.getToContext(), DC,
Balazs Keri3b30d652018-10-19 13:32:20 +00003856 ToInnerLocStart, ToLocation,
3857 ToDeclName.getAsIdentifierInfo(), ToType,
3858 ToTypeSourceInfo, D->getStorageClass(),
Gabor Marton26f72a92018-07-12 09:42:05 +00003859 /*DefaultArg*/ nullptr))
3860 return ToParm;
Aleksei Sidorin55a63502017-02-20 11:57:12 +00003861
Balazs Keric5095942019-08-14 09:41:39 +00003862 // Set the default argument. It should be no problem if it was already done.
3863 // Do not import the default expression before GetImportedOrCreateDecl call
3864 // to avoid possible infinite import loop because circular dependency.
3865 if (Error Err = ImportDefaultArgOfParmVarDecl(D, ToParm))
3866 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00003867
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00003868 if (D->isObjCMethodParameter()) {
3869 ToParm->setObjCMethodScopeInfo(D->getFunctionScopeIndex());
3870 ToParm->setObjCDeclQualifier(D->getObjCDeclQualifier());
3871 } else {
3872 ToParm->setScopeInfo(D->getFunctionScopeDepth(),
3873 D->getFunctionScopeIndex());
3874 }
3875
Gabor Marton26f72a92018-07-12 09:42:05 +00003876 return ToParm;
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003877}
3878
Balazs Keri3b30d652018-10-19 13:32:20 +00003879ExpectedDecl ASTNodeImporter::VisitObjCMethodDecl(ObjCMethodDecl *D) {
Douglas Gregor43f54792010-02-17 02:12:47 +00003880 // Import the major distinguishing characteristics of a method.
3881 DeclContext *DC, *LexicalDC;
3882 DeclarationName Name;
3883 SourceLocation Loc;
Sean Callanan59721b32015-04-28 18:41:46 +00003884 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00003885 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
3886 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00003887 if (ToD)
3888 return ToD;
Craig Topper36250ad2014-05-12 05:36:57 +00003889
Gabor Marton54058b52018-12-17 13:53:12 +00003890 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00003891 for (auto *FoundDecl : FoundDecls) {
3892 if (auto *FoundMethod = dyn_cast<ObjCMethodDecl>(FoundDecl)) {
Douglas Gregor43f54792010-02-17 02:12:47 +00003893 if (FoundMethod->isInstanceMethod() != D->isInstanceMethod())
3894 continue;
3895
3896 // Check return types.
Alp Toker314cc812014-01-25 16:55:45 +00003897 if (!Importer.IsStructurallyEquivalent(D->getReturnType(),
3898 FoundMethod->getReturnType())) {
Gabor Marton410f32c2019-04-01 15:29:55 +00003899 Importer.ToDiag(Loc, diag::warn_odr_objc_method_result_type_inconsistent)
Alp Toker314cc812014-01-25 16:55:45 +00003900 << D->isInstanceMethod() << Name << D->getReturnType()
3901 << FoundMethod->getReturnType();
Fangrui Song6907ce22018-07-30 19:24:48 +00003902 Importer.ToDiag(FoundMethod->getLocation(),
Douglas Gregor43f54792010-02-17 02:12:47 +00003903 diag::note_odr_objc_method_here)
3904 << D->isInstanceMethod() << Name;
Balazs Keri3b30d652018-10-19 13:32:20 +00003905
3906 return make_error<ImportError>(ImportError::NameConflict);
Douglas Gregor43f54792010-02-17 02:12:47 +00003907 }
3908
3909 // Check the number of parameters.
3910 if (D->param_size() != FoundMethod->param_size()) {
Gabor Marton410f32c2019-04-01 15:29:55 +00003911 Importer.ToDiag(Loc, diag::warn_odr_objc_method_num_params_inconsistent)
Douglas Gregor43f54792010-02-17 02:12:47 +00003912 << D->isInstanceMethod() << Name
3913 << D->param_size() << FoundMethod->param_size();
Fangrui Song6907ce22018-07-30 19:24:48 +00003914 Importer.ToDiag(FoundMethod->getLocation(),
Douglas Gregor43f54792010-02-17 02:12:47 +00003915 diag::note_odr_objc_method_here)
3916 << D->isInstanceMethod() << Name;
Balazs Keri3b30d652018-10-19 13:32:20 +00003917
3918 return make_error<ImportError>(ImportError::NameConflict);
Douglas Gregor43f54792010-02-17 02:12:47 +00003919 }
3920
3921 // Check parameter types.
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00003922 for (ObjCMethodDecl::param_iterator P = D->param_begin(),
Douglas Gregor43f54792010-02-17 02:12:47 +00003923 PEnd = D->param_end(), FoundP = FoundMethod->param_begin();
3924 P != PEnd; ++P, ++FoundP) {
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00003925 if (!Importer.IsStructurallyEquivalent((*P)->getType(),
Douglas Gregor43f54792010-02-17 02:12:47 +00003926 (*FoundP)->getType())) {
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00003927 Importer.FromDiag((*P)->getLocation(),
Gabor Marton410f32c2019-04-01 15:29:55 +00003928 diag::warn_odr_objc_method_param_type_inconsistent)
Douglas Gregor43f54792010-02-17 02:12:47 +00003929 << D->isInstanceMethod() << Name
3930 << (*P)->getType() << (*FoundP)->getType();
3931 Importer.ToDiag((*FoundP)->getLocation(), diag::note_odr_value_here)
3932 << (*FoundP)->getType();
Balazs Keri3b30d652018-10-19 13:32:20 +00003933
3934 return make_error<ImportError>(ImportError::NameConflict);
Douglas Gregor43f54792010-02-17 02:12:47 +00003935 }
3936 }
3937
3938 // Check variadic/non-variadic.
3939 // Check the number of parameters.
3940 if (D->isVariadic() != FoundMethod->isVariadic()) {
Gabor Marton410f32c2019-04-01 15:29:55 +00003941 Importer.ToDiag(Loc, diag::warn_odr_objc_method_variadic_inconsistent)
Douglas Gregor43f54792010-02-17 02:12:47 +00003942 << D->isInstanceMethod() << Name;
Fangrui Song6907ce22018-07-30 19:24:48 +00003943 Importer.ToDiag(FoundMethod->getLocation(),
Douglas Gregor43f54792010-02-17 02:12:47 +00003944 diag::note_odr_objc_method_here)
3945 << D->isInstanceMethod() << Name;
Balazs Keri3b30d652018-10-19 13:32:20 +00003946
3947 return make_error<ImportError>(ImportError::NameConflict);
Douglas Gregor43f54792010-02-17 02:12:47 +00003948 }
3949
3950 // FIXME: Any other bits we need to merge?
Gabor Marton26f72a92018-07-12 09:42:05 +00003951 return Importer.MapImported(D, FoundMethod);
Douglas Gregor43f54792010-02-17 02:12:47 +00003952 }
3953 }
3954
Balazs Keri3b30d652018-10-19 13:32:20 +00003955 SourceLocation ToEndLoc;
3956 QualType ToReturnType;
3957 TypeSourceInfo *ToReturnTypeSourceInfo;
3958 if (auto Imp = importSeq(
3959 D->getEndLoc(), D->getReturnType(), D->getReturnTypeSourceInfo()))
3960 std::tie(ToEndLoc, ToReturnType, ToReturnTypeSourceInfo) = *Imp;
3961 else
3962 return Imp.takeError();
Douglas Gregor12852d92010-03-08 14:59:44 +00003963
Gabor Marton26f72a92018-07-12 09:42:05 +00003964 ObjCMethodDecl *ToMethod;
3965 if (GetImportedOrCreateDecl(
3966 ToMethod, D, Importer.getToContext(), Loc,
Balazs Keri3b30d652018-10-19 13:32:20 +00003967 ToEndLoc, Name.getObjCSelector(), ToReturnType,
3968 ToReturnTypeSourceInfo, DC, D->isInstanceMethod(), D->isVariadic(),
Gabor Marton26f72a92018-07-12 09:42:05 +00003969 D->isPropertyAccessor(), D->isImplicit(), D->isDefined(),
3970 D->getImplementationControl(), D->hasRelatedResultType()))
3971 return ToMethod;
Douglas Gregor43f54792010-02-17 02:12:47 +00003972
3973 // FIXME: When we decide to merge method definitions, we'll need to
3974 // deal with implicit parameters.
3975
3976 // Import the parameters
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003977 SmallVector<ParmVarDecl *, 5> ToParams;
David Majnemer59f77922016-06-24 04:05:48 +00003978 for (auto *FromP : D->parameters()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00003979 if (Expected<ParmVarDecl *> ToPOrErr = import(FromP))
3980 ToParams.push_back(*ToPOrErr);
3981 else
3982 return ToPOrErr.takeError();
Douglas Gregor43f54792010-02-17 02:12:47 +00003983 }
Fangrui Song6907ce22018-07-30 19:24:48 +00003984
Douglas Gregor43f54792010-02-17 02:12:47 +00003985 // Set the parameters.
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00003986 for (auto *ToParam : ToParams) {
3987 ToParam->setOwningFunction(ToMethod);
3988 ToMethod->addDeclInternal(ToParam);
Douglas Gregor43f54792010-02-17 02:12:47 +00003989 }
Aleksei Sidorin47dbaf62018-01-09 14:25:05 +00003990
Balazs Keri3b30d652018-10-19 13:32:20 +00003991 SmallVector<SourceLocation, 12> FromSelLocs;
3992 D->getSelectorLocs(FromSelLocs);
3993 SmallVector<SourceLocation, 12> ToSelLocs(FromSelLocs.size());
3994 if (Error Err = ImportContainerChecked(FromSelLocs, ToSelLocs))
3995 return std::move(Err);
Aleksei Sidorin47dbaf62018-01-09 14:25:05 +00003996
Balazs Keri3b30d652018-10-19 13:32:20 +00003997 ToMethod->setMethodParams(Importer.getToContext(), ToParams, ToSelLocs);
Douglas Gregor43f54792010-02-17 02:12:47 +00003998
3999 ToMethod->setLexicalDeclContext(LexicalDC);
Sean Callanan95e74be2011-10-21 02:57:43 +00004000 LexicalDC->addDeclInternal(ToMethod);
Douglas Gregor43f54792010-02-17 02:12:47 +00004001 return ToMethod;
4002}
4003
Balazs Keri3b30d652018-10-19 13:32:20 +00004004ExpectedDecl ASTNodeImporter::VisitObjCTypeParamDecl(ObjCTypeParamDecl *D) {
Douglas Gregor85f3f952015-07-07 03:57:15 +00004005 // Import the major distinguishing characteristics of a category.
4006 DeclContext *DC, *LexicalDC;
4007 DeclarationName Name;
4008 SourceLocation Loc;
4009 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00004010 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
4011 return std::move(Err);
Douglas Gregor85f3f952015-07-07 03:57:15 +00004012 if (ToD)
4013 return ToD;
4014
Balazs Keri3b30d652018-10-19 13:32:20 +00004015 SourceLocation ToVarianceLoc, ToLocation, ToColonLoc;
4016 TypeSourceInfo *ToTypeSourceInfo;
4017 if (auto Imp = importSeq(
4018 D->getVarianceLoc(), D->getLocation(), D->getColonLoc(),
4019 D->getTypeSourceInfo()))
4020 std::tie(ToVarianceLoc, ToLocation, ToColonLoc, ToTypeSourceInfo) = *Imp;
4021 else
4022 return Imp.takeError();
Douglas Gregor85f3f952015-07-07 03:57:15 +00004023
Gabor Marton26f72a92018-07-12 09:42:05 +00004024 ObjCTypeParamDecl *Result;
4025 if (GetImportedOrCreateDecl(
4026 Result, D, Importer.getToContext(), DC, D->getVariance(),
Balazs Keri3b30d652018-10-19 13:32:20 +00004027 ToVarianceLoc, D->getIndex(),
4028 ToLocation, Name.getAsIdentifierInfo(),
4029 ToColonLoc, ToTypeSourceInfo))
Gabor Marton26f72a92018-07-12 09:42:05 +00004030 return Result;
4031
Douglas Gregor85f3f952015-07-07 03:57:15 +00004032 Result->setLexicalDeclContext(LexicalDC);
4033 return Result;
4034}
4035
Balazs Keri3b30d652018-10-19 13:32:20 +00004036ExpectedDecl ASTNodeImporter::VisitObjCCategoryDecl(ObjCCategoryDecl *D) {
Douglas Gregor84c51c32010-02-18 01:47:50 +00004037 // Import the major distinguishing characteristics of a category.
4038 DeclContext *DC, *LexicalDC;
4039 DeclarationName Name;
4040 SourceLocation Loc;
Sean Callanan59721b32015-04-28 18:41:46 +00004041 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00004042 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
4043 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00004044 if (ToD)
4045 return ToD;
Craig Topper36250ad2014-05-12 05:36:57 +00004046
Balazs Keri3b30d652018-10-19 13:32:20 +00004047 ObjCInterfaceDecl *ToInterface;
4048 if (Error Err = importInto(ToInterface, D->getClassInterface()))
4049 return std::move(Err);
Craig Topper36250ad2014-05-12 05:36:57 +00004050
Douglas Gregor84c51c32010-02-18 01:47:50 +00004051 // Determine if we've already encountered this category.
4052 ObjCCategoryDecl *MergeWithCategory
4053 = ToInterface->FindCategoryDeclaration(Name.getAsIdentifierInfo());
4054 ObjCCategoryDecl *ToCategory = MergeWithCategory;
4055 if (!ToCategory) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004056 SourceLocation ToAtStartLoc, ToCategoryNameLoc;
4057 SourceLocation ToIvarLBraceLoc, ToIvarRBraceLoc;
4058 if (auto Imp = importSeq(
4059 D->getAtStartLoc(), D->getCategoryNameLoc(),
4060 D->getIvarLBraceLoc(), D->getIvarRBraceLoc()))
4061 std::tie(
4062 ToAtStartLoc, ToCategoryNameLoc,
4063 ToIvarLBraceLoc, ToIvarRBraceLoc) = *Imp;
4064 else
4065 return Imp.takeError();
Gabor Marton26f72a92018-07-12 09:42:05 +00004066
4067 if (GetImportedOrCreateDecl(ToCategory, D, Importer.getToContext(), DC,
Balazs Keri3b30d652018-10-19 13:32:20 +00004068 ToAtStartLoc, Loc,
4069 ToCategoryNameLoc,
Gabor Marton26f72a92018-07-12 09:42:05 +00004070 Name.getAsIdentifierInfo(), ToInterface,
4071 /*TypeParamList=*/nullptr,
Balazs Keri3b30d652018-10-19 13:32:20 +00004072 ToIvarLBraceLoc,
4073 ToIvarRBraceLoc))
Gabor Marton26f72a92018-07-12 09:42:05 +00004074 return ToCategory;
4075
Douglas Gregor84c51c32010-02-18 01:47:50 +00004076 ToCategory->setLexicalDeclContext(LexicalDC);
Sean Callanan95e74be2011-10-21 02:57:43 +00004077 LexicalDC->addDeclInternal(ToCategory);
Balazs Keri3b30d652018-10-19 13:32:20 +00004078 // Import the type parameter list after MapImported, to avoid
Douglas Gregorab7f0b32015-07-07 06:20:12 +00004079 // loops when bringing in their DeclContext.
Balazs Keri3b30d652018-10-19 13:32:20 +00004080 if (auto PListOrErr = ImportObjCTypeParamList(D->getTypeParamList()))
4081 ToCategory->setTypeParamList(*PListOrErr);
4082 else
4083 return PListOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00004084
Douglas Gregor84c51c32010-02-18 01:47:50 +00004085 // Import protocols
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004086 SmallVector<ObjCProtocolDecl *, 4> Protocols;
4087 SmallVector<SourceLocation, 4> ProtocolLocs;
Douglas Gregor84c51c32010-02-18 01:47:50 +00004088 ObjCCategoryDecl::protocol_loc_iterator FromProtoLoc
4089 = D->protocol_loc_begin();
4090 for (ObjCCategoryDecl::protocol_iterator FromProto = D->protocol_begin(),
4091 FromProtoEnd = D->protocol_end();
4092 FromProto != FromProtoEnd;
4093 ++FromProto, ++FromProtoLoc) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004094 if (Expected<ObjCProtocolDecl *> ToProtoOrErr = import(*FromProto))
4095 Protocols.push_back(*ToProtoOrErr);
4096 else
4097 return ToProtoOrErr.takeError();
4098
4099 if (ExpectedSLoc ToProtoLocOrErr = import(*FromProtoLoc))
4100 ProtocolLocs.push_back(*ToProtoLocOrErr);
4101 else
4102 return ToProtoLocOrErr.takeError();
Douglas Gregor84c51c32010-02-18 01:47:50 +00004103 }
Fangrui Song6907ce22018-07-30 19:24:48 +00004104
Douglas Gregor84c51c32010-02-18 01:47:50 +00004105 // FIXME: If we're merging, make sure that the protocol list is the same.
4106 ToCategory->setProtocolList(Protocols.data(), Protocols.size(),
4107 ProtocolLocs.data(), Importer.getToContext());
Balazs Keri3b30d652018-10-19 13:32:20 +00004108
Douglas Gregor84c51c32010-02-18 01:47:50 +00004109 } else {
Gabor Marton26f72a92018-07-12 09:42:05 +00004110 Importer.MapImported(D, ToCategory);
Douglas Gregor84c51c32010-02-18 01:47:50 +00004111 }
Fangrui Song6907ce22018-07-30 19:24:48 +00004112
Douglas Gregor84c51c32010-02-18 01:47:50 +00004113 // Import all of the members of this category.
Balazs Keri3b30d652018-10-19 13:32:20 +00004114 if (Error Err = ImportDeclContext(D))
4115 return std::move(Err);
Fangrui Song6907ce22018-07-30 19:24:48 +00004116
Douglas Gregor84c51c32010-02-18 01:47:50 +00004117 // If we have an implementation, import it as well.
4118 if (D->getImplementation()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004119 if (Expected<ObjCCategoryImplDecl *> ToImplOrErr =
4120 import(D->getImplementation()))
4121 ToCategory->setImplementation(*ToImplOrErr);
4122 else
4123 return ToImplOrErr.takeError();
Douglas Gregor84c51c32010-02-18 01:47:50 +00004124 }
Fangrui Song6907ce22018-07-30 19:24:48 +00004125
Douglas Gregor84c51c32010-02-18 01:47:50 +00004126 return ToCategory;
4127}
4128
Balazs Keri3b30d652018-10-19 13:32:20 +00004129Error ASTNodeImporter::ImportDefinition(
4130 ObjCProtocolDecl *From, ObjCProtocolDecl *To, ImportDefinitionKind Kind) {
Douglas Gregor2aa53772012-01-24 17:42:07 +00004131 if (To->getDefinition()) {
Douglas Gregor2e15c842012-02-01 21:00:38 +00004132 if (shouldForceImportDeclContext(Kind))
Balazs Keri3b30d652018-10-19 13:32:20 +00004133 if (Error Err = ImportDeclContext(From))
4134 return Err;
4135 return Error::success();
Douglas Gregor2aa53772012-01-24 17:42:07 +00004136 }
4137
4138 // Start the protocol definition
4139 To->startDefinition();
Fangrui Song6907ce22018-07-30 19:24:48 +00004140
Douglas Gregor2aa53772012-01-24 17:42:07 +00004141 // Import protocols
4142 SmallVector<ObjCProtocolDecl *, 4> Protocols;
4143 SmallVector<SourceLocation, 4> ProtocolLocs;
Balazs Keri3b30d652018-10-19 13:32:20 +00004144 ObjCProtocolDecl::protocol_loc_iterator FromProtoLoc =
4145 From->protocol_loc_begin();
Douglas Gregor2aa53772012-01-24 17:42:07 +00004146 for (ObjCProtocolDecl::protocol_iterator FromProto = From->protocol_begin(),
4147 FromProtoEnd = From->protocol_end();
4148 FromProto != FromProtoEnd;
4149 ++FromProto, ++FromProtoLoc) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004150 if (Expected<ObjCProtocolDecl *> ToProtoOrErr = import(*FromProto))
4151 Protocols.push_back(*ToProtoOrErr);
4152 else
4153 return ToProtoOrErr.takeError();
4154
4155 if (ExpectedSLoc ToProtoLocOrErr = import(*FromProtoLoc))
4156 ProtocolLocs.push_back(*ToProtoLocOrErr);
4157 else
4158 return ToProtoLocOrErr.takeError();
4159
Douglas Gregor2aa53772012-01-24 17:42:07 +00004160 }
Fangrui Song6907ce22018-07-30 19:24:48 +00004161
Douglas Gregor2aa53772012-01-24 17:42:07 +00004162 // FIXME: If we're merging, make sure that the protocol list is the same.
4163 To->setProtocolList(Protocols.data(), Protocols.size(),
4164 ProtocolLocs.data(), Importer.getToContext());
4165
Douglas Gregor2e15c842012-02-01 21:00:38 +00004166 if (shouldForceImportDeclContext(Kind)) {
4167 // Import all of the members of this protocol.
Balazs Keri3b30d652018-10-19 13:32:20 +00004168 if (Error Err = ImportDeclContext(From, /*ForceImport=*/true))
4169 return Err;
Douglas Gregor2e15c842012-02-01 21:00:38 +00004170 }
Balazs Keri3b30d652018-10-19 13:32:20 +00004171 return Error::success();
Douglas Gregor2aa53772012-01-24 17:42:07 +00004172}
4173
Balazs Keri3b30d652018-10-19 13:32:20 +00004174ExpectedDecl ASTNodeImporter::VisitObjCProtocolDecl(ObjCProtocolDecl *D) {
Fangrui Song6907ce22018-07-30 19:24:48 +00004175 // If this protocol has a definition in the translation unit we're coming
Douglas Gregor2aa53772012-01-24 17:42:07 +00004176 // from, but this particular declaration is not that definition, import the
4177 // definition and map to that.
4178 ObjCProtocolDecl *Definition = D->getDefinition();
4179 if (Definition && Definition != D) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004180 if (ExpectedDecl ImportedDefOrErr = import(Definition))
4181 return Importer.MapImported(D, *ImportedDefOrErr);
4182 else
4183 return ImportedDefOrErr.takeError();
Douglas Gregor2aa53772012-01-24 17:42:07 +00004184 }
4185
Douglas Gregor84c51c32010-02-18 01:47:50 +00004186 // Import the major distinguishing characteristics of a protocol.
Douglas Gregor98d156a2010-02-17 16:12:00 +00004187 DeclContext *DC, *LexicalDC;
4188 DeclarationName Name;
4189 SourceLocation Loc;
Sean Callanan59721b32015-04-28 18:41:46 +00004190 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00004191 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
4192 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00004193 if (ToD)
4194 return ToD;
Douglas Gregor98d156a2010-02-17 16:12:00 +00004195
Craig Topper36250ad2014-05-12 05:36:57 +00004196 ObjCProtocolDecl *MergeWithProtocol = nullptr;
Gabor Marton54058b52018-12-17 13:53:12 +00004197 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00004198 for (auto *FoundDecl : FoundDecls) {
4199 if (!FoundDecl->isInIdentifierNamespace(Decl::IDNS_ObjCProtocol))
Douglas Gregor98d156a2010-02-17 16:12:00 +00004200 continue;
Fangrui Song6907ce22018-07-30 19:24:48 +00004201
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00004202 if ((MergeWithProtocol = dyn_cast<ObjCProtocolDecl>(FoundDecl)))
Douglas Gregor98d156a2010-02-17 16:12:00 +00004203 break;
4204 }
Fangrui Song6907ce22018-07-30 19:24:48 +00004205
Douglas Gregor98d156a2010-02-17 16:12:00 +00004206 ObjCProtocolDecl *ToProto = MergeWithProtocol;
Douglas Gregor2aa53772012-01-24 17:42:07 +00004207 if (!ToProto) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004208 auto ToAtBeginLocOrErr = import(D->getAtStartLoc());
4209 if (!ToAtBeginLocOrErr)
4210 return ToAtBeginLocOrErr.takeError();
4211
Gabor Marton26f72a92018-07-12 09:42:05 +00004212 if (GetImportedOrCreateDecl(ToProto, D, Importer.getToContext(), DC,
4213 Name.getAsIdentifierInfo(), Loc,
Balazs Keri3b30d652018-10-19 13:32:20 +00004214 *ToAtBeginLocOrErr,
Gabor Marton26f72a92018-07-12 09:42:05 +00004215 /*PrevDecl=*/nullptr))
4216 return ToProto;
Douglas Gregor2aa53772012-01-24 17:42:07 +00004217 ToProto->setLexicalDeclContext(LexicalDC);
4218 LexicalDC->addDeclInternal(ToProto);
Douglas Gregor98d156a2010-02-17 16:12:00 +00004219 }
Gabor Marton26f72a92018-07-12 09:42:05 +00004220
4221 Importer.MapImported(D, ToProto);
Douglas Gregor98d156a2010-02-17 16:12:00 +00004222
Balazs Keri3b30d652018-10-19 13:32:20 +00004223 if (D->isThisDeclarationADefinition())
4224 if (Error Err = ImportDefinition(D, ToProto))
4225 return std::move(Err);
Craig Topper36250ad2014-05-12 05:36:57 +00004226
Douglas Gregor98d156a2010-02-17 16:12:00 +00004227 return ToProto;
4228}
4229
Balazs Keri3b30d652018-10-19 13:32:20 +00004230ExpectedDecl ASTNodeImporter::VisitLinkageSpecDecl(LinkageSpecDecl *D) {
4231 DeclContext *DC, *LexicalDC;
4232 if (Error Err = ImportDeclContext(D, DC, LexicalDC))
4233 return std::move(Err);
Sean Callanan0aae0412014-12-10 00:00:37 +00004234
Balazs Keri3b30d652018-10-19 13:32:20 +00004235 ExpectedSLoc ExternLocOrErr = import(D->getExternLoc());
4236 if (!ExternLocOrErr)
4237 return ExternLocOrErr.takeError();
4238
4239 ExpectedSLoc LangLocOrErr = import(D->getLocation());
4240 if (!LangLocOrErr)
4241 return LangLocOrErr.takeError();
Sean Callanan0aae0412014-12-10 00:00:37 +00004242
4243 bool HasBraces = D->hasBraces();
Gabor Marton26f72a92018-07-12 09:42:05 +00004244
4245 LinkageSpecDecl *ToLinkageSpec;
4246 if (GetImportedOrCreateDecl(ToLinkageSpec, D, Importer.getToContext(), DC,
Balazs Keri3b30d652018-10-19 13:32:20 +00004247 *ExternLocOrErr, *LangLocOrErr,
4248 D->getLanguage(), HasBraces))
Gabor Marton26f72a92018-07-12 09:42:05 +00004249 return ToLinkageSpec;
Sean Callanan0aae0412014-12-10 00:00:37 +00004250
4251 if (HasBraces) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004252 ExpectedSLoc RBraceLocOrErr = import(D->getRBraceLoc());
4253 if (!RBraceLocOrErr)
4254 return RBraceLocOrErr.takeError();
4255 ToLinkageSpec->setRBraceLoc(*RBraceLocOrErr);
Sean Callanan0aae0412014-12-10 00:00:37 +00004256 }
4257
4258 ToLinkageSpec->setLexicalDeclContext(LexicalDC);
4259 LexicalDC->addDeclInternal(ToLinkageSpec);
4260
Sean Callanan0aae0412014-12-10 00:00:37 +00004261 return ToLinkageSpec;
4262}
4263
Balazs Keri3b30d652018-10-19 13:32:20 +00004264ExpectedDecl ASTNodeImporter::VisitUsingDecl(UsingDecl *D) {
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004265 DeclContext *DC, *LexicalDC;
4266 DeclarationName Name;
4267 SourceLocation Loc;
4268 NamedDecl *ToD = nullptr;
Balazs Keri3b30d652018-10-19 13:32:20 +00004269 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
4270 return std::move(Err);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004271 if (ToD)
4272 return ToD;
4273
Balazs Keri3b30d652018-10-19 13:32:20 +00004274 SourceLocation ToLoc, ToUsingLoc;
4275 NestedNameSpecifierLoc ToQualifierLoc;
4276 if (auto Imp = importSeq(
4277 D->getNameInfo().getLoc(), D->getUsingLoc(), D->getQualifierLoc()))
4278 std::tie(ToLoc, ToUsingLoc, ToQualifierLoc) = *Imp;
4279 else
4280 return Imp.takeError();
4281
4282 DeclarationNameInfo NameInfo(Name, ToLoc);
4283 if (Error Err = ImportDeclarationNameLoc(D->getNameInfo(), NameInfo))
4284 return std::move(Err);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004285
Gabor Marton26f72a92018-07-12 09:42:05 +00004286 UsingDecl *ToUsing;
4287 if (GetImportedOrCreateDecl(ToUsing, D, Importer.getToContext(), DC,
Balazs Keri3b30d652018-10-19 13:32:20 +00004288 ToUsingLoc, ToQualifierLoc, NameInfo,
Gabor Marton26f72a92018-07-12 09:42:05 +00004289 D->hasTypename()))
4290 return ToUsing;
4291
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004292 ToUsing->setLexicalDeclContext(LexicalDC);
4293 LexicalDC->addDeclInternal(ToUsing);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004294
4295 if (NamedDecl *FromPattern =
4296 Importer.getFromContext().getInstantiatedFromUsingDecl(D)) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004297 if (Expected<NamedDecl *> ToPatternOrErr = import(FromPattern))
4298 Importer.getToContext().setInstantiatedFromUsingDecl(
4299 ToUsing, *ToPatternOrErr);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004300 else
Balazs Keri3b30d652018-10-19 13:32:20 +00004301 return ToPatternOrErr.takeError();
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004302 }
4303
Balazs Keri3b30d652018-10-19 13:32:20 +00004304 for (UsingShadowDecl *FromShadow : D->shadows()) {
4305 if (Expected<UsingShadowDecl *> ToShadowOrErr = import(FromShadow))
4306 ToUsing->addShadowDecl(*ToShadowOrErr);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004307 else
Balazs Keri3b30d652018-10-19 13:32:20 +00004308 // FIXME: We return error here but the definition is already created
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004309 // and available with lookups. How to fix this?..
Balazs Keri3b30d652018-10-19 13:32:20 +00004310 return ToShadowOrErr.takeError();
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004311 }
4312 return ToUsing;
4313}
4314
Balazs Keri3b30d652018-10-19 13:32:20 +00004315ExpectedDecl ASTNodeImporter::VisitUsingShadowDecl(UsingShadowDecl *D) {
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004316 DeclContext *DC, *LexicalDC;
4317 DeclarationName Name;
4318 SourceLocation Loc;
4319 NamedDecl *ToD = nullptr;
Balazs Keri3b30d652018-10-19 13:32:20 +00004320 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
4321 return std::move(Err);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004322 if (ToD)
4323 return ToD;
4324
Balazs Keri3b30d652018-10-19 13:32:20 +00004325 Expected<UsingDecl *> ToUsingOrErr = import(D->getUsingDecl());
4326 if (!ToUsingOrErr)
4327 return ToUsingOrErr.takeError();
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004328
Balazs Keri3b30d652018-10-19 13:32:20 +00004329 Expected<NamedDecl *> ToTargetOrErr = import(D->getTargetDecl());
4330 if (!ToTargetOrErr)
4331 return ToTargetOrErr.takeError();
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004332
Gabor Marton26f72a92018-07-12 09:42:05 +00004333 UsingShadowDecl *ToShadow;
4334 if (GetImportedOrCreateDecl(ToShadow, D, Importer.getToContext(), DC, Loc,
Balazs Keri3b30d652018-10-19 13:32:20 +00004335 *ToUsingOrErr, *ToTargetOrErr))
Gabor Marton26f72a92018-07-12 09:42:05 +00004336 return ToShadow;
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004337
4338 ToShadow->setLexicalDeclContext(LexicalDC);
4339 ToShadow->setAccess(D->getAccess());
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004340
4341 if (UsingShadowDecl *FromPattern =
4342 Importer.getFromContext().getInstantiatedFromUsingShadowDecl(D)) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004343 if (Expected<UsingShadowDecl *> ToPatternOrErr = import(FromPattern))
4344 Importer.getToContext().setInstantiatedFromUsingShadowDecl(
4345 ToShadow, *ToPatternOrErr);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004346 else
Balazs Keri3b30d652018-10-19 13:32:20 +00004347 // FIXME: We return error here but the definition is already created
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004348 // and available with lookups. How to fix this?..
Balazs Keri3b30d652018-10-19 13:32:20 +00004349 return ToPatternOrErr.takeError();
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004350 }
4351
4352 LexicalDC->addDeclInternal(ToShadow);
4353
4354 return ToShadow;
4355}
4356
Balazs Keri3b30d652018-10-19 13:32:20 +00004357ExpectedDecl ASTNodeImporter::VisitUsingDirectiveDecl(UsingDirectiveDecl *D) {
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004358 DeclContext *DC, *LexicalDC;
4359 DeclarationName Name;
4360 SourceLocation Loc;
4361 NamedDecl *ToD = nullptr;
Balazs Keri3b30d652018-10-19 13:32:20 +00004362 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
4363 return std::move(Err);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004364 if (ToD)
4365 return ToD;
4366
Balazs Keri3b30d652018-10-19 13:32:20 +00004367 auto ToComAncestorOrErr = Importer.ImportContext(D->getCommonAncestor());
4368 if (!ToComAncestorOrErr)
4369 return ToComAncestorOrErr.takeError();
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004370
Balazs Keri3b30d652018-10-19 13:32:20 +00004371 NamespaceDecl *ToNominatedNamespace;
4372 SourceLocation ToUsingLoc, ToNamespaceKeyLocation, ToIdentLocation;
4373 NestedNameSpecifierLoc ToQualifierLoc;
4374 if (auto Imp = importSeq(
4375 D->getNominatedNamespace(), D->getUsingLoc(),
4376 D->getNamespaceKeyLocation(), D->getQualifierLoc(),
4377 D->getIdentLocation()))
4378 std::tie(
4379 ToNominatedNamespace, ToUsingLoc, ToNamespaceKeyLocation,
4380 ToQualifierLoc, ToIdentLocation) = *Imp;
4381 else
4382 return Imp.takeError();
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004383
Gabor Marton26f72a92018-07-12 09:42:05 +00004384 UsingDirectiveDecl *ToUsingDir;
4385 if (GetImportedOrCreateDecl(ToUsingDir, D, Importer.getToContext(), DC,
Balazs Keri3b30d652018-10-19 13:32:20 +00004386 ToUsingLoc,
4387 ToNamespaceKeyLocation,
4388 ToQualifierLoc,
4389 ToIdentLocation,
4390 ToNominatedNamespace, *ToComAncestorOrErr))
Gabor Marton26f72a92018-07-12 09:42:05 +00004391 return ToUsingDir;
4392
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004393 ToUsingDir->setLexicalDeclContext(LexicalDC);
4394 LexicalDC->addDeclInternal(ToUsingDir);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004395
4396 return ToUsingDir;
4397}
4398
Balazs Keri3b30d652018-10-19 13:32:20 +00004399ExpectedDecl ASTNodeImporter::VisitUnresolvedUsingValueDecl(
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004400 UnresolvedUsingValueDecl *D) {
4401 DeclContext *DC, *LexicalDC;
4402 DeclarationName Name;
4403 SourceLocation Loc;
4404 NamedDecl *ToD = nullptr;
Balazs Keri3b30d652018-10-19 13:32:20 +00004405 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
4406 return std::move(Err);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004407 if (ToD)
4408 return ToD;
4409
Balazs Keri3b30d652018-10-19 13:32:20 +00004410 SourceLocation ToLoc, ToUsingLoc, ToEllipsisLoc;
4411 NestedNameSpecifierLoc ToQualifierLoc;
4412 if (auto Imp = importSeq(
4413 D->getNameInfo().getLoc(), D->getUsingLoc(), D->getQualifierLoc(),
4414 D->getEllipsisLoc()))
4415 std::tie(ToLoc, ToUsingLoc, ToQualifierLoc, ToEllipsisLoc) = *Imp;
4416 else
4417 return Imp.takeError();
4418
4419 DeclarationNameInfo NameInfo(Name, ToLoc);
4420 if (Error Err = ImportDeclarationNameLoc(D->getNameInfo(), NameInfo))
4421 return std::move(Err);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004422
Gabor Marton26f72a92018-07-12 09:42:05 +00004423 UnresolvedUsingValueDecl *ToUsingValue;
4424 if (GetImportedOrCreateDecl(ToUsingValue, D, Importer.getToContext(), DC,
Balazs Keri3b30d652018-10-19 13:32:20 +00004425 ToUsingLoc, ToQualifierLoc, NameInfo,
4426 ToEllipsisLoc))
Gabor Marton26f72a92018-07-12 09:42:05 +00004427 return ToUsingValue;
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004428
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004429 ToUsingValue->setAccess(D->getAccess());
4430 ToUsingValue->setLexicalDeclContext(LexicalDC);
4431 LexicalDC->addDeclInternal(ToUsingValue);
4432
4433 return ToUsingValue;
4434}
4435
Balazs Keri3b30d652018-10-19 13:32:20 +00004436ExpectedDecl ASTNodeImporter::VisitUnresolvedUsingTypenameDecl(
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004437 UnresolvedUsingTypenameDecl *D) {
4438 DeclContext *DC, *LexicalDC;
4439 DeclarationName Name;
4440 SourceLocation Loc;
4441 NamedDecl *ToD = nullptr;
Balazs Keri3b30d652018-10-19 13:32:20 +00004442 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
4443 return std::move(Err);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004444 if (ToD)
4445 return ToD;
4446
Balazs Keri3b30d652018-10-19 13:32:20 +00004447 SourceLocation ToUsingLoc, ToTypenameLoc, ToEllipsisLoc;
4448 NestedNameSpecifierLoc ToQualifierLoc;
4449 if (auto Imp = importSeq(
4450 D->getUsingLoc(), D->getTypenameLoc(), D->getQualifierLoc(),
4451 D->getEllipsisLoc()))
4452 std::tie(ToUsingLoc, ToTypenameLoc, ToQualifierLoc, ToEllipsisLoc) = *Imp;
4453 else
4454 return Imp.takeError();
4455
Gabor Marton26f72a92018-07-12 09:42:05 +00004456 UnresolvedUsingTypenameDecl *ToUsing;
4457 if (GetImportedOrCreateDecl(ToUsing, D, Importer.getToContext(), DC,
Balazs Keri3b30d652018-10-19 13:32:20 +00004458 ToUsingLoc, ToTypenameLoc,
4459 ToQualifierLoc, Loc, Name, ToEllipsisLoc))
Gabor Marton26f72a92018-07-12 09:42:05 +00004460 return ToUsing;
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004461
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004462 ToUsing->setAccess(D->getAccess());
4463 ToUsing->setLexicalDeclContext(LexicalDC);
4464 LexicalDC->addDeclInternal(ToUsing);
4465
4466 return ToUsing;
4467}
4468
Raphael Isemannba7bde62019-10-30 14:50:35 +01004469ExpectedDecl ASTNodeImporter::VisitBuiltinTemplateDecl(BuiltinTemplateDecl *D) {
4470 Decl* ToD = nullptr;
4471 switch (D->getBuiltinTemplateKind()) {
4472 case BuiltinTemplateKind::BTK__make_integer_seq:
4473 ToD = Importer.getToContext().getMakeIntegerSeqDecl();
4474 break;
4475 case BuiltinTemplateKind::BTK__type_pack_element:
4476 ToD = Importer.getToContext().getTypePackElementDecl();
4477 break;
4478 }
4479 assert(ToD && "BuiltinTemplateDecl of unsupported kind!");
4480 Importer.MapImported(D, ToD);
4481 return ToD;
4482}
Balazs Keri3b30d652018-10-19 13:32:20 +00004483
4484Error ASTNodeImporter::ImportDefinition(
4485 ObjCInterfaceDecl *From, ObjCInterfaceDecl *To, ImportDefinitionKind Kind) {
Douglas Gregor2aa53772012-01-24 17:42:07 +00004486 if (To->getDefinition()) {
4487 // Check consistency of superclass.
4488 ObjCInterfaceDecl *FromSuper = From->getSuperClass();
4489 if (FromSuper) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004490 if (auto FromSuperOrErr = import(FromSuper))
4491 FromSuper = *FromSuperOrErr;
4492 else
4493 return FromSuperOrErr.takeError();
Douglas Gregor2aa53772012-01-24 17:42:07 +00004494 }
Fangrui Song6907ce22018-07-30 19:24:48 +00004495
4496 ObjCInterfaceDecl *ToSuper = To->getSuperClass();
Douglas Gregor2aa53772012-01-24 17:42:07 +00004497 if ((bool)FromSuper != (bool)ToSuper ||
4498 (FromSuper && !declaresSameEntity(FromSuper, ToSuper))) {
Fangrui Song6907ce22018-07-30 19:24:48 +00004499 Importer.ToDiag(To->getLocation(),
Gabor Marton410f32c2019-04-01 15:29:55 +00004500 diag::warn_odr_objc_superclass_inconsistent)
Douglas Gregor2aa53772012-01-24 17:42:07 +00004501 << To->getDeclName();
4502 if (ToSuper)
4503 Importer.ToDiag(To->getSuperClassLoc(), diag::note_odr_objc_superclass)
4504 << To->getSuperClass()->getDeclName();
4505 else
Fangrui Song6907ce22018-07-30 19:24:48 +00004506 Importer.ToDiag(To->getLocation(),
Douglas Gregor2aa53772012-01-24 17:42:07 +00004507 diag::note_odr_objc_missing_superclass);
4508 if (From->getSuperClass())
Fangrui Song6907ce22018-07-30 19:24:48 +00004509 Importer.FromDiag(From->getSuperClassLoc(),
Douglas Gregor2aa53772012-01-24 17:42:07 +00004510 diag::note_odr_objc_superclass)
4511 << From->getSuperClass()->getDeclName();
4512 else
Fangrui Song6907ce22018-07-30 19:24:48 +00004513 Importer.FromDiag(From->getLocation(),
4514 diag::note_odr_objc_missing_superclass);
Douglas Gregor2aa53772012-01-24 17:42:07 +00004515 }
Fangrui Song6907ce22018-07-30 19:24:48 +00004516
Douglas Gregor2e15c842012-02-01 21:00:38 +00004517 if (shouldForceImportDeclContext(Kind))
Balazs Keri3b30d652018-10-19 13:32:20 +00004518 if (Error Err = ImportDeclContext(From))
4519 return Err;
4520 return Error::success();
Douglas Gregor2aa53772012-01-24 17:42:07 +00004521 }
Fangrui Song6907ce22018-07-30 19:24:48 +00004522
Douglas Gregor2aa53772012-01-24 17:42:07 +00004523 // Start the definition.
4524 To->startDefinition();
Fangrui Song6907ce22018-07-30 19:24:48 +00004525
Douglas Gregor2aa53772012-01-24 17:42:07 +00004526 // If this class has a superclass, import it.
4527 if (From->getSuperClass()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004528 if (auto SuperTInfoOrErr = import(From->getSuperClassTInfo()))
4529 To->setSuperClass(*SuperTInfoOrErr);
4530 else
4531 return SuperTInfoOrErr.takeError();
Douglas Gregor2aa53772012-01-24 17:42:07 +00004532 }
Fangrui Song6907ce22018-07-30 19:24:48 +00004533
Douglas Gregor2aa53772012-01-24 17:42:07 +00004534 // Import protocols
4535 SmallVector<ObjCProtocolDecl *, 4> Protocols;
4536 SmallVector<SourceLocation, 4> ProtocolLocs;
Balazs Keri3b30d652018-10-19 13:32:20 +00004537 ObjCInterfaceDecl::protocol_loc_iterator FromProtoLoc =
4538 From->protocol_loc_begin();
Fangrui Song6907ce22018-07-30 19:24:48 +00004539
Douglas Gregor2aa53772012-01-24 17:42:07 +00004540 for (ObjCInterfaceDecl::protocol_iterator FromProto = From->protocol_begin(),
4541 FromProtoEnd = From->protocol_end();
4542 FromProto != FromProtoEnd;
4543 ++FromProto, ++FromProtoLoc) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004544 if (Expected<ObjCProtocolDecl *> ToProtoOrErr = import(*FromProto))
4545 Protocols.push_back(*ToProtoOrErr);
4546 else
4547 return ToProtoOrErr.takeError();
4548
4549 if (ExpectedSLoc ToProtoLocOrErr = import(*FromProtoLoc))
4550 ProtocolLocs.push_back(*ToProtoLocOrErr);
4551 else
4552 return ToProtoLocOrErr.takeError();
4553
Douglas Gregor2aa53772012-01-24 17:42:07 +00004554 }
Fangrui Song6907ce22018-07-30 19:24:48 +00004555
Douglas Gregor2aa53772012-01-24 17:42:07 +00004556 // FIXME: If we're merging, make sure that the protocol list is the same.
4557 To->setProtocolList(Protocols.data(), Protocols.size(),
4558 ProtocolLocs.data(), Importer.getToContext());
Fangrui Song6907ce22018-07-30 19:24:48 +00004559
Douglas Gregor2aa53772012-01-24 17:42:07 +00004560 // Import categories. When the categories themselves are imported, they'll
4561 // hook themselves into this interface.
Balazs Keri3b30d652018-10-19 13:32:20 +00004562 for (auto *Cat : From->known_categories()) {
4563 auto ToCatOrErr = import(Cat);
4564 if (!ToCatOrErr)
4565 return ToCatOrErr.takeError();
4566 }
Fangrui Song6907ce22018-07-30 19:24:48 +00004567
Douglas Gregor2aa53772012-01-24 17:42:07 +00004568 // If we have an @implementation, import it as well.
4569 if (From->getImplementation()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004570 if (Expected<ObjCImplementationDecl *> ToImplOrErr =
4571 import(From->getImplementation()))
4572 To->setImplementation(*ToImplOrErr);
4573 else
4574 return ToImplOrErr.takeError();
Douglas Gregor2aa53772012-01-24 17:42:07 +00004575 }
4576
Douglas Gregor2e15c842012-02-01 21:00:38 +00004577 if (shouldForceImportDeclContext(Kind)) {
4578 // Import all of the members of this class.
Balazs Keri3b30d652018-10-19 13:32:20 +00004579 if (Error Err = ImportDeclContext(From, /*ForceImport=*/true))
4580 return Err;
Douglas Gregor2e15c842012-02-01 21:00:38 +00004581 }
Balazs Keri3b30d652018-10-19 13:32:20 +00004582 return Error::success();
Douglas Gregor2aa53772012-01-24 17:42:07 +00004583}
4584
Balazs Keri3b30d652018-10-19 13:32:20 +00004585Expected<ObjCTypeParamList *>
Douglas Gregor85f3f952015-07-07 03:57:15 +00004586ASTNodeImporter::ImportObjCTypeParamList(ObjCTypeParamList *list) {
4587 if (!list)
4588 return nullptr;
4589
4590 SmallVector<ObjCTypeParamDecl *, 4> toTypeParams;
Balazs Keri3b30d652018-10-19 13:32:20 +00004591 for (auto *fromTypeParam : *list) {
4592 if (auto toTypeParamOrErr = import(fromTypeParam))
4593 toTypeParams.push_back(*toTypeParamOrErr);
4594 else
4595 return toTypeParamOrErr.takeError();
Douglas Gregor85f3f952015-07-07 03:57:15 +00004596 }
4597
Balazs Keri3b30d652018-10-19 13:32:20 +00004598 auto LAngleLocOrErr = import(list->getLAngleLoc());
4599 if (!LAngleLocOrErr)
4600 return LAngleLocOrErr.takeError();
4601
4602 auto RAngleLocOrErr = import(list->getRAngleLoc());
4603 if (!RAngleLocOrErr)
4604 return RAngleLocOrErr.takeError();
4605
Douglas Gregor85f3f952015-07-07 03:57:15 +00004606 return ObjCTypeParamList::create(Importer.getToContext(),
Balazs Keri3b30d652018-10-19 13:32:20 +00004607 *LAngleLocOrErr,
Douglas Gregor85f3f952015-07-07 03:57:15 +00004608 toTypeParams,
Balazs Keri3b30d652018-10-19 13:32:20 +00004609 *RAngleLocOrErr);
Douglas Gregor85f3f952015-07-07 03:57:15 +00004610}
4611
Balazs Keri3b30d652018-10-19 13:32:20 +00004612ExpectedDecl ASTNodeImporter::VisitObjCInterfaceDecl(ObjCInterfaceDecl *D) {
Douglas Gregor2aa53772012-01-24 17:42:07 +00004613 // If this class has a definition in the translation unit we're coming from,
4614 // but this particular declaration is not that definition, import the
4615 // definition and map to that.
4616 ObjCInterfaceDecl *Definition = D->getDefinition();
4617 if (Definition && Definition != D) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004618 if (ExpectedDecl ImportedDefOrErr = import(Definition))
4619 return Importer.MapImported(D, *ImportedDefOrErr);
4620 else
4621 return ImportedDefOrErr.takeError();
Douglas Gregor2aa53772012-01-24 17:42:07 +00004622 }
4623
Douglas Gregor45635322010-02-16 01:20:57 +00004624 // Import the major distinguishing characteristics of an @interface.
4625 DeclContext *DC, *LexicalDC;
4626 DeclarationName Name;
4627 SourceLocation Loc;
Sean Callanan59721b32015-04-28 18:41:46 +00004628 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00004629 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
4630 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00004631 if (ToD)
4632 return ToD;
Douglas Gregor45635322010-02-16 01:20:57 +00004633
Douglas Gregor2aa53772012-01-24 17:42:07 +00004634 // Look for an existing interface with the same name.
Craig Topper36250ad2014-05-12 05:36:57 +00004635 ObjCInterfaceDecl *MergeWithIface = nullptr;
Gabor Marton54058b52018-12-17 13:53:12 +00004636 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00004637 for (auto *FoundDecl : FoundDecls) {
4638 if (!FoundDecl->isInIdentifierNamespace(Decl::IDNS_Ordinary))
Douglas Gregor45635322010-02-16 01:20:57 +00004639 continue;
Fangrui Song6907ce22018-07-30 19:24:48 +00004640
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00004641 if ((MergeWithIface = dyn_cast<ObjCInterfaceDecl>(FoundDecl)))
Douglas Gregor45635322010-02-16 01:20:57 +00004642 break;
4643 }
Fangrui Song6907ce22018-07-30 19:24:48 +00004644
Douglas Gregor2aa53772012-01-24 17:42:07 +00004645 // Create an interface declaration, if one does not already exist.
Douglas Gregor45635322010-02-16 01:20:57 +00004646 ObjCInterfaceDecl *ToIface = MergeWithIface;
Douglas Gregor2aa53772012-01-24 17:42:07 +00004647 if (!ToIface) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004648 ExpectedSLoc AtBeginLocOrErr = import(D->getAtStartLoc());
4649 if (!AtBeginLocOrErr)
4650 return AtBeginLocOrErr.takeError();
4651
Gabor Marton26f72a92018-07-12 09:42:05 +00004652 if (GetImportedOrCreateDecl(
4653 ToIface, D, Importer.getToContext(), DC,
Balazs Keri3b30d652018-10-19 13:32:20 +00004654 *AtBeginLocOrErr, Name.getAsIdentifierInfo(),
Gabor Marton26f72a92018-07-12 09:42:05 +00004655 /*TypeParamList=*/nullptr,
4656 /*PrevDecl=*/nullptr, Loc, D->isImplicitInterfaceDecl()))
4657 return ToIface;
Douglas Gregor2aa53772012-01-24 17:42:07 +00004658 ToIface->setLexicalDeclContext(LexicalDC);
4659 LexicalDC->addDeclInternal(ToIface);
Douglas Gregor45635322010-02-16 01:20:57 +00004660 }
Gabor Marton26f72a92018-07-12 09:42:05 +00004661 Importer.MapImported(D, ToIface);
Balazs Keri3b30d652018-10-19 13:32:20 +00004662 // Import the type parameter list after MapImported, to avoid
Douglas Gregorab7f0b32015-07-07 06:20:12 +00004663 // loops when bringing in their DeclContext.
Balazs Keri3b30d652018-10-19 13:32:20 +00004664 if (auto ToPListOrErr =
4665 ImportObjCTypeParamList(D->getTypeParamListAsWritten()))
4666 ToIface->setTypeParamList(*ToPListOrErr);
4667 else
4668 return ToPListOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00004669
Balazs Keri3b30d652018-10-19 13:32:20 +00004670 if (D->isThisDeclarationADefinition())
4671 if (Error Err = ImportDefinition(D, ToIface))
4672 return std::move(Err);
Craig Topper36250ad2014-05-12 05:36:57 +00004673
Douglas Gregor98d156a2010-02-17 16:12:00 +00004674 return ToIface;
Douglas Gregor45635322010-02-16 01:20:57 +00004675}
4676
Balazs Keri3b30d652018-10-19 13:32:20 +00004677ExpectedDecl
4678ASTNodeImporter::VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D) {
4679 ObjCCategoryDecl *Category;
4680 if (Error Err = importInto(Category, D->getCategoryDecl()))
4681 return std::move(Err);
Craig Topper36250ad2014-05-12 05:36:57 +00004682
Douglas Gregor4da9d682010-12-07 15:32:12 +00004683 ObjCCategoryImplDecl *ToImpl = Category->getImplementation();
4684 if (!ToImpl) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004685 DeclContext *DC, *LexicalDC;
4686 if (Error Err = ImportDeclContext(D, DC, LexicalDC))
4687 return std::move(Err);
Craig Topper36250ad2014-05-12 05:36:57 +00004688
Balazs Keri3b30d652018-10-19 13:32:20 +00004689 SourceLocation ToLocation, ToAtStartLoc, ToCategoryNameLoc;
4690 if (auto Imp = importSeq(
4691 D->getLocation(), D->getAtStartLoc(), D->getCategoryNameLoc()))
4692 std::tie(ToLocation, ToAtStartLoc, ToCategoryNameLoc) = *Imp;
4693 else
4694 return Imp.takeError();
4695
Gabor Marton26f72a92018-07-12 09:42:05 +00004696 if (GetImportedOrCreateDecl(
4697 ToImpl, D, Importer.getToContext(), DC,
4698 Importer.Import(D->getIdentifier()), Category->getClassInterface(),
Balazs Keri3b30d652018-10-19 13:32:20 +00004699 ToLocation, ToAtStartLoc, ToCategoryNameLoc))
Gabor Marton26f72a92018-07-12 09:42:05 +00004700 return ToImpl;
4701
Balazs Keri3b30d652018-10-19 13:32:20 +00004702 ToImpl->setLexicalDeclContext(LexicalDC);
Sean Callanan95e74be2011-10-21 02:57:43 +00004703 LexicalDC->addDeclInternal(ToImpl);
Douglas Gregor4da9d682010-12-07 15:32:12 +00004704 Category->setImplementation(ToImpl);
4705 }
Fangrui Song6907ce22018-07-30 19:24:48 +00004706
Gabor Marton26f72a92018-07-12 09:42:05 +00004707 Importer.MapImported(D, ToImpl);
Balazs Keri3b30d652018-10-19 13:32:20 +00004708 if (Error Err = ImportDeclContext(D))
4709 return std::move(Err);
4710
Douglas Gregor4da9d682010-12-07 15:32:12 +00004711 return ToImpl;
4712}
4713
Balazs Keri3b30d652018-10-19 13:32:20 +00004714ExpectedDecl
4715ASTNodeImporter::VisitObjCImplementationDecl(ObjCImplementationDecl *D) {
Douglas Gregorda8025c2010-12-07 01:26:03 +00004716 // Find the corresponding interface.
Balazs Keri3b30d652018-10-19 13:32:20 +00004717 ObjCInterfaceDecl *Iface;
4718 if (Error Err = importInto(Iface, D->getClassInterface()))
4719 return std::move(Err);
Douglas Gregorda8025c2010-12-07 01:26:03 +00004720
4721 // Import the superclass, if any.
Balazs Keri3b30d652018-10-19 13:32:20 +00004722 ObjCInterfaceDecl *Super;
4723 if (Error Err = importInto(Super, D->getSuperClass()))
4724 return std::move(Err);
Douglas Gregorda8025c2010-12-07 01:26:03 +00004725
4726 ObjCImplementationDecl *Impl = Iface->getImplementation();
4727 if (!Impl) {
4728 // We haven't imported an implementation yet. Create a new @implementation
4729 // now.
Balazs Keri3b30d652018-10-19 13:32:20 +00004730 DeclContext *DC, *LexicalDC;
4731 if (Error Err = ImportDeclContext(D, DC, LexicalDC))
4732 return std::move(Err);
4733
4734 SourceLocation ToLocation, ToAtStartLoc, ToSuperClassLoc;
4735 SourceLocation ToIvarLBraceLoc, ToIvarRBraceLoc;
4736 if (auto Imp = importSeq(
4737 D->getLocation(), D->getAtStartLoc(), D->getSuperClassLoc(),
4738 D->getIvarLBraceLoc(), D->getIvarRBraceLoc()))
4739 std::tie(
4740 ToLocation, ToAtStartLoc, ToSuperClassLoc,
4741 ToIvarLBraceLoc, ToIvarRBraceLoc) = *Imp;
4742 else
4743 return Imp.takeError();
4744
Gabor Marton26f72a92018-07-12 09:42:05 +00004745 if (GetImportedOrCreateDecl(Impl, D, Importer.getToContext(),
Balazs Keri3b30d652018-10-19 13:32:20 +00004746 DC, Iface, Super,
4747 ToLocation,
4748 ToAtStartLoc,
4749 ToSuperClassLoc,
4750 ToIvarLBraceLoc,
4751 ToIvarRBraceLoc))
Gabor Marton26f72a92018-07-12 09:42:05 +00004752 return Impl;
4753
Balazs Keri3b30d652018-10-19 13:32:20 +00004754 Impl->setLexicalDeclContext(LexicalDC);
Gabor Marton26f72a92018-07-12 09:42:05 +00004755
Douglas Gregorda8025c2010-12-07 01:26:03 +00004756 // Associate the implementation with the class it implements.
4757 Iface->setImplementation(Impl);
Gabor Marton26f72a92018-07-12 09:42:05 +00004758 Importer.MapImported(D, Iface->getImplementation());
Douglas Gregorda8025c2010-12-07 01:26:03 +00004759 } else {
Gabor Marton26f72a92018-07-12 09:42:05 +00004760 Importer.MapImported(D, Iface->getImplementation());
Douglas Gregorda8025c2010-12-07 01:26:03 +00004761
4762 // Verify that the existing @implementation has the same superclass.
4763 if ((Super && !Impl->getSuperClass()) ||
4764 (!Super && Impl->getSuperClass()) ||
Craig Topperdcfc60f2014-05-07 06:57:44 +00004765 (Super && Impl->getSuperClass() &&
4766 !declaresSameEntity(Super->getCanonicalDecl(),
4767 Impl->getSuperClass()))) {
4768 Importer.ToDiag(Impl->getLocation(),
Gabor Marton410f32c2019-04-01 15:29:55 +00004769 diag::warn_odr_objc_superclass_inconsistent)
Craig Topperdcfc60f2014-05-07 06:57:44 +00004770 << Iface->getDeclName();
4771 // FIXME: It would be nice to have the location of the superclass
4772 // below.
4773 if (Impl->getSuperClass())
4774 Importer.ToDiag(Impl->getLocation(),
4775 diag::note_odr_objc_superclass)
4776 << Impl->getSuperClass()->getDeclName();
4777 else
4778 Importer.ToDiag(Impl->getLocation(),
4779 diag::note_odr_objc_missing_superclass);
4780 if (D->getSuperClass())
4781 Importer.FromDiag(D->getLocation(),
Douglas Gregorda8025c2010-12-07 01:26:03 +00004782 diag::note_odr_objc_superclass)
Craig Topperdcfc60f2014-05-07 06:57:44 +00004783 << D->getSuperClass()->getDeclName();
4784 else
4785 Importer.FromDiag(D->getLocation(),
Douglas Gregorda8025c2010-12-07 01:26:03 +00004786 diag::note_odr_objc_missing_superclass);
Balazs Keri3b30d652018-10-19 13:32:20 +00004787
4788 return make_error<ImportError>(ImportError::NameConflict);
Douglas Gregorda8025c2010-12-07 01:26:03 +00004789 }
4790 }
Fangrui Song6907ce22018-07-30 19:24:48 +00004791
Douglas Gregorda8025c2010-12-07 01:26:03 +00004792 // Import all of the members of this @implementation.
Balazs Keri3b30d652018-10-19 13:32:20 +00004793 if (Error Err = ImportDeclContext(D))
4794 return std::move(Err);
Douglas Gregorda8025c2010-12-07 01:26:03 +00004795
4796 return Impl;
4797}
4798
Balazs Keri3b30d652018-10-19 13:32:20 +00004799ExpectedDecl ASTNodeImporter::VisitObjCPropertyDecl(ObjCPropertyDecl *D) {
Douglas Gregora11c4582010-02-17 18:02:10 +00004800 // Import the major distinguishing characteristics of an @property.
4801 DeclContext *DC, *LexicalDC;
4802 DeclarationName Name;
4803 SourceLocation Loc;
Sean Callanan59721b32015-04-28 18:41:46 +00004804 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00004805 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
4806 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00004807 if (ToD)
4808 return ToD;
Douglas Gregora11c4582010-02-17 18:02:10 +00004809
4810 // Check whether we have already imported this property.
Gabor Marton54058b52018-12-17 13:53:12 +00004811 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00004812 for (auto *FoundDecl : FoundDecls) {
4813 if (auto *FoundProp = dyn_cast<ObjCPropertyDecl>(FoundDecl)) {
Douglas Gregora11c4582010-02-17 18:02:10 +00004814 // Check property types.
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00004815 if (!Importer.IsStructurallyEquivalent(D->getType(),
Douglas Gregora11c4582010-02-17 18:02:10 +00004816 FoundProp->getType())) {
Gabor Marton410f32c2019-04-01 15:29:55 +00004817 Importer.ToDiag(Loc, diag::warn_odr_objc_property_type_inconsistent)
Douglas Gregora11c4582010-02-17 18:02:10 +00004818 << Name << D->getType() << FoundProp->getType();
4819 Importer.ToDiag(FoundProp->getLocation(), diag::note_odr_value_here)
4820 << FoundProp->getType();
Balazs Keri3b30d652018-10-19 13:32:20 +00004821
4822 return make_error<ImportError>(ImportError::NameConflict);
Douglas Gregora11c4582010-02-17 18:02:10 +00004823 }
4824
4825 // FIXME: Check property attributes, getters, setters, etc.?
4826
4827 // Consider these properties to be equivalent.
Gabor Marton26f72a92018-07-12 09:42:05 +00004828 Importer.MapImported(D, FoundProp);
Douglas Gregora11c4582010-02-17 18:02:10 +00004829 return FoundProp;
4830 }
4831 }
4832
Balazs Keri3b30d652018-10-19 13:32:20 +00004833 QualType ToType;
4834 TypeSourceInfo *ToTypeSourceInfo;
4835 SourceLocation ToAtLoc, ToLParenLoc;
4836 if (auto Imp = importSeq(
4837 D->getType(), D->getTypeSourceInfo(), D->getAtLoc(), D->getLParenLoc()))
4838 std::tie(ToType, ToTypeSourceInfo, ToAtLoc, ToLParenLoc) = *Imp;
4839 else
4840 return Imp.takeError();
Douglas Gregora11c4582010-02-17 18:02:10 +00004841
4842 // Create the new property.
Gabor Marton26f72a92018-07-12 09:42:05 +00004843 ObjCPropertyDecl *ToProperty;
4844 if (GetImportedOrCreateDecl(
4845 ToProperty, D, Importer.getToContext(), DC, Loc,
Balazs Keri3b30d652018-10-19 13:32:20 +00004846 Name.getAsIdentifierInfo(), ToAtLoc,
4847 ToLParenLoc, ToType,
4848 ToTypeSourceInfo, D->getPropertyImplementation()))
Gabor Marton26f72a92018-07-12 09:42:05 +00004849 return ToProperty;
4850
Balazs Keri3b30d652018-10-19 13:32:20 +00004851 Selector ToGetterName, ToSetterName;
4852 SourceLocation ToGetterNameLoc, ToSetterNameLoc;
4853 ObjCMethodDecl *ToGetterMethodDecl, *ToSetterMethodDecl;
4854 ObjCIvarDecl *ToPropertyIvarDecl;
4855 if (auto Imp = importSeq(
4856 D->getGetterName(), D->getSetterName(),
4857 D->getGetterNameLoc(), D->getSetterNameLoc(),
4858 D->getGetterMethodDecl(), D->getSetterMethodDecl(),
4859 D->getPropertyIvarDecl()))
4860 std::tie(
4861 ToGetterName, ToSetterName,
4862 ToGetterNameLoc, ToSetterNameLoc,
4863 ToGetterMethodDecl, ToSetterMethodDecl,
4864 ToPropertyIvarDecl) = *Imp;
4865 else
4866 return Imp.takeError();
4867
Douglas Gregora11c4582010-02-17 18:02:10 +00004868 ToProperty->setLexicalDeclContext(LexicalDC);
Sean Callanan95e74be2011-10-21 02:57:43 +00004869 LexicalDC->addDeclInternal(ToProperty);
Douglas Gregora11c4582010-02-17 18:02:10 +00004870
4871 ToProperty->setPropertyAttributes(D->getPropertyAttributes());
Fariborz Jahanian3bf0ded2010-06-22 23:20:40 +00004872 ToProperty->setPropertyAttributesAsWritten(
4873 D->getPropertyAttributesAsWritten());
Balazs Keri3b30d652018-10-19 13:32:20 +00004874 ToProperty->setGetterName(ToGetterName, ToGetterNameLoc);
4875 ToProperty->setSetterName(ToSetterName, ToSetterNameLoc);
4876 ToProperty->setGetterMethodDecl(ToGetterMethodDecl);
4877 ToProperty->setSetterMethodDecl(ToSetterMethodDecl);
4878 ToProperty->setPropertyIvarDecl(ToPropertyIvarDecl);
Douglas Gregora11c4582010-02-17 18:02:10 +00004879 return ToProperty;
4880}
4881
Balazs Keri3b30d652018-10-19 13:32:20 +00004882ExpectedDecl
4883ASTNodeImporter::VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D) {
4884 ObjCPropertyDecl *Property;
4885 if (Error Err = importInto(Property, D->getPropertyDecl()))
4886 return std::move(Err);
Douglas Gregor14a49e22010-12-07 18:32:03 +00004887
Balazs Keri3b30d652018-10-19 13:32:20 +00004888 DeclContext *DC, *LexicalDC;
4889 if (Error Err = ImportDeclContext(D, DC, LexicalDC))
4890 return std::move(Err);
Craig Topper36250ad2014-05-12 05:36:57 +00004891
Balazs Keri3b30d652018-10-19 13:32:20 +00004892 auto *InImpl = cast<ObjCImplDecl>(LexicalDC);
Douglas Gregor14a49e22010-12-07 18:32:03 +00004893
4894 // Import the ivar (for an @synthesize).
Craig Topper36250ad2014-05-12 05:36:57 +00004895 ObjCIvarDecl *Ivar = nullptr;
Balazs Keri3b30d652018-10-19 13:32:20 +00004896 if (Error Err = importInto(Ivar, D->getPropertyIvarDecl()))
4897 return std::move(Err);
Douglas Gregor14a49e22010-12-07 18:32:03 +00004898
4899 ObjCPropertyImplDecl *ToImpl
Manman Ren5b786402016-01-28 18:49:28 +00004900 = InImpl->FindPropertyImplDecl(Property->getIdentifier(),
4901 Property->getQueryKind());
Gabor Marton26f72a92018-07-12 09:42:05 +00004902 if (!ToImpl) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004903 SourceLocation ToBeginLoc, ToLocation, ToPropertyIvarDeclLoc;
4904 if (auto Imp = importSeq(
4905 D->getBeginLoc(), D->getLocation(), D->getPropertyIvarDeclLoc()))
4906 std::tie(ToBeginLoc, ToLocation, ToPropertyIvarDeclLoc) = *Imp;
4907 else
4908 return Imp.takeError();
4909
Gabor Marton26f72a92018-07-12 09:42:05 +00004910 if (GetImportedOrCreateDecl(ToImpl, D, Importer.getToContext(), DC,
Balazs Keri3b30d652018-10-19 13:32:20 +00004911 ToBeginLoc,
4912 ToLocation, Property,
Gabor Marton26f72a92018-07-12 09:42:05 +00004913 D->getPropertyImplementation(), Ivar,
Balazs Keri3b30d652018-10-19 13:32:20 +00004914 ToPropertyIvarDeclLoc))
Gabor Marton26f72a92018-07-12 09:42:05 +00004915 return ToImpl;
4916
Douglas Gregor14a49e22010-12-07 18:32:03 +00004917 ToImpl->setLexicalDeclContext(LexicalDC);
Sean Callanan95e74be2011-10-21 02:57:43 +00004918 LexicalDC->addDeclInternal(ToImpl);
Douglas Gregor14a49e22010-12-07 18:32:03 +00004919 } else {
4920 // Check that we have the same kind of property implementation (@synthesize
4921 // vs. @dynamic).
4922 if (D->getPropertyImplementation() != ToImpl->getPropertyImplementation()) {
Fangrui Song6907ce22018-07-30 19:24:48 +00004923 Importer.ToDiag(ToImpl->getLocation(),
Gabor Marton410f32c2019-04-01 15:29:55 +00004924 diag::warn_odr_objc_property_impl_kind_inconsistent)
Fangrui Song6907ce22018-07-30 19:24:48 +00004925 << Property->getDeclName()
4926 << (ToImpl->getPropertyImplementation()
Douglas Gregor14a49e22010-12-07 18:32:03 +00004927 == ObjCPropertyImplDecl::Dynamic);
4928 Importer.FromDiag(D->getLocation(),
4929 diag::note_odr_objc_property_impl_kind)
4930 << D->getPropertyDecl()->getDeclName()
4931 << (D->getPropertyImplementation() == ObjCPropertyImplDecl::Dynamic);
Balazs Keri3b30d652018-10-19 13:32:20 +00004932
4933 return make_error<ImportError>(ImportError::NameConflict);
Douglas Gregor14a49e22010-12-07 18:32:03 +00004934 }
Fangrui Song6907ce22018-07-30 19:24:48 +00004935
4936 // For @synthesize, check that we have the same
Douglas Gregor14a49e22010-12-07 18:32:03 +00004937 if (D->getPropertyImplementation() == ObjCPropertyImplDecl::Synthesize &&
4938 Ivar != ToImpl->getPropertyIvarDecl()) {
Fangrui Song6907ce22018-07-30 19:24:48 +00004939 Importer.ToDiag(ToImpl->getPropertyIvarDeclLoc(),
Gabor Marton410f32c2019-04-01 15:29:55 +00004940 diag::warn_odr_objc_synthesize_ivar_inconsistent)
Douglas Gregor14a49e22010-12-07 18:32:03 +00004941 << Property->getDeclName()
4942 << ToImpl->getPropertyIvarDecl()->getDeclName()
4943 << Ivar->getDeclName();
Fangrui Song6907ce22018-07-30 19:24:48 +00004944 Importer.FromDiag(D->getPropertyIvarDeclLoc(),
Douglas Gregor14a49e22010-12-07 18:32:03 +00004945 diag::note_odr_objc_synthesize_ivar_here)
4946 << D->getPropertyIvarDecl()->getDeclName();
Balazs Keri3b30d652018-10-19 13:32:20 +00004947
4948 return make_error<ImportError>(ImportError::NameConflict);
Douglas Gregor14a49e22010-12-07 18:32:03 +00004949 }
Fangrui Song6907ce22018-07-30 19:24:48 +00004950
Douglas Gregor14a49e22010-12-07 18:32:03 +00004951 // Merge the existing implementation with the new implementation.
Gabor Marton26f72a92018-07-12 09:42:05 +00004952 Importer.MapImported(D, ToImpl);
Douglas Gregor14a49e22010-12-07 18:32:03 +00004953 }
Fangrui Song6907ce22018-07-30 19:24:48 +00004954
Douglas Gregor14a49e22010-12-07 18:32:03 +00004955 return ToImpl;
4956}
4957
Balazs Keri3b30d652018-10-19 13:32:20 +00004958ExpectedDecl
4959ASTNodeImporter::VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D) {
Douglas Gregora082a492010-11-30 19:14:50 +00004960 // For template arguments, we adopt the translation unit as our declaration
4961 // context. This context will be fixed when the actual template declaration
4962 // is created.
Fangrui Song6907ce22018-07-30 19:24:48 +00004963
Douglas Gregora082a492010-11-30 19:14:50 +00004964 // FIXME: Import default argument.
Balazs Keri3b30d652018-10-19 13:32:20 +00004965
4966 ExpectedSLoc BeginLocOrErr = import(D->getBeginLoc());
4967 if (!BeginLocOrErr)
4968 return BeginLocOrErr.takeError();
4969
4970 ExpectedSLoc LocationOrErr = import(D->getLocation());
4971 if (!LocationOrErr)
4972 return LocationOrErr.takeError();
4973
Gabor Marton26f72a92018-07-12 09:42:05 +00004974 TemplateTypeParmDecl *ToD = nullptr;
4975 (void)GetImportedOrCreateDecl(
4976 ToD, D, Importer.getToContext(),
4977 Importer.getToContext().getTranslationUnitDecl(),
Balazs Keri3b30d652018-10-19 13:32:20 +00004978 *BeginLocOrErr, *LocationOrErr,
Gabor Marton26f72a92018-07-12 09:42:05 +00004979 D->getDepth(), D->getIndex(), Importer.Import(D->getIdentifier()),
4980 D->wasDeclaredWithTypename(), D->isParameterPack());
4981 return ToD;
Douglas Gregora082a492010-11-30 19:14:50 +00004982}
4983
Balazs Keri3b30d652018-10-19 13:32:20 +00004984ExpectedDecl
Douglas Gregora082a492010-11-30 19:14:50 +00004985ASTNodeImporter::VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004986 DeclarationName ToDeclName;
4987 SourceLocation ToLocation, ToInnerLocStart;
4988 QualType ToType;
4989 TypeSourceInfo *ToTypeSourceInfo;
4990 if (auto Imp = importSeq(
4991 D->getDeclName(), D->getLocation(), D->getType(), D->getTypeSourceInfo(),
4992 D->getInnerLocStart()))
4993 std::tie(
4994 ToDeclName, ToLocation, ToType, ToTypeSourceInfo,
4995 ToInnerLocStart) = *Imp;
4996 else
4997 return Imp.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00004998
Douglas Gregora082a492010-11-30 19:14:50 +00004999 // FIXME: Import default argument.
Gabor Marton26f72a92018-07-12 09:42:05 +00005000
5001 NonTypeTemplateParmDecl *ToD = nullptr;
5002 (void)GetImportedOrCreateDecl(
5003 ToD, D, Importer.getToContext(),
5004 Importer.getToContext().getTranslationUnitDecl(),
Balazs Keri3b30d652018-10-19 13:32:20 +00005005 ToInnerLocStart, ToLocation, D->getDepth(),
5006 D->getPosition(), ToDeclName.getAsIdentifierInfo(), ToType,
5007 D->isParameterPack(), ToTypeSourceInfo);
Gabor Marton26f72a92018-07-12 09:42:05 +00005008 return ToD;
Douglas Gregora082a492010-11-30 19:14:50 +00005009}
5010
Balazs Keri3b30d652018-10-19 13:32:20 +00005011ExpectedDecl
Douglas Gregora082a492010-11-30 19:14:50 +00005012ASTNodeImporter::VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D) {
5013 // Import the name of this declaration.
Balazs Keri3b30d652018-10-19 13:32:20 +00005014 auto NameOrErr = import(D->getDeclName());
5015 if (!NameOrErr)
5016 return NameOrErr.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00005017
Douglas Gregora082a492010-11-30 19:14:50 +00005018 // Import the location of this declaration.
Balazs Keri3b30d652018-10-19 13:32:20 +00005019 ExpectedSLoc LocationOrErr = import(D->getLocation());
5020 if (!LocationOrErr)
5021 return LocationOrErr.takeError();
Gabor Marton26f72a92018-07-12 09:42:05 +00005022
Douglas Gregora082a492010-11-30 19:14:50 +00005023 // Import template parameters.
Balazs Keridec09162019-03-20 15:42:42 +00005024 auto TemplateParamsOrErr = import(D->getTemplateParameters());
Balazs Keri3b30d652018-10-19 13:32:20 +00005025 if (!TemplateParamsOrErr)
5026 return TemplateParamsOrErr.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00005027
Douglas Gregora082a492010-11-30 19:14:50 +00005028 // FIXME: Import default argument.
Gabor Marton26f72a92018-07-12 09:42:05 +00005029
5030 TemplateTemplateParmDecl *ToD = nullptr;
5031 (void)GetImportedOrCreateDecl(
5032 ToD, D, Importer.getToContext(),
Balazs Keri3b30d652018-10-19 13:32:20 +00005033 Importer.getToContext().getTranslationUnitDecl(), *LocationOrErr,
5034 D->getDepth(), D->getPosition(), D->isParameterPack(),
5035 (*NameOrErr).getAsIdentifierInfo(),
5036 *TemplateParamsOrErr);
Gabor Marton26f72a92018-07-12 09:42:05 +00005037 return ToD;
Douglas Gregora082a492010-11-30 19:14:50 +00005038}
5039
Gabor Marton16d98c22019-03-07 13:01:51 +00005040// Returns the definition for a (forward) declaration of a TemplateDecl, if
Gabor Marton9581c332018-05-23 13:53:36 +00005041// it has any definition in the redecl chain.
Gabor Marton16d98c22019-03-07 13:01:51 +00005042template <typename T> static auto getTemplateDefinition(T *D) -> T * {
5043 assert(D->getTemplatedDecl() && "Should be called on templates only");
5044 auto *ToTemplatedDef = D->getTemplatedDecl()->getDefinition();
Gabor Marton9581c332018-05-23 13:53:36 +00005045 if (!ToTemplatedDef)
5046 return nullptr;
Gabor Marton16d98c22019-03-07 13:01:51 +00005047 auto *TemplateWithDef = ToTemplatedDef->getDescribedTemplate();
5048 return cast_or_null<T>(TemplateWithDef);
Gabor Marton9581c332018-05-23 13:53:36 +00005049}
5050
Balazs Keri3b30d652018-10-19 13:32:20 +00005051ExpectedDecl ASTNodeImporter::VisitClassTemplateDecl(ClassTemplateDecl *D) {
Balazs Keri0c23dc52018-08-13 13:08:37 +00005052 bool IsFriend = D->getFriendObjectKind() != Decl::FOK_None;
5053
Douglas Gregora082a492010-11-30 19:14:50 +00005054 // Import the major distinguishing characteristics of this class template.
5055 DeclContext *DC, *LexicalDC;
5056 DeclarationName Name;
5057 SourceLocation Loc;
Sean Callanan59721b32015-04-28 18:41:46 +00005058 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00005059 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
5060 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00005061 if (ToD)
5062 return ToD;
Craig Topper36250ad2014-05-12 05:36:57 +00005063
Gabor Marton7df342a2018-12-17 12:42:12 +00005064 ClassTemplateDecl *FoundByLookup = nullptr;
5065
Douglas Gregora082a492010-11-30 19:14:50 +00005066 // We may already have a template of the same name; try to find and match it.
5067 if (!DC->isFunctionOrMethod()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005068 SmallVector<NamedDecl *, 4> ConflictingDecls;
Gabor Marton54058b52018-12-17 13:53:12 +00005069 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00005070 for (auto *FoundDecl : FoundDecls) {
Gabor Marton7df342a2018-12-17 12:42:12 +00005071 if (!FoundDecl->isInIdentifierNamespace(Decl::IDNS_Ordinary |
5072 Decl::IDNS_TagFriend))
Douglas Gregora082a492010-11-30 19:14:50 +00005073 continue;
Gabor Marton9581c332018-05-23 13:53:36 +00005074
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00005075 Decl *Found = FoundDecl;
Gabor Marton7df342a2018-12-17 12:42:12 +00005076 auto *FoundTemplate = dyn_cast<ClassTemplateDecl>(Found);
5077 if (FoundTemplate) {
Gabor Marton9581c332018-05-23 13:53:36 +00005078
Douglas Gregora082a492010-11-30 19:14:50 +00005079 if (IsStructuralMatch(D, FoundTemplate)) {
Gabor Marton16d98c22019-03-07 13:01:51 +00005080 ClassTemplateDecl *TemplateWithDef =
5081 getTemplateDefinition(FoundTemplate);
Balazs Keri2e160602019-08-12 10:07:38 +00005082 if (D->isThisDeclarationADefinition() && TemplateWithDef)
Gabor Marton7df342a2018-12-17 12:42:12 +00005083 return Importer.MapImported(D, TemplateWithDef);
Balazs Keri2e160602019-08-12 10:07:38 +00005084 if (!FoundByLookup)
5085 FoundByLookup = FoundTemplate;
5086 // Search in all matches because there may be multiple decl chains,
5087 // see ASTTests test ImportExistingFriendClassTemplateDef.
5088 continue;
Gabor Marton9581c332018-05-23 13:53:36 +00005089 }
Gabor Martonf035b752019-08-27 11:36:10 +00005090 ConflictingDecls.push_back(FoundDecl);
Douglas Gregora082a492010-11-30 19:14:50 +00005091 }
Douglas Gregora082a492010-11-30 19:14:50 +00005092 }
Gabor Marton9581c332018-05-23 13:53:36 +00005093
Douglas Gregora082a492010-11-30 19:14:50 +00005094 if (!ConflictingDecls.empty()) {
Gabor Martonf035b752019-08-27 11:36:10 +00005095 ExpectedName NameOrErr = Importer.HandleNameConflict(
5096 Name, DC, Decl::IDNS_Ordinary, ConflictingDecls.data(),
5097 ConflictingDecls.size());
5098 if (NameOrErr)
5099 Name = NameOrErr.get();
5100 else
5101 return NameOrErr.takeError();
Douglas Gregora082a492010-11-30 19:14:50 +00005102 }
Douglas Gregora082a492010-11-30 19:14:50 +00005103 }
5104
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00005105 CXXRecordDecl *FromTemplated = D->getTemplatedDecl();
5106
Douglas Gregora082a492010-11-30 19:14:50 +00005107 // Create the declaration that is being templated.
Balazs Keri3b30d652018-10-19 13:32:20 +00005108 CXXRecordDecl *ToTemplated;
5109 if (Error Err = importInto(ToTemplated, FromTemplated))
5110 return std::move(Err);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00005111
Douglas Gregora082a492010-11-30 19:14:50 +00005112 // Create the class template declaration itself.
Balazs Keridec09162019-03-20 15:42:42 +00005113 auto TemplateParamsOrErr = import(D->getTemplateParameters());
Balazs Keri3b30d652018-10-19 13:32:20 +00005114 if (!TemplateParamsOrErr)
5115 return TemplateParamsOrErr.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00005116
Gabor Marton26f72a92018-07-12 09:42:05 +00005117 ClassTemplateDecl *D2;
5118 if (GetImportedOrCreateDecl(D2, D, Importer.getToContext(), DC, Loc, Name,
Balazs Keri3b30d652018-10-19 13:32:20 +00005119 *TemplateParamsOrErr, ToTemplated))
Gabor Marton26f72a92018-07-12 09:42:05 +00005120 return D2;
5121
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00005122 ToTemplated->setDescribedClassTemplate(D2);
Fangrui Song6907ce22018-07-30 19:24:48 +00005123
Douglas Gregora082a492010-11-30 19:14:50 +00005124 D2->setAccess(D->getAccess());
5125 D2->setLexicalDeclContext(LexicalDC);
Gabor Marton7df342a2018-12-17 12:42:12 +00005126
5127 if (D->getDeclContext()->containsDeclAndLoad(D))
5128 DC->addDeclInternal(D2);
5129 if (DC != LexicalDC && D->getLexicalDeclContext()->containsDeclAndLoad(D))
Balazs Keri0c23dc52018-08-13 13:08:37 +00005130 LexicalDC->addDeclInternal(D2);
Fangrui Song6907ce22018-07-30 19:24:48 +00005131
Gabor Marton7df342a2018-12-17 12:42:12 +00005132 if (FoundByLookup) {
5133 auto *Recent =
5134 const_cast<ClassTemplateDecl *>(FoundByLookup->getMostRecentDecl());
5135
5136 // It is possible that during the import of the class template definition
5137 // we start the import of a fwd friend decl of the very same class template
5138 // and we add the fwd friend decl to the lookup table. But the ToTemplated
5139 // had been created earlier and by that time the lookup could not find
5140 // anything existing, so it has no previous decl. Later, (still during the
5141 // import of the fwd friend decl) we start to import the definition again
5142 // and this time the lookup finds the previous fwd friend class template.
5143 // In this case we must set up the previous decl for the templated decl.
5144 if (!ToTemplated->getPreviousDecl()) {
Gabor Marton16d98c22019-03-07 13:01:51 +00005145 assert(FoundByLookup->getTemplatedDecl() &&
5146 "Found decl must have its templated decl set");
Gabor Marton7df342a2018-12-17 12:42:12 +00005147 CXXRecordDecl *PrevTemplated =
5148 FoundByLookup->getTemplatedDecl()->getMostRecentDecl();
5149 if (ToTemplated != PrevTemplated)
5150 ToTemplated->setPreviousDecl(PrevTemplated);
5151 }
5152
5153 D2->setPreviousDecl(Recent);
5154 }
5155
5156 if (LexicalDC != DC && IsFriend)
5157 DC->makeDeclVisibleInContext(D2);
5158
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00005159 if (FromTemplated->isCompleteDefinition() &&
5160 !ToTemplated->isCompleteDefinition()) {
Douglas Gregora082a492010-11-30 19:14:50 +00005161 // FIXME: Import definition!
5162 }
Fangrui Song6907ce22018-07-30 19:24:48 +00005163
Douglas Gregora082a492010-11-30 19:14:50 +00005164 return D2;
5165}
5166
Balazs Keri3b30d652018-10-19 13:32:20 +00005167ExpectedDecl ASTNodeImporter::VisitClassTemplateSpecializationDecl(
Douglas Gregore2e50d332010-12-01 01:36:18 +00005168 ClassTemplateSpecializationDecl *D) {
Balazs Keri3b30d652018-10-19 13:32:20 +00005169 ClassTemplateDecl *ClassTemplate;
5170 if (Error Err = importInto(ClassTemplate, D->getSpecializedTemplate()))
5171 return std::move(Err);
Craig Topper36250ad2014-05-12 05:36:57 +00005172
Douglas Gregore2e50d332010-12-01 01:36:18 +00005173 // Import the context of this declaration.
Balazs Keri3b30d652018-10-19 13:32:20 +00005174 DeclContext *DC, *LexicalDC;
5175 if (Error Err = ImportDeclContext(D, DC, LexicalDC))
5176 return std::move(Err);
Douglas Gregore2e50d332010-12-01 01:36:18 +00005177
5178 // Import template arguments.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005179 SmallVector<TemplateArgument, 2> TemplateArgs;
Balazs Keri3b30d652018-10-19 13:32:20 +00005180 if (Error Err = ImportTemplateArguments(
5181 D->getTemplateArgs().data(), D->getTemplateArgs().size(), TemplateArgs))
5182 return std::move(Err);
Craig Topper36250ad2014-05-12 05:36:57 +00005183
Douglas Gregore2e50d332010-12-01 01:36:18 +00005184 // Try to find an existing specialization with these template arguments.
Craig Topper36250ad2014-05-12 05:36:57 +00005185 void *InsertPos = nullptr;
Gabor Marton7f8c4002019-03-19 13:34:10 +00005186 ClassTemplateSpecializationDecl *PrevDecl = nullptr;
Gabor Marton42e15de2018-08-22 11:52:14 +00005187 ClassTemplatePartialSpecializationDecl *PartialSpec =
5188 dyn_cast<ClassTemplatePartialSpecializationDecl>(D);
5189 if (PartialSpec)
Gabor Marton7f8c4002019-03-19 13:34:10 +00005190 PrevDecl =
5191 ClassTemplate->findPartialSpecialization(TemplateArgs, InsertPos);
Gabor Marton42e15de2018-08-22 11:52:14 +00005192 else
Gabor Marton7f8c4002019-03-19 13:34:10 +00005193 PrevDecl = ClassTemplate->findSpecialization(TemplateArgs, InsertPos);
Gabor Marton42e15de2018-08-22 11:52:14 +00005194
Gabor Marton7f8c4002019-03-19 13:34:10 +00005195 if (PrevDecl) {
5196 if (IsStructuralMatch(D, PrevDecl)) {
5197 if (D->isThisDeclarationADefinition() && PrevDecl->getDefinition()) {
5198 Importer.MapImported(D, PrevDecl->getDefinition());
5199 // Import those default field initializers which have been
5200 // instantiated in the "From" context, but not in the "To" context.
Gabor Marton5ac6d492019-05-15 10:29:48 +00005201 for (auto *FromField : D->fields()) {
5202 auto ToOrErr = import(FromField);
5203 if (!ToOrErr)
5204 return ToOrErr.takeError();
5205 }
Gabor Marton42e15de2018-08-22 11:52:14 +00005206
Gabor Marton7f8c4002019-03-19 13:34:10 +00005207 // Import those methods which have been instantiated in the
5208 // "From" context, but not in the "To" context.
Gabor Marton5ac6d492019-05-15 10:29:48 +00005209 for (CXXMethodDecl *FromM : D->methods()) {
5210 auto ToOrErr = import(FromM);
5211 if (!ToOrErr)
5212 return ToOrErr.takeError();
5213 }
Gabor Marton42e15de2018-08-22 11:52:14 +00005214
Gabor Marton7f8c4002019-03-19 13:34:10 +00005215 // TODO Import instantiated default arguments.
5216 // TODO Import instantiated exception specifications.
5217 //
5218 // Generally, ASTCommon.h/DeclUpdateKind enum gives a very good hint
5219 // what else could be fused during an AST merge.
5220 return PrevDecl;
Balazs Keri3b30d652018-10-19 13:32:20 +00005221 }
Gabor Marton7f8c4002019-03-19 13:34:10 +00005222 } else { // ODR violation.
5223 // FIXME HandleNameConflict
Gabor Marton303c98612019-06-25 08:00:51 +00005224 return make_error<ImportError>(ImportError::NameConflict);
Gabor Marton42e15de2018-08-22 11:52:14 +00005225 }
Gabor Marton7f8c4002019-03-19 13:34:10 +00005226 }
Balazs Keri3b30d652018-10-19 13:32:20 +00005227
Gabor Marton7f8c4002019-03-19 13:34:10 +00005228 // Import the location of this declaration.
5229 ExpectedSLoc BeginLocOrErr = import(D->getBeginLoc());
5230 if (!BeginLocOrErr)
5231 return BeginLocOrErr.takeError();
5232 ExpectedSLoc IdLocOrErr = import(D->getLocation());
5233 if (!IdLocOrErr)
5234 return IdLocOrErr.takeError();
Balazs Keri3b30d652018-10-19 13:32:20 +00005235
Gabor Marton7f8c4002019-03-19 13:34:10 +00005236 // Create the specialization.
5237 ClassTemplateSpecializationDecl *D2 = nullptr;
5238 if (PartialSpec) {
5239 // Import TemplateArgumentListInfo.
5240 TemplateArgumentListInfo ToTAInfo;
5241 const auto &ASTTemplateArgs = *PartialSpec->getTemplateArgsAsWritten();
5242 if (Error Err = ImportTemplateArgumentListInfo(ASTTemplateArgs, ToTAInfo))
5243 return std::move(Err);
Aleksei Sidorin855086d2017-01-23 09:30:36 +00005244
Gabor Marton7f8c4002019-03-19 13:34:10 +00005245 QualType CanonInjType;
5246 if (Error Err = importInto(
5247 CanonInjType, PartialSpec->getInjectedSpecializationType()))
5248 return std::move(Err);
5249 CanonInjType = CanonInjType.getCanonicalType();
Aleksei Sidorin855086d2017-01-23 09:30:36 +00005250
Balazs Keridec09162019-03-20 15:42:42 +00005251 auto ToTPListOrErr = import(PartialSpec->getTemplateParameters());
Gabor Marton7f8c4002019-03-19 13:34:10 +00005252 if (!ToTPListOrErr)
5253 return ToTPListOrErr.takeError();
Aleksei Sidorin855086d2017-01-23 09:30:36 +00005254
Gabor Marton7f8c4002019-03-19 13:34:10 +00005255 if (GetImportedOrCreateDecl<ClassTemplatePartialSpecializationDecl>(
5256 D2, D, Importer.getToContext(), D->getTagKind(), DC,
5257 *BeginLocOrErr, *IdLocOrErr, *ToTPListOrErr, ClassTemplate,
5258 llvm::makeArrayRef(TemplateArgs.data(), TemplateArgs.size()),
5259 ToTAInfo, CanonInjType,
5260 cast_or_null<ClassTemplatePartialSpecializationDecl>(PrevDecl)))
5261 return D2;
Aleksei Sidorin855086d2017-01-23 09:30:36 +00005262
Gabor Marton7f8c4002019-03-19 13:34:10 +00005263 // Update InsertPos, because preceding import calls may have invalidated
5264 // it by adding new specializations.
5265 if (!ClassTemplate->findPartialSpecialization(TemplateArgs, InsertPos))
5266 // Add this partial specialization to the class template.
5267 ClassTemplate->AddPartialSpecialization(
5268 cast<ClassTemplatePartialSpecializationDecl>(D2), InsertPos);
Gabor Marton42e15de2018-08-22 11:52:14 +00005269
Gabor Marton7f8c4002019-03-19 13:34:10 +00005270 } else { // Not a partial specialization.
5271 if (GetImportedOrCreateDecl(
5272 D2, D, Importer.getToContext(), D->getTagKind(), DC,
5273 *BeginLocOrErr, *IdLocOrErr, ClassTemplate, TemplateArgs,
5274 PrevDecl))
5275 return D2;
Gabor Marton42e15de2018-08-22 11:52:14 +00005276
Gabor Marton7f8c4002019-03-19 13:34:10 +00005277 // Update InsertPos, because preceding import calls may have invalidated
5278 // it by adding new specializations.
5279 if (!ClassTemplate->findSpecialization(TemplateArgs, InsertPos))
5280 // Add this specialization to the class template.
5281 ClassTemplate->AddSpecialization(D2, InsertPos);
5282 }
Aleksei Sidorin855086d2017-01-23 09:30:36 +00005283
Gabor Marton7f8c4002019-03-19 13:34:10 +00005284 D2->setSpecializationKind(D->getSpecializationKind());
Douglas Gregore2e50d332010-12-01 01:36:18 +00005285
Gabor Marton7f8c4002019-03-19 13:34:10 +00005286 // Set the context of this specialization/instantiation.
5287 D2->setLexicalDeclContext(LexicalDC);
5288
5289 // Add to the DC only if it was an explicit specialization/instantiation.
5290 if (D2->isExplicitInstantiationOrSpecialization()) {
5291 LexicalDC->addDeclInternal(D2);
5292 }
5293
5294 // Import the qualifier, if any.
5295 if (auto LocOrErr = import(D->getQualifierLoc()))
5296 D2->setQualifierInfo(*LocOrErr);
5297 else
5298 return LocOrErr.takeError();
5299
5300 if (auto *TSI = D->getTypeAsWritten()) {
5301 if (auto TInfoOrErr = import(TSI))
5302 D2->setTypeAsWritten(*TInfoOrErr);
5303 else
5304 return TInfoOrErr.takeError();
5305
5306 if (auto LocOrErr = import(D->getTemplateKeywordLoc()))
5307 D2->setTemplateKeywordLoc(*LocOrErr);
Balazs Keri3b30d652018-10-19 13:32:20 +00005308 else
5309 return LocOrErr.takeError();
Aleksei Sidorin855086d2017-01-23 09:30:36 +00005310
Gabor Marton7f8c4002019-03-19 13:34:10 +00005311 if (auto LocOrErr = import(D->getExternLoc()))
5312 D2->setExternLoc(*LocOrErr);
5313 else
5314 return LocOrErr.takeError();
Douglas Gregore2e50d332010-12-01 01:36:18 +00005315 }
Gabor Marton7f8c4002019-03-19 13:34:10 +00005316
5317 if (D->getPointOfInstantiation().isValid()) {
5318 if (auto POIOrErr = import(D->getPointOfInstantiation()))
5319 D2->setPointOfInstantiation(*POIOrErr);
5320 else
5321 return POIOrErr.takeError();
5322 }
5323
5324 D2->setTemplateSpecializationKind(D->getTemplateSpecializationKind());
5325
Balazs Keri3b30d652018-10-19 13:32:20 +00005326 if (D->isCompleteDefinition())
5327 if (Error Err = ImportDefinition(D, D2))
5328 return std::move(Err);
Craig Topper36250ad2014-05-12 05:36:57 +00005329
Douglas Gregore2e50d332010-12-01 01:36:18 +00005330 return D2;
5331}
5332
Balazs Keri3b30d652018-10-19 13:32:20 +00005333ExpectedDecl ASTNodeImporter::VisitVarTemplateDecl(VarTemplateDecl *D) {
Larisse Voufo39a1e502013-08-06 01:03:05 +00005334 // If this variable has a definition in the translation unit we're coming
5335 // from,
5336 // but this particular declaration is not that definition, import the
5337 // definition and map to that.
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00005338 auto *Definition =
Larisse Voufo39a1e502013-08-06 01:03:05 +00005339 cast_or_null<VarDecl>(D->getTemplatedDecl()->getDefinition());
5340 if (Definition && Definition != D->getTemplatedDecl()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00005341 if (ExpectedDecl ImportedDefOrErr = import(
5342 Definition->getDescribedVarTemplate()))
5343 return Importer.MapImported(D, *ImportedDefOrErr);
5344 else
5345 return ImportedDefOrErr.takeError();
Larisse Voufo39a1e502013-08-06 01:03:05 +00005346 }
5347
5348 // Import the major distinguishing characteristics of this variable template.
5349 DeclContext *DC, *LexicalDC;
5350 DeclarationName Name;
5351 SourceLocation Loc;
Sean Callanan59721b32015-04-28 18:41:46 +00005352 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00005353 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
5354 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00005355 if (ToD)
5356 return ToD;
Larisse Voufo39a1e502013-08-06 01:03:05 +00005357
5358 // We may already have a template of the same name; try to find and match it.
5359 assert(!DC->isFunctionOrMethod() &&
5360 "Variable templates cannot be declared at function scope");
5361 SmallVector<NamedDecl *, 4> ConflictingDecls;
Gabor Marton54058b52018-12-17 13:53:12 +00005362 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00005363 for (auto *FoundDecl : FoundDecls) {
5364 if (!FoundDecl->isInIdentifierNamespace(Decl::IDNS_Ordinary))
Larisse Voufo39a1e502013-08-06 01:03:05 +00005365 continue;
5366
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00005367 Decl *Found = FoundDecl;
Balazs Keri3b30d652018-10-19 13:32:20 +00005368 if (VarTemplateDecl *FoundTemplate = dyn_cast<VarTemplateDecl>(Found)) {
Larisse Voufo39a1e502013-08-06 01:03:05 +00005369 if (IsStructuralMatch(D, FoundTemplate)) {
5370 // The variable templates structurally match; call it the same template.
Gabor Marton26f72a92018-07-12 09:42:05 +00005371 Importer.MapImported(D->getTemplatedDecl(),
5372 FoundTemplate->getTemplatedDecl());
5373 return Importer.MapImported(D, FoundTemplate);
Larisse Voufo39a1e502013-08-06 01:03:05 +00005374 }
Gabor Martonf035b752019-08-27 11:36:10 +00005375 ConflictingDecls.push_back(FoundDecl);
Larisse Voufo39a1e502013-08-06 01:03:05 +00005376 }
Larisse Voufo39a1e502013-08-06 01:03:05 +00005377 }
5378
5379 if (!ConflictingDecls.empty()) {
Gabor Martonf035b752019-08-27 11:36:10 +00005380 ExpectedName NameOrErr = Importer.HandleNameConflict(
5381 Name, DC, Decl::IDNS_Ordinary, ConflictingDecls.data(),
5382 ConflictingDecls.size());
5383 if (NameOrErr)
5384 Name = NameOrErr.get();
5385 else
5386 return NameOrErr.takeError();
Larisse Voufo39a1e502013-08-06 01:03:05 +00005387 }
5388
Larisse Voufo39a1e502013-08-06 01:03:05 +00005389 VarDecl *DTemplated = D->getTemplatedDecl();
5390
5391 // Import the type.
Balazs Keri3b30d652018-10-19 13:32:20 +00005392 // FIXME: Value not used?
5393 ExpectedType TypeOrErr = import(DTemplated->getType());
5394 if (!TypeOrErr)
5395 return TypeOrErr.takeError();
Larisse Voufo39a1e502013-08-06 01:03:05 +00005396
5397 // Create the declaration that is being templated.
Balazs Keri3b30d652018-10-19 13:32:20 +00005398 VarDecl *ToTemplated;
5399 if (Error Err = importInto(ToTemplated, DTemplated))
5400 return std::move(Err);
Larisse Voufo39a1e502013-08-06 01:03:05 +00005401
5402 // Create the variable template declaration itself.
Balazs Keridec09162019-03-20 15:42:42 +00005403 auto TemplateParamsOrErr = import(D->getTemplateParameters());
Balazs Keri3b30d652018-10-19 13:32:20 +00005404 if (!TemplateParamsOrErr)
5405 return TemplateParamsOrErr.takeError();
Larisse Voufo39a1e502013-08-06 01:03:05 +00005406
Gabor Marton26f72a92018-07-12 09:42:05 +00005407 VarTemplateDecl *ToVarTD;
5408 if (GetImportedOrCreateDecl(ToVarTD, D, Importer.getToContext(), DC, Loc,
Balazs Keri3b30d652018-10-19 13:32:20 +00005409 Name, *TemplateParamsOrErr, ToTemplated))
Gabor Marton26f72a92018-07-12 09:42:05 +00005410 return ToVarTD;
5411
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005412 ToTemplated->setDescribedVarTemplate(ToVarTD);
Larisse Voufo39a1e502013-08-06 01:03:05 +00005413
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005414 ToVarTD->setAccess(D->getAccess());
5415 ToVarTD->setLexicalDeclContext(LexicalDC);
5416 LexicalDC->addDeclInternal(ToVarTD);
Larisse Voufo39a1e502013-08-06 01:03:05 +00005417
Larisse Voufo39a1e502013-08-06 01:03:05 +00005418 if (DTemplated->isThisDeclarationADefinition() &&
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005419 !ToTemplated->isThisDeclarationADefinition()) {
Larisse Voufo39a1e502013-08-06 01:03:05 +00005420 // FIXME: Import definition!
5421 }
5422
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005423 return ToVarTD;
Larisse Voufo39a1e502013-08-06 01:03:05 +00005424}
5425
Balazs Keri3b30d652018-10-19 13:32:20 +00005426ExpectedDecl ASTNodeImporter::VisitVarTemplateSpecializationDecl(
Larisse Voufo39a1e502013-08-06 01:03:05 +00005427 VarTemplateSpecializationDecl *D) {
5428 // If this record has a definition in the translation unit we're coming from,
5429 // but this particular declaration is not that definition, import the
5430 // definition and map to that.
5431 VarDecl *Definition = D->getDefinition();
5432 if (Definition && Definition != D) {
Balazs Keri3b30d652018-10-19 13:32:20 +00005433 if (ExpectedDecl ImportedDefOrErr = import(Definition))
5434 return Importer.MapImported(D, *ImportedDefOrErr);
5435 else
5436 return ImportedDefOrErr.takeError();
Larisse Voufo39a1e502013-08-06 01:03:05 +00005437 }
5438
Simon Pilgrim4c146ab2019-05-18 11:33:27 +00005439 VarTemplateDecl *VarTemplate = nullptr;
Balazs Keri3b30d652018-10-19 13:32:20 +00005440 if (Error Err = importInto(VarTemplate, D->getSpecializedTemplate()))
5441 return std::move(Err);
Larisse Voufo39a1e502013-08-06 01:03:05 +00005442
5443 // Import the context of this declaration.
Balazs Keri3b30d652018-10-19 13:32:20 +00005444 DeclContext *DC, *LexicalDC;
5445 if (Error Err = ImportDeclContext(D, DC, LexicalDC))
5446 return std::move(Err);
Larisse Voufo39a1e502013-08-06 01:03:05 +00005447
5448 // Import the location of this declaration.
Balazs Keri3b30d652018-10-19 13:32:20 +00005449 ExpectedSLoc BeginLocOrErr = import(D->getBeginLoc());
5450 if (!BeginLocOrErr)
5451 return BeginLocOrErr.takeError();
5452
5453 auto IdLocOrErr = import(D->getLocation());
5454 if (!IdLocOrErr)
5455 return IdLocOrErr.takeError();
Larisse Voufo39a1e502013-08-06 01:03:05 +00005456
5457 // Import template arguments.
5458 SmallVector<TemplateArgument, 2> TemplateArgs;
Balazs Keri3b30d652018-10-19 13:32:20 +00005459 if (Error Err = ImportTemplateArguments(
5460 D->getTemplateArgs().data(), D->getTemplateArgs().size(), TemplateArgs))
5461 return std::move(Err);
Larisse Voufo39a1e502013-08-06 01:03:05 +00005462
5463 // Try to find an existing specialization with these template arguments.
Craig Topper36250ad2014-05-12 05:36:57 +00005464 void *InsertPos = nullptr;
Larisse Voufo39a1e502013-08-06 01:03:05 +00005465 VarTemplateSpecializationDecl *D2 = VarTemplate->findSpecialization(
Craig Topper7e0daca2014-06-26 04:58:53 +00005466 TemplateArgs, InsertPos);
Larisse Voufo39a1e502013-08-06 01:03:05 +00005467 if (D2) {
5468 // We already have a variable template specialization with these template
5469 // arguments.
5470
5471 // FIXME: Check for specialization vs. instantiation errors.
5472
5473 if (VarDecl *FoundDef = D2->getDefinition()) {
5474 if (!D->isThisDeclarationADefinition() ||
5475 IsStructuralMatch(D, FoundDef)) {
5476 // The record types structurally match, or the "from" translation
5477 // unit only had a forward declaration anyway; call it the same
5478 // variable.
Gabor Marton26f72a92018-07-12 09:42:05 +00005479 return Importer.MapImported(D, FoundDef);
Larisse Voufo39a1e502013-08-06 01:03:05 +00005480 }
5481 }
5482 } else {
Larisse Voufo39a1e502013-08-06 01:03:05 +00005483 // Import the type.
Balazs Keri3b30d652018-10-19 13:32:20 +00005484 QualType T;
5485 if (Error Err = importInto(T, D->getType()))
5486 return std::move(Err);
Larisse Voufo39a1e502013-08-06 01:03:05 +00005487
Balazs Keri3b30d652018-10-19 13:32:20 +00005488 auto TInfoOrErr = import(D->getTypeSourceInfo());
5489 if (!TInfoOrErr)
5490 return TInfoOrErr.takeError();
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005491
5492 TemplateArgumentListInfo ToTAInfo;
Balazs Keri3b30d652018-10-19 13:32:20 +00005493 if (Error Err = ImportTemplateArgumentListInfo(
5494 D->getTemplateArgsInfo(), ToTAInfo))
5495 return std::move(Err);
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005496
5497 using PartVarSpecDecl = VarTemplatePartialSpecializationDecl;
Larisse Voufo39a1e502013-08-06 01:03:05 +00005498 // Create a new specialization.
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005499 if (auto *FromPartial = dyn_cast<PartVarSpecDecl>(D)) {
5500 // Import TemplateArgumentListInfo
5501 TemplateArgumentListInfo ArgInfos;
5502 const auto *FromTAArgsAsWritten = FromPartial->getTemplateArgsAsWritten();
5503 // NOTE: FromTAArgsAsWritten and template parameter list are non-null.
Balazs Keri3b30d652018-10-19 13:32:20 +00005504 if (Error Err = ImportTemplateArgumentListInfo(
5505 *FromTAArgsAsWritten, ArgInfos))
5506 return std::move(Err);
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005507
Balazs Keridec09162019-03-20 15:42:42 +00005508 auto ToTPListOrErr = import(FromPartial->getTemplateParameters());
Balazs Keri3b30d652018-10-19 13:32:20 +00005509 if (!ToTPListOrErr)
5510 return ToTPListOrErr.takeError();
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005511
Gabor Marton26f72a92018-07-12 09:42:05 +00005512 PartVarSpecDecl *ToPartial;
5513 if (GetImportedOrCreateDecl(ToPartial, D, Importer.getToContext(), DC,
Balazs Keri3b30d652018-10-19 13:32:20 +00005514 *BeginLocOrErr, *IdLocOrErr, *ToTPListOrErr,
5515 VarTemplate, T, *TInfoOrErr,
5516 D->getStorageClass(), TemplateArgs, ArgInfos))
Gabor Marton26f72a92018-07-12 09:42:05 +00005517 return ToPartial;
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005518
Balazs Keri3b30d652018-10-19 13:32:20 +00005519 if (Expected<PartVarSpecDecl *> ToInstOrErr = import(
5520 FromPartial->getInstantiatedFromMember()))
5521 ToPartial->setInstantiatedFromMember(*ToInstOrErr);
5522 else
5523 return ToInstOrErr.takeError();
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005524
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005525 if (FromPartial->isMemberSpecialization())
5526 ToPartial->setMemberSpecialization();
5527
5528 D2 = ToPartial;
Balazs Keri3b30d652018-10-19 13:32:20 +00005529
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005530 } else { // Full specialization
Balazs Keri3b30d652018-10-19 13:32:20 +00005531 if (GetImportedOrCreateDecl(D2, D, Importer.getToContext(), DC,
5532 *BeginLocOrErr, *IdLocOrErr, VarTemplate,
5533 T, *TInfoOrErr,
Gabor Marton26f72a92018-07-12 09:42:05 +00005534 D->getStorageClass(), TemplateArgs))
5535 return D2;
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005536 }
5537
Balazs Keri3b30d652018-10-19 13:32:20 +00005538 if (D->getPointOfInstantiation().isValid()) {
5539 if (ExpectedSLoc POIOrErr = import(D->getPointOfInstantiation()))
5540 D2->setPointOfInstantiation(*POIOrErr);
5541 else
5542 return POIOrErr.takeError();
5543 }
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005544
Larisse Voufo39a1e502013-08-06 01:03:05 +00005545 D2->setSpecializationKind(D->getSpecializationKind());
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005546 D2->setTemplateArgsInfo(ToTAInfo);
Larisse Voufo39a1e502013-08-06 01:03:05 +00005547
5548 // Add this specialization to the class template.
5549 VarTemplate->AddSpecialization(D2, InsertPos);
5550
5551 // Import the qualifier, if any.
Balazs Keri3b30d652018-10-19 13:32:20 +00005552 if (auto LocOrErr = import(D->getQualifierLoc()))
5553 D2->setQualifierInfo(*LocOrErr);
5554 else
5555 return LocOrErr.takeError();
Larisse Voufo39a1e502013-08-06 01:03:05 +00005556
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005557 if (D->isConstexpr())
5558 D2->setConstexpr(true);
5559
Larisse Voufo39a1e502013-08-06 01:03:05 +00005560 // Add the specialization to this context.
5561 D2->setLexicalDeclContext(LexicalDC);
5562 LexicalDC->addDeclInternal(D2);
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005563
5564 D2->setAccess(D->getAccess());
Larisse Voufo39a1e502013-08-06 01:03:05 +00005565 }
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005566
Balazs Keri3b30d652018-10-19 13:32:20 +00005567 if (Error Err = ImportInitializer(D, D2))
5568 return std::move(Err);
Larisse Voufo39a1e502013-08-06 01:03:05 +00005569
5570 return D2;
5571}
5572
Balazs Keri3b30d652018-10-19 13:32:20 +00005573ExpectedDecl
5574ASTNodeImporter::VisitFunctionTemplateDecl(FunctionTemplateDecl *D) {
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00005575 DeclContext *DC, *LexicalDC;
5576 DeclarationName Name;
5577 SourceLocation Loc;
5578 NamedDecl *ToD;
5579
Balazs Keri3b30d652018-10-19 13:32:20 +00005580 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
5581 return std::move(Err);
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00005582
5583 if (ToD)
5584 return ToD;
5585
Gabor Marton16d98c22019-03-07 13:01:51 +00005586 const FunctionTemplateDecl *FoundByLookup = nullptr;
5587
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00005588 // Try to find a function in our own ("to") context with the same name, same
5589 // type, and in the same context as the function we're importing.
Gabor Marton16d98c22019-03-07 13:01:51 +00005590 // FIXME Split this into a separate function.
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00005591 if (!LexicalDC->isFunctionOrMethod()) {
Gabor Martone331e632019-02-18 13:09:27 +00005592 unsigned IDNS = Decl::IDNS_Ordinary | Decl::IDNS_OrdinaryFriend;
Gabor Marton54058b52018-12-17 13:53:12 +00005593 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00005594 for (auto *FoundDecl : FoundDecls) {
5595 if (!FoundDecl->isInIdentifierNamespace(IDNS))
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00005596 continue;
5597
Gabor Marton16d98c22019-03-07 13:01:51 +00005598 if (auto *FoundTemplate = dyn_cast<FunctionTemplateDecl>(FoundDecl)) {
Balazs Kerif8a89c82019-09-13 08:03:49 +00005599 if (!hasSameVisibilityContext(FoundTemplate, D))
5600 continue;
5601 if (IsStructuralMatch(D, FoundTemplate)) {
5602 FunctionTemplateDecl *TemplateWithDef =
5603 getTemplateDefinition(FoundTemplate);
5604 if (D->isThisDeclarationADefinition() && TemplateWithDef)
5605 return Importer.MapImported(D, TemplateWithDef);
5606
5607 FoundByLookup = FoundTemplate;
5608 break;
Gabor Marton16d98c22019-03-07 13:01:51 +00005609 // TODO: handle conflicting names
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00005610 }
5611 }
5612 }
5613 }
5614
Balazs Keridec09162019-03-20 15:42:42 +00005615 auto ParamsOrErr = import(D->getTemplateParameters());
Balazs Keri3b30d652018-10-19 13:32:20 +00005616 if (!ParamsOrErr)
5617 return ParamsOrErr.takeError();
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00005618
Balazs Keri3b30d652018-10-19 13:32:20 +00005619 FunctionDecl *TemplatedFD;
5620 if (Error Err = importInto(TemplatedFD, D->getTemplatedDecl()))
5621 return std::move(Err);
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00005622
Gabor Marton26f72a92018-07-12 09:42:05 +00005623 FunctionTemplateDecl *ToFunc;
5624 if (GetImportedOrCreateDecl(ToFunc, D, Importer.getToContext(), DC, Loc, Name,
Balazs Keri3b30d652018-10-19 13:32:20 +00005625 *ParamsOrErr, TemplatedFD))
Gabor Marton26f72a92018-07-12 09:42:05 +00005626 return ToFunc;
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00005627
5628 TemplatedFD->setDescribedFunctionTemplate(ToFunc);
Gabor Marton16d98c22019-03-07 13:01:51 +00005629
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00005630 ToFunc->setAccess(D->getAccess());
5631 ToFunc->setLexicalDeclContext(LexicalDC);
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00005632 LexicalDC->addDeclInternal(ToFunc);
Gabor Marton16d98c22019-03-07 13:01:51 +00005633
5634 if (FoundByLookup) {
5635 auto *Recent =
5636 const_cast<FunctionTemplateDecl *>(FoundByLookup->getMostRecentDecl());
5637 if (!TemplatedFD->getPreviousDecl()) {
5638 assert(FoundByLookup->getTemplatedDecl() &&
5639 "Found decl must have its templated decl set");
5640 auto *PrevTemplated =
5641 FoundByLookup->getTemplatedDecl()->getMostRecentDecl();
5642 if (TemplatedFD != PrevTemplated)
5643 TemplatedFD->setPreviousDecl(PrevTemplated);
5644 }
5645 ToFunc->setPreviousDecl(Recent);
5646 }
5647
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00005648 return ToFunc;
5649}
5650
Douglas Gregor7eeb5972010-02-11 19:21:55 +00005651//----------------------------------------------------------------------------
5652// Import Statements
5653//----------------------------------------------------------------------------
5654
Balazs Keri3b30d652018-10-19 13:32:20 +00005655ExpectedStmt ASTNodeImporter::VisitStmt(Stmt *S) {
Stephen Kellyf2ceec42018-08-09 21:08:08 +00005656 Importer.FromDiag(S->getBeginLoc(), diag::err_unsupported_ast_node)
5657 << S->getStmtClassName();
Balazs Keri3b30d652018-10-19 13:32:20 +00005658 return make_error<ImportError>(ImportError::UnsupportedConstruct);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00005659}
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00005660
Balazs Keri3b30d652018-10-19 13:32:20 +00005661
5662ExpectedStmt ASTNodeImporter::VisitGCCAsmStmt(GCCAsmStmt *S) {
Gabor Marton303c98612019-06-25 08:00:51 +00005663 if (Importer.returnWithErrorInTest())
5664 return make_error<ImportError>(ImportError::UnsupportedConstruct);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00005665 SmallVector<IdentifierInfo *, 4> Names;
5666 for (unsigned I = 0, E = S->getNumOutputs(); I != E; I++) {
5667 IdentifierInfo *ToII = Importer.Import(S->getOutputIdentifier(I));
Gabor Horvath27f5ff62017-03-13 15:32:24 +00005668 // ToII is nullptr when no symbolic name is given for output operand
5669 // see ParseStmtAsm::ParseAsmOperandsOpt
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00005670 Names.push_back(ToII);
5671 }
Balazs Keri3b30d652018-10-19 13:32:20 +00005672
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00005673 for (unsigned I = 0, E = S->getNumInputs(); I != E; I++) {
5674 IdentifierInfo *ToII = Importer.Import(S->getInputIdentifier(I));
Gabor Horvath27f5ff62017-03-13 15:32:24 +00005675 // ToII is nullptr when no symbolic name is given for input operand
5676 // see ParseStmtAsm::ParseAsmOperandsOpt
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00005677 Names.push_back(ToII);
5678 }
5679
5680 SmallVector<StringLiteral *, 4> Clobbers;
5681 for (unsigned I = 0, E = S->getNumClobbers(); I != E; I++) {
Balazs Keri3b30d652018-10-19 13:32:20 +00005682 if (auto ClobberOrErr = import(S->getClobberStringLiteral(I)))
5683 Clobbers.push_back(*ClobberOrErr);
5684 else
5685 return ClobberOrErr.takeError();
5686
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00005687 }
5688
5689 SmallVector<StringLiteral *, 4> Constraints;
5690 for (unsigned I = 0, E = S->getNumOutputs(); I != E; I++) {
Balazs Keri3b30d652018-10-19 13:32:20 +00005691 if (auto OutputOrErr = import(S->getOutputConstraintLiteral(I)))
5692 Constraints.push_back(*OutputOrErr);
5693 else
5694 return OutputOrErr.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00005695 }
5696
5697 for (unsigned I = 0, E = S->getNumInputs(); I != E; I++) {
Balazs Keri3b30d652018-10-19 13:32:20 +00005698 if (auto InputOrErr = import(S->getInputConstraintLiteral(I)))
5699 Constraints.push_back(*InputOrErr);
5700 else
5701 return InputOrErr.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00005702 }
5703
Jennifer Yub8fee672019-06-03 15:57:25 +00005704 SmallVector<Expr *, 4> Exprs(S->getNumOutputs() + S->getNumInputs() +
5705 S->getNumLabels());
Balazs Keri3b30d652018-10-19 13:32:20 +00005706 if (Error Err = ImportContainerChecked(S->outputs(), Exprs))
5707 return std::move(Err);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00005708
Jennifer Yub8fee672019-06-03 15:57:25 +00005709 if (Error Err =
5710 ImportArrayChecked(S->inputs(), Exprs.begin() + S->getNumOutputs()))
5711 return std::move(Err);
5712
Balazs Keri3b30d652018-10-19 13:32:20 +00005713 if (Error Err = ImportArrayChecked(
Jennifer Yub8fee672019-06-03 15:57:25 +00005714 S->labels(), Exprs.begin() + S->getNumOutputs() + S->getNumInputs()))
Balazs Keri3b30d652018-10-19 13:32:20 +00005715 return std::move(Err);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00005716
Balazs Keri3b30d652018-10-19 13:32:20 +00005717 ExpectedSLoc AsmLocOrErr = import(S->getAsmLoc());
5718 if (!AsmLocOrErr)
5719 return AsmLocOrErr.takeError();
5720 auto AsmStrOrErr = import(S->getAsmString());
5721 if (!AsmStrOrErr)
5722 return AsmStrOrErr.takeError();
5723 ExpectedSLoc RParenLocOrErr = import(S->getRParenLoc());
5724 if (!RParenLocOrErr)
5725 return RParenLocOrErr.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00005726
5727 return new (Importer.getToContext()) GCCAsmStmt(
Balazs Keri3b30d652018-10-19 13:32:20 +00005728 Importer.getToContext(),
5729 *AsmLocOrErr,
5730 S->isSimple(),
5731 S->isVolatile(),
5732 S->getNumOutputs(),
5733 S->getNumInputs(),
5734 Names.data(),
5735 Constraints.data(),
5736 Exprs.data(),
5737 *AsmStrOrErr,
5738 S->getNumClobbers(),
5739 Clobbers.data(),
Jennifer Yub8fee672019-06-03 15:57:25 +00005740 S->getNumLabels(),
Balazs Keri3b30d652018-10-19 13:32:20 +00005741 *RParenLocOrErr);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00005742}
5743
Balazs Keri3b30d652018-10-19 13:32:20 +00005744ExpectedStmt ASTNodeImporter::VisitDeclStmt(DeclStmt *S) {
5745 auto Imp = importSeq(S->getDeclGroup(), S->getBeginLoc(), S->getEndLoc());
5746 if (!Imp)
5747 return Imp.takeError();
5748
5749 DeclGroupRef ToDG;
5750 SourceLocation ToBeginLoc, ToEndLoc;
5751 std::tie(ToDG, ToBeginLoc, ToEndLoc) = *Imp;
5752
5753 return new (Importer.getToContext()) DeclStmt(ToDG, ToBeginLoc, ToEndLoc);
Sean Callanan59721b32015-04-28 18:41:46 +00005754}
5755
Balazs Keri3b30d652018-10-19 13:32:20 +00005756ExpectedStmt ASTNodeImporter::VisitNullStmt(NullStmt *S) {
5757 ExpectedSLoc ToSemiLocOrErr = import(S->getSemiLoc());
5758 if (!ToSemiLocOrErr)
5759 return ToSemiLocOrErr.takeError();
5760 return new (Importer.getToContext()) NullStmt(
5761 *ToSemiLocOrErr, S->hasLeadingEmptyMacro());
Sean Callanan59721b32015-04-28 18:41:46 +00005762}
5763
Balazs Keri3b30d652018-10-19 13:32:20 +00005764ExpectedStmt ASTNodeImporter::VisitCompoundStmt(CompoundStmt *S) {
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00005765 SmallVector<Stmt *, 8> ToStmts(S->size());
Aleksei Sidorina693b372016-09-28 10:16:56 +00005766
Balazs Keri3b30d652018-10-19 13:32:20 +00005767 if (Error Err = ImportContainerChecked(S->body(), ToStmts))
5768 return std::move(Err);
Sean Callanan8bca9962016-03-28 21:43:01 +00005769
Balazs Keri3b30d652018-10-19 13:32:20 +00005770 ExpectedSLoc ToLBracLocOrErr = import(S->getLBracLoc());
5771 if (!ToLBracLocOrErr)
5772 return ToLBracLocOrErr.takeError();
5773
5774 ExpectedSLoc ToRBracLocOrErr = import(S->getRBracLoc());
5775 if (!ToRBracLocOrErr)
5776 return ToRBracLocOrErr.takeError();
5777
5778 return CompoundStmt::Create(
5779 Importer.getToContext(), ToStmts,
5780 *ToLBracLocOrErr, *ToRBracLocOrErr);
Sean Callanan59721b32015-04-28 18:41:46 +00005781}
5782
Balazs Keri3b30d652018-10-19 13:32:20 +00005783ExpectedStmt ASTNodeImporter::VisitCaseStmt(CaseStmt *S) {
5784 auto Imp = importSeq(
5785 S->getLHS(), S->getRHS(), S->getSubStmt(), S->getCaseLoc(),
5786 S->getEllipsisLoc(), S->getColonLoc());
5787 if (!Imp)
5788 return Imp.takeError();
5789
5790 Expr *ToLHS, *ToRHS;
5791 Stmt *ToSubStmt;
5792 SourceLocation ToCaseLoc, ToEllipsisLoc, ToColonLoc;
5793 std::tie(ToLHS, ToRHS, ToSubStmt, ToCaseLoc, ToEllipsisLoc, ToColonLoc) =
5794 *Imp;
5795
Bruno Ricci5b30571752018-10-28 12:30:53 +00005796 auto *ToStmt = CaseStmt::Create(Importer.getToContext(), ToLHS, ToRHS,
5797 ToCaseLoc, ToEllipsisLoc, ToColonLoc);
Gabor Horvath480892b2017-10-18 09:25:18 +00005798 ToStmt->setSubStmt(ToSubStmt);
Balazs Keri3b30d652018-10-19 13:32:20 +00005799
Gabor Horvath480892b2017-10-18 09:25:18 +00005800 return ToStmt;
Sean Callanan59721b32015-04-28 18:41:46 +00005801}
5802
Balazs Keri3b30d652018-10-19 13:32:20 +00005803ExpectedStmt ASTNodeImporter::VisitDefaultStmt(DefaultStmt *S) {
5804 auto Imp = importSeq(S->getDefaultLoc(), S->getColonLoc(), S->getSubStmt());
5805 if (!Imp)
5806 return Imp.takeError();
5807
5808 SourceLocation ToDefaultLoc, ToColonLoc;
5809 Stmt *ToSubStmt;
5810 std::tie(ToDefaultLoc, ToColonLoc, ToSubStmt) = *Imp;
5811
5812 return new (Importer.getToContext()) DefaultStmt(
5813 ToDefaultLoc, ToColonLoc, ToSubStmt);
Sean Callanan59721b32015-04-28 18:41:46 +00005814}
5815
Balazs Keri3b30d652018-10-19 13:32:20 +00005816ExpectedStmt ASTNodeImporter::VisitLabelStmt(LabelStmt *S) {
5817 auto Imp = importSeq(S->getIdentLoc(), S->getDecl(), S->getSubStmt());
5818 if (!Imp)
5819 return Imp.takeError();
5820
5821 SourceLocation ToIdentLoc;
5822 LabelDecl *ToLabelDecl;
5823 Stmt *ToSubStmt;
5824 std::tie(ToIdentLoc, ToLabelDecl, ToSubStmt) = *Imp;
5825
5826 return new (Importer.getToContext()) LabelStmt(
5827 ToIdentLoc, ToLabelDecl, ToSubStmt);
Sean Callanan59721b32015-04-28 18:41:46 +00005828}
5829
Balazs Keri3b30d652018-10-19 13:32:20 +00005830ExpectedStmt ASTNodeImporter::VisitAttributedStmt(AttributedStmt *S) {
5831 ExpectedSLoc ToAttrLocOrErr = import(S->getAttrLoc());
5832 if (!ToAttrLocOrErr)
5833 return ToAttrLocOrErr.takeError();
Sean Callanan59721b32015-04-28 18:41:46 +00005834 ArrayRef<const Attr*> FromAttrs(S->getAttrs());
5835 SmallVector<const Attr *, 1> ToAttrs(FromAttrs.size());
Balazs Keri3b30d652018-10-19 13:32:20 +00005836 if (Error Err = ImportContainerChecked(FromAttrs, ToAttrs))
5837 return std::move(Err);
5838 ExpectedStmt ToSubStmtOrErr = import(S->getSubStmt());
5839 if (!ToSubStmtOrErr)
5840 return ToSubStmtOrErr.takeError();
5841
5842 return AttributedStmt::Create(
5843 Importer.getToContext(), *ToAttrLocOrErr, ToAttrs, *ToSubStmtOrErr);
Sean Callanan59721b32015-04-28 18:41:46 +00005844}
5845
Balazs Keri3b30d652018-10-19 13:32:20 +00005846ExpectedStmt ASTNodeImporter::VisitIfStmt(IfStmt *S) {
5847 auto Imp = importSeq(
5848 S->getIfLoc(), S->getInit(), S->getConditionVariable(), S->getCond(),
5849 S->getThen(), S->getElseLoc(), S->getElse());
5850 if (!Imp)
5851 return Imp.takeError();
5852
5853 SourceLocation ToIfLoc, ToElseLoc;
5854 Stmt *ToInit, *ToThen, *ToElse;
5855 VarDecl *ToConditionVariable;
5856 Expr *ToCond;
5857 std::tie(
5858 ToIfLoc, ToInit, ToConditionVariable, ToCond, ToThen, ToElseLoc, ToElse) =
5859 *Imp;
5860
Bruno Riccib1cc94b2018-10-27 21:12:20 +00005861 return IfStmt::Create(Importer.getToContext(), ToIfLoc, S->isConstexpr(),
5862 ToInit, ToConditionVariable, ToCond, ToThen, ToElseLoc,
5863 ToElse);
Sean Callanan59721b32015-04-28 18:41:46 +00005864}
5865
Balazs Keri3b30d652018-10-19 13:32:20 +00005866ExpectedStmt ASTNodeImporter::VisitSwitchStmt(SwitchStmt *S) {
5867 auto Imp = importSeq(
5868 S->getInit(), S->getConditionVariable(), S->getCond(),
5869 S->getBody(), S->getSwitchLoc());
5870 if (!Imp)
5871 return Imp.takeError();
5872
5873 Stmt *ToInit, *ToBody;
5874 VarDecl *ToConditionVariable;
5875 Expr *ToCond;
5876 SourceLocation ToSwitchLoc;
5877 std::tie(ToInit, ToConditionVariable, ToCond, ToBody, ToSwitchLoc) = *Imp;
5878
Bruno Riccie2806f82018-10-29 16:12:37 +00005879 auto *ToStmt = SwitchStmt::Create(Importer.getToContext(), ToInit,
5880 ToConditionVariable, ToCond);
Sean Callanan59721b32015-04-28 18:41:46 +00005881 ToStmt->setBody(ToBody);
Balazs Keri3b30d652018-10-19 13:32:20 +00005882 ToStmt->setSwitchLoc(ToSwitchLoc);
5883
Sean Callanan59721b32015-04-28 18:41:46 +00005884 // Now we have to re-chain the cases.
5885 SwitchCase *LastChainedSwitchCase = nullptr;
5886 for (SwitchCase *SC = S->getSwitchCaseList(); SC != nullptr;
5887 SC = SC->getNextSwitchCase()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00005888 Expected<SwitchCase *> ToSCOrErr = import(SC);
5889 if (!ToSCOrErr)
5890 return ToSCOrErr.takeError();
Sean Callanan59721b32015-04-28 18:41:46 +00005891 if (LastChainedSwitchCase)
Balazs Keri3b30d652018-10-19 13:32:20 +00005892 LastChainedSwitchCase->setNextSwitchCase(*ToSCOrErr);
Sean Callanan59721b32015-04-28 18:41:46 +00005893 else
Balazs Keri3b30d652018-10-19 13:32:20 +00005894 ToStmt->setSwitchCaseList(*ToSCOrErr);
5895 LastChainedSwitchCase = *ToSCOrErr;
Sean Callanan59721b32015-04-28 18:41:46 +00005896 }
Balazs Keri3b30d652018-10-19 13:32:20 +00005897
Sean Callanan59721b32015-04-28 18:41:46 +00005898 return ToStmt;
5899}
5900
Balazs Keri3b30d652018-10-19 13:32:20 +00005901ExpectedStmt ASTNodeImporter::VisitWhileStmt(WhileStmt *S) {
5902 auto Imp = importSeq(
5903 S->getConditionVariable(), S->getCond(), S->getBody(), S->getWhileLoc());
5904 if (!Imp)
5905 return Imp.takeError();
5906
5907 VarDecl *ToConditionVariable;
5908 Expr *ToCond;
5909 Stmt *ToBody;
5910 SourceLocation ToWhileLoc;
5911 std::tie(ToConditionVariable, ToCond, ToBody, ToWhileLoc) = *Imp;
5912
Bruno Riccibacf7512018-10-30 13:42:41 +00005913 return WhileStmt::Create(Importer.getToContext(), ToConditionVariable, ToCond,
5914 ToBody, ToWhileLoc);
Sean Callanan59721b32015-04-28 18:41:46 +00005915}
5916
Balazs Keri3b30d652018-10-19 13:32:20 +00005917ExpectedStmt ASTNodeImporter::VisitDoStmt(DoStmt *S) {
5918 auto Imp = importSeq(
5919 S->getBody(), S->getCond(), S->getDoLoc(), S->getWhileLoc(),
5920 S->getRParenLoc());
5921 if (!Imp)
5922 return Imp.takeError();
5923
5924 Stmt *ToBody;
5925 Expr *ToCond;
5926 SourceLocation ToDoLoc, ToWhileLoc, ToRParenLoc;
5927 std::tie(ToBody, ToCond, ToDoLoc, ToWhileLoc, ToRParenLoc) = *Imp;
5928
5929 return new (Importer.getToContext()) DoStmt(
5930 ToBody, ToCond, ToDoLoc, ToWhileLoc, ToRParenLoc);
Sean Callanan59721b32015-04-28 18:41:46 +00005931}
5932
Balazs Keri3b30d652018-10-19 13:32:20 +00005933ExpectedStmt ASTNodeImporter::VisitForStmt(ForStmt *S) {
5934 auto Imp = importSeq(
5935 S->getInit(), S->getCond(), S->getConditionVariable(), S->getInc(),
5936 S->getBody(), S->getForLoc(), S->getLParenLoc(), S->getRParenLoc());
5937 if (!Imp)
5938 return Imp.takeError();
5939
5940 Stmt *ToInit;
5941 Expr *ToCond, *ToInc;
5942 VarDecl *ToConditionVariable;
5943 Stmt *ToBody;
5944 SourceLocation ToForLoc, ToLParenLoc, ToRParenLoc;
5945 std::tie(
5946 ToInit, ToCond, ToConditionVariable, ToInc, ToBody, ToForLoc,
5947 ToLParenLoc, ToRParenLoc) = *Imp;
5948
5949 return new (Importer.getToContext()) ForStmt(
5950 Importer.getToContext(),
5951 ToInit, ToCond, ToConditionVariable, ToInc, ToBody, ToForLoc, ToLParenLoc,
5952 ToRParenLoc);
Sean Callanan59721b32015-04-28 18:41:46 +00005953}
5954
Balazs Keri3b30d652018-10-19 13:32:20 +00005955ExpectedStmt ASTNodeImporter::VisitGotoStmt(GotoStmt *S) {
5956 auto Imp = importSeq(S->getLabel(), S->getGotoLoc(), S->getLabelLoc());
5957 if (!Imp)
5958 return Imp.takeError();
5959
5960 LabelDecl *ToLabel;
5961 SourceLocation ToGotoLoc, ToLabelLoc;
5962 std::tie(ToLabel, ToGotoLoc, ToLabelLoc) = *Imp;
5963
5964 return new (Importer.getToContext()) GotoStmt(
5965 ToLabel, ToGotoLoc, ToLabelLoc);
Sean Callanan59721b32015-04-28 18:41:46 +00005966}
5967
Balazs Keri3b30d652018-10-19 13:32:20 +00005968ExpectedStmt ASTNodeImporter::VisitIndirectGotoStmt(IndirectGotoStmt *S) {
5969 auto Imp = importSeq(S->getGotoLoc(), S->getStarLoc(), S->getTarget());
5970 if (!Imp)
5971 return Imp.takeError();
5972
5973 SourceLocation ToGotoLoc, ToStarLoc;
5974 Expr *ToTarget;
5975 std::tie(ToGotoLoc, ToStarLoc, ToTarget) = *Imp;
5976
5977 return new (Importer.getToContext()) IndirectGotoStmt(
5978 ToGotoLoc, ToStarLoc, ToTarget);
Sean Callanan59721b32015-04-28 18:41:46 +00005979}
5980
Balazs Keri3b30d652018-10-19 13:32:20 +00005981ExpectedStmt ASTNodeImporter::VisitContinueStmt(ContinueStmt *S) {
5982 ExpectedSLoc ToContinueLocOrErr = import(S->getContinueLoc());
5983 if (!ToContinueLocOrErr)
5984 return ToContinueLocOrErr.takeError();
5985 return new (Importer.getToContext()) ContinueStmt(*ToContinueLocOrErr);
Sean Callanan59721b32015-04-28 18:41:46 +00005986}
5987
Balazs Keri3b30d652018-10-19 13:32:20 +00005988ExpectedStmt ASTNodeImporter::VisitBreakStmt(BreakStmt *S) {
5989 auto ToBreakLocOrErr = import(S->getBreakLoc());
5990 if (!ToBreakLocOrErr)
5991 return ToBreakLocOrErr.takeError();
5992 return new (Importer.getToContext()) BreakStmt(*ToBreakLocOrErr);
Sean Callanan59721b32015-04-28 18:41:46 +00005993}
5994
Balazs Keri3b30d652018-10-19 13:32:20 +00005995ExpectedStmt ASTNodeImporter::VisitReturnStmt(ReturnStmt *S) {
5996 auto Imp = importSeq(
5997 S->getReturnLoc(), S->getRetValue(), S->getNRVOCandidate());
5998 if (!Imp)
5999 return Imp.takeError();
6000
6001 SourceLocation ToReturnLoc;
6002 Expr *ToRetValue;
6003 const VarDecl *ToNRVOCandidate;
6004 std::tie(ToReturnLoc, ToRetValue, ToNRVOCandidate) = *Imp;
6005
Bruno Ricci023b1d12018-10-30 14:40:49 +00006006 return ReturnStmt::Create(Importer.getToContext(), ToReturnLoc, ToRetValue,
6007 ToNRVOCandidate);
Sean Callanan59721b32015-04-28 18:41:46 +00006008}
6009
Balazs Keri3b30d652018-10-19 13:32:20 +00006010ExpectedStmt ASTNodeImporter::VisitCXXCatchStmt(CXXCatchStmt *S) {
6011 auto Imp = importSeq(
6012 S->getCatchLoc(), S->getExceptionDecl(), S->getHandlerBlock());
6013 if (!Imp)
6014 return Imp.takeError();
6015
6016 SourceLocation ToCatchLoc;
6017 VarDecl *ToExceptionDecl;
6018 Stmt *ToHandlerBlock;
6019 std::tie(ToCatchLoc, ToExceptionDecl, ToHandlerBlock) = *Imp;
6020
6021 return new (Importer.getToContext()) CXXCatchStmt (
6022 ToCatchLoc, ToExceptionDecl, ToHandlerBlock);
Sean Callanan59721b32015-04-28 18:41:46 +00006023}
6024
Balazs Keri3b30d652018-10-19 13:32:20 +00006025ExpectedStmt ASTNodeImporter::VisitCXXTryStmt(CXXTryStmt *S) {
6026 ExpectedSLoc ToTryLocOrErr = import(S->getTryLoc());
6027 if (!ToTryLocOrErr)
6028 return ToTryLocOrErr.takeError();
6029
6030 ExpectedStmt ToTryBlockOrErr = import(S->getTryBlock());
6031 if (!ToTryBlockOrErr)
6032 return ToTryBlockOrErr.takeError();
6033
Sean Callanan59721b32015-04-28 18:41:46 +00006034 SmallVector<Stmt *, 1> ToHandlers(S->getNumHandlers());
6035 for (unsigned HI = 0, HE = S->getNumHandlers(); HI != HE; ++HI) {
6036 CXXCatchStmt *FromHandler = S->getHandler(HI);
Balazs Keri3b30d652018-10-19 13:32:20 +00006037 if (auto ToHandlerOrErr = import(FromHandler))
6038 ToHandlers[HI] = *ToHandlerOrErr;
Sean Callanan59721b32015-04-28 18:41:46 +00006039 else
Balazs Keri3b30d652018-10-19 13:32:20 +00006040 return ToHandlerOrErr.takeError();
Sean Callanan59721b32015-04-28 18:41:46 +00006041 }
Balazs Keri3b30d652018-10-19 13:32:20 +00006042
6043 return CXXTryStmt::Create(
6044 Importer.getToContext(), *ToTryLocOrErr,*ToTryBlockOrErr, ToHandlers);
Sean Callanan59721b32015-04-28 18:41:46 +00006045}
6046
Balazs Keri3b30d652018-10-19 13:32:20 +00006047ExpectedStmt ASTNodeImporter::VisitCXXForRangeStmt(CXXForRangeStmt *S) {
6048 auto Imp1 = importSeq(
6049 S->getInit(), S->getRangeStmt(), S->getBeginStmt(), S->getEndStmt(),
6050 S->getCond(), S->getInc(), S->getLoopVarStmt(), S->getBody());
6051 if (!Imp1)
6052 return Imp1.takeError();
6053 auto Imp2 = importSeq(
6054 S->getForLoc(), S->getCoawaitLoc(), S->getColonLoc(), S->getRParenLoc());
6055 if (!Imp2)
6056 return Imp2.takeError();
6057
6058 DeclStmt *ToRangeStmt, *ToBeginStmt, *ToEndStmt, *ToLoopVarStmt;
6059 Expr *ToCond, *ToInc;
6060 Stmt *ToInit, *ToBody;
6061 std::tie(
6062 ToInit, ToRangeStmt, ToBeginStmt, ToEndStmt, ToCond, ToInc, ToLoopVarStmt,
6063 ToBody) = *Imp1;
6064 SourceLocation ToForLoc, ToCoawaitLoc, ToColonLoc, ToRParenLoc;
6065 std::tie(ToForLoc, ToCoawaitLoc, ToColonLoc, ToRParenLoc) = *Imp2;
6066
6067 return new (Importer.getToContext()) CXXForRangeStmt(
6068 ToInit, ToRangeStmt, ToBeginStmt, ToEndStmt, ToCond, ToInc, ToLoopVarStmt,
6069 ToBody, ToForLoc, ToCoawaitLoc, ToColonLoc, ToRParenLoc);
Sean Callanan59721b32015-04-28 18:41:46 +00006070}
6071
Balazs Keri3b30d652018-10-19 13:32:20 +00006072ExpectedStmt
6073ASTNodeImporter::VisitObjCForCollectionStmt(ObjCForCollectionStmt *S) {
6074 auto Imp = importSeq(
6075 S->getElement(), S->getCollection(), S->getBody(),
6076 S->getForLoc(), S->getRParenLoc());
6077 if (!Imp)
6078 return Imp.takeError();
6079
6080 Stmt *ToElement, *ToBody;
6081 Expr *ToCollection;
6082 SourceLocation ToForLoc, ToRParenLoc;
6083 std::tie(ToElement, ToCollection, ToBody, ToForLoc, ToRParenLoc) = *Imp;
6084
6085 return new (Importer.getToContext()) ObjCForCollectionStmt(ToElement,
6086 ToCollection,
6087 ToBody,
6088 ToForLoc,
Sean Callanan59721b32015-04-28 18:41:46 +00006089 ToRParenLoc);
6090}
6091
Balazs Keri3b30d652018-10-19 13:32:20 +00006092ExpectedStmt ASTNodeImporter::VisitObjCAtCatchStmt(ObjCAtCatchStmt *S) {
6093 auto Imp = importSeq(
6094 S->getAtCatchLoc(), S->getRParenLoc(), S->getCatchParamDecl(),
6095 S->getCatchBody());
6096 if (!Imp)
6097 return Imp.takeError();
6098
6099 SourceLocation ToAtCatchLoc, ToRParenLoc;
6100 VarDecl *ToCatchParamDecl;
6101 Stmt *ToCatchBody;
6102 std::tie(ToAtCatchLoc, ToRParenLoc, ToCatchParamDecl, ToCatchBody) = *Imp;
6103
6104 return new (Importer.getToContext()) ObjCAtCatchStmt (
6105 ToAtCatchLoc, ToRParenLoc, ToCatchParamDecl, ToCatchBody);
Sean Callanan59721b32015-04-28 18:41:46 +00006106}
6107
Balazs Keri3b30d652018-10-19 13:32:20 +00006108ExpectedStmt ASTNodeImporter::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
6109 ExpectedSLoc ToAtFinallyLocOrErr = import(S->getAtFinallyLoc());
6110 if (!ToAtFinallyLocOrErr)
6111 return ToAtFinallyLocOrErr.takeError();
6112 ExpectedStmt ToAtFinallyStmtOrErr = import(S->getFinallyBody());
6113 if (!ToAtFinallyStmtOrErr)
6114 return ToAtFinallyStmtOrErr.takeError();
6115 return new (Importer.getToContext()) ObjCAtFinallyStmt(*ToAtFinallyLocOrErr,
6116 *ToAtFinallyStmtOrErr);
Sean Callanan59721b32015-04-28 18:41:46 +00006117}
6118
Balazs Keri3b30d652018-10-19 13:32:20 +00006119ExpectedStmt ASTNodeImporter::VisitObjCAtTryStmt(ObjCAtTryStmt *S) {
6120 auto Imp = importSeq(
6121 S->getAtTryLoc(), S->getTryBody(), S->getFinallyStmt());
6122 if (!Imp)
6123 return Imp.takeError();
6124
6125 SourceLocation ToAtTryLoc;
6126 Stmt *ToTryBody, *ToFinallyStmt;
6127 std::tie(ToAtTryLoc, ToTryBody, ToFinallyStmt) = *Imp;
6128
Sean Callanan59721b32015-04-28 18:41:46 +00006129 SmallVector<Stmt *, 1> ToCatchStmts(S->getNumCatchStmts());
6130 for (unsigned CI = 0, CE = S->getNumCatchStmts(); CI != CE; ++CI) {
6131 ObjCAtCatchStmt *FromCatchStmt = S->getCatchStmt(CI);
Balazs Keri3b30d652018-10-19 13:32:20 +00006132 if (ExpectedStmt ToCatchStmtOrErr = import(FromCatchStmt))
6133 ToCatchStmts[CI] = *ToCatchStmtOrErr;
Sean Callanan59721b32015-04-28 18:41:46 +00006134 else
Balazs Keri3b30d652018-10-19 13:32:20 +00006135 return ToCatchStmtOrErr.takeError();
Sean Callanan59721b32015-04-28 18:41:46 +00006136 }
Balazs Keri3b30d652018-10-19 13:32:20 +00006137
Sean Callanan59721b32015-04-28 18:41:46 +00006138 return ObjCAtTryStmt::Create(Importer.getToContext(),
Balazs Keri3b30d652018-10-19 13:32:20 +00006139 ToAtTryLoc, ToTryBody,
Sean Callanan59721b32015-04-28 18:41:46 +00006140 ToCatchStmts.begin(), ToCatchStmts.size(),
Balazs Keri3b30d652018-10-19 13:32:20 +00006141 ToFinallyStmt);
Sean Callanan59721b32015-04-28 18:41:46 +00006142}
6143
Balazs Keri3b30d652018-10-19 13:32:20 +00006144ExpectedStmt ASTNodeImporter::VisitObjCAtSynchronizedStmt
Sean Callanan59721b32015-04-28 18:41:46 +00006145 (ObjCAtSynchronizedStmt *S) {
Balazs Keri3b30d652018-10-19 13:32:20 +00006146 auto Imp = importSeq(
6147 S->getAtSynchronizedLoc(), S->getSynchExpr(), S->getSynchBody());
6148 if (!Imp)
6149 return Imp.takeError();
6150
6151 SourceLocation ToAtSynchronizedLoc;
6152 Expr *ToSynchExpr;
6153 Stmt *ToSynchBody;
6154 std::tie(ToAtSynchronizedLoc, ToSynchExpr, ToSynchBody) = *Imp;
6155
Sean Callanan59721b32015-04-28 18:41:46 +00006156 return new (Importer.getToContext()) ObjCAtSynchronizedStmt(
6157 ToAtSynchronizedLoc, ToSynchExpr, ToSynchBody);
6158}
6159
Balazs Keri3b30d652018-10-19 13:32:20 +00006160ExpectedStmt ASTNodeImporter::VisitObjCAtThrowStmt(ObjCAtThrowStmt *S) {
6161 ExpectedSLoc ToThrowLocOrErr = import(S->getThrowLoc());
6162 if (!ToThrowLocOrErr)
6163 return ToThrowLocOrErr.takeError();
6164 ExpectedExpr ToThrowExprOrErr = import(S->getThrowExpr());
6165 if (!ToThrowExprOrErr)
6166 return ToThrowExprOrErr.takeError();
6167 return new (Importer.getToContext()) ObjCAtThrowStmt(
6168 *ToThrowLocOrErr, *ToThrowExprOrErr);
Sean Callanan59721b32015-04-28 18:41:46 +00006169}
6170
Balazs Keri3b30d652018-10-19 13:32:20 +00006171ExpectedStmt ASTNodeImporter::VisitObjCAutoreleasePoolStmt(
6172 ObjCAutoreleasePoolStmt *S) {
6173 ExpectedSLoc ToAtLocOrErr = import(S->getAtLoc());
6174 if (!ToAtLocOrErr)
6175 return ToAtLocOrErr.takeError();
6176 ExpectedStmt ToSubStmtOrErr = import(S->getSubStmt());
6177 if (!ToSubStmtOrErr)
6178 return ToSubStmtOrErr.takeError();
6179 return new (Importer.getToContext()) ObjCAutoreleasePoolStmt(*ToAtLocOrErr,
6180 *ToSubStmtOrErr);
Douglas Gregor7eeb5972010-02-11 19:21:55 +00006181}
6182
6183//----------------------------------------------------------------------------
6184// Import Expressions
6185//----------------------------------------------------------------------------
Balazs Keri3b30d652018-10-19 13:32:20 +00006186ExpectedStmt ASTNodeImporter::VisitExpr(Expr *E) {
Stephen Kellyf2ceec42018-08-09 21:08:08 +00006187 Importer.FromDiag(E->getBeginLoc(), diag::err_unsupported_ast_node)
6188 << E->getStmtClassName();
Balazs Keri3b30d652018-10-19 13:32:20 +00006189 return make_error<ImportError>(ImportError::UnsupportedConstruct);
Douglas Gregor7eeb5972010-02-11 19:21:55 +00006190}
6191
Balazs Keri3b30d652018-10-19 13:32:20 +00006192ExpectedStmt ASTNodeImporter::VisitVAArgExpr(VAArgExpr *E) {
6193 auto Imp = importSeq(
6194 E->getBuiltinLoc(), E->getSubExpr(), E->getWrittenTypeInfo(),
6195 E->getRParenLoc(), E->getType());
6196 if (!Imp)
6197 return Imp.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006198
Balazs Keri3b30d652018-10-19 13:32:20 +00006199 SourceLocation ToBuiltinLoc, ToRParenLoc;
6200 Expr *ToSubExpr;
6201 TypeSourceInfo *ToWrittenTypeInfo;
6202 QualType ToType;
6203 std::tie(ToBuiltinLoc, ToSubExpr, ToWrittenTypeInfo, ToRParenLoc, ToType) =
6204 *Imp;
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006205
6206 return new (Importer.getToContext()) VAArgExpr(
Balazs Keri3b30d652018-10-19 13:32:20 +00006207 ToBuiltinLoc, ToSubExpr, ToWrittenTypeInfo, ToRParenLoc, ToType,
6208 E->isMicrosoftABI());
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006209}
6210
Tom Roeder521f0042019-02-26 19:26:41 +00006211ExpectedStmt ASTNodeImporter::VisitChooseExpr(ChooseExpr *E) {
6212 auto Imp = importSeq(E->getCond(), E->getLHS(), E->getRHS(),
6213 E->getBuiltinLoc(), E->getRParenLoc(), E->getType());
6214 if (!Imp)
6215 return Imp.takeError();
6216
6217 Expr *ToCond;
6218 Expr *ToLHS;
6219 Expr *ToRHS;
6220 SourceLocation ToBuiltinLoc, ToRParenLoc;
6221 QualType ToType;
6222 std::tie(ToCond, ToLHS, ToRHS, ToBuiltinLoc, ToRParenLoc, ToType) = *Imp;
6223
6224 ExprValueKind VK = E->getValueKind();
6225 ExprObjectKind OK = E->getObjectKind();
6226
6227 bool TypeDependent = ToCond->isTypeDependent();
6228 bool ValueDependent = ToCond->isValueDependent();
6229
6230 // The value of CondIsTrue only matters if the value is not
6231 // condition-dependent.
6232 bool CondIsTrue = !E->isConditionDependent() && E->isConditionTrue();
6233
6234 return new (Importer.getToContext())
6235 ChooseExpr(ToBuiltinLoc, ToCond, ToLHS, ToRHS, ToType, VK, OK,
6236 ToRParenLoc, CondIsTrue, TypeDependent, ValueDependent);
6237}
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006238
Balazs Keri3b30d652018-10-19 13:32:20 +00006239ExpectedStmt ASTNodeImporter::VisitGNUNullExpr(GNUNullExpr *E) {
6240 ExpectedType TypeOrErr = import(E->getType());
6241 if (!TypeOrErr)
6242 return TypeOrErr.takeError();
6243
6244 ExpectedSLoc BeginLocOrErr = import(E->getBeginLoc());
6245 if (!BeginLocOrErr)
6246 return BeginLocOrErr.takeError();
6247
6248 return new (Importer.getToContext()) GNUNullExpr(*TypeOrErr, *BeginLocOrErr);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006249}
6250
Balazs Keri3b30d652018-10-19 13:32:20 +00006251ExpectedStmt ASTNodeImporter::VisitPredefinedExpr(PredefinedExpr *E) {
6252 auto Imp = importSeq(
6253 E->getBeginLoc(), E->getType(), E->getFunctionName());
6254 if (!Imp)
6255 return Imp.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006256
Balazs Keri3b30d652018-10-19 13:32:20 +00006257 SourceLocation ToBeginLoc;
6258 QualType ToType;
6259 StringLiteral *ToFunctionName;
6260 std::tie(ToBeginLoc, ToType, ToFunctionName) = *Imp;
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006261
Bruno Ricci17ff0262018-10-27 19:21:19 +00006262 return PredefinedExpr::Create(Importer.getToContext(), ToBeginLoc, ToType,
6263 E->getIdentKind(), ToFunctionName);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006264}
6265
Balazs Keri3b30d652018-10-19 13:32:20 +00006266ExpectedStmt ASTNodeImporter::VisitDeclRefExpr(DeclRefExpr *E) {
6267 auto Imp = importSeq(
6268 E->getQualifierLoc(), E->getTemplateKeywordLoc(), E->getDecl(),
6269 E->getLocation(), E->getType());
6270 if (!Imp)
6271 return Imp.takeError();
Chandler Carruth8d26bb02011-05-01 23:48:14 +00006272
Balazs Keri3b30d652018-10-19 13:32:20 +00006273 NestedNameSpecifierLoc ToQualifierLoc;
6274 SourceLocation ToTemplateKeywordLoc, ToLocation;
6275 ValueDecl *ToDecl;
6276 QualType ToType;
6277 std::tie(ToQualifierLoc, ToTemplateKeywordLoc, ToDecl, ToLocation, ToType) =
6278 *Imp;
6279
6280 NamedDecl *ToFoundD = nullptr;
Chandler Carruth8d26bb02011-05-01 23:48:14 +00006281 if (E->getDecl() != E->getFoundDecl()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00006282 auto FoundDOrErr = import(E->getFoundDecl());
6283 if (!FoundDOrErr)
6284 return FoundDOrErr.takeError();
6285 ToFoundD = *FoundDOrErr;
Chandler Carruth8d26bb02011-05-01 23:48:14 +00006286 }
Fangrui Song6907ce22018-07-30 19:24:48 +00006287
Aleksei Sidorina693b372016-09-28 10:16:56 +00006288 TemplateArgumentListInfo ToTAInfo;
Balazs Keri3b30d652018-10-19 13:32:20 +00006289 TemplateArgumentListInfo *ToResInfo = nullptr;
Aleksei Sidorina693b372016-09-28 10:16:56 +00006290 if (E->hasExplicitTemplateArgs()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00006291 if (Error Err =
6292 ImportTemplateArgumentListInfo(E->template_arguments(), ToTAInfo))
6293 return std::move(Err);
6294 ToResInfo = &ToTAInfo;
Aleksei Sidorina693b372016-09-28 10:16:56 +00006295 }
6296
Balazs Keri3b30d652018-10-19 13:32:20 +00006297 auto *ToE = DeclRefExpr::Create(
6298 Importer.getToContext(), ToQualifierLoc, ToTemplateKeywordLoc, ToDecl,
6299 E->refersToEnclosingVariableOrCapture(), ToLocation, ToType,
Richard Smith715f7a12019-06-11 17:50:32 +00006300 E->getValueKind(), ToFoundD, ToResInfo, E->isNonOdrUse());
Abramo Bagnara635ed24e2011-10-05 07:56:41 +00006301 if (E->hadMultipleCandidates())
Balazs Keri3b30d652018-10-19 13:32:20 +00006302 ToE->setHadMultipleCandidates(true);
6303 return ToE;
Douglas Gregor52f820e2010-02-19 01:17:02 +00006304}
6305
Balazs Keri3b30d652018-10-19 13:32:20 +00006306ExpectedStmt ASTNodeImporter::VisitImplicitValueInitExpr(ImplicitValueInitExpr *E) {
6307 ExpectedType TypeOrErr = import(E->getType());
6308 if (!TypeOrErr)
6309 return TypeOrErr.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006310
Balazs Keri3b30d652018-10-19 13:32:20 +00006311 return new (Importer.getToContext()) ImplicitValueInitExpr(*TypeOrErr);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006312}
6313
Balazs Keri3b30d652018-10-19 13:32:20 +00006314ExpectedStmt ASTNodeImporter::VisitDesignatedInitExpr(DesignatedInitExpr *E) {
6315 ExpectedExpr ToInitOrErr = import(E->getInit());
6316 if (!ToInitOrErr)
6317 return ToInitOrErr.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006318
Balazs Keri3b30d652018-10-19 13:32:20 +00006319 ExpectedSLoc ToEqualOrColonLocOrErr = import(E->getEqualOrColonLoc());
6320 if (!ToEqualOrColonLocOrErr)
6321 return ToEqualOrColonLocOrErr.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006322
Balazs Keri3b30d652018-10-19 13:32:20 +00006323 SmallVector<Expr *, 4> ToIndexExprs(E->getNumSubExprs() - 1);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006324 // List elements from the second, the first is Init itself
Balazs Keri3b30d652018-10-19 13:32:20 +00006325 for (unsigned I = 1, N = E->getNumSubExprs(); I < N; I++) {
6326 if (ExpectedExpr ToArgOrErr = import(E->getSubExpr(I)))
6327 ToIndexExprs[I - 1] = *ToArgOrErr;
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006328 else
Balazs Keri3b30d652018-10-19 13:32:20 +00006329 return ToArgOrErr.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006330 }
6331
Balazs Keri3b30d652018-10-19 13:32:20 +00006332 SmallVector<Designator, 4> ToDesignators(E->size());
6333 if (Error Err = ImportContainerChecked(E->designators(), ToDesignators))
6334 return std::move(Err);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006335
6336 return DesignatedInitExpr::Create(
Balazs Keri3b30d652018-10-19 13:32:20 +00006337 Importer.getToContext(), ToDesignators,
6338 ToIndexExprs, *ToEqualOrColonLocOrErr,
6339 E->usesGNUSyntax(), *ToInitOrErr);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006340}
6341
Balazs Keri3b30d652018-10-19 13:32:20 +00006342ExpectedStmt
6343ASTNodeImporter::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E) {
6344 ExpectedType ToTypeOrErr = import(E->getType());
6345 if (!ToTypeOrErr)
6346 return ToTypeOrErr.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006347
Balazs Keri3b30d652018-10-19 13:32:20 +00006348 ExpectedSLoc ToLocationOrErr = import(E->getLocation());
6349 if (!ToLocationOrErr)
6350 return ToLocationOrErr.takeError();
6351
6352 return new (Importer.getToContext()) CXXNullPtrLiteralExpr(
6353 *ToTypeOrErr, *ToLocationOrErr);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006354}
6355
Balazs Keri3b30d652018-10-19 13:32:20 +00006356ExpectedStmt ASTNodeImporter::VisitIntegerLiteral(IntegerLiteral *E) {
6357 ExpectedType ToTypeOrErr = import(E->getType());
6358 if (!ToTypeOrErr)
6359 return ToTypeOrErr.takeError();
Douglas Gregor7eeb5972010-02-11 19:21:55 +00006360
Balazs Keri3b30d652018-10-19 13:32:20 +00006361 ExpectedSLoc ToLocationOrErr = import(E->getLocation());
6362 if (!ToLocationOrErr)
6363 return ToLocationOrErr.takeError();
6364
6365 return IntegerLiteral::Create(
6366 Importer.getToContext(), E->getValue(), *ToTypeOrErr, *ToLocationOrErr);
Douglas Gregor7eeb5972010-02-11 19:21:55 +00006367}
6368
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006369
Balazs Keri3b30d652018-10-19 13:32:20 +00006370ExpectedStmt ASTNodeImporter::VisitFloatingLiteral(FloatingLiteral *E) {
6371 ExpectedType ToTypeOrErr = import(E->getType());
6372 if (!ToTypeOrErr)
6373 return ToTypeOrErr.takeError();
6374
6375 ExpectedSLoc ToLocationOrErr = import(E->getLocation());
6376 if (!ToLocationOrErr)
6377 return ToLocationOrErr.takeError();
6378
6379 return FloatingLiteral::Create(
6380 Importer.getToContext(), E->getValue(), E->isExact(),
6381 *ToTypeOrErr, *ToLocationOrErr);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006382}
6383
Balazs Keri3b30d652018-10-19 13:32:20 +00006384ExpectedStmt ASTNodeImporter::VisitImaginaryLiteral(ImaginaryLiteral *E) {
6385 auto ToTypeOrErr = import(E->getType());
6386 if (!ToTypeOrErr)
6387 return ToTypeOrErr.takeError();
Gabor Martonbf7f18b2018-08-09 12:18:07 +00006388
Balazs Keri3b30d652018-10-19 13:32:20 +00006389 ExpectedExpr ToSubExprOrErr = import(E->getSubExpr());
6390 if (!ToSubExprOrErr)
6391 return ToSubExprOrErr.takeError();
Gabor Martonbf7f18b2018-08-09 12:18:07 +00006392
Balazs Keri3b30d652018-10-19 13:32:20 +00006393 return new (Importer.getToContext()) ImaginaryLiteral(
6394 *ToSubExprOrErr, *ToTypeOrErr);
Gabor Martonbf7f18b2018-08-09 12:18:07 +00006395}
6396
Balazs Keri3b30d652018-10-19 13:32:20 +00006397ExpectedStmt ASTNodeImporter::VisitCharacterLiteral(CharacterLiteral *E) {
6398 ExpectedType ToTypeOrErr = import(E->getType());
6399 if (!ToTypeOrErr)
6400 return ToTypeOrErr.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00006401
Balazs Keri3b30d652018-10-19 13:32:20 +00006402 ExpectedSLoc ToLocationOrErr = import(E->getLocation());
6403 if (!ToLocationOrErr)
6404 return ToLocationOrErr.takeError();
6405
6406 return new (Importer.getToContext()) CharacterLiteral(
6407 E->getValue(), E->getKind(), *ToTypeOrErr, *ToLocationOrErr);
Douglas Gregor623421d2010-02-18 02:21:22 +00006408}
6409
Balazs Keri3b30d652018-10-19 13:32:20 +00006410ExpectedStmt ASTNodeImporter::VisitStringLiteral(StringLiteral *E) {
6411 ExpectedType ToTypeOrErr = import(E->getType());
6412 if (!ToTypeOrErr)
6413 return ToTypeOrErr.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006414
Balazs Keri3b30d652018-10-19 13:32:20 +00006415 SmallVector<SourceLocation, 4> ToLocations(E->getNumConcatenated());
6416 if (Error Err = ImportArrayChecked(
6417 E->tokloc_begin(), E->tokloc_end(), ToLocations.begin()))
6418 return std::move(Err);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006419
Balazs Keri3b30d652018-10-19 13:32:20 +00006420 return StringLiteral::Create(
6421 Importer.getToContext(), E->getBytes(), E->getKind(), E->isPascal(),
6422 *ToTypeOrErr, ToLocations.data(), ToLocations.size());
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006423}
6424
Balazs Keri3b30d652018-10-19 13:32:20 +00006425ExpectedStmt ASTNodeImporter::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {
6426 auto Imp = importSeq(
6427 E->getLParenLoc(), E->getTypeSourceInfo(), E->getType(),
6428 E->getInitializer());
6429 if (!Imp)
6430 return Imp.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006431
Balazs Keri3b30d652018-10-19 13:32:20 +00006432 SourceLocation ToLParenLoc;
6433 TypeSourceInfo *ToTypeSourceInfo;
6434 QualType ToType;
6435 Expr *ToInitializer;
6436 std::tie(ToLParenLoc, ToTypeSourceInfo, ToType, ToInitializer) = *Imp;
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006437
6438 return new (Importer.getToContext()) CompoundLiteralExpr(
Balazs Keri3b30d652018-10-19 13:32:20 +00006439 ToLParenLoc, ToTypeSourceInfo, ToType, E->getValueKind(),
6440 ToInitializer, E->isFileScope());
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006441}
6442
Balazs Keri3b30d652018-10-19 13:32:20 +00006443ExpectedStmt ASTNodeImporter::VisitAtomicExpr(AtomicExpr *E) {
6444 auto Imp = importSeq(
6445 E->getBuiltinLoc(), E->getType(), E->getRParenLoc());
6446 if (!Imp)
6447 return Imp.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006448
Balazs Keri3b30d652018-10-19 13:32:20 +00006449 SourceLocation ToBuiltinLoc, ToRParenLoc;
6450 QualType ToType;
6451 std::tie(ToBuiltinLoc, ToType, ToRParenLoc) = *Imp;
6452
6453 SmallVector<Expr *, 6> ToExprs(E->getNumSubExprs());
6454 if (Error Err = ImportArrayChecked(
6455 E->getSubExprs(), E->getSubExprs() + E->getNumSubExprs(),
6456 ToExprs.begin()))
6457 return std::move(Err);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006458
6459 return new (Importer.getToContext()) AtomicExpr(
Balazs Keri3b30d652018-10-19 13:32:20 +00006460 ToBuiltinLoc, ToExprs, ToType, E->getOp(), ToRParenLoc);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006461}
6462
Balazs Keri3b30d652018-10-19 13:32:20 +00006463ExpectedStmt ASTNodeImporter::VisitAddrLabelExpr(AddrLabelExpr *E) {
6464 auto Imp = importSeq(
6465 E->getAmpAmpLoc(), E->getLabelLoc(), E->getLabel(), E->getType());
6466 if (!Imp)
6467 return Imp.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006468
Balazs Keri3b30d652018-10-19 13:32:20 +00006469 SourceLocation ToAmpAmpLoc, ToLabelLoc;
6470 LabelDecl *ToLabel;
6471 QualType ToType;
6472 std::tie(ToAmpAmpLoc, ToLabelLoc, ToLabel, ToType) = *Imp;
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006473
6474 return new (Importer.getToContext()) AddrLabelExpr(
Balazs Keri3b30d652018-10-19 13:32:20 +00006475 ToAmpAmpLoc, ToLabelLoc, ToLabel, ToType);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006476}
6477
Bill Wendling8003edc2018-11-09 00:41:36 +00006478ExpectedStmt ASTNodeImporter::VisitConstantExpr(ConstantExpr *E) {
6479 auto Imp = importSeq(E->getSubExpr());
6480 if (!Imp)
6481 return Imp.takeError();
6482
6483 Expr *ToSubExpr;
6484 std::tie(ToSubExpr) = *Imp;
6485
Gauthier Harnisch83c7b612019-06-15 10:24:47 +00006486 // TODO : Handle APValue::ValueKind that require importing.
6487 APValue::ValueKind Kind = E->getResultAPValueKind();
6488 if (Kind == APValue::Int || Kind == APValue::Float ||
6489 Kind == APValue::FixedPoint || Kind == APValue::ComplexFloat ||
6490 Kind == APValue::ComplexInt)
6491 return ConstantExpr::Create(Importer.getToContext(), ToSubExpr,
6492 E->getAPValueResult());
Fangrui Song407659a2018-11-30 23:41:18 +00006493 return ConstantExpr::Create(Importer.getToContext(), ToSubExpr);
Bill Wendling8003edc2018-11-09 00:41:36 +00006494}
6495
Balazs Keri3b30d652018-10-19 13:32:20 +00006496ExpectedStmt ASTNodeImporter::VisitParenExpr(ParenExpr *E) {
6497 auto Imp = importSeq(E->getLParen(), E->getRParen(), E->getSubExpr());
6498 if (!Imp)
6499 return Imp.takeError();
6500
6501 SourceLocation ToLParen, ToRParen;
6502 Expr *ToSubExpr;
6503 std::tie(ToLParen, ToRParen, ToSubExpr) = *Imp;
Craig Topper36250ad2014-05-12 05:36:57 +00006504
Fangrui Song6907ce22018-07-30 19:24:48 +00006505 return new (Importer.getToContext())
Balazs Keri3b30d652018-10-19 13:32:20 +00006506 ParenExpr(ToLParen, ToRParen, ToSubExpr);
Douglas Gregorc74247e2010-02-19 01:07:06 +00006507}
6508
Balazs Keri3b30d652018-10-19 13:32:20 +00006509ExpectedStmt ASTNodeImporter::VisitParenListExpr(ParenListExpr *E) {
6510 SmallVector<Expr *, 4> ToExprs(E->getNumExprs());
6511 if (Error Err = ImportContainerChecked(E->exprs(), ToExprs))
6512 return std::move(Err);
6513
6514 ExpectedSLoc ToLParenLocOrErr = import(E->getLParenLoc());
6515 if (!ToLParenLocOrErr)
6516 return ToLParenLocOrErr.takeError();
6517
6518 ExpectedSLoc ToRParenLocOrErr = import(E->getRParenLoc());
6519 if (!ToRParenLocOrErr)
6520 return ToRParenLocOrErr.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006521
Bruno Riccif49e1ca2018-11-20 16:20:40 +00006522 return ParenListExpr::Create(Importer.getToContext(), *ToLParenLocOrErr,
6523 ToExprs, *ToRParenLocOrErr);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006524}
6525
Balazs Keri3b30d652018-10-19 13:32:20 +00006526ExpectedStmt ASTNodeImporter::VisitStmtExpr(StmtExpr *E) {
6527 auto Imp = importSeq(
6528 E->getSubStmt(), E->getType(), E->getLParenLoc(), E->getRParenLoc());
6529 if (!Imp)
6530 return Imp.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006531
Balazs Keri3b30d652018-10-19 13:32:20 +00006532 CompoundStmt *ToSubStmt;
6533 QualType ToType;
6534 SourceLocation ToLParenLoc, ToRParenLoc;
6535 std::tie(ToSubStmt, ToType, ToLParenLoc, ToRParenLoc) = *Imp;
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006536
Balazs Keri3b30d652018-10-19 13:32:20 +00006537 return new (Importer.getToContext()) StmtExpr(
6538 ToSubStmt, ToType, ToLParenLoc, ToRParenLoc);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006539}
6540
Balazs Keri3b30d652018-10-19 13:32:20 +00006541ExpectedStmt ASTNodeImporter::VisitUnaryOperator(UnaryOperator *E) {
6542 auto Imp = importSeq(
6543 E->getSubExpr(), E->getType(), E->getOperatorLoc());
6544 if (!Imp)
6545 return Imp.takeError();
Douglas Gregorc74247e2010-02-19 01:07:06 +00006546
Balazs Keri3b30d652018-10-19 13:32:20 +00006547 Expr *ToSubExpr;
6548 QualType ToType;
6549 SourceLocation ToOperatorLoc;
6550 std::tie(ToSubExpr, ToType, ToOperatorLoc) = *Imp;
Craig Topper36250ad2014-05-12 05:36:57 +00006551
Aaron Ballmana5038552018-01-09 13:07:03 +00006552 return new (Importer.getToContext()) UnaryOperator(
Balazs Keri3b30d652018-10-19 13:32:20 +00006553 ToSubExpr, E->getOpcode(), ToType, E->getValueKind(), E->getObjectKind(),
6554 ToOperatorLoc, E->canOverflow());
Douglas Gregorc74247e2010-02-19 01:07:06 +00006555}
6556
Balazs Keri3b30d652018-10-19 13:32:20 +00006557ExpectedStmt
Aaron Ballmana5038552018-01-09 13:07:03 +00006558ASTNodeImporter::VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *E) {
Balazs Keri3b30d652018-10-19 13:32:20 +00006559 auto Imp = importSeq(E->getType(), E->getOperatorLoc(), E->getRParenLoc());
6560 if (!Imp)
6561 return Imp.takeError();
6562
6563 QualType ToType;
6564 SourceLocation ToOperatorLoc, ToRParenLoc;
6565 std::tie(ToType, ToOperatorLoc, ToRParenLoc) = *Imp;
Fangrui Song6907ce22018-07-30 19:24:48 +00006566
Douglas Gregord8552cd2010-02-19 01:24:23 +00006567 if (E->isArgumentType()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00006568 Expected<TypeSourceInfo *> ToArgumentTypeInfoOrErr =
6569 import(E->getArgumentTypeInfo());
6570 if (!ToArgumentTypeInfoOrErr)
6571 return ToArgumentTypeInfoOrErr.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00006572
Balazs Keri3b30d652018-10-19 13:32:20 +00006573 return new (Importer.getToContext()) UnaryExprOrTypeTraitExpr(
6574 E->getKind(), *ToArgumentTypeInfoOrErr, ToType, ToOperatorLoc,
6575 ToRParenLoc);
Douglas Gregord8552cd2010-02-19 01:24:23 +00006576 }
Fangrui Song6907ce22018-07-30 19:24:48 +00006577
Balazs Keri3b30d652018-10-19 13:32:20 +00006578 ExpectedExpr ToArgumentExprOrErr = import(E->getArgumentExpr());
6579 if (!ToArgumentExprOrErr)
6580 return ToArgumentExprOrErr.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00006581
Balazs Keri3b30d652018-10-19 13:32:20 +00006582 return new (Importer.getToContext()) UnaryExprOrTypeTraitExpr(
6583 E->getKind(), *ToArgumentExprOrErr, ToType, ToOperatorLoc, ToRParenLoc);
Douglas Gregord8552cd2010-02-19 01:24:23 +00006584}
6585
Balazs Keri3b30d652018-10-19 13:32:20 +00006586ExpectedStmt ASTNodeImporter::VisitBinaryOperator(BinaryOperator *E) {
6587 auto Imp = importSeq(
6588 E->getLHS(), E->getRHS(), E->getType(), E->getOperatorLoc());
6589 if (!Imp)
6590 return Imp.takeError();
Douglas Gregorc74247e2010-02-19 01:07:06 +00006591
Balazs Keri3b30d652018-10-19 13:32:20 +00006592 Expr *ToLHS, *ToRHS;
6593 QualType ToType;
6594 SourceLocation ToOperatorLoc;
6595 std::tie(ToLHS, ToRHS, ToType, ToOperatorLoc) = *Imp;
Craig Topper36250ad2014-05-12 05:36:57 +00006596
Balazs Keri3b30d652018-10-19 13:32:20 +00006597 return new (Importer.getToContext()) BinaryOperator(
6598 ToLHS, ToRHS, E->getOpcode(), ToType, E->getValueKind(),
6599 E->getObjectKind(), ToOperatorLoc, E->getFPFeatures());
Douglas Gregorc74247e2010-02-19 01:07:06 +00006600}
6601
Balazs Keri3b30d652018-10-19 13:32:20 +00006602ExpectedStmt ASTNodeImporter::VisitConditionalOperator(ConditionalOperator *E) {
6603 auto Imp = importSeq(
6604 E->getCond(), E->getQuestionLoc(), E->getLHS(), E->getColonLoc(),
6605 E->getRHS(), E->getType());
6606 if (!Imp)
6607 return Imp.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006608
Balazs Keri3b30d652018-10-19 13:32:20 +00006609 Expr *ToCond, *ToLHS, *ToRHS;
6610 SourceLocation ToQuestionLoc, ToColonLoc;
6611 QualType ToType;
6612 std::tie(ToCond, ToQuestionLoc, ToLHS, ToColonLoc, ToRHS, ToType) = *Imp;
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006613
6614 return new (Importer.getToContext()) ConditionalOperator(
Balazs Keri3b30d652018-10-19 13:32:20 +00006615 ToCond, ToQuestionLoc, ToLHS, ToColonLoc, ToRHS, ToType,
6616 E->getValueKind(), E->getObjectKind());
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006617}
6618
Balazs Keri3b30d652018-10-19 13:32:20 +00006619ExpectedStmt ASTNodeImporter::VisitBinaryConditionalOperator(
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006620 BinaryConditionalOperator *E) {
Balazs Keri3b30d652018-10-19 13:32:20 +00006621 auto Imp = importSeq(
6622 E->getCommon(), E->getOpaqueValue(), E->getCond(), E->getTrueExpr(),
6623 E->getFalseExpr(), E->getQuestionLoc(), E->getColonLoc(), E->getType());
6624 if (!Imp)
6625 return Imp.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006626
Balazs Keri3b30d652018-10-19 13:32:20 +00006627 Expr *ToCommon, *ToCond, *ToTrueExpr, *ToFalseExpr;
6628 OpaqueValueExpr *ToOpaqueValue;
6629 SourceLocation ToQuestionLoc, ToColonLoc;
6630 QualType ToType;
6631 std::tie(
6632 ToCommon, ToOpaqueValue, ToCond, ToTrueExpr, ToFalseExpr, ToQuestionLoc,
6633 ToColonLoc, ToType) = *Imp;
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006634
6635 return new (Importer.getToContext()) BinaryConditionalOperator(
Balazs Keri3b30d652018-10-19 13:32:20 +00006636 ToCommon, ToOpaqueValue, ToCond, ToTrueExpr, ToFalseExpr,
6637 ToQuestionLoc, ToColonLoc, ToType, E->getValueKind(),
6638 E->getObjectKind());
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006639}
6640
Balazs Keri3b30d652018-10-19 13:32:20 +00006641ExpectedStmt ASTNodeImporter::VisitArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
6642 auto Imp = importSeq(
6643 E->getBeginLoc(), E->getQueriedTypeSourceInfo(),
6644 E->getDimensionExpression(), E->getEndLoc(), E->getType());
6645 if (!Imp)
6646 return Imp.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00006647
Balazs Keri3b30d652018-10-19 13:32:20 +00006648 SourceLocation ToBeginLoc, ToEndLoc;
6649 TypeSourceInfo *ToQueriedTypeSourceInfo;
6650 Expr *ToDimensionExpression;
6651 QualType ToType;
6652 std::tie(
6653 ToBeginLoc, ToQueriedTypeSourceInfo, ToDimensionExpression, ToEndLoc,
6654 ToType) = *Imp;
Aleksei Sidorina693b372016-09-28 10:16:56 +00006655
6656 return new (Importer.getToContext()) ArrayTypeTraitExpr(
Balazs Keri3b30d652018-10-19 13:32:20 +00006657 ToBeginLoc, E->getTrait(), ToQueriedTypeSourceInfo, E->getValue(),
6658 ToDimensionExpression, ToEndLoc, ToType);
Aleksei Sidorina693b372016-09-28 10:16:56 +00006659}
6660
Balazs Keri3b30d652018-10-19 13:32:20 +00006661ExpectedStmt ASTNodeImporter::VisitExpressionTraitExpr(ExpressionTraitExpr *E) {
6662 auto Imp = importSeq(
6663 E->getBeginLoc(), E->getQueriedExpression(), E->getEndLoc(), E->getType());
6664 if (!Imp)
6665 return Imp.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00006666
Balazs Keri3b30d652018-10-19 13:32:20 +00006667 SourceLocation ToBeginLoc, ToEndLoc;
6668 Expr *ToQueriedExpression;
6669 QualType ToType;
6670 std::tie(ToBeginLoc, ToQueriedExpression, ToEndLoc, ToType) = *Imp;
Aleksei Sidorina693b372016-09-28 10:16:56 +00006671
6672 return new (Importer.getToContext()) ExpressionTraitExpr(
Balazs Keri3b30d652018-10-19 13:32:20 +00006673 ToBeginLoc, E->getTrait(), ToQueriedExpression, E->getValue(),
6674 ToEndLoc, ToType);
Aleksei Sidorina693b372016-09-28 10:16:56 +00006675}
6676
Balazs Keri3b30d652018-10-19 13:32:20 +00006677ExpectedStmt ASTNodeImporter::VisitOpaqueValueExpr(OpaqueValueExpr *E) {
6678 auto Imp = importSeq(
6679 E->getLocation(), E->getType(), E->getSourceExpr());
6680 if (!Imp)
6681 return Imp.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006682
Balazs Keri3b30d652018-10-19 13:32:20 +00006683 SourceLocation ToLocation;
6684 QualType ToType;
6685 Expr *ToSourceExpr;
6686 std::tie(ToLocation, ToType, ToSourceExpr) = *Imp;
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006687
6688 return new (Importer.getToContext()) OpaqueValueExpr(
Balazs Keri3b30d652018-10-19 13:32:20 +00006689 ToLocation, ToType, E->getValueKind(), E->getObjectKind(), ToSourceExpr);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006690}
6691
Balazs Keri3b30d652018-10-19 13:32:20 +00006692ExpectedStmt ASTNodeImporter::VisitArraySubscriptExpr(ArraySubscriptExpr *E) {
6693 auto Imp = importSeq(
6694 E->getLHS(), E->getRHS(), E->getType(), E->getRBracketLoc());
6695 if (!Imp)
6696 return Imp.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00006697
Balazs Keri3b30d652018-10-19 13:32:20 +00006698 Expr *ToLHS, *ToRHS;
6699 SourceLocation ToRBracketLoc;
6700 QualType ToType;
6701 std::tie(ToLHS, ToRHS, ToType, ToRBracketLoc) = *Imp;
Aleksei Sidorina693b372016-09-28 10:16:56 +00006702
6703 return new (Importer.getToContext()) ArraySubscriptExpr(
Balazs Keri3b30d652018-10-19 13:32:20 +00006704 ToLHS, ToRHS, ToType, E->getValueKind(), E->getObjectKind(),
6705 ToRBracketLoc);
Aleksei Sidorina693b372016-09-28 10:16:56 +00006706}
6707
Balazs Keri3b30d652018-10-19 13:32:20 +00006708ExpectedStmt
6709ASTNodeImporter::VisitCompoundAssignOperator(CompoundAssignOperator *E) {
6710 auto Imp = importSeq(
6711 E->getLHS(), E->getRHS(), E->getType(), E->getComputationLHSType(),
6712 E->getComputationResultType(), E->getOperatorLoc());
6713 if (!Imp)
6714 return Imp.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00006715
Balazs Keri3b30d652018-10-19 13:32:20 +00006716 Expr *ToLHS, *ToRHS;
6717 QualType ToType, ToComputationLHSType, ToComputationResultType;
6718 SourceLocation ToOperatorLoc;
6719 std::tie(ToLHS, ToRHS, ToType, ToComputationLHSType, ToComputationResultType,
6720 ToOperatorLoc) = *Imp;
Craig Topper36250ad2014-05-12 05:36:57 +00006721
Balazs Keri3b30d652018-10-19 13:32:20 +00006722 return new (Importer.getToContext()) CompoundAssignOperator(
6723 ToLHS, ToRHS, E->getOpcode(), ToType, E->getValueKind(),
6724 E->getObjectKind(), ToComputationLHSType, ToComputationResultType,
6725 ToOperatorLoc, E->getFPFeatures());
Douglas Gregorc74247e2010-02-19 01:07:06 +00006726}
6727
Balazs Keri3b30d652018-10-19 13:32:20 +00006728Expected<CXXCastPath>
6729ASTNodeImporter::ImportCastPath(CastExpr *CE) {
6730 CXXCastPath Path;
Aleksei Sidorina693b372016-09-28 10:16:56 +00006731 for (auto I = CE->path_begin(), E = CE->path_end(); I != E; ++I) {
Balazs Keri3b30d652018-10-19 13:32:20 +00006732 if (auto SpecOrErr = import(*I))
6733 Path.push_back(*SpecOrErr);
Aleksei Sidorina693b372016-09-28 10:16:56 +00006734 else
Balazs Keri3b30d652018-10-19 13:32:20 +00006735 return SpecOrErr.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00006736 }
Balazs Keri3b30d652018-10-19 13:32:20 +00006737 return Path;
John McCallcf142162010-08-07 06:22:56 +00006738}
6739
Balazs Keri3b30d652018-10-19 13:32:20 +00006740ExpectedStmt ASTNodeImporter::VisitImplicitCastExpr(ImplicitCastExpr *E) {
6741 ExpectedType ToTypeOrErr = import(E->getType());
6742 if (!ToTypeOrErr)
6743 return ToTypeOrErr.takeError();
Douglas Gregor98c10182010-02-12 22:17:39 +00006744
Balazs Keri3b30d652018-10-19 13:32:20 +00006745 ExpectedExpr ToSubExprOrErr = import(E->getSubExpr());
6746 if (!ToSubExprOrErr)
6747 return ToSubExprOrErr.takeError();
John McCallcf142162010-08-07 06:22:56 +00006748
Balazs Keri3b30d652018-10-19 13:32:20 +00006749 Expected<CXXCastPath> ToBasePathOrErr = ImportCastPath(E);
6750 if (!ToBasePathOrErr)
6751 return ToBasePathOrErr.takeError();
John McCallcf142162010-08-07 06:22:56 +00006752
Balazs Keri3b30d652018-10-19 13:32:20 +00006753 return ImplicitCastExpr::Create(
6754 Importer.getToContext(), *ToTypeOrErr, E->getCastKind(), *ToSubExprOrErr,
6755 &(*ToBasePathOrErr), E->getValueKind());
Douglas Gregor98c10182010-02-12 22:17:39 +00006756}
6757
Balazs Keri3b30d652018-10-19 13:32:20 +00006758ExpectedStmt ASTNodeImporter::VisitExplicitCastExpr(ExplicitCastExpr *E) {
6759 auto Imp1 = importSeq(
6760 E->getType(), E->getSubExpr(), E->getTypeInfoAsWritten());
6761 if (!Imp1)
6762 return Imp1.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00006763
Balazs Keri3b30d652018-10-19 13:32:20 +00006764 QualType ToType;
6765 Expr *ToSubExpr;
6766 TypeSourceInfo *ToTypeInfoAsWritten;
6767 std::tie(ToType, ToSubExpr, ToTypeInfoAsWritten) = *Imp1;
Douglas Gregor5481d322010-02-19 01:32:14 +00006768
Balazs Keri3b30d652018-10-19 13:32:20 +00006769 Expected<CXXCastPath> ToBasePathOrErr = ImportCastPath(E);
6770 if (!ToBasePathOrErr)
6771 return ToBasePathOrErr.takeError();
6772 CXXCastPath *ToBasePath = &(*ToBasePathOrErr);
John McCallcf142162010-08-07 06:22:56 +00006773
Aleksei Sidorina693b372016-09-28 10:16:56 +00006774 switch (E->getStmtClass()) {
6775 case Stmt::CStyleCastExprClass: {
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00006776 auto *CCE = cast<CStyleCastExpr>(E);
Balazs Keri3b30d652018-10-19 13:32:20 +00006777 ExpectedSLoc ToLParenLocOrErr = import(CCE->getLParenLoc());
6778 if (!ToLParenLocOrErr)
6779 return ToLParenLocOrErr.takeError();
6780 ExpectedSLoc ToRParenLocOrErr = import(CCE->getRParenLoc());
6781 if (!ToRParenLocOrErr)
6782 return ToRParenLocOrErr.takeError();
6783 return CStyleCastExpr::Create(
6784 Importer.getToContext(), ToType, E->getValueKind(), E->getCastKind(),
6785 ToSubExpr, ToBasePath, ToTypeInfoAsWritten, *ToLParenLocOrErr,
6786 *ToRParenLocOrErr);
Aleksei Sidorina693b372016-09-28 10:16:56 +00006787 }
6788
6789 case Stmt::CXXFunctionalCastExprClass: {
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00006790 auto *FCE = cast<CXXFunctionalCastExpr>(E);
Balazs Keri3b30d652018-10-19 13:32:20 +00006791 ExpectedSLoc ToLParenLocOrErr = import(FCE->getLParenLoc());
6792 if (!ToLParenLocOrErr)
6793 return ToLParenLocOrErr.takeError();
6794 ExpectedSLoc ToRParenLocOrErr = import(FCE->getRParenLoc());
6795 if (!ToRParenLocOrErr)
6796 return ToRParenLocOrErr.takeError();
6797 return CXXFunctionalCastExpr::Create(
6798 Importer.getToContext(), ToType, E->getValueKind(), ToTypeInfoAsWritten,
6799 E->getCastKind(), ToSubExpr, ToBasePath, *ToLParenLocOrErr,
6800 *ToRParenLocOrErr);
Aleksei Sidorina693b372016-09-28 10:16:56 +00006801 }
6802
6803 case Stmt::ObjCBridgedCastExprClass: {
Balazs Keri3b30d652018-10-19 13:32:20 +00006804 auto *OCE = cast<ObjCBridgedCastExpr>(E);
6805 ExpectedSLoc ToLParenLocOrErr = import(OCE->getLParenLoc());
6806 if (!ToLParenLocOrErr)
6807 return ToLParenLocOrErr.takeError();
6808 ExpectedSLoc ToBridgeKeywordLocOrErr = import(OCE->getBridgeKeywordLoc());
6809 if (!ToBridgeKeywordLocOrErr)
6810 return ToBridgeKeywordLocOrErr.takeError();
6811 return new (Importer.getToContext()) ObjCBridgedCastExpr(
6812 *ToLParenLocOrErr, OCE->getBridgeKind(), E->getCastKind(),
6813 *ToBridgeKeywordLocOrErr, ToTypeInfoAsWritten, ToSubExpr);
Aleksei Sidorina693b372016-09-28 10:16:56 +00006814 }
6815 default:
Aleksei Sidorina693b372016-09-28 10:16:56 +00006816 llvm_unreachable("Cast expression of unsupported type!");
Balazs Keri3b30d652018-10-19 13:32:20 +00006817 return make_error<ImportError>(ImportError::UnsupportedConstruct);
Aleksei Sidorina693b372016-09-28 10:16:56 +00006818 }
6819}
6820
Balazs Keri3b30d652018-10-19 13:32:20 +00006821ExpectedStmt ASTNodeImporter::VisitOffsetOfExpr(OffsetOfExpr *E) {
6822 SmallVector<OffsetOfNode, 4> ToNodes;
6823 for (int I = 0, N = E->getNumComponents(); I < N; ++I) {
6824 const OffsetOfNode &FromNode = E->getComponent(I);
Aleksei Sidorina693b372016-09-28 10:16:56 +00006825
Balazs Keri3b30d652018-10-19 13:32:20 +00006826 SourceLocation ToBeginLoc, ToEndLoc;
6827 if (FromNode.getKind() != OffsetOfNode::Base) {
6828 auto Imp = importSeq(FromNode.getBeginLoc(), FromNode.getEndLoc());
6829 if (!Imp)
6830 return Imp.takeError();
6831 std::tie(ToBeginLoc, ToEndLoc) = *Imp;
6832 }
Aleksei Sidorina693b372016-09-28 10:16:56 +00006833
Balazs Keri3b30d652018-10-19 13:32:20 +00006834 switch (FromNode.getKind()) {
Aleksei Sidorina693b372016-09-28 10:16:56 +00006835 case OffsetOfNode::Array:
Balazs Keri3b30d652018-10-19 13:32:20 +00006836 ToNodes.push_back(
6837 OffsetOfNode(ToBeginLoc, FromNode.getArrayExprIndex(), ToEndLoc));
Aleksei Sidorina693b372016-09-28 10:16:56 +00006838 break;
Aleksei Sidorina693b372016-09-28 10:16:56 +00006839 case OffsetOfNode::Base: {
Balazs Keri3b30d652018-10-19 13:32:20 +00006840 auto ToBSOrErr = import(FromNode.getBase());
6841 if (!ToBSOrErr)
6842 return ToBSOrErr.takeError();
6843 ToNodes.push_back(OffsetOfNode(*ToBSOrErr));
Aleksei Sidorina693b372016-09-28 10:16:56 +00006844 break;
6845 }
6846 case OffsetOfNode::Field: {
Balazs Keri3b30d652018-10-19 13:32:20 +00006847 auto ToFieldOrErr = import(FromNode.getField());
6848 if (!ToFieldOrErr)
6849 return ToFieldOrErr.takeError();
6850 ToNodes.push_back(OffsetOfNode(ToBeginLoc, *ToFieldOrErr, ToEndLoc));
Aleksei Sidorina693b372016-09-28 10:16:56 +00006851 break;
6852 }
6853 case OffsetOfNode::Identifier: {
Balazs Keri3b30d652018-10-19 13:32:20 +00006854 IdentifierInfo *ToII = Importer.Import(FromNode.getFieldName());
6855 ToNodes.push_back(OffsetOfNode(ToBeginLoc, ToII, ToEndLoc));
Aleksei Sidorina693b372016-09-28 10:16:56 +00006856 break;
6857 }
6858 }
6859 }
6860
Balazs Keri3b30d652018-10-19 13:32:20 +00006861 SmallVector<Expr *, 4> ToExprs(E->getNumExpressions());
6862 for (int I = 0, N = E->getNumExpressions(); I < N; ++I) {
6863 ExpectedExpr ToIndexExprOrErr = import(E->getIndexExpr(I));
6864 if (!ToIndexExprOrErr)
6865 return ToIndexExprOrErr.takeError();
6866 ToExprs[I] = *ToIndexExprOrErr;
Aleksei Sidorina693b372016-09-28 10:16:56 +00006867 }
6868
Balazs Keri3b30d652018-10-19 13:32:20 +00006869 auto Imp = importSeq(
6870 E->getType(), E->getTypeSourceInfo(), E->getOperatorLoc(),
6871 E->getRParenLoc());
6872 if (!Imp)
6873 return Imp.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00006874
Balazs Keri3b30d652018-10-19 13:32:20 +00006875 QualType ToType;
6876 TypeSourceInfo *ToTypeSourceInfo;
6877 SourceLocation ToOperatorLoc, ToRParenLoc;
6878 std::tie(ToType, ToTypeSourceInfo, ToOperatorLoc, ToRParenLoc) = *Imp;
6879
6880 return OffsetOfExpr::Create(
6881 Importer.getToContext(), ToType, ToOperatorLoc, ToTypeSourceInfo, ToNodes,
6882 ToExprs, ToRParenLoc);
Aleksei Sidorina693b372016-09-28 10:16:56 +00006883}
6884
Balazs Keri3b30d652018-10-19 13:32:20 +00006885ExpectedStmt ASTNodeImporter::VisitCXXNoexceptExpr(CXXNoexceptExpr *E) {
6886 auto Imp = importSeq(
6887 E->getType(), E->getOperand(), E->getBeginLoc(), E->getEndLoc());
6888 if (!Imp)
6889 return Imp.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00006890
Balazs Keri3b30d652018-10-19 13:32:20 +00006891 QualType ToType;
6892 Expr *ToOperand;
6893 SourceLocation ToBeginLoc, ToEndLoc;
6894 std::tie(ToType, ToOperand, ToBeginLoc, ToEndLoc) = *Imp;
Aleksei Sidorina693b372016-09-28 10:16:56 +00006895
Balazs Keri3b30d652018-10-19 13:32:20 +00006896 CanThrowResult ToCanThrow;
Aleksei Sidorina693b372016-09-28 10:16:56 +00006897 if (E->isValueDependent())
Balazs Keri3b30d652018-10-19 13:32:20 +00006898 ToCanThrow = CT_Dependent;
Aleksei Sidorina693b372016-09-28 10:16:56 +00006899 else
Balazs Keri3b30d652018-10-19 13:32:20 +00006900 ToCanThrow = E->getValue() ? CT_Can : CT_Cannot;
Aleksei Sidorina693b372016-09-28 10:16:56 +00006901
Balazs Keri3b30d652018-10-19 13:32:20 +00006902 return new (Importer.getToContext()) CXXNoexceptExpr(
6903 ToType, ToOperand, ToCanThrow, ToBeginLoc, ToEndLoc);
Aleksei Sidorina693b372016-09-28 10:16:56 +00006904}
6905
Balazs Keri3b30d652018-10-19 13:32:20 +00006906ExpectedStmt ASTNodeImporter::VisitCXXThrowExpr(CXXThrowExpr *E) {
6907 auto Imp = importSeq(E->getSubExpr(), E->getType(), E->getThrowLoc());
6908 if (!Imp)
6909 return Imp.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00006910
Balazs Keri3b30d652018-10-19 13:32:20 +00006911 Expr *ToSubExpr;
6912 QualType ToType;
6913 SourceLocation ToThrowLoc;
6914 std::tie(ToSubExpr, ToType, ToThrowLoc) = *Imp;
Aleksei Sidorina693b372016-09-28 10:16:56 +00006915
6916 return new (Importer.getToContext()) CXXThrowExpr(
Balazs Keri3b30d652018-10-19 13:32:20 +00006917 ToSubExpr, ToType, ToThrowLoc, E->isThrownVariableInScope());
Aleksei Sidorina693b372016-09-28 10:16:56 +00006918}
6919
Balazs Keri3b30d652018-10-19 13:32:20 +00006920ExpectedStmt ASTNodeImporter::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
6921 ExpectedSLoc ToUsedLocOrErr = import(E->getUsedLocation());
6922 if (!ToUsedLocOrErr)
6923 return ToUsedLocOrErr.takeError();
6924
6925 auto ToParamOrErr = import(E->getParam());
6926 if (!ToParamOrErr)
6927 return ToParamOrErr.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00006928
Eric Fiselier708afb52019-05-16 21:04:15 +00006929 auto UsedContextOrErr = Importer.ImportContext(E->getUsedContext());
6930 if (!UsedContextOrErr)
6931 return UsedContextOrErr.takeError();
6932
Balazs Keric5095942019-08-14 09:41:39 +00006933 // Import the default arg if it was not imported yet.
6934 // This is needed because it can happen that during the import of the
6935 // default expression (from VisitParmVarDecl) the same ParmVarDecl is
6936 // encountered here. The default argument for a ParmVarDecl is set in the
6937 // ParmVarDecl only after it is imported (set in VisitParmVarDecl if not here,
6938 // see VisitParmVarDecl).
6939 ParmVarDecl *ToParam = *ToParamOrErr;
6940 if (!ToParam->getDefaultArg()) {
6941 Optional<ParmVarDecl *> FromParam = Importer.getImportedFromDecl(ToParam);
6942 assert(FromParam && "ParmVarDecl was not imported?");
6943
6944 if (Error Err = ImportDefaultArgOfParmVarDecl(*FromParam, ToParam))
6945 return std::move(Err);
6946 }
6947
6948 return CXXDefaultArgExpr::Create(Importer.getToContext(), *ToUsedLocOrErr,
6949 *ToParamOrErr, *UsedContextOrErr);
Aleksei Sidorina693b372016-09-28 10:16:56 +00006950}
6951
Balazs Keri3b30d652018-10-19 13:32:20 +00006952ExpectedStmt
6953ASTNodeImporter::VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E) {
6954 auto Imp = importSeq(
6955 E->getType(), E->getTypeSourceInfo(), E->getRParenLoc());
6956 if (!Imp)
6957 return Imp.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00006958
Balazs Keri3b30d652018-10-19 13:32:20 +00006959 QualType ToType;
6960 TypeSourceInfo *ToTypeSourceInfo;
6961 SourceLocation ToRParenLoc;
6962 std::tie(ToType, ToTypeSourceInfo, ToRParenLoc) = *Imp;
Aleksei Sidorina693b372016-09-28 10:16:56 +00006963
6964 return new (Importer.getToContext()) CXXScalarValueInitExpr(
Balazs Keri3b30d652018-10-19 13:32:20 +00006965 ToType, ToTypeSourceInfo, ToRParenLoc);
Aleksei Sidorina693b372016-09-28 10:16:56 +00006966}
6967
Balazs Keri3b30d652018-10-19 13:32:20 +00006968ExpectedStmt
6969ASTNodeImporter::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
6970 ExpectedExpr ToSubExprOrErr = import(E->getSubExpr());
6971 if (!ToSubExprOrErr)
6972 return ToSubExprOrErr.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00006973
Balazs Keri3b30d652018-10-19 13:32:20 +00006974 auto ToDtorOrErr = import(E->getTemporary()->getDestructor());
6975 if (!ToDtorOrErr)
6976 return ToDtorOrErr.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00006977
6978 ASTContext &ToCtx = Importer.getToContext();
Balazs Keri3b30d652018-10-19 13:32:20 +00006979 CXXTemporary *Temp = CXXTemporary::Create(ToCtx, *ToDtorOrErr);
6980 return CXXBindTemporaryExpr::Create(ToCtx, Temp, *ToSubExprOrErr);
Aleksei Sidorina693b372016-09-28 10:16:56 +00006981}
6982
Balazs Keri3b30d652018-10-19 13:32:20 +00006983ExpectedStmt
6984ASTNodeImporter::VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E) {
6985 auto Imp = importSeq(
6986 E->getConstructor(), E->getType(), E->getTypeSourceInfo(),
6987 E->getParenOrBraceRange());
6988 if (!Imp)
6989 return Imp.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00006990
Balazs Keri3b30d652018-10-19 13:32:20 +00006991 CXXConstructorDecl *ToConstructor;
6992 QualType ToType;
6993 TypeSourceInfo *ToTypeSourceInfo;
6994 SourceRange ToParenOrBraceRange;
6995 std::tie(ToConstructor, ToType, ToTypeSourceInfo, ToParenOrBraceRange) = *Imp;
Gabor Horvathc78d99a2018-01-27 16:11:45 +00006996
Balazs Keri3b30d652018-10-19 13:32:20 +00006997 SmallVector<Expr *, 8> ToArgs(E->getNumArgs());
6998 if (Error Err = ImportContainerChecked(E->arguments(), ToArgs))
6999 return std::move(Err);
Aleksei Sidorina693b372016-09-28 10:16:56 +00007000
Bruno Ricciddb8f6b2018-12-22 14:39:30 +00007001 return CXXTemporaryObjectExpr::Create(
Balazs Keri3b30d652018-10-19 13:32:20 +00007002 Importer.getToContext(), ToConstructor, ToType, ToTypeSourceInfo, ToArgs,
7003 ToParenOrBraceRange, E->hadMultipleCandidates(),
7004 E->isListInitialization(), E->isStdInitListInitialization(),
7005 E->requiresZeroInitialization());
Aleksei Sidorina693b372016-09-28 10:16:56 +00007006}
7007
Balazs Keri3b30d652018-10-19 13:32:20 +00007008ExpectedStmt
Aleksei Sidorina693b372016-09-28 10:16:56 +00007009ASTNodeImporter::VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *E) {
Balazs Keri3b30d652018-10-19 13:32:20 +00007010 auto Imp = importSeq(
7011 E->getType(), E->GetTemporaryExpr(), E->getExtendingDecl());
7012 if (!Imp)
7013 return Imp.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00007014
Balazs Keri3b30d652018-10-19 13:32:20 +00007015 QualType ToType;
7016 Expr *ToTemporaryExpr;
7017 const ValueDecl *ToExtendingDecl;
7018 std::tie(ToType, ToTemporaryExpr, ToExtendingDecl) = *Imp;
Aleksei Sidorina693b372016-09-28 10:16:56 +00007019
7020 auto *ToMTE = new (Importer.getToContext()) MaterializeTemporaryExpr(
Balazs Keri3b30d652018-10-19 13:32:20 +00007021 ToType, ToTemporaryExpr, E->isBoundToLvalueReference());
Aleksei Sidorina693b372016-09-28 10:16:56 +00007022
7023 // FIXME: Should ManglingNumber get numbers associated with 'to' context?
Balazs Keri3b30d652018-10-19 13:32:20 +00007024 ToMTE->setExtendingDecl(ToExtendingDecl, E->getManglingNumber());
Aleksei Sidorina693b372016-09-28 10:16:56 +00007025 return ToMTE;
7026}
7027
Balazs Keri3b30d652018-10-19 13:32:20 +00007028ExpectedStmt ASTNodeImporter::VisitPackExpansionExpr(PackExpansionExpr *E) {
7029 auto Imp = importSeq(
7030 E->getType(), E->getPattern(), E->getEllipsisLoc());
7031 if (!Imp)
7032 return Imp.takeError();
Gabor Horvath7a91c082017-11-14 11:30:38 +00007033
Balazs Keri3b30d652018-10-19 13:32:20 +00007034 QualType ToType;
7035 Expr *ToPattern;
7036 SourceLocation ToEllipsisLoc;
7037 std::tie(ToType, ToPattern, ToEllipsisLoc) = *Imp;
Gabor Horvath7a91c082017-11-14 11:30:38 +00007038
7039 return new (Importer.getToContext()) PackExpansionExpr(
Balazs Keri3b30d652018-10-19 13:32:20 +00007040 ToType, ToPattern, ToEllipsisLoc, E->getNumExpansions());
Gabor Horvath7a91c082017-11-14 11:30:38 +00007041}
7042
Balazs Keri3b30d652018-10-19 13:32:20 +00007043ExpectedStmt ASTNodeImporter::VisitSizeOfPackExpr(SizeOfPackExpr *E) {
7044 auto Imp = importSeq(
7045 E->getOperatorLoc(), E->getPack(), E->getPackLoc(), E->getRParenLoc());
7046 if (!Imp)
7047 return Imp.takeError();
7048
7049 SourceLocation ToOperatorLoc, ToPackLoc, ToRParenLoc;
7050 NamedDecl *ToPack;
7051 std::tie(ToOperatorLoc, ToPack, ToPackLoc, ToRParenLoc) = *Imp;
Gabor Horvathc78d99a2018-01-27 16:11:45 +00007052
7053 Optional<unsigned> Length;
Gabor Horvathc78d99a2018-01-27 16:11:45 +00007054 if (!E->isValueDependent())
7055 Length = E->getPackLength();
7056
Balazs Keri3b30d652018-10-19 13:32:20 +00007057 SmallVector<TemplateArgument, 8> ToPartialArguments;
Gabor Horvathc78d99a2018-01-27 16:11:45 +00007058 if (E->isPartiallySubstituted()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00007059 if (Error Err = ImportTemplateArguments(
7060 E->getPartialArguments().data(),
7061 E->getPartialArguments().size(),
7062 ToPartialArguments))
7063 return std::move(Err);
Gabor Horvathc78d99a2018-01-27 16:11:45 +00007064 }
7065
7066 return SizeOfPackExpr::Create(
Balazs Keri3b30d652018-10-19 13:32:20 +00007067 Importer.getToContext(), ToOperatorLoc, ToPack, ToPackLoc, ToRParenLoc,
7068 Length, ToPartialArguments);
Gabor Horvathc78d99a2018-01-27 16:11:45 +00007069}
7070
Aleksei Sidorina693b372016-09-28 10:16:56 +00007071
Balazs Keri3b30d652018-10-19 13:32:20 +00007072ExpectedStmt ASTNodeImporter::VisitCXXNewExpr(CXXNewExpr *E) {
7073 auto Imp = importSeq(
7074 E->getOperatorNew(), E->getOperatorDelete(), E->getTypeIdParens(),
7075 E->getArraySize(), E->getInitializer(), E->getType(),
7076 E->getAllocatedTypeSourceInfo(), E->getSourceRange(),
7077 E->getDirectInitRange());
7078 if (!Imp)
7079 return Imp.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00007080
Balazs Keri3b30d652018-10-19 13:32:20 +00007081 FunctionDecl *ToOperatorNew, *ToOperatorDelete;
7082 SourceRange ToTypeIdParens, ToSourceRange, ToDirectInitRange;
Richard Smithb9fb1212019-05-06 03:47:15 +00007083 Optional<Expr *> ToArraySize;
7084 Expr *ToInitializer;
Balazs Keri3b30d652018-10-19 13:32:20 +00007085 QualType ToType;
7086 TypeSourceInfo *ToAllocatedTypeSourceInfo;
7087 std::tie(
7088 ToOperatorNew, ToOperatorDelete, ToTypeIdParens, ToArraySize, ToInitializer,
7089 ToType, ToAllocatedTypeSourceInfo, ToSourceRange, ToDirectInitRange) = *Imp;
Aleksei Sidorina693b372016-09-28 10:16:56 +00007090
Balazs Keri3b30d652018-10-19 13:32:20 +00007091 SmallVector<Expr *, 4> ToPlacementArgs(E->getNumPlacementArgs());
7092 if (Error Err =
7093 ImportContainerChecked(E->placement_arguments(), ToPlacementArgs))
7094 return std::move(Err);
Aleksei Sidorina693b372016-09-28 10:16:56 +00007095
Bruno Ricci9b6dfac2019-01-07 15:04:45 +00007096 return CXXNewExpr::Create(
Balazs Keri3b30d652018-10-19 13:32:20 +00007097 Importer.getToContext(), E->isGlobalNew(), ToOperatorNew,
7098 ToOperatorDelete, E->passAlignment(), E->doesUsualArrayDeleteWantSize(),
7099 ToPlacementArgs, ToTypeIdParens, ToArraySize, E->getInitializationStyle(),
7100 ToInitializer, ToType, ToAllocatedTypeSourceInfo, ToSourceRange,
7101 ToDirectInitRange);
Aleksei Sidorina693b372016-09-28 10:16:56 +00007102}
7103
Balazs Keri3b30d652018-10-19 13:32:20 +00007104ExpectedStmt ASTNodeImporter::VisitCXXDeleteExpr(CXXDeleteExpr *E) {
7105 auto Imp = importSeq(
7106 E->getType(), E->getOperatorDelete(), E->getArgument(), E->getBeginLoc());
7107 if (!Imp)
7108 return Imp.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00007109
Balazs Keri3b30d652018-10-19 13:32:20 +00007110 QualType ToType;
7111 FunctionDecl *ToOperatorDelete;
7112 Expr *ToArgument;
7113 SourceLocation ToBeginLoc;
7114 std::tie(ToType, ToOperatorDelete, ToArgument, ToBeginLoc) = *Imp;
Aleksei Sidorina693b372016-09-28 10:16:56 +00007115
7116 return new (Importer.getToContext()) CXXDeleteExpr(
Balazs Keri3b30d652018-10-19 13:32:20 +00007117 ToType, E->isGlobalDelete(), E->isArrayForm(), E->isArrayFormAsWritten(),
7118 E->doesUsualArrayDeleteWantSize(), ToOperatorDelete, ToArgument,
7119 ToBeginLoc);
Douglas Gregor5481d322010-02-19 01:32:14 +00007120}
7121
Balazs Keri3b30d652018-10-19 13:32:20 +00007122ExpectedStmt ASTNodeImporter::VisitCXXConstructExpr(CXXConstructExpr *E) {
7123 auto Imp = importSeq(
7124 E->getType(), E->getLocation(), E->getConstructor(),
7125 E->getParenOrBraceRange());
7126 if (!Imp)
7127 return Imp.takeError();
Sean Callanan59721b32015-04-28 18:41:46 +00007128
Balazs Keri3b30d652018-10-19 13:32:20 +00007129 QualType ToType;
7130 SourceLocation ToLocation;
7131 CXXConstructorDecl *ToConstructor;
7132 SourceRange ToParenOrBraceRange;
7133 std::tie(ToType, ToLocation, ToConstructor, ToParenOrBraceRange) = *Imp;
Sean Callanan59721b32015-04-28 18:41:46 +00007134
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00007135 SmallVector<Expr *, 6> ToArgs(E->getNumArgs());
Balazs Keri3b30d652018-10-19 13:32:20 +00007136 if (Error Err = ImportContainerChecked(E->arguments(), ToArgs))
7137 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00007138
Balazs Keri3b30d652018-10-19 13:32:20 +00007139 return CXXConstructExpr::Create(
7140 Importer.getToContext(), ToType, ToLocation, ToConstructor,
7141 E->isElidable(), ToArgs, E->hadMultipleCandidates(),
7142 E->isListInitialization(), E->isStdInitListInitialization(),
7143 E->requiresZeroInitialization(), E->getConstructionKind(),
7144 ToParenOrBraceRange);
Sean Callanan59721b32015-04-28 18:41:46 +00007145}
7146
Balazs Keri3b30d652018-10-19 13:32:20 +00007147ExpectedStmt ASTNodeImporter::VisitExprWithCleanups(ExprWithCleanups *E) {
7148 ExpectedExpr ToSubExprOrErr = import(E->getSubExpr());
7149 if (!ToSubExprOrErr)
7150 return ToSubExprOrErr.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00007151
Balazs Keri3b30d652018-10-19 13:32:20 +00007152 SmallVector<ExprWithCleanups::CleanupObject, 8> ToObjects(E->getNumObjects());
7153 if (Error Err = ImportContainerChecked(E->getObjects(), ToObjects))
7154 return std::move(Err);
Aleksei Sidorina693b372016-09-28 10:16:56 +00007155
Balazs Keri3b30d652018-10-19 13:32:20 +00007156 return ExprWithCleanups::Create(
7157 Importer.getToContext(), *ToSubExprOrErr, E->cleanupsHaveSideEffects(),
7158 ToObjects);
Aleksei Sidorina693b372016-09-28 10:16:56 +00007159}
7160
Balazs Keri3b30d652018-10-19 13:32:20 +00007161ExpectedStmt ASTNodeImporter::VisitCXXMemberCallExpr(CXXMemberCallExpr *E) {
7162 auto Imp = importSeq(
7163 E->getCallee(), E->getType(), E->getRParenLoc());
7164 if (!Imp)
7165 return Imp.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00007166
Balazs Keri3b30d652018-10-19 13:32:20 +00007167 Expr *ToCallee;
7168 QualType ToType;
7169 SourceLocation ToRParenLoc;
7170 std::tie(ToCallee, ToType, ToRParenLoc) = *Imp;
Fangrui Song6907ce22018-07-30 19:24:48 +00007171
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00007172 SmallVector<Expr *, 4> ToArgs(E->getNumArgs());
Balazs Keri3b30d652018-10-19 13:32:20 +00007173 if (Error Err = ImportContainerChecked(E->arguments(), ToArgs))
7174 return std::move(Err);
Sean Callanan8bca9962016-03-28 21:43:01 +00007175
Bruno Riccic5885cf2018-12-21 15:20:32 +00007176 return CXXMemberCallExpr::Create(Importer.getToContext(), ToCallee, ToArgs,
7177 ToType, E->getValueKind(), ToRParenLoc);
Sean Callanan8bca9962016-03-28 21:43:01 +00007178}
7179
Balazs Keri3b30d652018-10-19 13:32:20 +00007180ExpectedStmt ASTNodeImporter::VisitCXXThisExpr(CXXThisExpr *E) {
7181 ExpectedType ToTypeOrErr = import(E->getType());
7182 if (!ToTypeOrErr)
7183 return ToTypeOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00007184
Balazs Keri3b30d652018-10-19 13:32:20 +00007185 ExpectedSLoc ToLocationOrErr = import(E->getLocation());
7186 if (!ToLocationOrErr)
7187 return ToLocationOrErr.takeError();
7188
7189 return new (Importer.getToContext()) CXXThisExpr(
7190 *ToLocationOrErr, *ToTypeOrErr, E->isImplicit());
Sean Callanan8bca9962016-03-28 21:43:01 +00007191}
7192
Balazs Keri3b30d652018-10-19 13:32:20 +00007193ExpectedStmt ASTNodeImporter::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
7194 ExpectedType ToTypeOrErr = import(E->getType());
7195 if (!ToTypeOrErr)
7196 return ToTypeOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00007197
Balazs Keri3b30d652018-10-19 13:32:20 +00007198 ExpectedSLoc ToLocationOrErr = import(E->getLocation());
7199 if (!ToLocationOrErr)
7200 return ToLocationOrErr.takeError();
7201
7202 return new (Importer.getToContext()) CXXBoolLiteralExpr(
7203 E->getValue(), *ToTypeOrErr, *ToLocationOrErr);
Sean Callanan8bca9962016-03-28 21:43:01 +00007204}
7205
Balazs Keri3b30d652018-10-19 13:32:20 +00007206ExpectedStmt ASTNodeImporter::VisitMemberExpr(MemberExpr *E) {
7207 auto Imp1 = importSeq(
7208 E->getBase(), E->getOperatorLoc(), E->getQualifierLoc(),
7209 E->getTemplateKeywordLoc(), E->getMemberDecl(), E->getType());
7210 if (!Imp1)
7211 return Imp1.takeError();
Sean Callanan8bca9962016-03-28 21:43:01 +00007212
Balazs Keri3b30d652018-10-19 13:32:20 +00007213 Expr *ToBase;
7214 SourceLocation ToOperatorLoc, ToTemplateKeywordLoc;
7215 NestedNameSpecifierLoc ToQualifierLoc;
7216 ValueDecl *ToMemberDecl;
7217 QualType ToType;
7218 std::tie(
7219 ToBase, ToOperatorLoc, ToQualifierLoc, ToTemplateKeywordLoc, ToMemberDecl,
7220 ToType) = *Imp1;
Sean Callanan59721b32015-04-28 18:41:46 +00007221
Balazs Keri3b30d652018-10-19 13:32:20 +00007222 auto Imp2 = importSeq(
7223 E->getFoundDecl().getDecl(), E->getMemberNameInfo().getName(),
7224 E->getMemberNameInfo().getLoc(), E->getLAngleLoc(), E->getRAngleLoc());
7225 if (!Imp2)
7226 return Imp2.takeError();
7227 NamedDecl *ToDecl;
7228 DeclarationName ToName;
7229 SourceLocation ToLoc, ToLAngleLoc, ToRAngleLoc;
7230 std::tie(ToDecl, ToName, ToLoc, ToLAngleLoc, ToRAngleLoc) = *Imp2;
Peter Szecsief972522018-05-02 11:52:54 +00007231
7232 DeclAccessPair ToFoundDecl =
7233 DeclAccessPair::make(ToDecl, E->getFoundDecl().getAccess());
Sean Callanan59721b32015-04-28 18:41:46 +00007234
Balazs Keri3b30d652018-10-19 13:32:20 +00007235 DeclarationNameInfo ToMemberNameInfo(ToName, ToLoc);
Sean Callanan59721b32015-04-28 18:41:46 +00007236
Gabor Marton5caba302019-03-07 13:38:20 +00007237 TemplateArgumentListInfo ToTAInfo, *ResInfo = nullptr;
Sean Callanan59721b32015-04-28 18:41:46 +00007238 if (E->hasExplicitTemplateArgs()) {
Gabor Marton5caba302019-03-07 13:38:20 +00007239 if (Error Err =
7240 ImportTemplateArgumentListInfo(E->getLAngleLoc(), E->getRAngleLoc(),
7241 E->template_arguments(), ToTAInfo))
7242 return std::move(Err);
7243 ResInfo = &ToTAInfo;
Sean Callanan59721b32015-04-28 18:41:46 +00007244 }
7245
Richard Smith1bbad592019-06-11 17:50:36 +00007246 return MemberExpr::Create(Importer.getToContext(), ToBase, E->isArrow(),
7247 ToOperatorLoc, ToQualifierLoc, ToTemplateKeywordLoc,
7248 ToMemberDecl, ToFoundDecl, ToMemberNameInfo,
7249 ResInfo, ToType, E->getValueKind(),
7250 E->getObjectKind(), E->isNonOdrUse());
Sean Callanan59721b32015-04-28 18:41:46 +00007251}
7252
Balazs Keri3b30d652018-10-19 13:32:20 +00007253ExpectedStmt
7254ASTNodeImporter::VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E) {
7255 auto Imp = importSeq(
7256 E->getBase(), E->getOperatorLoc(), E->getQualifierLoc(),
7257 E->getScopeTypeInfo(), E->getColonColonLoc(), E->getTildeLoc());
7258 if (!Imp)
7259 return Imp.takeError();
Aleksei Sidorin60ccb7d2017-11-27 10:30:00 +00007260
Balazs Keri3b30d652018-10-19 13:32:20 +00007261 Expr *ToBase;
7262 SourceLocation ToOperatorLoc, ToColonColonLoc, ToTildeLoc;
7263 NestedNameSpecifierLoc ToQualifierLoc;
7264 TypeSourceInfo *ToScopeTypeInfo;
7265 std::tie(
7266 ToBase, ToOperatorLoc, ToQualifierLoc, ToScopeTypeInfo, ToColonColonLoc,
7267 ToTildeLoc) = *Imp;
Aleksei Sidorin60ccb7d2017-11-27 10:30:00 +00007268
7269 PseudoDestructorTypeStorage Storage;
7270 if (IdentifierInfo *FromII = E->getDestroyedTypeIdentifier()) {
7271 IdentifierInfo *ToII = Importer.Import(FromII);
Balazs Keri3b30d652018-10-19 13:32:20 +00007272 ExpectedSLoc ToDestroyedTypeLocOrErr = import(E->getDestroyedTypeLoc());
7273 if (!ToDestroyedTypeLocOrErr)
7274 return ToDestroyedTypeLocOrErr.takeError();
7275 Storage = PseudoDestructorTypeStorage(ToII, *ToDestroyedTypeLocOrErr);
Aleksei Sidorin60ccb7d2017-11-27 10:30:00 +00007276 } else {
Balazs Keri3b30d652018-10-19 13:32:20 +00007277 if (auto ToTIOrErr = import(E->getDestroyedTypeInfo()))
7278 Storage = PseudoDestructorTypeStorage(*ToTIOrErr);
7279 else
7280 return ToTIOrErr.takeError();
Aleksei Sidorin60ccb7d2017-11-27 10:30:00 +00007281 }
7282
7283 return new (Importer.getToContext()) CXXPseudoDestructorExpr(
Balazs Keri3b30d652018-10-19 13:32:20 +00007284 Importer.getToContext(), ToBase, E->isArrow(), ToOperatorLoc,
7285 ToQualifierLoc, ToScopeTypeInfo, ToColonColonLoc, ToTildeLoc, Storage);
Aleksei Sidorin60ccb7d2017-11-27 10:30:00 +00007286}
7287
Balazs Keri3b30d652018-10-19 13:32:20 +00007288ExpectedStmt ASTNodeImporter::VisitCXXDependentScopeMemberExpr(
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00007289 CXXDependentScopeMemberExpr *E) {
Balazs Keri3b30d652018-10-19 13:32:20 +00007290 auto Imp = importSeq(
7291 E->getType(), E->getOperatorLoc(), E->getQualifierLoc(),
7292 E->getTemplateKeywordLoc(), E->getFirstQualifierFoundInScope());
7293 if (!Imp)
7294 return Imp.takeError();
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00007295
Balazs Keri3b30d652018-10-19 13:32:20 +00007296 QualType ToType;
7297 SourceLocation ToOperatorLoc, ToTemplateKeywordLoc;
7298 NestedNameSpecifierLoc ToQualifierLoc;
7299 NamedDecl *ToFirstQualifierFoundInScope;
7300 std::tie(
7301 ToType, ToOperatorLoc, ToQualifierLoc, ToTemplateKeywordLoc,
7302 ToFirstQualifierFoundInScope) = *Imp;
7303
7304 Expr *ToBase = nullptr;
7305 if (!E->isImplicitAccess()) {
7306 if (ExpectedExpr ToBaseOrErr = import(E->getBase()))
7307 ToBase = *ToBaseOrErr;
7308 else
7309 return ToBaseOrErr.takeError();
7310 }
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00007311
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00007312 TemplateArgumentListInfo ToTAInfo, *ResInfo = nullptr;
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00007313 if (E->hasExplicitTemplateArgs()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00007314 if (Error Err = ImportTemplateArgumentListInfo(
7315 E->getLAngleLoc(), E->getRAngleLoc(), E->template_arguments(),
7316 ToTAInfo))
7317 return std::move(Err);
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00007318 ResInfo = &ToTAInfo;
7319 }
7320
Balazs Keri3b30d652018-10-19 13:32:20 +00007321 auto ToMemberNameInfoOrErr = importSeq(E->getMember(), E->getMemberLoc());
7322 if (!ToMemberNameInfoOrErr)
7323 return ToMemberNameInfoOrErr.takeError();
7324 DeclarationNameInfo ToMemberNameInfo(
7325 std::get<0>(*ToMemberNameInfoOrErr), std::get<1>(*ToMemberNameInfoOrErr));
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00007326 // Import additional name location/type info.
Balazs Keri3b30d652018-10-19 13:32:20 +00007327 if (Error Err = ImportDeclarationNameLoc(
7328 E->getMemberNameInfo(), ToMemberNameInfo))
7329 return std::move(Err);
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00007330
7331 return CXXDependentScopeMemberExpr::Create(
Balazs Keri3b30d652018-10-19 13:32:20 +00007332 Importer.getToContext(), ToBase, ToType, E->isArrow(), ToOperatorLoc,
7333 ToQualifierLoc, ToTemplateKeywordLoc, ToFirstQualifierFoundInScope,
7334 ToMemberNameInfo, ResInfo);
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00007335}
7336
Balazs Keri3b30d652018-10-19 13:32:20 +00007337ExpectedStmt
Peter Szecsice7f3182018-05-07 12:08:27 +00007338ASTNodeImporter::VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E) {
Balazs Keri3b30d652018-10-19 13:32:20 +00007339 auto Imp = importSeq(
7340 E->getQualifierLoc(), E->getTemplateKeywordLoc(), E->getDeclName(),
7341 E->getExprLoc(), E->getLAngleLoc(), E->getRAngleLoc());
7342 if (!Imp)
7343 return Imp.takeError();
Peter Szecsice7f3182018-05-07 12:08:27 +00007344
Balazs Keri3b30d652018-10-19 13:32:20 +00007345 NestedNameSpecifierLoc ToQualifierLoc;
7346 SourceLocation ToTemplateKeywordLoc, ToExprLoc, ToLAngleLoc, ToRAngleLoc;
7347 DeclarationName ToDeclName;
7348 std::tie(
7349 ToQualifierLoc, ToTemplateKeywordLoc, ToDeclName, ToExprLoc,
7350 ToLAngleLoc, ToRAngleLoc) = *Imp;
Peter Szecsice7f3182018-05-07 12:08:27 +00007351
Balazs Keri3b30d652018-10-19 13:32:20 +00007352 DeclarationNameInfo ToNameInfo(ToDeclName, ToExprLoc);
7353 if (Error Err = ImportDeclarationNameLoc(E->getNameInfo(), ToNameInfo))
7354 return std::move(Err);
7355
7356 TemplateArgumentListInfo ToTAInfo(ToLAngleLoc, ToRAngleLoc);
Peter Szecsice7f3182018-05-07 12:08:27 +00007357 TemplateArgumentListInfo *ResInfo = nullptr;
7358 if (E->hasExplicitTemplateArgs()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00007359 if (Error Err =
7360 ImportTemplateArgumentListInfo(E->template_arguments(), ToTAInfo))
7361 return std::move(Err);
Peter Szecsice7f3182018-05-07 12:08:27 +00007362 ResInfo = &ToTAInfo;
7363 }
7364
7365 return DependentScopeDeclRefExpr::Create(
Balazs Keri3b30d652018-10-19 13:32:20 +00007366 Importer.getToContext(), ToQualifierLoc, ToTemplateKeywordLoc,
7367 ToNameInfo, ResInfo);
Peter Szecsice7f3182018-05-07 12:08:27 +00007368}
7369
Balazs Keri3b30d652018-10-19 13:32:20 +00007370ExpectedStmt ASTNodeImporter::VisitCXXUnresolvedConstructExpr(
7371 CXXUnresolvedConstructExpr *E) {
7372 auto Imp = importSeq(
7373 E->getLParenLoc(), E->getRParenLoc(), E->getTypeSourceInfo());
7374 if (!Imp)
7375 return Imp.takeError();
Aleksei Sidorine267a0f2018-01-09 16:40:40 +00007376
Balazs Keri3b30d652018-10-19 13:32:20 +00007377 SourceLocation ToLParenLoc, ToRParenLoc;
7378 TypeSourceInfo *ToTypeSourceInfo;
7379 std::tie(ToLParenLoc, ToRParenLoc, ToTypeSourceInfo) = *Imp;
7380
7381 SmallVector<Expr *, 8> ToArgs(E->arg_size());
7382 if (Error Err =
7383 ImportArrayChecked(E->arg_begin(), E->arg_end(), ToArgs.begin()))
7384 return std::move(Err);
Aleksei Sidorine267a0f2018-01-09 16:40:40 +00007385
7386 return CXXUnresolvedConstructExpr::Create(
Balazs Keri3b30d652018-10-19 13:32:20 +00007387 Importer.getToContext(), ToTypeSourceInfo, ToLParenLoc,
7388 llvm::makeArrayRef(ToArgs), ToRParenLoc);
Aleksei Sidorine267a0f2018-01-09 16:40:40 +00007389}
7390
Balazs Keri3b30d652018-10-19 13:32:20 +00007391ExpectedStmt
7392ASTNodeImporter::VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E) {
7393 Expected<CXXRecordDecl *> ToNamingClassOrErr = import(E->getNamingClass());
7394 if (!ToNamingClassOrErr)
7395 return ToNamingClassOrErr.takeError();
Aleksei Sidorine267a0f2018-01-09 16:40:40 +00007396
Balazs Keri3b30d652018-10-19 13:32:20 +00007397 auto ToQualifierLocOrErr = import(E->getQualifierLoc());
7398 if (!ToQualifierLocOrErr)
7399 return ToQualifierLocOrErr.takeError();
Aleksei Sidorine267a0f2018-01-09 16:40:40 +00007400
Balazs Keri3b30d652018-10-19 13:32:20 +00007401 auto ToNameInfoOrErr = importSeq(E->getName(), E->getNameLoc());
7402 if (!ToNameInfoOrErr)
7403 return ToNameInfoOrErr.takeError();
7404 DeclarationNameInfo ToNameInfo(
7405 std::get<0>(*ToNameInfoOrErr), std::get<1>(*ToNameInfoOrErr));
Aleksei Sidorine267a0f2018-01-09 16:40:40 +00007406 // Import additional name location/type info.
Balazs Keri3b30d652018-10-19 13:32:20 +00007407 if (Error Err = ImportDeclarationNameLoc(E->getNameInfo(), ToNameInfo))
7408 return std::move(Err);
Aleksei Sidorine267a0f2018-01-09 16:40:40 +00007409
7410 UnresolvedSet<8> ToDecls;
Balazs Keri3b30d652018-10-19 13:32:20 +00007411 for (auto *D : E->decls())
7412 if (auto ToDOrErr = import(D))
7413 ToDecls.addDecl(cast<NamedDecl>(*ToDOrErr));
Aleksei Sidorine267a0f2018-01-09 16:40:40 +00007414 else
Balazs Keri3b30d652018-10-19 13:32:20 +00007415 return ToDOrErr.takeError();
Aleksei Sidorine267a0f2018-01-09 16:40:40 +00007416
Balazs Keri3b30d652018-10-19 13:32:20 +00007417 if (E->hasExplicitTemplateArgs() && E->getTemplateKeywordLoc().isValid()) {
7418 TemplateArgumentListInfo ToTAInfo;
7419 if (Error Err = ImportTemplateArgumentListInfo(
7420 E->getLAngleLoc(), E->getRAngleLoc(), E->template_arguments(),
7421 ToTAInfo))
7422 return std::move(Err);
Aleksei Sidorine267a0f2018-01-09 16:40:40 +00007423
Balazs Keri3b30d652018-10-19 13:32:20 +00007424 ExpectedSLoc ToTemplateKeywordLocOrErr = import(E->getTemplateKeywordLoc());
7425 if (!ToTemplateKeywordLocOrErr)
7426 return ToTemplateKeywordLocOrErr.takeError();
7427
Aleksei Sidorine267a0f2018-01-09 16:40:40 +00007428 return UnresolvedLookupExpr::Create(
Balazs Keri3b30d652018-10-19 13:32:20 +00007429 Importer.getToContext(), *ToNamingClassOrErr, *ToQualifierLocOrErr,
7430 *ToTemplateKeywordLocOrErr, ToNameInfo, E->requiresADL(), &ToTAInfo,
7431 ToDecls.begin(), ToDecls.end());
7432 }
Aleksei Sidorine267a0f2018-01-09 16:40:40 +00007433
7434 return UnresolvedLookupExpr::Create(
Balazs Keri3b30d652018-10-19 13:32:20 +00007435 Importer.getToContext(), *ToNamingClassOrErr, *ToQualifierLocOrErr,
7436 ToNameInfo, E->requiresADL(), E->isOverloaded(), ToDecls.begin(),
7437 ToDecls.end());
Aleksei Sidorine267a0f2018-01-09 16:40:40 +00007438}
7439
Balazs Keri3b30d652018-10-19 13:32:20 +00007440ExpectedStmt
7441ASTNodeImporter::VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E) {
7442 auto Imp1 = importSeq(
7443 E->getType(), E->getOperatorLoc(), E->getQualifierLoc(),
7444 E->getTemplateKeywordLoc());
7445 if (!Imp1)
7446 return Imp1.takeError();
Peter Szecsice7f3182018-05-07 12:08:27 +00007447
Balazs Keri3b30d652018-10-19 13:32:20 +00007448 QualType ToType;
7449 SourceLocation ToOperatorLoc, ToTemplateKeywordLoc;
7450 NestedNameSpecifierLoc ToQualifierLoc;
7451 std::tie(ToType, ToOperatorLoc, ToQualifierLoc, ToTemplateKeywordLoc) = *Imp1;
7452
7453 auto Imp2 = importSeq(E->getName(), E->getNameLoc());
7454 if (!Imp2)
7455 return Imp2.takeError();
7456 DeclarationNameInfo ToNameInfo(std::get<0>(*Imp2), std::get<1>(*Imp2));
7457 // Import additional name location/type info.
7458 if (Error Err = ImportDeclarationNameLoc(E->getNameInfo(), ToNameInfo))
7459 return std::move(Err);
Peter Szecsice7f3182018-05-07 12:08:27 +00007460
7461 UnresolvedSet<8> ToDecls;
Balazs Keri3b30d652018-10-19 13:32:20 +00007462 for (Decl *D : E->decls())
7463 if (auto ToDOrErr = import(D))
7464 ToDecls.addDecl(cast<NamedDecl>(*ToDOrErr));
Peter Szecsice7f3182018-05-07 12:08:27 +00007465 else
Balazs Keri3b30d652018-10-19 13:32:20 +00007466 return ToDOrErr.takeError();
Peter Szecsice7f3182018-05-07 12:08:27 +00007467
7468 TemplateArgumentListInfo ToTAInfo;
7469 TemplateArgumentListInfo *ResInfo = nullptr;
7470 if (E->hasExplicitTemplateArgs()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00007471 if (Error Err =
7472 ImportTemplateArgumentListInfo(E->template_arguments(), ToTAInfo))
7473 return std::move(Err);
Peter Szecsice7f3182018-05-07 12:08:27 +00007474 ResInfo = &ToTAInfo;
7475 }
7476
Balazs Keri3b30d652018-10-19 13:32:20 +00007477 Expr *ToBase = nullptr;
7478 if (!E->isImplicitAccess()) {
7479 if (ExpectedExpr ToBaseOrErr = import(E->getBase()))
7480 ToBase = *ToBaseOrErr;
7481 else
7482 return ToBaseOrErr.takeError();
Peter Szecsice7f3182018-05-07 12:08:27 +00007483 }
7484
7485 return UnresolvedMemberExpr::Create(
Balazs Keri3b30d652018-10-19 13:32:20 +00007486 Importer.getToContext(), E->hasUnresolvedUsing(), ToBase, ToType,
7487 E->isArrow(), ToOperatorLoc, ToQualifierLoc, ToTemplateKeywordLoc,
7488 ToNameInfo, ResInfo, ToDecls.begin(), ToDecls.end());
Peter Szecsice7f3182018-05-07 12:08:27 +00007489}
7490
Balazs Keri3b30d652018-10-19 13:32:20 +00007491ExpectedStmt ASTNodeImporter::VisitCallExpr(CallExpr *E) {
7492 auto Imp = importSeq(E->getCallee(), E->getType(), E->getRParenLoc());
7493 if (!Imp)
7494 return Imp.takeError();
Sean Callanan59721b32015-04-28 18:41:46 +00007495
Balazs Keri3b30d652018-10-19 13:32:20 +00007496 Expr *ToCallee;
7497 QualType ToType;
7498 SourceLocation ToRParenLoc;
7499 std::tie(ToCallee, ToType, ToRParenLoc) = *Imp;
Sean Callanan59721b32015-04-28 18:41:46 +00007500
7501 unsigned NumArgs = E->getNumArgs();
Balazs Keri3b30d652018-10-19 13:32:20 +00007502 llvm::SmallVector<Expr *, 2> ToArgs(NumArgs);
7503 if (Error Err = ImportContainerChecked(E->arguments(), ToArgs))
7504 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00007505
Gabor Horvathc78d99a2018-01-27 16:11:45 +00007506 if (const auto *OCE = dyn_cast<CXXOperatorCallExpr>(E)) {
Bruno Riccic5885cf2018-12-21 15:20:32 +00007507 return CXXOperatorCallExpr::Create(
Balazs Keri3b30d652018-10-19 13:32:20 +00007508 Importer.getToContext(), OCE->getOperator(), ToCallee, ToArgs, ToType,
Eric Fiselier5cdc2cd2018-12-12 21:50:55 +00007509 OCE->getValueKind(), ToRParenLoc, OCE->getFPFeatures(),
7510 OCE->getADLCallKind());
Gabor Horvathc78d99a2018-01-27 16:11:45 +00007511 }
7512
Bruno Riccic5885cf2018-12-21 15:20:32 +00007513 return CallExpr::Create(Importer.getToContext(), ToCallee, ToArgs, ToType,
7514 E->getValueKind(), ToRParenLoc, /*MinNumArgs=*/0,
7515 E->getADLCallKind());
Sean Callanan59721b32015-04-28 18:41:46 +00007516}
7517
Balazs Keri3b30d652018-10-19 13:32:20 +00007518ExpectedStmt ASTNodeImporter::VisitLambdaExpr(LambdaExpr *E) {
7519 CXXRecordDecl *FromClass = E->getLambdaClass();
7520 auto ToClassOrErr = import(FromClass);
7521 if (!ToClassOrErr)
7522 return ToClassOrErr.takeError();
7523 CXXRecordDecl *ToClass = *ToClassOrErr;
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00007524
Balazs Keri3b30d652018-10-19 13:32:20 +00007525 auto ToCallOpOrErr = import(E->getCallOperator());
7526 if (!ToCallOpOrErr)
7527 return ToCallOpOrErr.takeError();
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00007528
Balazs Keri3b30d652018-10-19 13:32:20 +00007529 SmallVector<LambdaCapture, 8> ToCaptures;
7530 ToCaptures.reserve(E->capture_size());
7531 for (const auto &FromCapture : E->captures()) {
7532 if (auto ToCaptureOrErr = import(FromCapture))
7533 ToCaptures.push_back(*ToCaptureOrErr);
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00007534 else
Balazs Keri3b30d652018-10-19 13:32:20 +00007535 return ToCaptureOrErr.takeError();
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00007536 }
7537
Balazs Keri3b30d652018-10-19 13:32:20 +00007538 SmallVector<Expr *, 8> ToCaptureInits(E->capture_size());
7539 if (Error Err = ImportContainerChecked(E->capture_inits(), ToCaptureInits))
7540 return std::move(Err);
7541
7542 auto Imp = importSeq(
7543 E->getIntroducerRange(), E->getCaptureDefaultLoc(), E->getEndLoc());
7544 if (!Imp)
7545 return Imp.takeError();
7546
7547 SourceRange ToIntroducerRange;
7548 SourceLocation ToCaptureDefaultLoc, ToEndLoc;
7549 std::tie(ToIntroducerRange, ToCaptureDefaultLoc, ToEndLoc) = *Imp;
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00007550
Stephen Kelly1c301dc2018-08-09 21:09:38 +00007551 return LambdaExpr::Create(
Balazs Keri3b30d652018-10-19 13:32:20 +00007552 Importer.getToContext(), ToClass, ToIntroducerRange,
7553 E->getCaptureDefault(), ToCaptureDefaultLoc, ToCaptures,
7554 E->hasExplicitParameters(), E->hasExplicitResultType(), ToCaptureInits,
7555 ToEndLoc, E->containsUnexpandedParameterPack());
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00007556}
7557
Sean Callanan8bca9962016-03-28 21:43:01 +00007558
Balazs Keri3b30d652018-10-19 13:32:20 +00007559ExpectedStmt ASTNodeImporter::VisitInitListExpr(InitListExpr *E) {
7560 auto Imp = importSeq(E->getLBraceLoc(), E->getRBraceLoc(), E->getType());
7561 if (!Imp)
7562 return Imp.takeError();
7563
7564 SourceLocation ToLBraceLoc, ToRBraceLoc;
7565 QualType ToType;
7566 std::tie(ToLBraceLoc, ToRBraceLoc, ToType) = *Imp;
7567
7568 SmallVector<Expr *, 4> ToExprs(E->getNumInits());
7569 if (Error Err = ImportContainerChecked(E->inits(), ToExprs))
7570 return std::move(Err);
Sean Callanan8bca9962016-03-28 21:43:01 +00007571
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00007572 ASTContext &ToCtx = Importer.getToContext();
7573 InitListExpr *To = new (ToCtx) InitListExpr(
Balazs Keri3b30d652018-10-19 13:32:20 +00007574 ToCtx, ToLBraceLoc, ToExprs, ToRBraceLoc);
7575 To->setType(ToType);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00007576
Balazs Keri3b30d652018-10-19 13:32:20 +00007577 if (E->hasArrayFiller()) {
7578 if (ExpectedExpr ToFillerOrErr = import(E->getArrayFiller()))
7579 To->setArrayFiller(*ToFillerOrErr);
7580 else
7581 return ToFillerOrErr.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00007582 }
7583
Balazs Keri3b30d652018-10-19 13:32:20 +00007584 if (FieldDecl *FromFD = E->getInitializedFieldInUnion()) {
7585 if (auto ToFDOrErr = import(FromFD))
7586 To->setInitializedFieldInUnion(*ToFDOrErr);
7587 else
7588 return ToFDOrErr.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00007589 }
7590
Balazs Keri3b30d652018-10-19 13:32:20 +00007591 if (InitListExpr *SyntForm = E->getSyntacticForm()) {
7592 if (auto ToSyntFormOrErr = import(SyntForm))
7593 To->setSyntacticForm(*ToSyntFormOrErr);
7594 else
7595 return ToSyntFormOrErr.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00007596 }
7597
Gabor Martona20ce602018-09-03 13:10:53 +00007598 // Copy InitListExprBitfields, which are not handled in the ctor of
7599 // InitListExpr.
Balazs Keri3b30d652018-10-19 13:32:20 +00007600 To->sawArrayRangeDesignator(E->hadArrayRangeDesignator());
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00007601
7602 return To;
Sean Callanan8bca9962016-03-28 21:43:01 +00007603}
7604
Balazs Keri3b30d652018-10-19 13:32:20 +00007605ExpectedStmt ASTNodeImporter::VisitCXXStdInitializerListExpr(
Gabor Marton07b01ff2018-06-29 12:17:34 +00007606 CXXStdInitializerListExpr *E) {
Balazs Keri3b30d652018-10-19 13:32:20 +00007607 ExpectedType ToTypeOrErr = import(E->getType());
7608 if (!ToTypeOrErr)
7609 return ToTypeOrErr.takeError();
Gabor Marton07b01ff2018-06-29 12:17:34 +00007610
Balazs Keri3b30d652018-10-19 13:32:20 +00007611 ExpectedExpr ToSubExprOrErr = import(E->getSubExpr());
7612 if (!ToSubExprOrErr)
7613 return ToSubExprOrErr.takeError();
Gabor Marton07b01ff2018-06-29 12:17:34 +00007614
Balazs Keri3b30d652018-10-19 13:32:20 +00007615 return new (Importer.getToContext()) CXXStdInitializerListExpr(
7616 *ToTypeOrErr, *ToSubExprOrErr);
Gabor Marton07b01ff2018-06-29 12:17:34 +00007617}
7618
Balazs Keri3b30d652018-10-19 13:32:20 +00007619ExpectedStmt ASTNodeImporter::VisitCXXInheritedCtorInitExpr(
Balazs Keri95baa842018-07-25 10:21:06 +00007620 CXXInheritedCtorInitExpr *E) {
Balazs Keri3b30d652018-10-19 13:32:20 +00007621 auto Imp = importSeq(E->getLocation(), E->getType(), E->getConstructor());
7622 if (!Imp)
7623 return Imp.takeError();
Balazs Keri95baa842018-07-25 10:21:06 +00007624
Balazs Keri3b30d652018-10-19 13:32:20 +00007625 SourceLocation ToLocation;
7626 QualType ToType;
7627 CXXConstructorDecl *ToConstructor;
7628 std::tie(ToLocation, ToType, ToConstructor) = *Imp;
Balazs Keri95baa842018-07-25 10:21:06 +00007629
7630 return new (Importer.getToContext()) CXXInheritedCtorInitExpr(
Balazs Keri3b30d652018-10-19 13:32:20 +00007631 ToLocation, ToType, ToConstructor, E->constructsVBase(),
7632 E->inheritedFromVBase());
Balazs Keri95baa842018-07-25 10:21:06 +00007633}
7634
Balazs Keri3b30d652018-10-19 13:32:20 +00007635ExpectedStmt ASTNodeImporter::VisitArrayInitLoopExpr(ArrayInitLoopExpr *E) {
7636 auto Imp = importSeq(E->getType(), E->getCommonExpr(), E->getSubExpr());
7637 if (!Imp)
7638 return Imp.takeError();
Richard Smith30e304e2016-12-14 00:03:17 +00007639
Balazs Keri3b30d652018-10-19 13:32:20 +00007640 QualType ToType;
7641 Expr *ToCommonExpr, *ToSubExpr;
7642 std::tie(ToType, ToCommonExpr, ToSubExpr) = *Imp;
Richard Smith30e304e2016-12-14 00:03:17 +00007643
Balazs Keri3b30d652018-10-19 13:32:20 +00007644 return new (Importer.getToContext()) ArrayInitLoopExpr(
7645 ToType, ToCommonExpr, ToSubExpr);
Richard Smith30e304e2016-12-14 00:03:17 +00007646}
7647
Balazs Keri3b30d652018-10-19 13:32:20 +00007648ExpectedStmt ASTNodeImporter::VisitArrayInitIndexExpr(ArrayInitIndexExpr *E) {
7649 ExpectedType ToTypeOrErr = import(E->getType());
7650 if (!ToTypeOrErr)
7651 return ToTypeOrErr.takeError();
7652 return new (Importer.getToContext()) ArrayInitIndexExpr(*ToTypeOrErr);
Richard Smith30e304e2016-12-14 00:03:17 +00007653}
7654
Balazs Keri3b30d652018-10-19 13:32:20 +00007655ExpectedStmt ASTNodeImporter::VisitCXXDefaultInitExpr(CXXDefaultInitExpr *E) {
7656 ExpectedSLoc ToBeginLocOrErr = import(E->getBeginLoc());
7657 if (!ToBeginLocOrErr)
7658 return ToBeginLocOrErr.takeError();
7659
7660 auto ToFieldOrErr = import(E->getField());
7661 if (!ToFieldOrErr)
7662 return ToFieldOrErr.takeError();
Sean Callanandd2c1742016-05-16 20:48:03 +00007663
Eric Fiselier708afb52019-05-16 21:04:15 +00007664 auto UsedContextOrErr = Importer.ImportContext(E->getUsedContext());
7665 if (!UsedContextOrErr)
7666 return UsedContextOrErr.takeError();
7667
Sean Callanandd2c1742016-05-16 20:48:03 +00007668 return CXXDefaultInitExpr::Create(
Eric Fiselier708afb52019-05-16 21:04:15 +00007669 Importer.getToContext(), *ToBeginLocOrErr, *ToFieldOrErr, *UsedContextOrErr);
Sean Callanandd2c1742016-05-16 20:48:03 +00007670}
7671
Balazs Keri3b30d652018-10-19 13:32:20 +00007672ExpectedStmt ASTNodeImporter::VisitCXXNamedCastExpr(CXXNamedCastExpr *E) {
7673 auto Imp = importSeq(
7674 E->getType(), E->getSubExpr(), E->getTypeInfoAsWritten(),
7675 E->getOperatorLoc(), E->getRParenLoc(), E->getAngleBrackets());
7676 if (!Imp)
7677 return Imp.takeError();
7678
7679 QualType ToType;
7680 Expr *ToSubExpr;
7681 TypeSourceInfo *ToTypeInfoAsWritten;
7682 SourceLocation ToOperatorLoc, ToRParenLoc;
7683 SourceRange ToAngleBrackets;
7684 std::tie(
7685 ToType, ToSubExpr, ToTypeInfoAsWritten, ToOperatorLoc, ToRParenLoc,
7686 ToAngleBrackets) = *Imp;
7687
Sean Callanandd2c1742016-05-16 20:48:03 +00007688 ExprValueKind VK = E->getValueKind();
7689 CastKind CK = E->getCastKind();
Balazs Keri3b30d652018-10-19 13:32:20 +00007690 auto ToBasePathOrErr = ImportCastPath(E);
7691 if (!ToBasePathOrErr)
7692 return ToBasePathOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00007693
Sean Callanandd2c1742016-05-16 20:48:03 +00007694 if (isa<CXXStaticCastExpr>(E)) {
7695 return CXXStaticCastExpr::Create(
Balazs Keri3b30d652018-10-19 13:32:20 +00007696 Importer.getToContext(), ToType, VK, CK, ToSubExpr, &(*ToBasePathOrErr),
7697 ToTypeInfoAsWritten, ToOperatorLoc, ToRParenLoc, ToAngleBrackets);
Sean Callanandd2c1742016-05-16 20:48:03 +00007698 } else if (isa<CXXDynamicCastExpr>(E)) {
7699 return CXXDynamicCastExpr::Create(
Balazs Keri3b30d652018-10-19 13:32:20 +00007700 Importer.getToContext(), ToType, VK, CK, ToSubExpr, &(*ToBasePathOrErr),
7701 ToTypeInfoAsWritten, ToOperatorLoc, ToRParenLoc, ToAngleBrackets);
Sean Callanandd2c1742016-05-16 20:48:03 +00007702 } else if (isa<CXXReinterpretCastExpr>(E)) {
7703 return CXXReinterpretCastExpr::Create(
Balazs Keri3b30d652018-10-19 13:32:20 +00007704 Importer.getToContext(), ToType, VK, CK, ToSubExpr, &(*ToBasePathOrErr),
7705 ToTypeInfoAsWritten, ToOperatorLoc, ToRParenLoc, ToAngleBrackets);
Raphael Isemannc705bb82018-08-20 16:20:01 +00007706 } else if (isa<CXXConstCastExpr>(E)) {
Balazs Keri3b30d652018-10-19 13:32:20 +00007707 return CXXConstCastExpr::Create(
7708 Importer.getToContext(), ToType, VK, ToSubExpr, ToTypeInfoAsWritten,
7709 ToOperatorLoc, ToRParenLoc, ToAngleBrackets);
Sean Callanandd2c1742016-05-16 20:48:03 +00007710 } else {
Balazs Keri3b30d652018-10-19 13:32:20 +00007711 llvm_unreachable("Unknown cast type");
7712 return make_error<ImportError>();
Sean Callanandd2c1742016-05-16 20:48:03 +00007713 }
7714}
7715
Balazs Keri3b30d652018-10-19 13:32:20 +00007716ExpectedStmt ASTNodeImporter::VisitSubstNonTypeTemplateParmExpr(
Aleksei Sidorin855086d2017-01-23 09:30:36 +00007717 SubstNonTypeTemplateParmExpr *E) {
Balazs Keri3b30d652018-10-19 13:32:20 +00007718 auto Imp = importSeq(
7719 E->getType(), E->getExprLoc(), E->getParameter(), E->getReplacement());
7720 if (!Imp)
7721 return Imp.takeError();
Aleksei Sidorin855086d2017-01-23 09:30:36 +00007722
Balazs Keri3b30d652018-10-19 13:32:20 +00007723 QualType ToType;
7724 SourceLocation ToExprLoc;
7725 NonTypeTemplateParmDecl *ToParameter;
7726 Expr *ToReplacement;
7727 std::tie(ToType, ToExprLoc, ToParameter, ToReplacement) = *Imp;
Aleksei Sidorin855086d2017-01-23 09:30:36 +00007728
7729 return new (Importer.getToContext()) SubstNonTypeTemplateParmExpr(
Balazs Keri3b30d652018-10-19 13:32:20 +00007730 ToType, E->getValueKind(), ToExprLoc, ToParameter, ToReplacement);
Aleksei Sidorin855086d2017-01-23 09:30:36 +00007731}
7732
Balazs Keri3b30d652018-10-19 13:32:20 +00007733ExpectedStmt ASTNodeImporter::VisitTypeTraitExpr(TypeTraitExpr *E) {
7734 auto Imp = importSeq(
7735 E->getType(), E->getBeginLoc(), E->getEndLoc());
7736 if (!Imp)
7737 return Imp.takeError();
7738
7739 QualType ToType;
7740 SourceLocation ToBeginLoc, ToEndLoc;
7741 std::tie(ToType, ToBeginLoc, ToEndLoc) = *Imp;
Aleksei Sidorinb05f37a2017-11-26 17:04:06 +00007742
7743 SmallVector<TypeSourceInfo *, 4> ToArgs(E->getNumArgs());
Balazs Keri3b30d652018-10-19 13:32:20 +00007744 if (Error Err = ImportContainerChecked(E->getArgs(), ToArgs))
7745 return std::move(Err);
Aleksei Sidorinb05f37a2017-11-26 17:04:06 +00007746
7747 // According to Sema::BuildTypeTrait(), if E is value-dependent,
7748 // Value is always false.
Balazs Keri3b30d652018-10-19 13:32:20 +00007749 bool ToValue = (E->isValueDependent() ? false : E->getValue());
Aleksei Sidorinb05f37a2017-11-26 17:04:06 +00007750
7751 return TypeTraitExpr::Create(
Balazs Keri3b30d652018-10-19 13:32:20 +00007752 Importer.getToContext(), ToType, ToBeginLoc, E->getTrait(), ToArgs,
7753 ToEndLoc, ToValue);
Aleksei Sidorinb05f37a2017-11-26 17:04:06 +00007754}
7755
Balazs Keri3b30d652018-10-19 13:32:20 +00007756ExpectedStmt ASTNodeImporter::VisitCXXTypeidExpr(CXXTypeidExpr *E) {
7757 ExpectedType ToTypeOrErr = import(E->getType());
7758 if (!ToTypeOrErr)
7759 return ToTypeOrErr.takeError();
7760
7761 auto ToSourceRangeOrErr = import(E->getSourceRange());
7762 if (!ToSourceRangeOrErr)
7763 return ToSourceRangeOrErr.takeError();
Gabor Horvathc78d99a2018-01-27 16:11:45 +00007764
7765 if (E->isTypeOperand()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00007766 if (auto ToTSIOrErr = import(E->getTypeOperandSourceInfo()))
7767 return new (Importer.getToContext()) CXXTypeidExpr(
7768 *ToTypeOrErr, *ToTSIOrErr, *ToSourceRangeOrErr);
7769 else
7770 return ToTSIOrErr.takeError();
Gabor Horvathc78d99a2018-01-27 16:11:45 +00007771 }
7772
Balazs Keri3b30d652018-10-19 13:32:20 +00007773 ExpectedExpr ToExprOperandOrErr = import(E->getExprOperand());
7774 if (!ToExprOperandOrErr)
7775 return ToExprOperandOrErr.takeError();
Gabor Horvathc78d99a2018-01-27 16:11:45 +00007776
Balazs Keri3b30d652018-10-19 13:32:20 +00007777 return new (Importer.getToContext()) CXXTypeidExpr(
7778 *ToTypeOrErr, *ToExprOperandOrErr, *ToSourceRangeOrErr);
Gabor Horvathc78d99a2018-01-27 16:11:45 +00007779}
7780
Balazs Kerib4fd7d42019-08-30 10:12:14 +00007781Error ASTNodeImporter::ImportOverriddenMethods(CXXMethodDecl *ToMethod,
7782 CXXMethodDecl *FromMethod) {
7783 Error ImportErrors = Error::success();
Balazs Keri3b30d652018-10-19 13:32:20 +00007784 for (auto *FromOverriddenMethod : FromMethod->overridden_methods()) {
7785 if (auto ImportedOrErr = import(FromOverriddenMethod))
7786 ToMethod->getCanonicalDecl()->addOverriddenMethod(cast<CXXMethodDecl>(
7787 (*ImportedOrErr)->getCanonicalDecl()));
7788 else
Balazs Kerib4fd7d42019-08-30 10:12:14 +00007789 ImportErrors =
7790 joinErrors(std::move(ImportErrors), ImportedOrErr.takeError());
Balazs Keri3b30d652018-10-19 13:32:20 +00007791 }
Balazs Kerib4fd7d42019-08-30 10:12:14 +00007792 return ImportErrors;
Lang Hames19e07e12017-06-20 21:06:00 +00007793}
7794
Argyrios Kyrtzidisd0040642010-11-18 20:06:41 +00007795ASTImporter::ASTImporter(ASTContext &ToContext, FileManager &ToFileManager,
Douglas Gregor0a791672011-01-18 03:11:38 +00007796 ASTContext &FromContext, FileManager &FromFileManager,
Gabor Marton54058b52018-12-17 13:53:12 +00007797 bool MinimalImport,
Gabor Marton2afbfb62019-07-01 15:37:07 +00007798 std::shared_ptr<ASTImporterSharedState> SharedState)
7799 : SharedState(SharedState), ToContext(ToContext), FromContext(FromContext),
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00007800 ToFileManager(ToFileManager), FromFileManager(FromFileManager),
Gabor Martonf035b752019-08-27 11:36:10 +00007801 Minimal(MinimalImport), ODRHandling(ODRHandlingType::Conservative) {
Gabor Marton54058b52018-12-17 13:53:12 +00007802
Gabor Marton2afbfb62019-07-01 15:37:07 +00007803 // Create a default state without the lookup table: LLDB case.
7804 if (!SharedState) {
7805 this->SharedState = std::make_shared<ASTImporterSharedState>();
7806 }
7807
Gabor Marton54058b52018-12-17 13:53:12 +00007808 ImportedDecls[FromContext.getTranslationUnitDecl()] =
7809 ToContext.getTranslationUnitDecl();
Douglas Gregor62d311f2010-02-09 19:21:46 +00007810}
7811
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00007812ASTImporter::~ASTImporter() = default;
Douglas Gregor96e578d2010-02-05 17:54:41 +00007813
Gabor Marton54058b52018-12-17 13:53:12 +00007814Optional<unsigned> ASTImporter::getFieldIndex(Decl *F) {
7815 assert(F && (isa<FieldDecl>(*F) || isa<IndirectFieldDecl>(*F)) &&
7816 "Try to get field index for non-field.");
7817
7818 auto *Owner = dyn_cast<RecordDecl>(F->getDeclContext());
7819 if (!Owner)
7820 return None;
7821
7822 unsigned Index = 0;
7823 for (const auto *D : Owner->decls()) {
7824 if (D == F)
7825 return Index;
7826
7827 if (isa<FieldDecl>(*D) || isa<IndirectFieldDecl>(*D))
7828 ++Index;
7829 }
7830
7831 llvm_unreachable("Field was not found in its parent context.");
7832
7833 return None;
7834}
7835
7836ASTImporter::FoundDeclsTy
7837ASTImporter::findDeclsInToCtx(DeclContext *DC, DeclarationName Name) {
7838 // We search in the redecl context because of transparent contexts.
7839 // E.g. a simple C language enum is a transparent context:
7840 // enum E { A, B };
7841 // Now if we had a global variable in the TU
7842 // int A;
7843 // then the enum constant 'A' and the variable 'A' violates ODR.
7844 // We can diagnose this only if we search in the redecl context.
7845 DeclContext *ReDC = DC->getRedeclContext();
Gabor Marton2afbfb62019-07-01 15:37:07 +00007846 if (SharedState->getLookupTable()) {
Gabor Marton54058b52018-12-17 13:53:12 +00007847 ASTImporterLookupTable::LookupResult LookupResult =
Gabor Marton2afbfb62019-07-01 15:37:07 +00007848 SharedState->getLookupTable()->lookup(ReDC, Name);
Gabor Marton54058b52018-12-17 13:53:12 +00007849 return FoundDeclsTy(LookupResult.begin(), LookupResult.end());
7850 } else {
Gabor Martonaefcf512019-07-17 13:47:46 +00007851 DeclContext::lookup_result NoloadLookupResult = ReDC->noload_lookup(Name);
7852 FoundDeclsTy Result(NoloadLookupResult.begin(), NoloadLookupResult.end());
7853 // We must search by the slow case of localUncachedLookup because that is
7854 // working even if there is no LookupPtr for the DC. We could use
7855 // DC::buildLookup() to create the LookupPtr, but that would load external
7856 // decls again, we must avoid that case.
7857 // Also, even if we had the LookupPtr, we must find Decls which are not
7858 // in the LookupPtr, so we need the slow case.
7859 // These cases are handled in ASTImporterLookupTable, but we cannot use
7860 // that with LLDB since that traverses through the AST which initiates the
7861 // load of external decls again via DC::decls(). And again, we must avoid
7862 // loading external decls during the import.
7863 if (Result.empty())
7864 ReDC->localUncachedLookup(Name, Result);
Gabor Marton54058b52018-12-17 13:53:12 +00007865 return Result;
7866 }
7867}
7868
7869void ASTImporter::AddToLookupTable(Decl *ToD) {
Gabor Marton2afbfb62019-07-01 15:37:07 +00007870 SharedState->addDeclToLookup(ToD);
Gabor Marton54058b52018-12-17 13:53:12 +00007871}
7872
Raphael Isemanne9bc35f2019-04-29 21:02:35 +00007873Expected<Decl *> ASTImporter::ImportImpl(Decl *FromD) {
7874 // Import the decl using ASTNodeImporter.
7875 ASTNodeImporter Importer(*this);
7876 return Importer.Visit(FromD);
7877}
7878
7879void ASTImporter::RegisterImportedDecl(Decl *FromD, Decl *ToD) {
7880 MapImported(FromD, ToD);
Raphael Isemanne9bc35f2019-04-29 21:02:35 +00007881}
7882
Gabor Marton5ac6d492019-05-15 10:29:48 +00007883Expected<QualType> ASTImporter::Import(QualType FromT) {
Douglas Gregor96e578d2010-02-05 17:54:41 +00007884 if (FromT.isNull())
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00007885 return QualType{};
John McCall424cec92011-01-19 06:33:43 +00007886
Balazs Keri3b30d652018-10-19 13:32:20 +00007887 const Type *FromTy = FromT.getTypePtr();
Fangrui Song6907ce22018-07-30 19:24:48 +00007888
7889 // Check whether we've already imported this type.
John McCall424cec92011-01-19 06:33:43 +00007890 llvm::DenseMap<const Type *, const Type *>::iterator Pos
Balazs Keri3b30d652018-10-19 13:32:20 +00007891 = ImportedTypes.find(FromTy);
Douglas Gregorf65bbb32010-02-08 15:18:58 +00007892 if (Pos != ImportedTypes.end())
John McCall424cec92011-01-19 06:33:43 +00007893 return ToContext.getQualifiedType(Pos->second, FromT.getLocalQualifiers());
Fangrui Song6907ce22018-07-30 19:24:48 +00007894
Douglas Gregorf65bbb32010-02-08 15:18:58 +00007895 // Import the type
Douglas Gregor96e578d2010-02-05 17:54:41 +00007896 ASTNodeImporter Importer(*this);
Balazs Keri3b30d652018-10-19 13:32:20 +00007897 ExpectedType ToTOrErr = Importer.Visit(FromTy);
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00007898 if (!ToTOrErr)
7899 return ToTOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00007900
Douglas Gregorf65bbb32010-02-08 15:18:58 +00007901 // Record the imported type.
Balazs Keri3b30d652018-10-19 13:32:20 +00007902 ImportedTypes[FromTy] = (*ToTOrErr).getTypePtr();
Fangrui Song6907ce22018-07-30 19:24:48 +00007903
Balazs Keri3b30d652018-10-19 13:32:20 +00007904 return ToContext.getQualifiedType(*ToTOrErr, FromT.getLocalQualifiers());
Douglas Gregor96e578d2010-02-05 17:54:41 +00007905}
7906
Gabor Marton5ac6d492019-05-15 10:29:48 +00007907Expected<TypeSourceInfo *> ASTImporter::Import(TypeSourceInfo *FromTSI) {
Douglas Gregorfa7a0e52010-02-10 17:47:19 +00007908 if (!FromTSI)
7909 return FromTSI;
7910
7911 // FIXME: For now we just create a "trivial" type source info based
Nick Lewycky19b9f952010-07-26 16:56:01 +00007912 // on the type and a single location. Implement a real version of this.
Gabor Marton5ac6d492019-05-15 10:29:48 +00007913 ExpectedType TOrErr = Import(FromTSI->getType());
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00007914 if (!TOrErr)
7915 return TOrErr.takeError();
Gabor Marton5ac6d492019-05-15 10:29:48 +00007916 ExpectedSLoc BeginLocOrErr = Import(FromTSI->getTypeLoc().getBeginLoc());
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00007917 if (!BeginLocOrErr)
7918 return BeginLocOrErr.takeError();
Douglas Gregorfa7a0e52010-02-10 17:47:19 +00007919
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00007920 return ToContext.getTrivialTypeSourceInfo(*TOrErr, *BeginLocOrErr);
7921}
Douglas Gregor62d311f2010-02-09 19:21:46 +00007922
Gabor Marton5ac6d492019-05-15 10:29:48 +00007923Expected<Attr *> ASTImporter::Import(const Attr *FromAttr) {
Davide Italianofaee83d2018-11-28 19:15:23 +00007924 Attr *ToAttr = FromAttr->clone(ToContext);
Gabor Marton5ac6d492019-05-15 10:29:48 +00007925 if (auto ToRangeOrErr = Import(FromAttr->getRange()))
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00007926 ToAttr->setRange(*ToRangeOrErr);
7927 else
7928 return ToRangeOrErr.takeError();
7929
Davide Italianofaee83d2018-11-28 19:15:23 +00007930 return ToAttr;
Balazs Kerideaf7ab2018-11-28 13:21:26 +00007931}
Aleksei Sidorin8f266db2018-05-08 12:45:21 +00007932
Gabor Martonbe77a982018-12-12 11:22:55 +00007933Decl *ASTImporter::GetAlreadyImportedOrNull(const Decl *FromD) const {
7934 auto Pos = ImportedDecls.find(FromD);
7935 if (Pos != ImportedDecls.end())
7936 return Pos->second;
7937 else
Sean Callanan59721b32015-04-28 18:41:46 +00007938 return nullptr;
Sean Callanan59721b32015-04-28 18:41:46 +00007939}
7940
Gabor Marton458d1452019-02-14 13:07:03 +00007941TranslationUnitDecl *ASTImporter::GetFromTU(Decl *ToD) {
7942 auto FromDPos = ImportedFromDecls.find(ToD);
7943 if (FromDPos == ImportedFromDecls.end())
7944 return nullptr;
7945 return FromDPos->second->getTranslationUnitDecl();
7946}
7947
Gabor Marton5ac6d492019-05-15 10:29:48 +00007948Expected<Decl *> ASTImporter::Import(Decl *FromD) {
Douglas Gregor62d311f2010-02-09 19:21:46 +00007949 if (!FromD)
Craig Topper36250ad2014-05-12 05:36:57 +00007950 return nullptr;
Douglas Gregor62d311f2010-02-09 19:21:46 +00007951
Gabor Marton1ad4b992019-07-01 14:19:53 +00007952 // Push FromD to the stack, and remove that when we return.
7953 ImportPath.push(FromD);
7954 auto ImportPathBuilder =
7955 llvm::make_scope_exit([this]() { ImportPath.pop(); });
Douglas Gregord451ea92011-07-29 23:31:30 +00007956
Gabor Marton303c98612019-06-25 08:00:51 +00007957 // Check whether there was a previous failed import.
7958 // If yes return the existing error.
7959 if (auto Error = getImportDeclErrorIfAny(FromD))
7960 return make_error<ImportError>(*Error);
7961
Gabor Marton26f72a92018-07-12 09:42:05 +00007962 // Check whether we've already imported this declaration.
7963 Decl *ToD = GetAlreadyImportedOrNull(FromD);
7964 if (ToD) {
Gabor Marton2afbfb62019-07-01 15:37:07 +00007965 // Already imported (possibly from another TU) and with an error.
7966 if (auto Error = SharedState->getImportDeclErrorIfAny(ToD)) {
7967 setImportDeclError(FromD, *Error);
7968 return make_error<ImportError>(*Error);
7969 }
7970
Gabor Marton26f72a92018-07-12 09:42:05 +00007971 // If FromD has some updated flags after last import, apply it
7972 updateFlags(FromD, ToD);
Gabor Marton1ad4b992019-07-01 14:19:53 +00007973 // If we encounter a cycle during an import then we save the relevant part
7974 // of the import path associated to the Decl.
7975 if (ImportPath.hasCycleAtBack())
7976 SavedImportPaths[FromD].push_back(ImportPath.copyCycleAtBack());
Douglas Gregord451ea92011-07-29 23:31:30 +00007977 return ToD;
7978 }
Gabor Marton26f72a92018-07-12 09:42:05 +00007979
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00007980 // Import the declaration.
Raphael Isemanne9bc35f2019-04-29 21:02:35 +00007981 ExpectedDecl ToDOrErr = ImportImpl(FromD);
Gabor Marton303c98612019-06-25 08:00:51 +00007982 if (!ToDOrErr) {
7983 // Failed to import.
7984
7985 auto Pos = ImportedDecls.find(FromD);
7986 if (Pos != ImportedDecls.end()) {
7987 // Import failed after the object was created.
7988 // Remove all references to it.
7989 auto *ToD = Pos->second;
7990 ImportedDecls.erase(Pos);
7991
7992 // ImportedDecls and ImportedFromDecls are not symmetric. It may happen
7993 // (e.g. with namespaces) that several decls from the 'from' context are
7994 // mapped to the same decl in the 'to' context. If we removed entries
7995 // from the LookupTable here then we may end up removing them multiple
7996 // times.
7997
7998 // The Lookuptable contains decls only which are in the 'to' context.
7999 // Remove from the Lookuptable only if it is *imported* into the 'to'
8000 // context (and do not remove it if it was added during the initial
8001 // traverse of the 'to' context).
8002 auto PosF = ImportedFromDecls.find(ToD);
8003 if (PosF != ImportedFromDecls.end()) {
Gabor Marton2afbfb62019-07-01 15:37:07 +00008004 SharedState->removeDeclFromLookup(ToD);
Gabor Marton303c98612019-06-25 08:00:51 +00008005 ImportedFromDecls.erase(PosF);
8006 }
8007
8008 // FIXME: AST may contain remaining references to the failed object.
Gabor Marton2afbfb62019-07-01 15:37:07 +00008009 // However, the ImportDeclErrors in the shared state contains all the
8010 // failed objects together with their error.
Gabor Marton303c98612019-06-25 08:00:51 +00008011 }
8012
Gabor Marton2afbfb62019-07-01 15:37:07 +00008013 // Error encountered for the first time.
8014 // After takeError the error is not usable any more in ToDOrErr.
Gabor Marton303c98612019-06-25 08:00:51 +00008015 // Get a copy of the error object (any more simple solution for this?).
8016 ImportError ErrOut;
8017 handleAllErrors(ToDOrErr.takeError(),
8018 [&ErrOut](const ImportError &E) { ErrOut = E; });
8019 setImportDeclError(FromD, ErrOut);
Gabor Marton2afbfb62019-07-01 15:37:07 +00008020 // Set the error for the mapped to Decl, which is in the "to" context.
8021 if (Pos != ImportedDecls.end())
8022 SharedState->setImportDeclError(Pos->second, ErrOut);
Gabor Marton1ad4b992019-07-01 14:19:53 +00008023
8024 // Set the error for all nodes which have been created before we
8025 // recognized the error.
8026 for (const auto &Path : SavedImportPaths[FromD])
Gabor Marton2afbfb62019-07-01 15:37:07 +00008027 for (Decl *FromDi : Path) {
8028 setImportDeclError(FromDi, ErrOut);
8029 //FIXME Should we remove these Decls from ImportedDecls?
8030 // Set the error for the mapped to Decl, which is in the "to" context.
8031 auto Ii = ImportedDecls.find(FromDi);
8032 if (Ii != ImportedDecls.end())
8033 SharedState->setImportDeclError(Ii->second, ErrOut);
8034 // FIXME Should we remove these Decls from the LookupTable,
8035 // and from ImportedFromDecls?
8036 }
Gabor Marton1ad4b992019-07-01 14:19:53 +00008037 SavedImportPaths[FromD].clear();
8038
Gabor Marton303c98612019-06-25 08:00:51 +00008039 // Do not return ToDOrErr, error was taken out of it.
8040 return make_error<ImportError>(ErrOut);
8041 }
8042
Balazs Keri3b30d652018-10-19 13:32:20 +00008043 ToD = *ToDOrErr;
Craig Topper36250ad2014-05-12 05:36:57 +00008044
Gabor Marton303c98612019-06-25 08:00:51 +00008045 // FIXME: Handle the "already imported with error" case. We can get here
8046 // nullptr only if GetImportedOrCreateDecl returned nullptr (after a
8047 // previously failed create was requested).
8048 // Later GetImportedOrCreateDecl can be updated to return the error.
Gabor Marton7f8c4002019-03-19 13:34:10 +00008049 if (!ToD) {
Gabor Marton303c98612019-06-25 08:00:51 +00008050 auto Err = getImportDeclErrorIfAny(FromD);
8051 assert(Err);
8052 return make_error<ImportError>(*Err);
Gabor Marton7f8c4002019-03-19 13:34:10 +00008053 }
8054
Gabor Marton2afbfb62019-07-01 15:37:07 +00008055 // We could import from the current TU without error. But previously we
8056 // already had imported a Decl as `ToD` from another TU (with another
8057 // ASTImporter object) and with an error.
8058 if (auto Error = SharedState->getImportDeclErrorIfAny(ToD)) {
8059 setImportDeclError(FromD, *Error);
8060 return make_error<ImportError>(*Error);
8061 }
8062
Raphael Isemanne9bc35f2019-04-29 21:02:35 +00008063 // Make sure that ImportImpl registered the imported decl.
8064 assert(ImportedDecls.count(FromD) != 0 && "Missing call to MapImported?");
Gabor Marton2afbfb62019-07-01 15:37:07 +00008065
Gabor Marton26f72a92018-07-12 09:42:05 +00008066 // Notify subclasses.
8067 Imported(FromD, ToD);
8068
Gabor Martonac3a5d62018-09-17 12:04:52 +00008069 updateFlags(FromD, ToD);
Gabor Marton1ad4b992019-07-01 14:19:53 +00008070 SavedImportPaths[FromD].clear();
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008071 return ToDOrErr;
8072}
Douglas Gregor62d311f2010-02-09 19:21:46 +00008073
Balazs Keri3b30d652018-10-19 13:32:20 +00008074Expected<DeclContext *> ASTImporter::ImportContext(DeclContext *FromDC) {
Douglas Gregor62d311f2010-02-09 19:21:46 +00008075 if (!FromDC)
8076 return FromDC;
8077
Gabor Marton5ac6d492019-05-15 10:29:48 +00008078 ExpectedDecl ToDCOrErr = Import(cast<Decl>(FromDC));
Balazs Keria1f6b102019-04-08 13:59:15 +00008079 if (!ToDCOrErr)
8080 return ToDCOrErr.takeError();
8081 auto *ToDC = cast<DeclContext>(*ToDCOrErr);
Craig Topper36250ad2014-05-12 05:36:57 +00008082
Fangrui Song6907ce22018-07-30 19:24:48 +00008083 // When we're using a record/enum/Objective-C class/protocol as a context, we
Douglas Gregor2e15c842012-02-01 21:00:38 +00008084 // need it to have a definition.
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00008085 if (auto *ToRecord = dyn_cast<RecordDecl>(ToDC)) {
8086 auto *FromRecord = cast<RecordDecl>(FromDC);
Douglas Gregor2e15c842012-02-01 21:00:38 +00008087 if (ToRecord->isCompleteDefinition()) {
8088 // Do nothing.
8089 } else if (FromRecord->isCompleteDefinition()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00008090 if (Error Err = ASTNodeImporter(*this).ImportDefinition(
8091 FromRecord, ToRecord, ASTNodeImporter::IDK_Basic))
8092 return std::move(Err);
Douglas Gregor2e15c842012-02-01 21:00:38 +00008093 } else {
8094 CompleteDecl(ToRecord);
8095 }
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00008096 } else if (auto *ToEnum = dyn_cast<EnumDecl>(ToDC)) {
8097 auto *FromEnum = cast<EnumDecl>(FromDC);
Douglas Gregor2e15c842012-02-01 21:00:38 +00008098 if (ToEnum->isCompleteDefinition()) {
8099 // Do nothing.
8100 } else if (FromEnum->isCompleteDefinition()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00008101 if (Error Err = ASTNodeImporter(*this).ImportDefinition(
8102 FromEnum, ToEnum, ASTNodeImporter::IDK_Basic))
8103 return std::move(Err);
Douglas Gregor2e15c842012-02-01 21:00:38 +00008104 } else {
8105 CompleteDecl(ToEnum);
Fangrui Song6907ce22018-07-30 19:24:48 +00008106 }
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00008107 } else if (auto *ToClass = dyn_cast<ObjCInterfaceDecl>(ToDC)) {
8108 auto *FromClass = cast<ObjCInterfaceDecl>(FromDC);
Douglas Gregor2e15c842012-02-01 21:00:38 +00008109 if (ToClass->getDefinition()) {
8110 // Do nothing.
8111 } else if (ObjCInterfaceDecl *FromDef = FromClass->getDefinition()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00008112 if (Error Err = ASTNodeImporter(*this).ImportDefinition(
8113 FromDef, ToClass, ASTNodeImporter::IDK_Basic))
8114 return std::move(Err);
Douglas Gregor2e15c842012-02-01 21:00:38 +00008115 } else {
8116 CompleteDecl(ToClass);
8117 }
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00008118 } else if (auto *ToProto = dyn_cast<ObjCProtocolDecl>(ToDC)) {
8119 auto *FromProto = cast<ObjCProtocolDecl>(FromDC);
Douglas Gregor2e15c842012-02-01 21:00:38 +00008120 if (ToProto->getDefinition()) {
8121 // Do nothing.
8122 } else if (ObjCProtocolDecl *FromDef = FromProto->getDefinition()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00008123 if (Error Err = ASTNodeImporter(*this).ImportDefinition(
8124 FromDef, ToProto, ASTNodeImporter::IDK_Basic))
8125 return std::move(Err);
Douglas Gregor2e15c842012-02-01 21:00:38 +00008126 } else {
8127 CompleteDecl(ToProto);
Fangrui Song6907ce22018-07-30 19:24:48 +00008128 }
Douglas Gregor95d82832012-01-24 18:36:04 +00008129 }
Fangrui Song6907ce22018-07-30 19:24:48 +00008130
Douglas Gregor95d82832012-01-24 18:36:04 +00008131 return ToDC;
Douglas Gregor62d311f2010-02-09 19:21:46 +00008132}
8133
Gabor Marton5ac6d492019-05-15 10:29:48 +00008134Expected<Expr *> ASTImporter::Import(Expr *FromE) {
8135 if (ExpectedStmt ToSOrErr = Import(cast_or_null<Stmt>(FromE)))
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008136 return cast_or_null<Expr>(*ToSOrErr);
8137 else
8138 return ToSOrErr.takeError();
Balazs Keri4a3d7582018-11-27 18:36:31 +00008139}
Douglas Gregor62d311f2010-02-09 19:21:46 +00008140
Gabor Marton5ac6d492019-05-15 10:29:48 +00008141Expected<Stmt *> ASTImporter::Import(Stmt *FromS) {
Douglas Gregor62d311f2010-02-09 19:21:46 +00008142 if (!FromS)
Craig Topper36250ad2014-05-12 05:36:57 +00008143 return nullptr;
Douglas Gregor62d311f2010-02-09 19:21:46 +00008144
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008145 // Check whether we've already imported this statement.
Douglas Gregor7eeb5972010-02-11 19:21:55 +00008146 llvm::DenseMap<Stmt *, Stmt *>::iterator Pos = ImportedStmts.find(FromS);
8147 if (Pos != ImportedStmts.end())
8148 return Pos->second;
Fangrui Song6907ce22018-07-30 19:24:48 +00008149
Balazs Keri3b30d652018-10-19 13:32:20 +00008150 // Import the statement.
Douglas Gregor7eeb5972010-02-11 19:21:55 +00008151 ASTNodeImporter Importer(*this);
Balazs Keri3b30d652018-10-19 13:32:20 +00008152 ExpectedStmt ToSOrErr = Importer.Visit(FromS);
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008153 if (!ToSOrErr)
8154 return ToSOrErr;
Craig Topper36250ad2014-05-12 05:36:57 +00008155
Balazs Keri3b30d652018-10-19 13:32:20 +00008156 if (auto *ToE = dyn_cast<Expr>(*ToSOrErr)) {
Gabor Martona20ce602018-09-03 13:10:53 +00008157 auto *FromE = cast<Expr>(FromS);
8158 // Copy ExprBitfields, which may not be handled in Expr subclasses
8159 // constructors.
8160 ToE->setValueKind(FromE->getValueKind());
8161 ToE->setObjectKind(FromE->getObjectKind());
8162 ToE->setTypeDependent(FromE->isTypeDependent());
8163 ToE->setValueDependent(FromE->isValueDependent());
8164 ToE->setInstantiationDependent(FromE->isInstantiationDependent());
8165 ToE->setContainsUnexpandedParameterPack(
8166 FromE->containsUnexpandedParameterPack());
8167 }
8168
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008169 // Record the imported statement object.
Balazs Keri3b30d652018-10-19 13:32:20 +00008170 ImportedStmts[FromS] = *ToSOrErr;
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008171 return ToSOrErr;
8172}
Douglas Gregor62d311f2010-02-09 19:21:46 +00008173
Balazs Keri4a3d7582018-11-27 18:36:31 +00008174Expected<NestedNameSpecifier *>
Gabor Marton5ac6d492019-05-15 10:29:48 +00008175ASTImporter::Import(NestedNameSpecifier *FromNNS) {
Douglas Gregor62d311f2010-02-09 19:21:46 +00008176 if (!FromNNS)
Craig Topper36250ad2014-05-12 05:36:57 +00008177 return nullptr;
Douglas Gregor62d311f2010-02-09 19:21:46 +00008178
Simon Pilgrim130df2c2019-07-15 13:00:43 +00008179 NestedNameSpecifier *Prefix = nullptr;
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008180 if (Error Err = importInto(Prefix, FromNNS->getPrefix()))
8181 return std::move(Err);
Douglas Gregor90ebf252011-04-27 16:48:40 +00008182
8183 switch (FromNNS->getKind()) {
8184 case NestedNameSpecifier::Identifier:
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008185 assert(FromNNS->getAsIdentifier() && "NNS should contain identifier.");
8186 return NestedNameSpecifier::Create(ToContext, Prefix,
8187 Import(FromNNS->getAsIdentifier()));
Douglas Gregor90ebf252011-04-27 16:48:40 +00008188
8189 case NestedNameSpecifier::Namespace:
Gabor Marton5ac6d492019-05-15 10:29:48 +00008190 if (ExpectedDecl NSOrErr = Import(FromNNS->getAsNamespace())) {
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008191 return NestedNameSpecifier::Create(ToContext, Prefix,
8192 cast<NamespaceDecl>(*NSOrErr));
8193 } else
8194 return NSOrErr.takeError();
Douglas Gregor90ebf252011-04-27 16:48:40 +00008195
8196 case NestedNameSpecifier::NamespaceAlias:
Gabor Marton5ac6d492019-05-15 10:29:48 +00008197 if (ExpectedDecl NSADOrErr = Import(FromNNS->getAsNamespaceAlias()))
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008198 return NestedNameSpecifier::Create(ToContext, Prefix,
8199 cast<NamespaceAliasDecl>(*NSADOrErr));
8200 else
8201 return NSADOrErr.takeError();
Douglas Gregor90ebf252011-04-27 16:48:40 +00008202
8203 case NestedNameSpecifier::Global:
8204 return NestedNameSpecifier::GlobalSpecifier(ToContext);
8205
Nikola Smiljanic67860242014-09-26 00:28:20 +00008206 case NestedNameSpecifier::Super:
Gabor Marton5ac6d492019-05-15 10:29:48 +00008207 if (ExpectedDecl RDOrErr = Import(FromNNS->getAsRecordDecl()))
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008208 return NestedNameSpecifier::SuperSpecifier(ToContext,
8209 cast<CXXRecordDecl>(*RDOrErr));
8210 else
8211 return RDOrErr.takeError();
Nikola Smiljanic67860242014-09-26 00:28:20 +00008212
Douglas Gregor90ebf252011-04-27 16:48:40 +00008213 case NestedNameSpecifier::TypeSpec:
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008214 case NestedNameSpecifier::TypeSpecWithTemplate:
8215 if (Expected<QualType> TyOrErr =
Gabor Marton5ac6d492019-05-15 10:29:48 +00008216 Import(QualType(FromNNS->getAsType(), 0u))) {
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008217 bool TSTemplate =
8218 FromNNS->getKind() == NestedNameSpecifier::TypeSpecWithTemplate;
8219 return NestedNameSpecifier::Create(ToContext, Prefix, TSTemplate,
8220 TyOrErr->getTypePtr());
8221 } else {
8222 return TyOrErr.takeError();
Douglas Gregor90ebf252011-04-27 16:48:40 +00008223 }
Douglas Gregor90ebf252011-04-27 16:48:40 +00008224 }
8225
8226 llvm_unreachable("Invalid nested name specifier kind");
Douglas Gregor62d311f2010-02-09 19:21:46 +00008227}
8228
Balazs Keri4a3d7582018-11-27 18:36:31 +00008229Expected<NestedNameSpecifierLoc>
Gabor Marton5ac6d492019-05-15 10:29:48 +00008230ASTImporter::Import(NestedNameSpecifierLoc FromNNS) {
Aleksei Sidorin855086d2017-01-23 09:30:36 +00008231 // Copied from NestedNameSpecifier mostly.
8232 SmallVector<NestedNameSpecifierLoc , 8> NestedNames;
8233 NestedNameSpecifierLoc NNS = FromNNS;
8234
8235 // Push each of the nested-name-specifiers's onto a stack for
8236 // serialization in reverse order.
8237 while (NNS) {
8238 NestedNames.push_back(NNS);
8239 NNS = NNS.getPrefix();
8240 }
8241
8242 NestedNameSpecifierLocBuilder Builder;
8243
8244 while (!NestedNames.empty()) {
8245 NNS = NestedNames.pop_back_val();
Simon Pilgrim4c146ab2019-05-18 11:33:27 +00008246 NestedNameSpecifier *Spec = nullptr;
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008247 if (Error Err = importInto(Spec, NNS.getNestedNameSpecifier()))
8248 return std::move(Err);
Aleksei Sidorin855086d2017-01-23 09:30:36 +00008249
8250 NestedNameSpecifier::SpecifierKind Kind = Spec->getKind();
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008251
8252 SourceLocation ToLocalBeginLoc, ToLocalEndLoc;
8253 if (Kind != NestedNameSpecifier::Super) {
8254 if (Error Err = importInto(ToLocalBeginLoc, NNS.getLocalBeginLoc()))
8255 return std::move(Err);
8256
8257 if (Kind != NestedNameSpecifier::Global)
8258 if (Error Err = importInto(ToLocalEndLoc, NNS.getLocalEndLoc()))
8259 return std::move(Err);
8260 }
8261
Aleksei Sidorin855086d2017-01-23 09:30:36 +00008262 switch (Kind) {
8263 case NestedNameSpecifier::Identifier:
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008264 Builder.Extend(getToContext(), Spec->getAsIdentifier(), ToLocalBeginLoc,
8265 ToLocalEndLoc);
Aleksei Sidorin855086d2017-01-23 09:30:36 +00008266 break;
8267
8268 case NestedNameSpecifier::Namespace:
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008269 Builder.Extend(getToContext(), Spec->getAsNamespace(), ToLocalBeginLoc,
8270 ToLocalEndLoc);
Aleksei Sidorin855086d2017-01-23 09:30:36 +00008271 break;
8272
8273 case NestedNameSpecifier::NamespaceAlias:
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008274 Builder.Extend(getToContext(), Spec->getAsNamespaceAlias(),
8275 ToLocalBeginLoc, ToLocalEndLoc);
Aleksei Sidorin855086d2017-01-23 09:30:36 +00008276 break;
8277
8278 case NestedNameSpecifier::TypeSpec:
8279 case NestedNameSpecifier::TypeSpecWithTemplate: {
Balazs Keri5f4fd8b2019-03-14 14:20:23 +00008280 SourceLocation ToTLoc;
8281 if (Error Err = importInto(ToTLoc, NNS.getTypeLoc().getBeginLoc()))
8282 return std::move(Err);
Aleksei Sidorin855086d2017-01-23 09:30:36 +00008283 TypeSourceInfo *TSI = getToContext().getTrivialTypeSourceInfo(
Balazs Keri5f4fd8b2019-03-14 14:20:23 +00008284 QualType(Spec->getAsType(), 0), ToTLoc);
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008285 Builder.Extend(getToContext(), ToLocalBeginLoc, TSI->getTypeLoc(),
8286 ToLocalEndLoc);
Aleksei Sidorin855086d2017-01-23 09:30:36 +00008287 break;
8288 }
8289
8290 case NestedNameSpecifier::Global:
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008291 Builder.MakeGlobal(getToContext(), ToLocalBeginLoc);
Aleksei Sidorin855086d2017-01-23 09:30:36 +00008292 break;
8293
8294 case NestedNameSpecifier::Super: {
Gabor Marton5ac6d492019-05-15 10:29:48 +00008295 auto ToSourceRangeOrErr = Import(NNS.getSourceRange());
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008296 if (!ToSourceRangeOrErr)
8297 return ToSourceRangeOrErr.takeError();
8298
8299 Builder.MakeSuper(getToContext(), Spec->getAsRecordDecl(),
8300 ToSourceRangeOrErr->getBegin(),
8301 ToSourceRangeOrErr->getEnd());
Aleksei Sidorin855086d2017-01-23 09:30:36 +00008302 }
8303 }
8304 }
8305
8306 return Builder.getWithLocInContext(getToContext());
Douglas Gregor14454802011-02-25 02:25:35 +00008307}
8308
Gabor Marton5ac6d492019-05-15 10:29:48 +00008309Expected<TemplateName> ASTImporter::Import(TemplateName From) {
Douglas Gregore2e50d332010-12-01 01:36:18 +00008310 switch (From.getKind()) {
8311 case TemplateName::Template:
Gabor Marton5ac6d492019-05-15 10:29:48 +00008312 if (ExpectedDecl ToTemplateOrErr = Import(From.getAsTemplateDecl()))
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008313 return TemplateName(cast<TemplateDecl>(*ToTemplateOrErr));
8314 else
8315 return ToTemplateOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00008316
Douglas Gregore2e50d332010-12-01 01:36:18 +00008317 case TemplateName::OverloadedTemplate: {
8318 OverloadedTemplateStorage *FromStorage = From.getAsOverloadedTemplate();
8319 UnresolvedSet<2> ToTemplates;
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00008320 for (auto *I : *FromStorage) {
Gabor Marton5ac6d492019-05-15 10:29:48 +00008321 if (auto ToOrErr = Import(I))
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008322 ToTemplates.addDecl(cast<NamedDecl>(*ToOrErr));
Douglas Gregore2e50d332010-12-01 01:36:18 +00008323 else
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008324 return ToOrErr.takeError();
Douglas Gregore2e50d332010-12-01 01:36:18 +00008325 }
Fangrui Song6907ce22018-07-30 19:24:48 +00008326 return ToContext.getOverloadedTemplateName(ToTemplates.begin(),
Douglas Gregore2e50d332010-12-01 01:36:18 +00008327 ToTemplates.end());
8328 }
Fangrui Song6907ce22018-07-30 19:24:48 +00008329
Richard Smithb23c5e82019-05-09 03:31:27 +00008330 case TemplateName::AssumedTemplate: {
8331 AssumedTemplateStorage *FromStorage = From.getAsAssumedTemplateName();
Gabor Marton5ac6d492019-05-15 10:29:48 +00008332 auto DeclNameOrErr = Import(FromStorage->getDeclName());
Richard Smithb23c5e82019-05-09 03:31:27 +00008333 if (!DeclNameOrErr)
8334 return DeclNameOrErr.takeError();
8335 return ToContext.getAssumedTemplateName(*DeclNameOrErr);
8336 }
8337
Douglas Gregore2e50d332010-12-01 01:36:18 +00008338 case TemplateName::QualifiedTemplate: {
8339 QualifiedTemplateName *QTN = From.getAsQualifiedTemplateName();
Gabor Marton5ac6d492019-05-15 10:29:48 +00008340 auto QualifierOrErr = Import(QTN->getQualifier());
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008341 if (!QualifierOrErr)
8342 return QualifierOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00008343
Gabor Marton5ac6d492019-05-15 10:29:48 +00008344 if (ExpectedDecl ToTemplateOrErr = Import(From.getAsTemplateDecl()))
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008345 return ToContext.getQualifiedTemplateName(
8346 *QualifierOrErr, QTN->hasTemplateKeyword(),
8347 cast<TemplateDecl>(*ToTemplateOrErr));
8348 else
8349 return ToTemplateOrErr.takeError();
Douglas Gregore2e50d332010-12-01 01:36:18 +00008350 }
Fangrui Song6907ce22018-07-30 19:24:48 +00008351
Douglas Gregore2e50d332010-12-01 01:36:18 +00008352 case TemplateName::DependentTemplate: {
8353 DependentTemplateName *DTN = From.getAsDependentTemplateName();
Gabor Marton5ac6d492019-05-15 10:29:48 +00008354 auto QualifierOrErr = Import(DTN->getQualifier());
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008355 if (!QualifierOrErr)
8356 return QualifierOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00008357
Douglas Gregore2e50d332010-12-01 01:36:18 +00008358 if (DTN->isIdentifier()) {
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008359 return ToContext.getDependentTemplateName(*QualifierOrErr,
Douglas Gregore2e50d332010-12-01 01:36:18 +00008360 Import(DTN->getIdentifier()));
8361 }
Fangrui Song6907ce22018-07-30 19:24:48 +00008362
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008363 return ToContext.getDependentTemplateName(*QualifierOrErr,
8364 DTN->getOperator());
Douglas Gregore2e50d332010-12-01 01:36:18 +00008365 }
John McCalld9dfe3a2011-06-30 08:33:18 +00008366
8367 case TemplateName::SubstTemplateTemplateParm: {
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008368 SubstTemplateTemplateParmStorage *Subst =
8369 From.getAsSubstTemplateTemplateParm();
Gabor Marton5ac6d492019-05-15 10:29:48 +00008370 ExpectedDecl ParamOrErr = Import(Subst->getParameter());
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008371 if (!ParamOrErr)
8372 return ParamOrErr.takeError();
John McCalld9dfe3a2011-06-30 08:33:18 +00008373
Gabor Marton5ac6d492019-05-15 10:29:48 +00008374 auto ReplacementOrErr = Import(Subst->getReplacement());
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008375 if (!ReplacementOrErr)
8376 return ReplacementOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00008377
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008378 return ToContext.getSubstTemplateTemplateParm(
8379 cast<TemplateTemplateParmDecl>(*ParamOrErr), *ReplacementOrErr);
John McCalld9dfe3a2011-06-30 08:33:18 +00008380 }
Fangrui Song6907ce22018-07-30 19:24:48 +00008381
Douglas Gregor5590be02011-01-15 06:45:20 +00008382 case TemplateName::SubstTemplateTemplateParmPack: {
8383 SubstTemplateTemplateParmPackStorage *SubstPack
8384 = From.getAsSubstTemplateTemplateParmPack();
Gabor Marton5ac6d492019-05-15 10:29:48 +00008385 ExpectedDecl ParamOrErr = Import(SubstPack->getParameterPack());
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008386 if (!ParamOrErr)
8387 return ParamOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00008388
Douglas Gregor5590be02011-01-15 06:45:20 +00008389 ASTNodeImporter Importer(*this);
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008390 auto ArgPackOrErr =
8391 Importer.ImportTemplateArgument(SubstPack->getArgumentPack());
8392 if (!ArgPackOrErr)
8393 return ArgPackOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00008394
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008395 return ToContext.getSubstTemplateTemplateParmPack(
8396 cast<TemplateTemplateParmDecl>(*ParamOrErr), *ArgPackOrErr);
Douglas Gregor5590be02011-01-15 06:45:20 +00008397 }
Douglas Gregore2e50d332010-12-01 01:36:18 +00008398 }
Fangrui Song6907ce22018-07-30 19:24:48 +00008399
Douglas Gregore2e50d332010-12-01 01:36:18 +00008400 llvm_unreachable("Invalid template name kind");
Douglas Gregore2e50d332010-12-01 01:36:18 +00008401}
8402
Gabor Marton5ac6d492019-05-15 10:29:48 +00008403Expected<SourceLocation> ASTImporter::Import(SourceLocation FromLoc) {
Douglas Gregor62d311f2010-02-09 19:21:46 +00008404 if (FromLoc.isInvalid())
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008405 return SourceLocation{};
Douglas Gregor62d311f2010-02-09 19:21:46 +00008406
Douglas Gregor811663e2010-02-10 00:15:17 +00008407 SourceManager &FromSM = FromContext.getSourceManager();
Shafik Yaghmour9adbbcb2019-03-04 20:25:54 +00008408 bool IsBuiltin = FromSM.isWrittenInBuiltinFile(FromLoc);
Rafael Stahl29f37fb2018-07-04 13:34:05 +00008409
Douglas Gregor811663e2010-02-10 00:15:17 +00008410 std::pair<FileID, unsigned> Decomposed = FromSM.getDecomposedLoc(FromLoc);
Gabor Marton5ac6d492019-05-15 10:29:48 +00008411 Expected<FileID> ToFileIDOrErr = Import(Decomposed.first, IsBuiltin);
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008412 if (!ToFileIDOrErr)
8413 return ToFileIDOrErr.takeError();
Rafael Stahl29f37fb2018-07-04 13:34:05 +00008414 SourceManager &ToSM = ToContext.getSourceManager();
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008415 return ToSM.getComposedLoc(*ToFileIDOrErr, Decomposed.second);
8416}
Douglas Gregor62d311f2010-02-09 19:21:46 +00008417
Gabor Marton5ac6d492019-05-15 10:29:48 +00008418Expected<SourceRange> ASTImporter::Import(SourceRange FromRange) {
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008419 SourceLocation ToBegin, ToEnd;
8420 if (Error Err = importInto(ToBegin, FromRange.getBegin()))
8421 return std::move(Err);
8422 if (Error Err = importInto(ToEnd, FromRange.getEnd()))
8423 return std::move(Err);
8424
8425 return SourceRange(ToBegin, ToEnd);
Balazs Keri4a3d7582018-11-27 18:36:31 +00008426}
Douglas Gregor62d311f2010-02-09 19:21:46 +00008427
Gabor Marton5ac6d492019-05-15 10:29:48 +00008428Expected<FileID> ASTImporter::Import(FileID FromID, bool IsBuiltin) {
Rafael Stahl29f37fb2018-07-04 13:34:05 +00008429 llvm::DenseMap<FileID, FileID>::iterator Pos = ImportedFileIDs.find(FromID);
Douglas Gregor811663e2010-02-10 00:15:17 +00008430 if (Pos != ImportedFileIDs.end())
8431 return Pos->second;
Rafael Stahl29f37fb2018-07-04 13:34:05 +00008432
Douglas Gregor811663e2010-02-10 00:15:17 +00008433 SourceManager &FromSM = FromContext.getSourceManager();
8434 SourceManager &ToSM = ToContext.getSourceManager();
8435 const SrcMgr::SLocEntry &FromSLoc = FromSM.getSLocEntry(FromID);
Rafael Stahl29f37fb2018-07-04 13:34:05 +00008436
8437 // Map the FromID to the "to" source manager.
Douglas Gregor811663e2010-02-10 00:15:17 +00008438 FileID ToID;
Rafael Stahl29f37fb2018-07-04 13:34:05 +00008439 if (FromSLoc.isExpansion()) {
8440 const SrcMgr::ExpansionInfo &FromEx = FromSLoc.getExpansion();
Gabor Marton5ac6d492019-05-15 10:29:48 +00008441 ExpectedSLoc ToSpLoc = Import(FromEx.getSpellingLoc());
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008442 if (!ToSpLoc)
8443 return ToSpLoc.takeError();
Gabor Marton5ac6d492019-05-15 10:29:48 +00008444 ExpectedSLoc ToExLocS = Import(FromEx.getExpansionLocStart());
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008445 if (!ToExLocS)
8446 return ToExLocS.takeError();
Rafael Stahl29f37fb2018-07-04 13:34:05 +00008447 unsigned TokenLen = FromSM.getFileIDSize(FromID);
8448 SourceLocation MLoc;
8449 if (FromEx.isMacroArgExpansion()) {
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008450 MLoc = ToSM.createMacroArgExpansionLoc(*ToSpLoc, *ToExLocS, TokenLen);
Rafael Stahl29f37fb2018-07-04 13:34:05 +00008451 } else {
Gabor Marton5ac6d492019-05-15 10:29:48 +00008452 if (ExpectedSLoc ToExLocE = Import(FromEx.getExpansionLocEnd()))
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008453 MLoc = ToSM.createExpansionLoc(*ToSpLoc, *ToExLocS, *ToExLocE, TokenLen,
8454 FromEx.isExpansionTokenRange());
8455 else
8456 return ToExLocE.takeError();
Rafael Stahl29f37fb2018-07-04 13:34:05 +00008457 }
8458 ToID = ToSM.getFileID(MLoc);
Douglas Gregor811663e2010-02-10 00:15:17 +00008459 } else {
Rafael Stahl29f37fb2018-07-04 13:34:05 +00008460 const SrcMgr::ContentCache *Cache = FromSLoc.getFile().getContentCache();
Shafik Yaghmour9adbbcb2019-03-04 20:25:54 +00008461
8462 if (!IsBuiltin) {
8463 // Include location of this file.
Gabor Marton5ac6d492019-05-15 10:29:48 +00008464 ExpectedSLoc ToIncludeLoc = Import(FromSLoc.getFile().getIncludeLoc());
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008465 if (!ToIncludeLoc)
8466 return ToIncludeLoc.takeError();
Shafik Yaghmour9adbbcb2019-03-04 20:25:54 +00008467
8468 if (Cache->OrigEntry && Cache->OrigEntry->getDir()) {
8469 // FIXME: We probably want to use getVirtualFile(), so we don't hit the
8470 // disk again
8471 // FIXME: We definitely want to re-use the existing MemoryBuffer, rather
8472 // than mmap the files several times.
Harlan Haskins8d323d12019-08-01 21:31:56 +00008473 auto Entry =
Shafik Yaghmour9adbbcb2019-03-04 20:25:54 +00008474 ToFileManager.getFile(Cache->OrigEntry->getName());
8475 // FIXME: The filename may be a virtual name that does probably not
8476 // point to a valid file and we get no Entry here. In this case try with
8477 // the memory buffer below.
8478 if (Entry)
Harlan Haskins8d323d12019-08-01 21:31:56 +00008479 ToID = ToSM.createFileID(*Entry, *ToIncludeLoc,
Shafik Yaghmour9adbbcb2019-03-04 20:25:54 +00008480 FromSLoc.getFile().getFileCharacteristic());
8481 }
Balazs Keri9cf39df2019-02-27 16:31:48 +00008482 }
Shafik Yaghmour9adbbcb2019-03-04 20:25:54 +00008483
8484 if (ToID.isInvalid() || IsBuiltin) {
Rafael Stahl29f37fb2018-07-04 13:34:05 +00008485 // FIXME: We want to re-use the existing MemoryBuffer!
Balazs Keri9cf39df2019-02-27 16:31:48 +00008486 bool Invalid = true;
Duncan P. N. Exon Smithf5848192019-08-26 20:32:05 +00008487 const llvm::MemoryBuffer *FromBuf =
8488 Cache->getBuffer(FromContext.getDiagnostics(),
8489 FromSM.getFileManager(), SourceLocation{}, &Invalid);
Balazs Keri9cf39df2019-02-27 16:31:48 +00008490 if (!FromBuf || Invalid)
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008491 // FIXME: Use a new error kind?
8492 return llvm::make_error<ImportError>(ImportError::Unknown);
Balazs Keri9cf39df2019-02-27 16:31:48 +00008493
Rafael Stahl29f37fb2018-07-04 13:34:05 +00008494 std::unique_ptr<llvm::MemoryBuffer> ToBuf =
8495 llvm::MemoryBuffer::getMemBufferCopy(FromBuf->getBuffer(),
8496 FromBuf->getBufferIdentifier());
8497 ToID = ToSM.createFileID(std::move(ToBuf),
8498 FromSLoc.getFile().getFileCharacteristic());
8499 }
Douglas Gregor811663e2010-02-10 00:15:17 +00008500 }
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00008501
Balazs Keri9cf39df2019-02-27 16:31:48 +00008502 assert(ToID.isValid() && "Unexpected invalid fileID was created.");
8503
Sebastian Redl99219f12010-09-30 01:03:06 +00008504 ImportedFileIDs[FromID] = ToID;
Balazs Kerid22f8772019-07-24 10:16:37 +00008505
8506 if (FileIDImportHandler)
8507 FileIDImportHandler(ToID, FromID);
8508
Douglas Gregor811663e2010-02-10 00:15:17 +00008509 return ToID;
8510}
8511
Gabor Marton5ac6d492019-05-15 10:29:48 +00008512Expected<CXXCtorInitializer *> ASTImporter::Import(CXXCtorInitializer *From) {
8513 ExpectedExpr ToExprOrErr = Import(From->getInit());
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008514 if (!ToExprOrErr)
8515 return ToExprOrErr.takeError();
8516
Gabor Marton5ac6d492019-05-15 10:29:48 +00008517 auto LParenLocOrErr = Import(From->getLParenLoc());
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008518 if (!LParenLocOrErr)
8519 return LParenLocOrErr.takeError();
8520
Gabor Marton5ac6d492019-05-15 10:29:48 +00008521 auto RParenLocOrErr = Import(From->getRParenLoc());
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008522 if (!RParenLocOrErr)
8523 return RParenLocOrErr.takeError();
Davide Italianofaee83d2018-11-28 19:15:23 +00008524
8525 if (From->isBaseInitializer()) {
Gabor Marton5ac6d492019-05-15 10:29:48 +00008526 auto ToTInfoOrErr = Import(From->getTypeSourceInfo());
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008527 if (!ToTInfoOrErr)
8528 return ToTInfoOrErr.takeError();
8529
8530 SourceLocation EllipsisLoc;
8531 if (From->isPackExpansion())
8532 if (Error Err = importInto(EllipsisLoc, From->getEllipsisLoc()))
8533 return std::move(Err);
Davide Italianofaee83d2018-11-28 19:15:23 +00008534
8535 return new (ToContext) CXXCtorInitializer(
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008536 ToContext, *ToTInfoOrErr, From->isBaseVirtual(), *LParenLocOrErr,
8537 *ToExprOrErr, *RParenLocOrErr, EllipsisLoc);
Davide Italianofaee83d2018-11-28 19:15:23 +00008538 } else if (From->isMemberInitializer()) {
Gabor Marton5ac6d492019-05-15 10:29:48 +00008539 ExpectedDecl ToFieldOrErr = Import(From->getMember());
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008540 if (!ToFieldOrErr)
8541 return ToFieldOrErr.takeError();
8542
Gabor Marton5ac6d492019-05-15 10:29:48 +00008543 auto MemberLocOrErr = Import(From->getMemberLocation());
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008544 if (!MemberLocOrErr)
8545 return MemberLocOrErr.takeError();
Davide Italianofaee83d2018-11-28 19:15:23 +00008546
8547 return new (ToContext) CXXCtorInitializer(
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008548 ToContext, cast_or_null<FieldDecl>(*ToFieldOrErr), *MemberLocOrErr,
8549 *LParenLocOrErr, *ToExprOrErr, *RParenLocOrErr);
Davide Italianofaee83d2018-11-28 19:15:23 +00008550 } else if (From->isIndirectMemberInitializer()) {
Gabor Marton5ac6d492019-05-15 10:29:48 +00008551 ExpectedDecl ToIFieldOrErr = Import(From->getIndirectMember());
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008552 if (!ToIFieldOrErr)
8553 return ToIFieldOrErr.takeError();
8554
Gabor Marton5ac6d492019-05-15 10:29:48 +00008555 auto MemberLocOrErr = Import(From->getMemberLocation());
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008556 if (!MemberLocOrErr)
8557 return MemberLocOrErr.takeError();
Davide Italianofaee83d2018-11-28 19:15:23 +00008558
8559 return new (ToContext) CXXCtorInitializer(
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008560 ToContext, cast_or_null<IndirectFieldDecl>(*ToIFieldOrErr),
8561 *MemberLocOrErr, *LParenLocOrErr, *ToExprOrErr, *RParenLocOrErr);
Davide Italianofaee83d2018-11-28 19:15:23 +00008562 } else if (From->isDelegatingInitializer()) {
Gabor Marton5ac6d492019-05-15 10:29:48 +00008563 auto ToTInfoOrErr = Import(From->getTypeSourceInfo());
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008564 if (!ToTInfoOrErr)
8565 return ToTInfoOrErr.takeError();
Davide Italianofaee83d2018-11-28 19:15:23 +00008566
8567 return new (ToContext)
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008568 CXXCtorInitializer(ToContext, *ToTInfoOrErr, *LParenLocOrErr,
8569 *ToExprOrErr, *RParenLocOrErr);
Davide Italianofaee83d2018-11-28 19:15:23 +00008570 } else {
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008571 // FIXME: assert?
8572 return make_error<ImportError>();
Davide Italianofaee83d2018-11-28 19:15:23 +00008573 }
Balazs Kerideaf7ab2018-11-28 13:21:26 +00008574}
Sean Callanandd2c1742016-05-16 20:48:03 +00008575
Balazs Keri4a3d7582018-11-27 18:36:31 +00008576Expected<CXXBaseSpecifier *>
Gabor Marton5ac6d492019-05-15 10:29:48 +00008577ASTImporter::Import(const CXXBaseSpecifier *BaseSpec) {
Aleksei Sidorina693b372016-09-28 10:16:56 +00008578 auto Pos = ImportedCXXBaseSpecifiers.find(BaseSpec);
8579 if (Pos != ImportedCXXBaseSpecifiers.end())
8580 return Pos->second;
8581
Gabor Marton5ac6d492019-05-15 10:29:48 +00008582 Expected<SourceRange> ToSourceRange = Import(BaseSpec->getSourceRange());
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008583 if (!ToSourceRange)
8584 return ToSourceRange.takeError();
Gabor Marton5ac6d492019-05-15 10:29:48 +00008585 Expected<TypeSourceInfo *> ToTSI = Import(BaseSpec->getTypeSourceInfo());
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008586 if (!ToTSI)
8587 return ToTSI.takeError();
Gabor Marton5ac6d492019-05-15 10:29:48 +00008588 ExpectedSLoc ToEllipsisLoc = Import(BaseSpec->getEllipsisLoc());
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008589 if (!ToEllipsisLoc)
8590 return ToEllipsisLoc.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00008591 CXXBaseSpecifier *Imported = new (ToContext) CXXBaseSpecifier(
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008592 *ToSourceRange, BaseSpec->isVirtual(), BaseSpec->isBaseOfClass(),
8593 BaseSpec->getAccessSpecifierAsWritten(), *ToTSI, *ToEllipsisLoc);
Aleksei Sidorina693b372016-09-28 10:16:56 +00008594 ImportedCXXBaseSpecifiers[BaseSpec] = Imported;
8595 return Imported;
8596}
8597
Gabor Marton5ac6d492019-05-15 10:29:48 +00008598Error ASTImporter::ImportDefinition(Decl *From) {
8599 ExpectedDecl ToOrErr = Import(From);
8600 if (!ToOrErr)
8601 return ToOrErr.takeError();
8602 Decl *To = *ToOrErr;
Fangrui Song6907ce22018-07-30 19:24:48 +00008603
Don Hintonf170dff2019-03-19 06:14:14 +00008604 auto *FromDC = cast<DeclContext>(From);
8605 ASTNodeImporter Importer(*this);
Fangrui Song6907ce22018-07-30 19:24:48 +00008606
Don Hintonf170dff2019-03-19 06:14:14 +00008607 if (auto *ToRecord = dyn_cast<RecordDecl>(To)) {
8608 if (!ToRecord->getDefinition()) {
8609 return Importer.ImportDefinition(
8610 cast<RecordDecl>(FromDC), ToRecord,
8611 ASTNodeImporter::IDK_Everything);
Sean Callanan53a6bff2011-07-19 22:38:25 +00008612 }
Douglas Gregor0a791672011-01-18 03:11:38 +00008613 }
Balazs Keri3b30d652018-10-19 13:32:20 +00008614
Don Hintonf170dff2019-03-19 06:14:14 +00008615 if (auto *ToEnum = dyn_cast<EnumDecl>(To)) {
8616 if (!ToEnum->getDefinition()) {
8617 return Importer.ImportDefinition(
8618 cast<EnumDecl>(FromDC), ToEnum, ASTNodeImporter::IDK_Everything);
8619 }
8620 }
8621
8622 if (auto *ToIFace = dyn_cast<ObjCInterfaceDecl>(To)) {
8623 if (!ToIFace->getDefinition()) {
8624 return Importer.ImportDefinition(
8625 cast<ObjCInterfaceDecl>(FromDC), ToIFace,
8626 ASTNodeImporter::IDK_Everything);
8627 }
8628 }
8629
8630 if (auto *ToProto = dyn_cast<ObjCProtocolDecl>(To)) {
8631 if (!ToProto->getDefinition()) {
8632 return Importer.ImportDefinition(
8633 cast<ObjCProtocolDecl>(FromDC), ToProto,
8634 ASTNodeImporter::IDK_Everything);
8635 }
8636 }
8637
8638 return Importer.ImportDeclContext(FromDC, true);
Balazs Keri3b30d652018-10-19 13:32:20 +00008639}
8640
Gabor Marton5ac6d492019-05-15 10:29:48 +00008641Expected<DeclarationName> ASTImporter::Import(DeclarationName FromName) {
Douglas Gregor96e578d2010-02-05 17:54:41 +00008642 if (!FromName)
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008643 return DeclarationName{};
Douglas Gregor96e578d2010-02-05 17:54:41 +00008644
8645 switch (FromName.getNameKind()) {
8646 case DeclarationName::Identifier:
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008647 return DeclarationName(Import(FromName.getAsIdentifierInfo()));
Douglas Gregor96e578d2010-02-05 17:54:41 +00008648
8649 case DeclarationName::ObjCZeroArgSelector:
8650 case DeclarationName::ObjCOneArgSelector:
8651 case DeclarationName::ObjCMultiArgSelector:
Gabor Marton5ac6d492019-05-15 10:29:48 +00008652 if (auto ToSelOrErr = Import(FromName.getObjCSelector()))
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008653 return DeclarationName(*ToSelOrErr);
8654 else
8655 return ToSelOrErr.takeError();
Douglas Gregor96e578d2010-02-05 17:54:41 +00008656
8657 case DeclarationName::CXXConstructorName: {
Gabor Marton5ac6d492019-05-15 10:29:48 +00008658 if (auto ToTyOrErr = Import(FromName.getCXXNameType()))
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008659 return ToContext.DeclarationNames.getCXXConstructorName(
8660 ToContext.getCanonicalType(*ToTyOrErr));
8661 else
8662 return ToTyOrErr.takeError();
Douglas Gregor96e578d2010-02-05 17:54:41 +00008663 }
8664
8665 case DeclarationName::CXXDestructorName: {
Gabor Marton5ac6d492019-05-15 10:29:48 +00008666 if (auto ToTyOrErr = Import(FromName.getCXXNameType()))
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008667 return ToContext.DeclarationNames.getCXXDestructorName(
8668 ToContext.getCanonicalType(*ToTyOrErr));
8669 else
8670 return ToTyOrErr.takeError();
Douglas Gregor96e578d2010-02-05 17:54:41 +00008671 }
8672
Richard Smith35845152017-02-07 01:37:30 +00008673 case DeclarationName::CXXDeductionGuideName: {
Gabor Marton5ac6d492019-05-15 10:29:48 +00008674 if (auto ToTemplateOrErr = Import(FromName.getCXXDeductionGuideTemplate()))
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008675 return ToContext.DeclarationNames.getCXXDeductionGuideName(
8676 cast<TemplateDecl>(*ToTemplateOrErr));
8677 else
8678 return ToTemplateOrErr.takeError();
Richard Smith35845152017-02-07 01:37:30 +00008679 }
8680
Douglas Gregor96e578d2010-02-05 17:54:41 +00008681 case DeclarationName::CXXConversionFunctionName: {
Gabor Marton5ac6d492019-05-15 10:29:48 +00008682 if (auto ToTyOrErr = Import(FromName.getCXXNameType()))
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008683 return ToContext.DeclarationNames.getCXXConversionFunctionName(
8684 ToContext.getCanonicalType(*ToTyOrErr));
8685 else
8686 return ToTyOrErr.takeError();
Douglas Gregor96e578d2010-02-05 17:54:41 +00008687 }
8688
8689 case DeclarationName::CXXOperatorName:
8690 return ToContext.DeclarationNames.getCXXOperatorName(
8691 FromName.getCXXOverloadedOperator());
8692
8693 case DeclarationName::CXXLiteralOperatorName:
8694 return ToContext.DeclarationNames.getCXXLiteralOperatorName(
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008695 Import(FromName.getCXXLiteralIdentifier()));
Douglas Gregor96e578d2010-02-05 17:54:41 +00008696
8697 case DeclarationName::CXXUsingDirective:
8698 // FIXME: STATICS!
8699 return DeclarationName::getUsingDirectiveName();
8700 }
8701
David Blaikiee4d798f2012-01-20 21:50:17 +00008702 llvm_unreachable("Invalid DeclarationName Kind!");
Douglas Gregor96e578d2010-02-05 17:54:41 +00008703}
8704
Douglas Gregore2e50d332010-12-01 01:36:18 +00008705IdentifierInfo *ASTImporter::Import(const IdentifierInfo *FromId) {
Douglas Gregor96e578d2010-02-05 17:54:41 +00008706 if (!FromId)
Craig Topper36250ad2014-05-12 05:36:57 +00008707 return nullptr;
Douglas Gregor96e578d2010-02-05 17:54:41 +00008708
Sean Callananf94ef1d2016-05-14 06:11:19 +00008709 IdentifierInfo *ToId = &ToContext.Idents.get(FromId->getName());
8710
8711 if (!ToId->getBuiltinID() && FromId->getBuiltinID())
8712 ToId->setBuiltinID(FromId->getBuiltinID());
8713
8714 return ToId;
Douglas Gregor96e578d2010-02-05 17:54:41 +00008715}
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00008716
Gabor Marton5ac6d492019-05-15 10:29:48 +00008717Expected<Selector> ASTImporter::Import(Selector FromSel) {
Douglas Gregor43f54792010-02-17 02:12:47 +00008718 if (FromSel.isNull())
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008719 return Selector{};
Douglas Gregor43f54792010-02-17 02:12:47 +00008720
Chris Lattner0e62c1c2011-07-23 10:55:15 +00008721 SmallVector<IdentifierInfo *, 4> Idents;
Douglas Gregor43f54792010-02-17 02:12:47 +00008722 Idents.push_back(Import(FromSel.getIdentifierInfoForSlot(0)));
8723 for (unsigned I = 1, N = FromSel.getNumArgs(); I < N; ++I)
8724 Idents.push_back(Import(FromSel.getIdentifierInfoForSlot(I)));
8725 return ToContext.Selectors.getSelector(FromSel.getNumArgs(), Idents.data());
8726}
8727
Gabor Martonf035b752019-08-27 11:36:10 +00008728Expected<DeclarationName> ASTImporter::HandleNameConflict(DeclarationName Name,
8729 DeclContext *DC,
8730 unsigned IDNS,
8731 NamedDecl **Decls,
8732 unsigned NumDecls) {
8733 if (ODRHandling == ODRHandlingType::Conservative)
8734 // Report error at any name conflict.
8735 return make_error<ImportError>(ImportError::NameConflict);
8736 else
8737 // Allow to create the new Decl with the same name.
8738 return Name;
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00008739}
8740
8741DiagnosticBuilder ASTImporter::ToDiag(SourceLocation Loc, unsigned DiagID) {
Richard Smith5bb4cdf2012-12-20 02:22:15 +00008742 if (LastDiagFromFrom)
8743 ToContext.getDiagnostics().notePriorDiagnosticFrom(
8744 FromContext.getDiagnostics());
8745 LastDiagFromFrom = false;
Argyrios Kyrtzidisd0040642010-11-18 20:06:41 +00008746 return ToContext.getDiagnostics().Report(Loc, DiagID);
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00008747}
8748
8749DiagnosticBuilder ASTImporter::FromDiag(SourceLocation Loc, unsigned DiagID) {
Richard Smith5bb4cdf2012-12-20 02:22:15 +00008750 if (!LastDiagFromFrom)
8751 FromContext.getDiagnostics().notePriorDiagnosticFrom(
8752 ToContext.getDiagnostics());
8753 LastDiagFromFrom = true;
Argyrios Kyrtzidisd0040642010-11-18 20:06:41 +00008754 return FromContext.getDiagnostics().Report(Loc, DiagID);
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00008755}
Douglas Gregor8cdbe642010-02-12 23:44:20 +00008756
Douglas Gregor2e15c842012-02-01 21:00:38 +00008757void ASTImporter::CompleteDecl (Decl *D) {
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00008758 if (auto *ID = dyn_cast<ObjCInterfaceDecl>(D)) {
Douglas Gregor2e15c842012-02-01 21:00:38 +00008759 if (!ID->getDefinition())
8760 ID->startDefinition();
8761 }
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00008762 else if (auto *PD = dyn_cast<ObjCProtocolDecl>(D)) {
Douglas Gregor2e15c842012-02-01 21:00:38 +00008763 if (!PD->getDefinition())
8764 PD->startDefinition();
8765 }
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00008766 else if (auto *TD = dyn_cast<TagDecl>(D)) {
Douglas Gregor2e15c842012-02-01 21:00:38 +00008767 if (!TD->getDefinition() && !TD->isBeingDefined()) {
8768 TD->startDefinition();
8769 TD->setCompleteDefinition(true);
8770 }
8771 }
8772 else {
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00008773 assert(0 && "CompleteDecl called on a Decl that can't be completed");
Douglas Gregor2e15c842012-02-01 21:00:38 +00008774 }
8775}
8776
Gabor Marton26f72a92018-07-12 09:42:05 +00008777Decl *ASTImporter::MapImported(Decl *From, Decl *To) {
8778 llvm::DenseMap<Decl *, Decl *>::iterator Pos = ImportedDecls.find(From);
8779 assert((Pos == ImportedDecls.end() || Pos->second == To) &&
8780 "Try to import an already imported Decl");
8781 if (Pos != ImportedDecls.end())
8782 return Pos->second;
Douglas Gregor8cdbe642010-02-12 23:44:20 +00008783 ImportedDecls[From] = To;
Gabor Marton458d1452019-02-14 13:07:03 +00008784 // This mapping should be maintained only in this function. Therefore do not
8785 // check for additional consistency.
8786 ImportedFromDecls[To] = From;
Gabor Marton303c98612019-06-25 08:00:51 +00008787 AddToLookupTable(To);
Douglas Gregor8cdbe642010-02-12 23:44:20 +00008788 return To;
Daniel Dunbar9ced5422010-02-13 20:24:39 +00008789}
Douglas Gregorb4964f72010-02-15 23:54:17 +00008790
Gabor Marton303c98612019-06-25 08:00:51 +00008791llvm::Optional<ImportError>
8792ASTImporter::getImportDeclErrorIfAny(Decl *FromD) const {
8793 auto Pos = ImportDeclErrors.find(FromD);
8794 if (Pos != ImportDeclErrors.end())
8795 return Pos->second;
8796 else
8797 return Optional<ImportError>();
8798}
8799
8800void ASTImporter::setImportDeclError(Decl *From, ImportError Error) {
Gabor Marton1ad4b992019-07-01 14:19:53 +00008801 auto InsertRes = ImportDeclErrors.insert({From, Error});
Benjamin Kramer4f769362019-07-01 14:33:26 +00008802 (void)InsertRes;
Gabor Marton1ad4b992019-07-01 14:19:53 +00008803 // Either we set the error for the first time, or we already had set one and
8804 // now we want to set the same error.
8805 assert(InsertRes.second || InsertRes.first->second.Error == Error.Error);
Gabor Marton303c98612019-06-25 08:00:51 +00008806}
8807
Douglas Gregordd6006f2012-07-17 21:16:27 +00008808bool ASTImporter::IsStructurallyEquivalent(QualType From, QualType To,
8809 bool Complain) {
Balazs Keria1f6b102019-04-08 13:59:15 +00008810 llvm::DenseMap<const Type *, const Type *>::iterator Pos =
8811 ImportedTypes.find(From.getTypePtr());
8812 if (Pos != ImportedTypes.end()) {
Gabor Marton5ac6d492019-05-15 10:29:48 +00008813 if (ExpectedType ToFromOrErr = Import(From)) {
Balazs Keria1f6b102019-04-08 13:59:15 +00008814 if (ToContext.hasSameType(*ToFromOrErr, To))
8815 return true;
8816 } else {
8817 llvm::consumeError(ToFromOrErr.takeError());
8818 }
8819 }
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00008820
Douglas Gregordd6006f2012-07-17 21:16:27 +00008821 StructuralEquivalenceContext Ctx(FromContext, ToContext, NonEquivalentDecls,
Gabor Marton26f72a92018-07-12 09:42:05 +00008822 getStructuralEquivalenceKind(*this), false,
8823 Complain);
Gabor Marton950fb572018-07-17 12:39:27 +00008824 return Ctx.IsEquivalent(From, To);
Douglas Gregorb4964f72010-02-15 23:54:17 +00008825}