blob: 3b484f94003f401536a07ae8b68ef649cef996d3 [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"
Gabor Marton54058b52018-12-17 13:53:12 +000015#include "clang/AST/ASTImporterLookupTable.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"
47#include "clang/Basic/ExceptionSpecificationType.h"
Douglas Gregor811663e2010-02-10 00:15:17 +000048#include "clang/Basic/FileManager.h"
Eugene Zelenko9a9c8232018-04-09 21:54:38 +000049#include "clang/Basic/IdentifierTable.h"
50#include "clang/Basic/LLVM.h"
51#include "clang/Basic/LangOptions.h"
52#include "clang/Basic/SourceLocation.h"
Douglas Gregor811663e2010-02-10 00:15:17 +000053#include "clang/Basic/SourceManager.h"
Eugene Zelenko9a9c8232018-04-09 21:54:38 +000054#include "clang/Basic/Specifiers.h"
55#include "llvm/ADT/APSInt.h"
56#include "llvm/ADT/ArrayRef.h"
57#include "llvm/ADT/DenseMap.h"
58#include "llvm/ADT/None.h"
59#include "llvm/ADT/Optional.h"
60#include "llvm/ADT/STLExtras.h"
61#include "llvm/ADT/SmallVector.h"
62#include "llvm/Support/Casting.h"
63#include "llvm/Support/ErrorHandling.h"
Douglas Gregor811663e2010-02-10 00:15:17 +000064#include "llvm/Support/MemoryBuffer.h"
Eugene Zelenko9a9c8232018-04-09 21:54:38 +000065#include <algorithm>
66#include <cassert>
67#include <cstddef>
68#include <memory>
69#include <type_traits>
70#include <utility>
Douglas Gregor96e578d2010-02-05 17:54:41 +000071
Douglas Gregor3c2404b2011-11-03 18:07:07 +000072namespace clang {
Eugene Zelenko9a9c8232018-04-09 21:54:38 +000073
Balazs Keri3b30d652018-10-19 13:32:20 +000074 using llvm::make_error;
75 using llvm::Error;
76 using llvm::Expected;
77 using ExpectedType = llvm::Expected<QualType>;
78 using ExpectedStmt = llvm::Expected<Stmt *>;
79 using ExpectedExpr = llvm::Expected<Expr *>;
80 using ExpectedDecl = llvm::Expected<Decl *>;
81 using ExpectedSLoc = llvm::Expected<SourceLocation>;
Balazs Keri2544b4b2018-08-08 09:40:57 +000082
Balazs Keri3b30d652018-10-19 13:32:20 +000083 std::string ImportError::toString() const {
84 // FIXME: Improve error texts.
85 switch (Error) {
86 case NameConflict:
87 return "NameConflict";
88 case UnsupportedConstruct:
89 return "UnsupportedConstruct";
90 case Unknown:
91 return "Unknown error";
Balazs Keri2544b4b2018-08-08 09:40:57 +000092 }
Balazs Keri2a13d662018-10-19 15:16:51 +000093 llvm_unreachable("Invalid error code.");
94 return "Invalid error code.";
Balazs Keri2544b4b2018-08-08 09:40:57 +000095 }
96
Balazs Keri3b30d652018-10-19 13:32:20 +000097 void ImportError::log(raw_ostream &OS) const {
98 OS << toString();
99 }
100
101 std::error_code ImportError::convertToErrorCode() const {
102 llvm_unreachable("Function not implemented.");
103 }
104
105 char ImportError::ID;
106
Gabor Marton5254e642018-06-27 13:32:50 +0000107 template <class T>
Balazs Keri3b30d652018-10-19 13:32:20 +0000108 SmallVector<Decl *, 2>
Gabor Marton5254e642018-06-27 13:32:50 +0000109 getCanonicalForwardRedeclChain(Redeclarable<T>* D) {
Balazs Keri3b30d652018-10-19 13:32:20 +0000110 SmallVector<Decl *, 2> Redecls;
Gabor Marton5254e642018-06-27 13:32:50 +0000111 for (auto *R : D->getFirstDecl()->redecls()) {
112 if (R != D->getFirstDecl())
113 Redecls.push_back(R);
114 }
115 Redecls.push_back(D->getFirstDecl());
116 std::reverse(Redecls.begin(), Redecls.end());
117 return Redecls;
118 }
119
120 SmallVector<Decl*, 2> getCanonicalForwardRedeclChain(Decl* D) {
Gabor Martonac3a5d62018-09-17 12:04:52 +0000121 if (auto *FD = dyn_cast<FunctionDecl>(D))
122 return getCanonicalForwardRedeclChain<FunctionDecl>(FD);
123 if (auto *VD = dyn_cast<VarDecl>(D))
124 return getCanonicalForwardRedeclChain<VarDecl>(VD);
Gabor Marton7df342a2018-12-17 12:42:12 +0000125 if (auto *TD = dyn_cast<TagDecl>(D))
126 return getCanonicalForwardRedeclChain<TagDecl>(TD);
Gabor Martonac3a5d62018-09-17 12:04:52 +0000127 llvm_unreachable("Bad declaration kind");
Gabor Marton5254e642018-06-27 13:32:50 +0000128 }
129
Gabor Marton26f72a92018-07-12 09:42:05 +0000130 void updateFlags(const Decl *From, Decl *To) {
131 // Check if some flags or attrs are new in 'From' and copy into 'To'.
132 // FIXME: Other flags or attrs?
133 if (From->isUsed(false) && !To->isUsed(false))
134 To->setIsUsed();
135 }
136
Davide Italianofaee83d2018-11-28 19:15:23 +0000137 // FIXME: Temporary until every import returns Expected.
138 template <>
139 LLVM_NODISCARD Error
140 ASTImporter::importInto(SourceLocation &To, const SourceLocation &From) {
141 To = Import(From);
142 if (From.isValid() && To.isInvalid())
143 return llvm::make_error<ImportError>();
144 return Error::success();
145 }
146 // FIXME: Temporary until every import returns Expected.
147 template <>
148 LLVM_NODISCARD Error
149 ASTImporter::importInto(QualType &To, const QualType &From) {
150 To = Import(From);
151 if (!From.isNull() && To.isNull())
152 return llvm::make_error<ImportError>();
153 return Error::success();
154 }
155
Balazs Keri3b30d652018-10-19 13:32:20 +0000156 class ASTNodeImporter : public TypeVisitor<ASTNodeImporter, ExpectedType>,
157 public DeclVisitor<ASTNodeImporter, ExpectedDecl>,
158 public StmtVisitor<ASTNodeImporter, ExpectedStmt> {
Douglas Gregor96e578d2010-02-05 17:54:41 +0000159 ASTImporter &Importer;
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +0000160
Balazs Keri3b30d652018-10-19 13:32:20 +0000161 // Use this instead of Importer.importInto .
162 template <typename ImportT>
163 LLVM_NODISCARD Error importInto(ImportT &To, const ImportT &From) {
164 return Importer.importInto(To, From);
165 }
166
167 // Use this to import pointers of specific type.
168 template <typename ImportT>
169 LLVM_NODISCARD Error importInto(ImportT *&To, ImportT *From) {
170 auto ToI = Importer.Import(From);
171 if (!ToI && From)
172 return make_error<ImportError>();
173 To = cast_or_null<ImportT>(ToI);
174 return Error::success();
175 // FIXME: This should be the final code.
176 //auto ToOrErr = Importer.Import(From);
177 //if (ToOrErr) {
178 // To = cast_or_null<ImportT>(*ToOrErr);
179 //}
180 //return ToOrErr.takeError();
181 }
182
183 // Call the import function of ASTImporter for a baseclass of type `T` and
184 // cast the return value to `T`.
185 template <typename T>
186 Expected<T *> import(T *From) {
187 auto *To = Importer.Import(From);
188 if (!To && From)
189 return make_error<ImportError>();
190 return cast_or_null<T>(To);
191 // FIXME: This should be the final code.
192 //auto ToOrErr = Importer.Import(From);
193 //if (!ToOrErr)
194 // return ToOrErr.takeError();
195 //return cast_or_null<T>(*ToOrErr);
196 }
197
198 template <typename T>
199 Expected<T *> import(const T *From) {
200 return import(const_cast<T *>(From));
201 }
202
203 // Call the import function of ASTImporter for type `T`.
204 template <typename T>
205 Expected<T> import(const T &From) {
206 T To = Importer.Import(From);
207 T DefaultT;
208 if (To == DefaultT && !(From == DefaultT))
209 return make_error<ImportError>();
210 return To;
211 // FIXME: This should be the final code.
212 //return Importer.Import(From);
213 }
214
215 template <class T>
216 Expected<std::tuple<T>>
217 importSeq(const T &From) {
218 Expected<T> ToOrErr = import(From);
219 if (!ToOrErr)
220 return ToOrErr.takeError();
221 return std::make_tuple<T>(std::move(*ToOrErr));
222 }
223
224 // Import multiple objects with a single function call.
225 // This should work for every type for which a variant of `import` exists.
226 // The arguments are processed from left to right and import is stopped on
227 // first error.
228 template <class THead, class... TTail>
229 Expected<std::tuple<THead, TTail...>>
230 importSeq(const THead &FromHead, const TTail &...FromTail) {
231 Expected<std::tuple<THead>> ToHeadOrErr = importSeq(FromHead);
232 if (!ToHeadOrErr)
233 return ToHeadOrErr.takeError();
234 Expected<std::tuple<TTail...>> ToTailOrErr = importSeq(FromTail...);
235 if (!ToTailOrErr)
236 return ToTailOrErr.takeError();
237 return std::tuple_cat(*ToHeadOrErr, *ToTailOrErr);
238 }
239
240// Wrapper for an overload set.
Gabor Marton26f72a92018-07-12 09:42:05 +0000241 template <typename ToDeclT> struct CallOverloadedCreateFun {
242 template <typename... Args>
243 auto operator()(Args &&... args)
244 -> decltype(ToDeclT::Create(std::forward<Args>(args)...)) {
245 return ToDeclT::Create(std::forward<Args>(args)...);
246 }
247 };
248
249 // Always use these functions to create a Decl during import. There are
250 // certain tasks which must be done after the Decl was created, e.g. we
251 // must immediately register that as an imported Decl. The parameter `ToD`
252 // will be set to the newly created Decl or if had been imported before
253 // then to the already imported Decl. Returns a bool value set to true if
254 // the `FromD` had been imported before.
255 template <typename ToDeclT, typename FromDeclT, typename... Args>
256 LLVM_NODISCARD bool GetImportedOrCreateDecl(ToDeclT *&ToD, FromDeclT *FromD,
257 Args &&... args) {
258 // There may be several overloads of ToDeclT::Create. We must make sure
259 // to call the one which would be chosen by the arguments, thus we use a
260 // wrapper for the overload set.
261 CallOverloadedCreateFun<ToDeclT> OC;
262 return GetImportedOrCreateSpecialDecl(ToD, OC, FromD,
263 std::forward<Args>(args)...);
264 }
265 // Use this overload if a special Type is needed to be created. E.g if we
266 // want to create a `TypeAliasDecl` and assign that to a `TypedefNameDecl`
267 // then:
268 // TypedefNameDecl *ToTypedef;
269 // GetImportedOrCreateDecl<TypeAliasDecl>(ToTypedef, FromD, ...);
270 template <typename NewDeclT, typename ToDeclT, typename FromDeclT,
271 typename... Args>
272 LLVM_NODISCARD bool GetImportedOrCreateDecl(ToDeclT *&ToD, FromDeclT *FromD,
273 Args &&... args) {
274 CallOverloadedCreateFun<NewDeclT> OC;
275 return GetImportedOrCreateSpecialDecl(ToD, OC, FromD,
276 std::forward<Args>(args)...);
277 }
278 // Use this version if a special create function must be
279 // used, e.g. CXXRecordDecl::CreateLambda .
280 template <typename ToDeclT, typename CreateFunT, typename FromDeclT,
281 typename... Args>
282 LLVM_NODISCARD bool
283 GetImportedOrCreateSpecialDecl(ToDeclT *&ToD, CreateFunT CreateFun,
284 FromDeclT *FromD, Args &&... args) {
Balazs Keri3b30d652018-10-19 13:32:20 +0000285 // FIXME: This code is needed later.
286 //if (Importer.getImportDeclErrorIfAny(FromD)) {
287 // ToD = nullptr;
288 // return true; // Already imported but with error.
289 //}
Gabor Marton26f72a92018-07-12 09:42:05 +0000290 ToD = cast_or_null<ToDeclT>(Importer.GetAlreadyImportedOrNull(FromD));
291 if (ToD)
292 return true; // Already imported.
293 ToD = CreateFun(std::forward<Args>(args)...);
Gabor Marton54058b52018-12-17 13:53:12 +0000294 // Keep track of imported Decls.
295 Importer.MapImported(FromD, ToD);
296 Importer.AddToLookupTable(ToD);
Gabor Marton26f72a92018-07-12 09:42:05 +0000297 InitializeImportedDecl(FromD, ToD);
298 return false; // A new Decl is created.
299 }
300
301 void InitializeImportedDecl(Decl *FromD, Decl *ToD) {
Gabor Marton26f72a92018-07-12 09:42:05 +0000302 ToD->IdentifierNamespace = FromD->IdentifierNamespace;
303 if (FromD->hasAttrs())
304 for (const Attr *FromAttr : FromD->getAttrs())
305 ToD->addAttr(Importer.Import(FromAttr));
306 if (FromD->isUsed())
307 ToD->setIsUsed();
308 if (FromD->isImplicit())
309 ToD->setImplicit();
310 }
311
Douglas Gregor96e578d2010-02-05 17:54:41 +0000312 public:
Eugene Zelenko9a9c8232018-04-09 21:54:38 +0000313 explicit ASTNodeImporter(ASTImporter &Importer) : Importer(Importer) {}
Gabor Marton344b0992018-05-16 11:48:11 +0000314
Balazs Keri3b30d652018-10-19 13:32:20 +0000315 using TypeVisitor<ASTNodeImporter, ExpectedType>::Visit;
316 using DeclVisitor<ASTNodeImporter, ExpectedDecl>::Visit;
317 using StmtVisitor<ASTNodeImporter, ExpectedStmt>::Visit;
Douglas Gregor96e578d2010-02-05 17:54:41 +0000318
319 // Importing types
Balazs Keri3b30d652018-10-19 13:32:20 +0000320 ExpectedType VisitType(const Type *T);
321 ExpectedType VisitAtomicType(const AtomicType *T);
322 ExpectedType VisitBuiltinType(const BuiltinType *T);
323 ExpectedType VisitDecayedType(const DecayedType *T);
324 ExpectedType VisitComplexType(const ComplexType *T);
325 ExpectedType VisitPointerType(const PointerType *T);
326 ExpectedType VisitBlockPointerType(const BlockPointerType *T);
327 ExpectedType VisitLValueReferenceType(const LValueReferenceType *T);
328 ExpectedType VisitRValueReferenceType(const RValueReferenceType *T);
329 ExpectedType VisitMemberPointerType(const MemberPointerType *T);
330 ExpectedType VisitConstantArrayType(const ConstantArrayType *T);
331 ExpectedType VisitIncompleteArrayType(const IncompleteArrayType *T);
332 ExpectedType VisitVariableArrayType(const VariableArrayType *T);
333 ExpectedType VisitDependentSizedArrayType(const DependentSizedArrayType *T);
Douglas Gregor96e578d2010-02-05 17:54:41 +0000334 // FIXME: DependentSizedExtVectorType
Balazs Keri3b30d652018-10-19 13:32:20 +0000335 ExpectedType VisitVectorType(const VectorType *T);
336 ExpectedType VisitExtVectorType(const ExtVectorType *T);
337 ExpectedType VisitFunctionNoProtoType(const FunctionNoProtoType *T);
338 ExpectedType VisitFunctionProtoType(const FunctionProtoType *T);
339 ExpectedType VisitUnresolvedUsingType(const UnresolvedUsingType *T);
340 ExpectedType VisitParenType(const ParenType *T);
341 ExpectedType VisitTypedefType(const TypedefType *T);
342 ExpectedType VisitTypeOfExprType(const TypeOfExprType *T);
Douglas Gregor96e578d2010-02-05 17:54:41 +0000343 // FIXME: DependentTypeOfExprType
Balazs Keri3b30d652018-10-19 13:32:20 +0000344 ExpectedType VisitTypeOfType(const TypeOfType *T);
345 ExpectedType VisitDecltypeType(const DecltypeType *T);
346 ExpectedType VisitUnaryTransformType(const UnaryTransformType *T);
347 ExpectedType VisitAutoType(const AutoType *T);
348 ExpectedType VisitInjectedClassNameType(const InjectedClassNameType *T);
Douglas Gregor96e578d2010-02-05 17:54:41 +0000349 // FIXME: DependentDecltypeType
Balazs Keri3b30d652018-10-19 13:32:20 +0000350 ExpectedType VisitRecordType(const RecordType *T);
351 ExpectedType VisitEnumType(const EnumType *T);
352 ExpectedType VisitAttributedType(const AttributedType *T);
353 ExpectedType VisitTemplateTypeParmType(const TemplateTypeParmType *T);
354 ExpectedType VisitSubstTemplateTypeParmType(
355 const SubstTemplateTypeParmType *T);
356 ExpectedType VisitTemplateSpecializationType(
357 const TemplateSpecializationType *T);
358 ExpectedType VisitElaboratedType(const ElaboratedType *T);
359 ExpectedType VisitDependentNameType(const DependentNameType *T);
360 ExpectedType VisitPackExpansionType(const PackExpansionType *T);
361 ExpectedType VisitDependentTemplateSpecializationType(
Gabor Horvathc78d99a2018-01-27 16:11:45 +0000362 const DependentTemplateSpecializationType *T);
Balazs Keri3b30d652018-10-19 13:32:20 +0000363 ExpectedType VisitObjCInterfaceType(const ObjCInterfaceType *T);
364 ExpectedType VisitObjCObjectType(const ObjCObjectType *T);
365 ExpectedType VisitObjCObjectPointerType(const ObjCObjectPointerType *T);
Rafael Stahldf556202018-05-29 08:12:15 +0000366
367 // Importing declarations
Balazs Keri3b30d652018-10-19 13:32:20 +0000368 Error ImportDeclParts(
369 NamedDecl *D, DeclContext *&DC, DeclContext *&LexicalDC,
370 DeclarationName &Name, NamedDecl *&ToD, SourceLocation &Loc);
371 Error ImportDefinitionIfNeeded(Decl *FromD, Decl *ToD = nullptr);
372 Error ImportDeclarationNameLoc(
373 const DeclarationNameInfo &From, DeclarationNameInfo &To);
374 Error ImportDeclContext(DeclContext *FromDC, bool ForceImport = false);
375 Error ImportDeclContext(
376 Decl *From, DeclContext *&ToDC, DeclContext *&ToLexicalDC);
377 Error ImportImplicitMethods(const CXXRecordDecl *From, CXXRecordDecl *To);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +0000378
Balazs Keri3b30d652018-10-19 13:32:20 +0000379 Expected<CXXCastPath> ImportCastPath(CastExpr *E);
Aleksei Sidorina693b372016-09-28 10:16:56 +0000380
Eugene Zelenko9a9c8232018-04-09 21:54:38 +0000381 using Designator = DesignatedInitExpr::Designator;
382
Adrian Prantl9fc8faf2018-05-09 01:00:01 +0000383 /// What we should import from the definition.
Fangrui Song6907ce22018-07-30 19:24:48 +0000384 enum ImportDefinitionKind {
Adrian Prantl9fc8faf2018-05-09 01:00:01 +0000385 /// Import the default subset of the definition, which might be
Douglas Gregor95d82832012-01-24 18:36:04 +0000386 /// nothing (if minimal import is set) or might be everything (if minimal
387 /// import is not set).
388 IDK_Default,
Adrian Prantl9fc8faf2018-05-09 01:00:01 +0000389 /// Import everything.
Douglas Gregor95d82832012-01-24 18:36:04 +0000390 IDK_Everything,
Adrian Prantl9fc8faf2018-05-09 01:00:01 +0000391 /// Import only the bare bones needed to establish a valid
Douglas Gregor95d82832012-01-24 18:36:04 +0000392 /// DeclContext.
393 IDK_Basic
394 };
395
Douglas Gregor2e15c842012-02-01 21:00:38 +0000396 bool shouldForceImportDeclContext(ImportDefinitionKind IDK) {
397 return IDK == IDK_Everything ||
398 (IDK == IDK_Default && !Importer.isMinimalImport());
399 }
400
Balazs Keri3b30d652018-10-19 13:32:20 +0000401 Error ImportInitializer(VarDecl *From, VarDecl *To);
402 Error ImportDefinition(
403 RecordDecl *From, RecordDecl *To,
404 ImportDefinitionKind Kind = IDK_Default);
405 Error ImportDefinition(
406 EnumDecl *From, EnumDecl *To,
407 ImportDefinitionKind Kind = IDK_Default);
408 Error ImportDefinition(
409 ObjCInterfaceDecl *From, ObjCInterfaceDecl *To,
410 ImportDefinitionKind Kind = IDK_Default);
411 Error ImportDefinition(
412 ObjCProtocolDecl *From, ObjCProtocolDecl *To,
413 ImportDefinitionKind Kind = IDK_Default);
414 Expected<TemplateParameterList *> ImportTemplateParameterList(
Aleksei Sidorin8fc85102018-01-26 11:36:54 +0000415 TemplateParameterList *Params);
Balazs Keri3b30d652018-10-19 13:32:20 +0000416 Error ImportTemplateArguments(
417 const TemplateArgument *FromArgs, unsigned NumFromArgs,
418 SmallVectorImpl<TemplateArgument> &ToArgs);
419 Expected<TemplateArgument>
420 ImportTemplateArgument(const TemplateArgument &From);
Aleksei Sidorin8fc85102018-01-26 11:36:54 +0000421
Aleksei Sidorin7f758b62017-12-27 17:04:42 +0000422 template <typename InContainerTy>
Balazs Keri3b30d652018-10-19 13:32:20 +0000423 Error ImportTemplateArgumentListInfo(
424 const InContainerTy &Container, TemplateArgumentListInfo &ToTAInfo);
Aleksei Sidorin8fc85102018-01-26 11:36:54 +0000425
426 template<typename InContainerTy>
Balazs Keri3b30d652018-10-19 13:32:20 +0000427 Error ImportTemplateArgumentListInfo(
428 SourceLocation FromLAngleLoc, SourceLocation FromRAngleLoc,
429 const InContainerTy &Container, TemplateArgumentListInfo &Result);
Aleksei Sidorin8fc85102018-01-26 11:36:54 +0000430
Gabor Marton5254e642018-06-27 13:32:50 +0000431 using TemplateArgsTy = SmallVector<TemplateArgument, 8>;
Balazs Keri3b30d652018-10-19 13:32:20 +0000432 using FunctionTemplateAndArgsTy =
433 std::tuple<FunctionTemplateDecl *, TemplateArgsTy>;
434 Expected<FunctionTemplateAndArgsTy>
Gabor Marton5254e642018-06-27 13:32:50 +0000435 ImportFunctionTemplateWithTemplateArgsFromSpecialization(
436 FunctionDecl *FromFD);
437
Balazs Keri3b30d652018-10-19 13:32:20 +0000438 Error ImportTemplateInformation(FunctionDecl *FromFD, FunctionDecl *ToFD);
Aleksei Sidorin8fc85102018-01-26 11:36:54 +0000439
Shafik Yaghmour96b3d202019-01-28 21:55:33 +0000440 Error ImportFunctionDeclBody(FunctionDecl *FromFD, FunctionDecl *ToFD);
441
Gabor Marton458d1452019-02-14 13:07:03 +0000442 template <typename T>
443 bool hasSameVisibilityContext(T *Found, T *From);
444
Gabor Marton950fb572018-07-17 12:39:27 +0000445 bool IsStructuralMatch(Decl *From, Decl *To, bool Complain);
Douglas Gregordd6006f2012-07-17 21:16:27 +0000446 bool IsStructuralMatch(RecordDecl *FromRecord, RecordDecl *ToRecord,
447 bool Complain = true);
Larisse Voufo39a1e502013-08-06 01:03:05 +0000448 bool IsStructuralMatch(VarDecl *FromVar, VarDecl *ToVar,
449 bool Complain = true);
Douglas Gregor3996e242010-02-15 22:01:00 +0000450 bool IsStructuralMatch(EnumDecl *FromEnum, EnumDecl *ToRecord);
Douglas Gregor91155082012-11-14 22:29:20 +0000451 bool IsStructuralMatch(EnumConstantDecl *FromEC, EnumConstantDecl *ToEC);
Aleksei Sidorin7f758b62017-12-27 17:04:42 +0000452 bool IsStructuralMatch(FunctionTemplateDecl *From,
453 FunctionTemplateDecl *To);
Balazs Keric7797c42018-07-11 09:37:24 +0000454 bool IsStructuralMatch(FunctionDecl *From, FunctionDecl *To);
Douglas Gregora082a492010-11-30 19:14:50 +0000455 bool IsStructuralMatch(ClassTemplateDecl *From, ClassTemplateDecl *To);
Larisse Voufo39a1e502013-08-06 01:03:05 +0000456 bool IsStructuralMatch(VarTemplateDecl *From, VarTemplateDecl *To);
Balazs Keri3b30d652018-10-19 13:32:20 +0000457 ExpectedDecl VisitDecl(Decl *D);
458 ExpectedDecl VisitImportDecl(ImportDecl *D);
459 ExpectedDecl VisitEmptyDecl(EmptyDecl *D);
460 ExpectedDecl VisitAccessSpecDecl(AccessSpecDecl *D);
461 ExpectedDecl VisitStaticAssertDecl(StaticAssertDecl *D);
462 ExpectedDecl VisitTranslationUnitDecl(TranslationUnitDecl *D);
463 ExpectedDecl VisitNamespaceDecl(NamespaceDecl *D);
464 ExpectedDecl VisitNamespaceAliasDecl(NamespaceAliasDecl *D);
465 ExpectedDecl VisitTypedefNameDecl(TypedefNameDecl *D, bool IsAlias);
466 ExpectedDecl VisitTypedefDecl(TypedefDecl *D);
467 ExpectedDecl VisitTypeAliasDecl(TypeAliasDecl *D);
468 ExpectedDecl VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D);
469 ExpectedDecl VisitLabelDecl(LabelDecl *D);
470 ExpectedDecl VisitEnumDecl(EnumDecl *D);
471 ExpectedDecl VisitRecordDecl(RecordDecl *D);
472 ExpectedDecl VisitEnumConstantDecl(EnumConstantDecl *D);
473 ExpectedDecl VisitFunctionDecl(FunctionDecl *D);
474 ExpectedDecl VisitCXXMethodDecl(CXXMethodDecl *D);
475 ExpectedDecl VisitCXXConstructorDecl(CXXConstructorDecl *D);
476 ExpectedDecl VisitCXXDestructorDecl(CXXDestructorDecl *D);
477 ExpectedDecl VisitCXXConversionDecl(CXXConversionDecl *D);
478 ExpectedDecl VisitFieldDecl(FieldDecl *D);
479 ExpectedDecl VisitIndirectFieldDecl(IndirectFieldDecl *D);
480 ExpectedDecl VisitFriendDecl(FriendDecl *D);
481 ExpectedDecl VisitObjCIvarDecl(ObjCIvarDecl *D);
482 ExpectedDecl VisitVarDecl(VarDecl *D);
483 ExpectedDecl VisitImplicitParamDecl(ImplicitParamDecl *D);
484 ExpectedDecl VisitParmVarDecl(ParmVarDecl *D);
485 ExpectedDecl VisitObjCMethodDecl(ObjCMethodDecl *D);
486 ExpectedDecl VisitObjCTypeParamDecl(ObjCTypeParamDecl *D);
487 ExpectedDecl VisitObjCCategoryDecl(ObjCCategoryDecl *D);
488 ExpectedDecl VisitObjCProtocolDecl(ObjCProtocolDecl *D);
489 ExpectedDecl VisitLinkageSpecDecl(LinkageSpecDecl *D);
490 ExpectedDecl VisitUsingDecl(UsingDecl *D);
491 ExpectedDecl VisitUsingShadowDecl(UsingShadowDecl *D);
492 ExpectedDecl VisitUsingDirectiveDecl(UsingDirectiveDecl *D);
493 ExpectedDecl VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D);
494 ExpectedDecl VisitUnresolvedUsingTypenameDecl(UnresolvedUsingTypenameDecl *D);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +0000495
Balazs Keri3b30d652018-10-19 13:32:20 +0000496 Expected<ObjCTypeParamList *>
497 ImportObjCTypeParamList(ObjCTypeParamList *list);
498
499 ExpectedDecl VisitObjCInterfaceDecl(ObjCInterfaceDecl *D);
500 ExpectedDecl VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D);
501 ExpectedDecl VisitObjCImplementationDecl(ObjCImplementationDecl *D);
502 ExpectedDecl VisitObjCPropertyDecl(ObjCPropertyDecl *D);
503 ExpectedDecl VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D);
504 ExpectedDecl VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D);
505 ExpectedDecl VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D);
506 ExpectedDecl VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D);
507 ExpectedDecl VisitClassTemplateDecl(ClassTemplateDecl *D);
508 ExpectedDecl VisitClassTemplateSpecializationDecl(
Douglas Gregore2e50d332010-12-01 01:36:18 +0000509 ClassTemplateSpecializationDecl *D);
Balazs Keri3b30d652018-10-19 13:32:20 +0000510 ExpectedDecl VisitVarTemplateDecl(VarTemplateDecl *D);
511 ExpectedDecl VisitVarTemplateSpecializationDecl(VarTemplateSpecializationDecl *D);
512 ExpectedDecl VisitFunctionTemplateDecl(FunctionTemplateDecl *D);
Larisse Voufo39a1e502013-08-06 01:03:05 +0000513
Douglas Gregor7eeb5972010-02-11 19:21:55 +0000514 // Importing statements
Balazs Keri3b30d652018-10-19 13:32:20 +0000515 ExpectedStmt VisitStmt(Stmt *S);
516 ExpectedStmt VisitGCCAsmStmt(GCCAsmStmt *S);
517 ExpectedStmt VisitDeclStmt(DeclStmt *S);
518 ExpectedStmt VisitNullStmt(NullStmt *S);
519 ExpectedStmt VisitCompoundStmt(CompoundStmt *S);
520 ExpectedStmt VisitCaseStmt(CaseStmt *S);
521 ExpectedStmt VisitDefaultStmt(DefaultStmt *S);
522 ExpectedStmt VisitLabelStmt(LabelStmt *S);
523 ExpectedStmt VisitAttributedStmt(AttributedStmt *S);
524 ExpectedStmt VisitIfStmt(IfStmt *S);
525 ExpectedStmt VisitSwitchStmt(SwitchStmt *S);
526 ExpectedStmt VisitWhileStmt(WhileStmt *S);
527 ExpectedStmt VisitDoStmt(DoStmt *S);
528 ExpectedStmt VisitForStmt(ForStmt *S);
529 ExpectedStmt VisitGotoStmt(GotoStmt *S);
530 ExpectedStmt VisitIndirectGotoStmt(IndirectGotoStmt *S);
531 ExpectedStmt VisitContinueStmt(ContinueStmt *S);
532 ExpectedStmt VisitBreakStmt(BreakStmt *S);
533 ExpectedStmt VisitReturnStmt(ReturnStmt *S);
Sean Callanan59721b32015-04-28 18:41:46 +0000534 // FIXME: MSAsmStmt
535 // FIXME: SEHExceptStmt
536 // FIXME: SEHFinallyStmt
537 // FIXME: SEHTryStmt
538 // FIXME: SEHLeaveStmt
539 // FIXME: CapturedStmt
Balazs Keri3b30d652018-10-19 13:32:20 +0000540 ExpectedStmt VisitCXXCatchStmt(CXXCatchStmt *S);
541 ExpectedStmt VisitCXXTryStmt(CXXTryStmt *S);
542 ExpectedStmt VisitCXXForRangeStmt(CXXForRangeStmt *S);
Sean Callanan59721b32015-04-28 18:41:46 +0000543 // FIXME: MSDependentExistsStmt
Balazs Keri3b30d652018-10-19 13:32:20 +0000544 ExpectedStmt VisitObjCForCollectionStmt(ObjCForCollectionStmt *S);
545 ExpectedStmt VisitObjCAtCatchStmt(ObjCAtCatchStmt *S);
546 ExpectedStmt VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S);
547 ExpectedStmt VisitObjCAtTryStmt(ObjCAtTryStmt *S);
548 ExpectedStmt VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *S);
549 ExpectedStmt VisitObjCAtThrowStmt(ObjCAtThrowStmt *S);
550 ExpectedStmt VisitObjCAutoreleasePoolStmt(ObjCAutoreleasePoolStmt *S);
Douglas Gregor7eeb5972010-02-11 19:21:55 +0000551
552 // Importing expressions
Balazs Keri3b30d652018-10-19 13:32:20 +0000553 ExpectedStmt VisitExpr(Expr *E);
554 ExpectedStmt VisitVAArgExpr(VAArgExpr *E);
Tom Roeder521f0042019-02-26 19:26:41 +0000555 ExpectedStmt VisitChooseExpr(ChooseExpr *E);
Balazs Keri3b30d652018-10-19 13:32:20 +0000556 ExpectedStmt VisitGNUNullExpr(GNUNullExpr *E);
557 ExpectedStmt VisitPredefinedExpr(PredefinedExpr *E);
558 ExpectedStmt VisitDeclRefExpr(DeclRefExpr *E);
559 ExpectedStmt VisitImplicitValueInitExpr(ImplicitValueInitExpr *E);
560 ExpectedStmt VisitDesignatedInitExpr(DesignatedInitExpr *E);
561 ExpectedStmt VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E);
562 ExpectedStmt VisitIntegerLiteral(IntegerLiteral *E);
563 ExpectedStmt VisitFloatingLiteral(FloatingLiteral *E);
564 ExpectedStmt VisitImaginaryLiteral(ImaginaryLiteral *E);
565 ExpectedStmt VisitCharacterLiteral(CharacterLiteral *E);
566 ExpectedStmt VisitStringLiteral(StringLiteral *E);
567 ExpectedStmt VisitCompoundLiteralExpr(CompoundLiteralExpr *E);
568 ExpectedStmt VisitAtomicExpr(AtomicExpr *E);
569 ExpectedStmt VisitAddrLabelExpr(AddrLabelExpr *E);
Bill Wendling8003edc2018-11-09 00:41:36 +0000570 ExpectedStmt VisitConstantExpr(ConstantExpr *E);
Balazs Keri3b30d652018-10-19 13:32:20 +0000571 ExpectedStmt VisitParenExpr(ParenExpr *E);
572 ExpectedStmt VisitParenListExpr(ParenListExpr *E);
573 ExpectedStmt VisitStmtExpr(StmtExpr *E);
574 ExpectedStmt VisitUnaryOperator(UnaryOperator *E);
575 ExpectedStmt VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *E);
576 ExpectedStmt VisitBinaryOperator(BinaryOperator *E);
577 ExpectedStmt VisitConditionalOperator(ConditionalOperator *E);
578 ExpectedStmt VisitBinaryConditionalOperator(BinaryConditionalOperator *E);
579 ExpectedStmt VisitOpaqueValueExpr(OpaqueValueExpr *E);
580 ExpectedStmt VisitArrayTypeTraitExpr(ArrayTypeTraitExpr *E);
581 ExpectedStmt VisitExpressionTraitExpr(ExpressionTraitExpr *E);
582 ExpectedStmt VisitArraySubscriptExpr(ArraySubscriptExpr *E);
583 ExpectedStmt VisitCompoundAssignOperator(CompoundAssignOperator *E);
584 ExpectedStmt VisitImplicitCastExpr(ImplicitCastExpr *E);
585 ExpectedStmt VisitExplicitCastExpr(ExplicitCastExpr *E);
586 ExpectedStmt VisitOffsetOfExpr(OffsetOfExpr *OE);
587 ExpectedStmt VisitCXXThrowExpr(CXXThrowExpr *E);
588 ExpectedStmt VisitCXXNoexceptExpr(CXXNoexceptExpr *E);
589 ExpectedStmt VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E);
590 ExpectedStmt VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E);
591 ExpectedStmt VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E);
592 ExpectedStmt VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E);
593 ExpectedStmt VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *E);
594 ExpectedStmt VisitPackExpansionExpr(PackExpansionExpr *E);
595 ExpectedStmt VisitSizeOfPackExpr(SizeOfPackExpr *E);
596 ExpectedStmt VisitCXXNewExpr(CXXNewExpr *E);
597 ExpectedStmt VisitCXXDeleteExpr(CXXDeleteExpr *E);
598 ExpectedStmt VisitCXXConstructExpr(CXXConstructExpr *E);
599 ExpectedStmt VisitCXXMemberCallExpr(CXXMemberCallExpr *E);
600 ExpectedStmt VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E);
601 ExpectedStmt VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E);
602 ExpectedStmt VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr *E);
603 ExpectedStmt VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E);
604 ExpectedStmt VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E);
605 ExpectedStmt VisitExprWithCleanups(ExprWithCleanups *E);
606 ExpectedStmt VisitCXXThisExpr(CXXThisExpr *E);
607 ExpectedStmt VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E);
608 ExpectedStmt VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E);
609 ExpectedStmt VisitMemberExpr(MemberExpr *E);
610 ExpectedStmt VisitCallExpr(CallExpr *E);
611 ExpectedStmt VisitLambdaExpr(LambdaExpr *LE);
612 ExpectedStmt VisitInitListExpr(InitListExpr *E);
613 ExpectedStmt VisitCXXStdInitializerListExpr(CXXStdInitializerListExpr *E);
614 ExpectedStmt VisitCXXInheritedCtorInitExpr(CXXInheritedCtorInitExpr *E);
615 ExpectedStmt VisitArrayInitLoopExpr(ArrayInitLoopExpr *E);
616 ExpectedStmt VisitArrayInitIndexExpr(ArrayInitIndexExpr *E);
617 ExpectedStmt VisitCXXDefaultInitExpr(CXXDefaultInitExpr *E);
618 ExpectedStmt VisitCXXNamedCastExpr(CXXNamedCastExpr *E);
619 ExpectedStmt VisitSubstNonTypeTemplateParmExpr(SubstNonTypeTemplateParmExpr *E);
620 ExpectedStmt VisitTypeTraitExpr(TypeTraitExpr *E);
621 ExpectedStmt VisitCXXTypeidExpr(CXXTypeidExpr *E);
Aleksei Sidorin855086d2017-01-23 09:30:36 +0000622
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +0000623 template<typename IIter, typename OIter>
Balazs Keri3b30d652018-10-19 13:32:20 +0000624 Error ImportArrayChecked(IIter Ibegin, IIter Iend, OIter Obegin) {
Eugene Zelenko9a9c8232018-04-09 21:54:38 +0000625 using ItemT = typename std::remove_reference<decltype(*Obegin)>::type;
Balazs Keri3b30d652018-10-19 13:32:20 +0000626 for (; Ibegin != Iend; ++Ibegin, ++Obegin) {
627 Expected<ItemT> ToOrErr = import(*Ibegin);
628 if (!ToOrErr)
629 return ToOrErr.takeError();
630 *Obegin = *ToOrErr;
631 }
632 return Error::success();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +0000633 }
634
Balazs Keri3b30d652018-10-19 13:32:20 +0000635 // Import every item from a container structure into an output container.
636 // If error occurs, stops at first error and returns the error.
637 // The output container should have space for all needed elements (it is not
638 // expanded, new items are put into from the beginning).
Aleksei Sidorina693b372016-09-28 10:16:56 +0000639 template<typename InContainerTy, typename OutContainerTy>
Balazs Keri3b30d652018-10-19 13:32:20 +0000640 Error ImportContainerChecked(
641 const InContainerTy &InContainer, OutContainerTy &OutContainer) {
642 return ImportArrayChecked(
643 InContainer.begin(), InContainer.end(), OutContainer.begin());
Aleksei Sidorina693b372016-09-28 10:16:56 +0000644 }
645
646 template<typename InContainerTy, typename OIter>
Balazs Keri3b30d652018-10-19 13:32:20 +0000647 Error ImportArrayChecked(const InContainerTy &InContainer, OIter Obegin) {
Aleksei Sidorina693b372016-09-28 10:16:56 +0000648 return ImportArrayChecked(InContainer.begin(), InContainer.end(), Obegin);
649 }
Lang Hames19e07e12017-06-20 21:06:00 +0000650
Lang Hames19e07e12017-06-20 21:06:00 +0000651 void ImportOverrides(CXXMethodDecl *ToMethod, CXXMethodDecl *FromMethod);
Gabor Marton5254e642018-06-27 13:32:50 +0000652
Balazs Keri3b30d652018-10-19 13:32:20 +0000653 Expected<FunctionDecl *> FindFunctionTemplateSpecialization(
654 FunctionDecl *FromFD);
Douglas Gregor96e578d2010-02-05 17:54:41 +0000655 };
Aleksei Sidorin782bfcf2018-02-14 11:39:33 +0000656
Balazs Keri3b30d652018-10-19 13:32:20 +0000657// FIXME: Temporary until every import returns Expected.
658template <>
659Expected<TemplateName> ASTNodeImporter::import(const TemplateName &From) {
660 TemplateName To = Importer.Import(From);
661 if (To.isNull() && !From.isNull())
662 return make_error<ImportError>();
663 return To;
664}
665
Aleksei Sidorin782bfcf2018-02-14 11:39:33 +0000666template <typename InContainerTy>
Balazs Keri3b30d652018-10-19 13:32:20 +0000667Error ASTNodeImporter::ImportTemplateArgumentListInfo(
Aleksei Sidorin782bfcf2018-02-14 11:39:33 +0000668 SourceLocation FromLAngleLoc, SourceLocation FromRAngleLoc,
669 const InContainerTy &Container, TemplateArgumentListInfo &Result) {
Balazs Keri3b30d652018-10-19 13:32:20 +0000670 auto ToLAngleLocOrErr = import(FromLAngleLoc);
671 if (!ToLAngleLocOrErr)
672 return ToLAngleLocOrErr.takeError();
673 auto ToRAngleLocOrErr = import(FromRAngleLoc);
674 if (!ToRAngleLocOrErr)
675 return ToRAngleLocOrErr.takeError();
676
677 TemplateArgumentListInfo ToTAInfo(*ToLAngleLocOrErr, *ToRAngleLocOrErr);
678 if (auto Err = ImportTemplateArgumentListInfo(Container, ToTAInfo))
679 return Err;
Aleksei Sidorin782bfcf2018-02-14 11:39:33 +0000680 Result = ToTAInfo;
Balazs Keri3b30d652018-10-19 13:32:20 +0000681 return Error::success();
Alexander Kornienkoab9db512015-06-22 23:07:51 +0000682}
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +0000683
Aleksei Sidorin782bfcf2018-02-14 11:39:33 +0000684template <>
Balazs Keri3b30d652018-10-19 13:32:20 +0000685Error ASTNodeImporter::ImportTemplateArgumentListInfo<TemplateArgumentListInfo>(
Aleksei Sidorin782bfcf2018-02-14 11:39:33 +0000686 const TemplateArgumentListInfo &From, TemplateArgumentListInfo &Result) {
687 return ImportTemplateArgumentListInfo(
688 From.getLAngleLoc(), From.getRAngleLoc(), From.arguments(), Result);
689}
690
691template <>
Balazs Keri3b30d652018-10-19 13:32:20 +0000692Error ASTNodeImporter::ImportTemplateArgumentListInfo<
693 ASTTemplateArgumentListInfo>(
694 const ASTTemplateArgumentListInfo &From,
695 TemplateArgumentListInfo &Result) {
696 return ImportTemplateArgumentListInfo(
697 From.LAngleLoc, From.RAngleLoc, From.arguments(), Result);
Aleksei Sidorin782bfcf2018-02-14 11:39:33 +0000698}
699
Balazs Keri3b30d652018-10-19 13:32:20 +0000700Expected<ASTNodeImporter::FunctionTemplateAndArgsTy>
Gabor Marton5254e642018-06-27 13:32:50 +0000701ASTNodeImporter::ImportFunctionTemplateWithTemplateArgsFromSpecialization(
702 FunctionDecl *FromFD) {
703 assert(FromFD->getTemplatedKind() ==
Balazs Keri3b30d652018-10-19 13:32:20 +0000704 FunctionDecl::TK_FunctionTemplateSpecialization);
705
706 FunctionTemplateAndArgsTy Result;
707
Gabor Marton5254e642018-06-27 13:32:50 +0000708 auto *FTSInfo = FromFD->getTemplateSpecializationInfo();
Balazs Keri3b30d652018-10-19 13:32:20 +0000709 if (Error Err = importInto(std::get<0>(Result), FTSInfo->getTemplate()))
710 return std::move(Err);
Gabor Marton5254e642018-06-27 13:32:50 +0000711
712 // Import template arguments.
713 auto TemplArgs = FTSInfo->TemplateArguments->asArray();
Balazs Keri3b30d652018-10-19 13:32:20 +0000714 if (Error Err = ImportTemplateArguments(TemplArgs.data(), TemplArgs.size(),
715 std::get<1>(Result)))
716 return std::move(Err);
Gabor Marton5254e642018-06-27 13:32:50 +0000717
Balazs Keri3b30d652018-10-19 13:32:20 +0000718 return Result;
719}
720
721template <>
722Expected<TemplateParameterList *>
723ASTNodeImporter::import(TemplateParameterList *From) {
724 SmallVector<NamedDecl *, 4> To(From->size());
725 if (Error Err = ImportContainerChecked(*From, To))
726 return std::move(Err);
727
728 ExpectedExpr ToRequiresClause = import(From->getRequiresClause());
729 if (!ToRequiresClause)
730 return ToRequiresClause.takeError();
731
732 auto ToTemplateLocOrErr = import(From->getTemplateLoc());
733 if (!ToTemplateLocOrErr)
734 return ToTemplateLocOrErr.takeError();
735 auto ToLAngleLocOrErr = import(From->getLAngleLoc());
736 if (!ToLAngleLocOrErr)
737 return ToLAngleLocOrErr.takeError();
738 auto ToRAngleLocOrErr = import(From->getRAngleLoc());
739 if (!ToRAngleLocOrErr)
740 return ToRAngleLocOrErr.takeError();
741
742 return TemplateParameterList::Create(
743 Importer.getToContext(),
744 *ToTemplateLocOrErr,
745 *ToLAngleLocOrErr,
746 To,
747 *ToRAngleLocOrErr,
748 *ToRequiresClause);
749}
750
751template <>
752Expected<TemplateArgument>
753ASTNodeImporter::import(const TemplateArgument &From) {
754 switch (From.getKind()) {
755 case TemplateArgument::Null:
756 return TemplateArgument();
757
758 case TemplateArgument::Type: {
759 ExpectedType ToTypeOrErr = import(From.getAsType());
760 if (!ToTypeOrErr)
761 return ToTypeOrErr.takeError();
762 return TemplateArgument(*ToTypeOrErr);
763 }
764
765 case TemplateArgument::Integral: {
766 ExpectedType ToTypeOrErr = import(From.getIntegralType());
767 if (!ToTypeOrErr)
768 return ToTypeOrErr.takeError();
769 return TemplateArgument(From, *ToTypeOrErr);
770 }
771
772 case TemplateArgument::Declaration: {
773 Expected<ValueDecl *> ToOrErr = import(From.getAsDecl());
774 if (!ToOrErr)
775 return ToOrErr.takeError();
776 ExpectedType ToTypeOrErr = import(From.getParamTypeForDecl());
777 if (!ToTypeOrErr)
778 return ToTypeOrErr.takeError();
779 return TemplateArgument(*ToOrErr, *ToTypeOrErr);
780 }
781
782 case TemplateArgument::NullPtr: {
783 ExpectedType ToTypeOrErr = import(From.getNullPtrType());
784 if (!ToTypeOrErr)
785 return ToTypeOrErr.takeError();
786 return TemplateArgument(*ToTypeOrErr, /*isNullPtr*/true);
787 }
788
789 case TemplateArgument::Template: {
790 Expected<TemplateName> ToTemplateOrErr = import(From.getAsTemplate());
791 if (!ToTemplateOrErr)
792 return ToTemplateOrErr.takeError();
793
794 return TemplateArgument(*ToTemplateOrErr);
795 }
796
797 case TemplateArgument::TemplateExpansion: {
798 Expected<TemplateName> ToTemplateOrErr =
799 import(From.getAsTemplateOrTemplatePattern());
800 if (!ToTemplateOrErr)
801 return ToTemplateOrErr.takeError();
802
803 return TemplateArgument(
804 *ToTemplateOrErr, From.getNumTemplateExpansions());
805 }
806
807 case TemplateArgument::Expression:
808 if (ExpectedExpr ToExpr = import(From.getAsExpr()))
809 return TemplateArgument(*ToExpr);
810 else
811 return ToExpr.takeError();
812
813 case TemplateArgument::Pack: {
814 SmallVector<TemplateArgument, 2> ToPack;
815 ToPack.reserve(From.pack_size());
816 if (Error Err = ImportTemplateArguments(
817 From.pack_begin(), From.pack_size(), ToPack))
818 return std::move(Err);
819
820 return TemplateArgument(
821 llvm::makeArrayRef(ToPack).copy(Importer.getToContext()));
822 }
823 }
824
825 llvm_unreachable("Invalid template argument kind");
826}
827
828template <>
829Expected<TemplateArgumentLoc>
830ASTNodeImporter::import(const TemplateArgumentLoc &TALoc) {
831 Expected<TemplateArgument> ArgOrErr = import(TALoc.getArgument());
832 if (!ArgOrErr)
833 return ArgOrErr.takeError();
834 TemplateArgument Arg = *ArgOrErr;
835
836 TemplateArgumentLocInfo FromInfo = TALoc.getLocInfo();
837
838 TemplateArgumentLocInfo ToInfo;
839 if (Arg.getKind() == TemplateArgument::Expression) {
840 ExpectedExpr E = import(FromInfo.getAsExpr());
841 if (!E)
842 return E.takeError();
843 ToInfo = TemplateArgumentLocInfo(*E);
844 } else if (Arg.getKind() == TemplateArgument::Type) {
845 if (auto TSIOrErr = import(FromInfo.getAsTypeSourceInfo()))
846 ToInfo = TemplateArgumentLocInfo(*TSIOrErr);
847 else
848 return TSIOrErr.takeError();
849 } else {
850 auto ToTemplateQualifierLocOrErr =
851 import(FromInfo.getTemplateQualifierLoc());
852 if (!ToTemplateQualifierLocOrErr)
853 return ToTemplateQualifierLocOrErr.takeError();
854 auto ToTemplateNameLocOrErr = import(FromInfo.getTemplateNameLoc());
855 if (!ToTemplateNameLocOrErr)
856 return ToTemplateNameLocOrErr.takeError();
857 auto ToTemplateEllipsisLocOrErr =
858 import(FromInfo.getTemplateEllipsisLoc());
859 if (!ToTemplateEllipsisLocOrErr)
860 return ToTemplateEllipsisLocOrErr.takeError();
861
862 ToInfo = TemplateArgumentLocInfo(
863 *ToTemplateQualifierLocOrErr,
864 *ToTemplateNameLocOrErr,
865 *ToTemplateEllipsisLocOrErr);
866 }
867
868 return TemplateArgumentLoc(Arg, ToInfo);
869}
870
871template <>
872Expected<DeclGroupRef> ASTNodeImporter::import(const DeclGroupRef &DG) {
873 if (DG.isNull())
874 return DeclGroupRef::Create(Importer.getToContext(), nullptr, 0);
875 size_t NumDecls = DG.end() - DG.begin();
876 SmallVector<Decl *, 1> ToDecls;
877 ToDecls.reserve(NumDecls);
878 for (Decl *FromD : DG) {
879 if (auto ToDOrErr = import(FromD))
880 ToDecls.push_back(*ToDOrErr);
881 else
882 return ToDOrErr.takeError();
883 }
884 return DeclGroupRef::Create(Importer.getToContext(),
885 ToDecls.begin(),
886 NumDecls);
887}
888
889template <>
890Expected<ASTNodeImporter::Designator>
891ASTNodeImporter::import(const Designator &D) {
892 if (D.isFieldDesignator()) {
893 IdentifierInfo *ToFieldName = Importer.Import(D.getFieldName());
894
895 ExpectedSLoc ToDotLocOrErr = import(D.getDotLoc());
896 if (!ToDotLocOrErr)
897 return ToDotLocOrErr.takeError();
898
899 ExpectedSLoc ToFieldLocOrErr = import(D.getFieldLoc());
900 if (!ToFieldLocOrErr)
901 return ToFieldLocOrErr.takeError();
902
903 return Designator(ToFieldName, *ToDotLocOrErr, *ToFieldLocOrErr);
904 }
905
906 ExpectedSLoc ToLBracketLocOrErr = import(D.getLBracketLoc());
907 if (!ToLBracketLocOrErr)
908 return ToLBracketLocOrErr.takeError();
909
910 ExpectedSLoc ToRBracketLocOrErr = import(D.getRBracketLoc());
911 if (!ToRBracketLocOrErr)
912 return ToRBracketLocOrErr.takeError();
913
914 if (D.isArrayDesignator())
915 return Designator(D.getFirstExprIndex(),
916 *ToLBracketLocOrErr, *ToRBracketLocOrErr);
917
918 ExpectedSLoc ToEllipsisLocOrErr = import(D.getEllipsisLoc());
919 if (!ToEllipsisLocOrErr)
920 return ToEllipsisLocOrErr.takeError();
921
922 assert(D.isArrayRangeDesignator());
923 return Designator(
924 D.getFirstExprIndex(), *ToLBracketLocOrErr, *ToEllipsisLocOrErr,
925 *ToRBracketLocOrErr);
926}
927
928template <>
929Expected<LambdaCapture> ASTNodeImporter::import(const LambdaCapture &From) {
930 VarDecl *Var = nullptr;
931 if (From.capturesVariable()) {
932 if (auto VarOrErr = import(From.getCapturedVar()))
933 Var = *VarOrErr;
934 else
935 return VarOrErr.takeError();
936 }
937
938 auto LocationOrErr = import(From.getLocation());
939 if (!LocationOrErr)
940 return LocationOrErr.takeError();
941
942 SourceLocation EllipsisLoc;
943 if (From.isPackExpansion())
944 if (Error Err = importInto(EllipsisLoc, From.getEllipsisLoc()))
945 return std::move(Err);
946
947 return LambdaCapture(
948 *LocationOrErr, From.isImplicit(), From.getCaptureKind(), Var,
949 EllipsisLoc);
Gabor Marton5254e642018-06-27 13:32:50 +0000950}
951
Eugene Zelenko9a9c8232018-04-09 21:54:38 +0000952} // namespace clang
Aleksei Sidorin782bfcf2018-02-14 11:39:33 +0000953
Douglas Gregor3996e242010-02-15 22:01:00 +0000954//----------------------------------------------------------------------------
Douglas Gregor96e578d2010-02-05 17:54:41 +0000955// Import Types
956//----------------------------------------------------------------------------
957
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +0000958using namespace clang;
959
Balazs Keri3b30d652018-10-19 13:32:20 +0000960ExpectedType ASTNodeImporter::VisitType(const Type *T) {
Douglas Gregore4c83e42010-02-09 22:48:33 +0000961 Importer.FromDiag(SourceLocation(), diag::err_unsupported_ast_node)
962 << T->getTypeClassName();
Balazs Keri3b30d652018-10-19 13:32:20 +0000963 return make_error<ImportError>(ImportError::UnsupportedConstruct);
Douglas Gregore4c83e42010-02-09 22:48:33 +0000964}
965
Balazs Keri3b30d652018-10-19 13:32:20 +0000966ExpectedType ASTNodeImporter::VisitAtomicType(const AtomicType *T){
967 ExpectedType UnderlyingTypeOrErr = import(T->getValueType());
968 if (!UnderlyingTypeOrErr)
969 return UnderlyingTypeOrErr.takeError();
Gabor Horvath0866c2f2016-11-23 15:24:23 +0000970
Balazs Keri3b30d652018-10-19 13:32:20 +0000971 return Importer.getToContext().getAtomicType(*UnderlyingTypeOrErr);
Gabor Horvath0866c2f2016-11-23 15:24:23 +0000972}
973
Balazs Keri3b30d652018-10-19 13:32:20 +0000974ExpectedType ASTNodeImporter::VisitBuiltinType(const BuiltinType *T) {
Douglas Gregor96e578d2010-02-05 17:54:41 +0000975 switch (T->getKind()) {
Alexey Bader954ba212016-04-08 13:40:33 +0000976#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
977 case BuiltinType::Id: \
978 return Importer.getToContext().SingletonId;
Alexey Baderb62f1442016-04-13 08:33:41 +0000979#include "clang/Basic/OpenCLImageTypes.def"
Andrew Savonichev3fee3512018-11-08 11:25:41 +0000980#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
981 case BuiltinType::Id: \
982 return Importer.getToContext().Id##Ty;
983#include "clang/Basic/OpenCLExtensionTypes.def"
John McCalle314e272011-10-18 21:02:43 +0000984#define SHARED_SINGLETON_TYPE(Expansion)
985#define BUILTIN_TYPE(Id, SingletonId) \
986 case BuiltinType::Id: return Importer.getToContext().SingletonId;
987#include "clang/AST/BuiltinTypes.def"
988
989 // FIXME: for Char16, Char32, and NullPtr, make sure that the "to"
990 // context supports C++.
991
992 // FIXME: for ObjCId, ObjCClass, and ObjCSel, make sure that the "to"
993 // context supports ObjC.
994
Douglas Gregor96e578d2010-02-05 17:54:41 +0000995 case BuiltinType::Char_U:
Fangrui Song6907ce22018-07-30 19:24:48 +0000996 // The context we're importing from has an unsigned 'char'. If we're
997 // importing into a context with a signed 'char', translate to
Douglas Gregor96e578d2010-02-05 17:54:41 +0000998 // 'unsigned char' instead.
David Blaikiebbafb8a2012-03-11 07:00:24 +0000999 if (Importer.getToContext().getLangOpts().CharIsSigned)
Douglas Gregor96e578d2010-02-05 17:54:41 +00001000 return Importer.getToContext().UnsignedCharTy;
Fangrui Song6907ce22018-07-30 19:24:48 +00001001
Douglas Gregor96e578d2010-02-05 17:54:41 +00001002 return Importer.getToContext().CharTy;
1003
Douglas Gregor96e578d2010-02-05 17:54:41 +00001004 case BuiltinType::Char_S:
Fangrui Song6907ce22018-07-30 19:24:48 +00001005 // The context we're importing from has an unsigned 'char'. If we're
1006 // importing into a context with a signed 'char', translate to
Douglas Gregor96e578d2010-02-05 17:54:41 +00001007 // 'unsigned char' instead.
David Blaikiebbafb8a2012-03-11 07:00:24 +00001008 if (!Importer.getToContext().getLangOpts().CharIsSigned)
Douglas Gregor96e578d2010-02-05 17:54:41 +00001009 return Importer.getToContext().SignedCharTy;
Fangrui Song6907ce22018-07-30 19:24:48 +00001010
Douglas Gregor96e578d2010-02-05 17:54:41 +00001011 return Importer.getToContext().CharTy;
1012
Chris Lattnerad3467e2010-12-25 23:25:43 +00001013 case BuiltinType::WChar_S:
1014 case BuiltinType::WChar_U:
Douglas Gregor96e578d2010-02-05 17:54:41 +00001015 // FIXME: If not in C++, shall we translate to the C equivalent of
1016 // wchar_t?
1017 return Importer.getToContext().WCharTy;
Douglas Gregor96e578d2010-02-05 17:54:41 +00001018 }
David Blaikiee4d798f2012-01-20 21:50:17 +00001019
1020 llvm_unreachable("Invalid BuiltinType Kind!");
Douglas Gregor96e578d2010-02-05 17:54:41 +00001021}
1022
Balazs Keri3b30d652018-10-19 13:32:20 +00001023ExpectedType ASTNodeImporter::VisitDecayedType(const DecayedType *T) {
1024 ExpectedType ToOriginalTypeOrErr = import(T->getOriginalType());
1025 if (!ToOriginalTypeOrErr)
1026 return ToOriginalTypeOrErr.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00001027
Balazs Keri3b30d652018-10-19 13:32:20 +00001028 return Importer.getToContext().getDecayedType(*ToOriginalTypeOrErr);
Aleksei Sidorina693b372016-09-28 10:16:56 +00001029}
1030
Balazs Keri3b30d652018-10-19 13:32:20 +00001031ExpectedType ASTNodeImporter::VisitComplexType(const ComplexType *T) {
1032 ExpectedType ToElementTypeOrErr = import(T->getElementType());
1033 if (!ToElementTypeOrErr)
1034 return ToElementTypeOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001035
Balazs Keri3b30d652018-10-19 13:32:20 +00001036 return Importer.getToContext().getComplexType(*ToElementTypeOrErr);
Douglas Gregor96e578d2010-02-05 17:54:41 +00001037}
1038
Balazs Keri3b30d652018-10-19 13:32:20 +00001039ExpectedType ASTNodeImporter::VisitPointerType(const PointerType *T) {
1040 ExpectedType ToPointeeTypeOrErr = import(T->getPointeeType());
1041 if (!ToPointeeTypeOrErr)
1042 return ToPointeeTypeOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001043
Balazs Keri3b30d652018-10-19 13:32:20 +00001044 return Importer.getToContext().getPointerType(*ToPointeeTypeOrErr);
Douglas Gregor96e578d2010-02-05 17:54:41 +00001045}
1046
Balazs Keri3b30d652018-10-19 13:32:20 +00001047ExpectedType ASTNodeImporter::VisitBlockPointerType(const BlockPointerType *T) {
Douglas Gregor96e578d2010-02-05 17:54:41 +00001048 // FIXME: Check for blocks support in "to" context.
Balazs Keri3b30d652018-10-19 13:32:20 +00001049 ExpectedType ToPointeeTypeOrErr = import(T->getPointeeType());
1050 if (!ToPointeeTypeOrErr)
1051 return ToPointeeTypeOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001052
Balazs Keri3b30d652018-10-19 13:32:20 +00001053 return Importer.getToContext().getBlockPointerType(*ToPointeeTypeOrErr);
Douglas Gregor96e578d2010-02-05 17:54:41 +00001054}
1055
Balazs Keri3b30d652018-10-19 13:32:20 +00001056ExpectedType
John McCall424cec92011-01-19 06:33:43 +00001057ASTNodeImporter::VisitLValueReferenceType(const LValueReferenceType *T) {
Douglas Gregor96e578d2010-02-05 17:54:41 +00001058 // FIXME: Check for C++ support in "to" context.
Balazs Keri3b30d652018-10-19 13:32:20 +00001059 ExpectedType ToPointeeTypeOrErr = import(T->getPointeeTypeAsWritten());
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().getLValueReferenceType(*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::VisitRValueReferenceType(const RValueReferenceType *T) {
Douglas Gregor96e578d2010-02-05 17:54:41 +00001068 // FIXME: Check for C++0x 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().getRValueReferenceType(*ToPointeeTypeOrErr);
Douglas Gregor96e578d2010-02-05 17:54:41 +00001074}
1075
Balazs Keri3b30d652018-10-19 13:32:20 +00001076ExpectedType
1077ASTNodeImporter::VisitMemberPointerType(const MemberPointerType *T) {
Douglas Gregor96e578d2010-02-05 17:54:41 +00001078 // FIXME: Check for C++ support in "to" context.
Balazs Keri3b30d652018-10-19 13:32:20 +00001079 ExpectedType ToPointeeTypeOrErr = import(T->getPointeeType());
1080 if (!ToPointeeTypeOrErr)
1081 return ToPointeeTypeOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001082
Balazs Keri3b30d652018-10-19 13:32:20 +00001083 ExpectedType ClassTypeOrErr = import(QualType(T->getClass(), 0));
1084 if (!ClassTypeOrErr)
1085 return ClassTypeOrErr.takeError();
1086
1087 return Importer.getToContext().getMemberPointerType(
1088 *ToPointeeTypeOrErr, (*ClassTypeOrErr).getTypePtr());
Douglas Gregor96e578d2010-02-05 17:54:41 +00001089}
1090
Balazs Keri3b30d652018-10-19 13:32:20 +00001091ExpectedType
1092ASTNodeImporter::VisitConstantArrayType(const ConstantArrayType *T) {
1093 ExpectedType ToElementTypeOrErr = import(T->getElementType());
1094 if (!ToElementTypeOrErr)
1095 return ToElementTypeOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001096
Balazs Keri3b30d652018-10-19 13:32:20 +00001097 return Importer.getToContext().getConstantArrayType(*ToElementTypeOrErr,
Douglas Gregor96e578d2010-02-05 17:54:41 +00001098 T->getSize(),
1099 T->getSizeModifier(),
1100 T->getIndexTypeCVRQualifiers());
1101}
1102
Balazs Keri3b30d652018-10-19 13:32:20 +00001103ExpectedType
John McCall424cec92011-01-19 06:33:43 +00001104ASTNodeImporter::VisitIncompleteArrayType(const IncompleteArrayType *T) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001105 ExpectedType ToElementTypeOrErr = import(T->getElementType());
1106 if (!ToElementTypeOrErr)
1107 return ToElementTypeOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001108
Balazs Keri3b30d652018-10-19 13:32:20 +00001109 return Importer.getToContext().getIncompleteArrayType(*ToElementTypeOrErr,
Douglas Gregor96e578d2010-02-05 17:54:41 +00001110 T->getSizeModifier(),
1111 T->getIndexTypeCVRQualifiers());
1112}
1113
Balazs Keri3b30d652018-10-19 13:32:20 +00001114ExpectedType
1115ASTNodeImporter::VisitVariableArrayType(const VariableArrayType *T) {
1116 QualType ToElementType;
1117 Expr *ToSizeExpr;
1118 SourceRange ToBracketsRange;
1119 if (auto Imp = importSeq(
1120 T->getElementType(), T->getSizeExpr(), T->getBracketsRange()))
1121 std::tie(ToElementType, ToSizeExpr, ToBracketsRange) = *Imp;
1122 else
1123 return Imp.takeError();
Douglas Gregor96e578d2010-02-05 17:54:41 +00001124
Balazs Keri3b30d652018-10-19 13:32:20 +00001125 return Importer.getToContext().getVariableArrayType(
1126 ToElementType, ToSizeExpr, T->getSizeModifier(),
1127 T->getIndexTypeCVRQualifiers(), ToBracketsRange);
Douglas Gregor96e578d2010-02-05 17:54:41 +00001128}
1129
Balazs Keri3b30d652018-10-19 13:32:20 +00001130ExpectedType ASTNodeImporter::VisitDependentSizedArrayType(
Gabor Horvathc78d99a2018-01-27 16:11:45 +00001131 const DependentSizedArrayType *T) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001132 QualType ToElementType;
1133 Expr *ToSizeExpr;
1134 SourceRange ToBracketsRange;
1135 if (auto Imp = importSeq(
1136 T->getElementType(), T->getSizeExpr(), T->getBracketsRange()))
1137 std::tie(ToElementType, ToSizeExpr, ToBracketsRange) = *Imp;
1138 else
1139 return Imp.takeError();
Gabor Horvathc78d99a2018-01-27 16:11:45 +00001140 // SizeExpr may be null if size is not specified directly.
1141 // For example, 'int a[]'.
Gabor Horvathc78d99a2018-01-27 16:11:45 +00001142
Gabor Horvathc78d99a2018-01-27 16:11:45 +00001143 return Importer.getToContext().getDependentSizedArrayType(
Balazs Keri3b30d652018-10-19 13:32:20 +00001144 ToElementType, ToSizeExpr, T->getSizeModifier(),
1145 T->getIndexTypeCVRQualifiers(), ToBracketsRange);
Gabor Horvathc78d99a2018-01-27 16:11:45 +00001146}
1147
Balazs Keri3b30d652018-10-19 13:32:20 +00001148ExpectedType ASTNodeImporter::VisitVectorType(const VectorType *T) {
1149 ExpectedType ToElementTypeOrErr = import(T->getElementType());
1150 if (!ToElementTypeOrErr)
1151 return ToElementTypeOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001152
Balazs Keri3b30d652018-10-19 13:32:20 +00001153 return Importer.getToContext().getVectorType(*ToElementTypeOrErr,
Douglas Gregor96e578d2010-02-05 17:54:41 +00001154 T->getNumElements(),
Bob Wilsonaeb56442010-11-10 21:56:12 +00001155 T->getVectorKind());
Douglas Gregor96e578d2010-02-05 17:54:41 +00001156}
1157
Balazs Keri3b30d652018-10-19 13:32:20 +00001158ExpectedType ASTNodeImporter::VisitExtVectorType(const ExtVectorType *T) {
1159 ExpectedType ToElementTypeOrErr = import(T->getElementType());
1160 if (!ToElementTypeOrErr)
1161 return ToElementTypeOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001162
Balazs Keri3b30d652018-10-19 13:32:20 +00001163 return Importer.getToContext().getExtVectorType(*ToElementTypeOrErr,
Douglas Gregor96e578d2010-02-05 17:54:41 +00001164 T->getNumElements());
1165}
1166
Balazs Keri3b30d652018-10-19 13:32:20 +00001167ExpectedType
John McCall424cec92011-01-19 06:33:43 +00001168ASTNodeImporter::VisitFunctionNoProtoType(const FunctionNoProtoType *T) {
Fangrui Song6907ce22018-07-30 19:24:48 +00001169 // FIXME: What happens if we're importing a function without a prototype
Douglas Gregor96e578d2010-02-05 17:54:41 +00001170 // into C++? Should we make it variadic?
Balazs Keri3b30d652018-10-19 13:32:20 +00001171 ExpectedType ToReturnTypeOrErr = import(T->getReturnType());
1172 if (!ToReturnTypeOrErr)
1173 return ToReturnTypeOrErr.takeError();
Rafael Espindolac50c27c2010-03-30 20:24:48 +00001174
Balazs Keri3b30d652018-10-19 13:32:20 +00001175 return Importer.getToContext().getFunctionNoProtoType(*ToReturnTypeOrErr,
Rafael Espindolac50c27c2010-03-30 20:24:48 +00001176 T->getExtInfo());
Douglas Gregor96e578d2010-02-05 17:54:41 +00001177}
1178
Balazs Keri3b30d652018-10-19 13:32:20 +00001179ExpectedType
1180ASTNodeImporter::VisitFunctionProtoType(const FunctionProtoType *T) {
1181 ExpectedType ToReturnTypeOrErr = import(T->getReturnType());
1182 if (!ToReturnTypeOrErr)
1183 return ToReturnTypeOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001184
Douglas Gregor96e578d2010-02-05 17:54:41 +00001185 // Import argument types
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001186 SmallVector<QualType, 4> ArgTypes;
Aaron Ballman40bd0aa2014-03-17 15:23:01 +00001187 for (const auto &A : T->param_types()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001188 ExpectedType TyOrErr = import(A);
1189 if (!TyOrErr)
1190 return TyOrErr.takeError();
1191 ArgTypes.push_back(*TyOrErr);
Douglas Gregor96e578d2010-02-05 17:54:41 +00001192 }
Fangrui Song6907ce22018-07-30 19:24:48 +00001193
Douglas Gregor96e578d2010-02-05 17:54:41 +00001194 // Import exception types
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001195 SmallVector<QualType, 4> ExceptionTypes;
Aaron Ballmanb088fbe2014-03-17 15:38:09 +00001196 for (const auto &E : T->exceptions()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001197 ExpectedType TyOrErr = import(E);
1198 if (!TyOrErr)
1199 return TyOrErr.takeError();
1200 ExceptionTypes.push_back(*TyOrErr);
Douglas Gregor96e578d2010-02-05 17:54:41 +00001201 }
John McCalldb40c7f2010-12-14 08:05:40 +00001202
Argyrios Kyrtzidisb41791d2012-09-22 01:58:06 +00001203 FunctionProtoType::ExtProtoInfo FromEPI = T->getExtProtoInfo();
1204 FunctionProtoType::ExtProtoInfo ToEPI;
1205
Balazs Keri3b30d652018-10-19 13:32:20 +00001206 auto Imp = importSeq(
1207 FromEPI.ExceptionSpec.NoexceptExpr,
1208 FromEPI.ExceptionSpec.SourceDecl,
1209 FromEPI.ExceptionSpec.SourceTemplate);
1210 if (!Imp)
1211 return Imp.takeError();
1212
Argyrios Kyrtzidisb41791d2012-09-22 01:58:06 +00001213 ToEPI.ExtInfo = FromEPI.ExtInfo;
1214 ToEPI.Variadic = FromEPI.Variadic;
1215 ToEPI.HasTrailingReturn = FromEPI.HasTrailingReturn;
1216 ToEPI.TypeQuals = FromEPI.TypeQuals;
1217 ToEPI.RefQualifier = FromEPI.RefQualifier;
Richard Smith8acb4282014-07-31 21:57:55 +00001218 ToEPI.ExceptionSpec.Type = FromEPI.ExceptionSpec.Type;
1219 ToEPI.ExceptionSpec.Exceptions = ExceptionTypes;
Balazs Keri3b30d652018-10-19 13:32:20 +00001220 std::tie(
1221 ToEPI.ExceptionSpec.NoexceptExpr,
1222 ToEPI.ExceptionSpec.SourceDecl,
1223 ToEPI.ExceptionSpec.SourceTemplate) = *Imp;
Argyrios Kyrtzidisb41791d2012-09-22 01:58:06 +00001224
Balazs Keri3b30d652018-10-19 13:32:20 +00001225 return Importer.getToContext().getFunctionType(
1226 *ToReturnTypeOrErr, ArgTypes, ToEPI);
Argyrios Kyrtzidisb41791d2012-09-22 01:58:06 +00001227}
1228
Balazs Keri3b30d652018-10-19 13:32:20 +00001229ExpectedType ASTNodeImporter::VisitUnresolvedUsingType(
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00001230 const UnresolvedUsingType *T) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001231 UnresolvedUsingTypenameDecl *ToD;
1232 Decl *ToPrevD;
1233 if (auto Imp = importSeq(T->getDecl(), T->getDecl()->getPreviousDecl()))
1234 std::tie(ToD, ToPrevD) = *Imp;
1235 else
1236 return Imp.takeError();
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00001237
Balazs Keri3b30d652018-10-19 13:32:20 +00001238 return Importer.getToContext().getTypeDeclType(
1239 ToD, cast_or_null<TypeDecl>(ToPrevD));
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00001240}
1241
Balazs Keri3b30d652018-10-19 13:32:20 +00001242ExpectedType ASTNodeImporter::VisitParenType(const ParenType *T) {
1243 ExpectedType ToInnerTypeOrErr = import(T->getInnerType());
1244 if (!ToInnerTypeOrErr)
1245 return ToInnerTypeOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001246
Balazs Keri3b30d652018-10-19 13:32:20 +00001247 return Importer.getToContext().getParenType(*ToInnerTypeOrErr);
Sean Callananda6df8a2011-08-11 16:56:07 +00001248}
1249
Balazs Keri3b30d652018-10-19 13:32:20 +00001250ExpectedType ASTNodeImporter::VisitTypedefType(const TypedefType *T) {
1251 Expected<TypedefNameDecl *> ToDeclOrErr = import(T->getDecl());
1252 if (!ToDeclOrErr)
1253 return ToDeclOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001254
Balazs Keri3b30d652018-10-19 13:32:20 +00001255 return Importer.getToContext().getTypeDeclType(*ToDeclOrErr);
Douglas Gregor96e578d2010-02-05 17:54:41 +00001256}
1257
Balazs Keri3b30d652018-10-19 13:32:20 +00001258ExpectedType ASTNodeImporter::VisitTypeOfExprType(const TypeOfExprType *T) {
1259 ExpectedExpr ToExprOrErr = import(T->getUnderlyingExpr());
1260 if (!ToExprOrErr)
1261 return ToExprOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001262
Balazs Keri3b30d652018-10-19 13:32:20 +00001263 return Importer.getToContext().getTypeOfExprType(*ToExprOrErr);
Douglas Gregor96e578d2010-02-05 17:54:41 +00001264}
1265
Balazs Keri3b30d652018-10-19 13:32:20 +00001266ExpectedType ASTNodeImporter::VisitTypeOfType(const TypeOfType *T) {
1267 ExpectedType ToUnderlyingTypeOrErr = import(T->getUnderlyingType());
1268 if (!ToUnderlyingTypeOrErr)
1269 return ToUnderlyingTypeOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001270
Balazs Keri3b30d652018-10-19 13:32:20 +00001271 return Importer.getToContext().getTypeOfType(*ToUnderlyingTypeOrErr);
Douglas Gregor96e578d2010-02-05 17:54:41 +00001272}
1273
Balazs Keri3b30d652018-10-19 13:32:20 +00001274ExpectedType ASTNodeImporter::VisitDecltypeType(const DecltypeType *T) {
Richard Smith30482bc2011-02-20 03:19:35 +00001275 // FIXME: Make sure that the "to" context supports C++0x!
Balazs Keri3b30d652018-10-19 13:32:20 +00001276 ExpectedExpr ToExprOrErr = import(T->getUnderlyingExpr());
1277 if (!ToExprOrErr)
1278 return ToExprOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001279
Balazs Keri3b30d652018-10-19 13:32:20 +00001280 ExpectedType ToUnderlyingTypeOrErr = import(T->getUnderlyingType());
1281 if (!ToUnderlyingTypeOrErr)
1282 return ToUnderlyingTypeOrErr.takeError();
Douglas Gregor81495f32012-02-12 18:42:33 +00001283
Balazs Keri3b30d652018-10-19 13:32:20 +00001284 return Importer.getToContext().getDecltypeType(
1285 *ToExprOrErr, *ToUnderlyingTypeOrErr);
Douglas Gregor96e578d2010-02-05 17:54:41 +00001286}
1287
Balazs Keri3b30d652018-10-19 13:32:20 +00001288ExpectedType
1289ASTNodeImporter::VisitUnaryTransformType(const UnaryTransformType *T) {
1290 ExpectedType ToBaseTypeOrErr = import(T->getBaseType());
1291 if (!ToBaseTypeOrErr)
1292 return ToBaseTypeOrErr.takeError();
Alexis Hunte852b102011-05-24 22:41:36 +00001293
Balazs Keri3b30d652018-10-19 13:32:20 +00001294 ExpectedType ToUnderlyingTypeOrErr = import(T->getUnderlyingType());
1295 if (!ToUnderlyingTypeOrErr)
1296 return ToUnderlyingTypeOrErr.takeError();
1297
1298 return Importer.getToContext().getUnaryTransformType(
1299 *ToBaseTypeOrErr, *ToUnderlyingTypeOrErr, T->getUTTKind());
Alexis Hunte852b102011-05-24 22:41:36 +00001300}
1301
Balazs Keri3b30d652018-10-19 13:32:20 +00001302ExpectedType ASTNodeImporter::VisitAutoType(const AutoType *T) {
Richard Smith74aeef52013-04-26 16:15:35 +00001303 // FIXME: Make sure that the "to" context supports C++11!
Balazs Keri3b30d652018-10-19 13:32:20 +00001304 ExpectedType ToDeducedTypeOrErr = import(T->getDeducedType());
1305 if (!ToDeducedTypeOrErr)
1306 return ToDeducedTypeOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001307
Balazs Keri3b30d652018-10-19 13:32:20 +00001308 return Importer.getToContext().getAutoType(*ToDeducedTypeOrErr,
1309 T->getKeyword(),
Faisal Vali2b391ab2013-09-26 19:54:12 +00001310 /*IsDependent*/false);
Richard Smith30482bc2011-02-20 03:19:35 +00001311}
1312
Balazs Keri3b30d652018-10-19 13:32:20 +00001313ExpectedType ASTNodeImporter::VisitInjectedClassNameType(
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00001314 const InjectedClassNameType *T) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001315 Expected<CXXRecordDecl *> ToDeclOrErr = import(T->getDecl());
1316 if (!ToDeclOrErr)
1317 return ToDeclOrErr.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00001318
Balazs Keri3b30d652018-10-19 13:32:20 +00001319 ExpectedType ToInjTypeOrErr = import(T->getInjectedSpecializationType());
1320 if (!ToInjTypeOrErr)
1321 return ToInjTypeOrErr.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00001322
1323 // FIXME: ASTContext::getInjectedClassNameType is not suitable for AST reading
1324 // See comments in InjectedClassNameType definition for details
1325 // return Importer.getToContext().getInjectedClassNameType(D, InjType);
1326 enum {
1327 TypeAlignmentInBits = 4,
1328 TypeAlignment = 1 << TypeAlignmentInBits
1329 };
1330
1331 return QualType(new (Importer.getToContext(), TypeAlignment)
Balazs Keri3b30d652018-10-19 13:32:20 +00001332 InjectedClassNameType(*ToDeclOrErr, *ToInjTypeOrErr), 0);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00001333}
1334
Balazs Keri3b30d652018-10-19 13:32:20 +00001335ExpectedType ASTNodeImporter::VisitRecordType(const RecordType *T) {
1336 Expected<RecordDecl *> ToDeclOrErr = import(T->getDecl());
1337 if (!ToDeclOrErr)
1338 return ToDeclOrErr.takeError();
Douglas Gregor96e578d2010-02-05 17:54:41 +00001339
Balazs Keri3b30d652018-10-19 13:32:20 +00001340 return Importer.getToContext().getTagDeclType(*ToDeclOrErr);
Douglas Gregor96e578d2010-02-05 17:54:41 +00001341}
1342
Balazs Keri3b30d652018-10-19 13:32:20 +00001343ExpectedType ASTNodeImporter::VisitEnumType(const EnumType *T) {
1344 Expected<EnumDecl *> ToDeclOrErr = import(T->getDecl());
1345 if (!ToDeclOrErr)
1346 return ToDeclOrErr.takeError();
Douglas Gregor96e578d2010-02-05 17:54:41 +00001347
Balazs Keri3b30d652018-10-19 13:32:20 +00001348 return Importer.getToContext().getTagDeclType(*ToDeclOrErr);
Douglas Gregor96e578d2010-02-05 17:54:41 +00001349}
1350
Balazs Keri3b30d652018-10-19 13:32:20 +00001351ExpectedType ASTNodeImporter::VisitAttributedType(const AttributedType *T) {
1352 ExpectedType ToModifiedTypeOrErr = import(T->getModifiedType());
1353 if (!ToModifiedTypeOrErr)
1354 return ToModifiedTypeOrErr.takeError();
1355 ExpectedType ToEquivalentTypeOrErr = import(T->getEquivalentType());
1356 if (!ToEquivalentTypeOrErr)
1357 return ToEquivalentTypeOrErr.takeError();
Sean Callanan72fe0852015-04-02 23:50:08 +00001358
1359 return Importer.getToContext().getAttributedType(T->getAttrKind(),
Balazs Keri3b30d652018-10-19 13:32:20 +00001360 *ToModifiedTypeOrErr, *ToEquivalentTypeOrErr);
Sean Callanan72fe0852015-04-02 23:50:08 +00001361}
1362
Balazs Keri3b30d652018-10-19 13:32:20 +00001363ExpectedType ASTNodeImporter::VisitTemplateTypeParmType(
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00001364 const TemplateTypeParmType *T) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001365 Expected<TemplateTypeParmDecl *> ToDeclOrErr = import(T->getDecl());
1366 if (!ToDeclOrErr)
1367 return ToDeclOrErr.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00001368
1369 return Importer.getToContext().getTemplateTypeParmType(
Balazs Keri3b30d652018-10-19 13:32:20 +00001370 T->getDepth(), T->getIndex(), T->isParameterPack(), *ToDeclOrErr);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00001371}
1372
Balazs Keri3b30d652018-10-19 13:32:20 +00001373ExpectedType ASTNodeImporter::VisitSubstTemplateTypeParmType(
Aleksei Sidorin855086d2017-01-23 09:30:36 +00001374 const SubstTemplateTypeParmType *T) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001375 ExpectedType ReplacedOrErr = import(QualType(T->getReplacedParameter(), 0));
1376 if (!ReplacedOrErr)
1377 return ReplacedOrErr.takeError();
1378 const TemplateTypeParmType *Replaced =
1379 cast<TemplateTypeParmType>((*ReplacedOrErr).getTypePtr());
Aleksei Sidorin855086d2017-01-23 09:30:36 +00001380
Balazs Keri3b30d652018-10-19 13:32:20 +00001381 ExpectedType ToReplacementTypeOrErr = import(T->getReplacementType());
1382 if (!ToReplacementTypeOrErr)
1383 return ToReplacementTypeOrErr.takeError();
Aleksei Sidorin855086d2017-01-23 09:30:36 +00001384
1385 return Importer.getToContext().getSubstTemplateTypeParmType(
Balazs Keri3b30d652018-10-19 13:32:20 +00001386 Replaced, (*ToReplacementTypeOrErr).getCanonicalType());
Aleksei Sidorin855086d2017-01-23 09:30:36 +00001387}
1388
Balazs Keri3b30d652018-10-19 13:32:20 +00001389ExpectedType ASTNodeImporter::VisitTemplateSpecializationType(
John McCall424cec92011-01-19 06:33:43 +00001390 const TemplateSpecializationType *T) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001391 auto ToTemplateOrErr = import(T->getTemplateName());
1392 if (!ToTemplateOrErr)
1393 return ToTemplateOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001394
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001395 SmallVector<TemplateArgument, 2> ToTemplateArgs;
Balazs Keri3b30d652018-10-19 13:32:20 +00001396 if (Error Err = ImportTemplateArguments(
1397 T->getArgs(), T->getNumArgs(), ToTemplateArgs))
1398 return std::move(Err);
Fangrui Song6907ce22018-07-30 19:24:48 +00001399
Douglas Gregore2e50d332010-12-01 01:36:18 +00001400 QualType ToCanonType;
1401 if (!QualType(T, 0).isCanonical()) {
Fangrui Song6907ce22018-07-30 19:24:48 +00001402 QualType FromCanonType
Douglas Gregore2e50d332010-12-01 01:36:18 +00001403 = Importer.getFromContext().getCanonicalType(QualType(T, 0));
Balazs Keri3b30d652018-10-19 13:32:20 +00001404 if (ExpectedType TyOrErr = import(FromCanonType))
1405 ToCanonType = *TyOrErr;
1406 else
1407 return TyOrErr.takeError();
Douglas Gregore2e50d332010-12-01 01:36:18 +00001408 }
Balazs Keri3b30d652018-10-19 13:32:20 +00001409 return Importer.getToContext().getTemplateSpecializationType(*ToTemplateOrErr,
David Majnemer6fbeee32016-07-07 04:43:07 +00001410 ToTemplateArgs,
Douglas Gregore2e50d332010-12-01 01:36:18 +00001411 ToCanonType);
1412}
1413
Balazs Keri3b30d652018-10-19 13:32:20 +00001414ExpectedType ASTNodeImporter::VisitElaboratedType(const ElaboratedType *T) {
Abramo Bagnara6150c882010-05-11 21:36:43 +00001415 // Note: the qualifier in an ElaboratedType is optional.
Balazs Keri3b30d652018-10-19 13:32:20 +00001416 auto ToQualifierOrErr = import(T->getQualifier());
1417 if (!ToQualifierOrErr)
1418 return ToQualifierOrErr.takeError();
Douglas Gregor96e578d2010-02-05 17:54:41 +00001419
Balazs Keri3b30d652018-10-19 13:32:20 +00001420 ExpectedType ToNamedTypeOrErr = import(T->getNamedType());
1421 if (!ToNamedTypeOrErr)
1422 return ToNamedTypeOrErr.takeError();
Douglas Gregor96e578d2010-02-05 17:54:41 +00001423
Balazs Keri3b30d652018-10-19 13:32:20 +00001424 Expected<TagDecl *> ToOwnedTagDeclOrErr = import(T->getOwnedTagDecl());
1425 if (!ToOwnedTagDeclOrErr)
1426 return ToOwnedTagDeclOrErr.takeError();
Joel E. Denny7509a2f2018-05-14 19:36:45 +00001427
Abramo Bagnara6150c882010-05-11 21:36:43 +00001428 return Importer.getToContext().getElaboratedType(T->getKeyword(),
Balazs Keri3b30d652018-10-19 13:32:20 +00001429 *ToQualifierOrErr,
1430 *ToNamedTypeOrErr,
1431 *ToOwnedTagDeclOrErr);
Douglas Gregor96e578d2010-02-05 17:54:41 +00001432}
1433
Balazs Keri3b30d652018-10-19 13:32:20 +00001434ExpectedType
1435ASTNodeImporter::VisitPackExpansionType(const PackExpansionType *T) {
1436 ExpectedType ToPatternOrErr = import(T->getPattern());
1437 if (!ToPatternOrErr)
1438 return ToPatternOrErr.takeError();
Gabor Horvath7a91c082017-11-14 11:30:38 +00001439
Balazs Keri3b30d652018-10-19 13:32:20 +00001440 return Importer.getToContext().getPackExpansionType(*ToPatternOrErr,
Gabor Horvath7a91c082017-11-14 11:30:38 +00001441 T->getNumExpansions());
1442}
1443
Balazs Keri3b30d652018-10-19 13:32:20 +00001444ExpectedType ASTNodeImporter::VisitDependentTemplateSpecializationType(
Gabor Horvathc78d99a2018-01-27 16:11:45 +00001445 const DependentTemplateSpecializationType *T) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001446 auto ToQualifierOrErr = import(T->getQualifier());
1447 if (!ToQualifierOrErr)
1448 return ToQualifierOrErr.takeError();
Gabor Horvathc78d99a2018-01-27 16:11:45 +00001449
Balazs Keri3b30d652018-10-19 13:32:20 +00001450 IdentifierInfo *ToName = Importer.Import(T->getIdentifier());
Gabor Horvathc78d99a2018-01-27 16:11:45 +00001451
1452 SmallVector<TemplateArgument, 2> ToPack;
1453 ToPack.reserve(T->getNumArgs());
Balazs Keri3b30d652018-10-19 13:32:20 +00001454 if (Error Err = ImportTemplateArguments(
1455 T->getArgs(), T->getNumArgs(), ToPack))
1456 return std::move(Err);
Gabor Horvathc78d99a2018-01-27 16:11:45 +00001457
1458 return Importer.getToContext().getDependentTemplateSpecializationType(
Balazs Keri3b30d652018-10-19 13:32:20 +00001459 T->getKeyword(), *ToQualifierOrErr, ToName, ToPack);
Gabor Horvathc78d99a2018-01-27 16:11:45 +00001460}
1461
Balazs Keri3b30d652018-10-19 13:32:20 +00001462ExpectedType
1463ASTNodeImporter::VisitDependentNameType(const DependentNameType *T) {
1464 auto ToQualifierOrErr = import(T->getQualifier());
1465 if (!ToQualifierOrErr)
1466 return ToQualifierOrErr.takeError();
Peter Szecsice7f3182018-05-07 12:08:27 +00001467
1468 IdentifierInfo *Name = Importer.Import(T->getIdentifier());
Peter Szecsice7f3182018-05-07 12:08:27 +00001469
Balazs Keri3b30d652018-10-19 13:32:20 +00001470 QualType Canon;
1471 if (T != T->getCanonicalTypeInternal().getTypePtr()) {
1472 if (ExpectedType TyOrErr = import(T->getCanonicalTypeInternal()))
1473 Canon = (*TyOrErr).getCanonicalType();
1474 else
1475 return TyOrErr.takeError();
1476 }
Peter Szecsice7f3182018-05-07 12:08:27 +00001477
Balazs Keri3b30d652018-10-19 13:32:20 +00001478 return Importer.getToContext().getDependentNameType(T->getKeyword(),
1479 *ToQualifierOrErr,
Peter Szecsice7f3182018-05-07 12:08:27 +00001480 Name, Canon);
1481}
1482
Balazs Keri3b30d652018-10-19 13:32:20 +00001483ExpectedType
1484ASTNodeImporter::VisitObjCInterfaceType(const ObjCInterfaceType *T) {
1485 Expected<ObjCInterfaceDecl *> ToDeclOrErr = import(T->getDecl());
1486 if (!ToDeclOrErr)
1487 return ToDeclOrErr.takeError();
Douglas Gregor96e578d2010-02-05 17:54:41 +00001488
Balazs Keri3b30d652018-10-19 13:32:20 +00001489 return Importer.getToContext().getObjCInterfaceType(*ToDeclOrErr);
John McCall8b07ec22010-05-15 11:32:37 +00001490}
1491
Balazs Keri3b30d652018-10-19 13:32:20 +00001492ExpectedType ASTNodeImporter::VisitObjCObjectType(const ObjCObjectType *T) {
1493 ExpectedType ToBaseTypeOrErr = import(T->getBaseType());
1494 if (!ToBaseTypeOrErr)
1495 return ToBaseTypeOrErr.takeError();
John McCall8b07ec22010-05-15 11:32:37 +00001496
Douglas Gregore9d95f12015-07-07 03:57:35 +00001497 SmallVector<QualType, 4> TypeArgs;
Douglas Gregore83b9562015-07-07 03:57:53 +00001498 for (auto TypeArg : T->getTypeArgsAsWritten()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001499 if (ExpectedType TyOrErr = import(TypeArg))
1500 TypeArgs.push_back(*TyOrErr);
1501 else
1502 return TyOrErr.takeError();
Douglas Gregore9d95f12015-07-07 03:57:35 +00001503 }
1504
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001505 SmallVector<ObjCProtocolDecl *, 4> Protocols;
Aaron Ballman1683f7b2014-03-17 15:55:30 +00001506 for (auto *P : T->quals()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001507 if (Expected<ObjCProtocolDecl *> ProtocolOrErr = import(P))
1508 Protocols.push_back(*ProtocolOrErr);
1509 else
1510 return ProtocolOrErr.takeError();
1511
Douglas Gregor96e578d2010-02-05 17:54:41 +00001512 }
1513
Balazs Keri3b30d652018-10-19 13:32:20 +00001514 return Importer.getToContext().getObjCObjectType(*ToBaseTypeOrErr, TypeArgs,
Douglas Gregorab209d82015-07-07 03:58:42 +00001515 Protocols,
1516 T->isKindOfTypeAsWritten());
Douglas Gregor96e578d2010-02-05 17:54:41 +00001517}
1518
Balazs Keri3b30d652018-10-19 13:32:20 +00001519ExpectedType
John McCall424cec92011-01-19 06:33:43 +00001520ASTNodeImporter::VisitObjCObjectPointerType(const ObjCObjectPointerType *T) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001521 ExpectedType ToPointeeTypeOrErr = import(T->getPointeeType());
1522 if (!ToPointeeTypeOrErr)
1523 return ToPointeeTypeOrErr.takeError();
Douglas Gregor96e578d2010-02-05 17:54:41 +00001524
Balazs Keri3b30d652018-10-19 13:32:20 +00001525 return Importer.getToContext().getObjCObjectPointerType(*ToPointeeTypeOrErr);
Douglas Gregor96e578d2010-02-05 17:54:41 +00001526}
1527
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00001528//----------------------------------------------------------------------------
1529// Import Declarations
1530//----------------------------------------------------------------------------
Balazs Keri3b30d652018-10-19 13:32:20 +00001531Error ASTNodeImporter::ImportDeclParts(
1532 NamedDecl *D, DeclContext *&DC, DeclContext *&LexicalDC,
1533 DeclarationName &Name, NamedDecl *&ToD, SourceLocation &Loc) {
Gabor Marton6e1510c2018-07-12 11:50:21 +00001534 // Check if RecordDecl is in FunctionDecl parameters to avoid infinite loop.
1535 // example: int struct_in_proto(struct data_t{int a;int b;} *d);
1536 DeclContext *OrigDC = D->getDeclContext();
1537 FunctionDecl *FunDecl;
1538 if (isa<RecordDecl>(D) && (FunDecl = dyn_cast<FunctionDecl>(OrigDC)) &&
1539 FunDecl->hasBody()) {
Gabor Martonfe68e292018-08-06 14:38:37 +00001540 auto getLeafPointeeType = [](const Type *T) {
1541 while (T->isPointerType() || T->isArrayType()) {
1542 T = T->getPointeeOrArrayElementType();
1543 }
1544 return T;
1545 };
1546 for (const ParmVarDecl *P : FunDecl->parameters()) {
1547 const Type *LeafT =
1548 getLeafPointeeType(P->getType().getCanonicalType().getTypePtr());
1549 auto *RT = dyn_cast<RecordType>(LeafT);
1550 if (RT && RT->getDecl() == D) {
1551 Importer.FromDiag(D->getLocation(), diag::err_unsupported_ast_node)
1552 << D->getDeclKindName();
Balazs Keri3b30d652018-10-19 13:32:20 +00001553 return make_error<ImportError>(ImportError::UnsupportedConstruct);
Gabor Martonfe68e292018-08-06 14:38:37 +00001554 }
Gabor Marton6e1510c2018-07-12 11:50:21 +00001555 }
1556 }
1557
Douglas Gregorbb7930c2010-02-10 19:54:31 +00001558 // Import the context of this declaration.
Balazs Keri3b30d652018-10-19 13:32:20 +00001559 if (Error Err = ImportDeclContext(D, DC, LexicalDC))
1560 return Err;
Fangrui Song6907ce22018-07-30 19:24:48 +00001561
Douglas Gregorbb7930c2010-02-10 19:54:31 +00001562 // Import the name of this declaration.
Balazs Keri3b30d652018-10-19 13:32:20 +00001563 if (Error Err = importInto(Name, D->getDeclName()))
1564 return Err;
Fangrui Song6907ce22018-07-30 19:24:48 +00001565
Douglas Gregorbb7930c2010-02-10 19:54:31 +00001566 // Import the location of this declaration.
Balazs Keri3b30d652018-10-19 13:32:20 +00001567 if (Error Err = importInto(Loc, D->getLocation()))
1568 return Err;
1569
Sean Callanan59721b32015-04-28 18:41:46 +00001570 ToD = cast_or_null<NamedDecl>(Importer.GetAlreadyImportedOrNull(D));
Gabor Martonbe77a982018-12-12 11:22:55 +00001571 if (ToD)
1572 if (Error Err = ASTNodeImporter(*this).ImportDefinitionIfNeeded(D, ToD))
1573 return Err;
Balazs Keri3b30d652018-10-19 13:32:20 +00001574
1575 return Error::success();
Douglas Gregorbb7930c2010-02-10 19:54:31 +00001576}
1577
Balazs Keri3b30d652018-10-19 13:32:20 +00001578Error ASTNodeImporter::ImportDefinitionIfNeeded(Decl *FromD, Decl *ToD) {
Douglas Gregord451ea92011-07-29 23:31:30 +00001579 if (!FromD)
Balazs Keri3b30d652018-10-19 13:32:20 +00001580 return Error::success();
Fangrui Song6907ce22018-07-30 19:24:48 +00001581
Balazs Keri3b30d652018-10-19 13:32:20 +00001582 if (!ToD)
1583 if (Error Err = importInto(ToD, FromD))
1584 return Err;
Fangrui Song6907ce22018-07-30 19:24:48 +00001585
Balazs Keri3b30d652018-10-19 13:32:20 +00001586 if (RecordDecl *FromRecord = dyn_cast<RecordDecl>(FromD)) {
1587 if (RecordDecl *ToRecord = cast<RecordDecl>(ToD)) {
1588 if (FromRecord->getDefinition() && FromRecord->isCompleteDefinition() &&
1589 !ToRecord->getDefinition()) {
1590 if (Error Err = ImportDefinition(FromRecord, ToRecord))
1591 return Err;
Douglas Gregord451ea92011-07-29 23:31:30 +00001592 }
1593 }
Balazs Keri3b30d652018-10-19 13:32:20 +00001594 return Error::success();
Douglas Gregord451ea92011-07-29 23:31:30 +00001595 }
1596
Balazs Keri3b30d652018-10-19 13:32:20 +00001597 if (EnumDecl *FromEnum = dyn_cast<EnumDecl>(FromD)) {
1598 if (EnumDecl *ToEnum = cast<EnumDecl>(ToD)) {
Douglas Gregord451ea92011-07-29 23:31:30 +00001599 if (FromEnum->getDefinition() && !ToEnum->getDefinition()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001600 if (Error Err = ImportDefinition(FromEnum, ToEnum))
1601 return Err;
Douglas Gregord451ea92011-07-29 23:31:30 +00001602 }
1603 }
Balazs Keri3b30d652018-10-19 13:32:20 +00001604 return Error::success();
Douglas Gregord451ea92011-07-29 23:31:30 +00001605 }
Balazs Keri3b30d652018-10-19 13:32:20 +00001606
1607 return Error::success();
Douglas Gregord451ea92011-07-29 23:31:30 +00001608}
1609
Balazs Keri3b30d652018-10-19 13:32:20 +00001610Error
1611ASTNodeImporter::ImportDeclarationNameLoc(
1612 const DeclarationNameInfo &From, DeclarationNameInfo& To) {
Abramo Bagnarad6d2f182010-08-11 22:01:17 +00001613 // NOTE: To.Name and To.Loc are already imported.
1614 // We only have to import To.LocInfo.
1615 switch (To.getName().getNameKind()) {
1616 case DeclarationName::Identifier:
1617 case DeclarationName::ObjCZeroArgSelector:
1618 case DeclarationName::ObjCOneArgSelector:
1619 case DeclarationName::ObjCMultiArgSelector:
1620 case DeclarationName::CXXUsingDirective:
Richard Smith35845152017-02-07 01:37:30 +00001621 case DeclarationName::CXXDeductionGuideName:
Balazs Keri3b30d652018-10-19 13:32:20 +00001622 return Error::success();
Abramo Bagnarad6d2f182010-08-11 22:01:17 +00001623
1624 case DeclarationName::CXXOperatorName: {
Balazs Keri3b30d652018-10-19 13:32:20 +00001625 if (auto ToRangeOrErr = import(From.getCXXOperatorNameRange()))
1626 To.setCXXOperatorNameRange(*ToRangeOrErr);
1627 else
1628 return ToRangeOrErr.takeError();
1629 return Error::success();
Abramo Bagnarad6d2f182010-08-11 22:01:17 +00001630 }
1631 case DeclarationName::CXXLiteralOperatorName: {
Balazs Keri3b30d652018-10-19 13:32:20 +00001632 if (ExpectedSLoc LocOrErr = import(From.getCXXLiteralOperatorNameLoc()))
1633 To.setCXXLiteralOperatorNameLoc(*LocOrErr);
1634 else
1635 return LocOrErr.takeError();
1636 return Error::success();
Abramo Bagnarad6d2f182010-08-11 22:01:17 +00001637 }
1638 case DeclarationName::CXXConstructorName:
1639 case DeclarationName::CXXDestructorName:
1640 case DeclarationName::CXXConversionFunctionName: {
Balazs Keri3b30d652018-10-19 13:32:20 +00001641 if (auto ToTInfoOrErr = import(From.getNamedTypeInfo()))
1642 To.setNamedTypeInfo(*ToTInfoOrErr);
1643 else
1644 return ToTInfoOrErr.takeError();
1645 return Error::success();
Abramo Bagnarad6d2f182010-08-11 22:01:17 +00001646 }
Abramo Bagnarad6d2f182010-08-11 22:01:17 +00001647 }
Douglas Gregor07216d12011-11-02 20:52:01 +00001648 llvm_unreachable("Unknown name kind.");
Abramo Bagnarad6d2f182010-08-11 22:01:17 +00001649}
1650
Balazs Keri3b30d652018-10-19 13:32:20 +00001651Error
1652ASTNodeImporter::ImportDeclContext(DeclContext *FromDC, bool ForceImport) {
Douglas Gregor0a791672011-01-18 03:11:38 +00001653 if (Importer.isMinimalImport() && !ForceImport) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001654 auto ToDCOrErr = Importer.ImportContext(FromDC);
1655 return ToDCOrErr.takeError();
1656 }
Davide Italiano93a64ef2018-10-30 20:46:29 +00001657 llvm::SmallVector<Decl *, 8> ImportedDecls;
Balazs Keri3b30d652018-10-19 13:32:20 +00001658 for (auto *From : FromDC->decls()) {
1659 ExpectedDecl ImportedOrErr = import(From);
Davide Italiano93a64ef2018-10-30 20:46:29 +00001660 if (!ImportedOrErr)
Balazs Keri3b30d652018-10-19 13:32:20 +00001661 // Ignore the error, continue with next Decl.
1662 // FIXME: Handle this case somehow better.
Davide Italiano93a64ef2018-10-30 20:46:29 +00001663 consumeError(ImportedOrErr.takeError());
Douglas Gregor0a791672011-01-18 03:11:38 +00001664 }
Fangrui Song6907ce22018-07-30 19:24:48 +00001665
Balazs Keri3b30d652018-10-19 13:32:20 +00001666 return Error::success();
Douglas Gregor968d6332010-02-21 18:24:45 +00001667}
1668
Balazs Keri3b30d652018-10-19 13:32:20 +00001669Error ASTNodeImporter::ImportDeclContext(
1670 Decl *FromD, DeclContext *&ToDC, DeclContext *&ToLexicalDC) {
1671 auto ToDCOrErr = Importer.ImportContext(FromD->getDeclContext());
1672 if (!ToDCOrErr)
1673 return ToDCOrErr.takeError();
1674 ToDC = *ToDCOrErr;
1675
1676 if (FromD->getDeclContext() != FromD->getLexicalDeclContext()) {
1677 auto ToLexicalDCOrErr = Importer.ImportContext(
1678 FromD->getLexicalDeclContext());
1679 if (!ToLexicalDCOrErr)
1680 return ToLexicalDCOrErr.takeError();
1681 ToLexicalDC = *ToLexicalDCOrErr;
1682 } else
1683 ToLexicalDC = ToDC;
1684
1685 return Error::success();
1686}
1687
1688Error ASTNodeImporter::ImportImplicitMethods(
Balazs Keri1d20cc22018-07-16 12:16:39 +00001689 const CXXRecordDecl *From, CXXRecordDecl *To) {
1690 assert(From->isCompleteDefinition() && To->getDefinition() == To &&
1691 "Import implicit methods to or from non-definition");
Fangrui Song6907ce22018-07-30 19:24:48 +00001692
Balazs Keri1d20cc22018-07-16 12:16:39 +00001693 for (CXXMethodDecl *FromM : From->methods())
Balazs Keri3b30d652018-10-19 13:32:20 +00001694 if (FromM->isImplicit()) {
1695 Expected<CXXMethodDecl *> ToMOrErr = import(FromM);
1696 if (!ToMOrErr)
1697 return ToMOrErr.takeError();
1698 }
1699
1700 return Error::success();
Balazs Keri1d20cc22018-07-16 12:16:39 +00001701}
1702
Balazs Keri3b30d652018-10-19 13:32:20 +00001703static Error setTypedefNameForAnonDecl(TagDecl *From, TagDecl *To,
1704 ASTImporter &Importer) {
Aleksei Sidorin04fbffc2018-04-24 10:11:53 +00001705 if (TypedefNameDecl *FromTypedef = From->getTypedefNameForAnonDecl()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001706 Decl *ToTypedef = Importer.Import(FromTypedef);
1707 if (!ToTypedef)
1708 return make_error<ImportError>();
1709 To->setTypedefNameForAnonDecl(cast<TypedefNameDecl>(ToTypedef));
1710 // FIXME: This should be the final code.
1711 //if (Expected<Decl *> ToTypedefOrErr = Importer.Import(FromTypedef))
1712 // To->setTypedefNameForAnonDecl(cast<TypedefNameDecl>(*ToTypedefOrErr));
1713 //else
1714 // return ToTypedefOrErr.takeError();
Aleksei Sidorin04fbffc2018-04-24 10:11:53 +00001715 }
Balazs Keri3b30d652018-10-19 13:32:20 +00001716 return Error::success();
Aleksei Sidorin04fbffc2018-04-24 10:11:53 +00001717}
1718
Balazs Keri3b30d652018-10-19 13:32:20 +00001719Error ASTNodeImporter::ImportDefinition(
1720 RecordDecl *From, RecordDecl *To, ImportDefinitionKind Kind) {
Douglas Gregor95d82832012-01-24 18:36:04 +00001721 if (To->getDefinition() || To->isBeingDefined()) {
1722 if (Kind == IDK_Everything)
Balazs Keri3b30d652018-10-19 13:32:20 +00001723 return ImportDeclContext(From, /*ForceImport=*/true);
Fangrui Song6907ce22018-07-30 19:24:48 +00001724
Balazs Keri3b30d652018-10-19 13:32:20 +00001725 return Error::success();
Douglas Gregor95d82832012-01-24 18:36:04 +00001726 }
Fangrui Song6907ce22018-07-30 19:24:48 +00001727
Douglas Gregore2e50d332010-12-01 01:36:18 +00001728 To->startDefinition();
Aleksei Sidorin04fbffc2018-04-24 10:11:53 +00001729
Balazs Keri3b30d652018-10-19 13:32:20 +00001730 if (Error Err = setTypedefNameForAnonDecl(From, To, Importer))
1731 return Err;
Fangrui Song6907ce22018-07-30 19:24:48 +00001732
Douglas Gregore2e50d332010-12-01 01:36:18 +00001733 // Add base classes.
Gabor Marton17d39672018-11-26 15:54:08 +00001734 auto *ToCXX = dyn_cast<CXXRecordDecl>(To);
1735 auto *FromCXX = dyn_cast<CXXRecordDecl>(From);
1736 if (ToCXX && FromCXX && ToCXX->dataPtr() && FromCXX->dataPtr()) {
Douglas Gregor3c2404b2011-11-03 18:07:07 +00001737
1738 struct CXXRecordDecl::DefinitionData &ToData = ToCXX->data();
1739 struct CXXRecordDecl::DefinitionData &FromData = FromCXX->data();
1740 ToData.UserDeclaredConstructor = FromData.UserDeclaredConstructor;
Richard Smith328aae52012-11-30 05:11:39 +00001741 ToData.UserDeclaredSpecialMembers = FromData.UserDeclaredSpecialMembers;
Douglas Gregor3c2404b2011-11-03 18:07:07 +00001742 ToData.Aggregate = FromData.Aggregate;
1743 ToData.PlainOldData = FromData.PlainOldData;
1744 ToData.Empty = FromData.Empty;
1745 ToData.Polymorphic = FromData.Polymorphic;
1746 ToData.Abstract = FromData.Abstract;
1747 ToData.IsStandardLayout = FromData.IsStandardLayout;
Richard Smithb6070db2018-04-05 18:55:37 +00001748 ToData.IsCXX11StandardLayout = FromData.IsCXX11StandardLayout;
1749 ToData.HasBasesWithFields = FromData.HasBasesWithFields;
1750 ToData.HasBasesWithNonStaticDataMembers =
1751 FromData.HasBasesWithNonStaticDataMembers;
Douglas Gregor3c2404b2011-11-03 18:07:07 +00001752 ToData.HasPrivateFields = FromData.HasPrivateFields;
1753 ToData.HasProtectedFields = FromData.HasProtectedFields;
1754 ToData.HasPublicFields = FromData.HasPublicFields;
1755 ToData.HasMutableFields = FromData.HasMutableFields;
Richard Smithab44d5b2013-12-10 08:25:00 +00001756 ToData.HasVariantMembers = FromData.HasVariantMembers;
Richard Smith561fb152012-02-25 07:33:38 +00001757 ToData.HasOnlyCMembers = FromData.HasOnlyCMembers;
Richard Smithe2648ba2012-05-07 01:07:30 +00001758 ToData.HasInClassInitializer = FromData.HasInClassInitializer;
Richard Smith593f9932012-12-08 02:01:17 +00001759 ToData.HasUninitializedReferenceMember
1760 = FromData.HasUninitializedReferenceMember;
Nico Weber6a6376b2016-02-19 01:52:46 +00001761 ToData.HasUninitializedFields = FromData.HasUninitializedFields;
Richard Smith12e79312016-05-13 06:47:56 +00001762 ToData.HasInheritedConstructor = FromData.HasInheritedConstructor;
1763 ToData.HasInheritedAssignment = FromData.HasInheritedAssignment;
Richard Smith96cd6712017-08-16 01:49:53 +00001764 ToData.NeedOverloadResolutionForCopyConstructor
1765 = FromData.NeedOverloadResolutionForCopyConstructor;
Richard Smith6b02d462012-12-08 08:32:28 +00001766 ToData.NeedOverloadResolutionForMoveConstructor
1767 = FromData.NeedOverloadResolutionForMoveConstructor;
1768 ToData.NeedOverloadResolutionForMoveAssignment
1769 = FromData.NeedOverloadResolutionForMoveAssignment;
1770 ToData.NeedOverloadResolutionForDestructor
1771 = FromData.NeedOverloadResolutionForDestructor;
Richard Smith96cd6712017-08-16 01:49:53 +00001772 ToData.DefaultedCopyConstructorIsDeleted
1773 = FromData.DefaultedCopyConstructorIsDeleted;
Richard Smith6b02d462012-12-08 08:32:28 +00001774 ToData.DefaultedMoveConstructorIsDeleted
1775 = FromData.DefaultedMoveConstructorIsDeleted;
1776 ToData.DefaultedMoveAssignmentIsDeleted
1777 = FromData.DefaultedMoveAssignmentIsDeleted;
1778 ToData.DefaultedDestructorIsDeleted = FromData.DefaultedDestructorIsDeleted;
Richard Smith328aae52012-11-30 05:11:39 +00001779 ToData.HasTrivialSpecialMembers = FromData.HasTrivialSpecialMembers;
1780 ToData.HasIrrelevantDestructor = FromData.HasIrrelevantDestructor;
Douglas Gregor3c2404b2011-11-03 18:07:07 +00001781 ToData.HasConstexprNonCopyMoveConstructor
1782 = FromData.HasConstexprNonCopyMoveConstructor;
Nico Weber72c57f42016-02-24 20:58:14 +00001783 ToData.HasDefaultedDefaultConstructor
1784 = FromData.HasDefaultedDefaultConstructor;
Richard Smith561fb152012-02-25 07:33:38 +00001785 ToData.DefaultedDefaultConstructorIsConstexpr
1786 = FromData.DefaultedDefaultConstructorIsConstexpr;
Richard Smith561fb152012-02-25 07:33:38 +00001787 ToData.HasConstexprDefaultConstructor
1788 = FromData.HasConstexprDefaultConstructor;
Douglas Gregor3c2404b2011-11-03 18:07:07 +00001789 ToData.HasNonLiteralTypeFieldsOrBases
1790 = FromData.HasNonLiteralTypeFieldsOrBases;
Richard Smith561fb152012-02-25 07:33:38 +00001791 // ComputedVisibleConversions not imported.
Douglas Gregor3c2404b2011-11-03 18:07:07 +00001792 ToData.UserProvidedDefaultConstructor
1793 = FromData.UserProvidedDefaultConstructor;
Richard Smith328aae52012-11-30 05:11:39 +00001794 ToData.DeclaredSpecialMembers = FromData.DeclaredSpecialMembers;
Richard Smithdf054d32017-02-25 23:53:05 +00001795 ToData.ImplicitCopyConstructorCanHaveConstParamForVBase
1796 = FromData.ImplicitCopyConstructorCanHaveConstParamForVBase;
1797 ToData.ImplicitCopyConstructorCanHaveConstParamForNonVBase
1798 = FromData.ImplicitCopyConstructorCanHaveConstParamForNonVBase;
Richard Smith1c33fe82012-11-28 06:23:12 +00001799 ToData.ImplicitCopyAssignmentHasConstParam
1800 = FromData.ImplicitCopyAssignmentHasConstParam;
1801 ToData.HasDeclaredCopyConstructorWithConstParam
1802 = FromData.HasDeclaredCopyConstructorWithConstParam;
1803 ToData.HasDeclaredCopyAssignmentWithConstParam
1804 = FromData.HasDeclaredCopyAssignmentWithConstParam;
Richard Smith561fb152012-02-25 07:33:38 +00001805
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001806 SmallVector<CXXBaseSpecifier *, 4> Bases;
Aaron Ballman574705e2014-03-13 15:41:46 +00001807 for (const auto &Base1 : FromCXX->bases()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001808 ExpectedType TyOrErr = import(Base1.getType());
1809 if (!TyOrErr)
1810 return TyOrErr.takeError();
Douglas Gregor752a5952011-01-03 22:36:02 +00001811
1812 SourceLocation EllipsisLoc;
Balazs Keri3b30d652018-10-19 13:32:20 +00001813 if (Base1.isPackExpansion()) {
1814 if (ExpectedSLoc LocOrErr = import(Base1.getEllipsisLoc()))
1815 EllipsisLoc = *LocOrErr;
1816 else
1817 return LocOrErr.takeError();
1818 }
Douglas Gregord451ea92011-07-29 23:31:30 +00001819
1820 // Ensure that we have a definition for the base.
Balazs Keri3b30d652018-10-19 13:32:20 +00001821 if (Error Err =
1822 ImportDefinitionIfNeeded(Base1.getType()->getAsCXXRecordDecl()))
1823 return Err;
1824
1825 auto RangeOrErr = import(Base1.getSourceRange());
1826 if (!RangeOrErr)
1827 return RangeOrErr.takeError();
1828
1829 auto TSIOrErr = import(Base1.getTypeSourceInfo());
1830 if (!TSIOrErr)
1831 return TSIOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001832
Douglas Gregore2e50d332010-12-01 01:36:18 +00001833 Bases.push_back(
Balazs Keri3b30d652018-10-19 13:32:20 +00001834 new (Importer.getToContext()) CXXBaseSpecifier(
1835 *RangeOrErr,
1836 Base1.isVirtual(),
1837 Base1.isBaseOfClass(),
1838 Base1.getAccessSpecifierAsWritten(),
1839 *TSIOrErr,
1840 EllipsisLoc));
Douglas Gregore2e50d332010-12-01 01:36:18 +00001841 }
1842 if (!Bases.empty())
Craig Toppere6337e12015-12-25 00:36:02 +00001843 ToCXX->setBases(Bases.data(), Bases.size());
Douglas Gregore2e50d332010-12-01 01:36:18 +00001844 }
Fangrui Song6907ce22018-07-30 19:24:48 +00001845
Douglas Gregor2e15c842012-02-01 21:00:38 +00001846 if (shouldForceImportDeclContext(Kind))
Balazs Keri3b30d652018-10-19 13:32:20 +00001847 if (Error Err = ImportDeclContext(From, /*ForceImport=*/true))
1848 return Err;
Fangrui Song6907ce22018-07-30 19:24:48 +00001849
Douglas Gregore2e50d332010-12-01 01:36:18 +00001850 To->completeDefinition();
Balazs Keri3b30d652018-10-19 13:32:20 +00001851 return Error::success();
Douglas Gregore2e50d332010-12-01 01:36:18 +00001852}
1853
Balazs Keri3b30d652018-10-19 13:32:20 +00001854Error ASTNodeImporter::ImportInitializer(VarDecl *From, VarDecl *To) {
Sean Callanan59721b32015-04-28 18:41:46 +00001855 if (To->getAnyInitializer())
Balazs Keri3b30d652018-10-19 13:32:20 +00001856 return Error::success();
Larisse Voufo39a1e502013-08-06 01:03:05 +00001857
Gabor Martonac3a5d62018-09-17 12:04:52 +00001858 Expr *FromInit = From->getInit();
1859 if (!FromInit)
Balazs Keri3b30d652018-10-19 13:32:20 +00001860 return Error::success();
Gabor Martonac3a5d62018-09-17 12:04:52 +00001861
Balazs Keri3b30d652018-10-19 13:32:20 +00001862 ExpectedExpr ToInitOrErr = import(FromInit);
1863 if (!ToInitOrErr)
1864 return ToInitOrErr.takeError();
Gabor Martonac3a5d62018-09-17 12:04:52 +00001865
Balazs Keri3b30d652018-10-19 13:32:20 +00001866 To->setInit(*ToInitOrErr);
Gabor Martonac3a5d62018-09-17 12:04:52 +00001867 if (From->isInitKnownICE()) {
1868 EvaluatedStmt *Eval = To->ensureEvaluatedStmt();
1869 Eval->CheckedICE = true;
1870 Eval->IsICE = From->isInitICE();
1871 }
Larisse Voufo39a1e502013-08-06 01:03:05 +00001872
1873 // FIXME: Other bits to merge?
Balazs Keri3b30d652018-10-19 13:32:20 +00001874 return Error::success();
Larisse Voufo39a1e502013-08-06 01:03:05 +00001875}
1876
Balazs Keri3b30d652018-10-19 13:32:20 +00001877Error ASTNodeImporter::ImportDefinition(
1878 EnumDecl *From, EnumDecl *To, ImportDefinitionKind Kind) {
Douglas Gregor2e15c842012-02-01 21:00:38 +00001879 if (To->getDefinition() || To->isBeingDefined()) {
1880 if (Kind == IDK_Everything)
Balazs Keri3b30d652018-10-19 13:32:20 +00001881 return ImportDeclContext(From, /*ForceImport=*/true);
1882 return Error::success();
Douglas Gregor2e15c842012-02-01 21:00:38 +00001883 }
Fangrui Song6907ce22018-07-30 19:24:48 +00001884
Douglas Gregord451ea92011-07-29 23:31:30 +00001885 To->startDefinition();
1886
Balazs Keri3b30d652018-10-19 13:32:20 +00001887 if (Error Err = setTypedefNameForAnonDecl(From, To, Importer))
1888 return Err;
Aleksei Sidorin04fbffc2018-04-24 10:11:53 +00001889
Balazs Keri3b30d652018-10-19 13:32:20 +00001890 ExpectedType ToTypeOrErr =
1891 import(Importer.getFromContext().getTypeDeclType(From));
1892 if (!ToTypeOrErr)
1893 return ToTypeOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001894
Balazs Keri3b30d652018-10-19 13:32:20 +00001895 ExpectedType ToPromotionTypeOrErr = import(From->getPromotionType());
1896 if (!ToPromotionTypeOrErr)
1897 return ToPromotionTypeOrErr.takeError();
Douglas Gregor2e15c842012-02-01 21:00:38 +00001898
1899 if (shouldForceImportDeclContext(Kind))
Balazs Keri3b30d652018-10-19 13:32:20 +00001900 if (Error Err = ImportDeclContext(From, /*ForceImport=*/true))
1901 return Err;
Fangrui Song6907ce22018-07-30 19:24:48 +00001902
Douglas Gregord451ea92011-07-29 23:31:30 +00001903 // FIXME: we might need to merge the number of positive or negative bits
1904 // if the enumerator lists don't match.
Balazs Keri3b30d652018-10-19 13:32:20 +00001905 To->completeDefinition(*ToTypeOrErr, *ToPromotionTypeOrErr,
Douglas Gregord451ea92011-07-29 23:31:30 +00001906 From->getNumPositiveBits(),
1907 From->getNumNegativeBits());
Balazs Keri3b30d652018-10-19 13:32:20 +00001908 return Error::success();
Douglas Gregord451ea92011-07-29 23:31:30 +00001909}
1910
Balazs Keri3b30d652018-10-19 13:32:20 +00001911// FIXME: Remove this, use `import` instead.
1912Expected<TemplateParameterList *> ASTNodeImporter::ImportTemplateParameterList(
1913 TemplateParameterList *Params) {
Aleksei Sidorina693b372016-09-28 10:16:56 +00001914 SmallVector<NamedDecl *, 4> ToParams(Params->size());
Balazs Keri3b30d652018-10-19 13:32:20 +00001915 if (Error Err = ImportContainerChecked(*Params, ToParams))
1916 return std::move(Err);
Fangrui Song6907ce22018-07-30 19:24:48 +00001917
Hubert Tonge4a0c0e2016-07-30 22:33:34 +00001918 Expr *ToRequiresClause;
1919 if (Expr *const R = Params->getRequiresClause()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001920 if (Error Err = importInto(ToRequiresClause, R))
1921 return std::move(Err);
Hubert Tonge4a0c0e2016-07-30 22:33:34 +00001922 } else {
1923 ToRequiresClause = nullptr;
1924 }
1925
Balazs Keri3b30d652018-10-19 13:32:20 +00001926 auto ToTemplateLocOrErr = import(Params->getTemplateLoc());
1927 if (!ToTemplateLocOrErr)
1928 return ToTemplateLocOrErr.takeError();
1929 auto ToLAngleLocOrErr = import(Params->getLAngleLoc());
1930 if (!ToLAngleLocOrErr)
1931 return ToLAngleLocOrErr.takeError();
1932 auto ToRAngleLocOrErr = import(Params->getRAngleLoc());
1933 if (!ToRAngleLocOrErr)
1934 return ToRAngleLocOrErr.takeError();
1935
1936 return TemplateParameterList::Create(
1937 Importer.getToContext(),
1938 *ToTemplateLocOrErr,
1939 *ToLAngleLocOrErr,
1940 ToParams,
1941 *ToRAngleLocOrErr,
1942 ToRequiresClause);
Douglas Gregora082a492010-11-30 19:14:50 +00001943}
1944
Balazs Keri3b30d652018-10-19 13:32:20 +00001945Error ASTNodeImporter::ImportTemplateArguments(
1946 const TemplateArgument *FromArgs, unsigned NumFromArgs,
1947 SmallVectorImpl<TemplateArgument> &ToArgs) {
Douglas Gregore2e50d332010-12-01 01:36:18 +00001948 for (unsigned I = 0; I != NumFromArgs; ++I) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001949 if (auto ToOrErr = import(FromArgs[I]))
1950 ToArgs.push_back(*ToOrErr);
1951 else
1952 return ToOrErr.takeError();
Douglas Gregore2e50d332010-12-01 01:36:18 +00001953 }
Fangrui Song6907ce22018-07-30 19:24:48 +00001954
Balazs Keri3b30d652018-10-19 13:32:20 +00001955 return Error::success();
Douglas Gregore2e50d332010-12-01 01:36:18 +00001956}
1957
Balazs Keri3b30d652018-10-19 13:32:20 +00001958// FIXME: Do not forget to remove this and use only 'import'.
1959Expected<TemplateArgument>
1960ASTNodeImporter::ImportTemplateArgument(const TemplateArgument &From) {
1961 return import(From);
1962}
1963
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00001964template <typename InContainerTy>
Balazs Keri3b30d652018-10-19 13:32:20 +00001965Error ASTNodeImporter::ImportTemplateArgumentListInfo(
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00001966 const InContainerTy &Container, TemplateArgumentListInfo &ToTAInfo) {
1967 for (const auto &FromLoc : Container) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001968 if (auto ToLocOrErr = import(FromLoc))
1969 ToTAInfo.addArgument(*ToLocOrErr);
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00001970 else
Balazs Keri3b30d652018-10-19 13:32:20 +00001971 return ToLocOrErr.takeError();
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00001972 }
Balazs Keri3b30d652018-10-19 13:32:20 +00001973 return Error::success();
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00001974}
1975
Gabor Marton26f72a92018-07-12 09:42:05 +00001976static StructuralEquivalenceKind
1977getStructuralEquivalenceKind(const ASTImporter &Importer) {
1978 return Importer.isMinimalImport() ? StructuralEquivalenceKind::Minimal
1979 : StructuralEquivalenceKind::Default;
1980}
1981
Gabor Marton950fb572018-07-17 12:39:27 +00001982bool ASTNodeImporter::IsStructuralMatch(Decl *From, Decl *To, bool Complain) {
1983 StructuralEquivalenceContext Ctx(
1984 Importer.getFromContext(), Importer.getToContext(),
1985 Importer.getNonEquivalentDecls(), getStructuralEquivalenceKind(Importer),
1986 false, Complain);
1987 return Ctx.IsEquivalent(From, To);
1988}
1989
1990bool ASTNodeImporter::IsStructuralMatch(RecordDecl *FromRecord,
Douglas Gregordd6006f2012-07-17 21:16:27 +00001991 RecordDecl *ToRecord, bool Complain) {
Sean Callananc665c9e2013-10-09 21:45:11 +00001992 // Eliminate a potential failure point where we attempt to re-import
1993 // something we're trying to import while completing ToRecord.
1994 Decl *ToOrigin = Importer.GetOriginalDecl(ToRecord);
1995 if (ToOrigin) {
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00001996 auto *ToOriginRecord = dyn_cast<RecordDecl>(ToOrigin);
Sean Callananc665c9e2013-10-09 21:45:11 +00001997 if (ToOriginRecord)
1998 ToRecord = ToOriginRecord;
1999 }
2000
Benjamin Kramer26d19c52010-02-18 13:02:13 +00002001 StructuralEquivalenceContext Ctx(Importer.getFromContext(),
Sean Callananc665c9e2013-10-09 21:45:11 +00002002 ToRecord->getASTContext(),
Douglas Gregordd6006f2012-07-17 21:16:27 +00002003 Importer.getNonEquivalentDecls(),
Gabor Marton26f72a92018-07-12 09:42:05 +00002004 getStructuralEquivalenceKind(Importer),
Douglas Gregordd6006f2012-07-17 21:16:27 +00002005 false, Complain);
Gabor Marton950fb572018-07-17 12:39:27 +00002006 return Ctx.IsEquivalent(FromRecord, ToRecord);
Douglas Gregor5c73e912010-02-11 00:48:18 +00002007}
2008
Larisse Voufo39a1e502013-08-06 01:03:05 +00002009bool ASTNodeImporter::IsStructuralMatch(VarDecl *FromVar, VarDecl *ToVar,
2010 bool Complain) {
2011 StructuralEquivalenceContext Ctx(
2012 Importer.getFromContext(), Importer.getToContext(),
Gabor Marton26f72a92018-07-12 09:42:05 +00002013 Importer.getNonEquivalentDecls(), getStructuralEquivalenceKind(Importer),
2014 false, Complain);
Gabor Marton950fb572018-07-17 12:39:27 +00002015 return Ctx.IsEquivalent(FromVar, ToVar);
Larisse Voufo39a1e502013-08-06 01:03:05 +00002016}
2017
Douglas Gregor98c10182010-02-12 22:17:39 +00002018bool ASTNodeImporter::IsStructuralMatch(EnumDecl *FromEnum, EnumDecl *ToEnum) {
Gabor Marton26f72a92018-07-12 09:42:05 +00002019 StructuralEquivalenceContext Ctx(
2020 Importer.getFromContext(), Importer.getToContext(),
2021 Importer.getNonEquivalentDecls(), getStructuralEquivalenceKind(Importer));
Gabor Marton950fb572018-07-17 12:39:27 +00002022 return Ctx.IsEquivalent(FromEnum, ToEnum);
Douglas Gregor98c10182010-02-12 22:17:39 +00002023}
2024
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00002025bool ASTNodeImporter::IsStructuralMatch(FunctionTemplateDecl *From,
2026 FunctionTemplateDecl *To) {
2027 StructuralEquivalenceContext Ctx(
2028 Importer.getFromContext(), Importer.getToContext(),
Gabor Marton26f72a92018-07-12 09:42:05 +00002029 Importer.getNonEquivalentDecls(), getStructuralEquivalenceKind(Importer),
2030 false, false);
Gabor Marton950fb572018-07-17 12:39:27 +00002031 return Ctx.IsEquivalent(From, To);
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00002032}
2033
Balazs Keric7797c42018-07-11 09:37:24 +00002034bool ASTNodeImporter::IsStructuralMatch(FunctionDecl *From, FunctionDecl *To) {
2035 StructuralEquivalenceContext Ctx(
2036 Importer.getFromContext(), Importer.getToContext(),
Gabor Marton26f72a92018-07-12 09:42:05 +00002037 Importer.getNonEquivalentDecls(), getStructuralEquivalenceKind(Importer),
2038 false, false);
Gabor Marton950fb572018-07-17 12:39:27 +00002039 return Ctx.IsEquivalent(From, To);
Balazs Keric7797c42018-07-11 09:37:24 +00002040}
2041
Douglas Gregor91155082012-11-14 22:29:20 +00002042bool ASTNodeImporter::IsStructuralMatch(EnumConstantDecl *FromEC,
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002043 EnumConstantDecl *ToEC) {
Douglas Gregor91155082012-11-14 22:29:20 +00002044 const llvm::APSInt &FromVal = FromEC->getInitVal();
2045 const llvm::APSInt &ToVal = ToEC->getInitVal();
2046
2047 return FromVal.isSigned() == ToVal.isSigned() &&
2048 FromVal.getBitWidth() == ToVal.getBitWidth() &&
2049 FromVal == ToVal;
2050}
2051
2052bool ASTNodeImporter::IsStructuralMatch(ClassTemplateDecl *From,
Douglas Gregora082a492010-11-30 19:14:50 +00002053 ClassTemplateDecl *To) {
2054 StructuralEquivalenceContext Ctx(Importer.getFromContext(),
2055 Importer.getToContext(),
Gabor Marton26f72a92018-07-12 09:42:05 +00002056 Importer.getNonEquivalentDecls(),
2057 getStructuralEquivalenceKind(Importer));
Gabor Marton950fb572018-07-17 12:39:27 +00002058 return Ctx.IsEquivalent(From, To);
Douglas Gregora082a492010-11-30 19:14:50 +00002059}
2060
Larisse Voufo39a1e502013-08-06 01:03:05 +00002061bool ASTNodeImporter::IsStructuralMatch(VarTemplateDecl *From,
2062 VarTemplateDecl *To) {
2063 StructuralEquivalenceContext Ctx(Importer.getFromContext(),
2064 Importer.getToContext(),
Gabor Marton26f72a92018-07-12 09:42:05 +00002065 Importer.getNonEquivalentDecls(),
2066 getStructuralEquivalenceKind(Importer));
Gabor Marton950fb572018-07-17 12:39:27 +00002067 return Ctx.IsEquivalent(From, To);
Larisse Voufo39a1e502013-08-06 01:03:05 +00002068}
2069
Balazs Keri3b30d652018-10-19 13:32:20 +00002070ExpectedDecl ASTNodeImporter::VisitDecl(Decl *D) {
Douglas Gregor811663e2010-02-10 00:15:17 +00002071 Importer.FromDiag(D->getLocation(), diag::err_unsupported_ast_node)
Douglas Gregore4c83e42010-02-09 22:48:33 +00002072 << D->getDeclKindName();
Balazs Keri3b30d652018-10-19 13:32:20 +00002073 return make_error<ImportError>(ImportError::UnsupportedConstruct);
Douglas Gregore4c83e42010-02-09 22:48:33 +00002074}
2075
Balazs Keri3b30d652018-10-19 13:32:20 +00002076ExpectedDecl ASTNodeImporter::VisitImportDecl(ImportDecl *D) {
2077 Importer.FromDiag(D->getLocation(), diag::err_unsupported_ast_node)
2078 << D->getDeclKindName();
2079 return make_error<ImportError>(ImportError::UnsupportedConstruct);
2080}
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00002081
Balazs Keri3b30d652018-10-19 13:32:20 +00002082ExpectedDecl ASTNodeImporter::VisitEmptyDecl(EmptyDecl *D) {
2083 // Import the context of this declaration.
2084 DeclContext *DC, *LexicalDC;
2085 if (Error Err = ImportDeclContext(D, DC, LexicalDC))
2086 return std::move(Err);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00002087
2088 // Import the location of this declaration.
Balazs Keri3b30d652018-10-19 13:32:20 +00002089 ExpectedSLoc LocOrErr = import(D->getLocation());
2090 if (!LocOrErr)
2091 return LocOrErr.takeError();
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00002092
Gabor Marton26f72a92018-07-12 09:42:05 +00002093 EmptyDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00002094 if (GetImportedOrCreateDecl(ToD, D, Importer.getToContext(), DC, *LocOrErr))
Gabor Marton26f72a92018-07-12 09:42:05 +00002095 return ToD;
2096
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00002097 ToD->setLexicalDeclContext(LexicalDC);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00002098 LexicalDC->addDeclInternal(ToD);
2099 return ToD;
2100}
2101
Balazs Keri3b30d652018-10-19 13:32:20 +00002102ExpectedDecl ASTNodeImporter::VisitTranslationUnitDecl(TranslationUnitDecl *D) {
Fangrui Song6907ce22018-07-30 19:24:48 +00002103 TranslationUnitDecl *ToD =
Sean Callanan65198272011-11-17 23:20:56 +00002104 Importer.getToContext().getTranslationUnitDecl();
Fangrui Song6907ce22018-07-30 19:24:48 +00002105
Gabor Marton26f72a92018-07-12 09:42:05 +00002106 Importer.MapImported(D, ToD);
Fangrui Song6907ce22018-07-30 19:24:48 +00002107
Sean Callanan65198272011-11-17 23:20:56 +00002108 return ToD;
2109}
2110
Balazs Keri3b30d652018-10-19 13:32:20 +00002111ExpectedDecl ASTNodeImporter::VisitAccessSpecDecl(AccessSpecDecl *D) {
2112 ExpectedSLoc LocOrErr = import(D->getLocation());
2113 if (!LocOrErr)
2114 return LocOrErr.takeError();
2115 auto ColonLocOrErr = import(D->getColonLoc());
2116 if (!ColonLocOrErr)
2117 return ColonLocOrErr.takeError();
Argyrios Kyrtzidis544ea712016-02-18 23:08:36 +00002118
2119 // Import the context of this declaration.
Balazs Keri3b30d652018-10-19 13:32:20 +00002120 auto DCOrErr = Importer.ImportContext(D->getDeclContext());
2121 if (!DCOrErr)
2122 return DCOrErr.takeError();
2123 DeclContext *DC = *DCOrErr;
Argyrios Kyrtzidis544ea712016-02-18 23:08:36 +00002124
Gabor Marton26f72a92018-07-12 09:42:05 +00002125 AccessSpecDecl *ToD;
2126 if (GetImportedOrCreateDecl(ToD, D, Importer.getToContext(), D->getAccess(),
Balazs Keri3b30d652018-10-19 13:32:20 +00002127 DC, *LocOrErr, *ColonLocOrErr))
Gabor Marton26f72a92018-07-12 09:42:05 +00002128 return ToD;
Argyrios Kyrtzidis544ea712016-02-18 23:08:36 +00002129
2130 // Lexical DeclContext and Semantic DeclContext
2131 // is always the same for the accessSpec.
Gabor Marton26f72a92018-07-12 09:42:05 +00002132 ToD->setLexicalDeclContext(DC);
2133 DC->addDeclInternal(ToD);
Argyrios Kyrtzidis544ea712016-02-18 23:08:36 +00002134
Gabor Marton26f72a92018-07-12 09:42:05 +00002135 return ToD;
Argyrios Kyrtzidis544ea712016-02-18 23:08:36 +00002136}
2137
Balazs Keri3b30d652018-10-19 13:32:20 +00002138ExpectedDecl ASTNodeImporter::VisitStaticAssertDecl(StaticAssertDecl *D) {
2139 auto DCOrErr = Importer.ImportContext(D->getDeclContext());
2140 if (!DCOrErr)
2141 return DCOrErr.takeError();
2142 DeclContext *DC = *DCOrErr;
Aleksei Sidorina693b372016-09-28 10:16:56 +00002143 DeclContext *LexicalDC = DC;
2144
Balazs Keri3b30d652018-10-19 13:32:20 +00002145 SourceLocation ToLocation, ToRParenLoc;
2146 Expr *ToAssertExpr;
2147 StringLiteral *ToMessage;
2148 if (auto Imp = importSeq(
2149 D->getLocation(), D->getAssertExpr(), D->getMessage(), D->getRParenLoc()))
2150 std::tie(ToLocation, ToAssertExpr, ToMessage, ToRParenLoc) = *Imp;
2151 else
2152 return Imp.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00002153
Gabor Marton26f72a92018-07-12 09:42:05 +00002154 StaticAssertDecl *ToD;
2155 if (GetImportedOrCreateDecl(
Balazs Keri3b30d652018-10-19 13:32:20 +00002156 ToD, D, Importer.getToContext(), DC, ToLocation, ToAssertExpr, ToMessage,
2157 ToRParenLoc, D->isFailed()))
Gabor Marton26f72a92018-07-12 09:42:05 +00002158 return ToD;
Aleksei Sidorina693b372016-09-28 10:16:56 +00002159
2160 ToD->setLexicalDeclContext(LexicalDC);
2161 LexicalDC->addDeclInternal(ToD);
Aleksei Sidorina693b372016-09-28 10:16:56 +00002162 return ToD;
2163}
2164
Balazs Keri3b30d652018-10-19 13:32:20 +00002165ExpectedDecl ASTNodeImporter::VisitNamespaceDecl(NamespaceDecl *D) {
Douglas Gregorf18a2c72010-02-21 18:26:36 +00002166 // Import the major distinguishing characteristics of this namespace.
2167 DeclContext *DC, *LexicalDC;
2168 DeclarationName Name;
2169 SourceLocation Loc;
Sean Callanan59721b32015-04-28 18:41:46 +00002170 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00002171 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
2172 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00002173 if (ToD)
2174 return ToD;
Craig Topper36250ad2014-05-12 05:36:57 +00002175
2176 NamespaceDecl *MergeWithNamespace = nullptr;
Douglas Gregorf18a2c72010-02-21 18:26:36 +00002177 if (!Name) {
2178 // This is an anonymous namespace. Adopt an existing anonymous
2179 // namespace if we can.
2180 // FIXME: Not testable.
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002181 if (auto *TU = dyn_cast<TranslationUnitDecl>(DC))
Douglas Gregorf18a2c72010-02-21 18:26:36 +00002182 MergeWithNamespace = TU->getAnonymousNamespace();
2183 else
2184 MergeWithNamespace = cast<NamespaceDecl>(DC)->getAnonymousNamespace();
2185 } else {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002186 SmallVector<NamedDecl *, 4> ConflictingDecls;
Gabor Marton54058b52018-12-17 13:53:12 +00002187 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002188 for (auto *FoundDecl : FoundDecls) {
2189 if (!FoundDecl->isInIdentifierNamespace(Decl::IDNS_Namespace))
Douglas Gregorf18a2c72010-02-21 18:26:36 +00002190 continue;
Fangrui Song6907ce22018-07-30 19:24:48 +00002191
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002192 if (auto *FoundNS = dyn_cast<NamespaceDecl>(FoundDecl)) {
Douglas Gregorf18a2c72010-02-21 18:26:36 +00002193 MergeWithNamespace = FoundNS;
2194 ConflictingDecls.clear();
2195 break;
2196 }
Fangrui Song6907ce22018-07-30 19:24:48 +00002197
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002198 ConflictingDecls.push_back(FoundDecl);
Douglas Gregorf18a2c72010-02-21 18:26:36 +00002199 }
Fangrui Song6907ce22018-07-30 19:24:48 +00002200
Douglas Gregorf18a2c72010-02-21 18:26:36 +00002201 if (!ConflictingDecls.empty()) {
John McCalle87beb22010-04-23 18:46:30 +00002202 Name = Importer.HandleNameConflict(Name, DC, Decl::IDNS_Namespace,
Fangrui Song6907ce22018-07-30 19:24:48 +00002203 ConflictingDecls.data(),
Douglas Gregorf18a2c72010-02-21 18:26:36 +00002204 ConflictingDecls.size());
Balazs Keri3b30d652018-10-19 13:32:20 +00002205 if (!Name)
2206 return make_error<ImportError>(ImportError::NameConflict);
Douglas Gregorf18a2c72010-02-21 18:26:36 +00002207 }
2208 }
Fangrui Song6907ce22018-07-30 19:24:48 +00002209
Balazs Keri3b30d652018-10-19 13:32:20 +00002210 ExpectedSLoc BeginLocOrErr = import(D->getBeginLoc());
2211 if (!BeginLocOrErr)
2212 return BeginLocOrErr.takeError();
2213
Douglas Gregorf18a2c72010-02-21 18:26:36 +00002214 // Create the "to" namespace, if needed.
2215 NamespaceDecl *ToNamespace = MergeWithNamespace;
2216 if (!ToNamespace) {
Gabor Marton26f72a92018-07-12 09:42:05 +00002217 if (GetImportedOrCreateDecl(
2218 ToNamespace, D, Importer.getToContext(), DC, D->isInline(),
Balazs Keri3b30d652018-10-19 13:32:20 +00002219 *BeginLocOrErr, Loc, Name.getAsIdentifierInfo(),
Gabor Marton26f72a92018-07-12 09:42:05 +00002220 /*PrevDecl=*/nullptr))
2221 return ToNamespace;
Douglas Gregorf18a2c72010-02-21 18:26:36 +00002222 ToNamespace->setLexicalDeclContext(LexicalDC);
Sean Callanan95e74be2011-10-21 02:57:43 +00002223 LexicalDC->addDeclInternal(ToNamespace);
Fangrui Song6907ce22018-07-30 19:24:48 +00002224
Douglas Gregorf18a2c72010-02-21 18:26:36 +00002225 // If this is an anonymous namespace, register it as the anonymous
2226 // namespace within its context.
2227 if (!Name) {
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002228 if (auto *TU = dyn_cast<TranslationUnitDecl>(DC))
Douglas Gregorf18a2c72010-02-21 18:26:36 +00002229 TU->setAnonymousNamespace(ToNamespace);
2230 else
2231 cast<NamespaceDecl>(DC)->setAnonymousNamespace(ToNamespace);
2232 }
2233 }
Gabor Marton26f72a92018-07-12 09:42:05 +00002234 Importer.MapImported(D, ToNamespace);
Fangrui Song6907ce22018-07-30 19:24:48 +00002235
Balazs Keri3b30d652018-10-19 13:32:20 +00002236 if (Error Err = ImportDeclContext(D))
2237 return std::move(Err);
Fangrui Song6907ce22018-07-30 19:24:48 +00002238
Douglas Gregorf18a2c72010-02-21 18:26:36 +00002239 return ToNamespace;
2240}
2241
Balazs Keri3b30d652018-10-19 13:32:20 +00002242ExpectedDecl ASTNodeImporter::VisitNamespaceAliasDecl(NamespaceAliasDecl *D) {
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00002243 // Import the major distinguishing characteristics of this namespace.
2244 DeclContext *DC, *LexicalDC;
2245 DeclarationName Name;
2246 SourceLocation Loc;
2247 NamedDecl *LookupD;
Balazs Keri3b30d652018-10-19 13:32:20 +00002248 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, LookupD, Loc))
2249 return std::move(Err);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00002250 if (LookupD)
2251 return LookupD;
2252
2253 // NOTE: No conflict resolution is done for namespace aliases now.
2254
Balazs Keri3b30d652018-10-19 13:32:20 +00002255 SourceLocation ToNamespaceLoc, ToAliasLoc, ToTargetNameLoc;
2256 NestedNameSpecifierLoc ToQualifierLoc;
2257 NamespaceDecl *ToNamespace;
2258 if (auto Imp = importSeq(
2259 D->getNamespaceLoc(), D->getAliasLoc(), D->getQualifierLoc(),
2260 D->getTargetNameLoc(), D->getNamespace()))
2261 std::tie(
2262 ToNamespaceLoc, ToAliasLoc, ToQualifierLoc, ToTargetNameLoc,
2263 ToNamespace) = *Imp;
2264 else
2265 return Imp.takeError();
2266 IdentifierInfo *ToIdentifier = Importer.Import(D->getIdentifier());
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00002267
Gabor Marton26f72a92018-07-12 09:42:05 +00002268 NamespaceAliasDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00002269 if (GetImportedOrCreateDecl(
2270 ToD, D, Importer.getToContext(), DC, ToNamespaceLoc, ToAliasLoc,
2271 ToIdentifier, ToQualifierLoc, ToTargetNameLoc, ToNamespace))
Gabor Marton26f72a92018-07-12 09:42:05 +00002272 return ToD;
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00002273
2274 ToD->setLexicalDeclContext(LexicalDC);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00002275 LexicalDC->addDeclInternal(ToD);
2276
2277 return ToD;
2278}
2279
Balazs Keri3b30d652018-10-19 13:32:20 +00002280ExpectedDecl
2281ASTNodeImporter::VisitTypedefNameDecl(TypedefNameDecl *D, bool IsAlias) {
Douglas Gregor5fa74c32010-02-10 21:10:29 +00002282 // Import the major distinguishing characteristics of this typedef.
2283 DeclContext *DC, *LexicalDC;
2284 DeclarationName Name;
2285 SourceLocation Loc;
Sean Callanan59721b32015-04-28 18:41:46 +00002286 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00002287 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
2288 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00002289 if (ToD)
2290 return ToD;
Craig Topper36250ad2014-05-12 05:36:57 +00002291
Douglas Gregor5fa74c32010-02-10 21:10:29 +00002292 // If this typedef is not in block scope, determine whether we've
2293 // seen a typedef with the same name (that we can merge with) or any
2294 // other entity by that name (which name lookup could conflict with).
2295 if (!DC->isFunctionOrMethod()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002296 SmallVector<NamedDecl *, 4> ConflictingDecls;
Douglas Gregor5fa74c32010-02-10 21:10:29 +00002297 unsigned IDNS = Decl::IDNS_Ordinary;
Gabor Marton54058b52018-12-17 13:53:12 +00002298 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002299 for (auto *FoundDecl : FoundDecls) {
2300 if (!FoundDecl->isInIdentifierNamespace(IDNS))
Douglas Gregor5fa74c32010-02-10 21:10:29 +00002301 continue;
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002302 if (auto *FoundTypedef = dyn_cast<TypedefNameDecl>(FoundDecl)) {
Gabor Martonb93baf62018-11-27 09:51:36 +00002303 QualType FromUT = D->getUnderlyingType();
2304 QualType FoundUT = FoundTypedef->getUnderlyingType();
2305 if (Importer.IsStructurallyEquivalent(FromUT, FoundUT)) {
2306 // If the "From" context has a complete underlying type but we
2307 // already have a complete underlying type then return with that.
2308 if (!FromUT->isIncompleteType() && !FoundUT->isIncompleteType())
Balazs Keri3b30d652018-10-19 13:32:20 +00002309 return Importer.MapImported(D, FoundTypedef);
Gabor Martonb93baf62018-11-27 09:51:36 +00002310 }
2311 // FIXME Handle redecl chain.
2312 break;
Douglas Gregor5fa74c32010-02-10 21:10:29 +00002313 }
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00002314
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002315 ConflictingDecls.push_back(FoundDecl);
Douglas Gregor5fa74c32010-02-10 21:10:29 +00002316 }
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00002317
Douglas Gregor5fa74c32010-02-10 21:10:29 +00002318 if (!ConflictingDecls.empty()) {
2319 Name = Importer.HandleNameConflict(Name, DC, IDNS,
Fangrui Song6907ce22018-07-30 19:24:48 +00002320 ConflictingDecls.data(),
Douglas Gregor5fa74c32010-02-10 21:10:29 +00002321 ConflictingDecls.size());
2322 if (!Name)
Balazs Keri3b30d652018-10-19 13:32:20 +00002323 return make_error<ImportError>(ImportError::NameConflict);
Douglas Gregor5fa74c32010-02-10 21:10:29 +00002324 }
2325 }
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00002326
Balazs Keri3b30d652018-10-19 13:32:20 +00002327 QualType ToUnderlyingType;
2328 TypeSourceInfo *ToTypeSourceInfo;
2329 SourceLocation ToBeginLoc;
2330 if (auto Imp = importSeq(
2331 D->getUnderlyingType(), D->getTypeSourceInfo(), D->getBeginLoc()))
2332 std::tie(ToUnderlyingType, ToTypeSourceInfo, ToBeginLoc) = *Imp;
2333 else
2334 return Imp.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00002335
Douglas Gregor5fa74c32010-02-10 21:10:29 +00002336 // Create the new typedef node.
Balazs Keri3b30d652018-10-19 13:32:20 +00002337 // FIXME: ToUnderlyingType is not used.
Richard Smithdda56e42011-04-15 14:24:37 +00002338 TypedefNameDecl *ToTypedef;
Gabor Marton26f72a92018-07-12 09:42:05 +00002339 if (IsAlias) {
2340 if (GetImportedOrCreateDecl<TypeAliasDecl>(
Balazs Keri3b30d652018-10-19 13:32:20 +00002341 ToTypedef, D, Importer.getToContext(), DC, ToBeginLoc, Loc,
2342 Name.getAsIdentifierInfo(), ToTypeSourceInfo))
Gabor Marton26f72a92018-07-12 09:42:05 +00002343 return ToTypedef;
2344 } else if (GetImportedOrCreateDecl<TypedefDecl>(
Balazs Keri3b30d652018-10-19 13:32:20 +00002345 ToTypedef, D, Importer.getToContext(), DC, ToBeginLoc, Loc,
2346 Name.getAsIdentifierInfo(), ToTypeSourceInfo))
Gabor Marton26f72a92018-07-12 09:42:05 +00002347 return ToTypedef;
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00002348
Douglas Gregordd483172010-02-22 17:42:47 +00002349 ToTypedef->setAccess(D->getAccess());
Douglas Gregor5fa74c32010-02-10 21:10:29 +00002350 ToTypedef->setLexicalDeclContext(LexicalDC);
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00002351
2352 // Templated declarations should not appear in DeclContext.
2353 TypeAliasDecl *FromAlias = IsAlias ? cast<TypeAliasDecl>(D) : nullptr;
2354 if (!FromAlias || !FromAlias->getDescribedAliasTemplate())
2355 LexicalDC->addDeclInternal(ToTypedef);
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00002356
Douglas Gregor5fa74c32010-02-10 21:10:29 +00002357 return ToTypedef;
2358}
2359
Balazs Keri3b30d652018-10-19 13:32:20 +00002360ExpectedDecl ASTNodeImporter::VisitTypedefDecl(TypedefDecl *D) {
Richard Smithdda56e42011-04-15 14:24:37 +00002361 return VisitTypedefNameDecl(D, /*IsAlias=*/false);
2362}
2363
Balazs Keri3b30d652018-10-19 13:32:20 +00002364ExpectedDecl ASTNodeImporter::VisitTypeAliasDecl(TypeAliasDecl *D) {
Richard Smithdda56e42011-04-15 14:24:37 +00002365 return VisitTypedefNameDecl(D, /*IsAlias=*/true);
2366}
2367
Balazs Keri3b30d652018-10-19 13:32:20 +00002368ExpectedDecl
2369ASTNodeImporter::VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D) {
Gabor Horvath7a91c082017-11-14 11:30:38 +00002370 // Import the major distinguishing characteristics of this typedef.
2371 DeclContext *DC, *LexicalDC;
2372 DeclarationName Name;
2373 SourceLocation Loc;
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00002374 NamedDecl *FoundD;
Balazs Keri3b30d652018-10-19 13:32:20 +00002375 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, FoundD, Loc))
2376 return std::move(Err);
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00002377 if (FoundD)
2378 return FoundD;
Gabor Horvath7a91c082017-11-14 11:30:38 +00002379
2380 // If this typedef is not in block scope, determine whether we've
2381 // seen a typedef with the same name (that we can merge with) or any
2382 // other entity by that name (which name lookup could conflict with).
2383 if (!DC->isFunctionOrMethod()) {
2384 SmallVector<NamedDecl *, 4> ConflictingDecls;
2385 unsigned IDNS = Decl::IDNS_Ordinary;
Gabor Marton54058b52018-12-17 13:53:12 +00002386 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002387 for (auto *FoundDecl : FoundDecls) {
2388 if (!FoundDecl->isInIdentifierNamespace(IDNS))
Gabor Horvath7a91c082017-11-14 11:30:38 +00002389 continue;
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002390 if (auto *FoundAlias = dyn_cast<TypeAliasTemplateDecl>(FoundDecl))
Gabor Marton26f72a92018-07-12 09:42:05 +00002391 return Importer.MapImported(D, FoundAlias);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002392 ConflictingDecls.push_back(FoundDecl);
Gabor Horvath7a91c082017-11-14 11:30:38 +00002393 }
2394
2395 if (!ConflictingDecls.empty()) {
2396 Name = Importer.HandleNameConflict(Name, DC, IDNS,
2397 ConflictingDecls.data(),
2398 ConflictingDecls.size());
2399 if (!Name)
Balazs Keri3b30d652018-10-19 13:32:20 +00002400 return make_error<ImportError>(ImportError::NameConflict);
Gabor Horvath7a91c082017-11-14 11:30:38 +00002401 }
2402 }
2403
Balazs Keri3b30d652018-10-19 13:32:20 +00002404 TemplateParameterList *ToTemplateParameters;
2405 TypeAliasDecl *ToTemplatedDecl;
2406 if (auto Imp = importSeq(D->getTemplateParameters(), D->getTemplatedDecl()))
2407 std::tie(ToTemplateParameters, ToTemplatedDecl) = *Imp;
2408 else
2409 return Imp.takeError();
Gabor Horvath7a91c082017-11-14 11:30:38 +00002410
Gabor Marton26f72a92018-07-12 09:42:05 +00002411 TypeAliasTemplateDecl *ToAlias;
2412 if (GetImportedOrCreateDecl(ToAlias, D, Importer.getToContext(), DC, Loc,
Balazs Keri3b30d652018-10-19 13:32:20 +00002413 Name, ToTemplateParameters, ToTemplatedDecl))
Gabor Marton26f72a92018-07-12 09:42:05 +00002414 return ToAlias;
Gabor Horvath7a91c082017-11-14 11:30:38 +00002415
Balazs Keri3b30d652018-10-19 13:32:20 +00002416 ToTemplatedDecl->setDescribedAliasTemplate(ToAlias);
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00002417
Gabor Horvath7a91c082017-11-14 11:30:38 +00002418 ToAlias->setAccess(D->getAccess());
2419 ToAlias->setLexicalDeclContext(LexicalDC);
Gabor Horvath7a91c082017-11-14 11:30:38 +00002420 LexicalDC->addDeclInternal(ToAlias);
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00002421 return ToAlias;
Gabor Horvath7a91c082017-11-14 11:30:38 +00002422}
2423
Balazs Keri3b30d652018-10-19 13:32:20 +00002424ExpectedDecl ASTNodeImporter::VisitLabelDecl(LabelDecl *D) {
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00002425 // Import the major distinguishing characteristics of this label.
2426 DeclContext *DC, *LexicalDC;
2427 DeclarationName Name;
2428 SourceLocation Loc;
2429 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00002430 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
2431 return std::move(Err);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00002432 if (ToD)
2433 return ToD;
2434
2435 assert(LexicalDC->isFunctionOrMethod());
2436
Gabor Marton26f72a92018-07-12 09:42:05 +00002437 LabelDecl *ToLabel;
Balazs Keri3b30d652018-10-19 13:32:20 +00002438 if (D->isGnuLocal()) {
2439 ExpectedSLoc BeginLocOrErr = import(D->getBeginLoc());
2440 if (!BeginLocOrErr)
2441 return BeginLocOrErr.takeError();
2442 if (GetImportedOrCreateDecl(ToLabel, D, Importer.getToContext(), DC, Loc,
2443 Name.getAsIdentifierInfo(), *BeginLocOrErr))
2444 return ToLabel;
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00002445
Balazs Keri3b30d652018-10-19 13:32:20 +00002446 } else {
2447 if (GetImportedOrCreateDecl(ToLabel, D, Importer.getToContext(), DC, Loc,
2448 Name.getAsIdentifierInfo()))
2449 return ToLabel;
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00002450
Balazs Keri3b30d652018-10-19 13:32:20 +00002451 }
2452
2453 Expected<LabelStmt *> ToStmtOrErr = import(D->getStmt());
2454 if (!ToStmtOrErr)
2455 return ToStmtOrErr.takeError();
2456
2457 ToLabel->setStmt(*ToStmtOrErr);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00002458 ToLabel->setLexicalDeclContext(LexicalDC);
2459 LexicalDC->addDeclInternal(ToLabel);
2460 return ToLabel;
2461}
2462
Balazs Keri3b30d652018-10-19 13:32:20 +00002463ExpectedDecl ASTNodeImporter::VisitEnumDecl(EnumDecl *D) {
Douglas Gregor98c10182010-02-12 22:17:39 +00002464 // Import the major distinguishing characteristics of this enum.
2465 DeclContext *DC, *LexicalDC;
2466 DeclarationName Name;
2467 SourceLocation Loc;
Sean Callanan59721b32015-04-28 18:41:46 +00002468 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00002469 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
2470 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00002471 if (ToD)
2472 return ToD;
Craig Topper36250ad2014-05-12 05:36:57 +00002473
Douglas Gregor98c10182010-02-12 22:17:39 +00002474 // Figure out what enum name we're looking for.
2475 unsigned IDNS = Decl::IDNS_Tag;
2476 DeclarationName SearchName = Name;
Richard Smithdda56e42011-04-15 14:24:37 +00002477 if (!SearchName && D->getTypedefNameForAnonDecl()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00002478 if (Error Err = importInto(
2479 SearchName, D->getTypedefNameForAnonDecl()->getDeclName()))
2480 return std::move(Err);
Douglas Gregor98c10182010-02-12 22:17:39 +00002481 IDNS = Decl::IDNS_Ordinary;
David Blaikiebbafb8a2012-03-11 07:00:24 +00002482 } else if (Importer.getToContext().getLangOpts().CPlusPlus)
Douglas Gregor98c10182010-02-12 22:17:39 +00002483 IDNS |= Decl::IDNS_Ordinary;
Fangrui Song6907ce22018-07-30 19:24:48 +00002484
Douglas Gregor98c10182010-02-12 22:17:39 +00002485 // We may already have an enum of the same name; try to find and match it.
2486 if (!DC->isFunctionOrMethod() && SearchName) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002487 SmallVector<NamedDecl *, 4> ConflictingDecls;
Gabor Marton54058b52018-12-17 13:53:12 +00002488 auto FoundDecls =
2489 Importer.findDeclsInToCtx(DC, SearchName);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002490 for (auto *FoundDecl : FoundDecls) {
2491 if (!FoundDecl->isInIdentifierNamespace(IDNS))
Douglas Gregor98c10182010-02-12 22:17:39 +00002492 continue;
Fangrui Song6907ce22018-07-30 19:24:48 +00002493
Balazs Keri3b30d652018-10-19 13:32:20 +00002494 if (auto *Typedef = dyn_cast<TypedefNameDecl>(FoundDecl)) {
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002495 if (const auto *Tag = Typedef->getUnderlyingType()->getAs<TagType>())
Balazs Keri3b30d652018-10-19 13:32:20 +00002496 FoundDecl = Tag->getDecl();
Douglas Gregor98c10182010-02-12 22:17:39 +00002497 }
Fangrui Song6907ce22018-07-30 19:24:48 +00002498
Balazs Keri3b30d652018-10-19 13:32:20 +00002499 if (auto *FoundEnum = dyn_cast<EnumDecl>(FoundDecl)) {
Douglas Gregor8cdbe642010-02-12 23:44:20 +00002500 if (IsStructuralMatch(D, FoundEnum))
Gabor Marton26f72a92018-07-12 09:42:05 +00002501 return Importer.MapImported(D, FoundEnum);
Douglas Gregor98c10182010-02-12 22:17:39 +00002502 }
Fangrui Song6907ce22018-07-30 19:24:48 +00002503
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002504 ConflictingDecls.push_back(FoundDecl);
Douglas Gregor98c10182010-02-12 22:17:39 +00002505 }
Fangrui Song6907ce22018-07-30 19:24:48 +00002506
Douglas Gregor98c10182010-02-12 22:17:39 +00002507 if (!ConflictingDecls.empty()) {
2508 Name = Importer.HandleNameConflict(Name, DC, IDNS,
Fangrui Song6907ce22018-07-30 19:24:48 +00002509 ConflictingDecls.data(),
Douglas Gregor98c10182010-02-12 22:17:39 +00002510 ConflictingDecls.size());
Balazs Keri3b30d652018-10-19 13:32:20 +00002511 if (!Name)
2512 return make_error<ImportError>(ImportError::NameConflict);
Douglas Gregor98c10182010-02-12 22:17:39 +00002513 }
2514 }
Gabor Marton26f72a92018-07-12 09:42:05 +00002515
Balazs Keri3b30d652018-10-19 13:32:20 +00002516 SourceLocation ToBeginLoc;
2517 NestedNameSpecifierLoc ToQualifierLoc;
2518 QualType ToIntegerType;
2519 if (auto Imp = importSeq(
2520 D->getBeginLoc(), D->getQualifierLoc(), D->getIntegerType()))
2521 std::tie(ToBeginLoc, ToQualifierLoc, ToIntegerType) = *Imp;
2522 else
2523 return Imp.takeError();
2524
Douglas Gregor98c10182010-02-12 22:17:39 +00002525 // Create the enum declaration.
Gabor Marton26f72a92018-07-12 09:42:05 +00002526 EnumDecl *D2;
2527 if (GetImportedOrCreateDecl(
Balazs Keri3b30d652018-10-19 13:32:20 +00002528 D2, D, Importer.getToContext(), DC, ToBeginLoc,
Gabor Marton26f72a92018-07-12 09:42:05 +00002529 Loc, Name.getAsIdentifierInfo(), nullptr, D->isScoped(),
2530 D->isScopedUsingClassTag(), D->isFixed()))
2531 return D2;
2532
Balazs Keri3b30d652018-10-19 13:32:20 +00002533 D2->setQualifierInfo(ToQualifierLoc);
2534 D2->setIntegerType(ToIntegerType);
Douglas Gregordd483172010-02-22 17:42:47 +00002535 D2->setAccess(D->getAccess());
Douglas Gregor3996e242010-02-15 22:01:00 +00002536 D2->setLexicalDeclContext(LexicalDC);
Sean Callanan95e74be2011-10-21 02:57:43 +00002537 LexicalDC->addDeclInternal(D2);
Douglas Gregor98c10182010-02-12 22:17:39 +00002538
Douglas Gregor98c10182010-02-12 22:17:39 +00002539 // Import the definition
Balazs Keri3b30d652018-10-19 13:32:20 +00002540 if (D->isCompleteDefinition())
2541 if (Error Err = ImportDefinition(D, D2))
2542 return std::move(Err);
Douglas Gregor98c10182010-02-12 22:17:39 +00002543
Douglas Gregor3996e242010-02-15 22:01:00 +00002544 return D2;
Douglas Gregor98c10182010-02-12 22:17:39 +00002545}
2546
Balazs Keri3b30d652018-10-19 13:32:20 +00002547ExpectedDecl ASTNodeImporter::VisitRecordDecl(RecordDecl *D) {
Balazs Keri0c23dc52018-08-13 13:08:37 +00002548 bool IsFriendTemplate = false;
2549 if (auto *DCXX = dyn_cast<CXXRecordDecl>(D)) {
2550 IsFriendTemplate =
2551 DCXX->getDescribedClassTemplate() &&
2552 DCXX->getDescribedClassTemplate()->getFriendObjectKind() !=
2553 Decl::FOK_None;
2554 }
2555
Douglas Gregor5c73e912010-02-11 00:48:18 +00002556 // Import the major distinguishing characteristics of this record.
2557 DeclContext *DC, *LexicalDC;
2558 DeclarationName Name;
2559 SourceLocation Loc;
Sean Callanan59721b32015-04-28 18:41:46 +00002560 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00002561 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
2562 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00002563 if (ToD)
2564 return ToD;
Craig Topper36250ad2014-05-12 05:36:57 +00002565
Douglas Gregor5c73e912010-02-11 00:48:18 +00002566 // Figure out what structure name we're looking for.
2567 unsigned IDNS = Decl::IDNS_Tag;
2568 DeclarationName SearchName = Name;
Richard Smithdda56e42011-04-15 14:24:37 +00002569 if (!SearchName && D->getTypedefNameForAnonDecl()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00002570 if (Error Err = importInto(
2571 SearchName, D->getTypedefNameForAnonDecl()->getDeclName()))
2572 return std::move(Err);
Douglas Gregor5c73e912010-02-11 00:48:18 +00002573 IDNS = Decl::IDNS_Ordinary;
David Blaikiebbafb8a2012-03-11 07:00:24 +00002574 } else if (Importer.getToContext().getLangOpts().CPlusPlus)
Gabor Marton7df342a2018-12-17 12:42:12 +00002575 IDNS |= Decl::IDNS_Ordinary | Decl::IDNS_TagFriend;
Douglas Gregor5c73e912010-02-11 00:48:18 +00002576
2577 // We may already have a record of the same name; try to find and match it.
Sean Callanan9092d472017-05-13 00:46:33 +00002578 RecordDecl *PrevDecl = nullptr;
Douglas Gregordd6006f2012-07-17 21:16:27 +00002579 if (!DC->isFunctionOrMethod()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002580 SmallVector<NamedDecl *, 4> ConflictingDecls;
Gabor Marton54058b52018-12-17 13:53:12 +00002581 auto FoundDecls =
2582 Importer.findDeclsInToCtx(DC, SearchName);
Sean Callanan9092d472017-05-13 00:46:33 +00002583 if (!FoundDecls.empty()) {
Gabor Marton41e38922019-03-05 11:23:24 +00002584 // We're going to have to compare D against potentially conflicting Decls,
2585 // so complete it.
Sean Callanan9092d472017-05-13 00:46:33 +00002586 if (D->hasExternalLexicalStorage() && !D->isCompleteDefinition())
2587 D->getASTContext().getExternalSource()->CompleteType(D);
2588 }
2589
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002590 for (auto *FoundDecl : FoundDecls) {
2591 if (!FoundDecl->isInIdentifierNamespace(IDNS))
Douglas Gregor5c73e912010-02-11 00:48:18 +00002592 continue;
Fangrui Song6907ce22018-07-30 19:24:48 +00002593
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002594 Decl *Found = FoundDecl;
2595 if (auto *Typedef = dyn_cast<TypedefNameDecl>(Found)) {
2596 if (const auto *Tag = Typedef->getUnderlyingType()->getAs<TagType>())
Douglas Gregor5c73e912010-02-11 00:48:18 +00002597 Found = Tag->getDecl();
2598 }
Gabor Martona0df7a92018-05-30 09:19:26 +00002599
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002600 if (auto *FoundRecord = dyn_cast<RecordDecl>(Found)) {
Gabor Marton7df342a2018-12-17 12:42:12 +00002601 // Do not emit false positive diagnostic in case of unnamed
2602 // struct/union and in case of anonymous structs. Would be false
2603 // because there may be several anonymous/unnamed structs in a class.
2604 // E.g. these are both valid:
2605 // struct A { // unnamed structs
2606 // struct { struct A *next; } entry0;
2607 // struct { struct A *next; } entry1;
2608 // };
2609 // struct X { struct { int a; }; struct { int b; }; }; // anon structs
2610 if (!SearchName)
Gabor Marton0bebf952018-07-05 09:51:13 +00002611 if (!IsStructuralMatch(D, FoundRecord, false))
2612 continue;
Douglas Gregorceb32bf2012-10-26 16:45:11 +00002613
Gabor Marton7df342a2018-12-17 12:42:12 +00002614 if (IsStructuralMatch(D, FoundRecord)) {
2615 RecordDecl *FoundDef = FoundRecord->getDefinition();
2616 if (D->isThisDeclarationADefinition() && FoundDef) {
Balazs Keri1d20cc22018-07-16 12:16:39 +00002617 // FIXME: Structural equivalence check should check for same
2618 // user-defined methods.
2619 Importer.MapImported(D, FoundDef);
2620 if (const auto *DCXX = dyn_cast<CXXRecordDecl>(D)) {
2621 auto *FoundCXX = dyn_cast<CXXRecordDecl>(FoundDef);
2622 assert(FoundCXX && "Record type mismatch");
2623
Gabor Marton7df342a2018-12-17 12:42:12 +00002624 if (!Importer.isMinimalImport())
Balazs Keri1d20cc22018-07-16 12:16:39 +00002625 // FoundDef may not have every implicit method that D has
2626 // because implicit methods are created only if they are used.
Balazs Keri3b30d652018-10-19 13:32:20 +00002627 if (Error Err = ImportImplicitMethods(DCXX, FoundCXX))
2628 return std::move(Err);
Balazs Keri1d20cc22018-07-16 12:16:39 +00002629 }
Douglas Gregor25791052010-02-12 00:09:27 +00002630 }
Gabor Marton7df342a2018-12-17 12:42:12 +00002631 PrevDecl = FoundRecord->getMostRecentDecl();
2632 break;
Douglas Gregordd6006f2012-07-17 21:16:27 +00002633 }
Gabor Marton7df342a2018-12-17 12:42:12 +00002634 }
Fangrui Song6907ce22018-07-30 19:24:48 +00002635
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002636 ConflictingDecls.push_back(FoundDecl);
Gabor Marton7df342a2018-12-17 12:42:12 +00002637 } // for
Fangrui Song6907ce22018-07-30 19:24:48 +00002638
Douglas Gregordd6006f2012-07-17 21:16:27 +00002639 if (!ConflictingDecls.empty() && SearchName) {
Douglas Gregor5c73e912010-02-11 00:48:18 +00002640 Name = Importer.HandleNameConflict(Name, DC, IDNS,
Fangrui Song6907ce22018-07-30 19:24:48 +00002641 ConflictingDecls.data(),
Douglas Gregor5c73e912010-02-11 00:48:18 +00002642 ConflictingDecls.size());
Balazs Keri3b30d652018-10-19 13:32:20 +00002643 if (!Name)
2644 return make_error<ImportError>(ImportError::NameConflict);
Douglas Gregor5c73e912010-02-11 00:48:18 +00002645 }
2646 }
Fangrui Song6907ce22018-07-30 19:24:48 +00002647
Balazs Keri3b30d652018-10-19 13:32:20 +00002648 ExpectedSLoc BeginLocOrErr = import(D->getBeginLoc());
2649 if (!BeginLocOrErr)
2650 return BeginLocOrErr.takeError();
2651
Douglas Gregor5c73e912010-02-11 00:48:18 +00002652 // Create the record declaration.
Gabor Marton7df342a2018-12-17 12:42:12 +00002653 RecordDecl *D2 = nullptr;
2654 CXXRecordDecl *D2CXX = nullptr;
2655 if (auto *DCXX = dyn_cast<CXXRecordDecl>(D)) {
2656 if (DCXX->isLambda()) {
2657 auto TInfoOrErr = import(DCXX->getLambdaTypeInfo());
2658 if (!TInfoOrErr)
2659 return TInfoOrErr.takeError();
2660 if (GetImportedOrCreateSpecialDecl(
2661 D2CXX, CXXRecordDecl::CreateLambda, D, Importer.getToContext(),
2662 DC, *TInfoOrErr, Loc, DCXX->isDependentLambda(),
2663 DCXX->isGenericLambda(), DCXX->getLambdaCaptureDefault()))
2664 return D2CXX;
2665 ExpectedDecl CDeclOrErr = import(DCXX->getLambdaContextDecl());
2666 if (!CDeclOrErr)
2667 return CDeclOrErr.takeError();
2668 D2CXX->setLambdaMangling(DCXX->getLambdaManglingNumber(), *CDeclOrErr);
2669 } else if (DCXX->isInjectedClassName()) {
2670 // We have to be careful to do a similar dance to the one in
2671 // Sema::ActOnStartCXXMemberDeclarations
2672 const bool DelayTypeCreation = true;
2673 if (GetImportedOrCreateDecl(
2674 D2CXX, D, Importer.getToContext(), D->getTagKind(), DC,
2675 *BeginLocOrErr, Loc, Name.getAsIdentifierInfo(),
2676 cast_or_null<CXXRecordDecl>(PrevDecl), DelayTypeCreation))
2677 return D2CXX;
2678 Importer.getToContext().getTypeDeclType(
2679 D2CXX, dyn_cast<CXXRecordDecl>(DC));
2680 } else {
2681 if (GetImportedOrCreateDecl(D2CXX, D, Importer.getToContext(),
2682 D->getTagKind(), DC, *BeginLocOrErr, Loc,
2683 Name.getAsIdentifierInfo(),
2684 cast_or_null<CXXRecordDecl>(PrevDecl)))
2685 return D2CXX;
2686 }
Gabor Marton26f72a92018-07-12 09:42:05 +00002687
Gabor Marton7df342a2018-12-17 12:42:12 +00002688 D2 = D2CXX;
2689 D2->setAccess(D->getAccess());
2690 D2->setLexicalDeclContext(LexicalDC);
2691 if (!DCXX->getDescribedClassTemplate() || DCXX->isImplicit())
2692 LexicalDC->addDeclInternal(D2);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00002693
Gabor Marton7df342a2018-12-17 12:42:12 +00002694 if (LexicalDC != DC && D->isInIdentifierNamespace(Decl::IDNS_TagFriend))
2695 DC->makeDeclVisibleInContext(D2);
2696
2697 if (ClassTemplateDecl *FromDescribed =
2698 DCXX->getDescribedClassTemplate()) {
2699 ClassTemplateDecl *ToDescribed;
2700 if (Error Err = importInto(ToDescribed, FromDescribed))
2701 return std::move(Err);
2702 D2CXX->setDescribedClassTemplate(ToDescribed);
2703 if (!DCXX->isInjectedClassName() && !IsFriendTemplate) {
2704 // In a record describing a template the type should be an
2705 // InjectedClassNameType (see Sema::CheckClassTemplate). Update the
2706 // previously set type to the correct value here (ToDescribed is not
2707 // available at record create).
2708 // FIXME: The previous type is cleared but not removed from
2709 // ASTContext's internal storage.
2710 CXXRecordDecl *Injected = nullptr;
2711 for (NamedDecl *Found : D2CXX->noload_lookup(Name)) {
2712 auto *Record = dyn_cast<CXXRecordDecl>(Found);
2713 if (Record && Record->isInjectedClassName()) {
2714 Injected = Record;
2715 break;
Gabor Marton5915777e2018-06-26 13:44:24 +00002716 }
2717 }
Gabor Marton7df342a2018-12-17 12:42:12 +00002718 // Create an injected type for the whole redecl chain.
2719 SmallVector<Decl *, 2> Redecls =
2720 getCanonicalForwardRedeclChain(D2CXX);
2721 for (auto *R : Redecls) {
2722 auto *RI = cast<CXXRecordDecl>(R);
2723 RI->setTypeForDecl(nullptr);
2724 // Below we create a new injected type and assign that to the
2725 // canonical decl, subsequent declarations in the chain will reuse
2726 // that type.
2727 Importer.getToContext().getInjectedClassNameType(
2728 RI, ToDescribed->getInjectedClassNameSpecialization());
2729 }
2730 // Set the new type for the previous injected decl too.
2731 if (Injected) {
2732 Injected->setTypeForDecl(nullptr);
2733 Importer.getToContext().getTypeDeclType(Injected, D2CXX);
2734 }
2735 }
2736 } else if (MemberSpecializationInfo *MemberInfo =
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00002737 DCXX->getMemberSpecializationInfo()) {
2738 TemplateSpecializationKind SK =
2739 MemberInfo->getTemplateSpecializationKind();
2740 CXXRecordDecl *FromInst = DCXX->getInstantiatedFromMemberClass();
Balazs Keri3b30d652018-10-19 13:32:20 +00002741
2742 if (Expected<CXXRecordDecl *> ToInstOrErr = import(FromInst))
2743 D2CXX->setInstantiationOfMemberClass(*ToInstOrErr, SK);
2744 else
2745 return ToInstOrErr.takeError();
2746
2747 if (ExpectedSLoc POIOrErr =
2748 import(MemberInfo->getPointOfInstantiation()))
2749 D2CXX->getMemberSpecializationInfo()->setPointOfInstantiation(
2750 *POIOrErr);
2751 else
2752 return POIOrErr.takeError();
Douglas Gregor5c73e912010-02-11 00:48:18 +00002753 }
Gabor Marton26f72a92018-07-12 09:42:05 +00002754
Gabor Marton7df342a2018-12-17 12:42:12 +00002755 } else {
2756 if (GetImportedOrCreateDecl(D2, D, Importer.getToContext(),
2757 D->getTagKind(), DC, *BeginLocOrErr, Loc,
2758 Name.getAsIdentifierInfo(), PrevDecl))
2759 return D2;
2760 D2->setLexicalDeclContext(LexicalDC);
2761 LexicalDC->addDeclInternal(D2);
Douglas Gregor5c73e912010-02-11 00:48:18 +00002762 }
Gabor Marton26f72a92018-07-12 09:42:05 +00002763
Gabor Marton7df342a2018-12-17 12:42:12 +00002764 if (auto QualifierLocOrErr = import(D->getQualifierLoc()))
2765 D2->setQualifierInfo(*QualifierLocOrErr);
2766 else
2767 return QualifierLocOrErr.takeError();
2768
2769 if (D->isAnonymousStructOrUnion())
2770 D2->setAnonymousStructOrUnion(true);
Douglas Gregor25791052010-02-12 00:09:27 +00002771
Balazs Keri3b30d652018-10-19 13:32:20 +00002772 if (D->isCompleteDefinition())
2773 if (Error Err = ImportDefinition(D, D2, IDK_Default))
2774 return std::move(Err);
Craig Topper36250ad2014-05-12 05:36:57 +00002775
Douglas Gregor3996e242010-02-15 22:01:00 +00002776 return D2;
Douglas Gregor5c73e912010-02-11 00:48:18 +00002777}
2778
Balazs Keri3b30d652018-10-19 13:32:20 +00002779ExpectedDecl ASTNodeImporter::VisitEnumConstantDecl(EnumConstantDecl *D) {
Douglas Gregor98c10182010-02-12 22:17:39 +00002780 // Import the major distinguishing characteristics of this enumerator.
2781 DeclContext *DC, *LexicalDC;
2782 DeclarationName Name;
2783 SourceLocation Loc;
Sean Callanan59721b32015-04-28 18:41:46 +00002784 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00002785 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
2786 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00002787 if (ToD)
2788 return ToD;
Douglas Gregorb4964f72010-02-15 23:54:17 +00002789
Fangrui Song6907ce22018-07-30 19:24:48 +00002790 // Determine whether there are any other declarations with the same name and
Douglas Gregor98c10182010-02-12 22:17:39 +00002791 // in the same context.
2792 if (!LexicalDC->isFunctionOrMethod()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002793 SmallVector<NamedDecl *, 4> ConflictingDecls;
Douglas Gregor98c10182010-02-12 22:17:39 +00002794 unsigned IDNS = Decl::IDNS_Ordinary;
Gabor Marton54058b52018-12-17 13:53:12 +00002795 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002796 for (auto *FoundDecl : FoundDecls) {
2797 if (!FoundDecl->isInIdentifierNamespace(IDNS))
Douglas Gregor98c10182010-02-12 22:17:39 +00002798 continue;
Douglas Gregor91155082012-11-14 22:29:20 +00002799
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002800 if (auto *FoundEnumConstant = dyn_cast<EnumConstantDecl>(FoundDecl)) {
Douglas Gregor91155082012-11-14 22:29:20 +00002801 if (IsStructuralMatch(D, FoundEnumConstant))
Gabor Marton26f72a92018-07-12 09:42:05 +00002802 return Importer.MapImported(D, FoundEnumConstant);
Douglas Gregor91155082012-11-14 22:29:20 +00002803 }
2804
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002805 ConflictingDecls.push_back(FoundDecl);
Douglas Gregor98c10182010-02-12 22:17:39 +00002806 }
Fangrui Song6907ce22018-07-30 19:24:48 +00002807
Douglas Gregor98c10182010-02-12 22:17:39 +00002808 if (!ConflictingDecls.empty()) {
2809 Name = Importer.HandleNameConflict(Name, DC, IDNS,
Fangrui Song6907ce22018-07-30 19:24:48 +00002810 ConflictingDecls.data(),
Douglas Gregor98c10182010-02-12 22:17:39 +00002811 ConflictingDecls.size());
2812 if (!Name)
Balazs Keri3b30d652018-10-19 13:32:20 +00002813 return make_error<ImportError>(ImportError::NameConflict);
Douglas Gregor98c10182010-02-12 22:17:39 +00002814 }
2815 }
Fangrui Song6907ce22018-07-30 19:24:48 +00002816
Balazs Keri3b30d652018-10-19 13:32:20 +00002817 ExpectedType TypeOrErr = import(D->getType());
2818 if (!TypeOrErr)
2819 return TypeOrErr.takeError();
2820
2821 ExpectedExpr InitOrErr = import(D->getInitExpr());
2822 if (!InitOrErr)
2823 return InitOrErr.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00002824
Gabor Marton26f72a92018-07-12 09:42:05 +00002825 EnumConstantDecl *ToEnumerator;
2826 if (GetImportedOrCreateDecl(
2827 ToEnumerator, D, Importer.getToContext(), cast<EnumDecl>(DC), Loc,
Balazs Keri3b30d652018-10-19 13:32:20 +00002828 Name.getAsIdentifierInfo(), *TypeOrErr, *InitOrErr, D->getInitVal()))
Gabor Marton26f72a92018-07-12 09:42:05 +00002829 return ToEnumerator;
2830
Douglas Gregordd483172010-02-22 17:42:47 +00002831 ToEnumerator->setAccess(D->getAccess());
Douglas Gregor98c10182010-02-12 22:17:39 +00002832 ToEnumerator->setLexicalDeclContext(LexicalDC);
Sean Callanan95e74be2011-10-21 02:57:43 +00002833 LexicalDC->addDeclInternal(ToEnumerator);
Douglas Gregor98c10182010-02-12 22:17:39 +00002834 return ToEnumerator;
2835}
Douglas Gregor5c73e912010-02-11 00:48:18 +00002836
Balazs Keri3b30d652018-10-19 13:32:20 +00002837Error ASTNodeImporter::ImportTemplateInformation(
2838 FunctionDecl *FromFD, FunctionDecl *ToFD) {
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00002839 switch (FromFD->getTemplatedKind()) {
2840 case FunctionDecl::TK_NonTemplate:
2841 case FunctionDecl::TK_FunctionTemplate:
Balazs Keri3b30d652018-10-19 13:32:20 +00002842 return Error::success();
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00002843
2844 case FunctionDecl::TK_MemberSpecialization: {
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00002845 TemplateSpecializationKind TSK = FromFD->getTemplateSpecializationKind();
Balazs Keri3b30d652018-10-19 13:32:20 +00002846
2847 if (Expected<FunctionDecl *> InstFDOrErr =
2848 import(FromFD->getInstantiatedFromMemberFunction()))
2849 ToFD->setInstantiationOfMemberFunction(*InstFDOrErr, TSK);
2850 else
2851 return InstFDOrErr.takeError();
2852
2853 if (ExpectedSLoc POIOrErr = import(
2854 FromFD->getMemberSpecializationInfo()->getPointOfInstantiation()))
2855 ToFD->getMemberSpecializationInfo()->setPointOfInstantiation(*POIOrErr);
2856 else
2857 return POIOrErr.takeError();
2858
2859 return Error::success();
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00002860 }
2861
2862 case FunctionDecl::TK_FunctionTemplateSpecialization: {
Balazs Keri3b30d652018-10-19 13:32:20 +00002863 auto FunctionAndArgsOrErr =
Gabor Marton5254e642018-06-27 13:32:50 +00002864 ImportFunctionTemplateWithTemplateArgsFromSpecialization(FromFD);
Balazs Keri3b30d652018-10-19 13:32:20 +00002865 if (!FunctionAndArgsOrErr)
2866 return FunctionAndArgsOrErr.takeError();
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00002867
2868 TemplateArgumentList *ToTAList = TemplateArgumentList::CreateCopy(
Balazs Keri3b30d652018-10-19 13:32:20 +00002869 Importer.getToContext(), std::get<1>(*FunctionAndArgsOrErr));
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00002870
Gabor Marton5254e642018-06-27 13:32:50 +00002871 auto *FTSInfo = FromFD->getTemplateSpecializationInfo();
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00002872 TemplateArgumentListInfo ToTAInfo;
2873 const auto *FromTAArgsAsWritten = FTSInfo->TemplateArgumentsAsWritten;
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00002874 if (FromTAArgsAsWritten)
Balazs Keri3b30d652018-10-19 13:32:20 +00002875 if (Error Err = ImportTemplateArgumentListInfo(
2876 *FromTAArgsAsWritten, ToTAInfo))
2877 return Err;
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00002878
Balazs Keri3b30d652018-10-19 13:32:20 +00002879 ExpectedSLoc POIOrErr = import(FTSInfo->getPointOfInstantiation());
2880 if (!POIOrErr)
2881 return POIOrErr.takeError();
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00002882
Gabor Marton5254e642018-06-27 13:32:50 +00002883 TemplateSpecializationKind TSK = FTSInfo->getTemplateSpecializationKind();
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00002884 ToFD->setFunctionTemplateSpecialization(
Balazs Keri3b30d652018-10-19 13:32:20 +00002885 std::get<0>(*FunctionAndArgsOrErr), ToTAList, /* InsertPos= */ nullptr,
2886 TSK, FromTAArgsAsWritten ? &ToTAInfo : nullptr, *POIOrErr);
2887 return Error::success();
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00002888 }
2889
2890 case FunctionDecl::TK_DependentFunctionTemplateSpecialization: {
2891 auto *FromInfo = FromFD->getDependentSpecializationInfo();
2892 UnresolvedSet<8> TemplDecls;
2893 unsigned NumTemplates = FromInfo->getNumTemplates();
2894 for (unsigned I = 0; I < NumTemplates; I++) {
Balazs Keri3b30d652018-10-19 13:32:20 +00002895 if (Expected<FunctionTemplateDecl *> ToFTDOrErr =
2896 import(FromInfo->getTemplate(I)))
2897 TemplDecls.addDecl(*ToFTDOrErr);
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00002898 else
Balazs Keri3b30d652018-10-19 13:32:20 +00002899 return ToFTDOrErr.takeError();
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00002900 }
2901
2902 // Import TemplateArgumentListInfo.
2903 TemplateArgumentListInfo ToTAInfo;
Balazs Keri3b30d652018-10-19 13:32:20 +00002904 if (Error Err = ImportTemplateArgumentListInfo(
2905 FromInfo->getLAngleLoc(), FromInfo->getRAngleLoc(),
2906 llvm::makeArrayRef(
2907 FromInfo->getTemplateArgs(), FromInfo->getNumTemplateArgs()),
2908 ToTAInfo))
2909 return Err;
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00002910
2911 ToFD->setDependentTemplateSpecialization(Importer.getToContext(),
2912 TemplDecls, ToTAInfo);
Balazs Keri3b30d652018-10-19 13:32:20 +00002913 return Error::success();
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00002914 }
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00002915 }
Sam McCallfdc32072018-01-26 12:06:44 +00002916 llvm_unreachable("All cases should be covered!");
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00002917}
2918
Balazs Keri3b30d652018-10-19 13:32:20 +00002919Expected<FunctionDecl *>
Gabor Marton5254e642018-06-27 13:32:50 +00002920ASTNodeImporter::FindFunctionTemplateSpecialization(FunctionDecl *FromFD) {
Balazs Keri3b30d652018-10-19 13:32:20 +00002921 auto FunctionAndArgsOrErr =
Gabor Marton5254e642018-06-27 13:32:50 +00002922 ImportFunctionTemplateWithTemplateArgsFromSpecialization(FromFD);
Balazs Keri3b30d652018-10-19 13:32:20 +00002923 if (!FunctionAndArgsOrErr)
2924 return FunctionAndArgsOrErr.takeError();
Gabor Marton5254e642018-06-27 13:32:50 +00002925
Balazs Keri3b30d652018-10-19 13:32:20 +00002926 FunctionTemplateDecl *Template;
2927 TemplateArgsTy ToTemplArgs;
2928 std::tie(Template, ToTemplArgs) = *FunctionAndArgsOrErr;
Gabor Marton5254e642018-06-27 13:32:50 +00002929 void *InsertPos = nullptr;
Balazs Keri3b30d652018-10-19 13:32:20 +00002930 auto *FoundSpec = Template->findSpecialization(ToTemplArgs, InsertPos);
Gabor Marton5254e642018-06-27 13:32:50 +00002931 return FoundSpec;
2932}
2933
Shafik Yaghmour96b3d202019-01-28 21:55:33 +00002934Error ASTNodeImporter::ImportFunctionDeclBody(FunctionDecl *FromFD,
2935 FunctionDecl *ToFD) {
2936 if (Stmt *FromBody = FromFD->getBody()) {
2937 if (ExpectedStmt ToBodyOrErr = import(FromBody))
2938 ToFD->setBody(*ToBodyOrErr);
2939 else
2940 return ToBodyOrErr.takeError();
2941 }
2942 return Error::success();
2943}
2944
Gabor Marton458d1452019-02-14 13:07:03 +00002945template <typename T>
2946bool ASTNodeImporter::hasSameVisibilityContext(T *Found, T *From) {
2947 if (From->hasExternalFormalLinkage())
2948 return Found->hasExternalFormalLinkage();
2949 if (Importer.GetFromTU(Found) != From->getTranslationUnitDecl())
2950 return false;
2951 if (From->isInAnonymousNamespace())
2952 return Found->isInAnonymousNamespace();
2953 else
2954 return !Found->isInAnonymousNamespace() &&
2955 !Found->hasExternalFormalLinkage();
2956}
2957
Balazs Keri3b30d652018-10-19 13:32:20 +00002958ExpectedDecl ASTNodeImporter::VisitFunctionDecl(FunctionDecl *D) {
Gabor Marton5254e642018-06-27 13:32:50 +00002959
Balazs Keri3b30d652018-10-19 13:32:20 +00002960 SmallVector<Decl *, 2> Redecls = getCanonicalForwardRedeclChain(D);
Gabor Marton5254e642018-06-27 13:32:50 +00002961 auto RedeclIt = Redecls.begin();
2962 // Import the first part of the decl chain. I.e. import all previous
2963 // declarations starting from the canonical decl.
Balazs Keri3b30d652018-10-19 13:32:20 +00002964 for (; RedeclIt != Redecls.end() && *RedeclIt != D; ++RedeclIt) {
2965 ExpectedDecl ToRedeclOrErr = import(*RedeclIt);
2966 if (!ToRedeclOrErr)
2967 return ToRedeclOrErr.takeError();
2968 }
Gabor Marton5254e642018-06-27 13:32:50 +00002969 assert(*RedeclIt == D);
2970
Douglas Gregorbb7930c2010-02-10 19:54:31 +00002971 // Import the major distinguishing characteristics of this function.
2972 DeclContext *DC, *LexicalDC;
2973 DeclarationName Name;
Douglas Gregorbb7930c2010-02-10 19:54:31 +00002974 SourceLocation Loc;
Sean Callanan59721b32015-04-28 18:41:46 +00002975 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00002976 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
2977 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00002978 if (ToD)
2979 return ToD;
Abramo Bagnarad6d2f182010-08-11 22:01:17 +00002980
Shafik Yaghmour96b3d202019-01-28 21:55:33 +00002981 FunctionDecl *FoundByLookup = nullptr;
Balazs Keria35798d2018-07-17 09:52:41 +00002982 FunctionTemplateDecl *FromFT = D->getDescribedFunctionTemplate();
Gabor Horvathe350b0a2017-09-22 11:11:01 +00002983
Gabor Marton5254e642018-06-27 13:32:50 +00002984 // If this is a function template specialization, then try to find the same
Gabor Marton54058b52018-12-17 13:53:12 +00002985 // existing specialization in the "to" context. The lookup below will not
2986 // find any specialization, but would find the primary template; thus, we
2987 // have to skip normal lookup in case of specializations.
Gabor Marton5254e642018-06-27 13:32:50 +00002988 // FIXME handle member function templates (TK_MemberSpecialization) similarly?
2989 if (D->getTemplatedKind() ==
2990 FunctionDecl::TK_FunctionTemplateSpecialization) {
Balazs Keri3b30d652018-10-19 13:32:20 +00002991 auto FoundFunctionOrErr = FindFunctionTemplateSpecialization(D);
2992 if (!FoundFunctionOrErr)
2993 return FoundFunctionOrErr.takeError();
2994 if (FunctionDecl *FoundFunction = *FoundFunctionOrErr) {
2995 if (D->doesThisDeclarationHaveABody() && FoundFunction->hasBody())
2996 return Importer.MapImported(D, FoundFunction);
Gabor Marton5254e642018-06-27 13:32:50 +00002997 FoundByLookup = FoundFunction;
2998 }
2999 }
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003000 // Try to find a function in our own ("to") context with the same name, same
3001 // type, and in the same context as the function we're importing.
Gabor Marton5254e642018-06-27 13:32:50 +00003002 else if (!LexicalDC->isFunctionOrMethod()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003003 SmallVector<NamedDecl *, 4> ConflictingDecls;
Gabor Marton5254e642018-06-27 13:32:50 +00003004 unsigned IDNS = Decl::IDNS_Ordinary | Decl::IDNS_OrdinaryFriend;
Gabor Marton54058b52018-12-17 13:53:12 +00003005 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00003006 for (auto *FoundDecl : FoundDecls) {
3007 if (!FoundDecl->isInIdentifierNamespace(IDNS))
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003008 continue;
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00003009
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00003010 if (auto *FoundFunction = dyn_cast<FunctionDecl>(FoundDecl)) {
Gabor Marton458d1452019-02-14 13:07:03 +00003011 if (!hasSameVisibilityContext(FoundFunction, D))
3012 continue;
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00003013
Gabor Marton458d1452019-02-14 13:07:03 +00003014 if (IsStructuralMatch(D, FoundFunction)) {
3015 const FunctionDecl *Definition = nullptr;
3016 if (D->doesThisDeclarationHaveABody() &&
3017 FoundFunction->hasBody(Definition))
3018 return Importer.MapImported(D,
3019 const_cast<FunctionDecl *>(Definition));
3020 FoundByLookup = FoundFunction;
3021 break;
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003022 }
Gabor Marton458d1452019-02-14 13:07:03 +00003023 // FIXME: Check for overloading more carefully, e.g., by boosting
3024 // Sema::IsOverload out to the AST library.
3025
3026 // Function overloading is okay in C++.
3027 if (Importer.getToContext().getLangOpts().CPlusPlus)
3028 continue;
3029
3030 // Complain about inconsistent function types.
3031 Importer.ToDiag(Loc, diag::err_odr_function_type_inconsistent)
3032 << Name << D->getType() << FoundFunction->getType();
3033 Importer.ToDiag(FoundFunction->getLocation(), diag::note_odr_value_here)
3034 << FoundFunction->getType();
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003035 }
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00003036
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00003037 ConflictingDecls.push_back(FoundDecl);
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003038 }
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00003039
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003040 if (!ConflictingDecls.empty()) {
3041 Name = Importer.HandleNameConflict(Name, DC, IDNS,
Fangrui Song6907ce22018-07-30 19:24:48 +00003042 ConflictingDecls.data(),
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003043 ConflictingDecls.size());
3044 if (!Name)
Balazs Keri3b30d652018-10-19 13:32:20 +00003045 return make_error<ImportError>(ImportError::NameConflict);
Fangrui Song6907ce22018-07-30 19:24:48 +00003046 }
Douglas Gregor62d311f2010-02-09 19:21:46 +00003047 }
Douglas Gregorb4964f72010-02-15 23:54:17 +00003048
Shafik Yaghmour96b3d202019-01-28 21:55:33 +00003049 // We do not allow more than one in-class declaration of a function. This is
3050 // because AST clients like VTableBuilder asserts on this. VTableBuilder
3051 // assumes there is only one in-class declaration. Building a redecl
3052 // chain would result in more than one in-class declaration for
3053 // overrides (even if they are part of the same redecl chain inside the
3054 // derived class.)
3055 if (FoundByLookup) {
Mikael Holmenc1c97aa2019-01-29 06:53:31 +00003056 if (isa<CXXMethodDecl>(FoundByLookup)) {
Shafik Yaghmour96b3d202019-01-28 21:55:33 +00003057 if (D->getLexicalDeclContext() == D->getDeclContext()) {
3058 if (!D->doesThisDeclarationHaveABody())
3059 return Importer.MapImported(D, FoundByLookup);
3060 else {
3061 // Let's continue and build up the redecl chain in this case.
3062 // FIXME Merge the functions into one decl.
3063 }
3064 }
3065 }
3066 }
3067
Abramo Bagnarad6d2f182010-08-11 22:01:17 +00003068 DeclarationNameInfo NameInfo(Name, Loc);
3069 // Import additional name location/type info.
Balazs Keri3b30d652018-10-19 13:32:20 +00003070 if (Error Err = ImportDeclarationNameLoc(D->getNameInfo(), NameInfo))
3071 return std::move(Err);
Abramo Bagnarad6d2f182010-08-11 22:01:17 +00003072
Argyrios Kyrtzidis2f458532012-09-25 19:26:39 +00003073 QualType FromTy = D->getType();
3074 bool usedDifferentExceptionSpec = false;
3075
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00003076 if (const auto *FromFPT = D->getType()->getAs<FunctionProtoType>()) {
Argyrios Kyrtzidis2f458532012-09-25 19:26:39 +00003077 FunctionProtoType::ExtProtoInfo FromEPI = FromFPT->getExtProtoInfo();
3078 // FunctionProtoType::ExtProtoInfo's ExceptionSpecDecl can point to the
3079 // FunctionDecl that we are importing the FunctionProtoType for.
3080 // To avoid an infinite recursion when importing, create the FunctionDecl
3081 // with a simplified function type and update it afterwards.
Richard Smith8acb4282014-07-31 21:57:55 +00003082 if (FromEPI.ExceptionSpec.SourceDecl ||
3083 FromEPI.ExceptionSpec.SourceTemplate ||
3084 FromEPI.ExceptionSpec.NoexceptExpr) {
Argyrios Kyrtzidis2f458532012-09-25 19:26:39 +00003085 FunctionProtoType::ExtProtoInfo DefaultEPI;
3086 FromTy = Importer.getFromContext().getFunctionType(
Alp Toker314cc812014-01-25 16:55:45 +00003087 FromFPT->getReturnType(), FromFPT->getParamTypes(), DefaultEPI);
Argyrios Kyrtzidis2f458532012-09-25 19:26:39 +00003088 usedDifferentExceptionSpec = true;
3089 }
3090 }
3091
Balazs Keri3b30d652018-10-19 13:32:20 +00003092 QualType T;
3093 TypeSourceInfo *TInfo;
3094 SourceLocation ToInnerLocStart, ToEndLoc;
3095 NestedNameSpecifierLoc ToQualifierLoc;
3096 if (auto Imp = importSeq(
3097 FromTy, D->getTypeSourceInfo(), D->getInnerLocStart(),
3098 D->getQualifierLoc(), D->getEndLoc()))
3099 std::tie(T, TInfo, ToInnerLocStart, ToQualifierLoc, ToEndLoc) = *Imp;
3100 else
3101 return Imp.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00003102
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003103 // Import the function parameters.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003104 SmallVector<ParmVarDecl *, 8> Parameters;
David Majnemer59f77922016-06-24 04:05:48 +00003105 for (auto P : D->parameters()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00003106 if (Expected<ParmVarDecl *> ToPOrErr = import(P))
3107 Parameters.push_back(*ToPOrErr);
3108 else
3109 return ToPOrErr.takeError();
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003110 }
Fangrui Song6907ce22018-07-30 19:24:48 +00003111
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00003112 // Create the imported function.
Craig Topper36250ad2014-05-12 05:36:57 +00003113 FunctionDecl *ToFunction = nullptr;
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00003114 if (auto *FromConstructor = dyn_cast<CXXConstructorDecl>(D)) {
Gabor Marton26f72a92018-07-12 09:42:05 +00003115 if (GetImportedOrCreateDecl<CXXConstructorDecl>(
Balazs Keri3b30d652018-10-19 13:32:20 +00003116 ToFunction, D, Importer.getToContext(), cast<CXXRecordDecl>(DC),
3117 ToInnerLocStart, NameInfo, T, TInfo,
3118 FromConstructor->isExplicit(),
3119 D->isInlineSpecified(), D->isImplicit(), D->isConstexpr()))
Gabor Marton26f72a92018-07-12 09:42:05 +00003120 return ToFunction;
Raphael Isemann1c5d23f2019-01-22 17:59:45 +00003121 } else if (CXXDestructorDecl *FromDtor = dyn_cast<CXXDestructorDecl>(D)) {
3122
3123 auto Imp =
3124 importSeq(const_cast<FunctionDecl *>(FromDtor->getOperatorDelete()),
3125 FromDtor->getOperatorDeleteThisArg());
3126
3127 if (!Imp)
3128 return Imp.takeError();
3129
3130 FunctionDecl *ToOperatorDelete;
3131 Expr *ToThisArg;
3132 std::tie(ToOperatorDelete, ToThisArg) = *Imp;
3133
Gabor Marton26f72a92018-07-12 09:42:05 +00003134 if (GetImportedOrCreateDecl<CXXDestructorDecl>(
Balazs Keri3b30d652018-10-19 13:32:20 +00003135 ToFunction, D, Importer.getToContext(), cast<CXXRecordDecl>(DC),
3136 ToInnerLocStart, NameInfo, T, TInfo, D->isInlineSpecified(),
3137 D->isImplicit()))
Gabor Marton26f72a92018-07-12 09:42:05 +00003138 return ToFunction;
Raphael Isemann1c5d23f2019-01-22 17:59:45 +00003139
3140 CXXDestructorDecl *ToDtor = cast<CXXDestructorDecl>(ToFunction);
3141
3142 ToDtor->setOperatorDelete(ToOperatorDelete, ToThisArg);
Gabor Marton26f72a92018-07-12 09:42:05 +00003143 } else if (CXXConversionDecl *FromConversion =
3144 dyn_cast<CXXConversionDecl>(D)) {
3145 if (GetImportedOrCreateDecl<CXXConversionDecl>(
3146 ToFunction, D, Importer.getToContext(), cast<CXXRecordDecl>(DC),
Balazs Keri3b30d652018-10-19 13:32:20 +00003147 ToInnerLocStart, NameInfo, T, TInfo, D->isInlineSpecified(),
Gabor Marton26f72a92018-07-12 09:42:05 +00003148 FromConversion->isExplicit(), D->isConstexpr(), SourceLocation()))
3149 return ToFunction;
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00003150 } else if (auto *Method = dyn_cast<CXXMethodDecl>(D)) {
Gabor Marton26f72a92018-07-12 09:42:05 +00003151 if (GetImportedOrCreateDecl<CXXMethodDecl>(
3152 ToFunction, D, Importer.getToContext(), cast<CXXRecordDecl>(DC),
Balazs Keri3b30d652018-10-19 13:32:20 +00003153 ToInnerLocStart, NameInfo, T, TInfo, Method->getStorageClass(),
Gabor Marton26f72a92018-07-12 09:42:05 +00003154 Method->isInlineSpecified(), D->isConstexpr(), SourceLocation()))
3155 return ToFunction;
Douglas Gregor00eace12010-02-21 18:29:16 +00003156 } else {
Gabor Marton26f72a92018-07-12 09:42:05 +00003157 if (GetImportedOrCreateDecl(ToFunction, D, Importer.getToContext(), DC,
Balazs Keri3b30d652018-10-19 13:32:20 +00003158 ToInnerLocStart, NameInfo, T, TInfo,
Gabor Marton26f72a92018-07-12 09:42:05 +00003159 D->getStorageClass(), D->isInlineSpecified(),
3160 D->hasWrittenPrototype(), D->isConstexpr()))
3161 return ToFunction;
Douglas Gregor00eace12010-02-21 18:29:16 +00003162 }
John McCall3e11ebe2010-03-15 10:12:16 +00003163
Gabor Martonf5e4f0a2018-11-20 14:19:39 +00003164 // Connect the redecl chain.
3165 if (FoundByLookup) {
3166 auto *Recent = const_cast<FunctionDecl *>(
3167 FoundByLookup->getMostRecentDecl());
3168 ToFunction->setPreviousDecl(Recent);
3169 }
3170
3171 // Import Ctor initializers.
3172 if (auto *FromConstructor = dyn_cast<CXXConstructorDecl>(D)) {
3173 if (unsigned NumInitializers = FromConstructor->getNumCtorInitializers()) {
3174 SmallVector<CXXCtorInitializer *, 4> CtorInitializers(NumInitializers);
3175 // Import first, then allocate memory and copy if there was no error.
3176 if (Error Err = ImportContainerChecked(
3177 FromConstructor->inits(), CtorInitializers))
3178 return std::move(Err);
3179 auto **Memory =
3180 new (Importer.getToContext()) CXXCtorInitializer *[NumInitializers];
3181 std::copy(CtorInitializers.begin(), CtorInitializers.end(), Memory);
3182 auto *ToCtor = cast<CXXConstructorDecl>(ToFunction);
3183 ToCtor->setCtorInitializers(Memory);
3184 ToCtor->setNumCtorInitializers(NumInitializers);
3185 }
3186 }
3187
Balazs Keri3b30d652018-10-19 13:32:20 +00003188 ToFunction->setQualifierInfo(ToQualifierLoc);
Douglas Gregordd483172010-02-22 17:42:47 +00003189 ToFunction->setAccess(D->getAccess());
Douglas Gregor43f54792010-02-17 02:12:47 +00003190 ToFunction->setLexicalDeclContext(LexicalDC);
John McCall08432c82011-01-27 02:37:01 +00003191 ToFunction->setVirtualAsWritten(D->isVirtualAsWritten());
3192 ToFunction->setTrivial(D->isTrivial());
3193 ToFunction->setPure(D->isPure());
Balazs Keri3b30d652018-10-19 13:32:20 +00003194 ToFunction->setRangeEnd(ToEndLoc);
Douglas Gregor62d311f2010-02-09 19:21:46 +00003195
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003196 // Set the parameters.
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00003197 for (auto *Param : Parameters) {
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00003198 Param->setOwningFunction(ToFunction);
3199 ToFunction->addDeclInternal(Param);
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003200 }
David Blaikie9c70e042011-09-21 18:16:56 +00003201 ToFunction->setParams(Parameters);
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003202
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00003203 // We need to complete creation of FunctionProtoTypeLoc manually with setting
3204 // params it refers to.
3205 if (TInfo) {
3206 if (auto ProtoLoc =
3207 TInfo->getTypeLoc().IgnoreParens().getAs<FunctionProtoTypeLoc>()) {
3208 for (unsigned I = 0, N = Parameters.size(); I != N; ++I)
3209 ProtoLoc.setParam(I, Parameters[I]);
3210 }
3211 }
3212
Argyrios Kyrtzidis2f458532012-09-25 19:26:39 +00003213 if (usedDifferentExceptionSpec) {
3214 // Update FunctionProtoType::ExtProtoInfo.
Balazs Keri3b30d652018-10-19 13:32:20 +00003215 if (ExpectedType TyOrErr = import(D->getType()))
3216 ToFunction->setType(*TyOrErr);
3217 else
3218 return TyOrErr.takeError();
Argyrios Kyrtzidisb41791d2012-09-22 01:58:06 +00003219 }
3220
Balazs Keria35798d2018-07-17 09:52:41 +00003221 // Import the describing template function, if any.
Balazs Keri3b30d652018-10-19 13:32:20 +00003222 if (FromFT) {
3223 auto ToFTOrErr = import(FromFT);
3224 if (!ToFTOrErr)
3225 return ToFTOrErr.takeError();
3226 }
Balazs Keria35798d2018-07-17 09:52:41 +00003227
Gabor Marton5254e642018-06-27 13:32:50 +00003228 if (D->doesThisDeclarationHaveABody()) {
Shafik Yaghmour96b3d202019-01-28 21:55:33 +00003229 Error Err = ImportFunctionDeclBody(D, ToFunction);
3230
3231 if (Err)
3232 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00003233 }
3234
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003235 // FIXME: Other bits to merge?
Douglas Gregor0eaa2bf2010-10-01 23:55:07 +00003236
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00003237 // If it is a template, import all related things.
Balazs Keri3b30d652018-10-19 13:32:20 +00003238 if (Error Err = ImportTemplateInformation(D, ToFunction))
3239 return std::move(Err);
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00003240
Gabor Marton5254e642018-06-27 13:32:50 +00003241 bool IsFriend = D->isInIdentifierNamespace(Decl::IDNS_OrdinaryFriend);
3242
3243 // TODO Can we generalize this approach to other AST nodes as well?
3244 if (D->getDeclContext()->containsDeclAndLoad(D))
3245 DC->addDeclInternal(ToFunction);
3246 if (DC != LexicalDC && D->getLexicalDeclContext()->containsDeclAndLoad(D))
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00003247 LexicalDC->addDeclInternal(ToFunction);
Douglas Gregor0eaa2bf2010-10-01 23:55:07 +00003248
Gabor Marton5254e642018-06-27 13:32:50 +00003249 // Friend declaration's lexical context is the befriending class, but the
3250 // semantic context is the enclosing scope of the befriending class.
3251 // We want the friend functions to be found in the semantic context by lookup.
3252 // FIXME should we handle this generically in VisitFriendDecl?
3253 // In Other cases when LexicalDC != DC we don't want it to be added,
3254 // e.g out-of-class definitions like void B::f() {} .
3255 if (LexicalDC != DC && IsFriend) {
3256 DC->makeDeclVisibleInContext(ToFunction);
3257 }
3258
Gabor Marton7a0841e2018-10-29 10:18:28 +00003259 if (auto *FromCXXMethod = dyn_cast<CXXMethodDecl>(D))
3260 ImportOverrides(cast<CXXMethodDecl>(ToFunction), FromCXXMethod);
3261
Gabor Marton5254e642018-06-27 13:32:50 +00003262 // Import the rest of the chain. I.e. import all subsequent declarations.
Balazs Keri3b30d652018-10-19 13:32:20 +00003263 for (++RedeclIt; RedeclIt != Redecls.end(); ++RedeclIt) {
3264 ExpectedDecl ToRedeclOrErr = import(*RedeclIt);
3265 if (!ToRedeclOrErr)
3266 return ToRedeclOrErr.takeError();
3267 }
Gabor Marton5254e642018-06-27 13:32:50 +00003268
Douglas Gregor43f54792010-02-17 02:12:47 +00003269 return ToFunction;
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003270}
3271
Balazs Keri3b30d652018-10-19 13:32:20 +00003272ExpectedDecl ASTNodeImporter::VisitCXXMethodDecl(CXXMethodDecl *D) {
Douglas Gregor00eace12010-02-21 18:29:16 +00003273 return VisitFunctionDecl(D);
3274}
3275
Balazs Keri3b30d652018-10-19 13:32:20 +00003276ExpectedDecl ASTNodeImporter::VisitCXXConstructorDecl(CXXConstructorDecl *D) {
Douglas Gregor00eace12010-02-21 18:29:16 +00003277 return VisitCXXMethodDecl(D);
3278}
3279
Balazs Keri3b30d652018-10-19 13:32:20 +00003280ExpectedDecl ASTNodeImporter::VisitCXXDestructorDecl(CXXDestructorDecl *D) {
Douglas Gregor00eace12010-02-21 18:29:16 +00003281 return VisitCXXMethodDecl(D);
3282}
3283
Balazs Keri3b30d652018-10-19 13:32:20 +00003284ExpectedDecl ASTNodeImporter::VisitCXXConversionDecl(CXXConversionDecl *D) {
Douglas Gregor00eace12010-02-21 18:29:16 +00003285 return VisitCXXMethodDecl(D);
3286}
3287
Balazs Keri3b30d652018-10-19 13:32:20 +00003288ExpectedDecl ASTNodeImporter::VisitFieldDecl(FieldDecl *D) {
Douglas Gregor5c73e912010-02-11 00:48:18 +00003289 // Import the major distinguishing characteristics of a variable.
3290 DeclContext *DC, *LexicalDC;
3291 DeclarationName Name;
Douglas Gregor5c73e912010-02-11 00:48:18 +00003292 SourceLocation Loc;
Sean Callanan59721b32015-04-28 18:41:46 +00003293 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00003294 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
3295 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00003296 if (ToD)
3297 return ToD;
Craig Topper36250ad2014-05-12 05:36:57 +00003298
Fangrui Song6907ce22018-07-30 19:24:48 +00003299 // Determine whether we've already imported this field.
Gabor Marton54058b52018-12-17 13:53:12 +00003300 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00003301 for (auto *FoundDecl : FoundDecls) {
Balazs Keri3b30d652018-10-19 13:32:20 +00003302 if (FieldDecl *FoundField = dyn_cast<FieldDecl>(FoundDecl)) {
Douglas Gregorceb32bf2012-10-26 16:45:11 +00003303 // For anonymous fields, match up by index.
Balazs Keri2544b4b2018-08-08 09:40:57 +00003304 if (!Name &&
3305 ASTImporter::getFieldIndex(D) !=
3306 ASTImporter::getFieldIndex(FoundField))
Douglas Gregorceb32bf2012-10-26 16:45:11 +00003307 continue;
3308
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00003309 if (Importer.IsStructurallyEquivalent(D->getType(),
Douglas Gregor03d1ed32011-10-14 21:54:42 +00003310 FoundField->getType())) {
Gabor Marton26f72a92018-07-12 09:42:05 +00003311 Importer.MapImported(D, FoundField);
Gabor Marton42e15de2018-08-22 11:52:14 +00003312 // In case of a FieldDecl of a ClassTemplateSpecializationDecl, the
3313 // initializer of a FieldDecl might not had been instantiated in the
3314 // "To" context. However, the "From" context might instantiated that,
3315 // thus we have to merge that.
3316 if (Expr *FromInitializer = D->getInClassInitializer()) {
3317 // We don't have yet the initializer set.
3318 if (FoundField->hasInClassInitializer() &&
3319 !FoundField->getInClassInitializer()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00003320 if (ExpectedExpr ToInitializerOrErr = import(FromInitializer))
3321 FoundField->setInClassInitializer(*ToInitializerOrErr);
3322 else {
3323 // We can't return error here,
Gabor Marton42e15de2018-08-22 11:52:14 +00003324 // since we already mapped D as imported.
Balazs Keri3b30d652018-10-19 13:32:20 +00003325 // FIXME: warning message?
3326 consumeError(ToInitializerOrErr.takeError());
Gabor Marton42e15de2018-08-22 11:52:14 +00003327 return FoundField;
Balazs Keri3b30d652018-10-19 13:32:20 +00003328 }
Gabor Marton42e15de2018-08-22 11:52:14 +00003329 }
3330 }
Douglas Gregor03d1ed32011-10-14 21:54:42 +00003331 return FoundField;
3332 }
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00003333
Balazs Keri3b30d652018-10-19 13:32:20 +00003334 // FIXME: Why is this case not handled with calling HandleNameConflict?
Douglas Gregor03d1ed32011-10-14 21:54:42 +00003335 Importer.ToDiag(Loc, diag::err_odr_field_type_inconsistent)
3336 << Name << D->getType() << FoundField->getType();
3337 Importer.ToDiag(FoundField->getLocation(), diag::note_odr_value_here)
3338 << FoundField->getType();
Balazs Keri3b30d652018-10-19 13:32:20 +00003339
3340 return make_error<ImportError>(ImportError::NameConflict);
Douglas Gregor03d1ed32011-10-14 21:54:42 +00003341 }
3342 }
3343
Balazs Keri3b30d652018-10-19 13:32:20 +00003344 QualType ToType;
3345 TypeSourceInfo *ToTInfo;
3346 Expr *ToBitWidth;
3347 SourceLocation ToInnerLocStart;
3348 Expr *ToInitializer;
3349 if (auto Imp = importSeq(
3350 D->getType(), D->getTypeSourceInfo(), D->getBitWidth(),
3351 D->getInnerLocStart(), D->getInClassInitializer()))
3352 std::tie(
3353 ToType, ToTInfo, ToBitWidth, ToInnerLocStart, ToInitializer) = *Imp;
3354 else
3355 return Imp.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00003356
Gabor Marton26f72a92018-07-12 09:42:05 +00003357 FieldDecl *ToField;
3358 if (GetImportedOrCreateDecl(ToField, D, Importer.getToContext(), DC,
Balazs Keri3b30d652018-10-19 13:32:20 +00003359 ToInnerLocStart, Loc, Name.getAsIdentifierInfo(),
3360 ToType, ToTInfo, ToBitWidth, D->isMutable(),
3361 D->getInClassInitStyle()))
Gabor Marton26f72a92018-07-12 09:42:05 +00003362 return ToField;
3363
Douglas Gregordd483172010-02-22 17:42:47 +00003364 ToField->setAccess(D->getAccess());
Douglas Gregor5c73e912010-02-11 00:48:18 +00003365 ToField->setLexicalDeclContext(LexicalDC);
Balazs Keri3b30d652018-10-19 13:32:20 +00003366 if (ToInitializer)
3367 ToField->setInClassInitializer(ToInitializer);
Douglas Gregorceb32bf2012-10-26 16:45:11 +00003368 ToField->setImplicit(D->isImplicit());
Sean Callanan95e74be2011-10-21 02:57:43 +00003369 LexicalDC->addDeclInternal(ToField);
Douglas Gregor5c73e912010-02-11 00:48:18 +00003370 return ToField;
3371}
3372
Balazs Keri3b30d652018-10-19 13:32:20 +00003373ExpectedDecl ASTNodeImporter::VisitIndirectFieldDecl(IndirectFieldDecl *D) {
Francois Pichet783dd6e2010-11-21 06:08:52 +00003374 // Import the major distinguishing characteristics of a variable.
3375 DeclContext *DC, *LexicalDC;
3376 DeclarationName Name;
3377 SourceLocation Loc;
Sean Callanan59721b32015-04-28 18:41:46 +00003378 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00003379 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
3380 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00003381 if (ToD)
3382 return ToD;
Francois Pichet783dd6e2010-11-21 06:08:52 +00003383
Fangrui Song6907ce22018-07-30 19:24:48 +00003384 // Determine whether we've already imported this field.
Gabor Marton54058b52018-12-17 13:53:12 +00003385 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
Douglas Gregor9e0a5b32011-10-15 00:10:27 +00003386 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00003387 if (auto *FoundField = dyn_cast<IndirectFieldDecl>(FoundDecls[I])) {
Douglas Gregorceb32bf2012-10-26 16:45:11 +00003388 // For anonymous indirect fields, match up by index.
Balazs Keri2544b4b2018-08-08 09:40:57 +00003389 if (!Name &&
3390 ASTImporter::getFieldIndex(D) !=
3391 ASTImporter::getFieldIndex(FoundField))
Douglas Gregorceb32bf2012-10-26 16:45:11 +00003392 continue;
3393
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00003394 if (Importer.IsStructurallyEquivalent(D->getType(),
Douglas Gregordd6006f2012-07-17 21:16:27 +00003395 FoundField->getType(),
David Blaikie7d170102013-05-15 07:37:26 +00003396 !Name.isEmpty())) {
Gabor Marton26f72a92018-07-12 09:42:05 +00003397 Importer.MapImported(D, FoundField);
Douglas Gregor03d1ed32011-10-14 21:54:42 +00003398 return FoundField;
3399 }
Douglas Gregordd6006f2012-07-17 21:16:27 +00003400
3401 // If there are more anonymous fields to check, continue.
3402 if (!Name && I < N-1)
3403 continue;
3404
Balazs Keri3b30d652018-10-19 13:32:20 +00003405 // FIXME: Why is this case not handled with calling HandleNameConflict?
Douglas Gregor03d1ed32011-10-14 21:54:42 +00003406 Importer.ToDiag(Loc, diag::err_odr_field_type_inconsistent)
3407 << Name << D->getType() << FoundField->getType();
3408 Importer.ToDiag(FoundField->getLocation(), diag::note_odr_value_here)
3409 << FoundField->getType();
Balazs Keri3b30d652018-10-19 13:32:20 +00003410
3411 return make_error<ImportError>(ImportError::NameConflict);
Douglas Gregor03d1ed32011-10-14 21:54:42 +00003412 }
3413 }
3414
Francois Pichet783dd6e2010-11-21 06:08:52 +00003415 // Import the type.
Balazs Keri3b30d652018-10-19 13:32:20 +00003416 auto TypeOrErr = import(D->getType());
3417 if (!TypeOrErr)
3418 return TypeOrErr.takeError();
Francois Pichet783dd6e2010-11-21 06:08:52 +00003419
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00003420 auto **NamedChain =
3421 new (Importer.getToContext()) NamedDecl*[D->getChainingSize()];
Francois Pichet783dd6e2010-11-21 06:08:52 +00003422
3423 unsigned i = 0;
Balazs Keri3b30d652018-10-19 13:32:20 +00003424 for (auto *PI : D->chain())
3425 if (Expected<NamedDecl *> ToD = import(PI))
3426 NamedChain[i++] = *ToD;
3427 else
3428 return ToD.takeError();
Francois Pichet783dd6e2010-11-21 06:08:52 +00003429
Gabor Marton26f72a92018-07-12 09:42:05 +00003430 llvm::MutableArrayRef<NamedDecl *> CH = {NamedChain, D->getChainingSize()};
3431 IndirectFieldDecl *ToIndirectField;
3432 if (GetImportedOrCreateDecl(ToIndirectField, D, Importer.getToContext(), DC,
Balazs Keri3b30d652018-10-19 13:32:20 +00003433 Loc, Name.getAsIdentifierInfo(), *TypeOrErr, CH))
Gabor Marton26f72a92018-07-12 09:42:05 +00003434 // FIXME here we leak `NamedChain` which is allocated before
3435 return ToIndirectField;
Aaron Ballman260995b2014-10-15 16:58:18 +00003436
Balazs Keri3b30d652018-10-19 13:32:20 +00003437 for (const auto *Attr : D->attrs())
3438 ToIndirectField->addAttr(Importer.Import(Attr));
Aaron Ballman260995b2014-10-15 16:58:18 +00003439
Francois Pichet783dd6e2010-11-21 06:08:52 +00003440 ToIndirectField->setAccess(D->getAccess());
3441 ToIndirectField->setLexicalDeclContext(LexicalDC);
Sean Callanan95e74be2011-10-21 02:57:43 +00003442 LexicalDC->addDeclInternal(ToIndirectField);
Francois Pichet783dd6e2010-11-21 06:08:52 +00003443 return ToIndirectField;
3444}
3445
Balazs Keri3b30d652018-10-19 13:32:20 +00003446ExpectedDecl ASTNodeImporter::VisitFriendDecl(FriendDecl *D) {
Aleksei Sidorina693b372016-09-28 10:16:56 +00003447 // Import the major distinguishing characteristics of a declaration.
Balazs Keri3b30d652018-10-19 13:32:20 +00003448 DeclContext *DC, *LexicalDC;
3449 if (Error Err = ImportDeclContext(D, DC, LexicalDC))
3450 return std::move(Err);
Aleksei Sidorina693b372016-09-28 10:16:56 +00003451
3452 // Determine whether we've already imported this decl.
Gabor Marton54058b52018-12-17 13:53:12 +00003453 // FriendDecl is not a NamedDecl so we cannot use lookup.
Aleksei Sidorina693b372016-09-28 10:16:56 +00003454 auto *RD = cast<CXXRecordDecl>(DC);
3455 FriendDecl *ImportedFriend = RD->getFirstFriend();
Aleksei Sidorina693b372016-09-28 10:16:56 +00003456
3457 while (ImportedFriend) {
3458 if (D->getFriendDecl() && ImportedFriend->getFriendDecl()) {
Gabor Marton950fb572018-07-17 12:39:27 +00003459 if (IsStructuralMatch(D->getFriendDecl(), ImportedFriend->getFriendDecl(),
3460 /*Complain=*/false))
Gabor Marton26f72a92018-07-12 09:42:05 +00003461 return Importer.MapImported(D, ImportedFriend);
Aleksei Sidorina693b372016-09-28 10:16:56 +00003462
3463 } else if (D->getFriendType() && ImportedFriend->getFriendType()) {
3464 if (Importer.IsStructurallyEquivalent(
3465 D->getFriendType()->getType(),
3466 ImportedFriend->getFriendType()->getType(), true))
Gabor Marton26f72a92018-07-12 09:42:05 +00003467 return Importer.MapImported(D, ImportedFriend);
Aleksei Sidorina693b372016-09-28 10:16:56 +00003468 }
3469 ImportedFriend = ImportedFriend->getNextFriend();
3470 }
3471
3472 // Not found. Create it.
3473 FriendDecl::FriendUnion ToFU;
Peter Szecsib180eeb2018-04-25 17:28:03 +00003474 if (NamedDecl *FriendD = D->getFriendDecl()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00003475 NamedDecl *ToFriendD;
3476 if (Error Err = importInto(ToFriendD, FriendD))
3477 return std::move(Err);
3478
3479 if (FriendD->getFriendObjectKind() != Decl::FOK_None &&
Peter Szecsib180eeb2018-04-25 17:28:03 +00003480 !(FriendD->isInIdentifierNamespace(Decl::IDNS_NonMemberOperator)))
3481 ToFriendD->setObjectOfFriendDecl(false);
3482
3483 ToFU = ToFriendD;
Balazs Keri3b30d652018-10-19 13:32:20 +00003484 } else { // The friend is a type, not a decl.
3485 if (auto TSIOrErr = import(D->getFriendType()))
3486 ToFU = *TSIOrErr;
3487 else
3488 return TSIOrErr.takeError();
3489 }
Aleksei Sidorina693b372016-09-28 10:16:56 +00003490
3491 SmallVector<TemplateParameterList *, 1> ToTPLists(D->NumTPLists);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00003492 auto **FromTPLists = D->getTrailingObjects<TemplateParameterList *>();
Aleksei Sidorina693b372016-09-28 10:16:56 +00003493 for (unsigned I = 0; I < D->NumTPLists; I++) {
Balazs Keri3b30d652018-10-19 13:32:20 +00003494 if (auto ListOrErr = ImportTemplateParameterList(FromTPLists[I]))
3495 ToTPLists[I] = *ListOrErr;
3496 else
3497 return ListOrErr.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00003498 }
3499
Balazs Keri3b30d652018-10-19 13:32:20 +00003500 auto LocationOrErr = import(D->getLocation());
3501 if (!LocationOrErr)
3502 return LocationOrErr.takeError();
3503 auto FriendLocOrErr = import(D->getFriendLoc());
3504 if (!FriendLocOrErr)
3505 return FriendLocOrErr.takeError();
3506
Gabor Marton26f72a92018-07-12 09:42:05 +00003507 FriendDecl *FrD;
3508 if (GetImportedOrCreateDecl(FrD, D, Importer.getToContext(), DC,
Balazs Keri3b30d652018-10-19 13:32:20 +00003509 *LocationOrErr, ToFU,
3510 *FriendLocOrErr, ToTPLists))
Gabor Marton26f72a92018-07-12 09:42:05 +00003511 return FrD;
Aleksei Sidorina693b372016-09-28 10:16:56 +00003512
3513 FrD->setAccess(D->getAccess());
3514 FrD->setLexicalDeclContext(LexicalDC);
3515 LexicalDC->addDeclInternal(FrD);
3516 return FrD;
3517}
3518
Balazs Keri3b30d652018-10-19 13:32:20 +00003519ExpectedDecl ASTNodeImporter::VisitObjCIvarDecl(ObjCIvarDecl *D) {
Douglas Gregor7244b0b2010-02-17 00:34:30 +00003520 // Import the major distinguishing characteristics of an ivar.
3521 DeclContext *DC, *LexicalDC;
3522 DeclarationName Name;
3523 SourceLocation Loc;
Sean Callanan59721b32015-04-28 18:41:46 +00003524 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00003525 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
3526 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00003527 if (ToD)
3528 return ToD;
Craig Topper36250ad2014-05-12 05:36:57 +00003529
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00003530 // Determine whether we've already imported this ivar
Gabor Marton54058b52018-12-17 13:53:12 +00003531 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00003532 for (auto *FoundDecl : FoundDecls) {
Balazs Keri3b30d652018-10-19 13:32:20 +00003533 if (ObjCIvarDecl *FoundIvar = dyn_cast<ObjCIvarDecl>(FoundDecl)) {
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00003534 if (Importer.IsStructurallyEquivalent(D->getType(),
Douglas Gregor7244b0b2010-02-17 00:34:30 +00003535 FoundIvar->getType())) {
Gabor Marton26f72a92018-07-12 09:42:05 +00003536 Importer.MapImported(D, FoundIvar);
Douglas Gregor7244b0b2010-02-17 00:34:30 +00003537 return FoundIvar;
3538 }
3539
3540 Importer.ToDiag(Loc, diag::err_odr_ivar_type_inconsistent)
3541 << Name << D->getType() << FoundIvar->getType();
3542 Importer.ToDiag(FoundIvar->getLocation(), diag::note_odr_value_here)
3543 << FoundIvar->getType();
Balazs Keri3b30d652018-10-19 13:32:20 +00003544
3545 return make_error<ImportError>(ImportError::NameConflict);
Douglas Gregor7244b0b2010-02-17 00:34:30 +00003546 }
3547 }
3548
Balazs Keri3b30d652018-10-19 13:32:20 +00003549 QualType ToType;
3550 TypeSourceInfo *ToTypeSourceInfo;
3551 Expr *ToBitWidth;
3552 SourceLocation ToInnerLocStart;
3553 if (auto Imp = importSeq(
3554 D->getType(), D->getTypeSourceInfo(), D->getBitWidth(), D->getInnerLocStart()))
3555 std::tie(ToType, ToTypeSourceInfo, ToBitWidth, ToInnerLocStart) = *Imp;
3556 else
3557 return Imp.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00003558
Gabor Marton26f72a92018-07-12 09:42:05 +00003559 ObjCIvarDecl *ToIvar;
3560 if (GetImportedOrCreateDecl(
3561 ToIvar, D, Importer.getToContext(), cast<ObjCContainerDecl>(DC),
Balazs Keri3b30d652018-10-19 13:32:20 +00003562 ToInnerLocStart, Loc, Name.getAsIdentifierInfo(),
3563 ToType, ToTypeSourceInfo,
3564 D->getAccessControl(),ToBitWidth, D->getSynthesize()))
Gabor Marton26f72a92018-07-12 09:42:05 +00003565 return ToIvar;
3566
Douglas Gregor7244b0b2010-02-17 00:34:30 +00003567 ToIvar->setLexicalDeclContext(LexicalDC);
Sean Callanan95e74be2011-10-21 02:57:43 +00003568 LexicalDC->addDeclInternal(ToIvar);
Douglas Gregor7244b0b2010-02-17 00:34:30 +00003569 return ToIvar;
Douglas Gregor7244b0b2010-02-17 00:34:30 +00003570}
3571
Balazs Keri3b30d652018-10-19 13:32:20 +00003572ExpectedDecl ASTNodeImporter::VisitVarDecl(VarDecl *D) {
Gabor Martonac3a5d62018-09-17 12:04:52 +00003573
3574 SmallVector<Decl*, 2> Redecls = getCanonicalForwardRedeclChain(D);
3575 auto RedeclIt = Redecls.begin();
3576 // Import the first part of the decl chain. I.e. import all previous
3577 // declarations starting from the canonical decl.
Balazs Keri3b30d652018-10-19 13:32:20 +00003578 for (; RedeclIt != Redecls.end() && *RedeclIt != D; ++RedeclIt) {
3579 ExpectedDecl RedeclOrErr = import(*RedeclIt);
3580 if (!RedeclOrErr)
3581 return RedeclOrErr.takeError();
3582 }
Gabor Martonac3a5d62018-09-17 12:04:52 +00003583 assert(*RedeclIt == D);
3584
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003585 // Import the major distinguishing characteristics of a variable.
3586 DeclContext *DC, *LexicalDC;
3587 DeclarationName Name;
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003588 SourceLocation Loc;
Sean Callanan59721b32015-04-28 18:41:46 +00003589 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00003590 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
3591 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00003592 if (ToD)
3593 return ToD;
Craig Topper36250ad2014-05-12 05:36:57 +00003594
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00003595 // Try to find a variable in our own ("to") context with the same name and
3596 // in the same context as the variable we're importing.
Gabor Martonac3a5d62018-09-17 12:04:52 +00003597 VarDecl *FoundByLookup = nullptr;
Douglas Gregor62d311f2010-02-09 19:21:46 +00003598 if (D->isFileVarDecl()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003599 SmallVector<NamedDecl *, 4> ConflictingDecls;
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00003600 unsigned IDNS = Decl::IDNS_Ordinary;
Gabor Marton54058b52018-12-17 13:53:12 +00003601 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00003602 for (auto *FoundDecl : FoundDecls) {
3603 if (!FoundDecl->isInIdentifierNamespace(IDNS))
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00003604 continue;
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00003605
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00003606 if (auto *FoundVar = dyn_cast<VarDecl>(FoundDecl)) {
Gabor Marton458d1452019-02-14 13:07:03 +00003607 if (!hasSameVisibilityContext(FoundVar, D))
3608 continue;
3609 if (Importer.IsStructurallyEquivalent(D->getType(),
3610 FoundVar->getType())) {
Gabor Martonac3a5d62018-09-17 12:04:52 +00003611
Gabor Marton458d1452019-02-14 13:07:03 +00003612 // The VarDecl in the "From" context has a definition, but in the
3613 // "To" context we already have a definition.
3614 VarDecl *FoundDef = FoundVar->getDefinition();
3615 if (D->isThisDeclarationADefinition() && FoundDef)
3616 // FIXME Check for ODR error if the two definitions have
3617 // different initializers?
3618 return Importer.MapImported(D, FoundDef);
Gabor Martonac3a5d62018-09-17 12:04:52 +00003619
Gabor Marton458d1452019-02-14 13:07:03 +00003620 // The VarDecl in the "From" context has an initializer, but in the
3621 // "To" context we already have an initializer.
3622 const VarDecl *FoundDInit = nullptr;
3623 if (D->getInit() && FoundVar->getAnyInitializer(FoundDInit))
3624 // FIXME Diagnose ODR error if the two initializers are different?
3625 return Importer.MapImported(D, const_cast<VarDecl*>(FoundDInit));
3626
3627 FoundByLookup = FoundVar;
3628 break;
3629 }
3630
3631 const ArrayType *FoundArray
3632 = Importer.getToContext().getAsArrayType(FoundVar->getType());
3633 const ArrayType *TArray
3634 = Importer.getToContext().getAsArrayType(D->getType());
3635 if (FoundArray && TArray) {
3636 if (isa<IncompleteArrayType>(FoundArray) &&
3637 isa<ConstantArrayType>(TArray)) {
3638 // Import the type.
3639 if (auto TyOrErr = import(D->getType()))
3640 FoundVar->setType(*TyOrErr);
3641 else
3642 return TyOrErr.takeError();
Gabor Martonac3a5d62018-09-17 12:04:52 +00003643
3644 FoundByLookup = FoundVar;
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00003645 break;
Gabor Marton458d1452019-02-14 13:07:03 +00003646 } else if (isa<IncompleteArrayType>(TArray) &&
3647 isa<ConstantArrayType>(FoundArray)) {
3648 FoundByLookup = FoundVar;
3649 break;
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00003650 }
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00003651 }
Gabor Marton458d1452019-02-14 13:07:03 +00003652
3653 Importer.ToDiag(Loc, diag::err_odr_variable_type_inconsistent)
3654 << Name << D->getType() << FoundVar->getType();
3655 Importer.ToDiag(FoundVar->getLocation(), diag::note_odr_value_here)
3656 << FoundVar->getType();
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00003657 }
Fangrui Song6907ce22018-07-30 19:24:48 +00003658
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00003659 ConflictingDecls.push_back(FoundDecl);
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00003660 }
3661
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00003662 if (!ConflictingDecls.empty()) {
3663 Name = Importer.HandleNameConflict(Name, DC, IDNS,
Fangrui Song6907ce22018-07-30 19:24:48 +00003664 ConflictingDecls.data(),
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00003665 ConflictingDecls.size());
3666 if (!Name)
Balazs Keri3b30d652018-10-19 13:32:20 +00003667 return make_error<ImportError>(ImportError::NameConflict);
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00003668 }
3669 }
Fangrui Song6907ce22018-07-30 19:24:48 +00003670
Balazs Keri3b30d652018-10-19 13:32:20 +00003671 QualType ToType;
3672 TypeSourceInfo *ToTypeSourceInfo;
3673 SourceLocation ToInnerLocStart;
3674 NestedNameSpecifierLoc ToQualifierLoc;
3675 if (auto Imp = importSeq(
3676 D->getType(), D->getTypeSourceInfo(), D->getInnerLocStart(),
3677 D->getQualifierLoc()))
3678 std::tie(ToType, ToTypeSourceInfo, ToInnerLocStart, ToQualifierLoc) = *Imp;
3679 else
3680 return Imp.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00003681
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00003682 // Create the imported variable.
Gabor Marton26f72a92018-07-12 09:42:05 +00003683 VarDecl *ToVar;
3684 if (GetImportedOrCreateDecl(ToVar, D, Importer.getToContext(), DC,
Balazs Keri3b30d652018-10-19 13:32:20 +00003685 ToInnerLocStart, Loc,
3686 Name.getAsIdentifierInfo(),
3687 ToType, ToTypeSourceInfo,
Gabor Marton26f72a92018-07-12 09:42:05 +00003688 D->getStorageClass()))
3689 return ToVar;
3690
Balazs Keri3b30d652018-10-19 13:32:20 +00003691 ToVar->setQualifierInfo(ToQualifierLoc);
Douglas Gregordd483172010-02-22 17:42:47 +00003692 ToVar->setAccess(D->getAccess());
Douglas Gregor62d311f2010-02-09 19:21:46 +00003693 ToVar->setLexicalDeclContext(LexicalDC);
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00003694
Gabor Martonac3a5d62018-09-17 12:04:52 +00003695 if (FoundByLookup) {
3696 auto *Recent = const_cast<VarDecl *>(FoundByLookup->getMostRecentDecl());
3697 ToVar->setPreviousDecl(Recent);
3698 }
Douglas Gregor62d311f2010-02-09 19:21:46 +00003699
Balazs Keri3b30d652018-10-19 13:32:20 +00003700 if (Error Err = ImportInitializer(D, ToVar))
3701 return std::move(Err);
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00003702
Aleksei Sidorin855086d2017-01-23 09:30:36 +00003703 if (D->isConstexpr())
3704 ToVar->setConstexpr(true);
3705
Gabor Martonac3a5d62018-09-17 12:04:52 +00003706 if (D->getDeclContext()->containsDeclAndLoad(D))
3707 DC->addDeclInternal(ToVar);
3708 if (DC != LexicalDC && D->getLexicalDeclContext()->containsDeclAndLoad(D))
3709 LexicalDC->addDeclInternal(ToVar);
3710
3711 // Import the rest of the chain. I.e. import all subsequent declarations.
Balazs Keri3b30d652018-10-19 13:32:20 +00003712 for (++RedeclIt; RedeclIt != Redecls.end(); ++RedeclIt) {
3713 ExpectedDecl RedeclOrErr = import(*RedeclIt);
3714 if (!RedeclOrErr)
3715 return RedeclOrErr.takeError();
3716 }
Gabor Martonac3a5d62018-09-17 12:04:52 +00003717
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00003718 return ToVar;
3719}
3720
Balazs Keri3b30d652018-10-19 13:32:20 +00003721ExpectedDecl ASTNodeImporter::VisitImplicitParamDecl(ImplicitParamDecl *D) {
Douglas Gregor8b228d72010-02-17 21:22:52 +00003722 // Parameters are created in the translation unit's context, then moved
3723 // into the function declaration's context afterward.
3724 DeclContext *DC = Importer.getToContext().getTranslationUnitDecl();
Fangrui Song6907ce22018-07-30 19:24:48 +00003725
Balazs Keri3b30d652018-10-19 13:32:20 +00003726 DeclarationName ToDeclName;
3727 SourceLocation ToLocation;
3728 QualType ToType;
3729 if (auto Imp = importSeq(D->getDeclName(), D->getLocation(), D->getType()))
3730 std::tie(ToDeclName, ToLocation, ToType) = *Imp;
3731 else
3732 return Imp.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00003733
Douglas Gregor8b228d72010-02-17 21:22:52 +00003734 // Create the imported parameter.
Gabor Marton26f72a92018-07-12 09:42:05 +00003735 ImplicitParamDecl *ToParm = nullptr;
Balazs Keri3b30d652018-10-19 13:32:20 +00003736 if (GetImportedOrCreateDecl(ToParm, D, Importer.getToContext(), DC,
3737 ToLocation, ToDeclName.getAsIdentifierInfo(),
3738 ToType, D->getParameterKind()))
Gabor Marton26f72a92018-07-12 09:42:05 +00003739 return ToParm;
3740 return ToParm;
Douglas Gregor8b228d72010-02-17 21:22:52 +00003741}
3742
Balazs Keri3b30d652018-10-19 13:32:20 +00003743ExpectedDecl ASTNodeImporter::VisitParmVarDecl(ParmVarDecl *D) {
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003744 // Parameters are created in the translation unit's context, then moved
3745 // into the function declaration's context afterward.
3746 DeclContext *DC = Importer.getToContext().getTranslationUnitDecl();
Fangrui Song6907ce22018-07-30 19:24:48 +00003747
Balazs Keri3b30d652018-10-19 13:32:20 +00003748 DeclarationName ToDeclName;
3749 SourceLocation ToLocation, ToInnerLocStart;
3750 QualType ToType;
3751 TypeSourceInfo *ToTypeSourceInfo;
3752 if (auto Imp = importSeq(
3753 D->getDeclName(), D->getLocation(), D->getType(), D->getInnerLocStart(),
3754 D->getTypeSourceInfo()))
3755 std::tie(
3756 ToDeclName, ToLocation, ToType, ToInnerLocStart,
3757 ToTypeSourceInfo) = *Imp;
3758 else
3759 return Imp.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00003760
Gabor Marton26f72a92018-07-12 09:42:05 +00003761 ParmVarDecl *ToParm;
3762 if (GetImportedOrCreateDecl(ToParm, D, Importer.getToContext(), DC,
Balazs Keri3b30d652018-10-19 13:32:20 +00003763 ToInnerLocStart, ToLocation,
3764 ToDeclName.getAsIdentifierInfo(), ToType,
3765 ToTypeSourceInfo, D->getStorageClass(),
Gabor Marton26f72a92018-07-12 09:42:05 +00003766 /*DefaultArg*/ nullptr))
3767 return ToParm;
Aleksei Sidorin55a63502017-02-20 11:57:12 +00003768
3769 // Set the default argument.
John McCallf3cd6652010-03-12 18:31:32 +00003770 ToParm->setHasInheritedDefaultArg(D->hasInheritedDefaultArg());
Aleksei Sidorin55a63502017-02-20 11:57:12 +00003771 ToParm->setKNRPromoted(D->isKNRPromoted());
3772
Aleksei Sidorin55a63502017-02-20 11:57:12 +00003773 if (D->hasUninstantiatedDefaultArg()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00003774 if (auto ToDefArgOrErr = import(D->getUninstantiatedDefaultArg()))
3775 ToParm->setUninstantiatedDefaultArg(*ToDefArgOrErr);
3776 else
3777 return ToDefArgOrErr.takeError();
Aleksei Sidorin55a63502017-02-20 11:57:12 +00003778 } else if (D->hasUnparsedDefaultArg()) {
3779 ToParm->setUnparsedDefaultArg();
3780 } else if (D->hasDefaultArg()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00003781 if (auto ToDefArgOrErr = import(D->getDefaultArg()))
3782 ToParm->setDefaultArg(*ToDefArgOrErr);
3783 else
3784 return ToDefArgOrErr.takeError();
Aleksei Sidorin55a63502017-02-20 11:57:12 +00003785 }
Sean Callanan59721b32015-04-28 18:41:46 +00003786
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00003787 if (D->isObjCMethodParameter()) {
3788 ToParm->setObjCMethodScopeInfo(D->getFunctionScopeIndex());
3789 ToParm->setObjCDeclQualifier(D->getObjCDeclQualifier());
3790 } else {
3791 ToParm->setScopeInfo(D->getFunctionScopeDepth(),
3792 D->getFunctionScopeIndex());
3793 }
3794
Gabor Marton26f72a92018-07-12 09:42:05 +00003795 return ToParm;
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003796}
3797
Balazs Keri3b30d652018-10-19 13:32:20 +00003798ExpectedDecl ASTNodeImporter::VisitObjCMethodDecl(ObjCMethodDecl *D) {
Douglas Gregor43f54792010-02-17 02:12:47 +00003799 // Import the major distinguishing characteristics of a method.
3800 DeclContext *DC, *LexicalDC;
3801 DeclarationName Name;
3802 SourceLocation Loc;
Sean Callanan59721b32015-04-28 18:41:46 +00003803 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00003804 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
3805 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00003806 if (ToD)
3807 return ToD;
Craig Topper36250ad2014-05-12 05:36:57 +00003808
Gabor Marton54058b52018-12-17 13:53:12 +00003809 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00003810 for (auto *FoundDecl : FoundDecls) {
3811 if (auto *FoundMethod = dyn_cast<ObjCMethodDecl>(FoundDecl)) {
Douglas Gregor43f54792010-02-17 02:12:47 +00003812 if (FoundMethod->isInstanceMethod() != D->isInstanceMethod())
3813 continue;
3814
3815 // Check return types.
Alp Toker314cc812014-01-25 16:55:45 +00003816 if (!Importer.IsStructurallyEquivalent(D->getReturnType(),
3817 FoundMethod->getReturnType())) {
Douglas Gregor43f54792010-02-17 02:12:47 +00003818 Importer.ToDiag(Loc, diag::err_odr_objc_method_result_type_inconsistent)
Alp Toker314cc812014-01-25 16:55:45 +00003819 << D->isInstanceMethod() << Name << D->getReturnType()
3820 << FoundMethod->getReturnType();
Fangrui Song6907ce22018-07-30 19:24:48 +00003821 Importer.ToDiag(FoundMethod->getLocation(),
Douglas Gregor43f54792010-02-17 02:12:47 +00003822 diag::note_odr_objc_method_here)
3823 << D->isInstanceMethod() << Name;
Balazs Keri3b30d652018-10-19 13:32:20 +00003824
3825 return make_error<ImportError>(ImportError::NameConflict);
Douglas Gregor43f54792010-02-17 02:12:47 +00003826 }
3827
3828 // Check the number of parameters.
3829 if (D->param_size() != FoundMethod->param_size()) {
3830 Importer.ToDiag(Loc, diag::err_odr_objc_method_num_params_inconsistent)
3831 << D->isInstanceMethod() << Name
3832 << D->param_size() << FoundMethod->param_size();
Fangrui Song6907ce22018-07-30 19:24:48 +00003833 Importer.ToDiag(FoundMethod->getLocation(),
Douglas Gregor43f54792010-02-17 02:12:47 +00003834 diag::note_odr_objc_method_here)
3835 << D->isInstanceMethod() << Name;
Balazs Keri3b30d652018-10-19 13:32:20 +00003836
3837 return make_error<ImportError>(ImportError::NameConflict);
Douglas Gregor43f54792010-02-17 02:12:47 +00003838 }
3839
3840 // Check parameter types.
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00003841 for (ObjCMethodDecl::param_iterator P = D->param_begin(),
Douglas Gregor43f54792010-02-17 02:12:47 +00003842 PEnd = D->param_end(), FoundP = FoundMethod->param_begin();
3843 P != PEnd; ++P, ++FoundP) {
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00003844 if (!Importer.IsStructurallyEquivalent((*P)->getType(),
Douglas Gregor43f54792010-02-17 02:12:47 +00003845 (*FoundP)->getType())) {
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00003846 Importer.FromDiag((*P)->getLocation(),
Douglas Gregor43f54792010-02-17 02:12:47 +00003847 diag::err_odr_objc_method_param_type_inconsistent)
3848 << D->isInstanceMethod() << Name
3849 << (*P)->getType() << (*FoundP)->getType();
3850 Importer.ToDiag((*FoundP)->getLocation(), diag::note_odr_value_here)
3851 << (*FoundP)->getType();
Balazs Keri3b30d652018-10-19 13:32:20 +00003852
3853 return make_error<ImportError>(ImportError::NameConflict);
Douglas Gregor43f54792010-02-17 02:12:47 +00003854 }
3855 }
3856
3857 // Check variadic/non-variadic.
3858 // Check the number of parameters.
3859 if (D->isVariadic() != FoundMethod->isVariadic()) {
3860 Importer.ToDiag(Loc, diag::err_odr_objc_method_variadic_inconsistent)
3861 << D->isInstanceMethod() << Name;
Fangrui Song6907ce22018-07-30 19:24:48 +00003862 Importer.ToDiag(FoundMethod->getLocation(),
Douglas Gregor43f54792010-02-17 02:12:47 +00003863 diag::note_odr_objc_method_here)
3864 << D->isInstanceMethod() << Name;
Balazs Keri3b30d652018-10-19 13:32:20 +00003865
3866 return make_error<ImportError>(ImportError::NameConflict);
Douglas Gregor43f54792010-02-17 02:12:47 +00003867 }
3868
3869 // FIXME: Any other bits we need to merge?
Gabor Marton26f72a92018-07-12 09:42:05 +00003870 return Importer.MapImported(D, FoundMethod);
Douglas Gregor43f54792010-02-17 02:12:47 +00003871 }
3872 }
3873
Balazs Keri3b30d652018-10-19 13:32:20 +00003874 SourceLocation ToEndLoc;
3875 QualType ToReturnType;
3876 TypeSourceInfo *ToReturnTypeSourceInfo;
3877 if (auto Imp = importSeq(
3878 D->getEndLoc(), D->getReturnType(), D->getReturnTypeSourceInfo()))
3879 std::tie(ToEndLoc, ToReturnType, ToReturnTypeSourceInfo) = *Imp;
3880 else
3881 return Imp.takeError();
Douglas Gregor12852d92010-03-08 14:59:44 +00003882
Gabor Marton26f72a92018-07-12 09:42:05 +00003883 ObjCMethodDecl *ToMethod;
3884 if (GetImportedOrCreateDecl(
3885 ToMethod, D, Importer.getToContext(), Loc,
Balazs Keri3b30d652018-10-19 13:32:20 +00003886 ToEndLoc, Name.getObjCSelector(), ToReturnType,
3887 ToReturnTypeSourceInfo, DC, D->isInstanceMethod(), D->isVariadic(),
Gabor Marton26f72a92018-07-12 09:42:05 +00003888 D->isPropertyAccessor(), D->isImplicit(), D->isDefined(),
3889 D->getImplementationControl(), D->hasRelatedResultType()))
3890 return ToMethod;
Douglas Gregor43f54792010-02-17 02:12:47 +00003891
3892 // FIXME: When we decide to merge method definitions, we'll need to
3893 // deal with implicit parameters.
3894
3895 // Import the parameters
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003896 SmallVector<ParmVarDecl *, 5> ToParams;
David Majnemer59f77922016-06-24 04:05:48 +00003897 for (auto *FromP : D->parameters()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00003898 if (Expected<ParmVarDecl *> ToPOrErr = import(FromP))
3899 ToParams.push_back(*ToPOrErr);
3900 else
3901 return ToPOrErr.takeError();
Douglas Gregor43f54792010-02-17 02:12:47 +00003902 }
Fangrui Song6907ce22018-07-30 19:24:48 +00003903
Douglas Gregor43f54792010-02-17 02:12:47 +00003904 // Set the parameters.
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00003905 for (auto *ToParam : ToParams) {
3906 ToParam->setOwningFunction(ToMethod);
3907 ToMethod->addDeclInternal(ToParam);
Douglas Gregor43f54792010-02-17 02:12:47 +00003908 }
Aleksei Sidorin47dbaf62018-01-09 14:25:05 +00003909
Balazs Keri3b30d652018-10-19 13:32:20 +00003910 SmallVector<SourceLocation, 12> FromSelLocs;
3911 D->getSelectorLocs(FromSelLocs);
3912 SmallVector<SourceLocation, 12> ToSelLocs(FromSelLocs.size());
3913 if (Error Err = ImportContainerChecked(FromSelLocs, ToSelLocs))
3914 return std::move(Err);
Aleksei Sidorin47dbaf62018-01-09 14:25:05 +00003915
Balazs Keri3b30d652018-10-19 13:32:20 +00003916 ToMethod->setMethodParams(Importer.getToContext(), ToParams, ToSelLocs);
Douglas Gregor43f54792010-02-17 02:12:47 +00003917
3918 ToMethod->setLexicalDeclContext(LexicalDC);
Sean Callanan95e74be2011-10-21 02:57:43 +00003919 LexicalDC->addDeclInternal(ToMethod);
Douglas Gregor43f54792010-02-17 02:12:47 +00003920 return ToMethod;
3921}
3922
Balazs Keri3b30d652018-10-19 13:32:20 +00003923ExpectedDecl ASTNodeImporter::VisitObjCTypeParamDecl(ObjCTypeParamDecl *D) {
Douglas Gregor85f3f952015-07-07 03:57:15 +00003924 // Import the major distinguishing characteristics of a category.
3925 DeclContext *DC, *LexicalDC;
3926 DeclarationName Name;
3927 SourceLocation Loc;
3928 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00003929 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
3930 return std::move(Err);
Douglas Gregor85f3f952015-07-07 03:57:15 +00003931 if (ToD)
3932 return ToD;
3933
Balazs Keri3b30d652018-10-19 13:32:20 +00003934 SourceLocation ToVarianceLoc, ToLocation, ToColonLoc;
3935 TypeSourceInfo *ToTypeSourceInfo;
3936 if (auto Imp = importSeq(
3937 D->getVarianceLoc(), D->getLocation(), D->getColonLoc(),
3938 D->getTypeSourceInfo()))
3939 std::tie(ToVarianceLoc, ToLocation, ToColonLoc, ToTypeSourceInfo) = *Imp;
3940 else
3941 return Imp.takeError();
Douglas Gregor85f3f952015-07-07 03:57:15 +00003942
Gabor Marton26f72a92018-07-12 09:42:05 +00003943 ObjCTypeParamDecl *Result;
3944 if (GetImportedOrCreateDecl(
3945 Result, D, Importer.getToContext(), DC, D->getVariance(),
Balazs Keri3b30d652018-10-19 13:32:20 +00003946 ToVarianceLoc, D->getIndex(),
3947 ToLocation, Name.getAsIdentifierInfo(),
3948 ToColonLoc, ToTypeSourceInfo))
Gabor Marton26f72a92018-07-12 09:42:05 +00003949 return Result;
3950
Douglas Gregor85f3f952015-07-07 03:57:15 +00003951 Result->setLexicalDeclContext(LexicalDC);
3952 return Result;
3953}
3954
Balazs Keri3b30d652018-10-19 13:32:20 +00003955ExpectedDecl ASTNodeImporter::VisitObjCCategoryDecl(ObjCCategoryDecl *D) {
Douglas Gregor84c51c32010-02-18 01:47:50 +00003956 // Import the major distinguishing characteristics of a category.
3957 DeclContext *DC, *LexicalDC;
3958 DeclarationName Name;
3959 SourceLocation Loc;
Sean Callanan59721b32015-04-28 18:41:46 +00003960 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00003961 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
3962 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00003963 if (ToD)
3964 return ToD;
Craig Topper36250ad2014-05-12 05:36:57 +00003965
Balazs Keri3b30d652018-10-19 13:32:20 +00003966 ObjCInterfaceDecl *ToInterface;
3967 if (Error Err = importInto(ToInterface, D->getClassInterface()))
3968 return std::move(Err);
Craig Topper36250ad2014-05-12 05:36:57 +00003969
Douglas Gregor84c51c32010-02-18 01:47:50 +00003970 // Determine if we've already encountered this category.
3971 ObjCCategoryDecl *MergeWithCategory
3972 = ToInterface->FindCategoryDeclaration(Name.getAsIdentifierInfo());
3973 ObjCCategoryDecl *ToCategory = MergeWithCategory;
3974 if (!ToCategory) {
Balazs Keri3b30d652018-10-19 13:32:20 +00003975 SourceLocation ToAtStartLoc, ToCategoryNameLoc;
3976 SourceLocation ToIvarLBraceLoc, ToIvarRBraceLoc;
3977 if (auto Imp = importSeq(
3978 D->getAtStartLoc(), D->getCategoryNameLoc(),
3979 D->getIvarLBraceLoc(), D->getIvarRBraceLoc()))
3980 std::tie(
3981 ToAtStartLoc, ToCategoryNameLoc,
3982 ToIvarLBraceLoc, ToIvarRBraceLoc) = *Imp;
3983 else
3984 return Imp.takeError();
Gabor Marton26f72a92018-07-12 09:42:05 +00003985
3986 if (GetImportedOrCreateDecl(ToCategory, D, Importer.getToContext(), DC,
Balazs Keri3b30d652018-10-19 13:32:20 +00003987 ToAtStartLoc, Loc,
3988 ToCategoryNameLoc,
Gabor Marton26f72a92018-07-12 09:42:05 +00003989 Name.getAsIdentifierInfo(), ToInterface,
3990 /*TypeParamList=*/nullptr,
Balazs Keri3b30d652018-10-19 13:32:20 +00003991 ToIvarLBraceLoc,
3992 ToIvarRBraceLoc))
Gabor Marton26f72a92018-07-12 09:42:05 +00003993 return ToCategory;
3994
Douglas Gregor84c51c32010-02-18 01:47:50 +00003995 ToCategory->setLexicalDeclContext(LexicalDC);
Sean Callanan95e74be2011-10-21 02:57:43 +00003996 LexicalDC->addDeclInternal(ToCategory);
Balazs Keri3b30d652018-10-19 13:32:20 +00003997 // Import the type parameter list after MapImported, to avoid
Douglas Gregorab7f0b32015-07-07 06:20:12 +00003998 // loops when bringing in their DeclContext.
Balazs Keri3b30d652018-10-19 13:32:20 +00003999 if (auto PListOrErr = ImportObjCTypeParamList(D->getTypeParamList()))
4000 ToCategory->setTypeParamList(*PListOrErr);
4001 else
4002 return PListOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00004003
Douglas Gregor84c51c32010-02-18 01:47:50 +00004004 // Import protocols
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004005 SmallVector<ObjCProtocolDecl *, 4> Protocols;
4006 SmallVector<SourceLocation, 4> ProtocolLocs;
Douglas Gregor84c51c32010-02-18 01:47:50 +00004007 ObjCCategoryDecl::protocol_loc_iterator FromProtoLoc
4008 = D->protocol_loc_begin();
4009 for (ObjCCategoryDecl::protocol_iterator FromProto = D->protocol_begin(),
4010 FromProtoEnd = D->protocol_end();
4011 FromProto != FromProtoEnd;
4012 ++FromProto, ++FromProtoLoc) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004013 if (Expected<ObjCProtocolDecl *> ToProtoOrErr = import(*FromProto))
4014 Protocols.push_back(*ToProtoOrErr);
4015 else
4016 return ToProtoOrErr.takeError();
4017
4018 if (ExpectedSLoc ToProtoLocOrErr = import(*FromProtoLoc))
4019 ProtocolLocs.push_back(*ToProtoLocOrErr);
4020 else
4021 return ToProtoLocOrErr.takeError();
Douglas Gregor84c51c32010-02-18 01:47:50 +00004022 }
Fangrui Song6907ce22018-07-30 19:24:48 +00004023
Douglas Gregor84c51c32010-02-18 01:47:50 +00004024 // FIXME: If we're merging, make sure that the protocol list is the same.
4025 ToCategory->setProtocolList(Protocols.data(), Protocols.size(),
4026 ProtocolLocs.data(), Importer.getToContext());
Balazs Keri3b30d652018-10-19 13:32:20 +00004027
Douglas Gregor84c51c32010-02-18 01:47:50 +00004028 } else {
Gabor Marton26f72a92018-07-12 09:42:05 +00004029 Importer.MapImported(D, ToCategory);
Douglas Gregor84c51c32010-02-18 01:47:50 +00004030 }
Fangrui Song6907ce22018-07-30 19:24:48 +00004031
Douglas Gregor84c51c32010-02-18 01:47:50 +00004032 // Import all of the members of this category.
Balazs Keri3b30d652018-10-19 13:32:20 +00004033 if (Error Err = ImportDeclContext(D))
4034 return std::move(Err);
Fangrui Song6907ce22018-07-30 19:24:48 +00004035
Douglas Gregor84c51c32010-02-18 01:47:50 +00004036 // If we have an implementation, import it as well.
4037 if (D->getImplementation()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004038 if (Expected<ObjCCategoryImplDecl *> ToImplOrErr =
4039 import(D->getImplementation()))
4040 ToCategory->setImplementation(*ToImplOrErr);
4041 else
4042 return ToImplOrErr.takeError();
Douglas Gregor84c51c32010-02-18 01:47:50 +00004043 }
Fangrui Song6907ce22018-07-30 19:24:48 +00004044
Douglas Gregor84c51c32010-02-18 01:47:50 +00004045 return ToCategory;
4046}
4047
Balazs Keri3b30d652018-10-19 13:32:20 +00004048Error ASTNodeImporter::ImportDefinition(
4049 ObjCProtocolDecl *From, ObjCProtocolDecl *To, ImportDefinitionKind Kind) {
Douglas Gregor2aa53772012-01-24 17:42:07 +00004050 if (To->getDefinition()) {
Douglas Gregor2e15c842012-02-01 21:00:38 +00004051 if (shouldForceImportDeclContext(Kind))
Balazs Keri3b30d652018-10-19 13:32:20 +00004052 if (Error Err = ImportDeclContext(From))
4053 return Err;
4054 return Error::success();
Douglas Gregor2aa53772012-01-24 17:42:07 +00004055 }
4056
4057 // Start the protocol definition
4058 To->startDefinition();
Fangrui Song6907ce22018-07-30 19:24:48 +00004059
Douglas Gregor2aa53772012-01-24 17:42:07 +00004060 // Import protocols
4061 SmallVector<ObjCProtocolDecl *, 4> Protocols;
4062 SmallVector<SourceLocation, 4> ProtocolLocs;
Balazs Keri3b30d652018-10-19 13:32:20 +00004063 ObjCProtocolDecl::protocol_loc_iterator FromProtoLoc =
4064 From->protocol_loc_begin();
Douglas Gregor2aa53772012-01-24 17:42:07 +00004065 for (ObjCProtocolDecl::protocol_iterator FromProto = From->protocol_begin(),
4066 FromProtoEnd = From->protocol_end();
4067 FromProto != FromProtoEnd;
4068 ++FromProto, ++FromProtoLoc) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004069 if (Expected<ObjCProtocolDecl *> ToProtoOrErr = import(*FromProto))
4070 Protocols.push_back(*ToProtoOrErr);
4071 else
4072 return ToProtoOrErr.takeError();
4073
4074 if (ExpectedSLoc ToProtoLocOrErr = import(*FromProtoLoc))
4075 ProtocolLocs.push_back(*ToProtoLocOrErr);
4076 else
4077 return ToProtoLocOrErr.takeError();
4078
Douglas Gregor2aa53772012-01-24 17:42:07 +00004079 }
Fangrui Song6907ce22018-07-30 19:24:48 +00004080
Douglas Gregor2aa53772012-01-24 17:42:07 +00004081 // FIXME: If we're merging, make sure that the protocol list is the same.
4082 To->setProtocolList(Protocols.data(), Protocols.size(),
4083 ProtocolLocs.data(), Importer.getToContext());
4084
Douglas Gregor2e15c842012-02-01 21:00:38 +00004085 if (shouldForceImportDeclContext(Kind)) {
4086 // Import all of the members of this protocol.
Balazs Keri3b30d652018-10-19 13:32:20 +00004087 if (Error Err = ImportDeclContext(From, /*ForceImport=*/true))
4088 return Err;
Douglas Gregor2e15c842012-02-01 21:00:38 +00004089 }
Balazs Keri3b30d652018-10-19 13:32:20 +00004090 return Error::success();
Douglas Gregor2aa53772012-01-24 17:42:07 +00004091}
4092
Balazs Keri3b30d652018-10-19 13:32:20 +00004093ExpectedDecl ASTNodeImporter::VisitObjCProtocolDecl(ObjCProtocolDecl *D) {
Fangrui Song6907ce22018-07-30 19:24:48 +00004094 // If this protocol has a definition in the translation unit we're coming
Douglas Gregor2aa53772012-01-24 17:42:07 +00004095 // from, but this particular declaration is not that definition, import the
4096 // definition and map to that.
4097 ObjCProtocolDecl *Definition = D->getDefinition();
4098 if (Definition && Definition != D) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004099 if (ExpectedDecl ImportedDefOrErr = import(Definition))
4100 return Importer.MapImported(D, *ImportedDefOrErr);
4101 else
4102 return ImportedDefOrErr.takeError();
Douglas Gregor2aa53772012-01-24 17:42:07 +00004103 }
4104
Douglas Gregor84c51c32010-02-18 01:47:50 +00004105 // Import the major distinguishing characteristics of a protocol.
Douglas Gregor98d156a2010-02-17 16:12:00 +00004106 DeclContext *DC, *LexicalDC;
4107 DeclarationName Name;
4108 SourceLocation Loc;
Sean Callanan59721b32015-04-28 18:41:46 +00004109 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00004110 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
4111 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00004112 if (ToD)
4113 return ToD;
Douglas Gregor98d156a2010-02-17 16:12:00 +00004114
Craig Topper36250ad2014-05-12 05:36:57 +00004115 ObjCProtocolDecl *MergeWithProtocol = nullptr;
Gabor Marton54058b52018-12-17 13:53:12 +00004116 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00004117 for (auto *FoundDecl : FoundDecls) {
4118 if (!FoundDecl->isInIdentifierNamespace(Decl::IDNS_ObjCProtocol))
Douglas Gregor98d156a2010-02-17 16:12:00 +00004119 continue;
Fangrui Song6907ce22018-07-30 19:24:48 +00004120
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00004121 if ((MergeWithProtocol = dyn_cast<ObjCProtocolDecl>(FoundDecl)))
Douglas Gregor98d156a2010-02-17 16:12:00 +00004122 break;
4123 }
Fangrui Song6907ce22018-07-30 19:24:48 +00004124
Douglas Gregor98d156a2010-02-17 16:12:00 +00004125 ObjCProtocolDecl *ToProto = MergeWithProtocol;
Douglas Gregor2aa53772012-01-24 17:42:07 +00004126 if (!ToProto) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004127 auto ToAtBeginLocOrErr = import(D->getAtStartLoc());
4128 if (!ToAtBeginLocOrErr)
4129 return ToAtBeginLocOrErr.takeError();
4130
Gabor Marton26f72a92018-07-12 09:42:05 +00004131 if (GetImportedOrCreateDecl(ToProto, D, Importer.getToContext(), DC,
4132 Name.getAsIdentifierInfo(), Loc,
Balazs Keri3b30d652018-10-19 13:32:20 +00004133 *ToAtBeginLocOrErr,
Gabor Marton26f72a92018-07-12 09:42:05 +00004134 /*PrevDecl=*/nullptr))
4135 return ToProto;
Douglas Gregor2aa53772012-01-24 17:42:07 +00004136 ToProto->setLexicalDeclContext(LexicalDC);
4137 LexicalDC->addDeclInternal(ToProto);
Douglas Gregor98d156a2010-02-17 16:12:00 +00004138 }
Gabor Marton26f72a92018-07-12 09:42:05 +00004139
4140 Importer.MapImported(D, ToProto);
Douglas Gregor98d156a2010-02-17 16:12:00 +00004141
Balazs Keri3b30d652018-10-19 13:32:20 +00004142 if (D->isThisDeclarationADefinition())
4143 if (Error Err = ImportDefinition(D, ToProto))
4144 return std::move(Err);
Craig Topper36250ad2014-05-12 05:36:57 +00004145
Douglas Gregor98d156a2010-02-17 16:12:00 +00004146 return ToProto;
4147}
4148
Balazs Keri3b30d652018-10-19 13:32:20 +00004149ExpectedDecl ASTNodeImporter::VisitLinkageSpecDecl(LinkageSpecDecl *D) {
4150 DeclContext *DC, *LexicalDC;
4151 if (Error Err = ImportDeclContext(D, DC, LexicalDC))
4152 return std::move(Err);
Sean Callanan0aae0412014-12-10 00:00:37 +00004153
Balazs Keri3b30d652018-10-19 13:32:20 +00004154 ExpectedSLoc ExternLocOrErr = import(D->getExternLoc());
4155 if (!ExternLocOrErr)
4156 return ExternLocOrErr.takeError();
4157
4158 ExpectedSLoc LangLocOrErr = import(D->getLocation());
4159 if (!LangLocOrErr)
4160 return LangLocOrErr.takeError();
Sean Callanan0aae0412014-12-10 00:00:37 +00004161
4162 bool HasBraces = D->hasBraces();
Gabor Marton26f72a92018-07-12 09:42:05 +00004163
4164 LinkageSpecDecl *ToLinkageSpec;
4165 if (GetImportedOrCreateDecl(ToLinkageSpec, D, Importer.getToContext(), DC,
Balazs Keri3b30d652018-10-19 13:32:20 +00004166 *ExternLocOrErr, *LangLocOrErr,
4167 D->getLanguage(), HasBraces))
Gabor Marton26f72a92018-07-12 09:42:05 +00004168 return ToLinkageSpec;
Sean Callanan0aae0412014-12-10 00:00:37 +00004169
4170 if (HasBraces) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004171 ExpectedSLoc RBraceLocOrErr = import(D->getRBraceLoc());
4172 if (!RBraceLocOrErr)
4173 return RBraceLocOrErr.takeError();
4174 ToLinkageSpec->setRBraceLoc(*RBraceLocOrErr);
Sean Callanan0aae0412014-12-10 00:00:37 +00004175 }
4176
4177 ToLinkageSpec->setLexicalDeclContext(LexicalDC);
4178 LexicalDC->addDeclInternal(ToLinkageSpec);
4179
Sean Callanan0aae0412014-12-10 00:00:37 +00004180 return ToLinkageSpec;
4181}
4182
Balazs Keri3b30d652018-10-19 13:32:20 +00004183ExpectedDecl ASTNodeImporter::VisitUsingDecl(UsingDecl *D) {
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004184 DeclContext *DC, *LexicalDC;
4185 DeclarationName Name;
4186 SourceLocation Loc;
4187 NamedDecl *ToD = nullptr;
Balazs Keri3b30d652018-10-19 13:32:20 +00004188 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
4189 return std::move(Err);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004190 if (ToD)
4191 return ToD;
4192
Balazs Keri3b30d652018-10-19 13:32:20 +00004193 SourceLocation ToLoc, ToUsingLoc;
4194 NestedNameSpecifierLoc ToQualifierLoc;
4195 if (auto Imp = importSeq(
4196 D->getNameInfo().getLoc(), D->getUsingLoc(), D->getQualifierLoc()))
4197 std::tie(ToLoc, ToUsingLoc, ToQualifierLoc) = *Imp;
4198 else
4199 return Imp.takeError();
4200
4201 DeclarationNameInfo NameInfo(Name, ToLoc);
4202 if (Error Err = ImportDeclarationNameLoc(D->getNameInfo(), NameInfo))
4203 return std::move(Err);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004204
Gabor Marton26f72a92018-07-12 09:42:05 +00004205 UsingDecl *ToUsing;
4206 if (GetImportedOrCreateDecl(ToUsing, D, Importer.getToContext(), DC,
Balazs Keri3b30d652018-10-19 13:32:20 +00004207 ToUsingLoc, ToQualifierLoc, NameInfo,
Gabor Marton26f72a92018-07-12 09:42:05 +00004208 D->hasTypename()))
4209 return ToUsing;
4210
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004211 ToUsing->setLexicalDeclContext(LexicalDC);
4212 LexicalDC->addDeclInternal(ToUsing);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004213
4214 if (NamedDecl *FromPattern =
4215 Importer.getFromContext().getInstantiatedFromUsingDecl(D)) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004216 if (Expected<NamedDecl *> ToPatternOrErr = import(FromPattern))
4217 Importer.getToContext().setInstantiatedFromUsingDecl(
4218 ToUsing, *ToPatternOrErr);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004219 else
Balazs Keri3b30d652018-10-19 13:32:20 +00004220 return ToPatternOrErr.takeError();
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004221 }
4222
Balazs Keri3b30d652018-10-19 13:32:20 +00004223 for (UsingShadowDecl *FromShadow : D->shadows()) {
4224 if (Expected<UsingShadowDecl *> ToShadowOrErr = import(FromShadow))
4225 ToUsing->addShadowDecl(*ToShadowOrErr);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004226 else
Balazs Keri3b30d652018-10-19 13:32:20 +00004227 // FIXME: We return error here but the definition is already created
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004228 // and available with lookups. How to fix this?..
Balazs Keri3b30d652018-10-19 13:32:20 +00004229 return ToShadowOrErr.takeError();
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004230 }
4231 return ToUsing;
4232}
4233
Balazs Keri3b30d652018-10-19 13:32:20 +00004234ExpectedDecl ASTNodeImporter::VisitUsingShadowDecl(UsingShadowDecl *D) {
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004235 DeclContext *DC, *LexicalDC;
4236 DeclarationName Name;
4237 SourceLocation Loc;
4238 NamedDecl *ToD = nullptr;
Balazs Keri3b30d652018-10-19 13:32:20 +00004239 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
4240 return std::move(Err);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004241 if (ToD)
4242 return ToD;
4243
Balazs Keri3b30d652018-10-19 13:32:20 +00004244 Expected<UsingDecl *> ToUsingOrErr = import(D->getUsingDecl());
4245 if (!ToUsingOrErr)
4246 return ToUsingOrErr.takeError();
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004247
Balazs Keri3b30d652018-10-19 13:32:20 +00004248 Expected<NamedDecl *> ToTargetOrErr = import(D->getTargetDecl());
4249 if (!ToTargetOrErr)
4250 return ToTargetOrErr.takeError();
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004251
Gabor Marton26f72a92018-07-12 09:42:05 +00004252 UsingShadowDecl *ToShadow;
4253 if (GetImportedOrCreateDecl(ToShadow, D, Importer.getToContext(), DC, Loc,
Balazs Keri3b30d652018-10-19 13:32:20 +00004254 *ToUsingOrErr, *ToTargetOrErr))
Gabor Marton26f72a92018-07-12 09:42:05 +00004255 return ToShadow;
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004256
4257 ToShadow->setLexicalDeclContext(LexicalDC);
4258 ToShadow->setAccess(D->getAccess());
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004259
4260 if (UsingShadowDecl *FromPattern =
4261 Importer.getFromContext().getInstantiatedFromUsingShadowDecl(D)) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004262 if (Expected<UsingShadowDecl *> ToPatternOrErr = import(FromPattern))
4263 Importer.getToContext().setInstantiatedFromUsingShadowDecl(
4264 ToShadow, *ToPatternOrErr);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004265 else
Balazs Keri3b30d652018-10-19 13:32:20 +00004266 // FIXME: We return error here but the definition is already created
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004267 // and available with lookups. How to fix this?..
Balazs Keri3b30d652018-10-19 13:32:20 +00004268 return ToPatternOrErr.takeError();
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004269 }
4270
4271 LexicalDC->addDeclInternal(ToShadow);
4272
4273 return ToShadow;
4274}
4275
Balazs Keri3b30d652018-10-19 13:32:20 +00004276ExpectedDecl ASTNodeImporter::VisitUsingDirectiveDecl(UsingDirectiveDecl *D) {
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004277 DeclContext *DC, *LexicalDC;
4278 DeclarationName Name;
4279 SourceLocation Loc;
4280 NamedDecl *ToD = nullptr;
Balazs Keri3b30d652018-10-19 13:32:20 +00004281 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
4282 return std::move(Err);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004283 if (ToD)
4284 return ToD;
4285
Balazs Keri3b30d652018-10-19 13:32:20 +00004286 auto ToComAncestorOrErr = Importer.ImportContext(D->getCommonAncestor());
4287 if (!ToComAncestorOrErr)
4288 return ToComAncestorOrErr.takeError();
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004289
Balazs Keri3b30d652018-10-19 13:32:20 +00004290 NamespaceDecl *ToNominatedNamespace;
4291 SourceLocation ToUsingLoc, ToNamespaceKeyLocation, ToIdentLocation;
4292 NestedNameSpecifierLoc ToQualifierLoc;
4293 if (auto Imp = importSeq(
4294 D->getNominatedNamespace(), D->getUsingLoc(),
4295 D->getNamespaceKeyLocation(), D->getQualifierLoc(),
4296 D->getIdentLocation()))
4297 std::tie(
4298 ToNominatedNamespace, ToUsingLoc, ToNamespaceKeyLocation,
4299 ToQualifierLoc, ToIdentLocation) = *Imp;
4300 else
4301 return Imp.takeError();
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004302
Gabor Marton26f72a92018-07-12 09:42:05 +00004303 UsingDirectiveDecl *ToUsingDir;
4304 if (GetImportedOrCreateDecl(ToUsingDir, D, Importer.getToContext(), DC,
Balazs Keri3b30d652018-10-19 13:32:20 +00004305 ToUsingLoc,
4306 ToNamespaceKeyLocation,
4307 ToQualifierLoc,
4308 ToIdentLocation,
4309 ToNominatedNamespace, *ToComAncestorOrErr))
Gabor Marton26f72a92018-07-12 09:42:05 +00004310 return ToUsingDir;
4311
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004312 ToUsingDir->setLexicalDeclContext(LexicalDC);
4313 LexicalDC->addDeclInternal(ToUsingDir);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004314
4315 return ToUsingDir;
4316}
4317
Balazs Keri3b30d652018-10-19 13:32:20 +00004318ExpectedDecl ASTNodeImporter::VisitUnresolvedUsingValueDecl(
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004319 UnresolvedUsingValueDecl *D) {
4320 DeclContext *DC, *LexicalDC;
4321 DeclarationName Name;
4322 SourceLocation Loc;
4323 NamedDecl *ToD = nullptr;
Balazs Keri3b30d652018-10-19 13:32:20 +00004324 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
4325 return std::move(Err);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004326 if (ToD)
4327 return ToD;
4328
Balazs Keri3b30d652018-10-19 13:32:20 +00004329 SourceLocation ToLoc, ToUsingLoc, ToEllipsisLoc;
4330 NestedNameSpecifierLoc ToQualifierLoc;
4331 if (auto Imp = importSeq(
4332 D->getNameInfo().getLoc(), D->getUsingLoc(), D->getQualifierLoc(),
4333 D->getEllipsisLoc()))
4334 std::tie(ToLoc, ToUsingLoc, ToQualifierLoc, ToEllipsisLoc) = *Imp;
4335 else
4336 return Imp.takeError();
4337
4338 DeclarationNameInfo NameInfo(Name, ToLoc);
4339 if (Error Err = ImportDeclarationNameLoc(D->getNameInfo(), NameInfo))
4340 return std::move(Err);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004341
Gabor Marton26f72a92018-07-12 09:42:05 +00004342 UnresolvedUsingValueDecl *ToUsingValue;
4343 if (GetImportedOrCreateDecl(ToUsingValue, D, Importer.getToContext(), DC,
Balazs Keri3b30d652018-10-19 13:32:20 +00004344 ToUsingLoc, ToQualifierLoc, NameInfo,
4345 ToEllipsisLoc))
Gabor Marton26f72a92018-07-12 09:42:05 +00004346 return ToUsingValue;
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004347
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004348 ToUsingValue->setAccess(D->getAccess());
4349 ToUsingValue->setLexicalDeclContext(LexicalDC);
4350 LexicalDC->addDeclInternal(ToUsingValue);
4351
4352 return ToUsingValue;
4353}
4354
Balazs Keri3b30d652018-10-19 13:32:20 +00004355ExpectedDecl ASTNodeImporter::VisitUnresolvedUsingTypenameDecl(
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004356 UnresolvedUsingTypenameDecl *D) {
4357 DeclContext *DC, *LexicalDC;
4358 DeclarationName Name;
4359 SourceLocation Loc;
4360 NamedDecl *ToD = nullptr;
Balazs Keri3b30d652018-10-19 13:32:20 +00004361 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
4362 return std::move(Err);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004363 if (ToD)
4364 return ToD;
4365
Balazs Keri3b30d652018-10-19 13:32:20 +00004366 SourceLocation ToUsingLoc, ToTypenameLoc, ToEllipsisLoc;
4367 NestedNameSpecifierLoc ToQualifierLoc;
4368 if (auto Imp = importSeq(
4369 D->getUsingLoc(), D->getTypenameLoc(), D->getQualifierLoc(),
4370 D->getEllipsisLoc()))
4371 std::tie(ToUsingLoc, ToTypenameLoc, ToQualifierLoc, ToEllipsisLoc) = *Imp;
4372 else
4373 return Imp.takeError();
4374
Gabor Marton26f72a92018-07-12 09:42:05 +00004375 UnresolvedUsingTypenameDecl *ToUsing;
4376 if (GetImportedOrCreateDecl(ToUsing, D, Importer.getToContext(), DC,
Balazs Keri3b30d652018-10-19 13:32:20 +00004377 ToUsingLoc, ToTypenameLoc,
4378 ToQualifierLoc, Loc, Name, ToEllipsisLoc))
Gabor Marton26f72a92018-07-12 09:42:05 +00004379 return ToUsing;
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004380
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004381 ToUsing->setAccess(D->getAccess());
4382 ToUsing->setLexicalDeclContext(LexicalDC);
4383 LexicalDC->addDeclInternal(ToUsing);
4384
4385 return ToUsing;
4386}
4387
Balazs Keri3b30d652018-10-19 13:32:20 +00004388
4389Error ASTNodeImporter::ImportDefinition(
4390 ObjCInterfaceDecl *From, ObjCInterfaceDecl *To, ImportDefinitionKind Kind) {
Douglas Gregor2aa53772012-01-24 17:42:07 +00004391 if (To->getDefinition()) {
4392 // Check consistency of superclass.
4393 ObjCInterfaceDecl *FromSuper = From->getSuperClass();
4394 if (FromSuper) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004395 if (auto FromSuperOrErr = import(FromSuper))
4396 FromSuper = *FromSuperOrErr;
4397 else
4398 return FromSuperOrErr.takeError();
Douglas Gregor2aa53772012-01-24 17:42:07 +00004399 }
Fangrui Song6907ce22018-07-30 19:24:48 +00004400
4401 ObjCInterfaceDecl *ToSuper = To->getSuperClass();
Douglas Gregor2aa53772012-01-24 17:42:07 +00004402 if ((bool)FromSuper != (bool)ToSuper ||
4403 (FromSuper && !declaresSameEntity(FromSuper, ToSuper))) {
Fangrui Song6907ce22018-07-30 19:24:48 +00004404 Importer.ToDiag(To->getLocation(),
Douglas Gregor2aa53772012-01-24 17:42:07 +00004405 diag::err_odr_objc_superclass_inconsistent)
4406 << To->getDeclName();
4407 if (ToSuper)
4408 Importer.ToDiag(To->getSuperClassLoc(), diag::note_odr_objc_superclass)
4409 << To->getSuperClass()->getDeclName();
4410 else
Fangrui Song6907ce22018-07-30 19:24:48 +00004411 Importer.ToDiag(To->getLocation(),
Douglas Gregor2aa53772012-01-24 17:42:07 +00004412 diag::note_odr_objc_missing_superclass);
4413 if (From->getSuperClass())
Fangrui Song6907ce22018-07-30 19:24:48 +00004414 Importer.FromDiag(From->getSuperClassLoc(),
Douglas Gregor2aa53772012-01-24 17:42:07 +00004415 diag::note_odr_objc_superclass)
4416 << From->getSuperClass()->getDeclName();
4417 else
Fangrui Song6907ce22018-07-30 19:24:48 +00004418 Importer.FromDiag(From->getLocation(),
4419 diag::note_odr_objc_missing_superclass);
Douglas Gregor2aa53772012-01-24 17:42:07 +00004420 }
Fangrui Song6907ce22018-07-30 19:24:48 +00004421
Douglas Gregor2e15c842012-02-01 21:00:38 +00004422 if (shouldForceImportDeclContext(Kind))
Balazs Keri3b30d652018-10-19 13:32:20 +00004423 if (Error Err = ImportDeclContext(From))
4424 return Err;
4425 return Error::success();
Douglas Gregor2aa53772012-01-24 17:42:07 +00004426 }
Fangrui Song6907ce22018-07-30 19:24:48 +00004427
Douglas Gregor2aa53772012-01-24 17:42:07 +00004428 // Start the definition.
4429 To->startDefinition();
Fangrui Song6907ce22018-07-30 19:24:48 +00004430
Douglas Gregor2aa53772012-01-24 17:42:07 +00004431 // If this class has a superclass, import it.
4432 if (From->getSuperClass()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004433 if (auto SuperTInfoOrErr = import(From->getSuperClassTInfo()))
4434 To->setSuperClass(*SuperTInfoOrErr);
4435 else
4436 return SuperTInfoOrErr.takeError();
Douglas Gregor2aa53772012-01-24 17:42:07 +00004437 }
Fangrui Song6907ce22018-07-30 19:24:48 +00004438
Douglas Gregor2aa53772012-01-24 17:42:07 +00004439 // Import protocols
4440 SmallVector<ObjCProtocolDecl *, 4> Protocols;
4441 SmallVector<SourceLocation, 4> ProtocolLocs;
Balazs Keri3b30d652018-10-19 13:32:20 +00004442 ObjCInterfaceDecl::protocol_loc_iterator FromProtoLoc =
4443 From->protocol_loc_begin();
Fangrui Song6907ce22018-07-30 19:24:48 +00004444
Douglas Gregor2aa53772012-01-24 17:42:07 +00004445 for (ObjCInterfaceDecl::protocol_iterator FromProto = From->protocol_begin(),
4446 FromProtoEnd = From->protocol_end();
4447 FromProto != FromProtoEnd;
4448 ++FromProto, ++FromProtoLoc) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004449 if (Expected<ObjCProtocolDecl *> ToProtoOrErr = import(*FromProto))
4450 Protocols.push_back(*ToProtoOrErr);
4451 else
4452 return ToProtoOrErr.takeError();
4453
4454 if (ExpectedSLoc ToProtoLocOrErr = import(*FromProtoLoc))
4455 ProtocolLocs.push_back(*ToProtoLocOrErr);
4456 else
4457 return ToProtoLocOrErr.takeError();
4458
Douglas Gregor2aa53772012-01-24 17:42:07 +00004459 }
Fangrui Song6907ce22018-07-30 19:24:48 +00004460
Douglas Gregor2aa53772012-01-24 17:42:07 +00004461 // FIXME: If we're merging, make sure that the protocol list is the same.
4462 To->setProtocolList(Protocols.data(), Protocols.size(),
4463 ProtocolLocs.data(), Importer.getToContext());
Fangrui Song6907ce22018-07-30 19:24:48 +00004464
Douglas Gregor2aa53772012-01-24 17:42:07 +00004465 // Import categories. When the categories themselves are imported, they'll
4466 // hook themselves into this interface.
Balazs Keri3b30d652018-10-19 13:32:20 +00004467 for (auto *Cat : From->known_categories()) {
4468 auto ToCatOrErr = import(Cat);
4469 if (!ToCatOrErr)
4470 return ToCatOrErr.takeError();
4471 }
Fangrui Song6907ce22018-07-30 19:24:48 +00004472
Douglas Gregor2aa53772012-01-24 17:42:07 +00004473 // If we have an @implementation, import it as well.
4474 if (From->getImplementation()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004475 if (Expected<ObjCImplementationDecl *> ToImplOrErr =
4476 import(From->getImplementation()))
4477 To->setImplementation(*ToImplOrErr);
4478 else
4479 return ToImplOrErr.takeError();
Douglas Gregor2aa53772012-01-24 17:42:07 +00004480 }
4481
Douglas Gregor2e15c842012-02-01 21:00:38 +00004482 if (shouldForceImportDeclContext(Kind)) {
4483 // Import all of the members of this class.
Balazs Keri3b30d652018-10-19 13:32:20 +00004484 if (Error Err = ImportDeclContext(From, /*ForceImport=*/true))
4485 return Err;
Douglas Gregor2e15c842012-02-01 21:00:38 +00004486 }
Balazs Keri3b30d652018-10-19 13:32:20 +00004487 return Error::success();
Douglas Gregor2aa53772012-01-24 17:42:07 +00004488}
4489
Balazs Keri3b30d652018-10-19 13:32:20 +00004490Expected<ObjCTypeParamList *>
Douglas Gregor85f3f952015-07-07 03:57:15 +00004491ASTNodeImporter::ImportObjCTypeParamList(ObjCTypeParamList *list) {
4492 if (!list)
4493 return nullptr;
4494
4495 SmallVector<ObjCTypeParamDecl *, 4> toTypeParams;
Balazs Keri3b30d652018-10-19 13:32:20 +00004496 for (auto *fromTypeParam : *list) {
4497 if (auto toTypeParamOrErr = import(fromTypeParam))
4498 toTypeParams.push_back(*toTypeParamOrErr);
4499 else
4500 return toTypeParamOrErr.takeError();
Douglas Gregor85f3f952015-07-07 03:57:15 +00004501 }
4502
Balazs Keri3b30d652018-10-19 13:32:20 +00004503 auto LAngleLocOrErr = import(list->getLAngleLoc());
4504 if (!LAngleLocOrErr)
4505 return LAngleLocOrErr.takeError();
4506
4507 auto RAngleLocOrErr = import(list->getRAngleLoc());
4508 if (!RAngleLocOrErr)
4509 return RAngleLocOrErr.takeError();
4510
Douglas Gregor85f3f952015-07-07 03:57:15 +00004511 return ObjCTypeParamList::create(Importer.getToContext(),
Balazs Keri3b30d652018-10-19 13:32:20 +00004512 *LAngleLocOrErr,
Douglas Gregor85f3f952015-07-07 03:57:15 +00004513 toTypeParams,
Balazs Keri3b30d652018-10-19 13:32:20 +00004514 *RAngleLocOrErr);
Douglas Gregor85f3f952015-07-07 03:57:15 +00004515}
4516
Balazs Keri3b30d652018-10-19 13:32:20 +00004517ExpectedDecl ASTNodeImporter::VisitObjCInterfaceDecl(ObjCInterfaceDecl *D) {
Douglas Gregor2aa53772012-01-24 17:42:07 +00004518 // If this class has a definition in the translation unit we're coming from,
4519 // but this particular declaration is not that definition, import the
4520 // definition and map to that.
4521 ObjCInterfaceDecl *Definition = D->getDefinition();
4522 if (Definition && Definition != D) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004523 if (ExpectedDecl ImportedDefOrErr = import(Definition))
4524 return Importer.MapImported(D, *ImportedDefOrErr);
4525 else
4526 return ImportedDefOrErr.takeError();
Douglas Gregor2aa53772012-01-24 17:42:07 +00004527 }
4528
Douglas Gregor45635322010-02-16 01:20:57 +00004529 // Import the major distinguishing characteristics of an @interface.
4530 DeclContext *DC, *LexicalDC;
4531 DeclarationName Name;
4532 SourceLocation Loc;
Sean Callanan59721b32015-04-28 18:41:46 +00004533 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00004534 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
4535 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00004536 if (ToD)
4537 return ToD;
Douglas Gregor45635322010-02-16 01:20:57 +00004538
Douglas Gregor2aa53772012-01-24 17:42:07 +00004539 // Look for an existing interface with the same name.
Craig Topper36250ad2014-05-12 05:36:57 +00004540 ObjCInterfaceDecl *MergeWithIface = nullptr;
Gabor Marton54058b52018-12-17 13:53:12 +00004541 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00004542 for (auto *FoundDecl : FoundDecls) {
4543 if (!FoundDecl->isInIdentifierNamespace(Decl::IDNS_Ordinary))
Douglas Gregor45635322010-02-16 01:20:57 +00004544 continue;
Fangrui Song6907ce22018-07-30 19:24:48 +00004545
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00004546 if ((MergeWithIface = dyn_cast<ObjCInterfaceDecl>(FoundDecl)))
Douglas Gregor45635322010-02-16 01:20:57 +00004547 break;
4548 }
Fangrui Song6907ce22018-07-30 19:24:48 +00004549
Douglas Gregor2aa53772012-01-24 17:42:07 +00004550 // Create an interface declaration, if one does not already exist.
Douglas Gregor45635322010-02-16 01:20:57 +00004551 ObjCInterfaceDecl *ToIface = MergeWithIface;
Douglas Gregor2aa53772012-01-24 17:42:07 +00004552 if (!ToIface) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004553 ExpectedSLoc AtBeginLocOrErr = import(D->getAtStartLoc());
4554 if (!AtBeginLocOrErr)
4555 return AtBeginLocOrErr.takeError();
4556
Gabor Marton26f72a92018-07-12 09:42:05 +00004557 if (GetImportedOrCreateDecl(
4558 ToIface, D, Importer.getToContext(), DC,
Balazs Keri3b30d652018-10-19 13:32:20 +00004559 *AtBeginLocOrErr, Name.getAsIdentifierInfo(),
Gabor Marton26f72a92018-07-12 09:42:05 +00004560 /*TypeParamList=*/nullptr,
4561 /*PrevDecl=*/nullptr, Loc, D->isImplicitInterfaceDecl()))
4562 return ToIface;
Douglas Gregor2aa53772012-01-24 17:42:07 +00004563 ToIface->setLexicalDeclContext(LexicalDC);
4564 LexicalDC->addDeclInternal(ToIface);
Douglas Gregor45635322010-02-16 01:20:57 +00004565 }
Gabor Marton26f72a92018-07-12 09:42:05 +00004566 Importer.MapImported(D, ToIface);
Balazs Keri3b30d652018-10-19 13:32:20 +00004567 // Import the type parameter list after MapImported, to avoid
Douglas Gregorab7f0b32015-07-07 06:20:12 +00004568 // loops when bringing in their DeclContext.
Balazs Keri3b30d652018-10-19 13:32:20 +00004569 if (auto ToPListOrErr =
4570 ImportObjCTypeParamList(D->getTypeParamListAsWritten()))
4571 ToIface->setTypeParamList(*ToPListOrErr);
4572 else
4573 return ToPListOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00004574
Balazs Keri3b30d652018-10-19 13:32:20 +00004575 if (D->isThisDeclarationADefinition())
4576 if (Error Err = ImportDefinition(D, ToIface))
4577 return std::move(Err);
Craig Topper36250ad2014-05-12 05:36:57 +00004578
Douglas Gregor98d156a2010-02-17 16:12:00 +00004579 return ToIface;
Douglas Gregor45635322010-02-16 01:20:57 +00004580}
4581
Balazs Keri3b30d652018-10-19 13:32:20 +00004582ExpectedDecl
4583ASTNodeImporter::VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D) {
4584 ObjCCategoryDecl *Category;
4585 if (Error Err = importInto(Category, D->getCategoryDecl()))
4586 return std::move(Err);
Craig Topper36250ad2014-05-12 05:36:57 +00004587
Douglas Gregor4da9d682010-12-07 15:32:12 +00004588 ObjCCategoryImplDecl *ToImpl = Category->getImplementation();
4589 if (!ToImpl) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004590 DeclContext *DC, *LexicalDC;
4591 if (Error Err = ImportDeclContext(D, DC, LexicalDC))
4592 return std::move(Err);
Craig Topper36250ad2014-05-12 05:36:57 +00004593
Balazs Keri3b30d652018-10-19 13:32:20 +00004594 SourceLocation ToLocation, ToAtStartLoc, ToCategoryNameLoc;
4595 if (auto Imp = importSeq(
4596 D->getLocation(), D->getAtStartLoc(), D->getCategoryNameLoc()))
4597 std::tie(ToLocation, ToAtStartLoc, ToCategoryNameLoc) = *Imp;
4598 else
4599 return Imp.takeError();
4600
Gabor Marton26f72a92018-07-12 09:42:05 +00004601 if (GetImportedOrCreateDecl(
4602 ToImpl, D, Importer.getToContext(), DC,
4603 Importer.Import(D->getIdentifier()), Category->getClassInterface(),
Balazs Keri3b30d652018-10-19 13:32:20 +00004604 ToLocation, ToAtStartLoc, ToCategoryNameLoc))
Gabor Marton26f72a92018-07-12 09:42:05 +00004605 return ToImpl;
4606
Balazs Keri3b30d652018-10-19 13:32:20 +00004607 ToImpl->setLexicalDeclContext(LexicalDC);
Sean Callanan95e74be2011-10-21 02:57:43 +00004608 LexicalDC->addDeclInternal(ToImpl);
Douglas Gregor4da9d682010-12-07 15:32:12 +00004609 Category->setImplementation(ToImpl);
4610 }
Fangrui Song6907ce22018-07-30 19:24:48 +00004611
Gabor Marton26f72a92018-07-12 09:42:05 +00004612 Importer.MapImported(D, ToImpl);
Balazs Keri3b30d652018-10-19 13:32:20 +00004613 if (Error Err = ImportDeclContext(D))
4614 return std::move(Err);
4615
Douglas Gregor4da9d682010-12-07 15:32:12 +00004616 return ToImpl;
4617}
4618
Balazs Keri3b30d652018-10-19 13:32:20 +00004619ExpectedDecl
4620ASTNodeImporter::VisitObjCImplementationDecl(ObjCImplementationDecl *D) {
Douglas Gregorda8025c2010-12-07 01:26:03 +00004621 // Find the corresponding interface.
Balazs Keri3b30d652018-10-19 13:32:20 +00004622 ObjCInterfaceDecl *Iface;
4623 if (Error Err = importInto(Iface, D->getClassInterface()))
4624 return std::move(Err);
Douglas Gregorda8025c2010-12-07 01:26:03 +00004625
4626 // Import the superclass, if any.
Balazs Keri3b30d652018-10-19 13:32:20 +00004627 ObjCInterfaceDecl *Super;
4628 if (Error Err = importInto(Super, D->getSuperClass()))
4629 return std::move(Err);
Douglas Gregorda8025c2010-12-07 01:26:03 +00004630
4631 ObjCImplementationDecl *Impl = Iface->getImplementation();
4632 if (!Impl) {
4633 // We haven't imported an implementation yet. Create a new @implementation
4634 // now.
Balazs Keri3b30d652018-10-19 13:32:20 +00004635 DeclContext *DC, *LexicalDC;
4636 if (Error Err = ImportDeclContext(D, DC, LexicalDC))
4637 return std::move(Err);
4638
4639 SourceLocation ToLocation, ToAtStartLoc, ToSuperClassLoc;
4640 SourceLocation ToIvarLBraceLoc, ToIvarRBraceLoc;
4641 if (auto Imp = importSeq(
4642 D->getLocation(), D->getAtStartLoc(), D->getSuperClassLoc(),
4643 D->getIvarLBraceLoc(), D->getIvarRBraceLoc()))
4644 std::tie(
4645 ToLocation, ToAtStartLoc, ToSuperClassLoc,
4646 ToIvarLBraceLoc, ToIvarRBraceLoc) = *Imp;
4647 else
4648 return Imp.takeError();
4649
Gabor Marton26f72a92018-07-12 09:42:05 +00004650 if (GetImportedOrCreateDecl(Impl, D, Importer.getToContext(),
Balazs Keri3b30d652018-10-19 13:32:20 +00004651 DC, Iface, Super,
4652 ToLocation,
4653 ToAtStartLoc,
4654 ToSuperClassLoc,
4655 ToIvarLBraceLoc,
4656 ToIvarRBraceLoc))
Gabor Marton26f72a92018-07-12 09:42:05 +00004657 return Impl;
4658
Balazs Keri3b30d652018-10-19 13:32:20 +00004659 Impl->setLexicalDeclContext(LexicalDC);
Gabor Marton26f72a92018-07-12 09:42:05 +00004660
Douglas Gregorda8025c2010-12-07 01:26:03 +00004661 // Associate the implementation with the class it implements.
4662 Iface->setImplementation(Impl);
Gabor Marton26f72a92018-07-12 09:42:05 +00004663 Importer.MapImported(D, Iface->getImplementation());
Douglas Gregorda8025c2010-12-07 01:26:03 +00004664 } else {
Gabor Marton26f72a92018-07-12 09:42:05 +00004665 Importer.MapImported(D, Iface->getImplementation());
Douglas Gregorda8025c2010-12-07 01:26:03 +00004666
4667 // Verify that the existing @implementation has the same superclass.
4668 if ((Super && !Impl->getSuperClass()) ||
4669 (!Super && Impl->getSuperClass()) ||
Craig Topperdcfc60f2014-05-07 06:57:44 +00004670 (Super && Impl->getSuperClass() &&
4671 !declaresSameEntity(Super->getCanonicalDecl(),
4672 Impl->getSuperClass()))) {
4673 Importer.ToDiag(Impl->getLocation(),
4674 diag::err_odr_objc_superclass_inconsistent)
4675 << Iface->getDeclName();
4676 // FIXME: It would be nice to have the location of the superclass
4677 // below.
4678 if (Impl->getSuperClass())
4679 Importer.ToDiag(Impl->getLocation(),
4680 diag::note_odr_objc_superclass)
4681 << Impl->getSuperClass()->getDeclName();
4682 else
4683 Importer.ToDiag(Impl->getLocation(),
4684 diag::note_odr_objc_missing_superclass);
4685 if (D->getSuperClass())
4686 Importer.FromDiag(D->getLocation(),
Douglas Gregorda8025c2010-12-07 01:26:03 +00004687 diag::note_odr_objc_superclass)
Craig Topperdcfc60f2014-05-07 06:57:44 +00004688 << D->getSuperClass()->getDeclName();
4689 else
4690 Importer.FromDiag(D->getLocation(),
Douglas Gregorda8025c2010-12-07 01:26:03 +00004691 diag::note_odr_objc_missing_superclass);
Balazs Keri3b30d652018-10-19 13:32:20 +00004692
4693 return make_error<ImportError>(ImportError::NameConflict);
Douglas Gregorda8025c2010-12-07 01:26:03 +00004694 }
4695 }
Fangrui Song6907ce22018-07-30 19:24:48 +00004696
Douglas Gregorda8025c2010-12-07 01:26:03 +00004697 // Import all of the members of this @implementation.
Balazs Keri3b30d652018-10-19 13:32:20 +00004698 if (Error Err = ImportDeclContext(D))
4699 return std::move(Err);
Douglas Gregorda8025c2010-12-07 01:26:03 +00004700
4701 return Impl;
4702}
4703
Balazs Keri3b30d652018-10-19 13:32:20 +00004704ExpectedDecl ASTNodeImporter::VisitObjCPropertyDecl(ObjCPropertyDecl *D) {
Douglas Gregora11c4582010-02-17 18:02:10 +00004705 // Import the major distinguishing characteristics of an @property.
4706 DeclContext *DC, *LexicalDC;
4707 DeclarationName Name;
4708 SourceLocation Loc;
Sean Callanan59721b32015-04-28 18:41:46 +00004709 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00004710 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
4711 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00004712 if (ToD)
4713 return ToD;
Douglas Gregora11c4582010-02-17 18:02:10 +00004714
4715 // Check whether we have already imported this property.
Gabor Marton54058b52018-12-17 13:53:12 +00004716 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00004717 for (auto *FoundDecl : FoundDecls) {
4718 if (auto *FoundProp = dyn_cast<ObjCPropertyDecl>(FoundDecl)) {
Douglas Gregora11c4582010-02-17 18:02:10 +00004719 // Check property types.
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00004720 if (!Importer.IsStructurallyEquivalent(D->getType(),
Douglas Gregora11c4582010-02-17 18:02:10 +00004721 FoundProp->getType())) {
4722 Importer.ToDiag(Loc, diag::err_odr_objc_property_type_inconsistent)
4723 << Name << D->getType() << FoundProp->getType();
4724 Importer.ToDiag(FoundProp->getLocation(), diag::note_odr_value_here)
4725 << FoundProp->getType();
Balazs Keri3b30d652018-10-19 13:32:20 +00004726
4727 return make_error<ImportError>(ImportError::NameConflict);
Douglas Gregora11c4582010-02-17 18:02:10 +00004728 }
4729
4730 // FIXME: Check property attributes, getters, setters, etc.?
4731
4732 // Consider these properties to be equivalent.
Gabor Marton26f72a92018-07-12 09:42:05 +00004733 Importer.MapImported(D, FoundProp);
Douglas Gregora11c4582010-02-17 18:02:10 +00004734 return FoundProp;
4735 }
4736 }
4737
Balazs Keri3b30d652018-10-19 13:32:20 +00004738 QualType ToType;
4739 TypeSourceInfo *ToTypeSourceInfo;
4740 SourceLocation ToAtLoc, ToLParenLoc;
4741 if (auto Imp = importSeq(
4742 D->getType(), D->getTypeSourceInfo(), D->getAtLoc(), D->getLParenLoc()))
4743 std::tie(ToType, ToTypeSourceInfo, ToAtLoc, ToLParenLoc) = *Imp;
4744 else
4745 return Imp.takeError();
Douglas Gregora11c4582010-02-17 18:02:10 +00004746
4747 // Create the new property.
Gabor Marton26f72a92018-07-12 09:42:05 +00004748 ObjCPropertyDecl *ToProperty;
4749 if (GetImportedOrCreateDecl(
4750 ToProperty, D, Importer.getToContext(), DC, Loc,
Balazs Keri3b30d652018-10-19 13:32:20 +00004751 Name.getAsIdentifierInfo(), ToAtLoc,
4752 ToLParenLoc, ToType,
4753 ToTypeSourceInfo, D->getPropertyImplementation()))
Gabor Marton26f72a92018-07-12 09:42:05 +00004754 return ToProperty;
4755
Balazs Keri3b30d652018-10-19 13:32:20 +00004756 Selector ToGetterName, ToSetterName;
4757 SourceLocation ToGetterNameLoc, ToSetterNameLoc;
4758 ObjCMethodDecl *ToGetterMethodDecl, *ToSetterMethodDecl;
4759 ObjCIvarDecl *ToPropertyIvarDecl;
4760 if (auto Imp = importSeq(
4761 D->getGetterName(), D->getSetterName(),
4762 D->getGetterNameLoc(), D->getSetterNameLoc(),
4763 D->getGetterMethodDecl(), D->getSetterMethodDecl(),
4764 D->getPropertyIvarDecl()))
4765 std::tie(
4766 ToGetterName, ToSetterName,
4767 ToGetterNameLoc, ToSetterNameLoc,
4768 ToGetterMethodDecl, ToSetterMethodDecl,
4769 ToPropertyIvarDecl) = *Imp;
4770 else
4771 return Imp.takeError();
4772
Douglas Gregora11c4582010-02-17 18:02:10 +00004773 ToProperty->setLexicalDeclContext(LexicalDC);
Sean Callanan95e74be2011-10-21 02:57:43 +00004774 LexicalDC->addDeclInternal(ToProperty);
Douglas Gregora11c4582010-02-17 18:02:10 +00004775
4776 ToProperty->setPropertyAttributes(D->getPropertyAttributes());
Fariborz Jahanian3bf0ded2010-06-22 23:20:40 +00004777 ToProperty->setPropertyAttributesAsWritten(
4778 D->getPropertyAttributesAsWritten());
Balazs Keri3b30d652018-10-19 13:32:20 +00004779 ToProperty->setGetterName(ToGetterName, ToGetterNameLoc);
4780 ToProperty->setSetterName(ToSetterName, ToSetterNameLoc);
4781 ToProperty->setGetterMethodDecl(ToGetterMethodDecl);
4782 ToProperty->setSetterMethodDecl(ToSetterMethodDecl);
4783 ToProperty->setPropertyIvarDecl(ToPropertyIvarDecl);
Douglas Gregora11c4582010-02-17 18:02:10 +00004784 return ToProperty;
4785}
4786
Balazs Keri3b30d652018-10-19 13:32:20 +00004787ExpectedDecl
4788ASTNodeImporter::VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D) {
4789 ObjCPropertyDecl *Property;
4790 if (Error Err = importInto(Property, D->getPropertyDecl()))
4791 return std::move(Err);
Douglas Gregor14a49e22010-12-07 18:32:03 +00004792
Balazs Keri3b30d652018-10-19 13:32:20 +00004793 DeclContext *DC, *LexicalDC;
4794 if (Error Err = ImportDeclContext(D, DC, LexicalDC))
4795 return std::move(Err);
Craig Topper36250ad2014-05-12 05:36:57 +00004796
Balazs Keri3b30d652018-10-19 13:32:20 +00004797 auto *InImpl = cast<ObjCImplDecl>(LexicalDC);
Douglas Gregor14a49e22010-12-07 18:32:03 +00004798
4799 // Import the ivar (for an @synthesize).
Craig Topper36250ad2014-05-12 05:36:57 +00004800 ObjCIvarDecl *Ivar = nullptr;
Balazs Keri3b30d652018-10-19 13:32:20 +00004801 if (Error Err = importInto(Ivar, D->getPropertyIvarDecl()))
4802 return std::move(Err);
Douglas Gregor14a49e22010-12-07 18:32:03 +00004803
4804 ObjCPropertyImplDecl *ToImpl
Manman Ren5b786402016-01-28 18:49:28 +00004805 = InImpl->FindPropertyImplDecl(Property->getIdentifier(),
4806 Property->getQueryKind());
Gabor Marton26f72a92018-07-12 09:42:05 +00004807 if (!ToImpl) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004808 SourceLocation ToBeginLoc, ToLocation, ToPropertyIvarDeclLoc;
4809 if (auto Imp = importSeq(
4810 D->getBeginLoc(), D->getLocation(), D->getPropertyIvarDeclLoc()))
4811 std::tie(ToBeginLoc, ToLocation, ToPropertyIvarDeclLoc) = *Imp;
4812 else
4813 return Imp.takeError();
4814
Gabor Marton26f72a92018-07-12 09:42:05 +00004815 if (GetImportedOrCreateDecl(ToImpl, D, Importer.getToContext(), DC,
Balazs Keri3b30d652018-10-19 13:32:20 +00004816 ToBeginLoc,
4817 ToLocation, Property,
Gabor Marton26f72a92018-07-12 09:42:05 +00004818 D->getPropertyImplementation(), Ivar,
Balazs Keri3b30d652018-10-19 13:32:20 +00004819 ToPropertyIvarDeclLoc))
Gabor Marton26f72a92018-07-12 09:42:05 +00004820 return ToImpl;
4821
Douglas Gregor14a49e22010-12-07 18:32:03 +00004822 ToImpl->setLexicalDeclContext(LexicalDC);
Sean Callanan95e74be2011-10-21 02:57:43 +00004823 LexicalDC->addDeclInternal(ToImpl);
Douglas Gregor14a49e22010-12-07 18:32:03 +00004824 } else {
4825 // Check that we have the same kind of property implementation (@synthesize
4826 // vs. @dynamic).
4827 if (D->getPropertyImplementation() != ToImpl->getPropertyImplementation()) {
Fangrui Song6907ce22018-07-30 19:24:48 +00004828 Importer.ToDiag(ToImpl->getLocation(),
Douglas Gregor14a49e22010-12-07 18:32:03 +00004829 diag::err_odr_objc_property_impl_kind_inconsistent)
Fangrui Song6907ce22018-07-30 19:24:48 +00004830 << Property->getDeclName()
4831 << (ToImpl->getPropertyImplementation()
Douglas Gregor14a49e22010-12-07 18:32:03 +00004832 == ObjCPropertyImplDecl::Dynamic);
4833 Importer.FromDiag(D->getLocation(),
4834 diag::note_odr_objc_property_impl_kind)
4835 << D->getPropertyDecl()->getDeclName()
4836 << (D->getPropertyImplementation() == ObjCPropertyImplDecl::Dynamic);
Balazs Keri3b30d652018-10-19 13:32:20 +00004837
4838 return make_error<ImportError>(ImportError::NameConflict);
Douglas Gregor14a49e22010-12-07 18:32:03 +00004839 }
Fangrui Song6907ce22018-07-30 19:24:48 +00004840
4841 // For @synthesize, check that we have the same
Douglas Gregor14a49e22010-12-07 18:32:03 +00004842 if (D->getPropertyImplementation() == ObjCPropertyImplDecl::Synthesize &&
4843 Ivar != ToImpl->getPropertyIvarDecl()) {
Fangrui Song6907ce22018-07-30 19:24:48 +00004844 Importer.ToDiag(ToImpl->getPropertyIvarDeclLoc(),
Douglas Gregor14a49e22010-12-07 18:32:03 +00004845 diag::err_odr_objc_synthesize_ivar_inconsistent)
4846 << Property->getDeclName()
4847 << ToImpl->getPropertyIvarDecl()->getDeclName()
4848 << Ivar->getDeclName();
Fangrui Song6907ce22018-07-30 19:24:48 +00004849 Importer.FromDiag(D->getPropertyIvarDeclLoc(),
Douglas Gregor14a49e22010-12-07 18:32:03 +00004850 diag::note_odr_objc_synthesize_ivar_here)
4851 << D->getPropertyIvarDecl()->getDeclName();
Balazs Keri3b30d652018-10-19 13:32:20 +00004852
4853 return make_error<ImportError>(ImportError::NameConflict);
Douglas Gregor14a49e22010-12-07 18:32:03 +00004854 }
Fangrui Song6907ce22018-07-30 19:24:48 +00004855
Douglas Gregor14a49e22010-12-07 18:32:03 +00004856 // Merge the existing implementation with the new implementation.
Gabor Marton26f72a92018-07-12 09:42:05 +00004857 Importer.MapImported(D, ToImpl);
Douglas Gregor14a49e22010-12-07 18:32:03 +00004858 }
Fangrui Song6907ce22018-07-30 19:24:48 +00004859
Douglas Gregor14a49e22010-12-07 18:32:03 +00004860 return ToImpl;
4861}
4862
Balazs Keri3b30d652018-10-19 13:32:20 +00004863ExpectedDecl
4864ASTNodeImporter::VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D) {
Douglas Gregora082a492010-11-30 19:14:50 +00004865 // For template arguments, we adopt the translation unit as our declaration
4866 // context. This context will be fixed when the actual template declaration
4867 // is created.
Fangrui Song6907ce22018-07-30 19:24:48 +00004868
Douglas Gregora082a492010-11-30 19:14:50 +00004869 // FIXME: Import default argument.
Balazs Keri3b30d652018-10-19 13:32:20 +00004870
4871 ExpectedSLoc BeginLocOrErr = import(D->getBeginLoc());
4872 if (!BeginLocOrErr)
4873 return BeginLocOrErr.takeError();
4874
4875 ExpectedSLoc LocationOrErr = import(D->getLocation());
4876 if (!LocationOrErr)
4877 return LocationOrErr.takeError();
4878
Gabor Marton26f72a92018-07-12 09:42:05 +00004879 TemplateTypeParmDecl *ToD = nullptr;
4880 (void)GetImportedOrCreateDecl(
4881 ToD, D, Importer.getToContext(),
4882 Importer.getToContext().getTranslationUnitDecl(),
Balazs Keri3b30d652018-10-19 13:32:20 +00004883 *BeginLocOrErr, *LocationOrErr,
Gabor Marton26f72a92018-07-12 09:42:05 +00004884 D->getDepth(), D->getIndex(), Importer.Import(D->getIdentifier()),
4885 D->wasDeclaredWithTypename(), D->isParameterPack());
4886 return ToD;
Douglas Gregora082a492010-11-30 19:14:50 +00004887}
4888
Balazs Keri3b30d652018-10-19 13:32:20 +00004889ExpectedDecl
Douglas Gregora082a492010-11-30 19:14:50 +00004890ASTNodeImporter::VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004891 DeclarationName ToDeclName;
4892 SourceLocation ToLocation, ToInnerLocStart;
4893 QualType ToType;
4894 TypeSourceInfo *ToTypeSourceInfo;
4895 if (auto Imp = importSeq(
4896 D->getDeclName(), D->getLocation(), D->getType(), D->getTypeSourceInfo(),
4897 D->getInnerLocStart()))
4898 std::tie(
4899 ToDeclName, ToLocation, ToType, ToTypeSourceInfo,
4900 ToInnerLocStart) = *Imp;
4901 else
4902 return Imp.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00004903
Douglas Gregora082a492010-11-30 19:14:50 +00004904 // FIXME: Import default argument.
Gabor Marton26f72a92018-07-12 09:42:05 +00004905
4906 NonTypeTemplateParmDecl *ToD = nullptr;
4907 (void)GetImportedOrCreateDecl(
4908 ToD, D, Importer.getToContext(),
4909 Importer.getToContext().getTranslationUnitDecl(),
Balazs Keri3b30d652018-10-19 13:32:20 +00004910 ToInnerLocStart, ToLocation, D->getDepth(),
4911 D->getPosition(), ToDeclName.getAsIdentifierInfo(), ToType,
4912 D->isParameterPack(), ToTypeSourceInfo);
Gabor Marton26f72a92018-07-12 09:42:05 +00004913 return ToD;
Douglas Gregora082a492010-11-30 19:14:50 +00004914}
4915
Balazs Keri3b30d652018-10-19 13:32:20 +00004916ExpectedDecl
Douglas Gregora082a492010-11-30 19:14:50 +00004917ASTNodeImporter::VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D) {
4918 // Import the name of this declaration.
Balazs Keri3b30d652018-10-19 13:32:20 +00004919 auto NameOrErr = import(D->getDeclName());
4920 if (!NameOrErr)
4921 return NameOrErr.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00004922
Douglas Gregora082a492010-11-30 19:14:50 +00004923 // Import the location of this declaration.
Balazs Keri3b30d652018-10-19 13:32:20 +00004924 ExpectedSLoc LocationOrErr = import(D->getLocation());
4925 if (!LocationOrErr)
4926 return LocationOrErr.takeError();
Gabor Marton26f72a92018-07-12 09:42:05 +00004927
Douglas Gregora082a492010-11-30 19:14:50 +00004928 // Import template parameters.
Balazs Keri3b30d652018-10-19 13:32:20 +00004929 auto TemplateParamsOrErr = ImportTemplateParameterList(
4930 D->getTemplateParameters());
4931 if (!TemplateParamsOrErr)
4932 return TemplateParamsOrErr.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00004933
Douglas Gregora082a492010-11-30 19:14:50 +00004934 // FIXME: Import default argument.
Gabor Marton26f72a92018-07-12 09:42:05 +00004935
4936 TemplateTemplateParmDecl *ToD = nullptr;
4937 (void)GetImportedOrCreateDecl(
4938 ToD, D, Importer.getToContext(),
Balazs Keri3b30d652018-10-19 13:32:20 +00004939 Importer.getToContext().getTranslationUnitDecl(), *LocationOrErr,
4940 D->getDepth(), D->getPosition(), D->isParameterPack(),
4941 (*NameOrErr).getAsIdentifierInfo(),
4942 *TemplateParamsOrErr);
Gabor Marton26f72a92018-07-12 09:42:05 +00004943 return ToD;
Douglas Gregora082a492010-11-30 19:14:50 +00004944}
4945
Gabor Marton9581c332018-05-23 13:53:36 +00004946// Returns the definition for a (forward) declaration of a ClassTemplateDecl, if
4947// it has any definition in the redecl chain.
4948static ClassTemplateDecl *getDefinition(ClassTemplateDecl *D) {
4949 CXXRecordDecl *ToTemplatedDef = D->getTemplatedDecl()->getDefinition();
4950 if (!ToTemplatedDef)
4951 return nullptr;
4952 ClassTemplateDecl *TemplateWithDef =
4953 ToTemplatedDef->getDescribedClassTemplate();
4954 return TemplateWithDef;
4955}
4956
Balazs Keri3b30d652018-10-19 13:32:20 +00004957ExpectedDecl ASTNodeImporter::VisitClassTemplateDecl(ClassTemplateDecl *D) {
Balazs Keri0c23dc52018-08-13 13:08:37 +00004958 bool IsFriend = D->getFriendObjectKind() != Decl::FOK_None;
4959
Douglas Gregora082a492010-11-30 19:14:50 +00004960 // Import the major distinguishing characteristics of this class template.
4961 DeclContext *DC, *LexicalDC;
4962 DeclarationName Name;
4963 SourceLocation Loc;
Sean Callanan59721b32015-04-28 18:41:46 +00004964 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00004965 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
4966 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00004967 if (ToD)
4968 return ToD;
Craig Topper36250ad2014-05-12 05:36:57 +00004969
Gabor Marton7df342a2018-12-17 12:42:12 +00004970 ClassTemplateDecl *FoundByLookup = nullptr;
4971
Douglas Gregora082a492010-11-30 19:14:50 +00004972 // We may already have a template of the same name; try to find and match it.
4973 if (!DC->isFunctionOrMethod()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004974 SmallVector<NamedDecl *, 4> ConflictingDecls;
Gabor Marton54058b52018-12-17 13:53:12 +00004975 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00004976 for (auto *FoundDecl : FoundDecls) {
Gabor Marton7df342a2018-12-17 12:42:12 +00004977 if (!FoundDecl->isInIdentifierNamespace(Decl::IDNS_Ordinary |
4978 Decl::IDNS_TagFriend))
Douglas Gregora082a492010-11-30 19:14:50 +00004979 continue;
Gabor Marton9581c332018-05-23 13:53:36 +00004980
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00004981 Decl *Found = FoundDecl;
Gabor Marton7df342a2018-12-17 12:42:12 +00004982 auto *FoundTemplate = dyn_cast<ClassTemplateDecl>(Found);
4983 if (FoundTemplate) {
Gabor Marton9581c332018-05-23 13:53:36 +00004984
Douglas Gregora082a492010-11-30 19:14:50 +00004985 if (IsStructuralMatch(D, FoundTemplate)) {
Gabor Marton7df342a2018-12-17 12:42:12 +00004986 ClassTemplateDecl *TemplateWithDef = getDefinition(FoundTemplate);
4987 if (D->isThisDeclarationADefinition() && TemplateWithDef) {
4988 return Importer.MapImported(D, TemplateWithDef);
Balazs Keri0c23dc52018-08-13 13:08:37 +00004989 }
Gabor Marton7df342a2018-12-17 12:42:12 +00004990 FoundByLookup = FoundTemplate;
4991 break;
Gabor Marton9581c332018-05-23 13:53:36 +00004992 }
Douglas Gregora082a492010-11-30 19:14:50 +00004993 }
Gabor Marton9581c332018-05-23 13:53:36 +00004994
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00004995 ConflictingDecls.push_back(FoundDecl);
Douglas Gregora082a492010-11-30 19:14:50 +00004996 }
Gabor Marton9581c332018-05-23 13:53:36 +00004997
Douglas Gregora082a492010-11-30 19:14:50 +00004998 if (!ConflictingDecls.empty()) {
4999 Name = Importer.HandleNameConflict(Name, DC, Decl::IDNS_Ordinary,
Gabor Marton9581c332018-05-23 13:53:36 +00005000 ConflictingDecls.data(),
Douglas Gregora082a492010-11-30 19:14:50 +00005001 ConflictingDecls.size());
5002 }
Gabor Marton9581c332018-05-23 13:53:36 +00005003
Douglas Gregora082a492010-11-30 19:14:50 +00005004 if (!Name)
Balazs Keri3b30d652018-10-19 13:32:20 +00005005 return make_error<ImportError>(ImportError::NameConflict);
Douglas Gregora082a492010-11-30 19:14:50 +00005006 }
5007
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00005008 CXXRecordDecl *FromTemplated = D->getTemplatedDecl();
5009
Douglas Gregora082a492010-11-30 19:14:50 +00005010 // Create the declaration that is being templated.
Balazs Keri3b30d652018-10-19 13:32:20 +00005011 CXXRecordDecl *ToTemplated;
5012 if (Error Err = importInto(ToTemplated, FromTemplated))
5013 return std::move(Err);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00005014
Douglas Gregora082a492010-11-30 19:14:50 +00005015 // Create the class template declaration itself.
Balazs Keri3b30d652018-10-19 13:32:20 +00005016 auto TemplateParamsOrErr = ImportTemplateParameterList(
5017 D->getTemplateParameters());
5018 if (!TemplateParamsOrErr)
5019 return TemplateParamsOrErr.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00005020
Gabor Marton26f72a92018-07-12 09:42:05 +00005021 ClassTemplateDecl *D2;
5022 if (GetImportedOrCreateDecl(D2, D, Importer.getToContext(), DC, Loc, Name,
Balazs Keri3b30d652018-10-19 13:32:20 +00005023 *TemplateParamsOrErr, ToTemplated))
Gabor Marton26f72a92018-07-12 09:42:05 +00005024 return D2;
5025
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00005026 ToTemplated->setDescribedClassTemplate(D2);
Fangrui Song6907ce22018-07-30 19:24:48 +00005027
Douglas Gregora082a492010-11-30 19:14:50 +00005028 D2->setAccess(D->getAccess());
5029 D2->setLexicalDeclContext(LexicalDC);
Gabor Marton7df342a2018-12-17 12:42:12 +00005030
5031 if (D->getDeclContext()->containsDeclAndLoad(D))
5032 DC->addDeclInternal(D2);
5033 if (DC != LexicalDC && D->getLexicalDeclContext()->containsDeclAndLoad(D))
Balazs Keri0c23dc52018-08-13 13:08:37 +00005034 LexicalDC->addDeclInternal(D2);
Fangrui Song6907ce22018-07-30 19:24:48 +00005035
Gabor Marton7df342a2018-12-17 12:42:12 +00005036 if (FoundByLookup) {
5037 auto *Recent =
5038 const_cast<ClassTemplateDecl *>(FoundByLookup->getMostRecentDecl());
5039
5040 // It is possible that during the import of the class template definition
5041 // we start the import of a fwd friend decl of the very same class template
5042 // and we add the fwd friend decl to the lookup table. But the ToTemplated
5043 // had been created earlier and by that time the lookup could not find
5044 // anything existing, so it has no previous decl. Later, (still during the
5045 // import of the fwd friend decl) we start to import the definition again
5046 // and this time the lookup finds the previous fwd friend class template.
5047 // In this case we must set up the previous decl for the templated decl.
5048 if (!ToTemplated->getPreviousDecl()) {
5049 CXXRecordDecl *PrevTemplated =
5050 FoundByLookup->getTemplatedDecl()->getMostRecentDecl();
5051 if (ToTemplated != PrevTemplated)
5052 ToTemplated->setPreviousDecl(PrevTemplated);
5053 }
5054
5055 D2->setPreviousDecl(Recent);
5056 }
5057
5058 if (LexicalDC != DC && IsFriend)
5059 DC->makeDeclVisibleInContext(D2);
5060
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00005061 if (FromTemplated->isCompleteDefinition() &&
5062 !ToTemplated->isCompleteDefinition()) {
Douglas Gregora082a492010-11-30 19:14:50 +00005063 // FIXME: Import definition!
5064 }
Fangrui Song6907ce22018-07-30 19:24:48 +00005065
Douglas Gregora082a492010-11-30 19:14:50 +00005066 return D2;
5067}
5068
Balazs Keri3b30d652018-10-19 13:32:20 +00005069ExpectedDecl ASTNodeImporter::VisitClassTemplateSpecializationDecl(
Douglas Gregore2e50d332010-12-01 01:36:18 +00005070 ClassTemplateSpecializationDecl *D) {
5071 // If this record has a definition in the translation unit we're coming from,
5072 // but this particular declaration is not that definition, import the
5073 // definition and map to that.
5074 TagDecl *Definition = D->getDefinition();
5075 if (Definition && Definition != D) {
Balazs Keri3b30d652018-10-19 13:32:20 +00005076 if (ExpectedDecl ImportedDefOrErr = import(Definition))
5077 return Importer.MapImported(D, *ImportedDefOrErr);
5078 else
5079 return ImportedDefOrErr.takeError();
Douglas Gregore2e50d332010-12-01 01:36:18 +00005080 }
5081
Balazs Keri3b30d652018-10-19 13:32:20 +00005082 ClassTemplateDecl *ClassTemplate;
5083 if (Error Err = importInto(ClassTemplate, D->getSpecializedTemplate()))
5084 return std::move(Err);
Craig Topper36250ad2014-05-12 05:36:57 +00005085
Douglas Gregore2e50d332010-12-01 01:36:18 +00005086 // Import the context of this declaration.
Balazs Keri3b30d652018-10-19 13:32:20 +00005087 DeclContext *DC, *LexicalDC;
5088 if (Error Err = ImportDeclContext(D, DC, LexicalDC))
5089 return std::move(Err);
Douglas Gregore2e50d332010-12-01 01:36:18 +00005090
5091 // Import template arguments.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005092 SmallVector<TemplateArgument, 2> TemplateArgs;
Balazs Keri3b30d652018-10-19 13:32:20 +00005093 if (Error Err = ImportTemplateArguments(
5094 D->getTemplateArgs().data(), D->getTemplateArgs().size(), TemplateArgs))
5095 return std::move(Err);
Craig Topper36250ad2014-05-12 05:36:57 +00005096
Douglas Gregore2e50d332010-12-01 01:36:18 +00005097 // Try to find an existing specialization with these template arguments.
Craig Topper36250ad2014-05-12 05:36:57 +00005098 void *InsertPos = nullptr;
Gabor Marton42e15de2018-08-22 11:52:14 +00005099 ClassTemplateSpecializationDecl *D2 = nullptr;
5100 ClassTemplatePartialSpecializationDecl *PartialSpec =
5101 dyn_cast<ClassTemplatePartialSpecializationDecl>(D);
5102 if (PartialSpec)
5103 D2 = ClassTemplate->findPartialSpecialization(TemplateArgs, InsertPos);
5104 else
5105 D2 = ClassTemplate->findSpecialization(TemplateArgs, InsertPos);
5106 ClassTemplateSpecializationDecl * const PrevDecl = D2;
5107 RecordDecl *FoundDef = D2 ? D2->getDefinition() : nullptr;
5108 if (FoundDef) {
5109 if (!D->isCompleteDefinition()) {
5110 // The "From" translation unit only had a forward declaration; call it
5111 // the same declaration.
5112 // TODO Handle the redecl chain properly!
5113 return Importer.MapImported(D, FoundDef);
Douglas Gregore2e50d332010-12-01 01:36:18 +00005114 }
Gabor Marton42e15de2018-08-22 11:52:14 +00005115
5116 if (IsStructuralMatch(D, FoundDef)) {
5117
5118 Importer.MapImported(D, FoundDef);
5119
5120 // Import those those default field initializers which have been
5121 // instantiated in the "From" context, but not in the "To" context.
Balazs Keri3b30d652018-10-19 13:32:20 +00005122 for (auto *FromField : D->fields()) {
5123 auto ToOrErr = import(FromField);
5124 if (!ToOrErr)
5125 // FIXME: return the error?
5126 consumeError(ToOrErr.takeError());
5127 }
Gabor Marton42e15de2018-08-22 11:52:14 +00005128
5129 // Import those methods which have been instantiated in the
5130 // "From" context, but not in the "To" context.
Balazs Keri3b30d652018-10-19 13:32:20 +00005131 for (CXXMethodDecl *FromM : D->methods()) {
5132 auto ToOrErr = import(FromM);
5133 if (!ToOrErr)
5134 // FIXME: return the error?
5135 consumeError(ToOrErr.takeError());
5136 }
Gabor Marton42e15de2018-08-22 11:52:14 +00005137
5138 // TODO Import instantiated default arguments.
5139 // TODO Import instantiated exception specifications.
5140 //
5141 // Generally, ASTCommon.h/DeclUpdateKind enum gives a very good hint what
5142 // else could be fused during an AST merge.
5143
5144 return FoundDef;
5145 }
5146 } else { // We either couldn't find any previous specialization in the "To"
5147 // context, or we found one but without definition. Let's create a
5148 // new specialization and register that at the class template.
Balazs Keri3b30d652018-10-19 13:32:20 +00005149
5150 // Import the location of this declaration.
5151 ExpectedSLoc BeginLocOrErr = import(D->getBeginLoc());
5152 if (!BeginLocOrErr)
5153 return BeginLocOrErr.takeError();
5154 ExpectedSLoc IdLocOrErr = import(D->getLocation());
5155 if (!IdLocOrErr)
5156 return IdLocOrErr.takeError();
5157
Gabor Marton42e15de2018-08-22 11:52:14 +00005158 if (PartialSpec) {
5159 // Import TemplateArgumentListInfo.
Aleksei Sidorin855086d2017-01-23 09:30:36 +00005160 TemplateArgumentListInfo ToTAInfo;
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005161 const auto &ASTTemplateArgs = *PartialSpec->getTemplateArgsAsWritten();
Balazs Keri3b30d652018-10-19 13:32:20 +00005162 if (Error Err = ImportTemplateArgumentListInfo(ASTTemplateArgs, ToTAInfo))
5163 return std::move(Err);
Aleksei Sidorin855086d2017-01-23 09:30:36 +00005164
Balazs Keri3b30d652018-10-19 13:32:20 +00005165 QualType CanonInjType;
5166 if (Error Err = importInto(
5167 CanonInjType, PartialSpec->getInjectedSpecializationType()))
5168 return std::move(Err);
Aleksei Sidorin855086d2017-01-23 09:30:36 +00005169 CanonInjType = CanonInjType.getCanonicalType();
5170
Balazs Keri3b30d652018-10-19 13:32:20 +00005171 auto ToTPListOrErr = ImportTemplateParameterList(
5172 PartialSpec->getTemplateParameters());
5173 if (!ToTPListOrErr)
5174 return ToTPListOrErr.takeError();
Aleksei Sidorin855086d2017-01-23 09:30:36 +00005175
Gabor Marton26f72a92018-07-12 09:42:05 +00005176 if (GetImportedOrCreateDecl<ClassTemplatePartialSpecializationDecl>(
Balazs Keri3b30d652018-10-19 13:32:20 +00005177 D2, D, Importer.getToContext(), D->getTagKind(), DC,
5178 *BeginLocOrErr, *IdLocOrErr, *ToTPListOrErr, ClassTemplate,
Gabor Marton26f72a92018-07-12 09:42:05 +00005179 llvm::makeArrayRef(TemplateArgs.data(), TemplateArgs.size()),
Gabor Marton42e15de2018-08-22 11:52:14 +00005180 ToTAInfo, CanonInjType,
5181 cast_or_null<ClassTemplatePartialSpecializationDecl>(PrevDecl)))
Gabor Marton26f72a92018-07-12 09:42:05 +00005182 return D2;
Aleksei Sidorin855086d2017-01-23 09:30:36 +00005183
Gabor Marton42e15de2018-08-22 11:52:14 +00005184 // Update InsertPos, because preceding import calls may have invalidated
5185 // it by adding new specializations.
5186 if (!ClassTemplate->findPartialSpecialization(TemplateArgs, InsertPos))
5187 // Add this partial specialization to the class template.
5188 ClassTemplate->AddPartialSpecialization(
5189 cast<ClassTemplatePartialSpecializationDecl>(D2), InsertPos);
5190
5191 } else { // Not a partial specialization.
Gabor Marton26f72a92018-07-12 09:42:05 +00005192 if (GetImportedOrCreateDecl(
Balazs Keri3b30d652018-10-19 13:32:20 +00005193 D2, D, Importer.getToContext(), D->getTagKind(), DC,
5194 *BeginLocOrErr, *IdLocOrErr, ClassTemplate, TemplateArgs,
5195 PrevDecl))
Gabor Marton26f72a92018-07-12 09:42:05 +00005196 return D2;
Gabor Marton42e15de2018-08-22 11:52:14 +00005197
5198 // Update InsertPos, because preceding import calls may have invalidated
5199 // it by adding new specializations.
5200 if (!ClassTemplate->findSpecialization(TemplateArgs, InsertPos))
5201 // Add this specialization to the class template.
5202 ClassTemplate->AddSpecialization(D2, InsertPos);
Aleksei Sidorin855086d2017-01-23 09:30:36 +00005203 }
5204
Douglas Gregore2e50d332010-12-01 01:36:18 +00005205 D2->setSpecializationKind(D->getSpecializationKind());
5206
Douglas Gregore2e50d332010-12-01 01:36:18 +00005207 // Import the qualifier, if any.
Balazs Keri3b30d652018-10-19 13:32:20 +00005208 if (auto LocOrErr = import(D->getQualifierLoc()))
5209 D2->setQualifierInfo(*LocOrErr);
5210 else
5211 return LocOrErr.takeError();
Aleksei Sidorin855086d2017-01-23 09:30:36 +00005212
Aleksei Sidorin855086d2017-01-23 09:30:36 +00005213 if (auto *TSI = D->getTypeAsWritten()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00005214 if (auto TInfoOrErr = import(TSI))
5215 D2->setTypeAsWritten(*TInfoOrErr);
5216 else
5217 return TInfoOrErr.takeError();
5218
5219 if (auto LocOrErr = import(D->getTemplateKeywordLoc()))
5220 D2->setTemplateKeywordLoc(*LocOrErr);
5221 else
5222 return LocOrErr.takeError();
5223
5224 if (auto LocOrErr = import(D->getExternLoc()))
5225 D2->setExternLoc(*LocOrErr);
5226 else
5227 return LocOrErr.takeError();
Aleksei Sidorin855086d2017-01-23 09:30:36 +00005228 }
5229
Balazs Keri3b30d652018-10-19 13:32:20 +00005230 if (D->getPointOfInstantiation().isValid()) {
5231 if (auto POIOrErr = import(D->getPointOfInstantiation()))
5232 D2->setPointOfInstantiation(*POIOrErr);
5233 else
5234 return POIOrErr.takeError();
5235 }
Aleksei Sidorin855086d2017-01-23 09:30:36 +00005236
5237 D2->setTemplateSpecializationKind(D->getTemplateSpecializationKind());
5238
Gabor Martonb14056b2018-05-25 11:21:24 +00005239 // Set the context of this specialization/instantiation.
Douglas Gregore2e50d332010-12-01 01:36:18 +00005240 D2->setLexicalDeclContext(LexicalDC);
Gabor Martonb14056b2018-05-25 11:21:24 +00005241
5242 // Add to the DC only if it was an explicit specialization/instantiation.
5243 if (D2->isExplicitInstantiationOrSpecialization()) {
5244 LexicalDC->addDeclInternal(D2);
5245 }
Douglas Gregore2e50d332010-12-01 01:36:18 +00005246 }
Balazs Keri3b30d652018-10-19 13:32:20 +00005247 if (D->isCompleteDefinition())
5248 if (Error Err = ImportDefinition(D, D2))
5249 return std::move(Err);
Craig Topper36250ad2014-05-12 05:36:57 +00005250
Douglas Gregore2e50d332010-12-01 01:36:18 +00005251 return D2;
5252}
5253
Balazs Keri3b30d652018-10-19 13:32:20 +00005254ExpectedDecl ASTNodeImporter::VisitVarTemplateDecl(VarTemplateDecl *D) {
Larisse Voufo39a1e502013-08-06 01:03:05 +00005255 // If this variable has a definition in the translation unit we're coming
5256 // from,
5257 // but this particular declaration is not that definition, import the
5258 // definition and map to that.
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00005259 auto *Definition =
Larisse Voufo39a1e502013-08-06 01:03:05 +00005260 cast_or_null<VarDecl>(D->getTemplatedDecl()->getDefinition());
5261 if (Definition && Definition != D->getTemplatedDecl()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00005262 if (ExpectedDecl ImportedDefOrErr = import(
5263 Definition->getDescribedVarTemplate()))
5264 return Importer.MapImported(D, *ImportedDefOrErr);
5265 else
5266 return ImportedDefOrErr.takeError();
Larisse Voufo39a1e502013-08-06 01:03:05 +00005267 }
5268
5269 // Import the major distinguishing characteristics of this variable template.
5270 DeclContext *DC, *LexicalDC;
5271 DeclarationName Name;
5272 SourceLocation Loc;
Sean Callanan59721b32015-04-28 18:41:46 +00005273 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00005274 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
5275 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00005276 if (ToD)
5277 return ToD;
Larisse Voufo39a1e502013-08-06 01:03:05 +00005278
5279 // We may already have a template of the same name; try to find and match it.
5280 assert(!DC->isFunctionOrMethod() &&
5281 "Variable templates cannot be declared at function scope");
5282 SmallVector<NamedDecl *, 4> ConflictingDecls;
Gabor Marton54058b52018-12-17 13:53:12 +00005283 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00005284 for (auto *FoundDecl : FoundDecls) {
5285 if (!FoundDecl->isInIdentifierNamespace(Decl::IDNS_Ordinary))
Larisse Voufo39a1e502013-08-06 01:03:05 +00005286 continue;
5287
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00005288 Decl *Found = FoundDecl;
Balazs Keri3b30d652018-10-19 13:32:20 +00005289 if (VarTemplateDecl *FoundTemplate = dyn_cast<VarTemplateDecl>(Found)) {
Larisse Voufo39a1e502013-08-06 01:03:05 +00005290 if (IsStructuralMatch(D, FoundTemplate)) {
5291 // The variable templates structurally match; call it the same template.
Gabor Marton26f72a92018-07-12 09:42:05 +00005292 Importer.MapImported(D->getTemplatedDecl(),
5293 FoundTemplate->getTemplatedDecl());
5294 return Importer.MapImported(D, FoundTemplate);
Larisse Voufo39a1e502013-08-06 01:03:05 +00005295 }
5296 }
5297
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00005298 ConflictingDecls.push_back(FoundDecl);
Larisse Voufo39a1e502013-08-06 01:03:05 +00005299 }
5300
5301 if (!ConflictingDecls.empty()) {
5302 Name = Importer.HandleNameConflict(Name, DC, Decl::IDNS_Ordinary,
5303 ConflictingDecls.data(),
5304 ConflictingDecls.size());
5305 }
5306
5307 if (!Name)
Balazs Keri3b30d652018-10-19 13:32:20 +00005308 // FIXME: Is it possible to get other error than name conflict?
5309 // (Put this `if` into the previous `if`?)
5310 return make_error<ImportError>(ImportError::NameConflict);
Larisse Voufo39a1e502013-08-06 01:03:05 +00005311
5312 VarDecl *DTemplated = D->getTemplatedDecl();
5313
5314 // Import the type.
Balazs Keri3b30d652018-10-19 13:32:20 +00005315 // FIXME: Value not used?
5316 ExpectedType TypeOrErr = import(DTemplated->getType());
5317 if (!TypeOrErr)
5318 return TypeOrErr.takeError();
Larisse Voufo39a1e502013-08-06 01:03:05 +00005319
5320 // Create the declaration that is being templated.
Balazs Keri3b30d652018-10-19 13:32:20 +00005321 VarDecl *ToTemplated;
5322 if (Error Err = importInto(ToTemplated, DTemplated))
5323 return std::move(Err);
Larisse Voufo39a1e502013-08-06 01:03:05 +00005324
5325 // Create the variable template declaration itself.
Balazs Keri3b30d652018-10-19 13:32:20 +00005326 auto TemplateParamsOrErr = ImportTemplateParameterList(
5327 D->getTemplateParameters());
5328 if (!TemplateParamsOrErr)
5329 return TemplateParamsOrErr.takeError();
Larisse Voufo39a1e502013-08-06 01:03:05 +00005330
Gabor Marton26f72a92018-07-12 09:42:05 +00005331 VarTemplateDecl *ToVarTD;
5332 if (GetImportedOrCreateDecl(ToVarTD, D, Importer.getToContext(), DC, Loc,
Balazs Keri3b30d652018-10-19 13:32:20 +00005333 Name, *TemplateParamsOrErr, ToTemplated))
Gabor Marton26f72a92018-07-12 09:42:05 +00005334 return ToVarTD;
5335
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005336 ToTemplated->setDescribedVarTemplate(ToVarTD);
Larisse Voufo39a1e502013-08-06 01:03:05 +00005337
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005338 ToVarTD->setAccess(D->getAccess());
5339 ToVarTD->setLexicalDeclContext(LexicalDC);
5340 LexicalDC->addDeclInternal(ToVarTD);
Larisse Voufo39a1e502013-08-06 01:03:05 +00005341
Larisse Voufo39a1e502013-08-06 01:03:05 +00005342 if (DTemplated->isThisDeclarationADefinition() &&
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005343 !ToTemplated->isThisDeclarationADefinition()) {
Larisse Voufo39a1e502013-08-06 01:03:05 +00005344 // FIXME: Import definition!
5345 }
5346
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005347 return ToVarTD;
Larisse Voufo39a1e502013-08-06 01:03:05 +00005348}
5349
Balazs Keri3b30d652018-10-19 13:32:20 +00005350ExpectedDecl ASTNodeImporter::VisitVarTemplateSpecializationDecl(
Larisse Voufo39a1e502013-08-06 01:03:05 +00005351 VarTemplateSpecializationDecl *D) {
5352 // If this record has a definition in the translation unit we're coming from,
5353 // but this particular declaration is not that definition, import the
5354 // definition and map to that.
5355 VarDecl *Definition = D->getDefinition();
5356 if (Definition && Definition != D) {
Balazs Keri3b30d652018-10-19 13:32:20 +00005357 if (ExpectedDecl ImportedDefOrErr = import(Definition))
5358 return Importer.MapImported(D, *ImportedDefOrErr);
5359 else
5360 return ImportedDefOrErr.takeError();
Larisse Voufo39a1e502013-08-06 01:03:05 +00005361 }
5362
Balazs Keri3b30d652018-10-19 13:32:20 +00005363 VarTemplateDecl *VarTemplate;
5364 if (Error Err = importInto(VarTemplate, D->getSpecializedTemplate()))
5365 return std::move(Err);
Larisse Voufo39a1e502013-08-06 01:03:05 +00005366
5367 // Import the context of this declaration.
Balazs Keri3b30d652018-10-19 13:32:20 +00005368 DeclContext *DC, *LexicalDC;
5369 if (Error Err = ImportDeclContext(D, DC, LexicalDC))
5370 return std::move(Err);
Larisse Voufo39a1e502013-08-06 01:03:05 +00005371
5372 // Import the location of this declaration.
Balazs Keri3b30d652018-10-19 13:32:20 +00005373 ExpectedSLoc BeginLocOrErr = import(D->getBeginLoc());
5374 if (!BeginLocOrErr)
5375 return BeginLocOrErr.takeError();
5376
5377 auto IdLocOrErr = import(D->getLocation());
5378 if (!IdLocOrErr)
5379 return IdLocOrErr.takeError();
Larisse Voufo39a1e502013-08-06 01:03:05 +00005380
5381 // Import template arguments.
5382 SmallVector<TemplateArgument, 2> TemplateArgs;
Balazs Keri3b30d652018-10-19 13:32:20 +00005383 if (Error Err = ImportTemplateArguments(
5384 D->getTemplateArgs().data(), D->getTemplateArgs().size(), TemplateArgs))
5385 return std::move(Err);
Larisse Voufo39a1e502013-08-06 01:03:05 +00005386
5387 // Try to find an existing specialization with these template arguments.
Craig Topper36250ad2014-05-12 05:36:57 +00005388 void *InsertPos = nullptr;
Larisse Voufo39a1e502013-08-06 01:03:05 +00005389 VarTemplateSpecializationDecl *D2 = VarTemplate->findSpecialization(
Craig Topper7e0daca2014-06-26 04:58:53 +00005390 TemplateArgs, InsertPos);
Larisse Voufo39a1e502013-08-06 01:03:05 +00005391 if (D2) {
5392 // We already have a variable template specialization with these template
5393 // arguments.
5394
5395 // FIXME: Check for specialization vs. instantiation errors.
5396
5397 if (VarDecl *FoundDef = D2->getDefinition()) {
5398 if (!D->isThisDeclarationADefinition() ||
5399 IsStructuralMatch(D, FoundDef)) {
5400 // The record types structurally match, or the "from" translation
5401 // unit only had a forward declaration anyway; call it the same
5402 // variable.
Gabor Marton26f72a92018-07-12 09:42:05 +00005403 return Importer.MapImported(D, FoundDef);
Larisse Voufo39a1e502013-08-06 01:03:05 +00005404 }
5405 }
5406 } else {
Larisse Voufo39a1e502013-08-06 01:03:05 +00005407 // Import the type.
Balazs Keri3b30d652018-10-19 13:32:20 +00005408 QualType T;
5409 if (Error Err = importInto(T, D->getType()))
5410 return std::move(Err);
Larisse Voufo39a1e502013-08-06 01:03:05 +00005411
Balazs Keri3b30d652018-10-19 13:32:20 +00005412 auto TInfoOrErr = import(D->getTypeSourceInfo());
5413 if (!TInfoOrErr)
5414 return TInfoOrErr.takeError();
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005415
5416 TemplateArgumentListInfo ToTAInfo;
Balazs Keri3b30d652018-10-19 13:32:20 +00005417 if (Error Err = ImportTemplateArgumentListInfo(
5418 D->getTemplateArgsInfo(), ToTAInfo))
5419 return std::move(Err);
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005420
5421 using PartVarSpecDecl = VarTemplatePartialSpecializationDecl;
Larisse Voufo39a1e502013-08-06 01:03:05 +00005422 // Create a new specialization.
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005423 if (auto *FromPartial = dyn_cast<PartVarSpecDecl>(D)) {
5424 // Import TemplateArgumentListInfo
5425 TemplateArgumentListInfo ArgInfos;
5426 const auto *FromTAArgsAsWritten = FromPartial->getTemplateArgsAsWritten();
5427 // NOTE: FromTAArgsAsWritten and template parameter list are non-null.
Balazs Keri3b30d652018-10-19 13:32:20 +00005428 if (Error Err = ImportTemplateArgumentListInfo(
5429 *FromTAArgsAsWritten, ArgInfos))
5430 return std::move(Err);
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005431
Balazs Keri3b30d652018-10-19 13:32:20 +00005432 auto ToTPListOrErr = ImportTemplateParameterList(
5433 FromPartial->getTemplateParameters());
5434 if (!ToTPListOrErr)
5435 return ToTPListOrErr.takeError();
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005436
Gabor Marton26f72a92018-07-12 09:42:05 +00005437 PartVarSpecDecl *ToPartial;
5438 if (GetImportedOrCreateDecl(ToPartial, D, Importer.getToContext(), DC,
Balazs Keri3b30d652018-10-19 13:32:20 +00005439 *BeginLocOrErr, *IdLocOrErr, *ToTPListOrErr,
5440 VarTemplate, T, *TInfoOrErr,
5441 D->getStorageClass(), TemplateArgs, ArgInfos))
Gabor Marton26f72a92018-07-12 09:42:05 +00005442 return ToPartial;
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005443
Balazs Keri3b30d652018-10-19 13:32:20 +00005444 if (Expected<PartVarSpecDecl *> ToInstOrErr = import(
5445 FromPartial->getInstantiatedFromMember()))
5446 ToPartial->setInstantiatedFromMember(*ToInstOrErr);
5447 else
5448 return ToInstOrErr.takeError();
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005449
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005450 if (FromPartial->isMemberSpecialization())
5451 ToPartial->setMemberSpecialization();
5452
5453 D2 = ToPartial;
Balazs Keri3b30d652018-10-19 13:32:20 +00005454
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005455 } else { // Full specialization
Balazs Keri3b30d652018-10-19 13:32:20 +00005456 if (GetImportedOrCreateDecl(D2, D, Importer.getToContext(), DC,
5457 *BeginLocOrErr, *IdLocOrErr, VarTemplate,
5458 T, *TInfoOrErr,
Gabor Marton26f72a92018-07-12 09:42:05 +00005459 D->getStorageClass(), TemplateArgs))
5460 return D2;
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005461 }
5462
Balazs Keri3b30d652018-10-19 13:32:20 +00005463 if (D->getPointOfInstantiation().isValid()) {
5464 if (ExpectedSLoc POIOrErr = import(D->getPointOfInstantiation()))
5465 D2->setPointOfInstantiation(*POIOrErr);
5466 else
5467 return POIOrErr.takeError();
5468 }
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005469
Larisse Voufo39a1e502013-08-06 01:03:05 +00005470 D2->setSpecializationKind(D->getSpecializationKind());
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005471 D2->setTemplateArgsInfo(ToTAInfo);
Larisse Voufo39a1e502013-08-06 01:03:05 +00005472
5473 // Add this specialization to the class template.
5474 VarTemplate->AddSpecialization(D2, InsertPos);
5475
5476 // Import the qualifier, if any.
Balazs Keri3b30d652018-10-19 13:32:20 +00005477 if (auto LocOrErr = import(D->getQualifierLoc()))
5478 D2->setQualifierInfo(*LocOrErr);
5479 else
5480 return LocOrErr.takeError();
Larisse Voufo39a1e502013-08-06 01:03:05 +00005481
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005482 if (D->isConstexpr())
5483 D2->setConstexpr(true);
5484
Larisse Voufo39a1e502013-08-06 01:03:05 +00005485 // Add the specialization to this context.
5486 D2->setLexicalDeclContext(LexicalDC);
5487 LexicalDC->addDeclInternal(D2);
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005488
5489 D2->setAccess(D->getAccess());
Larisse Voufo39a1e502013-08-06 01:03:05 +00005490 }
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005491
Balazs Keri3b30d652018-10-19 13:32:20 +00005492 if (Error Err = ImportInitializer(D, D2))
5493 return std::move(Err);
Larisse Voufo39a1e502013-08-06 01:03:05 +00005494
5495 return D2;
5496}
5497
Balazs Keri3b30d652018-10-19 13:32:20 +00005498ExpectedDecl
5499ASTNodeImporter::VisitFunctionTemplateDecl(FunctionTemplateDecl *D) {
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00005500 DeclContext *DC, *LexicalDC;
5501 DeclarationName Name;
5502 SourceLocation Loc;
5503 NamedDecl *ToD;
5504
Balazs Keri3b30d652018-10-19 13:32:20 +00005505 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
5506 return std::move(Err);
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00005507
5508 if (ToD)
5509 return ToD;
5510
5511 // Try to find a function in our own ("to") context with the same name, same
5512 // type, and in the same context as the function we're importing.
5513 if (!LexicalDC->isFunctionOrMethod()) {
Gabor Martone331e632019-02-18 13:09:27 +00005514 unsigned IDNS = Decl::IDNS_Ordinary | Decl::IDNS_OrdinaryFriend;
Gabor Marton54058b52018-12-17 13:53:12 +00005515 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00005516 for (auto *FoundDecl : FoundDecls) {
5517 if (!FoundDecl->isInIdentifierNamespace(IDNS))
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00005518 continue;
5519
Balazs Keri3b30d652018-10-19 13:32:20 +00005520 if (auto *FoundFunction =
5521 dyn_cast<FunctionTemplateDecl>(FoundDecl)) {
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00005522 if (FoundFunction->hasExternalFormalLinkage() &&
5523 D->hasExternalFormalLinkage()) {
5524 if (IsStructuralMatch(D, FoundFunction)) {
Gabor Marton26f72a92018-07-12 09:42:05 +00005525 Importer.MapImported(D, FoundFunction);
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00005526 // FIXME: Actually try to merge the body and other attributes.
5527 return FoundFunction;
5528 }
5529 }
5530 }
Balazs Keri3b30d652018-10-19 13:32:20 +00005531 // TODO: handle conflicting names
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00005532 }
5533 }
5534
Balazs Keri3b30d652018-10-19 13:32:20 +00005535 auto ParamsOrErr = ImportTemplateParameterList(
5536 D->getTemplateParameters());
5537 if (!ParamsOrErr)
5538 return ParamsOrErr.takeError();
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00005539
Balazs Keri3b30d652018-10-19 13:32:20 +00005540 FunctionDecl *TemplatedFD;
5541 if (Error Err = importInto(TemplatedFD, D->getTemplatedDecl()))
5542 return std::move(Err);
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00005543
Gabor Marton26f72a92018-07-12 09:42:05 +00005544 FunctionTemplateDecl *ToFunc;
5545 if (GetImportedOrCreateDecl(ToFunc, D, Importer.getToContext(), DC, Loc, Name,
Balazs Keri3b30d652018-10-19 13:32:20 +00005546 *ParamsOrErr, TemplatedFD))
Gabor Marton26f72a92018-07-12 09:42:05 +00005547 return ToFunc;
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00005548
5549 TemplatedFD->setDescribedFunctionTemplate(ToFunc);
5550 ToFunc->setAccess(D->getAccess());
5551 ToFunc->setLexicalDeclContext(LexicalDC);
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00005552
5553 LexicalDC->addDeclInternal(ToFunc);
5554 return ToFunc;
5555}
5556
Douglas Gregor7eeb5972010-02-11 19:21:55 +00005557//----------------------------------------------------------------------------
5558// Import Statements
5559//----------------------------------------------------------------------------
5560
Balazs Keri3b30d652018-10-19 13:32:20 +00005561ExpectedStmt ASTNodeImporter::VisitStmt(Stmt *S) {
Stephen Kellyf2ceec42018-08-09 21:08:08 +00005562 Importer.FromDiag(S->getBeginLoc(), diag::err_unsupported_ast_node)
5563 << S->getStmtClassName();
Balazs Keri3b30d652018-10-19 13:32:20 +00005564 return make_error<ImportError>(ImportError::UnsupportedConstruct);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00005565}
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00005566
Balazs Keri3b30d652018-10-19 13:32:20 +00005567
5568ExpectedStmt ASTNodeImporter::VisitGCCAsmStmt(GCCAsmStmt *S) {
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00005569 SmallVector<IdentifierInfo *, 4> Names;
5570 for (unsigned I = 0, E = S->getNumOutputs(); I != E; I++) {
5571 IdentifierInfo *ToII = Importer.Import(S->getOutputIdentifier(I));
Gabor Horvath27f5ff62017-03-13 15:32:24 +00005572 // ToII is nullptr when no symbolic name is given for output operand
5573 // see ParseStmtAsm::ParseAsmOperandsOpt
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00005574 Names.push_back(ToII);
5575 }
Balazs Keri3b30d652018-10-19 13:32:20 +00005576
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00005577 for (unsigned I = 0, E = S->getNumInputs(); I != E; I++) {
5578 IdentifierInfo *ToII = Importer.Import(S->getInputIdentifier(I));
Gabor Horvath27f5ff62017-03-13 15:32:24 +00005579 // ToII is nullptr when no symbolic name is given for input operand
5580 // see ParseStmtAsm::ParseAsmOperandsOpt
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00005581 Names.push_back(ToII);
5582 }
5583
5584 SmallVector<StringLiteral *, 4> Clobbers;
5585 for (unsigned I = 0, E = S->getNumClobbers(); I != E; I++) {
Balazs Keri3b30d652018-10-19 13:32:20 +00005586 if (auto ClobberOrErr = import(S->getClobberStringLiteral(I)))
5587 Clobbers.push_back(*ClobberOrErr);
5588 else
5589 return ClobberOrErr.takeError();
5590
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00005591 }
5592
5593 SmallVector<StringLiteral *, 4> Constraints;
5594 for (unsigned I = 0, E = S->getNumOutputs(); I != E; I++) {
Balazs Keri3b30d652018-10-19 13:32:20 +00005595 if (auto OutputOrErr = import(S->getOutputConstraintLiteral(I)))
5596 Constraints.push_back(*OutputOrErr);
5597 else
5598 return OutputOrErr.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00005599 }
5600
5601 for (unsigned I = 0, E = S->getNumInputs(); I != E; I++) {
Balazs Keri3b30d652018-10-19 13:32:20 +00005602 if (auto InputOrErr = import(S->getInputConstraintLiteral(I)))
5603 Constraints.push_back(*InputOrErr);
5604 else
5605 return InputOrErr.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00005606 }
5607
5608 SmallVector<Expr *, 4> Exprs(S->getNumOutputs() + S->getNumInputs());
Balazs Keri3b30d652018-10-19 13:32:20 +00005609 if (Error Err = ImportContainerChecked(S->outputs(), Exprs))
5610 return std::move(Err);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00005611
Balazs Keri3b30d652018-10-19 13:32:20 +00005612 if (Error Err = ImportArrayChecked(
5613 S->inputs(), Exprs.begin() + S->getNumOutputs()))
5614 return std::move(Err);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00005615
Balazs Keri3b30d652018-10-19 13:32:20 +00005616 ExpectedSLoc AsmLocOrErr = import(S->getAsmLoc());
5617 if (!AsmLocOrErr)
5618 return AsmLocOrErr.takeError();
5619 auto AsmStrOrErr = import(S->getAsmString());
5620 if (!AsmStrOrErr)
5621 return AsmStrOrErr.takeError();
5622 ExpectedSLoc RParenLocOrErr = import(S->getRParenLoc());
5623 if (!RParenLocOrErr)
5624 return RParenLocOrErr.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00005625
5626 return new (Importer.getToContext()) GCCAsmStmt(
Balazs Keri3b30d652018-10-19 13:32:20 +00005627 Importer.getToContext(),
5628 *AsmLocOrErr,
5629 S->isSimple(),
5630 S->isVolatile(),
5631 S->getNumOutputs(),
5632 S->getNumInputs(),
5633 Names.data(),
5634 Constraints.data(),
5635 Exprs.data(),
5636 *AsmStrOrErr,
5637 S->getNumClobbers(),
5638 Clobbers.data(),
5639 *RParenLocOrErr);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00005640}
5641
Balazs Keri3b30d652018-10-19 13:32:20 +00005642ExpectedStmt ASTNodeImporter::VisitDeclStmt(DeclStmt *S) {
5643 auto Imp = importSeq(S->getDeclGroup(), S->getBeginLoc(), S->getEndLoc());
5644 if (!Imp)
5645 return Imp.takeError();
5646
5647 DeclGroupRef ToDG;
5648 SourceLocation ToBeginLoc, ToEndLoc;
5649 std::tie(ToDG, ToBeginLoc, ToEndLoc) = *Imp;
5650
5651 return new (Importer.getToContext()) DeclStmt(ToDG, ToBeginLoc, ToEndLoc);
Sean Callanan59721b32015-04-28 18:41:46 +00005652}
5653
Balazs Keri3b30d652018-10-19 13:32:20 +00005654ExpectedStmt ASTNodeImporter::VisitNullStmt(NullStmt *S) {
5655 ExpectedSLoc ToSemiLocOrErr = import(S->getSemiLoc());
5656 if (!ToSemiLocOrErr)
5657 return ToSemiLocOrErr.takeError();
5658 return new (Importer.getToContext()) NullStmt(
5659 *ToSemiLocOrErr, S->hasLeadingEmptyMacro());
Sean Callanan59721b32015-04-28 18:41:46 +00005660}
5661
Balazs Keri3b30d652018-10-19 13:32:20 +00005662ExpectedStmt ASTNodeImporter::VisitCompoundStmt(CompoundStmt *S) {
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00005663 SmallVector<Stmt *, 8> ToStmts(S->size());
Aleksei Sidorina693b372016-09-28 10:16:56 +00005664
Balazs Keri3b30d652018-10-19 13:32:20 +00005665 if (Error Err = ImportContainerChecked(S->body(), ToStmts))
5666 return std::move(Err);
Sean Callanan8bca9962016-03-28 21:43:01 +00005667
Balazs Keri3b30d652018-10-19 13:32:20 +00005668 ExpectedSLoc ToLBracLocOrErr = import(S->getLBracLoc());
5669 if (!ToLBracLocOrErr)
5670 return ToLBracLocOrErr.takeError();
5671
5672 ExpectedSLoc ToRBracLocOrErr = import(S->getRBracLoc());
5673 if (!ToRBracLocOrErr)
5674 return ToRBracLocOrErr.takeError();
5675
5676 return CompoundStmt::Create(
5677 Importer.getToContext(), ToStmts,
5678 *ToLBracLocOrErr, *ToRBracLocOrErr);
Sean Callanan59721b32015-04-28 18:41:46 +00005679}
5680
Balazs Keri3b30d652018-10-19 13:32:20 +00005681ExpectedStmt ASTNodeImporter::VisitCaseStmt(CaseStmt *S) {
5682 auto Imp = importSeq(
5683 S->getLHS(), S->getRHS(), S->getSubStmt(), S->getCaseLoc(),
5684 S->getEllipsisLoc(), S->getColonLoc());
5685 if (!Imp)
5686 return Imp.takeError();
5687
5688 Expr *ToLHS, *ToRHS;
5689 Stmt *ToSubStmt;
5690 SourceLocation ToCaseLoc, ToEllipsisLoc, ToColonLoc;
5691 std::tie(ToLHS, ToRHS, ToSubStmt, ToCaseLoc, ToEllipsisLoc, ToColonLoc) =
5692 *Imp;
5693
Bruno Ricci5b30571752018-10-28 12:30:53 +00005694 auto *ToStmt = CaseStmt::Create(Importer.getToContext(), ToLHS, ToRHS,
5695 ToCaseLoc, ToEllipsisLoc, ToColonLoc);
Gabor Horvath480892b2017-10-18 09:25:18 +00005696 ToStmt->setSubStmt(ToSubStmt);
Balazs Keri3b30d652018-10-19 13:32:20 +00005697
Gabor Horvath480892b2017-10-18 09:25:18 +00005698 return ToStmt;
Sean Callanan59721b32015-04-28 18:41:46 +00005699}
5700
Balazs Keri3b30d652018-10-19 13:32:20 +00005701ExpectedStmt ASTNodeImporter::VisitDefaultStmt(DefaultStmt *S) {
5702 auto Imp = importSeq(S->getDefaultLoc(), S->getColonLoc(), S->getSubStmt());
5703 if (!Imp)
5704 return Imp.takeError();
5705
5706 SourceLocation ToDefaultLoc, ToColonLoc;
5707 Stmt *ToSubStmt;
5708 std::tie(ToDefaultLoc, ToColonLoc, ToSubStmt) = *Imp;
5709
5710 return new (Importer.getToContext()) DefaultStmt(
5711 ToDefaultLoc, ToColonLoc, ToSubStmt);
Sean Callanan59721b32015-04-28 18:41:46 +00005712}
5713
Balazs Keri3b30d652018-10-19 13:32:20 +00005714ExpectedStmt ASTNodeImporter::VisitLabelStmt(LabelStmt *S) {
5715 auto Imp = importSeq(S->getIdentLoc(), S->getDecl(), S->getSubStmt());
5716 if (!Imp)
5717 return Imp.takeError();
5718
5719 SourceLocation ToIdentLoc;
5720 LabelDecl *ToLabelDecl;
5721 Stmt *ToSubStmt;
5722 std::tie(ToIdentLoc, ToLabelDecl, ToSubStmt) = *Imp;
5723
5724 return new (Importer.getToContext()) LabelStmt(
5725 ToIdentLoc, ToLabelDecl, ToSubStmt);
Sean Callanan59721b32015-04-28 18:41:46 +00005726}
5727
Balazs Keri3b30d652018-10-19 13:32:20 +00005728ExpectedStmt ASTNodeImporter::VisitAttributedStmt(AttributedStmt *S) {
5729 ExpectedSLoc ToAttrLocOrErr = import(S->getAttrLoc());
5730 if (!ToAttrLocOrErr)
5731 return ToAttrLocOrErr.takeError();
Sean Callanan59721b32015-04-28 18:41:46 +00005732 ArrayRef<const Attr*> FromAttrs(S->getAttrs());
5733 SmallVector<const Attr *, 1> ToAttrs(FromAttrs.size());
Balazs Keri3b30d652018-10-19 13:32:20 +00005734 if (Error Err = ImportContainerChecked(FromAttrs, ToAttrs))
5735 return std::move(Err);
5736 ExpectedStmt ToSubStmtOrErr = import(S->getSubStmt());
5737 if (!ToSubStmtOrErr)
5738 return ToSubStmtOrErr.takeError();
5739
5740 return AttributedStmt::Create(
5741 Importer.getToContext(), *ToAttrLocOrErr, ToAttrs, *ToSubStmtOrErr);
Sean Callanan59721b32015-04-28 18:41:46 +00005742}
5743
Balazs Keri3b30d652018-10-19 13:32:20 +00005744ExpectedStmt ASTNodeImporter::VisitIfStmt(IfStmt *S) {
5745 auto Imp = importSeq(
5746 S->getIfLoc(), S->getInit(), S->getConditionVariable(), S->getCond(),
5747 S->getThen(), S->getElseLoc(), S->getElse());
5748 if (!Imp)
5749 return Imp.takeError();
5750
5751 SourceLocation ToIfLoc, ToElseLoc;
5752 Stmt *ToInit, *ToThen, *ToElse;
5753 VarDecl *ToConditionVariable;
5754 Expr *ToCond;
5755 std::tie(
5756 ToIfLoc, ToInit, ToConditionVariable, ToCond, ToThen, ToElseLoc, ToElse) =
5757 *Imp;
5758
Bruno Riccib1cc94b2018-10-27 21:12:20 +00005759 return IfStmt::Create(Importer.getToContext(), ToIfLoc, S->isConstexpr(),
5760 ToInit, ToConditionVariable, ToCond, ToThen, ToElseLoc,
5761 ToElse);
Sean Callanan59721b32015-04-28 18:41:46 +00005762}
5763
Balazs Keri3b30d652018-10-19 13:32:20 +00005764ExpectedStmt ASTNodeImporter::VisitSwitchStmt(SwitchStmt *S) {
5765 auto Imp = importSeq(
5766 S->getInit(), S->getConditionVariable(), S->getCond(),
5767 S->getBody(), S->getSwitchLoc());
5768 if (!Imp)
5769 return Imp.takeError();
5770
5771 Stmt *ToInit, *ToBody;
5772 VarDecl *ToConditionVariable;
5773 Expr *ToCond;
5774 SourceLocation ToSwitchLoc;
5775 std::tie(ToInit, ToConditionVariable, ToCond, ToBody, ToSwitchLoc) = *Imp;
5776
Bruno Riccie2806f82018-10-29 16:12:37 +00005777 auto *ToStmt = SwitchStmt::Create(Importer.getToContext(), ToInit,
5778 ToConditionVariable, ToCond);
Sean Callanan59721b32015-04-28 18:41:46 +00005779 ToStmt->setBody(ToBody);
Balazs Keri3b30d652018-10-19 13:32:20 +00005780 ToStmt->setSwitchLoc(ToSwitchLoc);
5781
Sean Callanan59721b32015-04-28 18:41:46 +00005782 // Now we have to re-chain the cases.
5783 SwitchCase *LastChainedSwitchCase = nullptr;
5784 for (SwitchCase *SC = S->getSwitchCaseList(); SC != nullptr;
5785 SC = SC->getNextSwitchCase()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00005786 Expected<SwitchCase *> ToSCOrErr = import(SC);
5787 if (!ToSCOrErr)
5788 return ToSCOrErr.takeError();
Sean Callanan59721b32015-04-28 18:41:46 +00005789 if (LastChainedSwitchCase)
Balazs Keri3b30d652018-10-19 13:32:20 +00005790 LastChainedSwitchCase->setNextSwitchCase(*ToSCOrErr);
Sean Callanan59721b32015-04-28 18:41:46 +00005791 else
Balazs Keri3b30d652018-10-19 13:32:20 +00005792 ToStmt->setSwitchCaseList(*ToSCOrErr);
5793 LastChainedSwitchCase = *ToSCOrErr;
Sean Callanan59721b32015-04-28 18:41:46 +00005794 }
Balazs Keri3b30d652018-10-19 13:32:20 +00005795
Sean Callanan59721b32015-04-28 18:41:46 +00005796 return ToStmt;
5797}
5798
Balazs Keri3b30d652018-10-19 13:32:20 +00005799ExpectedStmt ASTNodeImporter::VisitWhileStmt(WhileStmt *S) {
5800 auto Imp = importSeq(
5801 S->getConditionVariable(), S->getCond(), S->getBody(), S->getWhileLoc());
5802 if (!Imp)
5803 return Imp.takeError();
5804
5805 VarDecl *ToConditionVariable;
5806 Expr *ToCond;
5807 Stmt *ToBody;
5808 SourceLocation ToWhileLoc;
5809 std::tie(ToConditionVariable, ToCond, ToBody, ToWhileLoc) = *Imp;
5810
Bruno Riccibacf7512018-10-30 13:42:41 +00005811 return WhileStmt::Create(Importer.getToContext(), ToConditionVariable, ToCond,
5812 ToBody, ToWhileLoc);
Sean Callanan59721b32015-04-28 18:41:46 +00005813}
5814
Balazs Keri3b30d652018-10-19 13:32:20 +00005815ExpectedStmt ASTNodeImporter::VisitDoStmt(DoStmt *S) {
5816 auto Imp = importSeq(
5817 S->getBody(), S->getCond(), S->getDoLoc(), S->getWhileLoc(),
5818 S->getRParenLoc());
5819 if (!Imp)
5820 return Imp.takeError();
5821
5822 Stmt *ToBody;
5823 Expr *ToCond;
5824 SourceLocation ToDoLoc, ToWhileLoc, ToRParenLoc;
5825 std::tie(ToBody, ToCond, ToDoLoc, ToWhileLoc, ToRParenLoc) = *Imp;
5826
5827 return new (Importer.getToContext()) DoStmt(
5828 ToBody, ToCond, ToDoLoc, ToWhileLoc, ToRParenLoc);
Sean Callanan59721b32015-04-28 18:41:46 +00005829}
5830
Balazs Keri3b30d652018-10-19 13:32:20 +00005831ExpectedStmt ASTNodeImporter::VisitForStmt(ForStmt *S) {
5832 auto Imp = importSeq(
5833 S->getInit(), S->getCond(), S->getConditionVariable(), S->getInc(),
5834 S->getBody(), S->getForLoc(), S->getLParenLoc(), S->getRParenLoc());
5835 if (!Imp)
5836 return Imp.takeError();
5837
5838 Stmt *ToInit;
5839 Expr *ToCond, *ToInc;
5840 VarDecl *ToConditionVariable;
5841 Stmt *ToBody;
5842 SourceLocation ToForLoc, ToLParenLoc, ToRParenLoc;
5843 std::tie(
5844 ToInit, ToCond, ToConditionVariable, ToInc, ToBody, ToForLoc,
5845 ToLParenLoc, ToRParenLoc) = *Imp;
5846
5847 return new (Importer.getToContext()) ForStmt(
5848 Importer.getToContext(),
5849 ToInit, ToCond, ToConditionVariable, ToInc, ToBody, ToForLoc, ToLParenLoc,
5850 ToRParenLoc);
Sean Callanan59721b32015-04-28 18:41:46 +00005851}
5852
Balazs Keri3b30d652018-10-19 13:32:20 +00005853ExpectedStmt ASTNodeImporter::VisitGotoStmt(GotoStmt *S) {
5854 auto Imp = importSeq(S->getLabel(), S->getGotoLoc(), S->getLabelLoc());
5855 if (!Imp)
5856 return Imp.takeError();
5857
5858 LabelDecl *ToLabel;
5859 SourceLocation ToGotoLoc, ToLabelLoc;
5860 std::tie(ToLabel, ToGotoLoc, ToLabelLoc) = *Imp;
5861
5862 return new (Importer.getToContext()) GotoStmt(
5863 ToLabel, ToGotoLoc, ToLabelLoc);
Sean Callanan59721b32015-04-28 18:41:46 +00005864}
5865
Balazs Keri3b30d652018-10-19 13:32:20 +00005866ExpectedStmt ASTNodeImporter::VisitIndirectGotoStmt(IndirectGotoStmt *S) {
5867 auto Imp = importSeq(S->getGotoLoc(), S->getStarLoc(), S->getTarget());
5868 if (!Imp)
5869 return Imp.takeError();
5870
5871 SourceLocation ToGotoLoc, ToStarLoc;
5872 Expr *ToTarget;
5873 std::tie(ToGotoLoc, ToStarLoc, ToTarget) = *Imp;
5874
5875 return new (Importer.getToContext()) IndirectGotoStmt(
5876 ToGotoLoc, ToStarLoc, ToTarget);
Sean Callanan59721b32015-04-28 18:41:46 +00005877}
5878
Balazs Keri3b30d652018-10-19 13:32:20 +00005879ExpectedStmt ASTNodeImporter::VisitContinueStmt(ContinueStmt *S) {
5880 ExpectedSLoc ToContinueLocOrErr = import(S->getContinueLoc());
5881 if (!ToContinueLocOrErr)
5882 return ToContinueLocOrErr.takeError();
5883 return new (Importer.getToContext()) ContinueStmt(*ToContinueLocOrErr);
Sean Callanan59721b32015-04-28 18:41:46 +00005884}
5885
Balazs Keri3b30d652018-10-19 13:32:20 +00005886ExpectedStmt ASTNodeImporter::VisitBreakStmt(BreakStmt *S) {
5887 auto ToBreakLocOrErr = import(S->getBreakLoc());
5888 if (!ToBreakLocOrErr)
5889 return ToBreakLocOrErr.takeError();
5890 return new (Importer.getToContext()) BreakStmt(*ToBreakLocOrErr);
Sean Callanan59721b32015-04-28 18:41:46 +00005891}
5892
Balazs Keri3b30d652018-10-19 13:32:20 +00005893ExpectedStmt ASTNodeImporter::VisitReturnStmt(ReturnStmt *S) {
5894 auto Imp = importSeq(
5895 S->getReturnLoc(), S->getRetValue(), S->getNRVOCandidate());
5896 if (!Imp)
5897 return Imp.takeError();
5898
5899 SourceLocation ToReturnLoc;
5900 Expr *ToRetValue;
5901 const VarDecl *ToNRVOCandidate;
5902 std::tie(ToReturnLoc, ToRetValue, ToNRVOCandidate) = *Imp;
5903
Bruno Ricci023b1d12018-10-30 14:40:49 +00005904 return ReturnStmt::Create(Importer.getToContext(), ToReturnLoc, ToRetValue,
5905 ToNRVOCandidate);
Sean Callanan59721b32015-04-28 18:41:46 +00005906}
5907
Balazs Keri3b30d652018-10-19 13:32:20 +00005908ExpectedStmt ASTNodeImporter::VisitCXXCatchStmt(CXXCatchStmt *S) {
5909 auto Imp = importSeq(
5910 S->getCatchLoc(), S->getExceptionDecl(), S->getHandlerBlock());
5911 if (!Imp)
5912 return Imp.takeError();
5913
5914 SourceLocation ToCatchLoc;
5915 VarDecl *ToExceptionDecl;
5916 Stmt *ToHandlerBlock;
5917 std::tie(ToCatchLoc, ToExceptionDecl, ToHandlerBlock) = *Imp;
5918
5919 return new (Importer.getToContext()) CXXCatchStmt (
5920 ToCatchLoc, ToExceptionDecl, ToHandlerBlock);
Sean Callanan59721b32015-04-28 18:41:46 +00005921}
5922
Balazs Keri3b30d652018-10-19 13:32:20 +00005923ExpectedStmt ASTNodeImporter::VisitCXXTryStmt(CXXTryStmt *S) {
5924 ExpectedSLoc ToTryLocOrErr = import(S->getTryLoc());
5925 if (!ToTryLocOrErr)
5926 return ToTryLocOrErr.takeError();
5927
5928 ExpectedStmt ToTryBlockOrErr = import(S->getTryBlock());
5929 if (!ToTryBlockOrErr)
5930 return ToTryBlockOrErr.takeError();
5931
Sean Callanan59721b32015-04-28 18:41:46 +00005932 SmallVector<Stmt *, 1> ToHandlers(S->getNumHandlers());
5933 for (unsigned HI = 0, HE = S->getNumHandlers(); HI != HE; ++HI) {
5934 CXXCatchStmt *FromHandler = S->getHandler(HI);
Balazs Keri3b30d652018-10-19 13:32:20 +00005935 if (auto ToHandlerOrErr = import(FromHandler))
5936 ToHandlers[HI] = *ToHandlerOrErr;
Sean Callanan59721b32015-04-28 18:41:46 +00005937 else
Balazs Keri3b30d652018-10-19 13:32:20 +00005938 return ToHandlerOrErr.takeError();
Sean Callanan59721b32015-04-28 18:41:46 +00005939 }
Balazs Keri3b30d652018-10-19 13:32:20 +00005940
5941 return CXXTryStmt::Create(
5942 Importer.getToContext(), *ToTryLocOrErr,*ToTryBlockOrErr, ToHandlers);
Sean Callanan59721b32015-04-28 18:41:46 +00005943}
5944
Balazs Keri3b30d652018-10-19 13:32:20 +00005945ExpectedStmt ASTNodeImporter::VisitCXXForRangeStmt(CXXForRangeStmt *S) {
5946 auto Imp1 = importSeq(
5947 S->getInit(), S->getRangeStmt(), S->getBeginStmt(), S->getEndStmt(),
5948 S->getCond(), S->getInc(), S->getLoopVarStmt(), S->getBody());
5949 if (!Imp1)
5950 return Imp1.takeError();
5951 auto Imp2 = importSeq(
5952 S->getForLoc(), S->getCoawaitLoc(), S->getColonLoc(), S->getRParenLoc());
5953 if (!Imp2)
5954 return Imp2.takeError();
5955
5956 DeclStmt *ToRangeStmt, *ToBeginStmt, *ToEndStmt, *ToLoopVarStmt;
5957 Expr *ToCond, *ToInc;
5958 Stmt *ToInit, *ToBody;
5959 std::tie(
5960 ToInit, ToRangeStmt, ToBeginStmt, ToEndStmt, ToCond, ToInc, ToLoopVarStmt,
5961 ToBody) = *Imp1;
5962 SourceLocation ToForLoc, ToCoawaitLoc, ToColonLoc, ToRParenLoc;
5963 std::tie(ToForLoc, ToCoawaitLoc, ToColonLoc, ToRParenLoc) = *Imp2;
5964
5965 return new (Importer.getToContext()) CXXForRangeStmt(
5966 ToInit, ToRangeStmt, ToBeginStmt, ToEndStmt, ToCond, ToInc, ToLoopVarStmt,
5967 ToBody, ToForLoc, ToCoawaitLoc, ToColonLoc, ToRParenLoc);
Sean Callanan59721b32015-04-28 18:41:46 +00005968}
5969
Balazs Keri3b30d652018-10-19 13:32:20 +00005970ExpectedStmt
5971ASTNodeImporter::VisitObjCForCollectionStmt(ObjCForCollectionStmt *S) {
5972 auto Imp = importSeq(
5973 S->getElement(), S->getCollection(), S->getBody(),
5974 S->getForLoc(), S->getRParenLoc());
5975 if (!Imp)
5976 return Imp.takeError();
5977
5978 Stmt *ToElement, *ToBody;
5979 Expr *ToCollection;
5980 SourceLocation ToForLoc, ToRParenLoc;
5981 std::tie(ToElement, ToCollection, ToBody, ToForLoc, ToRParenLoc) = *Imp;
5982
5983 return new (Importer.getToContext()) ObjCForCollectionStmt(ToElement,
5984 ToCollection,
5985 ToBody,
5986 ToForLoc,
Sean Callanan59721b32015-04-28 18:41:46 +00005987 ToRParenLoc);
5988}
5989
Balazs Keri3b30d652018-10-19 13:32:20 +00005990ExpectedStmt ASTNodeImporter::VisitObjCAtCatchStmt(ObjCAtCatchStmt *S) {
5991 auto Imp = importSeq(
5992 S->getAtCatchLoc(), S->getRParenLoc(), S->getCatchParamDecl(),
5993 S->getCatchBody());
5994 if (!Imp)
5995 return Imp.takeError();
5996
5997 SourceLocation ToAtCatchLoc, ToRParenLoc;
5998 VarDecl *ToCatchParamDecl;
5999 Stmt *ToCatchBody;
6000 std::tie(ToAtCatchLoc, ToRParenLoc, ToCatchParamDecl, ToCatchBody) = *Imp;
6001
6002 return new (Importer.getToContext()) ObjCAtCatchStmt (
6003 ToAtCatchLoc, ToRParenLoc, ToCatchParamDecl, ToCatchBody);
Sean Callanan59721b32015-04-28 18:41:46 +00006004}
6005
Balazs Keri3b30d652018-10-19 13:32:20 +00006006ExpectedStmt ASTNodeImporter::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
6007 ExpectedSLoc ToAtFinallyLocOrErr = import(S->getAtFinallyLoc());
6008 if (!ToAtFinallyLocOrErr)
6009 return ToAtFinallyLocOrErr.takeError();
6010 ExpectedStmt ToAtFinallyStmtOrErr = import(S->getFinallyBody());
6011 if (!ToAtFinallyStmtOrErr)
6012 return ToAtFinallyStmtOrErr.takeError();
6013 return new (Importer.getToContext()) ObjCAtFinallyStmt(*ToAtFinallyLocOrErr,
6014 *ToAtFinallyStmtOrErr);
Sean Callanan59721b32015-04-28 18:41:46 +00006015}
6016
Balazs Keri3b30d652018-10-19 13:32:20 +00006017ExpectedStmt ASTNodeImporter::VisitObjCAtTryStmt(ObjCAtTryStmt *S) {
6018 auto Imp = importSeq(
6019 S->getAtTryLoc(), S->getTryBody(), S->getFinallyStmt());
6020 if (!Imp)
6021 return Imp.takeError();
6022
6023 SourceLocation ToAtTryLoc;
6024 Stmt *ToTryBody, *ToFinallyStmt;
6025 std::tie(ToAtTryLoc, ToTryBody, ToFinallyStmt) = *Imp;
6026
Sean Callanan59721b32015-04-28 18:41:46 +00006027 SmallVector<Stmt *, 1> ToCatchStmts(S->getNumCatchStmts());
6028 for (unsigned CI = 0, CE = S->getNumCatchStmts(); CI != CE; ++CI) {
6029 ObjCAtCatchStmt *FromCatchStmt = S->getCatchStmt(CI);
Balazs Keri3b30d652018-10-19 13:32:20 +00006030 if (ExpectedStmt ToCatchStmtOrErr = import(FromCatchStmt))
6031 ToCatchStmts[CI] = *ToCatchStmtOrErr;
Sean Callanan59721b32015-04-28 18:41:46 +00006032 else
Balazs Keri3b30d652018-10-19 13:32:20 +00006033 return ToCatchStmtOrErr.takeError();
Sean Callanan59721b32015-04-28 18:41:46 +00006034 }
Balazs Keri3b30d652018-10-19 13:32:20 +00006035
Sean Callanan59721b32015-04-28 18:41:46 +00006036 return ObjCAtTryStmt::Create(Importer.getToContext(),
Balazs Keri3b30d652018-10-19 13:32:20 +00006037 ToAtTryLoc, ToTryBody,
Sean Callanan59721b32015-04-28 18:41:46 +00006038 ToCatchStmts.begin(), ToCatchStmts.size(),
Balazs Keri3b30d652018-10-19 13:32:20 +00006039 ToFinallyStmt);
Sean Callanan59721b32015-04-28 18:41:46 +00006040}
6041
Balazs Keri3b30d652018-10-19 13:32:20 +00006042ExpectedStmt ASTNodeImporter::VisitObjCAtSynchronizedStmt
Sean Callanan59721b32015-04-28 18:41:46 +00006043 (ObjCAtSynchronizedStmt *S) {
Balazs Keri3b30d652018-10-19 13:32:20 +00006044 auto Imp = importSeq(
6045 S->getAtSynchronizedLoc(), S->getSynchExpr(), S->getSynchBody());
6046 if (!Imp)
6047 return Imp.takeError();
6048
6049 SourceLocation ToAtSynchronizedLoc;
6050 Expr *ToSynchExpr;
6051 Stmt *ToSynchBody;
6052 std::tie(ToAtSynchronizedLoc, ToSynchExpr, ToSynchBody) = *Imp;
6053
Sean Callanan59721b32015-04-28 18:41:46 +00006054 return new (Importer.getToContext()) ObjCAtSynchronizedStmt(
6055 ToAtSynchronizedLoc, ToSynchExpr, ToSynchBody);
6056}
6057
Balazs Keri3b30d652018-10-19 13:32:20 +00006058ExpectedStmt ASTNodeImporter::VisitObjCAtThrowStmt(ObjCAtThrowStmt *S) {
6059 ExpectedSLoc ToThrowLocOrErr = import(S->getThrowLoc());
6060 if (!ToThrowLocOrErr)
6061 return ToThrowLocOrErr.takeError();
6062 ExpectedExpr ToThrowExprOrErr = import(S->getThrowExpr());
6063 if (!ToThrowExprOrErr)
6064 return ToThrowExprOrErr.takeError();
6065 return new (Importer.getToContext()) ObjCAtThrowStmt(
6066 *ToThrowLocOrErr, *ToThrowExprOrErr);
Sean Callanan59721b32015-04-28 18:41:46 +00006067}
6068
Balazs Keri3b30d652018-10-19 13:32:20 +00006069ExpectedStmt ASTNodeImporter::VisitObjCAutoreleasePoolStmt(
6070 ObjCAutoreleasePoolStmt *S) {
6071 ExpectedSLoc ToAtLocOrErr = import(S->getAtLoc());
6072 if (!ToAtLocOrErr)
6073 return ToAtLocOrErr.takeError();
6074 ExpectedStmt ToSubStmtOrErr = import(S->getSubStmt());
6075 if (!ToSubStmtOrErr)
6076 return ToSubStmtOrErr.takeError();
6077 return new (Importer.getToContext()) ObjCAutoreleasePoolStmt(*ToAtLocOrErr,
6078 *ToSubStmtOrErr);
Douglas Gregor7eeb5972010-02-11 19:21:55 +00006079}
6080
6081//----------------------------------------------------------------------------
6082// Import Expressions
6083//----------------------------------------------------------------------------
Balazs Keri3b30d652018-10-19 13:32:20 +00006084ExpectedStmt ASTNodeImporter::VisitExpr(Expr *E) {
Stephen Kellyf2ceec42018-08-09 21:08:08 +00006085 Importer.FromDiag(E->getBeginLoc(), diag::err_unsupported_ast_node)
6086 << E->getStmtClassName();
Balazs Keri3b30d652018-10-19 13:32:20 +00006087 return make_error<ImportError>(ImportError::UnsupportedConstruct);
Douglas Gregor7eeb5972010-02-11 19:21:55 +00006088}
6089
Balazs Keri3b30d652018-10-19 13:32:20 +00006090ExpectedStmt ASTNodeImporter::VisitVAArgExpr(VAArgExpr *E) {
6091 auto Imp = importSeq(
6092 E->getBuiltinLoc(), E->getSubExpr(), E->getWrittenTypeInfo(),
6093 E->getRParenLoc(), E->getType());
6094 if (!Imp)
6095 return Imp.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006096
Balazs Keri3b30d652018-10-19 13:32:20 +00006097 SourceLocation ToBuiltinLoc, ToRParenLoc;
6098 Expr *ToSubExpr;
6099 TypeSourceInfo *ToWrittenTypeInfo;
6100 QualType ToType;
6101 std::tie(ToBuiltinLoc, ToSubExpr, ToWrittenTypeInfo, ToRParenLoc, ToType) =
6102 *Imp;
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006103
6104 return new (Importer.getToContext()) VAArgExpr(
Balazs Keri3b30d652018-10-19 13:32:20 +00006105 ToBuiltinLoc, ToSubExpr, ToWrittenTypeInfo, ToRParenLoc, ToType,
6106 E->isMicrosoftABI());
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006107}
6108
Tom Roeder521f0042019-02-26 19:26:41 +00006109ExpectedStmt ASTNodeImporter::VisitChooseExpr(ChooseExpr *E) {
6110 auto Imp = importSeq(E->getCond(), E->getLHS(), E->getRHS(),
6111 E->getBuiltinLoc(), E->getRParenLoc(), E->getType());
6112 if (!Imp)
6113 return Imp.takeError();
6114
6115 Expr *ToCond;
6116 Expr *ToLHS;
6117 Expr *ToRHS;
6118 SourceLocation ToBuiltinLoc, ToRParenLoc;
6119 QualType ToType;
6120 std::tie(ToCond, ToLHS, ToRHS, ToBuiltinLoc, ToRParenLoc, ToType) = *Imp;
6121
6122 ExprValueKind VK = E->getValueKind();
6123 ExprObjectKind OK = E->getObjectKind();
6124
6125 bool TypeDependent = ToCond->isTypeDependent();
6126 bool ValueDependent = ToCond->isValueDependent();
6127
6128 // The value of CondIsTrue only matters if the value is not
6129 // condition-dependent.
6130 bool CondIsTrue = !E->isConditionDependent() && E->isConditionTrue();
6131
6132 return new (Importer.getToContext())
6133 ChooseExpr(ToBuiltinLoc, ToCond, ToLHS, ToRHS, ToType, VK, OK,
6134 ToRParenLoc, CondIsTrue, TypeDependent, ValueDependent);
6135}
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006136
Balazs Keri3b30d652018-10-19 13:32:20 +00006137ExpectedStmt ASTNodeImporter::VisitGNUNullExpr(GNUNullExpr *E) {
6138 ExpectedType TypeOrErr = import(E->getType());
6139 if (!TypeOrErr)
6140 return TypeOrErr.takeError();
6141
6142 ExpectedSLoc BeginLocOrErr = import(E->getBeginLoc());
6143 if (!BeginLocOrErr)
6144 return BeginLocOrErr.takeError();
6145
6146 return new (Importer.getToContext()) GNUNullExpr(*TypeOrErr, *BeginLocOrErr);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006147}
6148
Balazs Keri3b30d652018-10-19 13:32:20 +00006149ExpectedStmt ASTNodeImporter::VisitPredefinedExpr(PredefinedExpr *E) {
6150 auto Imp = importSeq(
6151 E->getBeginLoc(), E->getType(), E->getFunctionName());
6152 if (!Imp)
6153 return Imp.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006154
Balazs Keri3b30d652018-10-19 13:32:20 +00006155 SourceLocation ToBeginLoc;
6156 QualType ToType;
6157 StringLiteral *ToFunctionName;
6158 std::tie(ToBeginLoc, ToType, ToFunctionName) = *Imp;
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006159
Bruno Ricci17ff0262018-10-27 19:21:19 +00006160 return PredefinedExpr::Create(Importer.getToContext(), ToBeginLoc, ToType,
6161 E->getIdentKind(), ToFunctionName);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006162}
6163
Balazs Keri3b30d652018-10-19 13:32:20 +00006164ExpectedStmt ASTNodeImporter::VisitDeclRefExpr(DeclRefExpr *E) {
6165 auto Imp = importSeq(
6166 E->getQualifierLoc(), E->getTemplateKeywordLoc(), E->getDecl(),
6167 E->getLocation(), E->getType());
6168 if (!Imp)
6169 return Imp.takeError();
Chandler Carruth8d26bb02011-05-01 23:48:14 +00006170
Balazs Keri3b30d652018-10-19 13:32:20 +00006171 NestedNameSpecifierLoc ToQualifierLoc;
6172 SourceLocation ToTemplateKeywordLoc, ToLocation;
6173 ValueDecl *ToDecl;
6174 QualType ToType;
6175 std::tie(ToQualifierLoc, ToTemplateKeywordLoc, ToDecl, ToLocation, ToType) =
6176 *Imp;
6177
6178 NamedDecl *ToFoundD = nullptr;
Chandler Carruth8d26bb02011-05-01 23:48:14 +00006179 if (E->getDecl() != E->getFoundDecl()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00006180 auto FoundDOrErr = import(E->getFoundDecl());
6181 if (!FoundDOrErr)
6182 return FoundDOrErr.takeError();
6183 ToFoundD = *FoundDOrErr;
Chandler Carruth8d26bb02011-05-01 23:48:14 +00006184 }
Fangrui Song6907ce22018-07-30 19:24:48 +00006185
Aleksei Sidorina693b372016-09-28 10:16:56 +00006186 TemplateArgumentListInfo ToTAInfo;
Balazs Keri3b30d652018-10-19 13:32:20 +00006187 TemplateArgumentListInfo *ToResInfo = nullptr;
Aleksei Sidorina693b372016-09-28 10:16:56 +00006188 if (E->hasExplicitTemplateArgs()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00006189 if (Error Err =
6190 ImportTemplateArgumentListInfo(E->template_arguments(), ToTAInfo))
6191 return std::move(Err);
6192 ToResInfo = &ToTAInfo;
Aleksei Sidorina693b372016-09-28 10:16:56 +00006193 }
6194
Balazs Keri3b30d652018-10-19 13:32:20 +00006195 auto *ToE = DeclRefExpr::Create(
6196 Importer.getToContext(), ToQualifierLoc, ToTemplateKeywordLoc, ToDecl,
6197 E->refersToEnclosingVariableOrCapture(), ToLocation, ToType,
6198 E->getValueKind(), ToFoundD, ToResInfo);
Abramo Bagnara635ed24e2011-10-05 07:56:41 +00006199 if (E->hadMultipleCandidates())
Balazs Keri3b30d652018-10-19 13:32:20 +00006200 ToE->setHadMultipleCandidates(true);
6201 return ToE;
Douglas Gregor52f820e2010-02-19 01:17:02 +00006202}
6203
Balazs Keri3b30d652018-10-19 13:32:20 +00006204ExpectedStmt ASTNodeImporter::VisitImplicitValueInitExpr(ImplicitValueInitExpr *E) {
6205 ExpectedType TypeOrErr = import(E->getType());
6206 if (!TypeOrErr)
6207 return TypeOrErr.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006208
Balazs Keri3b30d652018-10-19 13:32:20 +00006209 return new (Importer.getToContext()) ImplicitValueInitExpr(*TypeOrErr);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006210}
6211
Balazs Keri3b30d652018-10-19 13:32:20 +00006212ExpectedStmt ASTNodeImporter::VisitDesignatedInitExpr(DesignatedInitExpr *E) {
6213 ExpectedExpr ToInitOrErr = import(E->getInit());
6214 if (!ToInitOrErr)
6215 return ToInitOrErr.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006216
Balazs Keri3b30d652018-10-19 13:32:20 +00006217 ExpectedSLoc ToEqualOrColonLocOrErr = import(E->getEqualOrColonLoc());
6218 if (!ToEqualOrColonLocOrErr)
6219 return ToEqualOrColonLocOrErr.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006220
Balazs Keri3b30d652018-10-19 13:32:20 +00006221 SmallVector<Expr *, 4> ToIndexExprs(E->getNumSubExprs() - 1);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006222 // List elements from the second, the first is Init itself
Balazs Keri3b30d652018-10-19 13:32:20 +00006223 for (unsigned I = 1, N = E->getNumSubExprs(); I < N; I++) {
6224 if (ExpectedExpr ToArgOrErr = import(E->getSubExpr(I)))
6225 ToIndexExprs[I - 1] = *ToArgOrErr;
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006226 else
Balazs Keri3b30d652018-10-19 13:32:20 +00006227 return ToArgOrErr.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006228 }
6229
Balazs Keri3b30d652018-10-19 13:32:20 +00006230 SmallVector<Designator, 4> ToDesignators(E->size());
6231 if (Error Err = ImportContainerChecked(E->designators(), ToDesignators))
6232 return std::move(Err);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006233
6234 return DesignatedInitExpr::Create(
Balazs Keri3b30d652018-10-19 13:32:20 +00006235 Importer.getToContext(), ToDesignators,
6236 ToIndexExprs, *ToEqualOrColonLocOrErr,
6237 E->usesGNUSyntax(), *ToInitOrErr);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006238}
6239
Balazs Keri3b30d652018-10-19 13:32:20 +00006240ExpectedStmt
6241ASTNodeImporter::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E) {
6242 ExpectedType ToTypeOrErr = import(E->getType());
6243 if (!ToTypeOrErr)
6244 return ToTypeOrErr.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006245
Balazs Keri3b30d652018-10-19 13:32:20 +00006246 ExpectedSLoc ToLocationOrErr = import(E->getLocation());
6247 if (!ToLocationOrErr)
6248 return ToLocationOrErr.takeError();
6249
6250 return new (Importer.getToContext()) CXXNullPtrLiteralExpr(
6251 *ToTypeOrErr, *ToLocationOrErr);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006252}
6253
Balazs Keri3b30d652018-10-19 13:32:20 +00006254ExpectedStmt ASTNodeImporter::VisitIntegerLiteral(IntegerLiteral *E) {
6255 ExpectedType ToTypeOrErr = import(E->getType());
6256 if (!ToTypeOrErr)
6257 return ToTypeOrErr.takeError();
Douglas Gregor7eeb5972010-02-11 19:21:55 +00006258
Balazs Keri3b30d652018-10-19 13:32:20 +00006259 ExpectedSLoc ToLocationOrErr = import(E->getLocation());
6260 if (!ToLocationOrErr)
6261 return ToLocationOrErr.takeError();
6262
6263 return IntegerLiteral::Create(
6264 Importer.getToContext(), E->getValue(), *ToTypeOrErr, *ToLocationOrErr);
Douglas Gregor7eeb5972010-02-11 19:21:55 +00006265}
6266
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006267
Balazs Keri3b30d652018-10-19 13:32:20 +00006268ExpectedStmt ASTNodeImporter::VisitFloatingLiteral(FloatingLiteral *E) {
6269 ExpectedType ToTypeOrErr = import(E->getType());
6270 if (!ToTypeOrErr)
6271 return ToTypeOrErr.takeError();
6272
6273 ExpectedSLoc ToLocationOrErr = import(E->getLocation());
6274 if (!ToLocationOrErr)
6275 return ToLocationOrErr.takeError();
6276
6277 return FloatingLiteral::Create(
6278 Importer.getToContext(), E->getValue(), E->isExact(),
6279 *ToTypeOrErr, *ToLocationOrErr);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006280}
6281
Balazs Keri3b30d652018-10-19 13:32:20 +00006282ExpectedStmt ASTNodeImporter::VisitImaginaryLiteral(ImaginaryLiteral *E) {
6283 auto ToTypeOrErr = import(E->getType());
6284 if (!ToTypeOrErr)
6285 return ToTypeOrErr.takeError();
Gabor Martonbf7f18b2018-08-09 12:18:07 +00006286
Balazs Keri3b30d652018-10-19 13:32:20 +00006287 ExpectedExpr ToSubExprOrErr = import(E->getSubExpr());
6288 if (!ToSubExprOrErr)
6289 return ToSubExprOrErr.takeError();
Gabor Martonbf7f18b2018-08-09 12:18:07 +00006290
Balazs Keri3b30d652018-10-19 13:32:20 +00006291 return new (Importer.getToContext()) ImaginaryLiteral(
6292 *ToSubExprOrErr, *ToTypeOrErr);
Gabor Martonbf7f18b2018-08-09 12:18:07 +00006293}
6294
Balazs Keri3b30d652018-10-19 13:32:20 +00006295ExpectedStmt ASTNodeImporter::VisitCharacterLiteral(CharacterLiteral *E) {
6296 ExpectedType ToTypeOrErr = import(E->getType());
6297 if (!ToTypeOrErr)
6298 return ToTypeOrErr.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00006299
Balazs Keri3b30d652018-10-19 13:32:20 +00006300 ExpectedSLoc ToLocationOrErr = import(E->getLocation());
6301 if (!ToLocationOrErr)
6302 return ToLocationOrErr.takeError();
6303
6304 return new (Importer.getToContext()) CharacterLiteral(
6305 E->getValue(), E->getKind(), *ToTypeOrErr, *ToLocationOrErr);
Douglas Gregor623421d2010-02-18 02:21:22 +00006306}
6307
Balazs Keri3b30d652018-10-19 13:32:20 +00006308ExpectedStmt ASTNodeImporter::VisitStringLiteral(StringLiteral *E) {
6309 ExpectedType ToTypeOrErr = import(E->getType());
6310 if (!ToTypeOrErr)
6311 return ToTypeOrErr.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006312
Balazs Keri3b30d652018-10-19 13:32:20 +00006313 SmallVector<SourceLocation, 4> ToLocations(E->getNumConcatenated());
6314 if (Error Err = ImportArrayChecked(
6315 E->tokloc_begin(), E->tokloc_end(), ToLocations.begin()))
6316 return std::move(Err);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006317
Balazs Keri3b30d652018-10-19 13:32:20 +00006318 return StringLiteral::Create(
6319 Importer.getToContext(), E->getBytes(), E->getKind(), E->isPascal(),
6320 *ToTypeOrErr, ToLocations.data(), ToLocations.size());
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006321}
6322
Balazs Keri3b30d652018-10-19 13:32:20 +00006323ExpectedStmt ASTNodeImporter::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {
6324 auto Imp = importSeq(
6325 E->getLParenLoc(), E->getTypeSourceInfo(), E->getType(),
6326 E->getInitializer());
6327 if (!Imp)
6328 return Imp.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006329
Balazs Keri3b30d652018-10-19 13:32:20 +00006330 SourceLocation ToLParenLoc;
6331 TypeSourceInfo *ToTypeSourceInfo;
6332 QualType ToType;
6333 Expr *ToInitializer;
6334 std::tie(ToLParenLoc, ToTypeSourceInfo, ToType, ToInitializer) = *Imp;
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006335
6336 return new (Importer.getToContext()) CompoundLiteralExpr(
Balazs Keri3b30d652018-10-19 13:32:20 +00006337 ToLParenLoc, ToTypeSourceInfo, ToType, E->getValueKind(),
6338 ToInitializer, E->isFileScope());
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006339}
6340
Balazs Keri3b30d652018-10-19 13:32:20 +00006341ExpectedStmt ASTNodeImporter::VisitAtomicExpr(AtomicExpr *E) {
6342 auto Imp = importSeq(
6343 E->getBuiltinLoc(), E->getType(), E->getRParenLoc());
6344 if (!Imp)
6345 return Imp.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006346
Balazs Keri3b30d652018-10-19 13:32:20 +00006347 SourceLocation ToBuiltinLoc, ToRParenLoc;
6348 QualType ToType;
6349 std::tie(ToBuiltinLoc, ToType, ToRParenLoc) = *Imp;
6350
6351 SmallVector<Expr *, 6> ToExprs(E->getNumSubExprs());
6352 if (Error Err = ImportArrayChecked(
6353 E->getSubExprs(), E->getSubExprs() + E->getNumSubExprs(),
6354 ToExprs.begin()))
6355 return std::move(Err);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006356
6357 return new (Importer.getToContext()) AtomicExpr(
Balazs Keri3b30d652018-10-19 13:32:20 +00006358 ToBuiltinLoc, ToExprs, ToType, E->getOp(), ToRParenLoc);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006359}
6360
Balazs Keri3b30d652018-10-19 13:32:20 +00006361ExpectedStmt ASTNodeImporter::VisitAddrLabelExpr(AddrLabelExpr *E) {
6362 auto Imp = importSeq(
6363 E->getAmpAmpLoc(), E->getLabelLoc(), E->getLabel(), E->getType());
6364 if (!Imp)
6365 return Imp.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006366
Balazs Keri3b30d652018-10-19 13:32:20 +00006367 SourceLocation ToAmpAmpLoc, ToLabelLoc;
6368 LabelDecl *ToLabel;
6369 QualType ToType;
6370 std::tie(ToAmpAmpLoc, ToLabelLoc, ToLabel, ToType) = *Imp;
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006371
6372 return new (Importer.getToContext()) AddrLabelExpr(
Balazs Keri3b30d652018-10-19 13:32:20 +00006373 ToAmpAmpLoc, ToLabelLoc, ToLabel, ToType);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006374}
6375
Bill Wendling8003edc2018-11-09 00:41:36 +00006376ExpectedStmt ASTNodeImporter::VisitConstantExpr(ConstantExpr *E) {
6377 auto Imp = importSeq(E->getSubExpr());
6378 if (!Imp)
6379 return Imp.takeError();
6380
6381 Expr *ToSubExpr;
6382 std::tie(ToSubExpr) = *Imp;
6383
Fangrui Song407659a2018-11-30 23:41:18 +00006384 return ConstantExpr::Create(Importer.getToContext(), ToSubExpr);
Bill Wendling8003edc2018-11-09 00:41:36 +00006385}
6386
Balazs Keri3b30d652018-10-19 13:32:20 +00006387ExpectedStmt ASTNodeImporter::VisitParenExpr(ParenExpr *E) {
6388 auto Imp = importSeq(E->getLParen(), E->getRParen(), E->getSubExpr());
6389 if (!Imp)
6390 return Imp.takeError();
6391
6392 SourceLocation ToLParen, ToRParen;
6393 Expr *ToSubExpr;
6394 std::tie(ToLParen, ToRParen, ToSubExpr) = *Imp;
Craig Topper36250ad2014-05-12 05:36:57 +00006395
Fangrui Song6907ce22018-07-30 19:24:48 +00006396 return new (Importer.getToContext())
Balazs Keri3b30d652018-10-19 13:32:20 +00006397 ParenExpr(ToLParen, ToRParen, ToSubExpr);
Douglas Gregorc74247e2010-02-19 01:07:06 +00006398}
6399
Balazs Keri3b30d652018-10-19 13:32:20 +00006400ExpectedStmt ASTNodeImporter::VisitParenListExpr(ParenListExpr *E) {
6401 SmallVector<Expr *, 4> ToExprs(E->getNumExprs());
6402 if (Error Err = ImportContainerChecked(E->exprs(), ToExprs))
6403 return std::move(Err);
6404
6405 ExpectedSLoc ToLParenLocOrErr = import(E->getLParenLoc());
6406 if (!ToLParenLocOrErr)
6407 return ToLParenLocOrErr.takeError();
6408
6409 ExpectedSLoc ToRParenLocOrErr = import(E->getRParenLoc());
6410 if (!ToRParenLocOrErr)
6411 return ToRParenLocOrErr.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006412
Bruno Riccif49e1ca2018-11-20 16:20:40 +00006413 return ParenListExpr::Create(Importer.getToContext(), *ToLParenLocOrErr,
6414 ToExprs, *ToRParenLocOrErr);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006415}
6416
Balazs Keri3b30d652018-10-19 13:32:20 +00006417ExpectedStmt ASTNodeImporter::VisitStmtExpr(StmtExpr *E) {
6418 auto Imp = importSeq(
6419 E->getSubStmt(), E->getType(), E->getLParenLoc(), E->getRParenLoc());
6420 if (!Imp)
6421 return Imp.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006422
Balazs Keri3b30d652018-10-19 13:32:20 +00006423 CompoundStmt *ToSubStmt;
6424 QualType ToType;
6425 SourceLocation ToLParenLoc, ToRParenLoc;
6426 std::tie(ToSubStmt, ToType, ToLParenLoc, ToRParenLoc) = *Imp;
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006427
Balazs Keri3b30d652018-10-19 13:32:20 +00006428 return new (Importer.getToContext()) StmtExpr(
6429 ToSubStmt, ToType, ToLParenLoc, ToRParenLoc);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006430}
6431
Balazs Keri3b30d652018-10-19 13:32:20 +00006432ExpectedStmt ASTNodeImporter::VisitUnaryOperator(UnaryOperator *E) {
6433 auto Imp = importSeq(
6434 E->getSubExpr(), E->getType(), E->getOperatorLoc());
6435 if (!Imp)
6436 return Imp.takeError();
Douglas Gregorc74247e2010-02-19 01:07:06 +00006437
Balazs Keri3b30d652018-10-19 13:32:20 +00006438 Expr *ToSubExpr;
6439 QualType ToType;
6440 SourceLocation ToOperatorLoc;
6441 std::tie(ToSubExpr, ToType, ToOperatorLoc) = *Imp;
Craig Topper36250ad2014-05-12 05:36:57 +00006442
Aaron Ballmana5038552018-01-09 13:07:03 +00006443 return new (Importer.getToContext()) UnaryOperator(
Balazs Keri3b30d652018-10-19 13:32:20 +00006444 ToSubExpr, E->getOpcode(), ToType, E->getValueKind(), E->getObjectKind(),
6445 ToOperatorLoc, E->canOverflow());
Douglas Gregorc74247e2010-02-19 01:07:06 +00006446}
6447
Balazs Keri3b30d652018-10-19 13:32:20 +00006448ExpectedStmt
Aaron Ballmana5038552018-01-09 13:07:03 +00006449ASTNodeImporter::VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *E) {
Balazs Keri3b30d652018-10-19 13:32:20 +00006450 auto Imp = importSeq(E->getType(), E->getOperatorLoc(), E->getRParenLoc());
6451 if (!Imp)
6452 return Imp.takeError();
6453
6454 QualType ToType;
6455 SourceLocation ToOperatorLoc, ToRParenLoc;
6456 std::tie(ToType, ToOperatorLoc, ToRParenLoc) = *Imp;
Fangrui Song6907ce22018-07-30 19:24:48 +00006457
Douglas Gregord8552cd2010-02-19 01:24:23 +00006458 if (E->isArgumentType()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00006459 Expected<TypeSourceInfo *> ToArgumentTypeInfoOrErr =
6460 import(E->getArgumentTypeInfo());
6461 if (!ToArgumentTypeInfoOrErr)
6462 return ToArgumentTypeInfoOrErr.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00006463
Balazs Keri3b30d652018-10-19 13:32:20 +00006464 return new (Importer.getToContext()) UnaryExprOrTypeTraitExpr(
6465 E->getKind(), *ToArgumentTypeInfoOrErr, ToType, ToOperatorLoc,
6466 ToRParenLoc);
Douglas Gregord8552cd2010-02-19 01:24:23 +00006467 }
Fangrui Song6907ce22018-07-30 19:24:48 +00006468
Balazs Keri3b30d652018-10-19 13:32:20 +00006469 ExpectedExpr ToArgumentExprOrErr = import(E->getArgumentExpr());
6470 if (!ToArgumentExprOrErr)
6471 return ToArgumentExprOrErr.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00006472
Balazs Keri3b30d652018-10-19 13:32:20 +00006473 return new (Importer.getToContext()) UnaryExprOrTypeTraitExpr(
6474 E->getKind(), *ToArgumentExprOrErr, ToType, ToOperatorLoc, ToRParenLoc);
Douglas Gregord8552cd2010-02-19 01:24:23 +00006475}
6476
Balazs Keri3b30d652018-10-19 13:32:20 +00006477ExpectedStmt ASTNodeImporter::VisitBinaryOperator(BinaryOperator *E) {
6478 auto Imp = importSeq(
6479 E->getLHS(), E->getRHS(), E->getType(), E->getOperatorLoc());
6480 if (!Imp)
6481 return Imp.takeError();
Douglas Gregorc74247e2010-02-19 01:07:06 +00006482
Balazs Keri3b30d652018-10-19 13:32:20 +00006483 Expr *ToLHS, *ToRHS;
6484 QualType ToType;
6485 SourceLocation ToOperatorLoc;
6486 std::tie(ToLHS, ToRHS, ToType, ToOperatorLoc) = *Imp;
Craig Topper36250ad2014-05-12 05:36:57 +00006487
Balazs Keri3b30d652018-10-19 13:32:20 +00006488 return new (Importer.getToContext()) BinaryOperator(
6489 ToLHS, ToRHS, E->getOpcode(), ToType, E->getValueKind(),
6490 E->getObjectKind(), ToOperatorLoc, E->getFPFeatures());
Douglas Gregorc74247e2010-02-19 01:07:06 +00006491}
6492
Balazs Keri3b30d652018-10-19 13:32:20 +00006493ExpectedStmt ASTNodeImporter::VisitConditionalOperator(ConditionalOperator *E) {
6494 auto Imp = importSeq(
6495 E->getCond(), E->getQuestionLoc(), E->getLHS(), E->getColonLoc(),
6496 E->getRHS(), E->getType());
6497 if (!Imp)
6498 return Imp.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006499
Balazs Keri3b30d652018-10-19 13:32:20 +00006500 Expr *ToCond, *ToLHS, *ToRHS;
6501 SourceLocation ToQuestionLoc, ToColonLoc;
6502 QualType ToType;
6503 std::tie(ToCond, ToQuestionLoc, ToLHS, ToColonLoc, ToRHS, ToType) = *Imp;
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006504
6505 return new (Importer.getToContext()) ConditionalOperator(
Balazs Keri3b30d652018-10-19 13:32:20 +00006506 ToCond, ToQuestionLoc, ToLHS, ToColonLoc, ToRHS, ToType,
6507 E->getValueKind(), E->getObjectKind());
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006508}
6509
Balazs Keri3b30d652018-10-19 13:32:20 +00006510ExpectedStmt ASTNodeImporter::VisitBinaryConditionalOperator(
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006511 BinaryConditionalOperator *E) {
Balazs Keri3b30d652018-10-19 13:32:20 +00006512 auto Imp = importSeq(
6513 E->getCommon(), E->getOpaqueValue(), E->getCond(), E->getTrueExpr(),
6514 E->getFalseExpr(), E->getQuestionLoc(), E->getColonLoc(), E->getType());
6515 if (!Imp)
6516 return Imp.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006517
Balazs Keri3b30d652018-10-19 13:32:20 +00006518 Expr *ToCommon, *ToCond, *ToTrueExpr, *ToFalseExpr;
6519 OpaqueValueExpr *ToOpaqueValue;
6520 SourceLocation ToQuestionLoc, ToColonLoc;
6521 QualType ToType;
6522 std::tie(
6523 ToCommon, ToOpaqueValue, ToCond, ToTrueExpr, ToFalseExpr, ToQuestionLoc,
6524 ToColonLoc, ToType) = *Imp;
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006525
6526 return new (Importer.getToContext()) BinaryConditionalOperator(
Balazs Keri3b30d652018-10-19 13:32:20 +00006527 ToCommon, ToOpaqueValue, ToCond, ToTrueExpr, ToFalseExpr,
6528 ToQuestionLoc, ToColonLoc, ToType, E->getValueKind(),
6529 E->getObjectKind());
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006530}
6531
Balazs Keri3b30d652018-10-19 13:32:20 +00006532ExpectedStmt ASTNodeImporter::VisitArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
6533 auto Imp = importSeq(
6534 E->getBeginLoc(), E->getQueriedTypeSourceInfo(),
6535 E->getDimensionExpression(), E->getEndLoc(), E->getType());
6536 if (!Imp)
6537 return Imp.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00006538
Balazs Keri3b30d652018-10-19 13:32:20 +00006539 SourceLocation ToBeginLoc, ToEndLoc;
6540 TypeSourceInfo *ToQueriedTypeSourceInfo;
6541 Expr *ToDimensionExpression;
6542 QualType ToType;
6543 std::tie(
6544 ToBeginLoc, ToQueriedTypeSourceInfo, ToDimensionExpression, ToEndLoc,
6545 ToType) = *Imp;
Aleksei Sidorina693b372016-09-28 10:16:56 +00006546
6547 return new (Importer.getToContext()) ArrayTypeTraitExpr(
Balazs Keri3b30d652018-10-19 13:32:20 +00006548 ToBeginLoc, E->getTrait(), ToQueriedTypeSourceInfo, E->getValue(),
6549 ToDimensionExpression, ToEndLoc, ToType);
Aleksei Sidorina693b372016-09-28 10:16:56 +00006550}
6551
Balazs Keri3b30d652018-10-19 13:32:20 +00006552ExpectedStmt ASTNodeImporter::VisitExpressionTraitExpr(ExpressionTraitExpr *E) {
6553 auto Imp = importSeq(
6554 E->getBeginLoc(), E->getQueriedExpression(), E->getEndLoc(), E->getType());
6555 if (!Imp)
6556 return Imp.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00006557
Balazs Keri3b30d652018-10-19 13:32:20 +00006558 SourceLocation ToBeginLoc, ToEndLoc;
6559 Expr *ToQueriedExpression;
6560 QualType ToType;
6561 std::tie(ToBeginLoc, ToQueriedExpression, ToEndLoc, ToType) = *Imp;
Aleksei Sidorina693b372016-09-28 10:16:56 +00006562
6563 return new (Importer.getToContext()) ExpressionTraitExpr(
Balazs Keri3b30d652018-10-19 13:32:20 +00006564 ToBeginLoc, E->getTrait(), ToQueriedExpression, E->getValue(),
6565 ToEndLoc, ToType);
Aleksei Sidorina693b372016-09-28 10:16:56 +00006566}
6567
Balazs Keri3b30d652018-10-19 13:32:20 +00006568ExpectedStmt ASTNodeImporter::VisitOpaqueValueExpr(OpaqueValueExpr *E) {
6569 auto Imp = importSeq(
6570 E->getLocation(), E->getType(), E->getSourceExpr());
6571 if (!Imp)
6572 return Imp.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006573
Balazs Keri3b30d652018-10-19 13:32:20 +00006574 SourceLocation ToLocation;
6575 QualType ToType;
6576 Expr *ToSourceExpr;
6577 std::tie(ToLocation, ToType, ToSourceExpr) = *Imp;
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006578
6579 return new (Importer.getToContext()) OpaqueValueExpr(
Balazs Keri3b30d652018-10-19 13:32:20 +00006580 ToLocation, ToType, E->getValueKind(), E->getObjectKind(), ToSourceExpr);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006581}
6582
Balazs Keri3b30d652018-10-19 13:32:20 +00006583ExpectedStmt ASTNodeImporter::VisitArraySubscriptExpr(ArraySubscriptExpr *E) {
6584 auto Imp = importSeq(
6585 E->getLHS(), E->getRHS(), E->getType(), E->getRBracketLoc());
6586 if (!Imp)
6587 return Imp.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00006588
Balazs Keri3b30d652018-10-19 13:32:20 +00006589 Expr *ToLHS, *ToRHS;
6590 SourceLocation ToRBracketLoc;
6591 QualType ToType;
6592 std::tie(ToLHS, ToRHS, ToType, ToRBracketLoc) = *Imp;
Aleksei Sidorina693b372016-09-28 10:16:56 +00006593
6594 return new (Importer.getToContext()) ArraySubscriptExpr(
Balazs Keri3b30d652018-10-19 13:32:20 +00006595 ToLHS, ToRHS, ToType, E->getValueKind(), E->getObjectKind(),
6596 ToRBracketLoc);
Aleksei Sidorina693b372016-09-28 10:16:56 +00006597}
6598
Balazs Keri3b30d652018-10-19 13:32:20 +00006599ExpectedStmt
6600ASTNodeImporter::VisitCompoundAssignOperator(CompoundAssignOperator *E) {
6601 auto Imp = importSeq(
6602 E->getLHS(), E->getRHS(), E->getType(), E->getComputationLHSType(),
6603 E->getComputationResultType(), E->getOperatorLoc());
6604 if (!Imp)
6605 return Imp.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00006606
Balazs Keri3b30d652018-10-19 13:32:20 +00006607 Expr *ToLHS, *ToRHS;
6608 QualType ToType, ToComputationLHSType, ToComputationResultType;
6609 SourceLocation ToOperatorLoc;
6610 std::tie(ToLHS, ToRHS, ToType, ToComputationLHSType, ToComputationResultType,
6611 ToOperatorLoc) = *Imp;
Craig Topper36250ad2014-05-12 05:36:57 +00006612
Balazs Keri3b30d652018-10-19 13:32:20 +00006613 return new (Importer.getToContext()) CompoundAssignOperator(
6614 ToLHS, ToRHS, E->getOpcode(), ToType, E->getValueKind(),
6615 E->getObjectKind(), ToComputationLHSType, ToComputationResultType,
6616 ToOperatorLoc, E->getFPFeatures());
Douglas Gregorc74247e2010-02-19 01:07:06 +00006617}
6618
Balazs Keri3b30d652018-10-19 13:32:20 +00006619Expected<CXXCastPath>
6620ASTNodeImporter::ImportCastPath(CastExpr *CE) {
6621 CXXCastPath Path;
Aleksei Sidorina693b372016-09-28 10:16:56 +00006622 for (auto I = CE->path_begin(), E = CE->path_end(); I != E; ++I) {
Balazs Keri3b30d652018-10-19 13:32:20 +00006623 if (auto SpecOrErr = import(*I))
6624 Path.push_back(*SpecOrErr);
Aleksei Sidorina693b372016-09-28 10:16:56 +00006625 else
Balazs Keri3b30d652018-10-19 13:32:20 +00006626 return SpecOrErr.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00006627 }
Balazs Keri3b30d652018-10-19 13:32:20 +00006628 return Path;
John McCallcf142162010-08-07 06:22:56 +00006629}
6630
Balazs Keri3b30d652018-10-19 13:32:20 +00006631ExpectedStmt ASTNodeImporter::VisitImplicitCastExpr(ImplicitCastExpr *E) {
6632 ExpectedType ToTypeOrErr = import(E->getType());
6633 if (!ToTypeOrErr)
6634 return ToTypeOrErr.takeError();
Douglas Gregor98c10182010-02-12 22:17:39 +00006635
Balazs Keri3b30d652018-10-19 13:32:20 +00006636 ExpectedExpr ToSubExprOrErr = import(E->getSubExpr());
6637 if (!ToSubExprOrErr)
6638 return ToSubExprOrErr.takeError();
John McCallcf142162010-08-07 06:22:56 +00006639
Balazs Keri3b30d652018-10-19 13:32:20 +00006640 Expected<CXXCastPath> ToBasePathOrErr = ImportCastPath(E);
6641 if (!ToBasePathOrErr)
6642 return ToBasePathOrErr.takeError();
John McCallcf142162010-08-07 06:22:56 +00006643
Balazs Keri3b30d652018-10-19 13:32:20 +00006644 return ImplicitCastExpr::Create(
6645 Importer.getToContext(), *ToTypeOrErr, E->getCastKind(), *ToSubExprOrErr,
6646 &(*ToBasePathOrErr), E->getValueKind());
Douglas Gregor98c10182010-02-12 22:17:39 +00006647}
6648
Balazs Keri3b30d652018-10-19 13:32:20 +00006649ExpectedStmt ASTNodeImporter::VisitExplicitCastExpr(ExplicitCastExpr *E) {
6650 auto Imp1 = importSeq(
6651 E->getType(), E->getSubExpr(), E->getTypeInfoAsWritten());
6652 if (!Imp1)
6653 return Imp1.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00006654
Balazs Keri3b30d652018-10-19 13:32:20 +00006655 QualType ToType;
6656 Expr *ToSubExpr;
6657 TypeSourceInfo *ToTypeInfoAsWritten;
6658 std::tie(ToType, ToSubExpr, ToTypeInfoAsWritten) = *Imp1;
Douglas Gregor5481d322010-02-19 01:32:14 +00006659
Balazs Keri3b30d652018-10-19 13:32:20 +00006660 Expected<CXXCastPath> ToBasePathOrErr = ImportCastPath(E);
6661 if (!ToBasePathOrErr)
6662 return ToBasePathOrErr.takeError();
6663 CXXCastPath *ToBasePath = &(*ToBasePathOrErr);
John McCallcf142162010-08-07 06:22:56 +00006664
Aleksei Sidorina693b372016-09-28 10:16:56 +00006665 switch (E->getStmtClass()) {
6666 case Stmt::CStyleCastExprClass: {
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00006667 auto *CCE = cast<CStyleCastExpr>(E);
Balazs Keri3b30d652018-10-19 13:32:20 +00006668 ExpectedSLoc ToLParenLocOrErr = import(CCE->getLParenLoc());
6669 if (!ToLParenLocOrErr)
6670 return ToLParenLocOrErr.takeError();
6671 ExpectedSLoc ToRParenLocOrErr = import(CCE->getRParenLoc());
6672 if (!ToRParenLocOrErr)
6673 return ToRParenLocOrErr.takeError();
6674 return CStyleCastExpr::Create(
6675 Importer.getToContext(), ToType, E->getValueKind(), E->getCastKind(),
6676 ToSubExpr, ToBasePath, ToTypeInfoAsWritten, *ToLParenLocOrErr,
6677 *ToRParenLocOrErr);
Aleksei Sidorina693b372016-09-28 10:16:56 +00006678 }
6679
6680 case Stmt::CXXFunctionalCastExprClass: {
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00006681 auto *FCE = cast<CXXFunctionalCastExpr>(E);
Balazs Keri3b30d652018-10-19 13:32:20 +00006682 ExpectedSLoc ToLParenLocOrErr = import(FCE->getLParenLoc());
6683 if (!ToLParenLocOrErr)
6684 return ToLParenLocOrErr.takeError();
6685 ExpectedSLoc ToRParenLocOrErr = import(FCE->getRParenLoc());
6686 if (!ToRParenLocOrErr)
6687 return ToRParenLocOrErr.takeError();
6688 return CXXFunctionalCastExpr::Create(
6689 Importer.getToContext(), ToType, E->getValueKind(), ToTypeInfoAsWritten,
6690 E->getCastKind(), ToSubExpr, ToBasePath, *ToLParenLocOrErr,
6691 *ToRParenLocOrErr);
Aleksei Sidorina693b372016-09-28 10:16:56 +00006692 }
6693
6694 case Stmt::ObjCBridgedCastExprClass: {
Balazs Keri3b30d652018-10-19 13:32:20 +00006695 auto *OCE = cast<ObjCBridgedCastExpr>(E);
6696 ExpectedSLoc ToLParenLocOrErr = import(OCE->getLParenLoc());
6697 if (!ToLParenLocOrErr)
6698 return ToLParenLocOrErr.takeError();
6699 ExpectedSLoc ToBridgeKeywordLocOrErr = import(OCE->getBridgeKeywordLoc());
6700 if (!ToBridgeKeywordLocOrErr)
6701 return ToBridgeKeywordLocOrErr.takeError();
6702 return new (Importer.getToContext()) ObjCBridgedCastExpr(
6703 *ToLParenLocOrErr, OCE->getBridgeKind(), E->getCastKind(),
6704 *ToBridgeKeywordLocOrErr, ToTypeInfoAsWritten, ToSubExpr);
Aleksei Sidorina693b372016-09-28 10:16:56 +00006705 }
6706 default:
Aleksei Sidorina693b372016-09-28 10:16:56 +00006707 llvm_unreachable("Cast expression of unsupported type!");
Balazs Keri3b30d652018-10-19 13:32:20 +00006708 return make_error<ImportError>(ImportError::UnsupportedConstruct);
Aleksei Sidorina693b372016-09-28 10:16:56 +00006709 }
6710}
6711
Balazs Keri3b30d652018-10-19 13:32:20 +00006712ExpectedStmt ASTNodeImporter::VisitOffsetOfExpr(OffsetOfExpr *E) {
6713 SmallVector<OffsetOfNode, 4> ToNodes;
6714 for (int I = 0, N = E->getNumComponents(); I < N; ++I) {
6715 const OffsetOfNode &FromNode = E->getComponent(I);
Aleksei Sidorina693b372016-09-28 10:16:56 +00006716
Balazs Keri3b30d652018-10-19 13:32:20 +00006717 SourceLocation ToBeginLoc, ToEndLoc;
6718 if (FromNode.getKind() != OffsetOfNode::Base) {
6719 auto Imp = importSeq(FromNode.getBeginLoc(), FromNode.getEndLoc());
6720 if (!Imp)
6721 return Imp.takeError();
6722 std::tie(ToBeginLoc, ToEndLoc) = *Imp;
6723 }
Aleksei Sidorina693b372016-09-28 10:16:56 +00006724
Balazs Keri3b30d652018-10-19 13:32:20 +00006725 switch (FromNode.getKind()) {
Aleksei Sidorina693b372016-09-28 10:16:56 +00006726 case OffsetOfNode::Array:
Balazs Keri3b30d652018-10-19 13:32:20 +00006727 ToNodes.push_back(
6728 OffsetOfNode(ToBeginLoc, FromNode.getArrayExprIndex(), ToEndLoc));
Aleksei Sidorina693b372016-09-28 10:16:56 +00006729 break;
Aleksei Sidorina693b372016-09-28 10:16:56 +00006730 case OffsetOfNode::Base: {
Balazs Keri3b30d652018-10-19 13:32:20 +00006731 auto ToBSOrErr = import(FromNode.getBase());
6732 if (!ToBSOrErr)
6733 return ToBSOrErr.takeError();
6734 ToNodes.push_back(OffsetOfNode(*ToBSOrErr));
Aleksei Sidorina693b372016-09-28 10:16:56 +00006735 break;
6736 }
6737 case OffsetOfNode::Field: {
Balazs Keri3b30d652018-10-19 13:32:20 +00006738 auto ToFieldOrErr = import(FromNode.getField());
6739 if (!ToFieldOrErr)
6740 return ToFieldOrErr.takeError();
6741 ToNodes.push_back(OffsetOfNode(ToBeginLoc, *ToFieldOrErr, ToEndLoc));
Aleksei Sidorina693b372016-09-28 10:16:56 +00006742 break;
6743 }
6744 case OffsetOfNode::Identifier: {
Balazs Keri3b30d652018-10-19 13:32:20 +00006745 IdentifierInfo *ToII = Importer.Import(FromNode.getFieldName());
6746 ToNodes.push_back(OffsetOfNode(ToBeginLoc, ToII, ToEndLoc));
Aleksei Sidorina693b372016-09-28 10:16:56 +00006747 break;
6748 }
6749 }
6750 }
6751
Balazs Keri3b30d652018-10-19 13:32:20 +00006752 SmallVector<Expr *, 4> ToExprs(E->getNumExpressions());
6753 for (int I = 0, N = E->getNumExpressions(); I < N; ++I) {
6754 ExpectedExpr ToIndexExprOrErr = import(E->getIndexExpr(I));
6755 if (!ToIndexExprOrErr)
6756 return ToIndexExprOrErr.takeError();
6757 ToExprs[I] = *ToIndexExprOrErr;
Aleksei Sidorina693b372016-09-28 10:16:56 +00006758 }
6759
Balazs Keri3b30d652018-10-19 13:32:20 +00006760 auto Imp = importSeq(
6761 E->getType(), E->getTypeSourceInfo(), E->getOperatorLoc(),
6762 E->getRParenLoc());
6763 if (!Imp)
6764 return Imp.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00006765
Balazs Keri3b30d652018-10-19 13:32:20 +00006766 QualType ToType;
6767 TypeSourceInfo *ToTypeSourceInfo;
6768 SourceLocation ToOperatorLoc, ToRParenLoc;
6769 std::tie(ToType, ToTypeSourceInfo, ToOperatorLoc, ToRParenLoc) = *Imp;
6770
6771 return OffsetOfExpr::Create(
6772 Importer.getToContext(), ToType, ToOperatorLoc, ToTypeSourceInfo, ToNodes,
6773 ToExprs, ToRParenLoc);
Aleksei Sidorina693b372016-09-28 10:16:56 +00006774}
6775
Balazs Keri3b30d652018-10-19 13:32:20 +00006776ExpectedStmt ASTNodeImporter::VisitCXXNoexceptExpr(CXXNoexceptExpr *E) {
6777 auto Imp = importSeq(
6778 E->getType(), E->getOperand(), E->getBeginLoc(), E->getEndLoc());
6779 if (!Imp)
6780 return Imp.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00006781
Balazs Keri3b30d652018-10-19 13:32:20 +00006782 QualType ToType;
6783 Expr *ToOperand;
6784 SourceLocation ToBeginLoc, ToEndLoc;
6785 std::tie(ToType, ToOperand, ToBeginLoc, ToEndLoc) = *Imp;
Aleksei Sidorina693b372016-09-28 10:16:56 +00006786
Balazs Keri3b30d652018-10-19 13:32:20 +00006787 CanThrowResult ToCanThrow;
Aleksei Sidorina693b372016-09-28 10:16:56 +00006788 if (E->isValueDependent())
Balazs Keri3b30d652018-10-19 13:32:20 +00006789 ToCanThrow = CT_Dependent;
Aleksei Sidorina693b372016-09-28 10:16:56 +00006790 else
Balazs Keri3b30d652018-10-19 13:32:20 +00006791 ToCanThrow = E->getValue() ? CT_Can : CT_Cannot;
Aleksei Sidorina693b372016-09-28 10:16:56 +00006792
Balazs Keri3b30d652018-10-19 13:32:20 +00006793 return new (Importer.getToContext()) CXXNoexceptExpr(
6794 ToType, ToOperand, ToCanThrow, ToBeginLoc, ToEndLoc);
Aleksei Sidorina693b372016-09-28 10:16:56 +00006795}
6796
Balazs Keri3b30d652018-10-19 13:32:20 +00006797ExpectedStmt ASTNodeImporter::VisitCXXThrowExpr(CXXThrowExpr *E) {
6798 auto Imp = importSeq(E->getSubExpr(), E->getType(), E->getThrowLoc());
6799 if (!Imp)
6800 return Imp.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00006801
Balazs Keri3b30d652018-10-19 13:32:20 +00006802 Expr *ToSubExpr;
6803 QualType ToType;
6804 SourceLocation ToThrowLoc;
6805 std::tie(ToSubExpr, ToType, ToThrowLoc) = *Imp;
Aleksei Sidorina693b372016-09-28 10:16:56 +00006806
6807 return new (Importer.getToContext()) CXXThrowExpr(
Balazs Keri3b30d652018-10-19 13:32:20 +00006808 ToSubExpr, ToType, ToThrowLoc, E->isThrownVariableInScope());
Aleksei Sidorina693b372016-09-28 10:16:56 +00006809}
6810
Balazs Keri3b30d652018-10-19 13:32:20 +00006811ExpectedStmt ASTNodeImporter::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
6812 ExpectedSLoc ToUsedLocOrErr = import(E->getUsedLocation());
6813 if (!ToUsedLocOrErr)
6814 return ToUsedLocOrErr.takeError();
6815
6816 auto ToParamOrErr = import(E->getParam());
6817 if (!ToParamOrErr)
6818 return ToParamOrErr.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00006819
6820 return CXXDefaultArgExpr::Create(
Balazs Keri3b30d652018-10-19 13:32:20 +00006821 Importer.getToContext(), *ToUsedLocOrErr, *ToParamOrErr);
Aleksei Sidorina693b372016-09-28 10:16:56 +00006822}
6823
Balazs Keri3b30d652018-10-19 13:32:20 +00006824ExpectedStmt
6825ASTNodeImporter::VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E) {
6826 auto Imp = importSeq(
6827 E->getType(), E->getTypeSourceInfo(), E->getRParenLoc());
6828 if (!Imp)
6829 return Imp.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00006830
Balazs Keri3b30d652018-10-19 13:32:20 +00006831 QualType ToType;
6832 TypeSourceInfo *ToTypeSourceInfo;
6833 SourceLocation ToRParenLoc;
6834 std::tie(ToType, ToTypeSourceInfo, ToRParenLoc) = *Imp;
Aleksei Sidorina693b372016-09-28 10:16:56 +00006835
6836 return new (Importer.getToContext()) CXXScalarValueInitExpr(
Balazs Keri3b30d652018-10-19 13:32:20 +00006837 ToType, ToTypeSourceInfo, ToRParenLoc);
Aleksei Sidorina693b372016-09-28 10:16:56 +00006838}
6839
Balazs Keri3b30d652018-10-19 13:32:20 +00006840ExpectedStmt
6841ASTNodeImporter::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
6842 ExpectedExpr ToSubExprOrErr = import(E->getSubExpr());
6843 if (!ToSubExprOrErr)
6844 return ToSubExprOrErr.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00006845
Balazs Keri3b30d652018-10-19 13:32:20 +00006846 auto ToDtorOrErr = import(E->getTemporary()->getDestructor());
6847 if (!ToDtorOrErr)
6848 return ToDtorOrErr.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00006849
6850 ASTContext &ToCtx = Importer.getToContext();
Balazs Keri3b30d652018-10-19 13:32:20 +00006851 CXXTemporary *Temp = CXXTemporary::Create(ToCtx, *ToDtorOrErr);
6852 return CXXBindTemporaryExpr::Create(ToCtx, Temp, *ToSubExprOrErr);
Aleksei Sidorina693b372016-09-28 10:16:56 +00006853}
6854
Balazs Keri3b30d652018-10-19 13:32:20 +00006855ExpectedStmt
6856ASTNodeImporter::VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E) {
6857 auto Imp = importSeq(
6858 E->getConstructor(), E->getType(), E->getTypeSourceInfo(),
6859 E->getParenOrBraceRange());
6860 if (!Imp)
6861 return Imp.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00006862
Balazs Keri3b30d652018-10-19 13:32:20 +00006863 CXXConstructorDecl *ToConstructor;
6864 QualType ToType;
6865 TypeSourceInfo *ToTypeSourceInfo;
6866 SourceRange ToParenOrBraceRange;
6867 std::tie(ToConstructor, ToType, ToTypeSourceInfo, ToParenOrBraceRange) = *Imp;
Gabor Horvathc78d99a2018-01-27 16:11:45 +00006868
Balazs Keri3b30d652018-10-19 13:32:20 +00006869 SmallVector<Expr *, 8> ToArgs(E->getNumArgs());
6870 if (Error Err = ImportContainerChecked(E->arguments(), ToArgs))
6871 return std::move(Err);
Aleksei Sidorina693b372016-09-28 10:16:56 +00006872
Bruno Ricciddb8f6b2018-12-22 14:39:30 +00006873 return CXXTemporaryObjectExpr::Create(
Balazs Keri3b30d652018-10-19 13:32:20 +00006874 Importer.getToContext(), ToConstructor, ToType, ToTypeSourceInfo, ToArgs,
6875 ToParenOrBraceRange, E->hadMultipleCandidates(),
6876 E->isListInitialization(), E->isStdInitListInitialization(),
6877 E->requiresZeroInitialization());
Aleksei Sidorina693b372016-09-28 10:16:56 +00006878}
6879
Balazs Keri3b30d652018-10-19 13:32:20 +00006880ExpectedStmt
Aleksei Sidorina693b372016-09-28 10:16:56 +00006881ASTNodeImporter::VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *E) {
Balazs Keri3b30d652018-10-19 13:32:20 +00006882 auto Imp = importSeq(
6883 E->getType(), E->GetTemporaryExpr(), E->getExtendingDecl());
6884 if (!Imp)
6885 return Imp.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00006886
Balazs Keri3b30d652018-10-19 13:32:20 +00006887 QualType ToType;
6888 Expr *ToTemporaryExpr;
6889 const ValueDecl *ToExtendingDecl;
6890 std::tie(ToType, ToTemporaryExpr, ToExtendingDecl) = *Imp;
Aleksei Sidorina693b372016-09-28 10:16:56 +00006891
6892 auto *ToMTE = new (Importer.getToContext()) MaterializeTemporaryExpr(
Balazs Keri3b30d652018-10-19 13:32:20 +00006893 ToType, ToTemporaryExpr, E->isBoundToLvalueReference());
Aleksei Sidorina693b372016-09-28 10:16:56 +00006894
6895 // FIXME: Should ManglingNumber get numbers associated with 'to' context?
Balazs Keri3b30d652018-10-19 13:32:20 +00006896 ToMTE->setExtendingDecl(ToExtendingDecl, E->getManglingNumber());
Aleksei Sidorina693b372016-09-28 10:16:56 +00006897 return ToMTE;
6898}
6899
Balazs Keri3b30d652018-10-19 13:32:20 +00006900ExpectedStmt ASTNodeImporter::VisitPackExpansionExpr(PackExpansionExpr *E) {
6901 auto Imp = importSeq(
6902 E->getType(), E->getPattern(), E->getEllipsisLoc());
6903 if (!Imp)
6904 return Imp.takeError();
Gabor Horvath7a91c082017-11-14 11:30:38 +00006905
Balazs Keri3b30d652018-10-19 13:32:20 +00006906 QualType ToType;
6907 Expr *ToPattern;
6908 SourceLocation ToEllipsisLoc;
6909 std::tie(ToType, ToPattern, ToEllipsisLoc) = *Imp;
Gabor Horvath7a91c082017-11-14 11:30:38 +00006910
6911 return new (Importer.getToContext()) PackExpansionExpr(
Balazs Keri3b30d652018-10-19 13:32:20 +00006912 ToType, ToPattern, ToEllipsisLoc, E->getNumExpansions());
Gabor Horvath7a91c082017-11-14 11:30:38 +00006913}
6914
Balazs Keri3b30d652018-10-19 13:32:20 +00006915ExpectedStmt ASTNodeImporter::VisitSizeOfPackExpr(SizeOfPackExpr *E) {
6916 auto Imp = importSeq(
6917 E->getOperatorLoc(), E->getPack(), E->getPackLoc(), E->getRParenLoc());
6918 if (!Imp)
6919 return Imp.takeError();
6920
6921 SourceLocation ToOperatorLoc, ToPackLoc, ToRParenLoc;
6922 NamedDecl *ToPack;
6923 std::tie(ToOperatorLoc, ToPack, ToPackLoc, ToRParenLoc) = *Imp;
Gabor Horvathc78d99a2018-01-27 16:11:45 +00006924
6925 Optional<unsigned> Length;
Gabor Horvathc78d99a2018-01-27 16:11:45 +00006926 if (!E->isValueDependent())
6927 Length = E->getPackLength();
6928
Balazs Keri3b30d652018-10-19 13:32:20 +00006929 SmallVector<TemplateArgument, 8> ToPartialArguments;
Gabor Horvathc78d99a2018-01-27 16:11:45 +00006930 if (E->isPartiallySubstituted()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00006931 if (Error Err = ImportTemplateArguments(
6932 E->getPartialArguments().data(),
6933 E->getPartialArguments().size(),
6934 ToPartialArguments))
6935 return std::move(Err);
Gabor Horvathc78d99a2018-01-27 16:11:45 +00006936 }
6937
6938 return SizeOfPackExpr::Create(
Balazs Keri3b30d652018-10-19 13:32:20 +00006939 Importer.getToContext(), ToOperatorLoc, ToPack, ToPackLoc, ToRParenLoc,
6940 Length, ToPartialArguments);
Gabor Horvathc78d99a2018-01-27 16:11:45 +00006941}
6942
Aleksei Sidorina693b372016-09-28 10:16:56 +00006943
Balazs Keri3b30d652018-10-19 13:32:20 +00006944ExpectedStmt ASTNodeImporter::VisitCXXNewExpr(CXXNewExpr *E) {
6945 auto Imp = importSeq(
6946 E->getOperatorNew(), E->getOperatorDelete(), E->getTypeIdParens(),
6947 E->getArraySize(), E->getInitializer(), E->getType(),
6948 E->getAllocatedTypeSourceInfo(), E->getSourceRange(),
6949 E->getDirectInitRange());
6950 if (!Imp)
6951 return Imp.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00006952
Balazs Keri3b30d652018-10-19 13:32:20 +00006953 FunctionDecl *ToOperatorNew, *ToOperatorDelete;
6954 SourceRange ToTypeIdParens, ToSourceRange, ToDirectInitRange;
6955 Expr *ToArraySize, *ToInitializer;
6956 QualType ToType;
6957 TypeSourceInfo *ToAllocatedTypeSourceInfo;
6958 std::tie(
6959 ToOperatorNew, ToOperatorDelete, ToTypeIdParens, ToArraySize, ToInitializer,
6960 ToType, ToAllocatedTypeSourceInfo, ToSourceRange, ToDirectInitRange) = *Imp;
Aleksei Sidorina693b372016-09-28 10:16:56 +00006961
Balazs Keri3b30d652018-10-19 13:32:20 +00006962 SmallVector<Expr *, 4> ToPlacementArgs(E->getNumPlacementArgs());
6963 if (Error Err =
6964 ImportContainerChecked(E->placement_arguments(), ToPlacementArgs))
6965 return std::move(Err);
Aleksei Sidorina693b372016-09-28 10:16:56 +00006966
Bruno Ricci9b6dfac2019-01-07 15:04:45 +00006967 return CXXNewExpr::Create(
Balazs Keri3b30d652018-10-19 13:32:20 +00006968 Importer.getToContext(), E->isGlobalNew(), ToOperatorNew,
6969 ToOperatorDelete, E->passAlignment(), E->doesUsualArrayDeleteWantSize(),
6970 ToPlacementArgs, ToTypeIdParens, ToArraySize, E->getInitializationStyle(),
6971 ToInitializer, ToType, ToAllocatedTypeSourceInfo, ToSourceRange,
6972 ToDirectInitRange);
Aleksei Sidorina693b372016-09-28 10:16:56 +00006973}
6974
Balazs Keri3b30d652018-10-19 13:32:20 +00006975ExpectedStmt ASTNodeImporter::VisitCXXDeleteExpr(CXXDeleteExpr *E) {
6976 auto Imp = importSeq(
6977 E->getType(), E->getOperatorDelete(), E->getArgument(), E->getBeginLoc());
6978 if (!Imp)
6979 return Imp.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00006980
Balazs Keri3b30d652018-10-19 13:32:20 +00006981 QualType ToType;
6982 FunctionDecl *ToOperatorDelete;
6983 Expr *ToArgument;
6984 SourceLocation ToBeginLoc;
6985 std::tie(ToType, ToOperatorDelete, ToArgument, ToBeginLoc) = *Imp;
Aleksei Sidorina693b372016-09-28 10:16:56 +00006986
6987 return new (Importer.getToContext()) CXXDeleteExpr(
Balazs Keri3b30d652018-10-19 13:32:20 +00006988 ToType, E->isGlobalDelete(), E->isArrayForm(), E->isArrayFormAsWritten(),
6989 E->doesUsualArrayDeleteWantSize(), ToOperatorDelete, ToArgument,
6990 ToBeginLoc);
Douglas Gregor5481d322010-02-19 01:32:14 +00006991}
6992
Balazs Keri3b30d652018-10-19 13:32:20 +00006993ExpectedStmt ASTNodeImporter::VisitCXXConstructExpr(CXXConstructExpr *E) {
6994 auto Imp = importSeq(
6995 E->getType(), E->getLocation(), E->getConstructor(),
6996 E->getParenOrBraceRange());
6997 if (!Imp)
6998 return Imp.takeError();
Sean Callanan59721b32015-04-28 18:41:46 +00006999
Balazs Keri3b30d652018-10-19 13:32:20 +00007000 QualType ToType;
7001 SourceLocation ToLocation;
7002 CXXConstructorDecl *ToConstructor;
7003 SourceRange ToParenOrBraceRange;
7004 std::tie(ToType, ToLocation, ToConstructor, ToParenOrBraceRange) = *Imp;
Sean Callanan59721b32015-04-28 18:41:46 +00007005
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00007006 SmallVector<Expr *, 6> ToArgs(E->getNumArgs());
Balazs Keri3b30d652018-10-19 13:32:20 +00007007 if (Error Err = ImportContainerChecked(E->arguments(), ToArgs))
7008 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00007009
Balazs Keri3b30d652018-10-19 13:32:20 +00007010 return CXXConstructExpr::Create(
7011 Importer.getToContext(), ToType, ToLocation, ToConstructor,
7012 E->isElidable(), ToArgs, E->hadMultipleCandidates(),
7013 E->isListInitialization(), E->isStdInitListInitialization(),
7014 E->requiresZeroInitialization(), E->getConstructionKind(),
7015 ToParenOrBraceRange);
Sean Callanan59721b32015-04-28 18:41:46 +00007016}
7017
Balazs Keri3b30d652018-10-19 13:32:20 +00007018ExpectedStmt ASTNodeImporter::VisitExprWithCleanups(ExprWithCleanups *E) {
7019 ExpectedExpr ToSubExprOrErr = import(E->getSubExpr());
7020 if (!ToSubExprOrErr)
7021 return ToSubExprOrErr.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00007022
Balazs Keri3b30d652018-10-19 13:32:20 +00007023 SmallVector<ExprWithCleanups::CleanupObject, 8> ToObjects(E->getNumObjects());
7024 if (Error Err = ImportContainerChecked(E->getObjects(), ToObjects))
7025 return std::move(Err);
Aleksei Sidorina693b372016-09-28 10:16:56 +00007026
Balazs Keri3b30d652018-10-19 13:32:20 +00007027 return ExprWithCleanups::Create(
7028 Importer.getToContext(), *ToSubExprOrErr, E->cleanupsHaveSideEffects(),
7029 ToObjects);
Aleksei Sidorina693b372016-09-28 10:16:56 +00007030}
7031
Balazs Keri3b30d652018-10-19 13:32:20 +00007032ExpectedStmt ASTNodeImporter::VisitCXXMemberCallExpr(CXXMemberCallExpr *E) {
7033 auto Imp = importSeq(
7034 E->getCallee(), E->getType(), E->getRParenLoc());
7035 if (!Imp)
7036 return Imp.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00007037
Balazs Keri3b30d652018-10-19 13:32:20 +00007038 Expr *ToCallee;
7039 QualType ToType;
7040 SourceLocation ToRParenLoc;
7041 std::tie(ToCallee, ToType, ToRParenLoc) = *Imp;
Fangrui Song6907ce22018-07-30 19:24:48 +00007042
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00007043 SmallVector<Expr *, 4> ToArgs(E->getNumArgs());
Balazs Keri3b30d652018-10-19 13:32:20 +00007044 if (Error Err = ImportContainerChecked(E->arguments(), ToArgs))
7045 return std::move(Err);
Sean Callanan8bca9962016-03-28 21:43:01 +00007046
Bruno Riccic5885cf2018-12-21 15:20:32 +00007047 return CXXMemberCallExpr::Create(Importer.getToContext(), ToCallee, ToArgs,
7048 ToType, E->getValueKind(), ToRParenLoc);
Sean Callanan8bca9962016-03-28 21:43:01 +00007049}
7050
Balazs Keri3b30d652018-10-19 13:32:20 +00007051ExpectedStmt ASTNodeImporter::VisitCXXThisExpr(CXXThisExpr *E) {
7052 ExpectedType ToTypeOrErr = import(E->getType());
7053 if (!ToTypeOrErr)
7054 return ToTypeOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00007055
Balazs Keri3b30d652018-10-19 13:32:20 +00007056 ExpectedSLoc ToLocationOrErr = import(E->getLocation());
7057 if (!ToLocationOrErr)
7058 return ToLocationOrErr.takeError();
7059
7060 return new (Importer.getToContext()) CXXThisExpr(
7061 *ToLocationOrErr, *ToTypeOrErr, E->isImplicit());
Sean Callanan8bca9962016-03-28 21:43:01 +00007062}
7063
Balazs Keri3b30d652018-10-19 13:32:20 +00007064ExpectedStmt ASTNodeImporter::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
7065 ExpectedType ToTypeOrErr = import(E->getType());
7066 if (!ToTypeOrErr)
7067 return ToTypeOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00007068
Balazs Keri3b30d652018-10-19 13:32:20 +00007069 ExpectedSLoc ToLocationOrErr = import(E->getLocation());
7070 if (!ToLocationOrErr)
7071 return ToLocationOrErr.takeError();
7072
7073 return new (Importer.getToContext()) CXXBoolLiteralExpr(
7074 E->getValue(), *ToTypeOrErr, *ToLocationOrErr);
Sean Callanan8bca9962016-03-28 21:43:01 +00007075}
7076
Balazs Keri3b30d652018-10-19 13:32:20 +00007077ExpectedStmt ASTNodeImporter::VisitMemberExpr(MemberExpr *E) {
7078 auto Imp1 = importSeq(
7079 E->getBase(), E->getOperatorLoc(), E->getQualifierLoc(),
7080 E->getTemplateKeywordLoc(), E->getMemberDecl(), E->getType());
7081 if (!Imp1)
7082 return Imp1.takeError();
Sean Callanan8bca9962016-03-28 21:43:01 +00007083
Balazs Keri3b30d652018-10-19 13:32:20 +00007084 Expr *ToBase;
7085 SourceLocation ToOperatorLoc, ToTemplateKeywordLoc;
7086 NestedNameSpecifierLoc ToQualifierLoc;
7087 ValueDecl *ToMemberDecl;
7088 QualType ToType;
7089 std::tie(
7090 ToBase, ToOperatorLoc, ToQualifierLoc, ToTemplateKeywordLoc, ToMemberDecl,
7091 ToType) = *Imp1;
Sean Callanan59721b32015-04-28 18:41:46 +00007092
Balazs Keri3b30d652018-10-19 13:32:20 +00007093 auto Imp2 = importSeq(
7094 E->getFoundDecl().getDecl(), E->getMemberNameInfo().getName(),
7095 E->getMemberNameInfo().getLoc(), E->getLAngleLoc(), E->getRAngleLoc());
7096 if (!Imp2)
7097 return Imp2.takeError();
7098 NamedDecl *ToDecl;
7099 DeclarationName ToName;
7100 SourceLocation ToLoc, ToLAngleLoc, ToRAngleLoc;
7101 std::tie(ToDecl, ToName, ToLoc, ToLAngleLoc, ToRAngleLoc) = *Imp2;
Peter Szecsief972522018-05-02 11:52:54 +00007102
7103 DeclAccessPair ToFoundDecl =
7104 DeclAccessPair::make(ToDecl, E->getFoundDecl().getAccess());
Sean Callanan59721b32015-04-28 18:41:46 +00007105
Balazs Keri3b30d652018-10-19 13:32:20 +00007106 DeclarationNameInfo ToMemberNameInfo(ToName, ToLoc);
Sean Callanan59721b32015-04-28 18:41:46 +00007107
7108 if (E->hasExplicitTemplateArgs()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00007109 // FIXME: handle template arguments
7110 return make_error<ImportError>(ImportError::UnsupportedConstruct);
Sean Callanan59721b32015-04-28 18:41:46 +00007111 }
7112
Balazs Keri3b30d652018-10-19 13:32:20 +00007113 return MemberExpr::Create(
7114 Importer.getToContext(), ToBase, E->isArrow(), ToOperatorLoc,
7115 ToQualifierLoc, ToTemplateKeywordLoc, ToMemberDecl, ToFoundDecl,
7116 ToMemberNameInfo, nullptr, ToType, E->getValueKind(), E->getObjectKind());
Sean Callanan59721b32015-04-28 18:41:46 +00007117}
7118
Balazs Keri3b30d652018-10-19 13:32:20 +00007119ExpectedStmt
7120ASTNodeImporter::VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E) {
7121 auto Imp = importSeq(
7122 E->getBase(), E->getOperatorLoc(), E->getQualifierLoc(),
7123 E->getScopeTypeInfo(), E->getColonColonLoc(), E->getTildeLoc());
7124 if (!Imp)
7125 return Imp.takeError();
Aleksei Sidorin60ccb7d2017-11-27 10:30:00 +00007126
Balazs Keri3b30d652018-10-19 13:32:20 +00007127 Expr *ToBase;
7128 SourceLocation ToOperatorLoc, ToColonColonLoc, ToTildeLoc;
7129 NestedNameSpecifierLoc ToQualifierLoc;
7130 TypeSourceInfo *ToScopeTypeInfo;
7131 std::tie(
7132 ToBase, ToOperatorLoc, ToQualifierLoc, ToScopeTypeInfo, ToColonColonLoc,
7133 ToTildeLoc) = *Imp;
Aleksei Sidorin60ccb7d2017-11-27 10:30:00 +00007134
7135 PseudoDestructorTypeStorage Storage;
7136 if (IdentifierInfo *FromII = E->getDestroyedTypeIdentifier()) {
7137 IdentifierInfo *ToII = Importer.Import(FromII);
Balazs Keri3b30d652018-10-19 13:32:20 +00007138 ExpectedSLoc ToDestroyedTypeLocOrErr = import(E->getDestroyedTypeLoc());
7139 if (!ToDestroyedTypeLocOrErr)
7140 return ToDestroyedTypeLocOrErr.takeError();
7141 Storage = PseudoDestructorTypeStorage(ToII, *ToDestroyedTypeLocOrErr);
Aleksei Sidorin60ccb7d2017-11-27 10:30:00 +00007142 } else {
Balazs Keri3b30d652018-10-19 13:32:20 +00007143 if (auto ToTIOrErr = import(E->getDestroyedTypeInfo()))
7144 Storage = PseudoDestructorTypeStorage(*ToTIOrErr);
7145 else
7146 return ToTIOrErr.takeError();
Aleksei Sidorin60ccb7d2017-11-27 10:30:00 +00007147 }
7148
7149 return new (Importer.getToContext()) CXXPseudoDestructorExpr(
Balazs Keri3b30d652018-10-19 13:32:20 +00007150 Importer.getToContext(), ToBase, E->isArrow(), ToOperatorLoc,
7151 ToQualifierLoc, ToScopeTypeInfo, ToColonColonLoc, ToTildeLoc, Storage);
Aleksei Sidorin60ccb7d2017-11-27 10:30:00 +00007152}
7153
Balazs Keri3b30d652018-10-19 13:32:20 +00007154ExpectedStmt ASTNodeImporter::VisitCXXDependentScopeMemberExpr(
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00007155 CXXDependentScopeMemberExpr *E) {
Balazs Keri3b30d652018-10-19 13:32:20 +00007156 auto Imp = importSeq(
7157 E->getType(), E->getOperatorLoc(), E->getQualifierLoc(),
7158 E->getTemplateKeywordLoc(), E->getFirstQualifierFoundInScope());
7159 if (!Imp)
7160 return Imp.takeError();
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00007161
Balazs Keri3b30d652018-10-19 13:32:20 +00007162 QualType ToType;
7163 SourceLocation ToOperatorLoc, ToTemplateKeywordLoc;
7164 NestedNameSpecifierLoc ToQualifierLoc;
7165 NamedDecl *ToFirstQualifierFoundInScope;
7166 std::tie(
7167 ToType, ToOperatorLoc, ToQualifierLoc, ToTemplateKeywordLoc,
7168 ToFirstQualifierFoundInScope) = *Imp;
7169
7170 Expr *ToBase = nullptr;
7171 if (!E->isImplicitAccess()) {
7172 if (ExpectedExpr ToBaseOrErr = import(E->getBase()))
7173 ToBase = *ToBaseOrErr;
7174 else
7175 return ToBaseOrErr.takeError();
7176 }
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00007177
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00007178 TemplateArgumentListInfo ToTAInfo, *ResInfo = nullptr;
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00007179 if (E->hasExplicitTemplateArgs()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00007180 if (Error Err = ImportTemplateArgumentListInfo(
7181 E->getLAngleLoc(), E->getRAngleLoc(), E->template_arguments(),
7182 ToTAInfo))
7183 return std::move(Err);
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00007184 ResInfo = &ToTAInfo;
7185 }
7186
Balazs Keri3b30d652018-10-19 13:32:20 +00007187 auto ToMemberNameInfoOrErr = importSeq(E->getMember(), E->getMemberLoc());
7188 if (!ToMemberNameInfoOrErr)
7189 return ToMemberNameInfoOrErr.takeError();
7190 DeclarationNameInfo ToMemberNameInfo(
7191 std::get<0>(*ToMemberNameInfoOrErr), std::get<1>(*ToMemberNameInfoOrErr));
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00007192 // Import additional name location/type info.
Balazs Keri3b30d652018-10-19 13:32:20 +00007193 if (Error Err = ImportDeclarationNameLoc(
7194 E->getMemberNameInfo(), ToMemberNameInfo))
7195 return std::move(Err);
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00007196
7197 return CXXDependentScopeMemberExpr::Create(
Balazs Keri3b30d652018-10-19 13:32:20 +00007198 Importer.getToContext(), ToBase, ToType, E->isArrow(), ToOperatorLoc,
7199 ToQualifierLoc, ToTemplateKeywordLoc, ToFirstQualifierFoundInScope,
7200 ToMemberNameInfo, ResInfo);
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00007201}
7202
Balazs Keri3b30d652018-10-19 13:32:20 +00007203ExpectedStmt
Peter Szecsice7f3182018-05-07 12:08:27 +00007204ASTNodeImporter::VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E) {
Balazs Keri3b30d652018-10-19 13:32:20 +00007205 auto Imp = importSeq(
7206 E->getQualifierLoc(), E->getTemplateKeywordLoc(), E->getDeclName(),
7207 E->getExprLoc(), E->getLAngleLoc(), E->getRAngleLoc());
7208 if (!Imp)
7209 return Imp.takeError();
Peter Szecsice7f3182018-05-07 12:08:27 +00007210
Balazs Keri3b30d652018-10-19 13:32:20 +00007211 NestedNameSpecifierLoc ToQualifierLoc;
7212 SourceLocation ToTemplateKeywordLoc, ToExprLoc, ToLAngleLoc, ToRAngleLoc;
7213 DeclarationName ToDeclName;
7214 std::tie(
7215 ToQualifierLoc, ToTemplateKeywordLoc, ToDeclName, ToExprLoc,
7216 ToLAngleLoc, ToRAngleLoc) = *Imp;
Peter Szecsice7f3182018-05-07 12:08:27 +00007217
Balazs Keri3b30d652018-10-19 13:32:20 +00007218 DeclarationNameInfo ToNameInfo(ToDeclName, ToExprLoc);
7219 if (Error Err = ImportDeclarationNameLoc(E->getNameInfo(), ToNameInfo))
7220 return std::move(Err);
7221
7222 TemplateArgumentListInfo ToTAInfo(ToLAngleLoc, ToRAngleLoc);
Peter Szecsice7f3182018-05-07 12:08:27 +00007223 TemplateArgumentListInfo *ResInfo = nullptr;
7224 if (E->hasExplicitTemplateArgs()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00007225 if (Error Err =
7226 ImportTemplateArgumentListInfo(E->template_arguments(), ToTAInfo))
7227 return std::move(Err);
Peter Szecsice7f3182018-05-07 12:08:27 +00007228 ResInfo = &ToTAInfo;
7229 }
7230
7231 return DependentScopeDeclRefExpr::Create(
Balazs Keri3b30d652018-10-19 13:32:20 +00007232 Importer.getToContext(), ToQualifierLoc, ToTemplateKeywordLoc,
7233 ToNameInfo, ResInfo);
Peter Szecsice7f3182018-05-07 12:08:27 +00007234}
7235
Balazs Keri3b30d652018-10-19 13:32:20 +00007236ExpectedStmt ASTNodeImporter::VisitCXXUnresolvedConstructExpr(
7237 CXXUnresolvedConstructExpr *E) {
7238 auto Imp = importSeq(
7239 E->getLParenLoc(), E->getRParenLoc(), E->getTypeSourceInfo());
7240 if (!Imp)
7241 return Imp.takeError();
Aleksei Sidorine267a0f2018-01-09 16:40:40 +00007242
Balazs Keri3b30d652018-10-19 13:32:20 +00007243 SourceLocation ToLParenLoc, ToRParenLoc;
7244 TypeSourceInfo *ToTypeSourceInfo;
7245 std::tie(ToLParenLoc, ToRParenLoc, ToTypeSourceInfo) = *Imp;
7246
7247 SmallVector<Expr *, 8> ToArgs(E->arg_size());
7248 if (Error Err =
7249 ImportArrayChecked(E->arg_begin(), E->arg_end(), ToArgs.begin()))
7250 return std::move(Err);
Aleksei Sidorine267a0f2018-01-09 16:40:40 +00007251
7252 return CXXUnresolvedConstructExpr::Create(
Balazs Keri3b30d652018-10-19 13:32:20 +00007253 Importer.getToContext(), ToTypeSourceInfo, ToLParenLoc,
7254 llvm::makeArrayRef(ToArgs), ToRParenLoc);
Aleksei Sidorine267a0f2018-01-09 16:40:40 +00007255}
7256
Balazs Keri3b30d652018-10-19 13:32:20 +00007257ExpectedStmt
7258ASTNodeImporter::VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E) {
7259 Expected<CXXRecordDecl *> ToNamingClassOrErr = import(E->getNamingClass());
7260 if (!ToNamingClassOrErr)
7261 return ToNamingClassOrErr.takeError();
Aleksei Sidorine267a0f2018-01-09 16:40:40 +00007262
Balazs Keri3b30d652018-10-19 13:32:20 +00007263 auto ToQualifierLocOrErr = import(E->getQualifierLoc());
7264 if (!ToQualifierLocOrErr)
7265 return ToQualifierLocOrErr.takeError();
Aleksei Sidorine267a0f2018-01-09 16:40:40 +00007266
Balazs Keri3b30d652018-10-19 13:32:20 +00007267 auto ToNameInfoOrErr = importSeq(E->getName(), E->getNameLoc());
7268 if (!ToNameInfoOrErr)
7269 return ToNameInfoOrErr.takeError();
7270 DeclarationNameInfo ToNameInfo(
7271 std::get<0>(*ToNameInfoOrErr), std::get<1>(*ToNameInfoOrErr));
Aleksei Sidorine267a0f2018-01-09 16:40:40 +00007272 // Import additional name location/type info.
Balazs Keri3b30d652018-10-19 13:32:20 +00007273 if (Error Err = ImportDeclarationNameLoc(E->getNameInfo(), ToNameInfo))
7274 return std::move(Err);
Aleksei Sidorine267a0f2018-01-09 16:40:40 +00007275
7276 UnresolvedSet<8> ToDecls;
Balazs Keri3b30d652018-10-19 13:32:20 +00007277 for (auto *D : E->decls())
7278 if (auto ToDOrErr = import(D))
7279 ToDecls.addDecl(cast<NamedDecl>(*ToDOrErr));
Aleksei Sidorine267a0f2018-01-09 16:40:40 +00007280 else
Balazs Keri3b30d652018-10-19 13:32:20 +00007281 return ToDOrErr.takeError();
Aleksei Sidorine267a0f2018-01-09 16:40:40 +00007282
Balazs Keri3b30d652018-10-19 13:32:20 +00007283 if (E->hasExplicitTemplateArgs() && E->getTemplateKeywordLoc().isValid()) {
7284 TemplateArgumentListInfo ToTAInfo;
7285 if (Error Err = ImportTemplateArgumentListInfo(
7286 E->getLAngleLoc(), E->getRAngleLoc(), E->template_arguments(),
7287 ToTAInfo))
7288 return std::move(Err);
Aleksei Sidorine267a0f2018-01-09 16:40:40 +00007289
Balazs Keri3b30d652018-10-19 13:32:20 +00007290 ExpectedSLoc ToTemplateKeywordLocOrErr = import(E->getTemplateKeywordLoc());
7291 if (!ToTemplateKeywordLocOrErr)
7292 return ToTemplateKeywordLocOrErr.takeError();
7293
Aleksei Sidorine267a0f2018-01-09 16:40:40 +00007294 return UnresolvedLookupExpr::Create(
Balazs Keri3b30d652018-10-19 13:32:20 +00007295 Importer.getToContext(), *ToNamingClassOrErr, *ToQualifierLocOrErr,
7296 *ToTemplateKeywordLocOrErr, ToNameInfo, E->requiresADL(), &ToTAInfo,
7297 ToDecls.begin(), ToDecls.end());
7298 }
Aleksei Sidorine267a0f2018-01-09 16:40:40 +00007299
7300 return UnresolvedLookupExpr::Create(
Balazs Keri3b30d652018-10-19 13:32:20 +00007301 Importer.getToContext(), *ToNamingClassOrErr, *ToQualifierLocOrErr,
7302 ToNameInfo, E->requiresADL(), E->isOverloaded(), ToDecls.begin(),
7303 ToDecls.end());
Aleksei Sidorine267a0f2018-01-09 16:40:40 +00007304}
7305
Balazs Keri3b30d652018-10-19 13:32:20 +00007306ExpectedStmt
7307ASTNodeImporter::VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E) {
7308 auto Imp1 = importSeq(
7309 E->getType(), E->getOperatorLoc(), E->getQualifierLoc(),
7310 E->getTemplateKeywordLoc());
7311 if (!Imp1)
7312 return Imp1.takeError();
Peter Szecsice7f3182018-05-07 12:08:27 +00007313
Balazs Keri3b30d652018-10-19 13:32:20 +00007314 QualType ToType;
7315 SourceLocation ToOperatorLoc, ToTemplateKeywordLoc;
7316 NestedNameSpecifierLoc ToQualifierLoc;
7317 std::tie(ToType, ToOperatorLoc, ToQualifierLoc, ToTemplateKeywordLoc) = *Imp1;
7318
7319 auto Imp2 = importSeq(E->getName(), E->getNameLoc());
7320 if (!Imp2)
7321 return Imp2.takeError();
7322 DeclarationNameInfo ToNameInfo(std::get<0>(*Imp2), std::get<1>(*Imp2));
7323 // Import additional name location/type info.
7324 if (Error Err = ImportDeclarationNameLoc(E->getNameInfo(), ToNameInfo))
7325 return std::move(Err);
Peter Szecsice7f3182018-05-07 12:08:27 +00007326
7327 UnresolvedSet<8> ToDecls;
Balazs Keri3b30d652018-10-19 13:32:20 +00007328 for (Decl *D : E->decls())
7329 if (auto ToDOrErr = import(D))
7330 ToDecls.addDecl(cast<NamedDecl>(*ToDOrErr));
Peter Szecsice7f3182018-05-07 12:08:27 +00007331 else
Balazs Keri3b30d652018-10-19 13:32:20 +00007332 return ToDOrErr.takeError();
Peter Szecsice7f3182018-05-07 12:08:27 +00007333
7334 TemplateArgumentListInfo ToTAInfo;
7335 TemplateArgumentListInfo *ResInfo = nullptr;
7336 if (E->hasExplicitTemplateArgs()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00007337 if (Error Err =
7338 ImportTemplateArgumentListInfo(E->template_arguments(), ToTAInfo))
7339 return std::move(Err);
Peter Szecsice7f3182018-05-07 12:08:27 +00007340 ResInfo = &ToTAInfo;
7341 }
7342
Balazs Keri3b30d652018-10-19 13:32:20 +00007343 Expr *ToBase = nullptr;
7344 if (!E->isImplicitAccess()) {
7345 if (ExpectedExpr ToBaseOrErr = import(E->getBase()))
7346 ToBase = *ToBaseOrErr;
7347 else
7348 return ToBaseOrErr.takeError();
Peter Szecsice7f3182018-05-07 12:08:27 +00007349 }
7350
7351 return UnresolvedMemberExpr::Create(
Balazs Keri3b30d652018-10-19 13:32:20 +00007352 Importer.getToContext(), E->hasUnresolvedUsing(), ToBase, ToType,
7353 E->isArrow(), ToOperatorLoc, ToQualifierLoc, ToTemplateKeywordLoc,
7354 ToNameInfo, ResInfo, ToDecls.begin(), ToDecls.end());
Peter Szecsice7f3182018-05-07 12:08:27 +00007355}
7356
Balazs Keri3b30d652018-10-19 13:32:20 +00007357ExpectedStmt ASTNodeImporter::VisitCallExpr(CallExpr *E) {
7358 auto Imp = importSeq(E->getCallee(), E->getType(), E->getRParenLoc());
7359 if (!Imp)
7360 return Imp.takeError();
Sean Callanan59721b32015-04-28 18:41:46 +00007361
Balazs Keri3b30d652018-10-19 13:32:20 +00007362 Expr *ToCallee;
7363 QualType ToType;
7364 SourceLocation ToRParenLoc;
7365 std::tie(ToCallee, ToType, ToRParenLoc) = *Imp;
Sean Callanan59721b32015-04-28 18:41:46 +00007366
7367 unsigned NumArgs = E->getNumArgs();
Balazs Keri3b30d652018-10-19 13:32:20 +00007368 llvm::SmallVector<Expr *, 2> ToArgs(NumArgs);
7369 if (Error Err = ImportContainerChecked(E->arguments(), ToArgs))
7370 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00007371
Gabor Horvathc78d99a2018-01-27 16:11:45 +00007372 if (const auto *OCE = dyn_cast<CXXOperatorCallExpr>(E)) {
Bruno Riccic5885cf2018-12-21 15:20:32 +00007373 return CXXOperatorCallExpr::Create(
Balazs Keri3b30d652018-10-19 13:32:20 +00007374 Importer.getToContext(), OCE->getOperator(), ToCallee, ToArgs, ToType,
Eric Fiselier5cdc2cd2018-12-12 21:50:55 +00007375 OCE->getValueKind(), ToRParenLoc, OCE->getFPFeatures(),
7376 OCE->getADLCallKind());
Gabor Horvathc78d99a2018-01-27 16:11:45 +00007377 }
7378
Bruno Riccic5885cf2018-12-21 15:20:32 +00007379 return CallExpr::Create(Importer.getToContext(), ToCallee, ToArgs, ToType,
7380 E->getValueKind(), ToRParenLoc, /*MinNumArgs=*/0,
7381 E->getADLCallKind());
Sean Callanan59721b32015-04-28 18:41:46 +00007382}
7383
Balazs Keri3b30d652018-10-19 13:32:20 +00007384ExpectedStmt ASTNodeImporter::VisitLambdaExpr(LambdaExpr *E) {
7385 CXXRecordDecl *FromClass = E->getLambdaClass();
7386 auto ToClassOrErr = import(FromClass);
7387 if (!ToClassOrErr)
7388 return ToClassOrErr.takeError();
7389 CXXRecordDecl *ToClass = *ToClassOrErr;
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00007390
7391 // NOTE: lambda classes are created with BeingDefined flag set up.
7392 // It means that ImportDefinition doesn't work for them and we should fill it
7393 // manually.
Gabor Marton302f3002019-02-15 12:04:05 +00007394 if (ToClass->isBeingDefined())
7395 if (Error Err = ImportDeclContext(FromClass, /*ForceImport = */ true))
7396 return std::move(Err);
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00007397
Balazs Keri3b30d652018-10-19 13:32:20 +00007398 auto ToCallOpOrErr = import(E->getCallOperator());
7399 if (!ToCallOpOrErr)
7400 return ToCallOpOrErr.takeError();
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00007401
7402 ToClass->completeDefinition();
7403
Balazs Keri3b30d652018-10-19 13:32:20 +00007404 SmallVector<LambdaCapture, 8> ToCaptures;
7405 ToCaptures.reserve(E->capture_size());
7406 for (const auto &FromCapture : E->captures()) {
7407 if (auto ToCaptureOrErr = import(FromCapture))
7408 ToCaptures.push_back(*ToCaptureOrErr);
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00007409 else
Balazs Keri3b30d652018-10-19 13:32:20 +00007410 return ToCaptureOrErr.takeError();
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00007411 }
7412
Balazs Keri3b30d652018-10-19 13:32:20 +00007413 SmallVector<Expr *, 8> ToCaptureInits(E->capture_size());
7414 if (Error Err = ImportContainerChecked(E->capture_inits(), ToCaptureInits))
7415 return std::move(Err);
7416
7417 auto Imp = importSeq(
7418 E->getIntroducerRange(), E->getCaptureDefaultLoc(), E->getEndLoc());
7419 if (!Imp)
7420 return Imp.takeError();
7421
7422 SourceRange ToIntroducerRange;
7423 SourceLocation ToCaptureDefaultLoc, ToEndLoc;
7424 std::tie(ToIntroducerRange, ToCaptureDefaultLoc, ToEndLoc) = *Imp;
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00007425
Stephen Kelly1c301dc2018-08-09 21:09:38 +00007426 return LambdaExpr::Create(
Balazs Keri3b30d652018-10-19 13:32:20 +00007427 Importer.getToContext(), ToClass, ToIntroducerRange,
7428 E->getCaptureDefault(), ToCaptureDefaultLoc, ToCaptures,
7429 E->hasExplicitParameters(), E->hasExplicitResultType(), ToCaptureInits,
7430 ToEndLoc, E->containsUnexpandedParameterPack());
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00007431}
7432
Sean Callanan8bca9962016-03-28 21:43:01 +00007433
Balazs Keri3b30d652018-10-19 13:32:20 +00007434ExpectedStmt ASTNodeImporter::VisitInitListExpr(InitListExpr *E) {
7435 auto Imp = importSeq(E->getLBraceLoc(), E->getRBraceLoc(), E->getType());
7436 if (!Imp)
7437 return Imp.takeError();
7438
7439 SourceLocation ToLBraceLoc, ToRBraceLoc;
7440 QualType ToType;
7441 std::tie(ToLBraceLoc, ToRBraceLoc, ToType) = *Imp;
7442
7443 SmallVector<Expr *, 4> ToExprs(E->getNumInits());
7444 if (Error Err = ImportContainerChecked(E->inits(), ToExprs))
7445 return std::move(Err);
Sean Callanan8bca9962016-03-28 21:43:01 +00007446
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00007447 ASTContext &ToCtx = Importer.getToContext();
7448 InitListExpr *To = new (ToCtx) InitListExpr(
Balazs Keri3b30d652018-10-19 13:32:20 +00007449 ToCtx, ToLBraceLoc, ToExprs, ToRBraceLoc);
7450 To->setType(ToType);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00007451
Balazs Keri3b30d652018-10-19 13:32:20 +00007452 if (E->hasArrayFiller()) {
7453 if (ExpectedExpr ToFillerOrErr = import(E->getArrayFiller()))
7454 To->setArrayFiller(*ToFillerOrErr);
7455 else
7456 return ToFillerOrErr.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00007457 }
7458
Balazs Keri3b30d652018-10-19 13:32:20 +00007459 if (FieldDecl *FromFD = E->getInitializedFieldInUnion()) {
7460 if (auto ToFDOrErr = import(FromFD))
7461 To->setInitializedFieldInUnion(*ToFDOrErr);
7462 else
7463 return ToFDOrErr.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00007464 }
7465
Balazs Keri3b30d652018-10-19 13:32:20 +00007466 if (InitListExpr *SyntForm = E->getSyntacticForm()) {
7467 if (auto ToSyntFormOrErr = import(SyntForm))
7468 To->setSyntacticForm(*ToSyntFormOrErr);
7469 else
7470 return ToSyntFormOrErr.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00007471 }
7472
Gabor Martona20ce602018-09-03 13:10:53 +00007473 // Copy InitListExprBitfields, which are not handled in the ctor of
7474 // InitListExpr.
Balazs Keri3b30d652018-10-19 13:32:20 +00007475 To->sawArrayRangeDesignator(E->hadArrayRangeDesignator());
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00007476
7477 return To;
Sean Callanan8bca9962016-03-28 21:43:01 +00007478}
7479
Balazs Keri3b30d652018-10-19 13:32:20 +00007480ExpectedStmt ASTNodeImporter::VisitCXXStdInitializerListExpr(
Gabor Marton07b01ff2018-06-29 12:17:34 +00007481 CXXStdInitializerListExpr *E) {
Balazs Keri3b30d652018-10-19 13:32:20 +00007482 ExpectedType ToTypeOrErr = import(E->getType());
7483 if (!ToTypeOrErr)
7484 return ToTypeOrErr.takeError();
Gabor Marton07b01ff2018-06-29 12:17:34 +00007485
Balazs Keri3b30d652018-10-19 13:32:20 +00007486 ExpectedExpr ToSubExprOrErr = import(E->getSubExpr());
7487 if (!ToSubExprOrErr)
7488 return ToSubExprOrErr.takeError();
Gabor Marton07b01ff2018-06-29 12:17:34 +00007489
Balazs Keri3b30d652018-10-19 13:32:20 +00007490 return new (Importer.getToContext()) CXXStdInitializerListExpr(
7491 *ToTypeOrErr, *ToSubExprOrErr);
Gabor Marton07b01ff2018-06-29 12:17:34 +00007492}
7493
Balazs Keri3b30d652018-10-19 13:32:20 +00007494ExpectedStmt ASTNodeImporter::VisitCXXInheritedCtorInitExpr(
Balazs Keri95baa842018-07-25 10:21:06 +00007495 CXXInheritedCtorInitExpr *E) {
Balazs Keri3b30d652018-10-19 13:32:20 +00007496 auto Imp = importSeq(E->getLocation(), E->getType(), E->getConstructor());
7497 if (!Imp)
7498 return Imp.takeError();
Balazs Keri95baa842018-07-25 10:21:06 +00007499
Balazs Keri3b30d652018-10-19 13:32:20 +00007500 SourceLocation ToLocation;
7501 QualType ToType;
7502 CXXConstructorDecl *ToConstructor;
7503 std::tie(ToLocation, ToType, ToConstructor) = *Imp;
Balazs Keri95baa842018-07-25 10:21:06 +00007504
7505 return new (Importer.getToContext()) CXXInheritedCtorInitExpr(
Balazs Keri3b30d652018-10-19 13:32:20 +00007506 ToLocation, ToType, ToConstructor, E->constructsVBase(),
7507 E->inheritedFromVBase());
Balazs Keri95baa842018-07-25 10:21:06 +00007508}
7509
Balazs Keri3b30d652018-10-19 13:32:20 +00007510ExpectedStmt ASTNodeImporter::VisitArrayInitLoopExpr(ArrayInitLoopExpr *E) {
7511 auto Imp = importSeq(E->getType(), E->getCommonExpr(), E->getSubExpr());
7512 if (!Imp)
7513 return Imp.takeError();
Richard Smith30e304e2016-12-14 00:03:17 +00007514
Balazs Keri3b30d652018-10-19 13:32:20 +00007515 QualType ToType;
7516 Expr *ToCommonExpr, *ToSubExpr;
7517 std::tie(ToType, ToCommonExpr, ToSubExpr) = *Imp;
Richard Smith30e304e2016-12-14 00:03:17 +00007518
Balazs Keri3b30d652018-10-19 13:32:20 +00007519 return new (Importer.getToContext()) ArrayInitLoopExpr(
7520 ToType, ToCommonExpr, ToSubExpr);
Richard Smith30e304e2016-12-14 00:03:17 +00007521}
7522
Balazs Keri3b30d652018-10-19 13:32:20 +00007523ExpectedStmt ASTNodeImporter::VisitArrayInitIndexExpr(ArrayInitIndexExpr *E) {
7524 ExpectedType ToTypeOrErr = import(E->getType());
7525 if (!ToTypeOrErr)
7526 return ToTypeOrErr.takeError();
7527 return new (Importer.getToContext()) ArrayInitIndexExpr(*ToTypeOrErr);
Richard Smith30e304e2016-12-14 00:03:17 +00007528}
7529
Balazs Keri3b30d652018-10-19 13:32:20 +00007530ExpectedStmt ASTNodeImporter::VisitCXXDefaultInitExpr(CXXDefaultInitExpr *E) {
7531 ExpectedSLoc ToBeginLocOrErr = import(E->getBeginLoc());
7532 if (!ToBeginLocOrErr)
7533 return ToBeginLocOrErr.takeError();
7534
7535 auto ToFieldOrErr = import(E->getField());
7536 if (!ToFieldOrErr)
7537 return ToFieldOrErr.takeError();
Sean Callanandd2c1742016-05-16 20:48:03 +00007538
7539 return CXXDefaultInitExpr::Create(
Balazs Keri3b30d652018-10-19 13:32:20 +00007540 Importer.getToContext(), *ToBeginLocOrErr, *ToFieldOrErr);
Sean Callanandd2c1742016-05-16 20:48:03 +00007541}
7542
Balazs Keri3b30d652018-10-19 13:32:20 +00007543ExpectedStmt ASTNodeImporter::VisitCXXNamedCastExpr(CXXNamedCastExpr *E) {
7544 auto Imp = importSeq(
7545 E->getType(), E->getSubExpr(), E->getTypeInfoAsWritten(),
7546 E->getOperatorLoc(), E->getRParenLoc(), E->getAngleBrackets());
7547 if (!Imp)
7548 return Imp.takeError();
7549
7550 QualType ToType;
7551 Expr *ToSubExpr;
7552 TypeSourceInfo *ToTypeInfoAsWritten;
7553 SourceLocation ToOperatorLoc, ToRParenLoc;
7554 SourceRange ToAngleBrackets;
7555 std::tie(
7556 ToType, ToSubExpr, ToTypeInfoAsWritten, ToOperatorLoc, ToRParenLoc,
7557 ToAngleBrackets) = *Imp;
7558
Sean Callanandd2c1742016-05-16 20:48:03 +00007559 ExprValueKind VK = E->getValueKind();
7560 CastKind CK = E->getCastKind();
Balazs Keri3b30d652018-10-19 13:32:20 +00007561 auto ToBasePathOrErr = ImportCastPath(E);
7562 if (!ToBasePathOrErr)
7563 return ToBasePathOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00007564
Sean Callanandd2c1742016-05-16 20:48:03 +00007565 if (isa<CXXStaticCastExpr>(E)) {
7566 return CXXStaticCastExpr::Create(
Balazs Keri3b30d652018-10-19 13:32:20 +00007567 Importer.getToContext(), ToType, VK, CK, ToSubExpr, &(*ToBasePathOrErr),
7568 ToTypeInfoAsWritten, ToOperatorLoc, ToRParenLoc, ToAngleBrackets);
Sean Callanandd2c1742016-05-16 20:48:03 +00007569 } else if (isa<CXXDynamicCastExpr>(E)) {
7570 return CXXDynamicCastExpr::Create(
Balazs Keri3b30d652018-10-19 13:32:20 +00007571 Importer.getToContext(), ToType, VK, CK, ToSubExpr, &(*ToBasePathOrErr),
7572 ToTypeInfoAsWritten, ToOperatorLoc, ToRParenLoc, ToAngleBrackets);
Sean Callanandd2c1742016-05-16 20:48:03 +00007573 } else if (isa<CXXReinterpretCastExpr>(E)) {
7574 return CXXReinterpretCastExpr::Create(
Balazs Keri3b30d652018-10-19 13:32:20 +00007575 Importer.getToContext(), ToType, VK, CK, ToSubExpr, &(*ToBasePathOrErr),
7576 ToTypeInfoAsWritten, ToOperatorLoc, ToRParenLoc, ToAngleBrackets);
Raphael Isemannc705bb82018-08-20 16:20:01 +00007577 } else if (isa<CXXConstCastExpr>(E)) {
Balazs Keri3b30d652018-10-19 13:32:20 +00007578 return CXXConstCastExpr::Create(
7579 Importer.getToContext(), ToType, VK, ToSubExpr, ToTypeInfoAsWritten,
7580 ToOperatorLoc, ToRParenLoc, ToAngleBrackets);
Sean Callanandd2c1742016-05-16 20:48:03 +00007581 } else {
Balazs Keri3b30d652018-10-19 13:32:20 +00007582 llvm_unreachable("Unknown cast type");
7583 return make_error<ImportError>();
Sean Callanandd2c1742016-05-16 20:48:03 +00007584 }
7585}
7586
Balazs Keri3b30d652018-10-19 13:32:20 +00007587ExpectedStmt ASTNodeImporter::VisitSubstNonTypeTemplateParmExpr(
Aleksei Sidorin855086d2017-01-23 09:30:36 +00007588 SubstNonTypeTemplateParmExpr *E) {
Balazs Keri3b30d652018-10-19 13:32:20 +00007589 auto Imp = importSeq(
7590 E->getType(), E->getExprLoc(), E->getParameter(), E->getReplacement());
7591 if (!Imp)
7592 return Imp.takeError();
Aleksei Sidorin855086d2017-01-23 09:30:36 +00007593
Balazs Keri3b30d652018-10-19 13:32:20 +00007594 QualType ToType;
7595 SourceLocation ToExprLoc;
7596 NonTypeTemplateParmDecl *ToParameter;
7597 Expr *ToReplacement;
7598 std::tie(ToType, ToExprLoc, ToParameter, ToReplacement) = *Imp;
Aleksei Sidorin855086d2017-01-23 09:30:36 +00007599
7600 return new (Importer.getToContext()) SubstNonTypeTemplateParmExpr(
Balazs Keri3b30d652018-10-19 13:32:20 +00007601 ToType, E->getValueKind(), ToExprLoc, ToParameter, ToReplacement);
Aleksei Sidorin855086d2017-01-23 09:30:36 +00007602}
7603
Balazs Keri3b30d652018-10-19 13:32:20 +00007604ExpectedStmt ASTNodeImporter::VisitTypeTraitExpr(TypeTraitExpr *E) {
7605 auto Imp = importSeq(
7606 E->getType(), E->getBeginLoc(), E->getEndLoc());
7607 if (!Imp)
7608 return Imp.takeError();
7609
7610 QualType ToType;
7611 SourceLocation ToBeginLoc, ToEndLoc;
7612 std::tie(ToType, ToBeginLoc, ToEndLoc) = *Imp;
Aleksei Sidorinb05f37a2017-11-26 17:04:06 +00007613
7614 SmallVector<TypeSourceInfo *, 4> ToArgs(E->getNumArgs());
Balazs Keri3b30d652018-10-19 13:32:20 +00007615 if (Error Err = ImportContainerChecked(E->getArgs(), ToArgs))
7616 return std::move(Err);
Aleksei Sidorinb05f37a2017-11-26 17:04:06 +00007617
7618 // According to Sema::BuildTypeTrait(), if E is value-dependent,
7619 // Value is always false.
Balazs Keri3b30d652018-10-19 13:32:20 +00007620 bool ToValue = (E->isValueDependent() ? false : E->getValue());
Aleksei Sidorinb05f37a2017-11-26 17:04:06 +00007621
7622 return TypeTraitExpr::Create(
Balazs Keri3b30d652018-10-19 13:32:20 +00007623 Importer.getToContext(), ToType, ToBeginLoc, E->getTrait(), ToArgs,
7624 ToEndLoc, ToValue);
Aleksei Sidorinb05f37a2017-11-26 17:04:06 +00007625}
7626
Balazs Keri3b30d652018-10-19 13:32:20 +00007627ExpectedStmt ASTNodeImporter::VisitCXXTypeidExpr(CXXTypeidExpr *E) {
7628 ExpectedType ToTypeOrErr = import(E->getType());
7629 if (!ToTypeOrErr)
7630 return ToTypeOrErr.takeError();
7631
7632 auto ToSourceRangeOrErr = import(E->getSourceRange());
7633 if (!ToSourceRangeOrErr)
7634 return ToSourceRangeOrErr.takeError();
Gabor Horvathc78d99a2018-01-27 16:11:45 +00007635
7636 if (E->isTypeOperand()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00007637 if (auto ToTSIOrErr = import(E->getTypeOperandSourceInfo()))
7638 return new (Importer.getToContext()) CXXTypeidExpr(
7639 *ToTypeOrErr, *ToTSIOrErr, *ToSourceRangeOrErr);
7640 else
7641 return ToTSIOrErr.takeError();
Gabor Horvathc78d99a2018-01-27 16:11:45 +00007642 }
7643
Balazs Keri3b30d652018-10-19 13:32:20 +00007644 ExpectedExpr ToExprOperandOrErr = import(E->getExprOperand());
7645 if (!ToExprOperandOrErr)
7646 return ToExprOperandOrErr.takeError();
Gabor Horvathc78d99a2018-01-27 16:11:45 +00007647
Balazs Keri3b30d652018-10-19 13:32:20 +00007648 return new (Importer.getToContext()) CXXTypeidExpr(
7649 *ToTypeOrErr, *ToExprOperandOrErr, *ToSourceRangeOrErr);
Gabor Horvathc78d99a2018-01-27 16:11:45 +00007650}
7651
Lang Hames19e07e12017-06-20 21:06:00 +00007652void ASTNodeImporter::ImportOverrides(CXXMethodDecl *ToMethod,
7653 CXXMethodDecl *FromMethod) {
Balazs Keri3b30d652018-10-19 13:32:20 +00007654 for (auto *FromOverriddenMethod : FromMethod->overridden_methods()) {
7655 if (auto ImportedOrErr = import(FromOverriddenMethod))
7656 ToMethod->getCanonicalDecl()->addOverriddenMethod(cast<CXXMethodDecl>(
7657 (*ImportedOrErr)->getCanonicalDecl()));
7658 else
7659 consumeError(ImportedOrErr.takeError());
7660 }
Lang Hames19e07e12017-06-20 21:06:00 +00007661}
7662
Argyrios Kyrtzidisd0040642010-11-18 20:06:41 +00007663ASTImporter::ASTImporter(ASTContext &ToContext, FileManager &ToFileManager,
Douglas Gregor0a791672011-01-18 03:11:38 +00007664 ASTContext &FromContext, FileManager &FromFileManager,
Gabor Marton54058b52018-12-17 13:53:12 +00007665 bool MinimalImport,
7666 ASTImporterLookupTable *LookupTable)
7667 : LookupTable(LookupTable), ToContext(ToContext), FromContext(FromContext),
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00007668 ToFileManager(ToFileManager), FromFileManager(FromFileManager),
7669 Minimal(MinimalImport) {
Gabor Marton54058b52018-12-17 13:53:12 +00007670
7671 ImportedDecls[FromContext.getTranslationUnitDecl()] =
7672 ToContext.getTranslationUnitDecl();
Douglas Gregor62d311f2010-02-09 19:21:46 +00007673}
7674
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00007675ASTImporter::~ASTImporter() = default;
Douglas Gregor96e578d2010-02-05 17:54:41 +00007676
Balazs Keri4a3d7582018-11-27 18:36:31 +00007677Expected<QualType> ASTImporter::Import_New(QualType FromT) {
Davide Italianofaee83d2018-11-28 19:15:23 +00007678 QualType ToT = Import(FromT);
7679 if (ToT.isNull() && !FromT.isNull())
7680 return make_error<ImportError>();
7681 return ToT;
7682}
Gabor Marton54058b52018-12-17 13:53:12 +00007683
7684Optional<unsigned> ASTImporter::getFieldIndex(Decl *F) {
7685 assert(F && (isa<FieldDecl>(*F) || isa<IndirectFieldDecl>(*F)) &&
7686 "Try to get field index for non-field.");
7687
7688 auto *Owner = dyn_cast<RecordDecl>(F->getDeclContext());
7689 if (!Owner)
7690 return None;
7691
7692 unsigned Index = 0;
7693 for (const auto *D : Owner->decls()) {
7694 if (D == F)
7695 return Index;
7696
7697 if (isa<FieldDecl>(*D) || isa<IndirectFieldDecl>(*D))
7698 ++Index;
7699 }
7700
7701 llvm_unreachable("Field was not found in its parent context.");
7702
7703 return None;
7704}
7705
7706ASTImporter::FoundDeclsTy
7707ASTImporter::findDeclsInToCtx(DeclContext *DC, DeclarationName Name) {
7708 // We search in the redecl context because of transparent contexts.
7709 // E.g. a simple C language enum is a transparent context:
7710 // enum E { A, B };
7711 // Now if we had a global variable in the TU
7712 // int A;
7713 // then the enum constant 'A' and the variable 'A' violates ODR.
7714 // We can diagnose this only if we search in the redecl context.
7715 DeclContext *ReDC = DC->getRedeclContext();
7716 if (LookupTable) {
7717 ASTImporterLookupTable::LookupResult LookupResult =
7718 LookupTable->lookup(ReDC, Name);
7719 return FoundDeclsTy(LookupResult.begin(), LookupResult.end());
7720 } else {
7721 // FIXME Can we remove this kind of lookup?
7722 // Or lldb really needs this C/C++ lookup?
7723 FoundDeclsTy Result;
7724 ReDC->localUncachedLookup(Name, Result);
7725 return Result;
7726 }
7727}
7728
7729void ASTImporter::AddToLookupTable(Decl *ToD) {
7730 if (LookupTable)
7731 if (auto *ToND = dyn_cast<NamedDecl>(ToD))
7732 LookupTable->add(ToND);
7733}
7734
Davide Italianofaee83d2018-11-28 19:15:23 +00007735QualType ASTImporter::Import(QualType FromT) {
Douglas Gregor96e578d2010-02-05 17:54:41 +00007736 if (FromT.isNull())
Davide Italianofaee83d2018-11-28 19:15:23 +00007737 return {};
John McCall424cec92011-01-19 06:33:43 +00007738
Balazs Keri3b30d652018-10-19 13:32:20 +00007739 const Type *FromTy = FromT.getTypePtr();
Fangrui Song6907ce22018-07-30 19:24:48 +00007740
7741 // Check whether we've already imported this type.
John McCall424cec92011-01-19 06:33:43 +00007742 llvm::DenseMap<const Type *, const Type *>::iterator Pos
Balazs Keri3b30d652018-10-19 13:32:20 +00007743 = ImportedTypes.find(FromTy);
Douglas Gregorf65bbb32010-02-08 15:18:58 +00007744 if (Pos != ImportedTypes.end())
John McCall424cec92011-01-19 06:33:43 +00007745 return ToContext.getQualifiedType(Pos->second, FromT.getLocalQualifiers());
Fangrui Song6907ce22018-07-30 19:24:48 +00007746
Douglas Gregorf65bbb32010-02-08 15:18:58 +00007747 // Import the type
Douglas Gregor96e578d2010-02-05 17:54:41 +00007748 ASTNodeImporter Importer(*this);
Balazs Keri3b30d652018-10-19 13:32:20 +00007749 ExpectedType ToTOrErr = Importer.Visit(FromTy);
Davide Italianofaee83d2018-11-28 19:15:23 +00007750 if (!ToTOrErr) {
7751 llvm::consumeError(ToTOrErr.takeError());
7752 return {};
7753 }
Fangrui Song6907ce22018-07-30 19:24:48 +00007754
Douglas Gregorf65bbb32010-02-08 15:18:58 +00007755 // Record the imported type.
Balazs Keri3b30d652018-10-19 13:32:20 +00007756 ImportedTypes[FromTy] = (*ToTOrErr).getTypePtr();
Fangrui Song6907ce22018-07-30 19:24:48 +00007757
Balazs Keri3b30d652018-10-19 13:32:20 +00007758 return ToContext.getQualifiedType(*ToTOrErr, FromT.getLocalQualifiers());
Douglas Gregor96e578d2010-02-05 17:54:41 +00007759}
7760
Balazs Keri4a3d7582018-11-27 18:36:31 +00007761Expected<TypeSourceInfo *> ASTImporter::Import_New(TypeSourceInfo *FromTSI) {
Davide Italianofaee83d2018-11-28 19:15:23 +00007762 TypeSourceInfo *ToTSI = Import(FromTSI);
7763 if (!ToTSI && FromTSI)
7764 return llvm::make_error<ImportError>();
7765 return ToTSI;
7766}
7767TypeSourceInfo *ASTImporter::Import(TypeSourceInfo *FromTSI) {
Douglas Gregorfa7a0e52010-02-10 17:47:19 +00007768 if (!FromTSI)
7769 return FromTSI;
7770
7771 // FIXME: For now we just create a "trivial" type source info based
Nick Lewycky19b9f952010-07-26 16:56:01 +00007772 // on the type and a single location. Implement a real version of this.
Davide Italianofaee83d2018-11-28 19:15:23 +00007773 QualType T = Import(FromTSI->getType());
7774 if (T.isNull())
7775 return nullptr;
Douglas Gregorfa7a0e52010-02-10 17:47:19 +00007776
Davide Italianofaee83d2018-11-28 19:15:23 +00007777 return ToContext.getTrivialTypeSourceInfo(
7778 T, Import(FromTSI->getTypeLoc().getBeginLoc()));
Douglas Gregor62d311f2010-02-09 19:21:46 +00007779}
7780
Balazs Keri4a3d7582018-11-27 18:36:31 +00007781Expected<Attr *> ASTImporter::Import_New(const Attr *FromAttr) {
Davide Italianofaee83d2018-11-28 19:15:23 +00007782 return Import(FromAttr);
Aleksei Sidorin8f266db2018-05-08 12:45:21 +00007783}
Davide Italianofaee83d2018-11-28 19:15:23 +00007784Attr *ASTImporter::Import(const Attr *FromAttr) {
7785 Attr *ToAttr = FromAttr->clone(ToContext);
7786 // NOTE: Import of SourceRange may fail.
7787 ToAttr->setRange(Import(FromAttr->getRange()));
7788 return ToAttr;
Balazs Kerideaf7ab2018-11-28 13:21:26 +00007789}
Aleksei Sidorin8f266db2018-05-08 12:45:21 +00007790
Gabor Martonbe77a982018-12-12 11:22:55 +00007791Decl *ASTImporter::GetAlreadyImportedOrNull(const Decl *FromD) const {
7792 auto Pos = ImportedDecls.find(FromD);
7793 if (Pos != ImportedDecls.end())
7794 return Pos->second;
7795 else
Sean Callanan59721b32015-04-28 18:41:46 +00007796 return nullptr;
Sean Callanan59721b32015-04-28 18:41:46 +00007797}
7798
Gabor Marton458d1452019-02-14 13:07:03 +00007799TranslationUnitDecl *ASTImporter::GetFromTU(Decl *ToD) {
7800 auto FromDPos = ImportedFromDecls.find(ToD);
7801 if (FromDPos == ImportedFromDecls.end())
7802 return nullptr;
7803 return FromDPos->second->getTranslationUnitDecl();
7804}
7805
Balazs Keri4a3d7582018-11-27 18:36:31 +00007806Expected<Decl *> ASTImporter::Import_New(Decl *FromD) {
Davide Italianofaee83d2018-11-28 19:15:23 +00007807 Decl *ToD = Import(FromD);
7808 if (!ToD && FromD)
7809 return llvm::make_error<ImportError>();
7810 return ToD;
7811}
7812Decl *ASTImporter::Import(Decl *FromD) {
Douglas Gregor62d311f2010-02-09 19:21:46 +00007813 if (!FromD)
Craig Topper36250ad2014-05-12 05:36:57 +00007814 return nullptr;
Douglas Gregor62d311f2010-02-09 19:21:46 +00007815
Douglas Gregord451ea92011-07-29 23:31:30 +00007816 ASTNodeImporter Importer(*this);
7817
Gabor Marton26f72a92018-07-12 09:42:05 +00007818 // Check whether we've already imported this declaration.
7819 Decl *ToD = GetAlreadyImportedOrNull(FromD);
7820 if (ToD) {
7821 // If FromD has some updated flags after last import, apply it
7822 updateFlags(FromD, ToD);
Douglas Gregord451ea92011-07-29 23:31:30 +00007823 return ToD;
7824 }
Gabor Marton26f72a92018-07-12 09:42:05 +00007825
Davide Italianofaee83d2018-11-28 19:15:23 +00007826 // Import the type.
Balazs Keri3b30d652018-10-19 13:32:20 +00007827 ExpectedDecl ToDOrErr = Importer.Visit(FromD);
Davide Italianofaee83d2018-11-28 19:15:23 +00007828 if (!ToDOrErr) {
7829 llvm::consumeError(ToDOrErr.takeError());
7830 return nullptr;
7831 }
Balazs Keri3b30d652018-10-19 13:32:20 +00007832 ToD = *ToDOrErr;
Craig Topper36250ad2014-05-12 05:36:57 +00007833
Gabor Marton54058b52018-12-17 13:53:12 +00007834 // Once the decl is connected to the existing declarations, i.e. when the
7835 // redecl chain is properly set then we populate the lookup again.
7836 // This way the primary context will be able to find all decls.
7837 AddToLookupTable(ToD);
7838
Gabor Marton26f72a92018-07-12 09:42:05 +00007839 // Notify subclasses.
7840 Imported(FromD, ToD);
7841
Gabor Martonac3a5d62018-09-17 12:04:52 +00007842 updateFlags(FromD, ToD);
Davide Italianofaee83d2018-11-28 19:15:23 +00007843 return ToD;
Douglas Gregor62d311f2010-02-09 19:21:46 +00007844}
7845
Balazs Keri3b30d652018-10-19 13:32:20 +00007846Expected<DeclContext *> ASTImporter::ImportContext(DeclContext *FromDC) {
Douglas Gregor62d311f2010-02-09 19:21:46 +00007847 if (!FromDC)
7848 return FromDC;
7849
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00007850 auto *ToDC = cast_or_null<DeclContext>(Import(cast<Decl>(FromDC)));
Douglas Gregor2e15c842012-02-01 21:00:38 +00007851 if (!ToDC)
Craig Topper36250ad2014-05-12 05:36:57 +00007852 return nullptr;
7853
Fangrui Song6907ce22018-07-30 19:24:48 +00007854 // When we're using a record/enum/Objective-C class/protocol as a context, we
Douglas Gregor2e15c842012-02-01 21:00:38 +00007855 // need it to have a definition.
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00007856 if (auto *ToRecord = dyn_cast<RecordDecl>(ToDC)) {
7857 auto *FromRecord = cast<RecordDecl>(FromDC);
Douglas Gregor2e15c842012-02-01 21:00:38 +00007858 if (ToRecord->isCompleteDefinition()) {
7859 // Do nothing.
7860 } else if (FromRecord->isCompleteDefinition()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00007861 if (Error Err = ASTNodeImporter(*this).ImportDefinition(
7862 FromRecord, ToRecord, ASTNodeImporter::IDK_Basic))
7863 return std::move(Err);
Douglas Gregor2e15c842012-02-01 21:00:38 +00007864 } else {
7865 CompleteDecl(ToRecord);
7866 }
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00007867 } else if (auto *ToEnum = dyn_cast<EnumDecl>(ToDC)) {
7868 auto *FromEnum = cast<EnumDecl>(FromDC);
Douglas Gregor2e15c842012-02-01 21:00:38 +00007869 if (ToEnum->isCompleteDefinition()) {
7870 // Do nothing.
7871 } else if (FromEnum->isCompleteDefinition()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00007872 if (Error Err = ASTNodeImporter(*this).ImportDefinition(
7873 FromEnum, ToEnum, ASTNodeImporter::IDK_Basic))
7874 return std::move(Err);
Douglas Gregor2e15c842012-02-01 21:00:38 +00007875 } else {
7876 CompleteDecl(ToEnum);
Fangrui Song6907ce22018-07-30 19:24:48 +00007877 }
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00007878 } else if (auto *ToClass = dyn_cast<ObjCInterfaceDecl>(ToDC)) {
7879 auto *FromClass = cast<ObjCInterfaceDecl>(FromDC);
Douglas Gregor2e15c842012-02-01 21:00:38 +00007880 if (ToClass->getDefinition()) {
7881 // Do nothing.
7882 } else if (ObjCInterfaceDecl *FromDef = FromClass->getDefinition()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00007883 if (Error Err = ASTNodeImporter(*this).ImportDefinition(
7884 FromDef, ToClass, ASTNodeImporter::IDK_Basic))
7885 return std::move(Err);
Douglas Gregor2e15c842012-02-01 21:00:38 +00007886 } else {
7887 CompleteDecl(ToClass);
7888 }
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00007889 } else if (auto *ToProto = dyn_cast<ObjCProtocolDecl>(ToDC)) {
7890 auto *FromProto = cast<ObjCProtocolDecl>(FromDC);
Douglas Gregor2e15c842012-02-01 21:00:38 +00007891 if (ToProto->getDefinition()) {
7892 // Do nothing.
7893 } else if (ObjCProtocolDecl *FromDef = FromProto->getDefinition()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00007894 if (Error Err = ASTNodeImporter(*this).ImportDefinition(
7895 FromDef, ToProto, ASTNodeImporter::IDK_Basic))
7896 return std::move(Err);
Douglas Gregor2e15c842012-02-01 21:00:38 +00007897 } else {
7898 CompleteDecl(ToProto);
Fangrui Song6907ce22018-07-30 19:24:48 +00007899 }
Douglas Gregor95d82832012-01-24 18:36:04 +00007900 }
Fangrui Song6907ce22018-07-30 19:24:48 +00007901
Douglas Gregor95d82832012-01-24 18:36:04 +00007902 return ToDC;
Douglas Gregor62d311f2010-02-09 19:21:46 +00007903}
7904
Balazs Keri4a3d7582018-11-27 18:36:31 +00007905Expected<Expr *> ASTImporter::Import_New(Expr *FromE) {
Davide Italianofaee83d2018-11-28 19:15:23 +00007906 Expr *ToE = Import(FromE);
7907 if (!ToE && FromE)
7908 return llvm::make_error<ImportError>();
7909 return ToE;
Balazs Keri4a3d7582018-11-27 18:36:31 +00007910}
Davide Italianofaee83d2018-11-28 19:15:23 +00007911Expr *ASTImporter::Import(Expr *FromE) {
7912 if (!FromE)
7913 return nullptr;
7914
7915 return cast_or_null<Expr>(Import(cast<Stmt>(FromE)));
Douglas Gregor62d311f2010-02-09 19:21:46 +00007916}
7917
Balazs Keri4a3d7582018-11-27 18:36:31 +00007918Expected<Stmt *> ASTImporter::Import_New(Stmt *FromS) {
Davide Italianofaee83d2018-11-28 19:15:23 +00007919 Stmt *ToS = Import(FromS);
7920 if (!ToS && FromS)
7921 return llvm::make_error<ImportError>();
7922 return ToS;
7923}
7924Stmt *ASTImporter::Import(Stmt *FromS) {
Douglas Gregor62d311f2010-02-09 19:21:46 +00007925 if (!FromS)
Craig Topper36250ad2014-05-12 05:36:57 +00007926 return nullptr;
Douglas Gregor62d311f2010-02-09 19:21:46 +00007927
Davide Italianofaee83d2018-11-28 19:15:23 +00007928 // Check whether we've already imported this declaration.
Douglas Gregor7eeb5972010-02-11 19:21:55 +00007929 llvm::DenseMap<Stmt *, Stmt *>::iterator Pos = ImportedStmts.find(FromS);
7930 if (Pos != ImportedStmts.end())
7931 return Pos->second;
Fangrui Song6907ce22018-07-30 19:24:48 +00007932
Balazs Keri3b30d652018-10-19 13:32:20 +00007933 // Import the statement.
Douglas Gregor7eeb5972010-02-11 19:21:55 +00007934 ASTNodeImporter Importer(*this);
Balazs Keri3b30d652018-10-19 13:32:20 +00007935 ExpectedStmt ToSOrErr = Importer.Visit(FromS);
Davide Italianofaee83d2018-11-28 19:15:23 +00007936 if (!ToSOrErr) {
7937 llvm::consumeError(ToSOrErr.takeError());
7938 return nullptr;
7939 }
Craig Topper36250ad2014-05-12 05:36:57 +00007940
Balazs Keri3b30d652018-10-19 13:32:20 +00007941 if (auto *ToE = dyn_cast<Expr>(*ToSOrErr)) {
Gabor Martona20ce602018-09-03 13:10:53 +00007942 auto *FromE = cast<Expr>(FromS);
7943 // Copy ExprBitfields, which may not be handled in Expr subclasses
7944 // constructors.
7945 ToE->setValueKind(FromE->getValueKind());
7946 ToE->setObjectKind(FromE->getObjectKind());
7947 ToE->setTypeDependent(FromE->isTypeDependent());
7948 ToE->setValueDependent(FromE->isValueDependent());
7949 ToE->setInstantiationDependent(FromE->isInstantiationDependent());
7950 ToE->setContainsUnexpandedParameterPack(
7951 FromE->containsUnexpandedParameterPack());
7952 }
7953
Davide Italianofaee83d2018-11-28 19:15:23 +00007954 // Record the imported declaration.
Balazs Keri3b30d652018-10-19 13:32:20 +00007955 ImportedStmts[FromS] = *ToSOrErr;
Davide Italianofaee83d2018-11-28 19:15:23 +00007956 return *ToSOrErr;
Douglas Gregor62d311f2010-02-09 19:21:46 +00007957}
7958
Balazs Keri4a3d7582018-11-27 18:36:31 +00007959Expected<NestedNameSpecifier *>
7960ASTImporter::Import_New(NestedNameSpecifier *FromNNS) {
Davide Italianofaee83d2018-11-28 19:15:23 +00007961 NestedNameSpecifier *ToNNS = Import(FromNNS);
7962 if (!ToNNS && FromNNS)
7963 return llvm::make_error<ImportError>();
7964 return ToNNS;
7965}
7966NestedNameSpecifier *ASTImporter::Import(NestedNameSpecifier *FromNNS) {
Douglas Gregor62d311f2010-02-09 19:21:46 +00007967 if (!FromNNS)
Craig Topper36250ad2014-05-12 05:36:57 +00007968 return nullptr;
Douglas Gregor62d311f2010-02-09 19:21:46 +00007969
Davide Italianofaee83d2018-11-28 19:15:23 +00007970 NestedNameSpecifier *prefix = Import(FromNNS->getPrefix());
Douglas Gregor90ebf252011-04-27 16:48:40 +00007971
7972 switch (FromNNS->getKind()) {
7973 case NestedNameSpecifier::Identifier:
Davide Italianofaee83d2018-11-28 19:15:23 +00007974 if (IdentifierInfo *II = Import(FromNNS->getAsIdentifier())) {
7975 return NestedNameSpecifier::Create(ToContext, prefix, II);
7976 }
7977 return nullptr;
Douglas Gregor90ebf252011-04-27 16:48:40 +00007978
7979 case NestedNameSpecifier::Namespace:
Davide Italianofaee83d2018-11-28 19:15:23 +00007980 if (auto *NS =
7981 cast_or_null<NamespaceDecl>(Import(FromNNS->getAsNamespace()))) {
7982 return NestedNameSpecifier::Create(ToContext, prefix, NS);
7983 }
7984 return nullptr;
Douglas Gregor90ebf252011-04-27 16:48:40 +00007985
7986 case NestedNameSpecifier::NamespaceAlias:
Davide Italianofaee83d2018-11-28 19:15:23 +00007987 if (auto *NSAD =
7988 cast_or_null<NamespaceAliasDecl>(Import(FromNNS->getAsNamespaceAlias()))) {
7989 return NestedNameSpecifier::Create(ToContext, prefix, NSAD);
7990 }
7991 return nullptr;
Douglas Gregor90ebf252011-04-27 16:48:40 +00007992
7993 case NestedNameSpecifier::Global:
7994 return NestedNameSpecifier::GlobalSpecifier(ToContext);
7995
Nikola Smiljanic67860242014-09-26 00:28:20 +00007996 case NestedNameSpecifier::Super:
Davide Italianofaee83d2018-11-28 19:15:23 +00007997 if (auto *RD =
7998 cast_or_null<CXXRecordDecl>(Import(FromNNS->getAsRecordDecl()))) {
7999 return NestedNameSpecifier::SuperSpecifier(ToContext, RD);
8000 }
8001 return nullptr;
Nikola Smiljanic67860242014-09-26 00:28:20 +00008002
Douglas Gregor90ebf252011-04-27 16:48:40 +00008003 case NestedNameSpecifier::TypeSpec:
Davide Italianofaee83d2018-11-28 19:15:23 +00008004 case NestedNameSpecifier::TypeSpecWithTemplate: {
8005 QualType T = Import(QualType(FromNNS->getAsType(), 0u));
8006 if (!T.isNull()) {
8007 bool bTemplate = FromNNS->getKind() ==
8008 NestedNameSpecifier::TypeSpecWithTemplate;
8009 return NestedNameSpecifier::Create(ToContext, prefix,
8010 bTemplate, T.getTypePtr());
8011 }
Douglas Gregor90ebf252011-04-27 16:48:40 +00008012 }
Davide Italianofaee83d2018-11-28 19:15:23 +00008013 return nullptr;
Douglas Gregor90ebf252011-04-27 16:48:40 +00008014 }
8015
8016 llvm_unreachable("Invalid nested name specifier kind");
Douglas Gregor62d311f2010-02-09 19:21:46 +00008017}
8018
Balazs Keri4a3d7582018-11-27 18:36:31 +00008019Expected<NestedNameSpecifierLoc>
8020ASTImporter::Import_New(NestedNameSpecifierLoc FromNNS) {
Davide Italianofaee83d2018-11-28 19:15:23 +00008021 NestedNameSpecifierLoc ToNNS = Import(FromNNS);
8022 return ToNNS;
8023}
8024NestedNameSpecifierLoc ASTImporter::Import(NestedNameSpecifierLoc FromNNS) {
Aleksei Sidorin855086d2017-01-23 09:30:36 +00008025 // Copied from NestedNameSpecifier mostly.
8026 SmallVector<NestedNameSpecifierLoc , 8> NestedNames;
8027 NestedNameSpecifierLoc NNS = FromNNS;
8028
8029 // Push each of the nested-name-specifiers's onto a stack for
8030 // serialization in reverse order.
8031 while (NNS) {
8032 NestedNames.push_back(NNS);
8033 NNS = NNS.getPrefix();
8034 }
8035
8036 NestedNameSpecifierLocBuilder Builder;
8037
8038 while (!NestedNames.empty()) {
8039 NNS = NestedNames.pop_back_val();
Davide Italianofaee83d2018-11-28 19:15:23 +00008040 NestedNameSpecifier *Spec = Import(NNS.getNestedNameSpecifier());
8041 if (!Spec)
8042 return NestedNameSpecifierLoc();
Aleksei Sidorin855086d2017-01-23 09:30:36 +00008043
8044 NestedNameSpecifier::SpecifierKind Kind = Spec->getKind();
8045 switch (Kind) {
8046 case NestedNameSpecifier::Identifier:
Davide Italianofaee83d2018-11-28 19:15:23 +00008047 Builder.Extend(getToContext(),
8048 Spec->getAsIdentifier(),
8049 Import(NNS.getLocalBeginLoc()),
8050 Import(NNS.getLocalEndLoc()));
Aleksei Sidorin855086d2017-01-23 09:30:36 +00008051 break;
8052
8053 case NestedNameSpecifier::Namespace:
Davide Italianofaee83d2018-11-28 19:15:23 +00008054 Builder.Extend(getToContext(),
8055 Spec->getAsNamespace(),
8056 Import(NNS.getLocalBeginLoc()),
8057 Import(NNS.getLocalEndLoc()));
Aleksei Sidorin855086d2017-01-23 09:30:36 +00008058 break;
8059
8060 case NestedNameSpecifier::NamespaceAlias:
Davide Italianofaee83d2018-11-28 19:15:23 +00008061 Builder.Extend(getToContext(),
8062 Spec->getAsNamespaceAlias(),
8063 Import(NNS.getLocalBeginLoc()),
8064 Import(NNS.getLocalEndLoc()));
Aleksei Sidorin855086d2017-01-23 09:30:36 +00008065 break;
8066
8067 case NestedNameSpecifier::TypeSpec:
8068 case NestedNameSpecifier::TypeSpecWithTemplate: {
8069 TypeSourceInfo *TSI = getToContext().getTrivialTypeSourceInfo(
8070 QualType(Spec->getAsType(), 0));
Davide Italianofaee83d2018-11-28 19:15:23 +00008071 Builder.Extend(getToContext(),
8072 Import(NNS.getLocalBeginLoc()),
8073 TSI->getTypeLoc(),
8074 Import(NNS.getLocalEndLoc()));
Aleksei Sidorin855086d2017-01-23 09:30:36 +00008075 break;
8076 }
8077
8078 case NestedNameSpecifier::Global:
Davide Italianofaee83d2018-11-28 19:15:23 +00008079 Builder.MakeGlobal(getToContext(), Import(NNS.getLocalBeginLoc()));
Aleksei Sidorin855086d2017-01-23 09:30:36 +00008080 break;
8081
8082 case NestedNameSpecifier::Super: {
Davide Italianofaee83d2018-11-28 19:15:23 +00008083 SourceRange ToRange = Import(NNS.getSourceRange());
8084 Builder.MakeSuper(getToContext(),
8085 Spec->getAsRecordDecl(),
8086 ToRange.getBegin(),
8087 ToRange.getEnd());
Aleksei Sidorin855086d2017-01-23 09:30:36 +00008088 }
8089 }
8090 }
8091
8092 return Builder.getWithLocInContext(getToContext());
Douglas Gregor14454802011-02-25 02:25:35 +00008093}
8094
Balazs Keri4a3d7582018-11-27 18:36:31 +00008095Expected<TemplateName> ASTImporter::Import_New(TemplateName From) {
Davide Italianofaee83d2018-11-28 19:15:23 +00008096 TemplateName To = Import(From);
8097 if (To.isNull() && !From.isNull())
8098 return llvm::make_error<ImportError>();
8099 return To;
8100}
8101TemplateName ASTImporter::Import(TemplateName From) {
Douglas Gregore2e50d332010-12-01 01:36:18 +00008102 switch (From.getKind()) {
8103 case TemplateName::Template:
Davide Italianofaee83d2018-11-28 19:15:23 +00008104 if (auto *ToTemplate =
8105 cast_or_null<TemplateDecl>(Import(From.getAsTemplateDecl())))
8106 return TemplateName(ToTemplate);
8107
8108 return {};
Fangrui Song6907ce22018-07-30 19:24:48 +00008109
Douglas Gregore2e50d332010-12-01 01:36:18 +00008110 case TemplateName::OverloadedTemplate: {
8111 OverloadedTemplateStorage *FromStorage = From.getAsOverloadedTemplate();
8112 UnresolvedSet<2> ToTemplates;
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00008113 for (auto *I : *FromStorage) {
Davide Italianofaee83d2018-11-28 19:15:23 +00008114 if (auto *To = cast_or_null<NamedDecl>(Import(I)))
8115 ToTemplates.addDecl(To);
Douglas Gregore2e50d332010-12-01 01:36:18 +00008116 else
Davide Italianofaee83d2018-11-28 19:15:23 +00008117 return {};
Douglas Gregore2e50d332010-12-01 01:36:18 +00008118 }
Fangrui Song6907ce22018-07-30 19:24:48 +00008119 return ToContext.getOverloadedTemplateName(ToTemplates.begin(),
Douglas Gregore2e50d332010-12-01 01:36:18 +00008120 ToTemplates.end());
8121 }
Fangrui Song6907ce22018-07-30 19:24:48 +00008122
Douglas Gregore2e50d332010-12-01 01:36:18 +00008123 case TemplateName::QualifiedTemplate: {
8124 QualifiedTemplateName *QTN = From.getAsQualifiedTemplateName();
Davide Italianofaee83d2018-11-28 19:15:23 +00008125 NestedNameSpecifier *Qualifier = Import(QTN->getQualifier());
8126 if (!Qualifier)
8127 return {};
Fangrui Song6907ce22018-07-30 19:24:48 +00008128
Davide Italianofaee83d2018-11-28 19:15:23 +00008129 if (auto *ToTemplate =
8130 cast_or_null<TemplateDecl>(Import(From.getAsTemplateDecl())))
8131 return ToContext.getQualifiedTemplateName(Qualifier,
8132 QTN->hasTemplateKeyword(),
8133 ToTemplate);
8134
8135 return {};
Douglas Gregore2e50d332010-12-01 01:36:18 +00008136 }
Fangrui Song6907ce22018-07-30 19:24:48 +00008137
Douglas Gregore2e50d332010-12-01 01:36:18 +00008138 case TemplateName::DependentTemplate: {
8139 DependentTemplateName *DTN = From.getAsDependentTemplateName();
Davide Italianofaee83d2018-11-28 19:15:23 +00008140 NestedNameSpecifier *Qualifier = Import(DTN->getQualifier());
8141 if (!Qualifier)
8142 return {};
Fangrui Song6907ce22018-07-30 19:24:48 +00008143
Douglas Gregore2e50d332010-12-01 01:36:18 +00008144 if (DTN->isIdentifier()) {
Davide Italianofaee83d2018-11-28 19:15:23 +00008145 return ToContext.getDependentTemplateName(Qualifier,
Douglas Gregore2e50d332010-12-01 01:36:18 +00008146 Import(DTN->getIdentifier()));
8147 }
Fangrui Song6907ce22018-07-30 19:24:48 +00008148
Davide Italianofaee83d2018-11-28 19:15:23 +00008149 return ToContext.getDependentTemplateName(Qualifier, DTN->getOperator());
Douglas Gregore2e50d332010-12-01 01:36:18 +00008150 }
John McCalld9dfe3a2011-06-30 08:33:18 +00008151
8152 case TemplateName::SubstTemplateTemplateParm: {
Davide Italianofaee83d2018-11-28 19:15:23 +00008153 SubstTemplateTemplateParmStorage *subst
8154 = From.getAsSubstTemplateTemplateParm();
8155 auto *param =
8156 cast_or_null<TemplateTemplateParmDecl>(Import(subst->getParameter()));
8157 if (!param)
8158 return {};
John McCalld9dfe3a2011-06-30 08:33:18 +00008159
Davide Italianofaee83d2018-11-28 19:15:23 +00008160 TemplateName replacement = Import(subst->getReplacement());
8161 if (replacement.isNull())
8162 return {};
Fangrui Song6907ce22018-07-30 19:24:48 +00008163
Davide Italianofaee83d2018-11-28 19:15:23 +00008164 return ToContext.getSubstTemplateTemplateParm(param, replacement);
John McCalld9dfe3a2011-06-30 08:33:18 +00008165 }
Fangrui Song6907ce22018-07-30 19:24:48 +00008166
Douglas Gregor5590be02011-01-15 06:45:20 +00008167 case TemplateName::SubstTemplateTemplateParmPack: {
8168 SubstTemplateTemplateParmPackStorage *SubstPack
8169 = From.getAsSubstTemplateTemplateParmPack();
Davide Italianofaee83d2018-11-28 19:15:23 +00008170 auto *Param =
8171 cast_or_null<TemplateTemplateParmDecl>(
8172 Import(SubstPack->getParameterPack()));
8173 if (!Param)
8174 return {};
Fangrui Song6907ce22018-07-30 19:24:48 +00008175
Douglas Gregor5590be02011-01-15 06:45:20 +00008176 ASTNodeImporter Importer(*this);
Davide Italianofaee83d2018-11-28 19:15:23 +00008177 Expected<TemplateArgument> ArgPack
8178 = Importer.ImportTemplateArgument(SubstPack->getArgumentPack());
8179 if (!ArgPack) {
8180 llvm::consumeError(ArgPack.takeError());
8181 return {};
8182 }
Fangrui Song6907ce22018-07-30 19:24:48 +00008183
Davide Italianofaee83d2018-11-28 19:15:23 +00008184 return ToContext.getSubstTemplateTemplateParmPack(Param, *ArgPack);
Douglas Gregor5590be02011-01-15 06:45:20 +00008185 }
Douglas Gregore2e50d332010-12-01 01:36:18 +00008186 }
Fangrui Song6907ce22018-07-30 19:24:48 +00008187
Douglas Gregore2e50d332010-12-01 01:36:18 +00008188 llvm_unreachable("Invalid template name kind");
Douglas Gregore2e50d332010-12-01 01:36:18 +00008189}
8190
Balazs Keri4a3d7582018-11-27 18:36:31 +00008191Expected<SourceLocation> ASTImporter::Import_New(SourceLocation FromLoc) {
Davide Italianofaee83d2018-11-28 19:15:23 +00008192 SourceLocation ToLoc = Import(FromLoc);
8193 if (ToLoc.isInvalid() && !FromLoc.isInvalid())
8194 return llvm::make_error<ImportError>();
8195 return ToLoc;
8196}
8197SourceLocation ASTImporter::Import(SourceLocation FromLoc) {
Douglas Gregor62d311f2010-02-09 19:21:46 +00008198 if (FromLoc.isInvalid())
Davide Italianofaee83d2018-11-28 19:15:23 +00008199 return {};
Douglas Gregor62d311f2010-02-09 19:21:46 +00008200
Douglas Gregor811663e2010-02-10 00:15:17 +00008201 SourceManager &FromSM = FromContext.getSourceManager();
Shafik Yaghmour9adbbcb2019-03-04 20:25:54 +00008202 bool IsBuiltin = FromSM.isWrittenInBuiltinFile(FromLoc);
Rafael Stahl29f37fb2018-07-04 13:34:05 +00008203
Douglas Gregor811663e2010-02-10 00:15:17 +00008204 std::pair<FileID, unsigned> Decomposed = FromSM.getDecomposedLoc(FromLoc);
Shafik Yaghmour9adbbcb2019-03-04 20:25:54 +00008205 FileID ToFileID = Import(Decomposed.first, IsBuiltin);
Davide Italianofaee83d2018-11-28 19:15:23 +00008206 if (ToFileID.isInvalid())
8207 return {};
Rafael Stahl29f37fb2018-07-04 13:34:05 +00008208 SourceManager &ToSM = ToContext.getSourceManager();
Davide Italianofaee83d2018-11-28 19:15:23 +00008209 return ToSM.getComposedLoc(ToFileID, Decomposed.second);
Douglas Gregor62d311f2010-02-09 19:21:46 +00008210}
8211
Balazs Keri4a3d7582018-11-27 18:36:31 +00008212Expected<SourceRange> ASTImporter::Import_New(SourceRange FromRange) {
Davide Italianofaee83d2018-11-28 19:15:23 +00008213 SourceRange ToRange = Import(FromRange);
8214 return ToRange;
Balazs Keri4a3d7582018-11-27 18:36:31 +00008215}
Davide Italianofaee83d2018-11-28 19:15:23 +00008216SourceRange ASTImporter::Import(SourceRange FromRange) {
8217 return SourceRange(Import(FromRange.getBegin()), Import(FromRange.getEnd()));
Douglas Gregor62d311f2010-02-09 19:21:46 +00008218}
8219
Shafik Yaghmour9adbbcb2019-03-04 20:25:54 +00008220Expected<FileID> ASTImporter::Import_New(FileID FromID, bool IsBuiltin) {
8221 FileID ToID = Import(FromID, IsBuiltin);
Davide Italianofaee83d2018-11-28 19:15:23 +00008222 if (ToID.isInvalid() && FromID.isValid())
8223 return llvm::make_error<ImportError>();
8224 return ToID;
8225}
Shafik Yaghmour9adbbcb2019-03-04 20:25:54 +00008226FileID ASTImporter::Import(FileID FromID, bool IsBuiltin) {
Rafael Stahl29f37fb2018-07-04 13:34:05 +00008227 llvm::DenseMap<FileID, FileID>::iterator Pos = ImportedFileIDs.find(FromID);
Douglas Gregor811663e2010-02-10 00:15:17 +00008228 if (Pos != ImportedFileIDs.end())
8229 return Pos->second;
Rafael Stahl29f37fb2018-07-04 13:34:05 +00008230
Douglas Gregor811663e2010-02-10 00:15:17 +00008231 SourceManager &FromSM = FromContext.getSourceManager();
8232 SourceManager &ToSM = ToContext.getSourceManager();
8233 const SrcMgr::SLocEntry &FromSLoc = FromSM.getSLocEntry(FromID);
Rafael Stahl29f37fb2018-07-04 13:34:05 +00008234
8235 // Map the FromID to the "to" source manager.
Douglas Gregor811663e2010-02-10 00:15:17 +00008236 FileID ToID;
Rafael Stahl29f37fb2018-07-04 13:34:05 +00008237 if (FromSLoc.isExpansion()) {
8238 const SrcMgr::ExpansionInfo &FromEx = FromSLoc.getExpansion();
Davide Italianofaee83d2018-11-28 19:15:23 +00008239 SourceLocation ToSpLoc = Import(FromEx.getSpellingLoc());
8240 SourceLocation ToExLocS = Import(FromEx.getExpansionLocStart());
Rafael Stahl29f37fb2018-07-04 13:34:05 +00008241 unsigned TokenLen = FromSM.getFileIDSize(FromID);
8242 SourceLocation MLoc;
8243 if (FromEx.isMacroArgExpansion()) {
Davide Italianofaee83d2018-11-28 19:15:23 +00008244 MLoc = ToSM.createMacroArgExpansionLoc(ToSpLoc, ToExLocS, TokenLen);
Rafael Stahl29f37fb2018-07-04 13:34:05 +00008245 } else {
Davide Italianofaee83d2018-11-28 19:15:23 +00008246 SourceLocation ToExLocE = Import(FromEx.getExpansionLocEnd());
8247 MLoc = ToSM.createExpansionLoc(ToSpLoc, ToExLocS, ToExLocE, TokenLen,
8248 FromEx.isExpansionTokenRange());
Rafael Stahl29f37fb2018-07-04 13:34:05 +00008249 }
8250 ToID = ToSM.getFileID(MLoc);
Douglas Gregor811663e2010-02-10 00:15:17 +00008251 } else {
Rafael Stahl29f37fb2018-07-04 13:34:05 +00008252 const SrcMgr::ContentCache *Cache = FromSLoc.getFile().getContentCache();
Shafik Yaghmour9adbbcb2019-03-04 20:25:54 +00008253
8254 if (!IsBuiltin) {
8255 // Include location of this file.
8256 SourceLocation ToIncludeLoc = Import(FromSLoc.getFile().getIncludeLoc());
8257
8258 if (Cache->OrigEntry && Cache->OrigEntry->getDir()) {
8259 // FIXME: We probably want to use getVirtualFile(), so we don't hit the
8260 // disk again
8261 // FIXME: We definitely want to re-use the existing MemoryBuffer, rather
8262 // than mmap the files several times.
8263 const FileEntry *Entry =
8264 ToFileManager.getFile(Cache->OrigEntry->getName());
8265 // FIXME: The filename may be a virtual name that does probably not
8266 // point to a valid file and we get no Entry here. In this case try with
8267 // the memory buffer below.
8268 if (Entry)
8269 ToID = ToSM.createFileID(Entry, ToIncludeLoc,
8270 FromSLoc.getFile().getFileCharacteristic());
8271 }
Balazs Keri9cf39df2019-02-27 16:31:48 +00008272 }
Shafik Yaghmour9adbbcb2019-03-04 20:25:54 +00008273
8274 if (ToID.isInvalid() || IsBuiltin) {
Rafael Stahl29f37fb2018-07-04 13:34:05 +00008275 // FIXME: We want to re-use the existing MemoryBuffer!
Balazs Keri9cf39df2019-02-27 16:31:48 +00008276 bool Invalid = true;
8277 const llvm::MemoryBuffer *FromBuf = Cache->getBuffer(
8278 FromContext.getDiagnostics(), FromSM, SourceLocation{}, &Invalid);
8279 if (!FromBuf || Invalid)
8280 return {};
8281
Rafael Stahl29f37fb2018-07-04 13:34:05 +00008282 std::unique_ptr<llvm::MemoryBuffer> ToBuf =
8283 llvm::MemoryBuffer::getMemBufferCopy(FromBuf->getBuffer(),
8284 FromBuf->getBufferIdentifier());
8285 ToID = ToSM.createFileID(std::move(ToBuf),
8286 FromSLoc.getFile().getFileCharacteristic());
8287 }
Douglas Gregor811663e2010-02-10 00:15:17 +00008288 }
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00008289
Balazs Keri9cf39df2019-02-27 16:31:48 +00008290 assert(ToID.isValid() && "Unexpected invalid fileID was created.");
8291
Sebastian Redl99219f12010-09-30 01:03:06 +00008292 ImportedFileIDs[FromID] = ToID;
Douglas Gregor811663e2010-02-10 00:15:17 +00008293 return ToID;
8294}
8295
Balazs Keri4a3d7582018-11-27 18:36:31 +00008296Expected<CXXCtorInitializer *>
8297ASTImporter::Import_New(CXXCtorInitializer *From) {
Davide Italianofaee83d2018-11-28 19:15:23 +00008298 CXXCtorInitializer *To = Import(From);
8299 if (!To && From)
8300 return llvm::make_error<ImportError>();
8301 return To;
Sean Callanandd2c1742016-05-16 20:48:03 +00008302}
Balazs Kerideaf7ab2018-11-28 13:21:26 +00008303CXXCtorInitializer *ASTImporter::Import(CXXCtorInitializer *From) {
Davide Italianofaee83d2018-11-28 19:15:23 +00008304 Expr *ToExpr = Import(From->getInit());
8305 if (!ToExpr && From->getInit())
8306 return nullptr;
8307
8308 if (From->isBaseInitializer()) {
8309 TypeSourceInfo *ToTInfo = Import(From->getTypeSourceInfo());
8310 if (!ToTInfo && From->getTypeSourceInfo())
8311 return nullptr;
8312
8313 return new (ToContext) CXXCtorInitializer(
8314 ToContext, ToTInfo, From->isBaseVirtual(), Import(From->getLParenLoc()),
8315 ToExpr, Import(From->getRParenLoc()),
8316 From->isPackExpansion() ? Import(From->getEllipsisLoc())
8317 : SourceLocation());
8318 } else if (From->isMemberInitializer()) {
8319 auto *ToField = cast_or_null<FieldDecl>(Import(From->getMember()));
8320 if (!ToField && From->getMember())
8321 return nullptr;
8322
8323 return new (ToContext) CXXCtorInitializer(
8324 ToContext, ToField, Import(From->getMemberLocation()),
8325 Import(From->getLParenLoc()), ToExpr, Import(From->getRParenLoc()));
8326 } else if (From->isIndirectMemberInitializer()) {
8327 auto *ToIField = cast_or_null<IndirectFieldDecl>(
8328 Import(From->getIndirectMember()));
8329 if (!ToIField && From->getIndirectMember())
8330 return nullptr;
8331
8332 return new (ToContext) CXXCtorInitializer(
8333 ToContext, ToIField, Import(From->getMemberLocation()),
8334 Import(From->getLParenLoc()), ToExpr, Import(From->getRParenLoc()));
8335 } else if (From->isDelegatingInitializer()) {
8336 TypeSourceInfo *ToTInfo = Import(From->getTypeSourceInfo());
8337 if (!ToTInfo && From->getTypeSourceInfo())
8338 return nullptr;
8339
8340 return new (ToContext)
8341 CXXCtorInitializer(ToContext, ToTInfo, Import(From->getLParenLoc()),
8342 ToExpr, Import(From->getRParenLoc()));
8343 } else {
8344 return nullptr;
8345 }
Balazs Kerideaf7ab2018-11-28 13:21:26 +00008346}
Sean Callanandd2c1742016-05-16 20:48:03 +00008347
Balazs Keri4a3d7582018-11-27 18:36:31 +00008348Expected<CXXBaseSpecifier *>
Davide Italianofaee83d2018-11-28 19:15:23 +00008349ASTImporter::Import_New(const CXXBaseSpecifier *From) {
8350 CXXBaseSpecifier *To = Import(From);
8351 if (!To && From)
8352 return llvm::make_error<ImportError>();
8353 return To;
8354}
8355CXXBaseSpecifier *ASTImporter::Import(const CXXBaseSpecifier *BaseSpec) {
Aleksei Sidorina693b372016-09-28 10:16:56 +00008356 auto Pos = ImportedCXXBaseSpecifiers.find(BaseSpec);
8357 if (Pos != ImportedCXXBaseSpecifiers.end())
8358 return Pos->second;
8359
8360 CXXBaseSpecifier *Imported = new (ToContext) CXXBaseSpecifier(
Davide Italianofaee83d2018-11-28 19:15:23 +00008361 Import(BaseSpec->getSourceRange()),
8362 BaseSpec->isVirtual(), BaseSpec->isBaseOfClass(),
8363 BaseSpec->getAccessSpecifierAsWritten(),
8364 Import(BaseSpec->getTypeSourceInfo()),
8365 Import(BaseSpec->getEllipsisLoc()));
Aleksei Sidorina693b372016-09-28 10:16:56 +00008366 ImportedCXXBaseSpecifiers[BaseSpec] = Imported;
8367 return Imported;
8368}
8369
Balazs Keri3b30d652018-10-19 13:32:20 +00008370Error ASTImporter::ImportDefinition_New(Decl *From) {
Douglas Gregor0a791672011-01-18 03:11:38 +00008371 Decl *To = Import(From);
8372 if (!To)
Balazs Keri3b30d652018-10-19 13:32:20 +00008373 return llvm::make_error<ImportError>();
Fangrui Song6907ce22018-07-30 19:24:48 +00008374
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00008375 if (auto *FromDC = cast<DeclContext>(From)) {
Douglas Gregor0a791672011-01-18 03:11:38 +00008376 ASTNodeImporter Importer(*this);
Fangrui Song6907ce22018-07-30 19:24:48 +00008377
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00008378 if (auto *ToRecord = dyn_cast<RecordDecl>(To)) {
Sean Callanan53a6bff2011-07-19 22:38:25 +00008379 if (!ToRecord->getDefinition()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00008380 return Importer.ImportDefinition(
8381 cast<RecordDecl>(FromDC), ToRecord,
8382 ASTNodeImporter::IDK_Everything);
Fangrui Song6907ce22018-07-30 19:24:48 +00008383 }
Sean Callanan53a6bff2011-07-19 22:38:25 +00008384 }
Douglas Gregord451ea92011-07-29 23:31:30 +00008385
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00008386 if (auto *ToEnum = dyn_cast<EnumDecl>(To)) {
Douglas Gregord451ea92011-07-29 23:31:30 +00008387 if (!ToEnum->getDefinition()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00008388 return Importer.ImportDefinition(
8389 cast<EnumDecl>(FromDC), ToEnum, ASTNodeImporter::IDK_Everything);
Fangrui Song6907ce22018-07-30 19:24:48 +00008390 }
Douglas Gregord451ea92011-07-29 23:31:30 +00008391 }
Fangrui Song6907ce22018-07-30 19:24:48 +00008392
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00008393 if (auto *ToIFace = dyn_cast<ObjCInterfaceDecl>(To)) {
Douglas Gregor2aa53772012-01-24 17:42:07 +00008394 if (!ToIFace->getDefinition()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00008395 return Importer.ImportDefinition(
8396 cast<ObjCInterfaceDecl>(FromDC), ToIFace,
8397 ASTNodeImporter::IDK_Everything);
Douglas Gregor2aa53772012-01-24 17:42:07 +00008398 }
8399 }
Douglas Gregord451ea92011-07-29 23:31:30 +00008400
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00008401 if (auto *ToProto = dyn_cast<ObjCProtocolDecl>(To)) {
Douglas Gregor2aa53772012-01-24 17:42:07 +00008402 if (!ToProto->getDefinition()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00008403 return Importer.ImportDefinition(
8404 cast<ObjCProtocolDecl>(FromDC), ToProto,
8405 ASTNodeImporter::IDK_Everything);
Douglas Gregor2aa53772012-01-24 17:42:07 +00008406 }
8407 }
Fangrui Song6907ce22018-07-30 19:24:48 +00008408
Balazs Keri3b30d652018-10-19 13:32:20 +00008409 return Importer.ImportDeclContext(FromDC, true);
Douglas Gregor0a791672011-01-18 03:11:38 +00008410 }
Balazs Keri3b30d652018-10-19 13:32:20 +00008411
8412 return Error::success();
8413}
8414
8415void ASTImporter::ImportDefinition(Decl *From) {
8416 Error Err = ImportDefinition_New(From);
8417 llvm::consumeError(std::move(Err));
Douglas Gregor0a791672011-01-18 03:11:38 +00008418}
8419
Balazs Keri4a3d7582018-11-27 18:36:31 +00008420Expected<DeclarationName> ASTImporter::Import_New(DeclarationName FromName) {
Davide Italianofaee83d2018-11-28 19:15:23 +00008421 DeclarationName ToName = Import(FromName);
8422 if (!ToName && FromName)
8423 return llvm::make_error<ImportError>();
8424 return ToName;
8425}
8426DeclarationName ASTImporter::Import(DeclarationName FromName) {
Douglas Gregor96e578d2010-02-05 17:54:41 +00008427 if (!FromName)
Davide Italianofaee83d2018-11-28 19:15:23 +00008428 return {};
Douglas Gregor96e578d2010-02-05 17:54:41 +00008429
8430 switch (FromName.getNameKind()) {
8431 case DeclarationName::Identifier:
Davide Italianofaee83d2018-11-28 19:15:23 +00008432 return Import(FromName.getAsIdentifierInfo());
Douglas Gregor96e578d2010-02-05 17:54:41 +00008433
8434 case DeclarationName::ObjCZeroArgSelector:
8435 case DeclarationName::ObjCOneArgSelector:
8436 case DeclarationName::ObjCMultiArgSelector:
Davide Italianofaee83d2018-11-28 19:15:23 +00008437 return Import(FromName.getObjCSelector());
Douglas Gregor96e578d2010-02-05 17:54:41 +00008438
8439 case DeclarationName::CXXConstructorName: {
Davide Italianofaee83d2018-11-28 19:15:23 +00008440 QualType T = Import(FromName.getCXXNameType());
8441 if (T.isNull())
8442 return {};
8443
8444 return ToContext.DeclarationNames.getCXXConstructorName(
8445 ToContext.getCanonicalType(T));
Douglas Gregor96e578d2010-02-05 17:54:41 +00008446 }
8447
8448 case DeclarationName::CXXDestructorName: {
Davide Italianofaee83d2018-11-28 19:15:23 +00008449 QualType T = Import(FromName.getCXXNameType());
8450 if (T.isNull())
8451 return {};
8452
8453 return ToContext.DeclarationNames.getCXXDestructorName(
8454 ToContext.getCanonicalType(T));
Douglas Gregor96e578d2010-02-05 17:54:41 +00008455 }
8456
Richard Smith35845152017-02-07 01:37:30 +00008457 case DeclarationName::CXXDeductionGuideName: {
Davide Italianofaee83d2018-11-28 19:15:23 +00008458 auto *Template = cast_or_null<TemplateDecl>(
8459 Import(FromName.getCXXDeductionGuideTemplate()));
8460 if (!Template)
8461 return {};
8462 return ToContext.DeclarationNames.getCXXDeductionGuideName(Template);
Richard Smith35845152017-02-07 01:37:30 +00008463 }
8464
Douglas Gregor96e578d2010-02-05 17:54:41 +00008465 case DeclarationName::CXXConversionFunctionName: {
Davide Italianofaee83d2018-11-28 19:15:23 +00008466 QualType T = Import(FromName.getCXXNameType());
8467 if (T.isNull())
8468 return {};
8469
8470 return ToContext.DeclarationNames.getCXXConversionFunctionName(
8471 ToContext.getCanonicalType(T));
Douglas Gregor96e578d2010-02-05 17:54:41 +00008472 }
8473
8474 case DeclarationName::CXXOperatorName:
8475 return ToContext.DeclarationNames.getCXXOperatorName(
8476 FromName.getCXXOverloadedOperator());
8477
8478 case DeclarationName::CXXLiteralOperatorName:
8479 return ToContext.DeclarationNames.getCXXLiteralOperatorName(
Davide Italianofaee83d2018-11-28 19:15:23 +00008480 Import(FromName.getCXXLiteralIdentifier()));
Douglas Gregor96e578d2010-02-05 17:54:41 +00008481
8482 case DeclarationName::CXXUsingDirective:
8483 // FIXME: STATICS!
8484 return DeclarationName::getUsingDirectiveName();
8485 }
8486
David Blaikiee4d798f2012-01-20 21:50:17 +00008487 llvm_unreachable("Invalid DeclarationName Kind!");
Douglas Gregor96e578d2010-02-05 17:54:41 +00008488}
8489
Douglas Gregore2e50d332010-12-01 01:36:18 +00008490IdentifierInfo *ASTImporter::Import(const IdentifierInfo *FromId) {
Douglas Gregor96e578d2010-02-05 17:54:41 +00008491 if (!FromId)
Craig Topper36250ad2014-05-12 05:36:57 +00008492 return nullptr;
Douglas Gregor96e578d2010-02-05 17:54:41 +00008493
Sean Callananf94ef1d2016-05-14 06:11:19 +00008494 IdentifierInfo *ToId = &ToContext.Idents.get(FromId->getName());
8495
8496 if (!ToId->getBuiltinID() && FromId->getBuiltinID())
8497 ToId->setBuiltinID(FromId->getBuiltinID());
8498
8499 return ToId;
Douglas Gregor96e578d2010-02-05 17:54:41 +00008500}
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00008501
Balazs Keri4a3d7582018-11-27 18:36:31 +00008502Expected<Selector> ASTImporter::Import_New(Selector FromSel) {
Davide Italianofaee83d2018-11-28 19:15:23 +00008503 Selector ToSel = Import(FromSel);
8504 if (ToSel.isNull() && !FromSel.isNull())
8505 return llvm::make_error<ImportError>();
8506 return ToSel;
8507}
8508Selector ASTImporter::Import(Selector FromSel) {
Douglas Gregor43f54792010-02-17 02:12:47 +00008509 if (FromSel.isNull())
Davide Italianofaee83d2018-11-28 19:15:23 +00008510 return {};
Douglas Gregor43f54792010-02-17 02:12:47 +00008511
Chris Lattner0e62c1c2011-07-23 10:55:15 +00008512 SmallVector<IdentifierInfo *, 4> Idents;
Douglas Gregor43f54792010-02-17 02:12:47 +00008513 Idents.push_back(Import(FromSel.getIdentifierInfoForSlot(0)));
8514 for (unsigned I = 1, N = FromSel.getNumArgs(); I < N; ++I)
8515 Idents.push_back(Import(FromSel.getIdentifierInfoForSlot(I)));
8516 return ToContext.Selectors.getSelector(FromSel.getNumArgs(), Idents.data());
8517}
8518
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00008519DeclarationName ASTImporter::HandleNameConflict(DeclarationName Name,
8520 DeclContext *DC,
8521 unsigned IDNS,
8522 NamedDecl **Decls,
8523 unsigned NumDecls) {
8524 return Name;
8525}
8526
8527DiagnosticBuilder ASTImporter::ToDiag(SourceLocation Loc, unsigned DiagID) {
Richard Smith5bb4cdf2012-12-20 02:22:15 +00008528 if (LastDiagFromFrom)
8529 ToContext.getDiagnostics().notePriorDiagnosticFrom(
8530 FromContext.getDiagnostics());
8531 LastDiagFromFrom = false;
Argyrios Kyrtzidisd0040642010-11-18 20:06:41 +00008532 return ToContext.getDiagnostics().Report(Loc, DiagID);
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00008533}
8534
8535DiagnosticBuilder ASTImporter::FromDiag(SourceLocation Loc, unsigned DiagID) {
Richard Smith5bb4cdf2012-12-20 02:22:15 +00008536 if (!LastDiagFromFrom)
8537 FromContext.getDiagnostics().notePriorDiagnosticFrom(
8538 ToContext.getDiagnostics());
8539 LastDiagFromFrom = true;
Argyrios Kyrtzidisd0040642010-11-18 20:06:41 +00008540 return FromContext.getDiagnostics().Report(Loc, DiagID);
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00008541}
Douglas Gregor8cdbe642010-02-12 23:44:20 +00008542
Douglas Gregor2e15c842012-02-01 21:00:38 +00008543void ASTImporter::CompleteDecl (Decl *D) {
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00008544 if (auto *ID = dyn_cast<ObjCInterfaceDecl>(D)) {
Douglas Gregor2e15c842012-02-01 21:00:38 +00008545 if (!ID->getDefinition())
8546 ID->startDefinition();
8547 }
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00008548 else if (auto *PD = dyn_cast<ObjCProtocolDecl>(D)) {
Douglas Gregor2e15c842012-02-01 21:00:38 +00008549 if (!PD->getDefinition())
8550 PD->startDefinition();
8551 }
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00008552 else if (auto *TD = dyn_cast<TagDecl>(D)) {
Douglas Gregor2e15c842012-02-01 21:00:38 +00008553 if (!TD->getDefinition() && !TD->isBeingDefined()) {
8554 TD->startDefinition();
8555 TD->setCompleteDefinition(true);
8556 }
8557 }
8558 else {
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00008559 assert(0 && "CompleteDecl called on a Decl that can't be completed");
Douglas Gregor2e15c842012-02-01 21:00:38 +00008560 }
8561}
8562
Gabor Marton26f72a92018-07-12 09:42:05 +00008563Decl *ASTImporter::MapImported(Decl *From, Decl *To) {
8564 llvm::DenseMap<Decl *, Decl *>::iterator Pos = ImportedDecls.find(From);
8565 assert((Pos == ImportedDecls.end() || Pos->second == To) &&
8566 "Try to import an already imported Decl");
8567 if (Pos != ImportedDecls.end())
8568 return Pos->second;
Douglas Gregor8cdbe642010-02-12 23:44:20 +00008569 ImportedDecls[From] = To;
Gabor Marton458d1452019-02-14 13:07:03 +00008570 // This mapping should be maintained only in this function. Therefore do not
8571 // check for additional consistency.
8572 ImportedFromDecls[To] = From;
Douglas Gregor8cdbe642010-02-12 23:44:20 +00008573 return To;
Daniel Dunbar9ced5422010-02-13 20:24:39 +00008574}
Douglas Gregorb4964f72010-02-15 23:54:17 +00008575
Douglas Gregordd6006f2012-07-17 21:16:27 +00008576bool ASTImporter::IsStructurallyEquivalent(QualType From, QualType To,
8577 bool Complain) {
John McCall424cec92011-01-19 06:33:43 +00008578 llvm::DenseMap<const Type *, const Type *>::iterator Pos
Douglas Gregorb4964f72010-02-15 23:54:17 +00008579 = ImportedTypes.find(From.getTypePtr());
8580 if (Pos != ImportedTypes.end() && ToContext.hasSameType(Import(From), To))
8581 return true;
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00008582
Douglas Gregordd6006f2012-07-17 21:16:27 +00008583 StructuralEquivalenceContext Ctx(FromContext, ToContext, NonEquivalentDecls,
Gabor Marton26f72a92018-07-12 09:42:05 +00008584 getStructuralEquivalenceKind(*this), false,
8585 Complain);
Gabor Marton950fb572018-07-17 12:39:27 +00008586 return Ctx.IsEquivalent(From, To);
Douglas Gregorb4964f72010-02-15 23:54:17 +00008587}