blob: 76407d54415e202c888ca1851cbaf2f05b65969c [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 Marton950fb572018-07-17 12:39:27 +0000442 bool IsStructuralMatch(Decl *From, Decl *To, bool Complain);
Douglas Gregordd6006f2012-07-17 21:16:27 +0000443 bool IsStructuralMatch(RecordDecl *FromRecord, RecordDecl *ToRecord,
444 bool Complain = true);
Larisse Voufo39a1e502013-08-06 01:03:05 +0000445 bool IsStructuralMatch(VarDecl *FromVar, VarDecl *ToVar,
446 bool Complain = true);
Douglas Gregor3996e242010-02-15 22:01:00 +0000447 bool IsStructuralMatch(EnumDecl *FromEnum, EnumDecl *ToRecord);
Douglas Gregor91155082012-11-14 22:29:20 +0000448 bool IsStructuralMatch(EnumConstantDecl *FromEC, EnumConstantDecl *ToEC);
Aleksei Sidorin7f758b62017-12-27 17:04:42 +0000449 bool IsStructuralMatch(FunctionTemplateDecl *From,
450 FunctionTemplateDecl *To);
Balazs Keric7797c42018-07-11 09:37:24 +0000451 bool IsStructuralMatch(FunctionDecl *From, FunctionDecl *To);
Douglas Gregora082a492010-11-30 19:14:50 +0000452 bool IsStructuralMatch(ClassTemplateDecl *From, ClassTemplateDecl *To);
Larisse Voufo39a1e502013-08-06 01:03:05 +0000453 bool IsStructuralMatch(VarTemplateDecl *From, VarTemplateDecl *To);
Balazs Keri3b30d652018-10-19 13:32:20 +0000454 ExpectedDecl VisitDecl(Decl *D);
455 ExpectedDecl VisitImportDecl(ImportDecl *D);
456 ExpectedDecl VisitEmptyDecl(EmptyDecl *D);
457 ExpectedDecl VisitAccessSpecDecl(AccessSpecDecl *D);
458 ExpectedDecl VisitStaticAssertDecl(StaticAssertDecl *D);
459 ExpectedDecl VisitTranslationUnitDecl(TranslationUnitDecl *D);
460 ExpectedDecl VisitNamespaceDecl(NamespaceDecl *D);
461 ExpectedDecl VisitNamespaceAliasDecl(NamespaceAliasDecl *D);
462 ExpectedDecl VisitTypedefNameDecl(TypedefNameDecl *D, bool IsAlias);
463 ExpectedDecl VisitTypedefDecl(TypedefDecl *D);
464 ExpectedDecl VisitTypeAliasDecl(TypeAliasDecl *D);
465 ExpectedDecl VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D);
466 ExpectedDecl VisitLabelDecl(LabelDecl *D);
467 ExpectedDecl VisitEnumDecl(EnumDecl *D);
468 ExpectedDecl VisitRecordDecl(RecordDecl *D);
469 ExpectedDecl VisitEnumConstantDecl(EnumConstantDecl *D);
470 ExpectedDecl VisitFunctionDecl(FunctionDecl *D);
471 ExpectedDecl VisitCXXMethodDecl(CXXMethodDecl *D);
472 ExpectedDecl VisitCXXConstructorDecl(CXXConstructorDecl *D);
473 ExpectedDecl VisitCXXDestructorDecl(CXXDestructorDecl *D);
474 ExpectedDecl VisitCXXConversionDecl(CXXConversionDecl *D);
475 ExpectedDecl VisitFieldDecl(FieldDecl *D);
476 ExpectedDecl VisitIndirectFieldDecl(IndirectFieldDecl *D);
477 ExpectedDecl VisitFriendDecl(FriendDecl *D);
478 ExpectedDecl VisitObjCIvarDecl(ObjCIvarDecl *D);
479 ExpectedDecl VisitVarDecl(VarDecl *D);
480 ExpectedDecl VisitImplicitParamDecl(ImplicitParamDecl *D);
481 ExpectedDecl VisitParmVarDecl(ParmVarDecl *D);
482 ExpectedDecl VisitObjCMethodDecl(ObjCMethodDecl *D);
483 ExpectedDecl VisitObjCTypeParamDecl(ObjCTypeParamDecl *D);
484 ExpectedDecl VisitObjCCategoryDecl(ObjCCategoryDecl *D);
485 ExpectedDecl VisitObjCProtocolDecl(ObjCProtocolDecl *D);
486 ExpectedDecl VisitLinkageSpecDecl(LinkageSpecDecl *D);
487 ExpectedDecl VisitUsingDecl(UsingDecl *D);
488 ExpectedDecl VisitUsingShadowDecl(UsingShadowDecl *D);
489 ExpectedDecl VisitUsingDirectiveDecl(UsingDirectiveDecl *D);
490 ExpectedDecl VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D);
491 ExpectedDecl VisitUnresolvedUsingTypenameDecl(UnresolvedUsingTypenameDecl *D);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +0000492
Balazs Keri3b30d652018-10-19 13:32:20 +0000493 Expected<ObjCTypeParamList *>
494 ImportObjCTypeParamList(ObjCTypeParamList *list);
495
496 ExpectedDecl VisitObjCInterfaceDecl(ObjCInterfaceDecl *D);
497 ExpectedDecl VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D);
498 ExpectedDecl VisitObjCImplementationDecl(ObjCImplementationDecl *D);
499 ExpectedDecl VisitObjCPropertyDecl(ObjCPropertyDecl *D);
500 ExpectedDecl VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D);
501 ExpectedDecl VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D);
502 ExpectedDecl VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D);
503 ExpectedDecl VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D);
504 ExpectedDecl VisitClassTemplateDecl(ClassTemplateDecl *D);
505 ExpectedDecl VisitClassTemplateSpecializationDecl(
Douglas Gregore2e50d332010-12-01 01:36:18 +0000506 ClassTemplateSpecializationDecl *D);
Balazs Keri3b30d652018-10-19 13:32:20 +0000507 ExpectedDecl VisitVarTemplateDecl(VarTemplateDecl *D);
508 ExpectedDecl VisitVarTemplateSpecializationDecl(VarTemplateSpecializationDecl *D);
509 ExpectedDecl VisitFunctionTemplateDecl(FunctionTemplateDecl *D);
Larisse Voufo39a1e502013-08-06 01:03:05 +0000510
Douglas Gregor7eeb5972010-02-11 19:21:55 +0000511 // Importing statements
Balazs Keri3b30d652018-10-19 13:32:20 +0000512 ExpectedStmt VisitStmt(Stmt *S);
513 ExpectedStmt VisitGCCAsmStmt(GCCAsmStmt *S);
514 ExpectedStmt VisitDeclStmt(DeclStmt *S);
515 ExpectedStmt VisitNullStmt(NullStmt *S);
516 ExpectedStmt VisitCompoundStmt(CompoundStmt *S);
517 ExpectedStmt VisitCaseStmt(CaseStmt *S);
518 ExpectedStmt VisitDefaultStmt(DefaultStmt *S);
519 ExpectedStmt VisitLabelStmt(LabelStmt *S);
520 ExpectedStmt VisitAttributedStmt(AttributedStmt *S);
521 ExpectedStmt VisitIfStmt(IfStmt *S);
522 ExpectedStmt VisitSwitchStmt(SwitchStmt *S);
523 ExpectedStmt VisitWhileStmt(WhileStmt *S);
524 ExpectedStmt VisitDoStmt(DoStmt *S);
525 ExpectedStmt VisitForStmt(ForStmt *S);
526 ExpectedStmt VisitGotoStmt(GotoStmt *S);
527 ExpectedStmt VisitIndirectGotoStmt(IndirectGotoStmt *S);
528 ExpectedStmt VisitContinueStmt(ContinueStmt *S);
529 ExpectedStmt VisitBreakStmt(BreakStmt *S);
530 ExpectedStmt VisitReturnStmt(ReturnStmt *S);
Sean Callanan59721b32015-04-28 18:41:46 +0000531 // FIXME: MSAsmStmt
532 // FIXME: SEHExceptStmt
533 // FIXME: SEHFinallyStmt
534 // FIXME: SEHTryStmt
535 // FIXME: SEHLeaveStmt
536 // FIXME: CapturedStmt
Balazs Keri3b30d652018-10-19 13:32:20 +0000537 ExpectedStmt VisitCXXCatchStmt(CXXCatchStmt *S);
538 ExpectedStmt VisitCXXTryStmt(CXXTryStmt *S);
539 ExpectedStmt VisitCXXForRangeStmt(CXXForRangeStmt *S);
Sean Callanan59721b32015-04-28 18:41:46 +0000540 // FIXME: MSDependentExistsStmt
Balazs Keri3b30d652018-10-19 13:32:20 +0000541 ExpectedStmt VisitObjCForCollectionStmt(ObjCForCollectionStmt *S);
542 ExpectedStmt VisitObjCAtCatchStmt(ObjCAtCatchStmt *S);
543 ExpectedStmt VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S);
544 ExpectedStmt VisitObjCAtTryStmt(ObjCAtTryStmt *S);
545 ExpectedStmt VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *S);
546 ExpectedStmt VisitObjCAtThrowStmt(ObjCAtThrowStmt *S);
547 ExpectedStmt VisitObjCAutoreleasePoolStmt(ObjCAutoreleasePoolStmt *S);
Douglas Gregor7eeb5972010-02-11 19:21:55 +0000548
549 // Importing expressions
Balazs Keri3b30d652018-10-19 13:32:20 +0000550 ExpectedStmt VisitExpr(Expr *E);
551 ExpectedStmt VisitVAArgExpr(VAArgExpr *E);
552 ExpectedStmt VisitGNUNullExpr(GNUNullExpr *E);
553 ExpectedStmt VisitPredefinedExpr(PredefinedExpr *E);
554 ExpectedStmt VisitDeclRefExpr(DeclRefExpr *E);
555 ExpectedStmt VisitImplicitValueInitExpr(ImplicitValueInitExpr *E);
556 ExpectedStmt VisitDesignatedInitExpr(DesignatedInitExpr *E);
557 ExpectedStmt VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E);
558 ExpectedStmt VisitIntegerLiteral(IntegerLiteral *E);
559 ExpectedStmt VisitFloatingLiteral(FloatingLiteral *E);
560 ExpectedStmt VisitImaginaryLiteral(ImaginaryLiteral *E);
561 ExpectedStmt VisitCharacterLiteral(CharacterLiteral *E);
562 ExpectedStmt VisitStringLiteral(StringLiteral *E);
563 ExpectedStmt VisitCompoundLiteralExpr(CompoundLiteralExpr *E);
564 ExpectedStmt VisitAtomicExpr(AtomicExpr *E);
565 ExpectedStmt VisitAddrLabelExpr(AddrLabelExpr *E);
Bill Wendling8003edc2018-11-09 00:41:36 +0000566 ExpectedStmt VisitConstantExpr(ConstantExpr *E);
Balazs Keri3b30d652018-10-19 13:32:20 +0000567 ExpectedStmt VisitParenExpr(ParenExpr *E);
568 ExpectedStmt VisitParenListExpr(ParenListExpr *E);
569 ExpectedStmt VisitStmtExpr(StmtExpr *E);
570 ExpectedStmt VisitUnaryOperator(UnaryOperator *E);
571 ExpectedStmt VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *E);
572 ExpectedStmt VisitBinaryOperator(BinaryOperator *E);
573 ExpectedStmt VisitConditionalOperator(ConditionalOperator *E);
574 ExpectedStmt VisitBinaryConditionalOperator(BinaryConditionalOperator *E);
575 ExpectedStmt VisitOpaqueValueExpr(OpaqueValueExpr *E);
576 ExpectedStmt VisitArrayTypeTraitExpr(ArrayTypeTraitExpr *E);
577 ExpectedStmt VisitExpressionTraitExpr(ExpressionTraitExpr *E);
578 ExpectedStmt VisitArraySubscriptExpr(ArraySubscriptExpr *E);
579 ExpectedStmt VisitCompoundAssignOperator(CompoundAssignOperator *E);
580 ExpectedStmt VisitImplicitCastExpr(ImplicitCastExpr *E);
581 ExpectedStmt VisitExplicitCastExpr(ExplicitCastExpr *E);
582 ExpectedStmt VisitOffsetOfExpr(OffsetOfExpr *OE);
583 ExpectedStmt VisitCXXThrowExpr(CXXThrowExpr *E);
584 ExpectedStmt VisitCXXNoexceptExpr(CXXNoexceptExpr *E);
585 ExpectedStmt VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E);
586 ExpectedStmt VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E);
587 ExpectedStmt VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E);
588 ExpectedStmt VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E);
589 ExpectedStmt VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *E);
590 ExpectedStmt VisitPackExpansionExpr(PackExpansionExpr *E);
591 ExpectedStmt VisitSizeOfPackExpr(SizeOfPackExpr *E);
592 ExpectedStmt VisitCXXNewExpr(CXXNewExpr *E);
593 ExpectedStmt VisitCXXDeleteExpr(CXXDeleteExpr *E);
594 ExpectedStmt VisitCXXConstructExpr(CXXConstructExpr *E);
595 ExpectedStmt VisitCXXMemberCallExpr(CXXMemberCallExpr *E);
596 ExpectedStmt VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E);
597 ExpectedStmt VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E);
598 ExpectedStmt VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr *E);
599 ExpectedStmt VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E);
600 ExpectedStmt VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E);
601 ExpectedStmt VisitExprWithCleanups(ExprWithCleanups *E);
602 ExpectedStmt VisitCXXThisExpr(CXXThisExpr *E);
603 ExpectedStmt VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E);
604 ExpectedStmt VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E);
605 ExpectedStmt VisitMemberExpr(MemberExpr *E);
606 ExpectedStmt VisitCallExpr(CallExpr *E);
607 ExpectedStmt VisitLambdaExpr(LambdaExpr *LE);
608 ExpectedStmt VisitInitListExpr(InitListExpr *E);
609 ExpectedStmt VisitCXXStdInitializerListExpr(CXXStdInitializerListExpr *E);
610 ExpectedStmt VisitCXXInheritedCtorInitExpr(CXXInheritedCtorInitExpr *E);
611 ExpectedStmt VisitArrayInitLoopExpr(ArrayInitLoopExpr *E);
612 ExpectedStmt VisitArrayInitIndexExpr(ArrayInitIndexExpr *E);
613 ExpectedStmt VisitCXXDefaultInitExpr(CXXDefaultInitExpr *E);
614 ExpectedStmt VisitCXXNamedCastExpr(CXXNamedCastExpr *E);
615 ExpectedStmt VisitSubstNonTypeTemplateParmExpr(SubstNonTypeTemplateParmExpr *E);
616 ExpectedStmt VisitTypeTraitExpr(TypeTraitExpr *E);
617 ExpectedStmt VisitCXXTypeidExpr(CXXTypeidExpr *E);
Aleksei Sidorin855086d2017-01-23 09:30:36 +0000618
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +0000619 template<typename IIter, typename OIter>
Balazs Keri3b30d652018-10-19 13:32:20 +0000620 Error ImportArrayChecked(IIter Ibegin, IIter Iend, OIter Obegin) {
Eugene Zelenko9a9c8232018-04-09 21:54:38 +0000621 using ItemT = typename std::remove_reference<decltype(*Obegin)>::type;
Balazs Keri3b30d652018-10-19 13:32:20 +0000622 for (; Ibegin != Iend; ++Ibegin, ++Obegin) {
623 Expected<ItemT> ToOrErr = import(*Ibegin);
624 if (!ToOrErr)
625 return ToOrErr.takeError();
626 *Obegin = *ToOrErr;
627 }
628 return Error::success();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +0000629 }
630
Balazs Keri3b30d652018-10-19 13:32:20 +0000631 // Import every item from a container structure into an output container.
632 // If error occurs, stops at first error and returns the error.
633 // The output container should have space for all needed elements (it is not
634 // expanded, new items are put into from the beginning).
Aleksei Sidorina693b372016-09-28 10:16:56 +0000635 template<typename InContainerTy, typename OutContainerTy>
Balazs Keri3b30d652018-10-19 13:32:20 +0000636 Error ImportContainerChecked(
637 const InContainerTy &InContainer, OutContainerTy &OutContainer) {
638 return ImportArrayChecked(
639 InContainer.begin(), InContainer.end(), OutContainer.begin());
Aleksei Sidorina693b372016-09-28 10:16:56 +0000640 }
641
642 template<typename InContainerTy, typename OIter>
Balazs Keri3b30d652018-10-19 13:32:20 +0000643 Error ImportArrayChecked(const InContainerTy &InContainer, OIter Obegin) {
Aleksei Sidorina693b372016-09-28 10:16:56 +0000644 return ImportArrayChecked(InContainer.begin(), InContainer.end(), Obegin);
645 }
Lang Hames19e07e12017-06-20 21:06:00 +0000646
Lang Hames19e07e12017-06-20 21:06:00 +0000647 void ImportOverrides(CXXMethodDecl *ToMethod, CXXMethodDecl *FromMethod);
Gabor Marton5254e642018-06-27 13:32:50 +0000648
Balazs Keri3b30d652018-10-19 13:32:20 +0000649 Expected<FunctionDecl *> FindFunctionTemplateSpecialization(
650 FunctionDecl *FromFD);
Douglas Gregor96e578d2010-02-05 17:54:41 +0000651 };
Aleksei Sidorin782bfcf2018-02-14 11:39:33 +0000652
Balazs Keri3b30d652018-10-19 13:32:20 +0000653// FIXME: Temporary until every import returns Expected.
654template <>
655Expected<TemplateName> ASTNodeImporter::import(const TemplateName &From) {
656 TemplateName To = Importer.Import(From);
657 if (To.isNull() && !From.isNull())
658 return make_error<ImportError>();
659 return To;
660}
661
Aleksei Sidorin782bfcf2018-02-14 11:39:33 +0000662template <typename InContainerTy>
Balazs Keri3b30d652018-10-19 13:32:20 +0000663Error ASTNodeImporter::ImportTemplateArgumentListInfo(
Aleksei Sidorin782bfcf2018-02-14 11:39:33 +0000664 SourceLocation FromLAngleLoc, SourceLocation FromRAngleLoc,
665 const InContainerTy &Container, TemplateArgumentListInfo &Result) {
Balazs Keri3b30d652018-10-19 13:32:20 +0000666 auto ToLAngleLocOrErr = import(FromLAngleLoc);
667 if (!ToLAngleLocOrErr)
668 return ToLAngleLocOrErr.takeError();
669 auto ToRAngleLocOrErr = import(FromRAngleLoc);
670 if (!ToRAngleLocOrErr)
671 return ToRAngleLocOrErr.takeError();
672
673 TemplateArgumentListInfo ToTAInfo(*ToLAngleLocOrErr, *ToRAngleLocOrErr);
674 if (auto Err = ImportTemplateArgumentListInfo(Container, ToTAInfo))
675 return Err;
Aleksei Sidorin782bfcf2018-02-14 11:39:33 +0000676 Result = ToTAInfo;
Balazs Keri3b30d652018-10-19 13:32:20 +0000677 return Error::success();
Alexander Kornienkoab9db512015-06-22 23:07:51 +0000678}
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +0000679
Aleksei Sidorin782bfcf2018-02-14 11:39:33 +0000680template <>
Balazs Keri3b30d652018-10-19 13:32:20 +0000681Error ASTNodeImporter::ImportTemplateArgumentListInfo<TemplateArgumentListInfo>(
Aleksei Sidorin782bfcf2018-02-14 11:39:33 +0000682 const TemplateArgumentListInfo &From, TemplateArgumentListInfo &Result) {
683 return ImportTemplateArgumentListInfo(
684 From.getLAngleLoc(), From.getRAngleLoc(), From.arguments(), Result);
685}
686
687template <>
Balazs Keri3b30d652018-10-19 13:32:20 +0000688Error ASTNodeImporter::ImportTemplateArgumentListInfo<
689 ASTTemplateArgumentListInfo>(
690 const ASTTemplateArgumentListInfo &From,
691 TemplateArgumentListInfo &Result) {
692 return ImportTemplateArgumentListInfo(
693 From.LAngleLoc, From.RAngleLoc, From.arguments(), Result);
Aleksei Sidorin782bfcf2018-02-14 11:39:33 +0000694}
695
Balazs Keri3b30d652018-10-19 13:32:20 +0000696Expected<ASTNodeImporter::FunctionTemplateAndArgsTy>
Gabor Marton5254e642018-06-27 13:32:50 +0000697ASTNodeImporter::ImportFunctionTemplateWithTemplateArgsFromSpecialization(
698 FunctionDecl *FromFD) {
699 assert(FromFD->getTemplatedKind() ==
Balazs Keri3b30d652018-10-19 13:32:20 +0000700 FunctionDecl::TK_FunctionTemplateSpecialization);
701
702 FunctionTemplateAndArgsTy Result;
703
Gabor Marton5254e642018-06-27 13:32:50 +0000704 auto *FTSInfo = FromFD->getTemplateSpecializationInfo();
Balazs Keri3b30d652018-10-19 13:32:20 +0000705 if (Error Err = importInto(std::get<0>(Result), FTSInfo->getTemplate()))
706 return std::move(Err);
Gabor Marton5254e642018-06-27 13:32:50 +0000707
708 // Import template arguments.
709 auto TemplArgs = FTSInfo->TemplateArguments->asArray();
Balazs Keri3b30d652018-10-19 13:32:20 +0000710 if (Error Err = ImportTemplateArguments(TemplArgs.data(), TemplArgs.size(),
711 std::get<1>(Result)))
712 return std::move(Err);
Gabor Marton5254e642018-06-27 13:32:50 +0000713
Balazs Keri3b30d652018-10-19 13:32:20 +0000714 return Result;
715}
716
717template <>
718Expected<TemplateParameterList *>
719ASTNodeImporter::import(TemplateParameterList *From) {
720 SmallVector<NamedDecl *, 4> To(From->size());
721 if (Error Err = ImportContainerChecked(*From, To))
722 return std::move(Err);
723
724 ExpectedExpr ToRequiresClause = import(From->getRequiresClause());
725 if (!ToRequiresClause)
726 return ToRequiresClause.takeError();
727
728 auto ToTemplateLocOrErr = import(From->getTemplateLoc());
729 if (!ToTemplateLocOrErr)
730 return ToTemplateLocOrErr.takeError();
731 auto ToLAngleLocOrErr = import(From->getLAngleLoc());
732 if (!ToLAngleLocOrErr)
733 return ToLAngleLocOrErr.takeError();
734 auto ToRAngleLocOrErr = import(From->getRAngleLoc());
735 if (!ToRAngleLocOrErr)
736 return ToRAngleLocOrErr.takeError();
737
738 return TemplateParameterList::Create(
739 Importer.getToContext(),
740 *ToTemplateLocOrErr,
741 *ToLAngleLocOrErr,
742 To,
743 *ToRAngleLocOrErr,
744 *ToRequiresClause);
745}
746
747template <>
748Expected<TemplateArgument>
749ASTNodeImporter::import(const TemplateArgument &From) {
750 switch (From.getKind()) {
751 case TemplateArgument::Null:
752 return TemplateArgument();
753
754 case TemplateArgument::Type: {
755 ExpectedType ToTypeOrErr = import(From.getAsType());
756 if (!ToTypeOrErr)
757 return ToTypeOrErr.takeError();
758 return TemplateArgument(*ToTypeOrErr);
759 }
760
761 case TemplateArgument::Integral: {
762 ExpectedType ToTypeOrErr = import(From.getIntegralType());
763 if (!ToTypeOrErr)
764 return ToTypeOrErr.takeError();
765 return TemplateArgument(From, *ToTypeOrErr);
766 }
767
768 case TemplateArgument::Declaration: {
769 Expected<ValueDecl *> ToOrErr = import(From.getAsDecl());
770 if (!ToOrErr)
771 return ToOrErr.takeError();
772 ExpectedType ToTypeOrErr = import(From.getParamTypeForDecl());
773 if (!ToTypeOrErr)
774 return ToTypeOrErr.takeError();
775 return TemplateArgument(*ToOrErr, *ToTypeOrErr);
776 }
777
778 case TemplateArgument::NullPtr: {
779 ExpectedType ToTypeOrErr = import(From.getNullPtrType());
780 if (!ToTypeOrErr)
781 return ToTypeOrErr.takeError();
782 return TemplateArgument(*ToTypeOrErr, /*isNullPtr*/true);
783 }
784
785 case TemplateArgument::Template: {
786 Expected<TemplateName> ToTemplateOrErr = import(From.getAsTemplate());
787 if (!ToTemplateOrErr)
788 return ToTemplateOrErr.takeError();
789
790 return TemplateArgument(*ToTemplateOrErr);
791 }
792
793 case TemplateArgument::TemplateExpansion: {
794 Expected<TemplateName> ToTemplateOrErr =
795 import(From.getAsTemplateOrTemplatePattern());
796 if (!ToTemplateOrErr)
797 return ToTemplateOrErr.takeError();
798
799 return TemplateArgument(
800 *ToTemplateOrErr, From.getNumTemplateExpansions());
801 }
802
803 case TemplateArgument::Expression:
804 if (ExpectedExpr ToExpr = import(From.getAsExpr()))
805 return TemplateArgument(*ToExpr);
806 else
807 return ToExpr.takeError();
808
809 case TemplateArgument::Pack: {
810 SmallVector<TemplateArgument, 2> ToPack;
811 ToPack.reserve(From.pack_size());
812 if (Error Err = ImportTemplateArguments(
813 From.pack_begin(), From.pack_size(), ToPack))
814 return std::move(Err);
815
816 return TemplateArgument(
817 llvm::makeArrayRef(ToPack).copy(Importer.getToContext()));
818 }
819 }
820
821 llvm_unreachable("Invalid template argument kind");
822}
823
824template <>
825Expected<TemplateArgumentLoc>
826ASTNodeImporter::import(const TemplateArgumentLoc &TALoc) {
827 Expected<TemplateArgument> ArgOrErr = import(TALoc.getArgument());
828 if (!ArgOrErr)
829 return ArgOrErr.takeError();
830 TemplateArgument Arg = *ArgOrErr;
831
832 TemplateArgumentLocInfo FromInfo = TALoc.getLocInfo();
833
834 TemplateArgumentLocInfo ToInfo;
835 if (Arg.getKind() == TemplateArgument::Expression) {
836 ExpectedExpr E = import(FromInfo.getAsExpr());
837 if (!E)
838 return E.takeError();
839 ToInfo = TemplateArgumentLocInfo(*E);
840 } else if (Arg.getKind() == TemplateArgument::Type) {
841 if (auto TSIOrErr = import(FromInfo.getAsTypeSourceInfo()))
842 ToInfo = TemplateArgumentLocInfo(*TSIOrErr);
843 else
844 return TSIOrErr.takeError();
845 } else {
846 auto ToTemplateQualifierLocOrErr =
847 import(FromInfo.getTemplateQualifierLoc());
848 if (!ToTemplateQualifierLocOrErr)
849 return ToTemplateQualifierLocOrErr.takeError();
850 auto ToTemplateNameLocOrErr = import(FromInfo.getTemplateNameLoc());
851 if (!ToTemplateNameLocOrErr)
852 return ToTemplateNameLocOrErr.takeError();
853 auto ToTemplateEllipsisLocOrErr =
854 import(FromInfo.getTemplateEllipsisLoc());
855 if (!ToTemplateEllipsisLocOrErr)
856 return ToTemplateEllipsisLocOrErr.takeError();
857
858 ToInfo = TemplateArgumentLocInfo(
859 *ToTemplateQualifierLocOrErr,
860 *ToTemplateNameLocOrErr,
861 *ToTemplateEllipsisLocOrErr);
862 }
863
864 return TemplateArgumentLoc(Arg, ToInfo);
865}
866
867template <>
868Expected<DeclGroupRef> ASTNodeImporter::import(const DeclGroupRef &DG) {
869 if (DG.isNull())
870 return DeclGroupRef::Create(Importer.getToContext(), nullptr, 0);
871 size_t NumDecls = DG.end() - DG.begin();
872 SmallVector<Decl *, 1> ToDecls;
873 ToDecls.reserve(NumDecls);
874 for (Decl *FromD : DG) {
875 if (auto ToDOrErr = import(FromD))
876 ToDecls.push_back(*ToDOrErr);
877 else
878 return ToDOrErr.takeError();
879 }
880 return DeclGroupRef::Create(Importer.getToContext(),
881 ToDecls.begin(),
882 NumDecls);
883}
884
885template <>
886Expected<ASTNodeImporter::Designator>
887ASTNodeImporter::import(const Designator &D) {
888 if (D.isFieldDesignator()) {
889 IdentifierInfo *ToFieldName = Importer.Import(D.getFieldName());
890
891 ExpectedSLoc ToDotLocOrErr = import(D.getDotLoc());
892 if (!ToDotLocOrErr)
893 return ToDotLocOrErr.takeError();
894
895 ExpectedSLoc ToFieldLocOrErr = import(D.getFieldLoc());
896 if (!ToFieldLocOrErr)
897 return ToFieldLocOrErr.takeError();
898
899 return Designator(ToFieldName, *ToDotLocOrErr, *ToFieldLocOrErr);
900 }
901
902 ExpectedSLoc ToLBracketLocOrErr = import(D.getLBracketLoc());
903 if (!ToLBracketLocOrErr)
904 return ToLBracketLocOrErr.takeError();
905
906 ExpectedSLoc ToRBracketLocOrErr = import(D.getRBracketLoc());
907 if (!ToRBracketLocOrErr)
908 return ToRBracketLocOrErr.takeError();
909
910 if (D.isArrayDesignator())
911 return Designator(D.getFirstExprIndex(),
912 *ToLBracketLocOrErr, *ToRBracketLocOrErr);
913
914 ExpectedSLoc ToEllipsisLocOrErr = import(D.getEllipsisLoc());
915 if (!ToEllipsisLocOrErr)
916 return ToEllipsisLocOrErr.takeError();
917
918 assert(D.isArrayRangeDesignator());
919 return Designator(
920 D.getFirstExprIndex(), *ToLBracketLocOrErr, *ToEllipsisLocOrErr,
921 *ToRBracketLocOrErr);
922}
923
924template <>
925Expected<LambdaCapture> ASTNodeImporter::import(const LambdaCapture &From) {
926 VarDecl *Var = nullptr;
927 if (From.capturesVariable()) {
928 if (auto VarOrErr = import(From.getCapturedVar()))
929 Var = *VarOrErr;
930 else
931 return VarOrErr.takeError();
932 }
933
934 auto LocationOrErr = import(From.getLocation());
935 if (!LocationOrErr)
936 return LocationOrErr.takeError();
937
938 SourceLocation EllipsisLoc;
939 if (From.isPackExpansion())
940 if (Error Err = importInto(EllipsisLoc, From.getEllipsisLoc()))
941 return std::move(Err);
942
943 return LambdaCapture(
944 *LocationOrErr, From.isImplicit(), From.getCaptureKind(), Var,
945 EllipsisLoc);
Gabor Marton5254e642018-06-27 13:32:50 +0000946}
947
Eugene Zelenko9a9c8232018-04-09 21:54:38 +0000948} // namespace clang
Aleksei Sidorin782bfcf2018-02-14 11:39:33 +0000949
Douglas Gregor3996e242010-02-15 22:01:00 +0000950//----------------------------------------------------------------------------
Douglas Gregor96e578d2010-02-05 17:54:41 +0000951// Import Types
952//----------------------------------------------------------------------------
953
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +0000954using namespace clang;
955
Balazs Keri3b30d652018-10-19 13:32:20 +0000956ExpectedType ASTNodeImporter::VisitType(const Type *T) {
Douglas Gregore4c83e42010-02-09 22:48:33 +0000957 Importer.FromDiag(SourceLocation(), diag::err_unsupported_ast_node)
958 << T->getTypeClassName();
Balazs Keri3b30d652018-10-19 13:32:20 +0000959 return make_error<ImportError>(ImportError::UnsupportedConstruct);
Douglas Gregore4c83e42010-02-09 22:48:33 +0000960}
961
Balazs Keri3b30d652018-10-19 13:32:20 +0000962ExpectedType ASTNodeImporter::VisitAtomicType(const AtomicType *T){
963 ExpectedType UnderlyingTypeOrErr = import(T->getValueType());
964 if (!UnderlyingTypeOrErr)
965 return UnderlyingTypeOrErr.takeError();
Gabor Horvath0866c2f2016-11-23 15:24:23 +0000966
Balazs Keri3b30d652018-10-19 13:32:20 +0000967 return Importer.getToContext().getAtomicType(*UnderlyingTypeOrErr);
Gabor Horvath0866c2f2016-11-23 15:24:23 +0000968}
969
Balazs Keri3b30d652018-10-19 13:32:20 +0000970ExpectedType ASTNodeImporter::VisitBuiltinType(const BuiltinType *T) {
Douglas Gregor96e578d2010-02-05 17:54:41 +0000971 switch (T->getKind()) {
Alexey Bader954ba212016-04-08 13:40:33 +0000972#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
973 case BuiltinType::Id: \
974 return Importer.getToContext().SingletonId;
Alexey Baderb62f1442016-04-13 08:33:41 +0000975#include "clang/Basic/OpenCLImageTypes.def"
Andrew Savonichev3fee3512018-11-08 11:25:41 +0000976#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
977 case BuiltinType::Id: \
978 return Importer.getToContext().Id##Ty;
979#include "clang/Basic/OpenCLExtensionTypes.def"
John McCalle314e272011-10-18 21:02:43 +0000980#define SHARED_SINGLETON_TYPE(Expansion)
981#define BUILTIN_TYPE(Id, SingletonId) \
982 case BuiltinType::Id: return Importer.getToContext().SingletonId;
983#include "clang/AST/BuiltinTypes.def"
984
985 // FIXME: for Char16, Char32, and NullPtr, make sure that the "to"
986 // context supports C++.
987
988 // FIXME: for ObjCId, ObjCClass, and ObjCSel, make sure that the "to"
989 // context supports ObjC.
990
Douglas Gregor96e578d2010-02-05 17:54:41 +0000991 case BuiltinType::Char_U:
Fangrui Song6907ce22018-07-30 19:24:48 +0000992 // The context we're importing from has an unsigned 'char'. If we're
993 // importing into a context with a signed 'char', translate to
Douglas Gregor96e578d2010-02-05 17:54:41 +0000994 // 'unsigned char' instead.
David Blaikiebbafb8a2012-03-11 07:00:24 +0000995 if (Importer.getToContext().getLangOpts().CharIsSigned)
Douglas Gregor96e578d2010-02-05 17:54:41 +0000996 return Importer.getToContext().UnsignedCharTy;
Fangrui Song6907ce22018-07-30 19:24:48 +0000997
Douglas Gregor96e578d2010-02-05 17:54:41 +0000998 return Importer.getToContext().CharTy;
999
Douglas Gregor96e578d2010-02-05 17:54:41 +00001000 case BuiltinType::Char_S:
Fangrui Song6907ce22018-07-30 19:24:48 +00001001 // The context we're importing from has an unsigned 'char'. If we're
1002 // importing into a context with a signed 'char', translate to
Douglas Gregor96e578d2010-02-05 17:54:41 +00001003 // 'unsigned char' instead.
David Blaikiebbafb8a2012-03-11 07:00:24 +00001004 if (!Importer.getToContext().getLangOpts().CharIsSigned)
Douglas Gregor96e578d2010-02-05 17:54:41 +00001005 return Importer.getToContext().SignedCharTy;
Fangrui Song6907ce22018-07-30 19:24:48 +00001006
Douglas Gregor96e578d2010-02-05 17:54:41 +00001007 return Importer.getToContext().CharTy;
1008
Chris Lattnerad3467e2010-12-25 23:25:43 +00001009 case BuiltinType::WChar_S:
1010 case BuiltinType::WChar_U:
Douglas Gregor96e578d2010-02-05 17:54:41 +00001011 // FIXME: If not in C++, shall we translate to the C equivalent of
1012 // wchar_t?
1013 return Importer.getToContext().WCharTy;
Douglas Gregor96e578d2010-02-05 17:54:41 +00001014 }
David Blaikiee4d798f2012-01-20 21:50:17 +00001015
1016 llvm_unreachable("Invalid BuiltinType Kind!");
Douglas Gregor96e578d2010-02-05 17:54:41 +00001017}
1018
Balazs Keri3b30d652018-10-19 13:32:20 +00001019ExpectedType ASTNodeImporter::VisitDecayedType(const DecayedType *T) {
1020 ExpectedType ToOriginalTypeOrErr = import(T->getOriginalType());
1021 if (!ToOriginalTypeOrErr)
1022 return ToOriginalTypeOrErr.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00001023
Balazs Keri3b30d652018-10-19 13:32:20 +00001024 return Importer.getToContext().getDecayedType(*ToOriginalTypeOrErr);
Aleksei Sidorina693b372016-09-28 10:16:56 +00001025}
1026
Balazs Keri3b30d652018-10-19 13:32:20 +00001027ExpectedType ASTNodeImporter::VisitComplexType(const ComplexType *T) {
1028 ExpectedType ToElementTypeOrErr = import(T->getElementType());
1029 if (!ToElementTypeOrErr)
1030 return ToElementTypeOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001031
Balazs Keri3b30d652018-10-19 13:32:20 +00001032 return Importer.getToContext().getComplexType(*ToElementTypeOrErr);
Douglas Gregor96e578d2010-02-05 17:54:41 +00001033}
1034
Balazs Keri3b30d652018-10-19 13:32:20 +00001035ExpectedType ASTNodeImporter::VisitPointerType(const PointerType *T) {
1036 ExpectedType ToPointeeTypeOrErr = import(T->getPointeeType());
1037 if (!ToPointeeTypeOrErr)
1038 return ToPointeeTypeOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001039
Balazs Keri3b30d652018-10-19 13:32:20 +00001040 return Importer.getToContext().getPointerType(*ToPointeeTypeOrErr);
Douglas Gregor96e578d2010-02-05 17:54:41 +00001041}
1042
Balazs Keri3b30d652018-10-19 13:32:20 +00001043ExpectedType ASTNodeImporter::VisitBlockPointerType(const BlockPointerType *T) {
Douglas Gregor96e578d2010-02-05 17:54:41 +00001044 // FIXME: Check for blocks support in "to" context.
Balazs Keri3b30d652018-10-19 13:32:20 +00001045 ExpectedType ToPointeeTypeOrErr = import(T->getPointeeType());
1046 if (!ToPointeeTypeOrErr)
1047 return ToPointeeTypeOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001048
Balazs Keri3b30d652018-10-19 13:32:20 +00001049 return Importer.getToContext().getBlockPointerType(*ToPointeeTypeOrErr);
Douglas Gregor96e578d2010-02-05 17:54:41 +00001050}
1051
Balazs Keri3b30d652018-10-19 13:32:20 +00001052ExpectedType
John McCall424cec92011-01-19 06:33:43 +00001053ASTNodeImporter::VisitLValueReferenceType(const LValueReferenceType *T) {
Douglas Gregor96e578d2010-02-05 17:54:41 +00001054 // FIXME: Check for C++ support in "to" context.
Balazs Keri3b30d652018-10-19 13:32:20 +00001055 ExpectedType ToPointeeTypeOrErr = import(T->getPointeeTypeAsWritten());
1056 if (!ToPointeeTypeOrErr)
1057 return ToPointeeTypeOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001058
Balazs Keri3b30d652018-10-19 13:32:20 +00001059 return Importer.getToContext().getLValueReferenceType(*ToPointeeTypeOrErr);
Douglas Gregor96e578d2010-02-05 17:54:41 +00001060}
1061
Balazs Keri3b30d652018-10-19 13:32:20 +00001062ExpectedType
John McCall424cec92011-01-19 06:33:43 +00001063ASTNodeImporter::VisitRValueReferenceType(const RValueReferenceType *T) {
Douglas Gregor96e578d2010-02-05 17:54:41 +00001064 // FIXME: Check for C++0x support in "to" context.
Balazs Keri3b30d652018-10-19 13:32:20 +00001065 ExpectedType ToPointeeTypeOrErr = import(T->getPointeeTypeAsWritten());
1066 if (!ToPointeeTypeOrErr)
1067 return ToPointeeTypeOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001068
Balazs Keri3b30d652018-10-19 13:32:20 +00001069 return Importer.getToContext().getRValueReferenceType(*ToPointeeTypeOrErr);
Douglas Gregor96e578d2010-02-05 17:54:41 +00001070}
1071
Balazs Keri3b30d652018-10-19 13:32:20 +00001072ExpectedType
1073ASTNodeImporter::VisitMemberPointerType(const MemberPointerType *T) {
Douglas Gregor96e578d2010-02-05 17:54:41 +00001074 // FIXME: Check for C++ support in "to" context.
Balazs Keri3b30d652018-10-19 13:32:20 +00001075 ExpectedType ToPointeeTypeOrErr = import(T->getPointeeType());
1076 if (!ToPointeeTypeOrErr)
1077 return ToPointeeTypeOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001078
Balazs Keri3b30d652018-10-19 13:32:20 +00001079 ExpectedType ClassTypeOrErr = import(QualType(T->getClass(), 0));
1080 if (!ClassTypeOrErr)
1081 return ClassTypeOrErr.takeError();
1082
1083 return Importer.getToContext().getMemberPointerType(
1084 *ToPointeeTypeOrErr, (*ClassTypeOrErr).getTypePtr());
Douglas Gregor96e578d2010-02-05 17:54:41 +00001085}
1086
Balazs Keri3b30d652018-10-19 13:32:20 +00001087ExpectedType
1088ASTNodeImporter::VisitConstantArrayType(const ConstantArrayType *T) {
1089 ExpectedType ToElementTypeOrErr = import(T->getElementType());
1090 if (!ToElementTypeOrErr)
1091 return ToElementTypeOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001092
Balazs Keri3b30d652018-10-19 13:32:20 +00001093 return Importer.getToContext().getConstantArrayType(*ToElementTypeOrErr,
Douglas Gregor96e578d2010-02-05 17:54:41 +00001094 T->getSize(),
1095 T->getSizeModifier(),
1096 T->getIndexTypeCVRQualifiers());
1097}
1098
Balazs Keri3b30d652018-10-19 13:32:20 +00001099ExpectedType
John McCall424cec92011-01-19 06:33:43 +00001100ASTNodeImporter::VisitIncompleteArrayType(const IncompleteArrayType *T) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001101 ExpectedType ToElementTypeOrErr = import(T->getElementType());
1102 if (!ToElementTypeOrErr)
1103 return ToElementTypeOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001104
Balazs Keri3b30d652018-10-19 13:32:20 +00001105 return Importer.getToContext().getIncompleteArrayType(*ToElementTypeOrErr,
Douglas Gregor96e578d2010-02-05 17:54:41 +00001106 T->getSizeModifier(),
1107 T->getIndexTypeCVRQualifiers());
1108}
1109
Balazs Keri3b30d652018-10-19 13:32:20 +00001110ExpectedType
1111ASTNodeImporter::VisitVariableArrayType(const VariableArrayType *T) {
1112 QualType ToElementType;
1113 Expr *ToSizeExpr;
1114 SourceRange ToBracketsRange;
1115 if (auto Imp = importSeq(
1116 T->getElementType(), T->getSizeExpr(), T->getBracketsRange()))
1117 std::tie(ToElementType, ToSizeExpr, ToBracketsRange) = *Imp;
1118 else
1119 return Imp.takeError();
Douglas Gregor96e578d2010-02-05 17:54:41 +00001120
Balazs Keri3b30d652018-10-19 13:32:20 +00001121 return Importer.getToContext().getVariableArrayType(
1122 ToElementType, ToSizeExpr, T->getSizeModifier(),
1123 T->getIndexTypeCVRQualifiers(), ToBracketsRange);
Douglas Gregor96e578d2010-02-05 17:54:41 +00001124}
1125
Balazs Keri3b30d652018-10-19 13:32:20 +00001126ExpectedType ASTNodeImporter::VisitDependentSizedArrayType(
Gabor Horvathc78d99a2018-01-27 16:11:45 +00001127 const DependentSizedArrayType *T) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001128 QualType ToElementType;
1129 Expr *ToSizeExpr;
1130 SourceRange ToBracketsRange;
1131 if (auto Imp = importSeq(
1132 T->getElementType(), T->getSizeExpr(), T->getBracketsRange()))
1133 std::tie(ToElementType, ToSizeExpr, ToBracketsRange) = *Imp;
1134 else
1135 return Imp.takeError();
Gabor Horvathc78d99a2018-01-27 16:11:45 +00001136 // SizeExpr may be null if size is not specified directly.
1137 // For example, 'int a[]'.
Gabor Horvathc78d99a2018-01-27 16:11:45 +00001138
Gabor Horvathc78d99a2018-01-27 16:11:45 +00001139 return Importer.getToContext().getDependentSizedArrayType(
Balazs Keri3b30d652018-10-19 13:32:20 +00001140 ToElementType, ToSizeExpr, T->getSizeModifier(),
1141 T->getIndexTypeCVRQualifiers(), ToBracketsRange);
Gabor Horvathc78d99a2018-01-27 16:11:45 +00001142}
1143
Balazs Keri3b30d652018-10-19 13:32:20 +00001144ExpectedType ASTNodeImporter::VisitVectorType(const VectorType *T) {
1145 ExpectedType ToElementTypeOrErr = import(T->getElementType());
1146 if (!ToElementTypeOrErr)
1147 return ToElementTypeOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001148
Balazs Keri3b30d652018-10-19 13:32:20 +00001149 return Importer.getToContext().getVectorType(*ToElementTypeOrErr,
Douglas Gregor96e578d2010-02-05 17:54:41 +00001150 T->getNumElements(),
Bob Wilsonaeb56442010-11-10 21:56:12 +00001151 T->getVectorKind());
Douglas Gregor96e578d2010-02-05 17:54:41 +00001152}
1153
Balazs Keri3b30d652018-10-19 13:32:20 +00001154ExpectedType ASTNodeImporter::VisitExtVectorType(const ExtVectorType *T) {
1155 ExpectedType ToElementTypeOrErr = import(T->getElementType());
1156 if (!ToElementTypeOrErr)
1157 return ToElementTypeOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001158
Balazs Keri3b30d652018-10-19 13:32:20 +00001159 return Importer.getToContext().getExtVectorType(*ToElementTypeOrErr,
Douglas Gregor96e578d2010-02-05 17:54:41 +00001160 T->getNumElements());
1161}
1162
Balazs Keri3b30d652018-10-19 13:32:20 +00001163ExpectedType
John McCall424cec92011-01-19 06:33:43 +00001164ASTNodeImporter::VisitFunctionNoProtoType(const FunctionNoProtoType *T) {
Fangrui Song6907ce22018-07-30 19:24:48 +00001165 // FIXME: What happens if we're importing a function without a prototype
Douglas Gregor96e578d2010-02-05 17:54:41 +00001166 // into C++? Should we make it variadic?
Balazs Keri3b30d652018-10-19 13:32:20 +00001167 ExpectedType ToReturnTypeOrErr = import(T->getReturnType());
1168 if (!ToReturnTypeOrErr)
1169 return ToReturnTypeOrErr.takeError();
Rafael Espindolac50c27c2010-03-30 20:24:48 +00001170
Balazs Keri3b30d652018-10-19 13:32:20 +00001171 return Importer.getToContext().getFunctionNoProtoType(*ToReturnTypeOrErr,
Rafael Espindolac50c27c2010-03-30 20:24:48 +00001172 T->getExtInfo());
Douglas Gregor96e578d2010-02-05 17:54:41 +00001173}
1174
Balazs Keri3b30d652018-10-19 13:32:20 +00001175ExpectedType
1176ASTNodeImporter::VisitFunctionProtoType(const FunctionProtoType *T) {
1177 ExpectedType ToReturnTypeOrErr = import(T->getReturnType());
1178 if (!ToReturnTypeOrErr)
1179 return ToReturnTypeOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001180
Douglas Gregor96e578d2010-02-05 17:54:41 +00001181 // Import argument types
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001182 SmallVector<QualType, 4> ArgTypes;
Aaron Ballman40bd0aa2014-03-17 15:23:01 +00001183 for (const auto &A : T->param_types()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001184 ExpectedType TyOrErr = import(A);
1185 if (!TyOrErr)
1186 return TyOrErr.takeError();
1187 ArgTypes.push_back(*TyOrErr);
Douglas Gregor96e578d2010-02-05 17:54:41 +00001188 }
Fangrui Song6907ce22018-07-30 19:24:48 +00001189
Douglas Gregor96e578d2010-02-05 17:54:41 +00001190 // Import exception types
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001191 SmallVector<QualType, 4> ExceptionTypes;
Aaron Ballmanb088fbe2014-03-17 15:38:09 +00001192 for (const auto &E : T->exceptions()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001193 ExpectedType TyOrErr = import(E);
1194 if (!TyOrErr)
1195 return TyOrErr.takeError();
1196 ExceptionTypes.push_back(*TyOrErr);
Douglas Gregor96e578d2010-02-05 17:54:41 +00001197 }
John McCalldb40c7f2010-12-14 08:05:40 +00001198
Argyrios Kyrtzidisb41791d2012-09-22 01:58:06 +00001199 FunctionProtoType::ExtProtoInfo FromEPI = T->getExtProtoInfo();
1200 FunctionProtoType::ExtProtoInfo ToEPI;
1201
Balazs Keri3b30d652018-10-19 13:32:20 +00001202 auto Imp = importSeq(
1203 FromEPI.ExceptionSpec.NoexceptExpr,
1204 FromEPI.ExceptionSpec.SourceDecl,
1205 FromEPI.ExceptionSpec.SourceTemplate);
1206 if (!Imp)
1207 return Imp.takeError();
1208
Argyrios Kyrtzidisb41791d2012-09-22 01:58:06 +00001209 ToEPI.ExtInfo = FromEPI.ExtInfo;
1210 ToEPI.Variadic = FromEPI.Variadic;
1211 ToEPI.HasTrailingReturn = FromEPI.HasTrailingReturn;
1212 ToEPI.TypeQuals = FromEPI.TypeQuals;
1213 ToEPI.RefQualifier = FromEPI.RefQualifier;
Richard Smith8acb4282014-07-31 21:57:55 +00001214 ToEPI.ExceptionSpec.Type = FromEPI.ExceptionSpec.Type;
1215 ToEPI.ExceptionSpec.Exceptions = ExceptionTypes;
Balazs Keri3b30d652018-10-19 13:32:20 +00001216 std::tie(
1217 ToEPI.ExceptionSpec.NoexceptExpr,
1218 ToEPI.ExceptionSpec.SourceDecl,
1219 ToEPI.ExceptionSpec.SourceTemplate) = *Imp;
Argyrios Kyrtzidisb41791d2012-09-22 01:58:06 +00001220
Balazs Keri3b30d652018-10-19 13:32:20 +00001221 return Importer.getToContext().getFunctionType(
1222 *ToReturnTypeOrErr, ArgTypes, ToEPI);
Argyrios Kyrtzidisb41791d2012-09-22 01:58:06 +00001223}
1224
Balazs Keri3b30d652018-10-19 13:32:20 +00001225ExpectedType ASTNodeImporter::VisitUnresolvedUsingType(
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00001226 const UnresolvedUsingType *T) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001227 UnresolvedUsingTypenameDecl *ToD;
1228 Decl *ToPrevD;
1229 if (auto Imp = importSeq(T->getDecl(), T->getDecl()->getPreviousDecl()))
1230 std::tie(ToD, ToPrevD) = *Imp;
1231 else
1232 return Imp.takeError();
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00001233
Balazs Keri3b30d652018-10-19 13:32:20 +00001234 return Importer.getToContext().getTypeDeclType(
1235 ToD, cast_or_null<TypeDecl>(ToPrevD));
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00001236}
1237
Balazs Keri3b30d652018-10-19 13:32:20 +00001238ExpectedType ASTNodeImporter::VisitParenType(const ParenType *T) {
1239 ExpectedType ToInnerTypeOrErr = import(T->getInnerType());
1240 if (!ToInnerTypeOrErr)
1241 return ToInnerTypeOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001242
Balazs Keri3b30d652018-10-19 13:32:20 +00001243 return Importer.getToContext().getParenType(*ToInnerTypeOrErr);
Sean Callananda6df8a2011-08-11 16:56:07 +00001244}
1245
Balazs Keri3b30d652018-10-19 13:32:20 +00001246ExpectedType ASTNodeImporter::VisitTypedefType(const TypedefType *T) {
1247 Expected<TypedefNameDecl *> ToDeclOrErr = import(T->getDecl());
1248 if (!ToDeclOrErr)
1249 return ToDeclOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001250
Balazs Keri3b30d652018-10-19 13:32:20 +00001251 return Importer.getToContext().getTypeDeclType(*ToDeclOrErr);
Douglas Gregor96e578d2010-02-05 17:54:41 +00001252}
1253
Balazs Keri3b30d652018-10-19 13:32:20 +00001254ExpectedType ASTNodeImporter::VisitTypeOfExprType(const TypeOfExprType *T) {
1255 ExpectedExpr ToExprOrErr = import(T->getUnderlyingExpr());
1256 if (!ToExprOrErr)
1257 return ToExprOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001258
Balazs Keri3b30d652018-10-19 13:32:20 +00001259 return Importer.getToContext().getTypeOfExprType(*ToExprOrErr);
Douglas Gregor96e578d2010-02-05 17:54:41 +00001260}
1261
Balazs Keri3b30d652018-10-19 13:32:20 +00001262ExpectedType ASTNodeImporter::VisitTypeOfType(const TypeOfType *T) {
1263 ExpectedType ToUnderlyingTypeOrErr = import(T->getUnderlyingType());
1264 if (!ToUnderlyingTypeOrErr)
1265 return ToUnderlyingTypeOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001266
Balazs Keri3b30d652018-10-19 13:32:20 +00001267 return Importer.getToContext().getTypeOfType(*ToUnderlyingTypeOrErr);
Douglas Gregor96e578d2010-02-05 17:54:41 +00001268}
1269
Balazs Keri3b30d652018-10-19 13:32:20 +00001270ExpectedType ASTNodeImporter::VisitDecltypeType(const DecltypeType *T) {
Richard Smith30482bc2011-02-20 03:19:35 +00001271 // FIXME: Make sure that the "to" context supports C++0x!
Balazs Keri3b30d652018-10-19 13:32:20 +00001272 ExpectedExpr ToExprOrErr = import(T->getUnderlyingExpr());
1273 if (!ToExprOrErr)
1274 return ToExprOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001275
Balazs Keri3b30d652018-10-19 13:32:20 +00001276 ExpectedType ToUnderlyingTypeOrErr = import(T->getUnderlyingType());
1277 if (!ToUnderlyingTypeOrErr)
1278 return ToUnderlyingTypeOrErr.takeError();
Douglas Gregor81495f32012-02-12 18:42:33 +00001279
Balazs Keri3b30d652018-10-19 13:32:20 +00001280 return Importer.getToContext().getDecltypeType(
1281 *ToExprOrErr, *ToUnderlyingTypeOrErr);
Douglas Gregor96e578d2010-02-05 17:54:41 +00001282}
1283
Balazs Keri3b30d652018-10-19 13:32:20 +00001284ExpectedType
1285ASTNodeImporter::VisitUnaryTransformType(const UnaryTransformType *T) {
1286 ExpectedType ToBaseTypeOrErr = import(T->getBaseType());
1287 if (!ToBaseTypeOrErr)
1288 return ToBaseTypeOrErr.takeError();
Alexis Hunte852b102011-05-24 22:41:36 +00001289
Balazs Keri3b30d652018-10-19 13:32:20 +00001290 ExpectedType ToUnderlyingTypeOrErr = import(T->getUnderlyingType());
1291 if (!ToUnderlyingTypeOrErr)
1292 return ToUnderlyingTypeOrErr.takeError();
1293
1294 return Importer.getToContext().getUnaryTransformType(
1295 *ToBaseTypeOrErr, *ToUnderlyingTypeOrErr, T->getUTTKind());
Alexis Hunte852b102011-05-24 22:41:36 +00001296}
1297
Balazs Keri3b30d652018-10-19 13:32:20 +00001298ExpectedType ASTNodeImporter::VisitAutoType(const AutoType *T) {
Richard Smith74aeef52013-04-26 16:15:35 +00001299 // FIXME: Make sure that the "to" context supports C++11!
Balazs Keri3b30d652018-10-19 13:32:20 +00001300 ExpectedType ToDeducedTypeOrErr = import(T->getDeducedType());
1301 if (!ToDeducedTypeOrErr)
1302 return ToDeducedTypeOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001303
Balazs Keri3b30d652018-10-19 13:32:20 +00001304 return Importer.getToContext().getAutoType(*ToDeducedTypeOrErr,
1305 T->getKeyword(),
Faisal Vali2b391ab2013-09-26 19:54:12 +00001306 /*IsDependent*/false);
Richard Smith30482bc2011-02-20 03:19:35 +00001307}
1308
Balazs Keri3b30d652018-10-19 13:32:20 +00001309ExpectedType ASTNodeImporter::VisitInjectedClassNameType(
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00001310 const InjectedClassNameType *T) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001311 Expected<CXXRecordDecl *> ToDeclOrErr = import(T->getDecl());
1312 if (!ToDeclOrErr)
1313 return ToDeclOrErr.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00001314
Balazs Keri3b30d652018-10-19 13:32:20 +00001315 ExpectedType ToInjTypeOrErr = import(T->getInjectedSpecializationType());
1316 if (!ToInjTypeOrErr)
1317 return ToInjTypeOrErr.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00001318
1319 // FIXME: ASTContext::getInjectedClassNameType is not suitable for AST reading
1320 // See comments in InjectedClassNameType definition for details
1321 // return Importer.getToContext().getInjectedClassNameType(D, InjType);
1322 enum {
1323 TypeAlignmentInBits = 4,
1324 TypeAlignment = 1 << TypeAlignmentInBits
1325 };
1326
1327 return QualType(new (Importer.getToContext(), TypeAlignment)
Balazs Keri3b30d652018-10-19 13:32:20 +00001328 InjectedClassNameType(*ToDeclOrErr, *ToInjTypeOrErr), 0);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00001329}
1330
Balazs Keri3b30d652018-10-19 13:32:20 +00001331ExpectedType ASTNodeImporter::VisitRecordType(const RecordType *T) {
1332 Expected<RecordDecl *> ToDeclOrErr = import(T->getDecl());
1333 if (!ToDeclOrErr)
1334 return ToDeclOrErr.takeError();
Douglas Gregor96e578d2010-02-05 17:54:41 +00001335
Balazs Keri3b30d652018-10-19 13:32:20 +00001336 return Importer.getToContext().getTagDeclType(*ToDeclOrErr);
Douglas Gregor96e578d2010-02-05 17:54:41 +00001337}
1338
Balazs Keri3b30d652018-10-19 13:32:20 +00001339ExpectedType ASTNodeImporter::VisitEnumType(const EnumType *T) {
1340 Expected<EnumDecl *> ToDeclOrErr = import(T->getDecl());
1341 if (!ToDeclOrErr)
1342 return ToDeclOrErr.takeError();
Douglas Gregor96e578d2010-02-05 17:54:41 +00001343
Balazs Keri3b30d652018-10-19 13:32:20 +00001344 return Importer.getToContext().getTagDeclType(*ToDeclOrErr);
Douglas Gregor96e578d2010-02-05 17:54:41 +00001345}
1346
Balazs Keri3b30d652018-10-19 13:32:20 +00001347ExpectedType ASTNodeImporter::VisitAttributedType(const AttributedType *T) {
1348 ExpectedType ToModifiedTypeOrErr = import(T->getModifiedType());
1349 if (!ToModifiedTypeOrErr)
1350 return ToModifiedTypeOrErr.takeError();
1351 ExpectedType ToEquivalentTypeOrErr = import(T->getEquivalentType());
1352 if (!ToEquivalentTypeOrErr)
1353 return ToEquivalentTypeOrErr.takeError();
Sean Callanan72fe0852015-04-02 23:50:08 +00001354
1355 return Importer.getToContext().getAttributedType(T->getAttrKind(),
Balazs Keri3b30d652018-10-19 13:32:20 +00001356 *ToModifiedTypeOrErr, *ToEquivalentTypeOrErr);
Sean Callanan72fe0852015-04-02 23:50:08 +00001357}
1358
Balazs Keri3b30d652018-10-19 13:32:20 +00001359ExpectedType ASTNodeImporter::VisitTemplateTypeParmType(
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00001360 const TemplateTypeParmType *T) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001361 Expected<TemplateTypeParmDecl *> ToDeclOrErr = import(T->getDecl());
1362 if (!ToDeclOrErr)
1363 return ToDeclOrErr.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00001364
1365 return Importer.getToContext().getTemplateTypeParmType(
Balazs Keri3b30d652018-10-19 13:32:20 +00001366 T->getDepth(), T->getIndex(), T->isParameterPack(), *ToDeclOrErr);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00001367}
1368
Balazs Keri3b30d652018-10-19 13:32:20 +00001369ExpectedType ASTNodeImporter::VisitSubstTemplateTypeParmType(
Aleksei Sidorin855086d2017-01-23 09:30:36 +00001370 const SubstTemplateTypeParmType *T) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001371 ExpectedType ReplacedOrErr = import(QualType(T->getReplacedParameter(), 0));
1372 if (!ReplacedOrErr)
1373 return ReplacedOrErr.takeError();
1374 const TemplateTypeParmType *Replaced =
1375 cast<TemplateTypeParmType>((*ReplacedOrErr).getTypePtr());
Aleksei Sidorin855086d2017-01-23 09:30:36 +00001376
Balazs Keri3b30d652018-10-19 13:32:20 +00001377 ExpectedType ToReplacementTypeOrErr = import(T->getReplacementType());
1378 if (!ToReplacementTypeOrErr)
1379 return ToReplacementTypeOrErr.takeError();
Aleksei Sidorin855086d2017-01-23 09:30:36 +00001380
1381 return Importer.getToContext().getSubstTemplateTypeParmType(
Balazs Keri3b30d652018-10-19 13:32:20 +00001382 Replaced, (*ToReplacementTypeOrErr).getCanonicalType());
Aleksei Sidorin855086d2017-01-23 09:30:36 +00001383}
1384
Balazs Keri3b30d652018-10-19 13:32:20 +00001385ExpectedType ASTNodeImporter::VisitTemplateSpecializationType(
John McCall424cec92011-01-19 06:33:43 +00001386 const TemplateSpecializationType *T) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001387 auto ToTemplateOrErr = import(T->getTemplateName());
1388 if (!ToTemplateOrErr)
1389 return ToTemplateOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001390
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001391 SmallVector<TemplateArgument, 2> ToTemplateArgs;
Balazs Keri3b30d652018-10-19 13:32:20 +00001392 if (Error Err = ImportTemplateArguments(
1393 T->getArgs(), T->getNumArgs(), ToTemplateArgs))
1394 return std::move(Err);
Fangrui Song6907ce22018-07-30 19:24:48 +00001395
Douglas Gregore2e50d332010-12-01 01:36:18 +00001396 QualType ToCanonType;
1397 if (!QualType(T, 0).isCanonical()) {
Fangrui Song6907ce22018-07-30 19:24:48 +00001398 QualType FromCanonType
Douglas Gregore2e50d332010-12-01 01:36:18 +00001399 = Importer.getFromContext().getCanonicalType(QualType(T, 0));
Balazs Keri3b30d652018-10-19 13:32:20 +00001400 if (ExpectedType TyOrErr = import(FromCanonType))
1401 ToCanonType = *TyOrErr;
1402 else
1403 return TyOrErr.takeError();
Douglas Gregore2e50d332010-12-01 01:36:18 +00001404 }
Balazs Keri3b30d652018-10-19 13:32:20 +00001405 return Importer.getToContext().getTemplateSpecializationType(*ToTemplateOrErr,
David Majnemer6fbeee32016-07-07 04:43:07 +00001406 ToTemplateArgs,
Douglas Gregore2e50d332010-12-01 01:36:18 +00001407 ToCanonType);
1408}
1409
Balazs Keri3b30d652018-10-19 13:32:20 +00001410ExpectedType ASTNodeImporter::VisitElaboratedType(const ElaboratedType *T) {
Abramo Bagnara6150c882010-05-11 21:36:43 +00001411 // Note: the qualifier in an ElaboratedType is optional.
Balazs Keri3b30d652018-10-19 13:32:20 +00001412 auto ToQualifierOrErr = import(T->getQualifier());
1413 if (!ToQualifierOrErr)
1414 return ToQualifierOrErr.takeError();
Douglas Gregor96e578d2010-02-05 17:54:41 +00001415
Balazs Keri3b30d652018-10-19 13:32:20 +00001416 ExpectedType ToNamedTypeOrErr = import(T->getNamedType());
1417 if (!ToNamedTypeOrErr)
1418 return ToNamedTypeOrErr.takeError();
Douglas Gregor96e578d2010-02-05 17:54:41 +00001419
Balazs Keri3b30d652018-10-19 13:32:20 +00001420 Expected<TagDecl *> ToOwnedTagDeclOrErr = import(T->getOwnedTagDecl());
1421 if (!ToOwnedTagDeclOrErr)
1422 return ToOwnedTagDeclOrErr.takeError();
Joel E. Denny7509a2f2018-05-14 19:36:45 +00001423
Abramo Bagnara6150c882010-05-11 21:36:43 +00001424 return Importer.getToContext().getElaboratedType(T->getKeyword(),
Balazs Keri3b30d652018-10-19 13:32:20 +00001425 *ToQualifierOrErr,
1426 *ToNamedTypeOrErr,
1427 *ToOwnedTagDeclOrErr);
Douglas Gregor96e578d2010-02-05 17:54:41 +00001428}
1429
Balazs Keri3b30d652018-10-19 13:32:20 +00001430ExpectedType
1431ASTNodeImporter::VisitPackExpansionType(const PackExpansionType *T) {
1432 ExpectedType ToPatternOrErr = import(T->getPattern());
1433 if (!ToPatternOrErr)
1434 return ToPatternOrErr.takeError();
Gabor Horvath7a91c082017-11-14 11:30:38 +00001435
Balazs Keri3b30d652018-10-19 13:32:20 +00001436 return Importer.getToContext().getPackExpansionType(*ToPatternOrErr,
Gabor Horvath7a91c082017-11-14 11:30:38 +00001437 T->getNumExpansions());
1438}
1439
Balazs Keri3b30d652018-10-19 13:32:20 +00001440ExpectedType ASTNodeImporter::VisitDependentTemplateSpecializationType(
Gabor Horvathc78d99a2018-01-27 16:11:45 +00001441 const DependentTemplateSpecializationType *T) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001442 auto ToQualifierOrErr = import(T->getQualifier());
1443 if (!ToQualifierOrErr)
1444 return ToQualifierOrErr.takeError();
Gabor Horvathc78d99a2018-01-27 16:11:45 +00001445
Balazs Keri3b30d652018-10-19 13:32:20 +00001446 IdentifierInfo *ToName = Importer.Import(T->getIdentifier());
Gabor Horvathc78d99a2018-01-27 16:11:45 +00001447
1448 SmallVector<TemplateArgument, 2> ToPack;
1449 ToPack.reserve(T->getNumArgs());
Balazs Keri3b30d652018-10-19 13:32:20 +00001450 if (Error Err = ImportTemplateArguments(
1451 T->getArgs(), T->getNumArgs(), ToPack))
1452 return std::move(Err);
Gabor Horvathc78d99a2018-01-27 16:11:45 +00001453
1454 return Importer.getToContext().getDependentTemplateSpecializationType(
Balazs Keri3b30d652018-10-19 13:32:20 +00001455 T->getKeyword(), *ToQualifierOrErr, ToName, ToPack);
Gabor Horvathc78d99a2018-01-27 16:11:45 +00001456}
1457
Balazs Keri3b30d652018-10-19 13:32:20 +00001458ExpectedType
1459ASTNodeImporter::VisitDependentNameType(const DependentNameType *T) {
1460 auto ToQualifierOrErr = import(T->getQualifier());
1461 if (!ToQualifierOrErr)
1462 return ToQualifierOrErr.takeError();
Peter Szecsice7f3182018-05-07 12:08:27 +00001463
1464 IdentifierInfo *Name = Importer.Import(T->getIdentifier());
Peter Szecsice7f3182018-05-07 12:08:27 +00001465
Balazs Keri3b30d652018-10-19 13:32:20 +00001466 QualType Canon;
1467 if (T != T->getCanonicalTypeInternal().getTypePtr()) {
1468 if (ExpectedType TyOrErr = import(T->getCanonicalTypeInternal()))
1469 Canon = (*TyOrErr).getCanonicalType();
1470 else
1471 return TyOrErr.takeError();
1472 }
Peter Szecsice7f3182018-05-07 12:08:27 +00001473
Balazs Keri3b30d652018-10-19 13:32:20 +00001474 return Importer.getToContext().getDependentNameType(T->getKeyword(),
1475 *ToQualifierOrErr,
Peter Szecsice7f3182018-05-07 12:08:27 +00001476 Name, Canon);
1477}
1478
Balazs Keri3b30d652018-10-19 13:32:20 +00001479ExpectedType
1480ASTNodeImporter::VisitObjCInterfaceType(const ObjCInterfaceType *T) {
1481 Expected<ObjCInterfaceDecl *> ToDeclOrErr = import(T->getDecl());
1482 if (!ToDeclOrErr)
1483 return ToDeclOrErr.takeError();
Douglas Gregor96e578d2010-02-05 17:54:41 +00001484
Balazs Keri3b30d652018-10-19 13:32:20 +00001485 return Importer.getToContext().getObjCInterfaceType(*ToDeclOrErr);
John McCall8b07ec22010-05-15 11:32:37 +00001486}
1487
Balazs Keri3b30d652018-10-19 13:32:20 +00001488ExpectedType ASTNodeImporter::VisitObjCObjectType(const ObjCObjectType *T) {
1489 ExpectedType ToBaseTypeOrErr = import(T->getBaseType());
1490 if (!ToBaseTypeOrErr)
1491 return ToBaseTypeOrErr.takeError();
John McCall8b07ec22010-05-15 11:32:37 +00001492
Douglas Gregore9d95f12015-07-07 03:57:35 +00001493 SmallVector<QualType, 4> TypeArgs;
Douglas Gregore83b9562015-07-07 03:57:53 +00001494 for (auto TypeArg : T->getTypeArgsAsWritten()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001495 if (ExpectedType TyOrErr = import(TypeArg))
1496 TypeArgs.push_back(*TyOrErr);
1497 else
1498 return TyOrErr.takeError();
Douglas Gregore9d95f12015-07-07 03:57:35 +00001499 }
1500
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001501 SmallVector<ObjCProtocolDecl *, 4> Protocols;
Aaron Ballman1683f7b2014-03-17 15:55:30 +00001502 for (auto *P : T->quals()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001503 if (Expected<ObjCProtocolDecl *> ProtocolOrErr = import(P))
1504 Protocols.push_back(*ProtocolOrErr);
1505 else
1506 return ProtocolOrErr.takeError();
1507
Douglas Gregor96e578d2010-02-05 17:54:41 +00001508 }
1509
Balazs Keri3b30d652018-10-19 13:32:20 +00001510 return Importer.getToContext().getObjCObjectType(*ToBaseTypeOrErr, TypeArgs,
Douglas Gregorab209d82015-07-07 03:58:42 +00001511 Protocols,
1512 T->isKindOfTypeAsWritten());
Douglas Gregor96e578d2010-02-05 17:54:41 +00001513}
1514
Balazs Keri3b30d652018-10-19 13:32:20 +00001515ExpectedType
John McCall424cec92011-01-19 06:33:43 +00001516ASTNodeImporter::VisitObjCObjectPointerType(const ObjCObjectPointerType *T) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001517 ExpectedType ToPointeeTypeOrErr = import(T->getPointeeType());
1518 if (!ToPointeeTypeOrErr)
1519 return ToPointeeTypeOrErr.takeError();
Douglas Gregor96e578d2010-02-05 17:54:41 +00001520
Balazs Keri3b30d652018-10-19 13:32:20 +00001521 return Importer.getToContext().getObjCObjectPointerType(*ToPointeeTypeOrErr);
Douglas Gregor96e578d2010-02-05 17:54:41 +00001522}
1523
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00001524//----------------------------------------------------------------------------
1525// Import Declarations
1526//----------------------------------------------------------------------------
Balazs Keri3b30d652018-10-19 13:32:20 +00001527Error ASTNodeImporter::ImportDeclParts(
1528 NamedDecl *D, DeclContext *&DC, DeclContext *&LexicalDC,
1529 DeclarationName &Name, NamedDecl *&ToD, SourceLocation &Loc) {
Gabor Marton6e1510c2018-07-12 11:50:21 +00001530 // Check if RecordDecl is in FunctionDecl parameters to avoid infinite loop.
1531 // example: int struct_in_proto(struct data_t{int a;int b;} *d);
1532 DeclContext *OrigDC = D->getDeclContext();
1533 FunctionDecl *FunDecl;
1534 if (isa<RecordDecl>(D) && (FunDecl = dyn_cast<FunctionDecl>(OrigDC)) &&
1535 FunDecl->hasBody()) {
Gabor Martonfe68e292018-08-06 14:38:37 +00001536 auto getLeafPointeeType = [](const Type *T) {
1537 while (T->isPointerType() || T->isArrayType()) {
1538 T = T->getPointeeOrArrayElementType();
1539 }
1540 return T;
1541 };
1542 for (const ParmVarDecl *P : FunDecl->parameters()) {
1543 const Type *LeafT =
1544 getLeafPointeeType(P->getType().getCanonicalType().getTypePtr());
1545 auto *RT = dyn_cast<RecordType>(LeafT);
1546 if (RT && RT->getDecl() == D) {
1547 Importer.FromDiag(D->getLocation(), diag::err_unsupported_ast_node)
1548 << D->getDeclKindName();
Balazs Keri3b30d652018-10-19 13:32:20 +00001549 return make_error<ImportError>(ImportError::UnsupportedConstruct);
Gabor Martonfe68e292018-08-06 14:38:37 +00001550 }
Gabor Marton6e1510c2018-07-12 11:50:21 +00001551 }
1552 }
1553
Douglas Gregorbb7930c2010-02-10 19:54:31 +00001554 // Import the context of this declaration.
Balazs Keri3b30d652018-10-19 13:32:20 +00001555 if (Error Err = ImportDeclContext(D, DC, LexicalDC))
1556 return Err;
Fangrui Song6907ce22018-07-30 19:24:48 +00001557
Douglas Gregorbb7930c2010-02-10 19:54:31 +00001558 // Import the name of this declaration.
Balazs Keri3b30d652018-10-19 13:32:20 +00001559 if (Error Err = importInto(Name, D->getDeclName()))
1560 return Err;
Fangrui Song6907ce22018-07-30 19:24:48 +00001561
Douglas Gregorbb7930c2010-02-10 19:54:31 +00001562 // Import the location of this declaration.
Balazs Keri3b30d652018-10-19 13:32:20 +00001563 if (Error Err = importInto(Loc, D->getLocation()))
1564 return Err;
1565
Sean Callanan59721b32015-04-28 18:41:46 +00001566 ToD = cast_or_null<NamedDecl>(Importer.GetAlreadyImportedOrNull(D));
Gabor Martonbe77a982018-12-12 11:22:55 +00001567 if (ToD)
1568 if (Error Err = ASTNodeImporter(*this).ImportDefinitionIfNeeded(D, ToD))
1569 return Err;
Balazs Keri3b30d652018-10-19 13:32:20 +00001570
1571 return Error::success();
Douglas Gregorbb7930c2010-02-10 19:54:31 +00001572}
1573
Balazs Keri3b30d652018-10-19 13:32:20 +00001574Error ASTNodeImporter::ImportDefinitionIfNeeded(Decl *FromD, Decl *ToD) {
Douglas Gregord451ea92011-07-29 23:31:30 +00001575 if (!FromD)
Balazs Keri3b30d652018-10-19 13:32:20 +00001576 return Error::success();
Fangrui Song6907ce22018-07-30 19:24:48 +00001577
Balazs Keri3b30d652018-10-19 13:32:20 +00001578 if (!ToD)
1579 if (Error Err = importInto(ToD, FromD))
1580 return Err;
Fangrui Song6907ce22018-07-30 19:24:48 +00001581
Balazs Keri3b30d652018-10-19 13:32:20 +00001582 if (RecordDecl *FromRecord = dyn_cast<RecordDecl>(FromD)) {
1583 if (RecordDecl *ToRecord = cast<RecordDecl>(ToD)) {
1584 if (FromRecord->getDefinition() && FromRecord->isCompleteDefinition() &&
1585 !ToRecord->getDefinition()) {
1586 if (Error Err = ImportDefinition(FromRecord, ToRecord))
1587 return Err;
Douglas Gregord451ea92011-07-29 23:31:30 +00001588 }
1589 }
Balazs Keri3b30d652018-10-19 13:32:20 +00001590 return Error::success();
Douglas Gregord451ea92011-07-29 23:31:30 +00001591 }
1592
Balazs Keri3b30d652018-10-19 13:32:20 +00001593 if (EnumDecl *FromEnum = dyn_cast<EnumDecl>(FromD)) {
1594 if (EnumDecl *ToEnum = cast<EnumDecl>(ToD)) {
Douglas Gregord451ea92011-07-29 23:31:30 +00001595 if (FromEnum->getDefinition() && !ToEnum->getDefinition()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001596 if (Error Err = ImportDefinition(FromEnum, ToEnum))
1597 return Err;
Douglas Gregord451ea92011-07-29 23:31:30 +00001598 }
1599 }
Balazs Keri3b30d652018-10-19 13:32:20 +00001600 return Error::success();
Douglas Gregord451ea92011-07-29 23:31:30 +00001601 }
Balazs Keri3b30d652018-10-19 13:32:20 +00001602
1603 return Error::success();
Douglas Gregord451ea92011-07-29 23:31:30 +00001604}
1605
Balazs Keri3b30d652018-10-19 13:32:20 +00001606Error
1607ASTNodeImporter::ImportDeclarationNameLoc(
1608 const DeclarationNameInfo &From, DeclarationNameInfo& To) {
Abramo Bagnarad6d2f182010-08-11 22:01:17 +00001609 // NOTE: To.Name and To.Loc are already imported.
1610 // We only have to import To.LocInfo.
1611 switch (To.getName().getNameKind()) {
1612 case DeclarationName::Identifier:
1613 case DeclarationName::ObjCZeroArgSelector:
1614 case DeclarationName::ObjCOneArgSelector:
1615 case DeclarationName::ObjCMultiArgSelector:
1616 case DeclarationName::CXXUsingDirective:
Richard Smith35845152017-02-07 01:37:30 +00001617 case DeclarationName::CXXDeductionGuideName:
Balazs Keri3b30d652018-10-19 13:32:20 +00001618 return Error::success();
Abramo Bagnarad6d2f182010-08-11 22:01:17 +00001619
1620 case DeclarationName::CXXOperatorName: {
Balazs Keri3b30d652018-10-19 13:32:20 +00001621 if (auto ToRangeOrErr = import(From.getCXXOperatorNameRange()))
1622 To.setCXXOperatorNameRange(*ToRangeOrErr);
1623 else
1624 return ToRangeOrErr.takeError();
1625 return Error::success();
Abramo Bagnarad6d2f182010-08-11 22:01:17 +00001626 }
1627 case DeclarationName::CXXLiteralOperatorName: {
Balazs Keri3b30d652018-10-19 13:32:20 +00001628 if (ExpectedSLoc LocOrErr = import(From.getCXXLiteralOperatorNameLoc()))
1629 To.setCXXLiteralOperatorNameLoc(*LocOrErr);
1630 else
1631 return LocOrErr.takeError();
1632 return Error::success();
Abramo Bagnarad6d2f182010-08-11 22:01:17 +00001633 }
1634 case DeclarationName::CXXConstructorName:
1635 case DeclarationName::CXXDestructorName:
1636 case DeclarationName::CXXConversionFunctionName: {
Balazs Keri3b30d652018-10-19 13:32:20 +00001637 if (auto ToTInfoOrErr = import(From.getNamedTypeInfo()))
1638 To.setNamedTypeInfo(*ToTInfoOrErr);
1639 else
1640 return ToTInfoOrErr.takeError();
1641 return Error::success();
Abramo Bagnarad6d2f182010-08-11 22:01:17 +00001642 }
Abramo Bagnarad6d2f182010-08-11 22:01:17 +00001643 }
Douglas Gregor07216d12011-11-02 20:52:01 +00001644 llvm_unreachable("Unknown name kind.");
Abramo Bagnarad6d2f182010-08-11 22:01:17 +00001645}
1646
Balazs Keri3b30d652018-10-19 13:32:20 +00001647Error
1648ASTNodeImporter::ImportDeclContext(DeclContext *FromDC, bool ForceImport) {
Douglas Gregor0a791672011-01-18 03:11:38 +00001649 if (Importer.isMinimalImport() && !ForceImport) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001650 auto ToDCOrErr = Importer.ImportContext(FromDC);
1651 return ToDCOrErr.takeError();
1652 }
Davide Italiano93a64ef2018-10-30 20:46:29 +00001653 llvm::SmallVector<Decl *, 8> ImportedDecls;
Balazs Keri3b30d652018-10-19 13:32:20 +00001654 for (auto *From : FromDC->decls()) {
1655 ExpectedDecl ImportedOrErr = import(From);
Davide Italiano93a64ef2018-10-30 20:46:29 +00001656 if (!ImportedOrErr)
Balazs Keri3b30d652018-10-19 13:32:20 +00001657 // Ignore the error, continue with next Decl.
1658 // FIXME: Handle this case somehow better.
Davide Italiano93a64ef2018-10-30 20:46:29 +00001659 consumeError(ImportedOrErr.takeError());
Douglas Gregor0a791672011-01-18 03:11:38 +00001660 }
Fangrui Song6907ce22018-07-30 19:24:48 +00001661
Balazs Keri3b30d652018-10-19 13:32:20 +00001662 return Error::success();
Douglas Gregor968d6332010-02-21 18:24:45 +00001663}
1664
Balazs Keri3b30d652018-10-19 13:32:20 +00001665Error ASTNodeImporter::ImportDeclContext(
1666 Decl *FromD, DeclContext *&ToDC, DeclContext *&ToLexicalDC) {
1667 auto ToDCOrErr = Importer.ImportContext(FromD->getDeclContext());
1668 if (!ToDCOrErr)
1669 return ToDCOrErr.takeError();
1670 ToDC = *ToDCOrErr;
1671
1672 if (FromD->getDeclContext() != FromD->getLexicalDeclContext()) {
1673 auto ToLexicalDCOrErr = Importer.ImportContext(
1674 FromD->getLexicalDeclContext());
1675 if (!ToLexicalDCOrErr)
1676 return ToLexicalDCOrErr.takeError();
1677 ToLexicalDC = *ToLexicalDCOrErr;
1678 } else
1679 ToLexicalDC = ToDC;
1680
1681 return Error::success();
1682}
1683
1684Error ASTNodeImporter::ImportImplicitMethods(
Balazs Keri1d20cc22018-07-16 12:16:39 +00001685 const CXXRecordDecl *From, CXXRecordDecl *To) {
1686 assert(From->isCompleteDefinition() && To->getDefinition() == To &&
1687 "Import implicit methods to or from non-definition");
Fangrui Song6907ce22018-07-30 19:24:48 +00001688
Balazs Keri1d20cc22018-07-16 12:16:39 +00001689 for (CXXMethodDecl *FromM : From->methods())
Balazs Keri3b30d652018-10-19 13:32:20 +00001690 if (FromM->isImplicit()) {
1691 Expected<CXXMethodDecl *> ToMOrErr = import(FromM);
1692 if (!ToMOrErr)
1693 return ToMOrErr.takeError();
1694 }
1695
1696 return Error::success();
Balazs Keri1d20cc22018-07-16 12:16:39 +00001697}
1698
Balazs Keri3b30d652018-10-19 13:32:20 +00001699static Error setTypedefNameForAnonDecl(TagDecl *From, TagDecl *To,
1700 ASTImporter &Importer) {
Aleksei Sidorin04fbffc2018-04-24 10:11:53 +00001701 if (TypedefNameDecl *FromTypedef = From->getTypedefNameForAnonDecl()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001702 Decl *ToTypedef = Importer.Import(FromTypedef);
1703 if (!ToTypedef)
1704 return make_error<ImportError>();
1705 To->setTypedefNameForAnonDecl(cast<TypedefNameDecl>(ToTypedef));
1706 // FIXME: This should be the final code.
1707 //if (Expected<Decl *> ToTypedefOrErr = Importer.Import(FromTypedef))
1708 // To->setTypedefNameForAnonDecl(cast<TypedefNameDecl>(*ToTypedefOrErr));
1709 //else
1710 // return ToTypedefOrErr.takeError();
Aleksei Sidorin04fbffc2018-04-24 10:11:53 +00001711 }
Balazs Keri3b30d652018-10-19 13:32:20 +00001712 return Error::success();
Aleksei Sidorin04fbffc2018-04-24 10:11:53 +00001713}
1714
Balazs Keri3b30d652018-10-19 13:32:20 +00001715Error ASTNodeImporter::ImportDefinition(
1716 RecordDecl *From, RecordDecl *To, ImportDefinitionKind Kind) {
Douglas Gregor95d82832012-01-24 18:36:04 +00001717 if (To->getDefinition() || To->isBeingDefined()) {
1718 if (Kind == IDK_Everything)
Balazs Keri3b30d652018-10-19 13:32:20 +00001719 return ImportDeclContext(From, /*ForceImport=*/true);
Fangrui Song6907ce22018-07-30 19:24:48 +00001720
Balazs Keri3b30d652018-10-19 13:32:20 +00001721 return Error::success();
Douglas Gregor95d82832012-01-24 18:36:04 +00001722 }
Fangrui Song6907ce22018-07-30 19:24:48 +00001723
Douglas Gregore2e50d332010-12-01 01:36:18 +00001724 To->startDefinition();
Aleksei Sidorin04fbffc2018-04-24 10:11:53 +00001725
Balazs Keri3b30d652018-10-19 13:32:20 +00001726 if (Error Err = setTypedefNameForAnonDecl(From, To, Importer))
1727 return Err;
Fangrui Song6907ce22018-07-30 19:24:48 +00001728
Douglas Gregore2e50d332010-12-01 01:36:18 +00001729 // Add base classes.
Gabor Marton17d39672018-11-26 15:54:08 +00001730 auto *ToCXX = dyn_cast<CXXRecordDecl>(To);
1731 auto *FromCXX = dyn_cast<CXXRecordDecl>(From);
1732 if (ToCXX && FromCXX && ToCXX->dataPtr() && FromCXX->dataPtr()) {
Douglas Gregor3c2404b2011-11-03 18:07:07 +00001733
1734 struct CXXRecordDecl::DefinitionData &ToData = ToCXX->data();
1735 struct CXXRecordDecl::DefinitionData &FromData = FromCXX->data();
1736 ToData.UserDeclaredConstructor = FromData.UserDeclaredConstructor;
Richard Smith328aae52012-11-30 05:11:39 +00001737 ToData.UserDeclaredSpecialMembers = FromData.UserDeclaredSpecialMembers;
Douglas Gregor3c2404b2011-11-03 18:07:07 +00001738 ToData.Aggregate = FromData.Aggregate;
1739 ToData.PlainOldData = FromData.PlainOldData;
1740 ToData.Empty = FromData.Empty;
1741 ToData.Polymorphic = FromData.Polymorphic;
1742 ToData.Abstract = FromData.Abstract;
1743 ToData.IsStandardLayout = FromData.IsStandardLayout;
Richard Smithb6070db2018-04-05 18:55:37 +00001744 ToData.IsCXX11StandardLayout = FromData.IsCXX11StandardLayout;
1745 ToData.HasBasesWithFields = FromData.HasBasesWithFields;
1746 ToData.HasBasesWithNonStaticDataMembers =
1747 FromData.HasBasesWithNonStaticDataMembers;
Douglas Gregor3c2404b2011-11-03 18:07:07 +00001748 ToData.HasPrivateFields = FromData.HasPrivateFields;
1749 ToData.HasProtectedFields = FromData.HasProtectedFields;
1750 ToData.HasPublicFields = FromData.HasPublicFields;
1751 ToData.HasMutableFields = FromData.HasMutableFields;
Richard Smithab44d5b2013-12-10 08:25:00 +00001752 ToData.HasVariantMembers = FromData.HasVariantMembers;
Richard Smith561fb152012-02-25 07:33:38 +00001753 ToData.HasOnlyCMembers = FromData.HasOnlyCMembers;
Richard Smithe2648ba2012-05-07 01:07:30 +00001754 ToData.HasInClassInitializer = FromData.HasInClassInitializer;
Richard Smith593f9932012-12-08 02:01:17 +00001755 ToData.HasUninitializedReferenceMember
1756 = FromData.HasUninitializedReferenceMember;
Nico Weber6a6376b2016-02-19 01:52:46 +00001757 ToData.HasUninitializedFields = FromData.HasUninitializedFields;
Richard Smith12e79312016-05-13 06:47:56 +00001758 ToData.HasInheritedConstructor = FromData.HasInheritedConstructor;
1759 ToData.HasInheritedAssignment = FromData.HasInheritedAssignment;
Richard Smith96cd6712017-08-16 01:49:53 +00001760 ToData.NeedOverloadResolutionForCopyConstructor
1761 = FromData.NeedOverloadResolutionForCopyConstructor;
Richard Smith6b02d462012-12-08 08:32:28 +00001762 ToData.NeedOverloadResolutionForMoveConstructor
1763 = FromData.NeedOverloadResolutionForMoveConstructor;
1764 ToData.NeedOverloadResolutionForMoveAssignment
1765 = FromData.NeedOverloadResolutionForMoveAssignment;
1766 ToData.NeedOverloadResolutionForDestructor
1767 = FromData.NeedOverloadResolutionForDestructor;
Richard Smith96cd6712017-08-16 01:49:53 +00001768 ToData.DefaultedCopyConstructorIsDeleted
1769 = FromData.DefaultedCopyConstructorIsDeleted;
Richard Smith6b02d462012-12-08 08:32:28 +00001770 ToData.DefaultedMoveConstructorIsDeleted
1771 = FromData.DefaultedMoveConstructorIsDeleted;
1772 ToData.DefaultedMoveAssignmentIsDeleted
1773 = FromData.DefaultedMoveAssignmentIsDeleted;
1774 ToData.DefaultedDestructorIsDeleted = FromData.DefaultedDestructorIsDeleted;
Richard Smith328aae52012-11-30 05:11:39 +00001775 ToData.HasTrivialSpecialMembers = FromData.HasTrivialSpecialMembers;
1776 ToData.HasIrrelevantDestructor = FromData.HasIrrelevantDestructor;
Douglas Gregor3c2404b2011-11-03 18:07:07 +00001777 ToData.HasConstexprNonCopyMoveConstructor
1778 = FromData.HasConstexprNonCopyMoveConstructor;
Nico Weber72c57f42016-02-24 20:58:14 +00001779 ToData.HasDefaultedDefaultConstructor
1780 = FromData.HasDefaultedDefaultConstructor;
Richard Smith561fb152012-02-25 07:33:38 +00001781 ToData.DefaultedDefaultConstructorIsConstexpr
1782 = FromData.DefaultedDefaultConstructorIsConstexpr;
Richard Smith561fb152012-02-25 07:33:38 +00001783 ToData.HasConstexprDefaultConstructor
1784 = FromData.HasConstexprDefaultConstructor;
Douglas Gregor3c2404b2011-11-03 18:07:07 +00001785 ToData.HasNonLiteralTypeFieldsOrBases
1786 = FromData.HasNonLiteralTypeFieldsOrBases;
Richard Smith561fb152012-02-25 07:33:38 +00001787 // ComputedVisibleConversions not imported.
Douglas Gregor3c2404b2011-11-03 18:07:07 +00001788 ToData.UserProvidedDefaultConstructor
1789 = FromData.UserProvidedDefaultConstructor;
Richard Smith328aae52012-11-30 05:11:39 +00001790 ToData.DeclaredSpecialMembers = FromData.DeclaredSpecialMembers;
Richard Smithdf054d32017-02-25 23:53:05 +00001791 ToData.ImplicitCopyConstructorCanHaveConstParamForVBase
1792 = FromData.ImplicitCopyConstructorCanHaveConstParamForVBase;
1793 ToData.ImplicitCopyConstructorCanHaveConstParamForNonVBase
1794 = FromData.ImplicitCopyConstructorCanHaveConstParamForNonVBase;
Richard Smith1c33fe82012-11-28 06:23:12 +00001795 ToData.ImplicitCopyAssignmentHasConstParam
1796 = FromData.ImplicitCopyAssignmentHasConstParam;
1797 ToData.HasDeclaredCopyConstructorWithConstParam
1798 = FromData.HasDeclaredCopyConstructorWithConstParam;
1799 ToData.HasDeclaredCopyAssignmentWithConstParam
1800 = FromData.HasDeclaredCopyAssignmentWithConstParam;
Richard Smith561fb152012-02-25 07:33:38 +00001801
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001802 SmallVector<CXXBaseSpecifier *, 4> Bases;
Aaron Ballman574705e2014-03-13 15:41:46 +00001803 for (const auto &Base1 : FromCXX->bases()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001804 ExpectedType TyOrErr = import(Base1.getType());
1805 if (!TyOrErr)
1806 return TyOrErr.takeError();
Douglas Gregor752a5952011-01-03 22:36:02 +00001807
1808 SourceLocation EllipsisLoc;
Balazs Keri3b30d652018-10-19 13:32:20 +00001809 if (Base1.isPackExpansion()) {
1810 if (ExpectedSLoc LocOrErr = import(Base1.getEllipsisLoc()))
1811 EllipsisLoc = *LocOrErr;
1812 else
1813 return LocOrErr.takeError();
1814 }
Douglas Gregord451ea92011-07-29 23:31:30 +00001815
1816 // Ensure that we have a definition for the base.
Balazs Keri3b30d652018-10-19 13:32:20 +00001817 if (Error Err =
1818 ImportDefinitionIfNeeded(Base1.getType()->getAsCXXRecordDecl()))
1819 return Err;
1820
1821 auto RangeOrErr = import(Base1.getSourceRange());
1822 if (!RangeOrErr)
1823 return RangeOrErr.takeError();
1824
1825 auto TSIOrErr = import(Base1.getTypeSourceInfo());
1826 if (!TSIOrErr)
1827 return TSIOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001828
Douglas Gregore2e50d332010-12-01 01:36:18 +00001829 Bases.push_back(
Balazs Keri3b30d652018-10-19 13:32:20 +00001830 new (Importer.getToContext()) CXXBaseSpecifier(
1831 *RangeOrErr,
1832 Base1.isVirtual(),
1833 Base1.isBaseOfClass(),
1834 Base1.getAccessSpecifierAsWritten(),
1835 *TSIOrErr,
1836 EllipsisLoc));
Douglas Gregore2e50d332010-12-01 01:36:18 +00001837 }
1838 if (!Bases.empty())
Craig Toppere6337e12015-12-25 00:36:02 +00001839 ToCXX->setBases(Bases.data(), Bases.size());
Douglas Gregore2e50d332010-12-01 01:36:18 +00001840 }
Fangrui Song6907ce22018-07-30 19:24:48 +00001841
Douglas Gregor2e15c842012-02-01 21:00:38 +00001842 if (shouldForceImportDeclContext(Kind))
Balazs Keri3b30d652018-10-19 13:32:20 +00001843 if (Error Err = ImportDeclContext(From, /*ForceImport=*/true))
1844 return Err;
Fangrui Song6907ce22018-07-30 19:24:48 +00001845
Douglas Gregore2e50d332010-12-01 01:36:18 +00001846 To->completeDefinition();
Balazs Keri3b30d652018-10-19 13:32:20 +00001847 return Error::success();
Douglas Gregore2e50d332010-12-01 01:36:18 +00001848}
1849
Balazs Keri3b30d652018-10-19 13:32:20 +00001850Error ASTNodeImporter::ImportInitializer(VarDecl *From, VarDecl *To) {
Sean Callanan59721b32015-04-28 18:41:46 +00001851 if (To->getAnyInitializer())
Balazs Keri3b30d652018-10-19 13:32:20 +00001852 return Error::success();
Larisse Voufo39a1e502013-08-06 01:03:05 +00001853
Gabor Martonac3a5d62018-09-17 12:04:52 +00001854 Expr *FromInit = From->getInit();
1855 if (!FromInit)
Balazs Keri3b30d652018-10-19 13:32:20 +00001856 return Error::success();
Gabor Martonac3a5d62018-09-17 12:04:52 +00001857
Balazs Keri3b30d652018-10-19 13:32:20 +00001858 ExpectedExpr ToInitOrErr = import(FromInit);
1859 if (!ToInitOrErr)
1860 return ToInitOrErr.takeError();
Gabor Martonac3a5d62018-09-17 12:04:52 +00001861
Balazs Keri3b30d652018-10-19 13:32:20 +00001862 To->setInit(*ToInitOrErr);
Gabor Martonac3a5d62018-09-17 12:04:52 +00001863 if (From->isInitKnownICE()) {
1864 EvaluatedStmt *Eval = To->ensureEvaluatedStmt();
1865 Eval->CheckedICE = true;
1866 Eval->IsICE = From->isInitICE();
1867 }
Larisse Voufo39a1e502013-08-06 01:03:05 +00001868
1869 // FIXME: Other bits to merge?
Balazs Keri3b30d652018-10-19 13:32:20 +00001870 return Error::success();
Larisse Voufo39a1e502013-08-06 01:03:05 +00001871}
1872
Balazs Keri3b30d652018-10-19 13:32:20 +00001873Error ASTNodeImporter::ImportDefinition(
1874 EnumDecl *From, EnumDecl *To, ImportDefinitionKind Kind) {
Douglas Gregor2e15c842012-02-01 21:00:38 +00001875 if (To->getDefinition() || To->isBeingDefined()) {
1876 if (Kind == IDK_Everything)
Balazs Keri3b30d652018-10-19 13:32:20 +00001877 return ImportDeclContext(From, /*ForceImport=*/true);
1878 return Error::success();
Douglas Gregor2e15c842012-02-01 21:00:38 +00001879 }
Fangrui Song6907ce22018-07-30 19:24:48 +00001880
Douglas Gregord451ea92011-07-29 23:31:30 +00001881 To->startDefinition();
1882
Balazs Keri3b30d652018-10-19 13:32:20 +00001883 if (Error Err = setTypedefNameForAnonDecl(From, To, Importer))
1884 return Err;
Aleksei Sidorin04fbffc2018-04-24 10:11:53 +00001885
Balazs Keri3b30d652018-10-19 13:32:20 +00001886 ExpectedType ToTypeOrErr =
1887 import(Importer.getFromContext().getTypeDeclType(From));
1888 if (!ToTypeOrErr)
1889 return ToTypeOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001890
Balazs Keri3b30d652018-10-19 13:32:20 +00001891 ExpectedType ToPromotionTypeOrErr = import(From->getPromotionType());
1892 if (!ToPromotionTypeOrErr)
1893 return ToPromotionTypeOrErr.takeError();
Douglas Gregor2e15c842012-02-01 21:00:38 +00001894
1895 if (shouldForceImportDeclContext(Kind))
Balazs Keri3b30d652018-10-19 13:32:20 +00001896 if (Error Err = ImportDeclContext(From, /*ForceImport=*/true))
1897 return Err;
Fangrui Song6907ce22018-07-30 19:24:48 +00001898
Douglas Gregord451ea92011-07-29 23:31:30 +00001899 // FIXME: we might need to merge the number of positive or negative bits
1900 // if the enumerator lists don't match.
Balazs Keri3b30d652018-10-19 13:32:20 +00001901 To->completeDefinition(*ToTypeOrErr, *ToPromotionTypeOrErr,
Douglas Gregord451ea92011-07-29 23:31:30 +00001902 From->getNumPositiveBits(),
1903 From->getNumNegativeBits());
Balazs Keri3b30d652018-10-19 13:32:20 +00001904 return Error::success();
Douglas Gregord451ea92011-07-29 23:31:30 +00001905}
1906
Balazs Keri3b30d652018-10-19 13:32:20 +00001907// FIXME: Remove this, use `import` instead.
1908Expected<TemplateParameterList *> ASTNodeImporter::ImportTemplateParameterList(
1909 TemplateParameterList *Params) {
Aleksei Sidorina693b372016-09-28 10:16:56 +00001910 SmallVector<NamedDecl *, 4> ToParams(Params->size());
Balazs Keri3b30d652018-10-19 13:32:20 +00001911 if (Error Err = ImportContainerChecked(*Params, ToParams))
1912 return std::move(Err);
Fangrui Song6907ce22018-07-30 19:24:48 +00001913
Hubert Tonge4a0c0e2016-07-30 22:33:34 +00001914 Expr *ToRequiresClause;
1915 if (Expr *const R = Params->getRequiresClause()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001916 if (Error Err = importInto(ToRequiresClause, R))
1917 return std::move(Err);
Hubert Tonge4a0c0e2016-07-30 22:33:34 +00001918 } else {
1919 ToRequiresClause = nullptr;
1920 }
1921
Balazs Keri3b30d652018-10-19 13:32:20 +00001922 auto ToTemplateLocOrErr = import(Params->getTemplateLoc());
1923 if (!ToTemplateLocOrErr)
1924 return ToTemplateLocOrErr.takeError();
1925 auto ToLAngleLocOrErr = import(Params->getLAngleLoc());
1926 if (!ToLAngleLocOrErr)
1927 return ToLAngleLocOrErr.takeError();
1928 auto ToRAngleLocOrErr = import(Params->getRAngleLoc());
1929 if (!ToRAngleLocOrErr)
1930 return ToRAngleLocOrErr.takeError();
1931
1932 return TemplateParameterList::Create(
1933 Importer.getToContext(),
1934 *ToTemplateLocOrErr,
1935 *ToLAngleLocOrErr,
1936 ToParams,
1937 *ToRAngleLocOrErr,
1938 ToRequiresClause);
Douglas Gregora082a492010-11-30 19:14:50 +00001939}
1940
Balazs Keri3b30d652018-10-19 13:32:20 +00001941Error ASTNodeImporter::ImportTemplateArguments(
1942 const TemplateArgument *FromArgs, unsigned NumFromArgs,
1943 SmallVectorImpl<TemplateArgument> &ToArgs) {
Douglas Gregore2e50d332010-12-01 01:36:18 +00001944 for (unsigned I = 0; I != NumFromArgs; ++I) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001945 if (auto ToOrErr = import(FromArgs[I]))
1946 ToArgs.push_back(*ToOrErr);
1947 else
1948 return ToOrErr.takeError();
Douglas Gregore2e50d332010-12-01 01:36:18 +00001949 }
Fangrui Song6907ce22018-07-30 19:24:48 +00001950
Balazs Keri3b30d652018-10-19 13:32:20 +00001951 return Error::success();
Douglas Gregore2e50d332010-12-01 01:36:18 +00001952}
1953
Balazs Keri3b30d652018-10-19 13:32:20 +00001954// FIXME: Do not forget to remove this and use only 'import'.
1955Expected<TemplateArgument>
1956ASTNodeImporter::ImportTemplateArgument(const TemplateArgument &From) {
1957 return import(From);
1958}
1959
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00001960template <typename InContainerTy>
Balazs Keri3b30d652018-10-19 13:32:20 +00001961Error ASTNodeImporter::ImportTemplateArgumentListInfo(
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00001962 const InContainerTy &Container, TemplateArgumentListInfo &ToTAInfo) {
1963 for (const auto &FromLoc : Container) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001964 if (auto ToLocOrErr = import(FromLoc))
1965 ToTAInfo.addArgument(*ToLocOrErr);
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00001966 else
Balazs Keri3b30d652018-10-19 13:32:20 +00001967 return ToLocOrErr.takeError();
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00001968 }
Balazs Keri3b30d652018-10-19 13:32:20 +00001969 return Error::success();
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00001970}
1971
Gabor Marton26f72a92018-07-12 09:42:05 +00001972static StructuralEquivalenceKind
1973getStructuralEquivalenceKind(const ASTImporter &Importer) {
1974 return Importer.isMinimalImport() ? StructuralEquivalenceKind::Minimal
1975 : StructuralEquivalenceKind::Default;
1976}
1977
Gabor Marton950fb572018-07-17 12:39:27 +00001978bool ASTNodeImporter::IsStructuralMatch(Decl *From, Decl *To, bool Complain) {
1979 StructuralEquivalenceContext Ctx(
1980 Importer.getFromContext(), Importer.getToContext(),
1981 Importer.getNonEquivalentDecls(), getStructuralEquivalenceKind(Importer),
1982 false, Complain);
1983 return Ctx.IsEquivalent(From, To);
1984}
1985
1986bool ASTNodeImporter::IsStructuralMatch(RecordDecl *FromRecord,
Douglas Gregordd6006f2012-07-17 21:16:27 +00001987 RecordDecl *ToRecord, bool Complain) {
Sean Callananc665c9e2013-10-09 21:45:11 +00001988 // Eliminate a potential failure point where we attempt to re-import
1989 // something we're trying to import while completing ToRecord.
1990 Decl *ToOrigin = Importer.GetOriginalDecl(ToRecord);
1991 if (ToOrigin) {
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00001992 auto *ToOriginRecord = dyn_cast<RecordDecl>(ToOrigin);
Sean Callananc665c9e2013-10-09 21:45:11 +00001993 if (ToOriginRecord)
1994 ToRecord = ToOriginRecord;
1995 }
1996
Benjamin Kramer26d19c52010-02-18 13:02:13 +00001997 StructuralEquivalenceContext Ctx(Importer.getFromContext(),
Sean Callananc665c9e2013-10-09 21:45:11 +00001998 ToRecord->getASTContext(),
Douglas Gregordd6006f2012-07-17 21:16:27 +00001999 Importer.getNonEquivalentDecls(),
Gabor Marton26f72a92018-07-12 09:42:05 +00002000 getStructuralEquivalenceKind(Importer),
Douglas Gregordd6006f2012-07-17 21:16:27 +00002001 false, Complain);
Gabor Marton950fb572018-07-17 12:39:27 +00002002 return Ctx.IsEquivalent(FromRecord, ToRecord);
Douglas Gregor5c73e912010-02-11 00:48:18 +00002003}
2004
Larisse Voufo39a1e502013-08-06 01:03:05 +00002005bool ASTNodeImporter::IsStructuralMatch(VarDecl *FromVar, VarDecl *ToVar,
2006 bool Complain) {
2007 StructuralEquivalenceContext Ctx(
2008 Importer.getFromContext(), Importer.getToContext(),
Gabor Marton26f72a92018-07-12 09:42:05 +00002009 Importer.getNonEquivalentDecls(), getStructuralEquivalenceKind(Importer),
2010 false, Complain);
Gabor Marton950fb572018-07-17 12:39:27 +00002011 return Ctx.IsEquivalent(FromVar, ToVar);
Larisse Voufo39a1e502013-08-06 01:03:05 +00002012}
2013
Douglas Gregor98c10182010-02-12 22:17:39 +00002014bool ASTNodeImporter::IsStructuralMatch(EnumDecl *FromEnum, EnumDecl *ToEnum) {
Gabor Marton26f72a92018-07-12 09:42:05 +00002015 StructuralEquivalenceContext Ctx(
2016 Importer.getFromContext(), Importer.getToContext(),
2017 Importer.getNonEquivalentDecls(), getStructuralEquivalenceKind(Importer));
Gabor Marton950fb572018-07-17 12:39:27 +00002018 return Ctx.IsEquivalent(FromEnum, ToEnum);
Douglas Gregor98c10182010-02-12 22:17:39 +00002019}
2020
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00002021bool ASTNodeImporter::IsStructuralMatch(FunctionTemplateDecl *From,
2022 FunctionTemplateDecl *To) {
2023 StructuralEquivalenceContext Ctx(
2024 Importer.getFromContext(), Importer.getToContext(),
Gabor Marton26f72a92018-07-12 09:42:05 +00002025 Importer.getNonEquivalentDecls(), getStructuralEquivalenceKind(Importer),
2026 false, false);
Gabor Marton950fb572018-07-17 12:39:27 +00002027 return Ctx.IsEquivalent(From, To);
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00002028}
2029
Balazs Keric7797c42018-07-11 09:37:24 +00002030bool ASTNodeImporter::IsStructuralMatch(FunctionDecl *From, FunctionDecl *To) {
2031 StructuralEquivalenceContext Ctx(
2032 Importer.getFromContext(), Importer.getToContext(),
Gabor Marton26f72a92018-07-12 09:42:05 +00002033 Importer.getNonEquivalentDecls(), getStructuralEquivalenceKind(Importer),
2034 false, false);
Gabor Marton950fb572018-07-17 12:39:27 +00002035 return Ctx.IsEquivalent(From, To);
Balazs Keric7797c42018-07-11 09:37:24 +00002036}
2037
Douglas Gregor91155082012-11-14 22:29:20 +00002038bool ASTNodeImporter::IsStructuralMatch(EnumConstantDecl *FromEC,
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002039 EnumConstantDecl *ToEC) {
Douglas Gregor91155082012-11-14 22:29:20 +00002040 const llvm::APSInt &FromVal = FromEC->getInitVal();
2041 const llvm::APSInt &ToVal = ToEC->getInitVal();
2042
2043 return FromVal.isSigned() == ToVal.isSigned() &&
2044 FromVal.getBitWidth() == ToVal.getBitWidth() &&
2045 FromVal == ToVal;
2046}
2047
2048bool ASTNodeImporter::IsStructuralMatch(ClassTemplateDecl *From,
Douglas Gregora082a492010-11-30 19:14:50 +00002049 ClassTemplateDecl *To) {
2050 StructuralEquivalenceContext Ctx(Importer.getFromContext(),
2051 Importer.getToContext(),
Gabor Marton26f72a92018-07-12 09:42:05 +00002052 Importer.getNonEquivalentDecls(),
2053 getStructuralEquivalenceKind(Importer));
Gabor Marton950fb572018-07-17 12:39:27 +00002054 return Ctx.IsEquivalent(From, To);
Douglas Gregora082a492010-11-30 19:14:50 +00002055}
2056
Larisse Voufo39a1e502013-08-06 01:03:05 +00002057bool ASTNodeImporter::IsStructuralMatch(VarTemplateDecl *From,
2058 VarTemplateDecl *To) {
2059 StructuralEquivalenceContext Ctx(Importer.getFromContext(),
2060 Importer.getToContext(),
Gabor Marton26f72a92018-07-12 09:42:05 +00002061 Importer.getNonEquivalentDecls(),
2062 getStructuralEquivalenceKind(Importer));
Gabor Marton950fb572018-07-17 12:39:27 +00002063 return Ctx.IsEquivalent(From, To);
Larisse Voufo39a1e502013-08-06 01:03:05 +00002064}
2065
Balazs Keri3b30d652018-10-19 13:32:20 +00002066ExpectedDecl ASTNodeImporter::VisitDecl(Decl *D) {
Douglas Gregor811663e2010-02-10 00:15:17 +00002067 Importer.FromDiag(D->getLocation(), diag::err_unsupported_ast_node)
Douglas Gregore4c83e42010-02-09 22:48:33 +00002068 << D->getDeclKindName();
Balazs Keri3b30d652018-10-19 13:32:20 +00002069 return make_error<ImportError>(ImportError::UnsupportedConstruct);
Douglas Gregore4c83e42010-02-09 22:48:33 +00002070}
2071
Balazs Keri3b30d652018-10-19 13:32:20 +00002072ExpectedDecl ASTNodeImporter::VisitImportDecl(ImportDecl *D) {
2073 Importer.FromDiag(D->getLocation(), diag::err_unsupported_ast_node)
2074 << D->getDeclKindName();
2075 return make_error<ImportError>(ImportError::UnsupportedConstruct);
2076}
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00002077
Balazs Keri3b30d652018-10-19 13:32:20 +00002078ExpectedDecl ASTNodeImporter::VisitEmptyDecl(EmptyDecl *D) {
2079 // Import the context of this declaration.
2080 DeclContext *DC, *LexicalDC;
2081 if (Error Err = ImportDeclContext(D, DC, LexicalDC))
2082 return std::move(Err);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00002083
2084 // Import the location of this declaration.
Balazs Keri3b30d652018-10-19 13:32:20 +00002085 ExpectedSLoc LocOrErr = import(D->getLocation());
2086 if (!LocOrErr)
2087 return LocOrErr.takeError();
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00002088
Gabor Marton26f72a92018-07-12 09:42:05 +00002089 EmptyDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00002090 if (GetImportedOrCreateDecl(ToD, D, Importer.getToContext(), DC, *LocOrErr))
Gabor Marton26f72a92018-07-12 09:42:05 +00002091 return ToD;
2092
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00002093 ToD->setLexicalDeclContext(LexicalDC);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00002094 LexicalDC->addDeclInternal(ToD);
2095 return ToD;
2096}
2097
Balazs Keri3b30d652018-10-19 13:32:20 +00002098ExpectedDecl ASTNodeImporter::VisitTranslationUnitDecl(TranslationUnitDecl *D) {
Fangrui Song6907ce22018-07-30 19:24:48 +00002099 TranslationUnitDecl *ToD =
Sean Callanan65198272011-11-17 23:20:56 +00002100 Importer.getToContext().getTranslationUnitDecl();
Fangrui Song6907ce22018-07-30 19:24:48 +00002101
Gabor Marton26f72a92018-07-12 09:42:05 +00002102 Importer.MapImported(D, ToD);
Fangrui Song6907ce22018-07-30 19:24:48 +00002103
Sean Callanan65198272011-11-17 23:20:56 +00002104 return ToD;
2105}
2106
Balazs Keri3b30d652018-10-19 13:32:20 +00002107ExpectedDecl ASTNodeImporter::VisitAccessSpecDecl(AccessSpecDecl *D) {
2108 ExpectedSLoc LocOrErr = import(D->getLocation());
2109 if (!LocOrErr)
2110 return LocOrErr.takeError();
2111 auto ColonLocOrErr = import(D->getColonLoc());
2112 if (!ColonLocOrErr)
2113 return ColonLocOrErr.takeError();
Argyrios Kyrtzidis544ea712016-02-18 23:08:36 +00002114
2115 // Import the context of this declaration.
Balazs Keri3b30d652018-10-19 13:32:20 +00002116 auto DCOrErr = Importer.ImportContext(D->getDeclContext());
2117 if (!DCOrErr)
2118 return DCOrErr.takeError();
2119 DeclContext *DC = *DCOrErr;
Argyrios Kyrtzidis544ea712016-02-18 23:08:36 +00002120
Gabor Marton26f72a92018-07-12 09:42:05 +00002121 AccessSpecDecl *ToD;
2122 if (GetImportedOrCreateDecl(ToD, D, Importer.getToContext(), D->getAccess(),
Balazs Keri3b30d652018-10-19 13:32:20 +00002123 DC, *LocOrErr, *ColonLocOrErr))
Gabor Marton26f72a92018-07-12 09:42:05 +00002124 return ToD;
Argyrios Kyrtzidis544ea712016-02-18 23:08:36 +00002125
2126 // Lexical DeclContext and Semantic DeclContext
2127 // is always the same for the accessSpec.
Gabor Marton26f72a92018-07-12 09:42:05 +00002128 ToD->setLexicalDeclContext(DC);
2129 DC->addDeclInternal(ToD);
Argyrios Kyrtzidis544ea712016-02-18 23:08:36 +00002130
Gabor Marton26f72a92018-07-12 09:42:05 +00002131 return ToD;
Argyrios Kyrtzidis544ea712016-02-18 23:08:36 +00002132}
2133
Balazs Keri3b30d652018-10-19 13:32:20 +00002134ExpectedDecl ASTNodeImporter::VisitStaticAssertDecl(StaticAssertDecl *D) {
2135 auto DCOrErr = Importer.ImportContext(D->getDeclContext());
2136 if (!DCOrErr)
2137 return DCOrErr.takeError();
2138 DeclContext *DC = *DCOrErr;
Aleksei Sidorina693b372016-09-28 10:16:56 +00002139 DeclContext *LexicalDC = DC;
2140
Balazs Keri3b30d652018-10-19 13:32:20 +00002141 SourceLocation ToLocation, ToRParenLoc;
2142 Expr *ToAssertExpr;
2143 StringLiteral *ToMessage;
2144 if (auto Imp = importSeq(
2145 D->getLocation(), D->getAssertExpr(), D->getMessage(), D->getRParenLoc()))
2146 std::tie(ToLocation, ToAssertExpr, ToMessage, ToRParenLoc) = *Imp;
2147 else
2148 return Imp.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00002149
Gabor Marton26f72a92018-07-12 09:42:05 +00002150 StaticAssertDecl *ToD;
2151 if (GetImportedOrCreateDecl(
Balazs Keri3b30d652018-10-19 13:32:20 +00002152 ToD, D, Importer.getToContext(), DC, ToLocation, ToAssertExpr, ToMessage,
2153 ToRParenLoc, D->isFailed()))
Gabor Marton26f72a92018-07-12 09:42:05 +00002154 return ToD;
Aleksei Sidorina693b372016-09-28 10:16:56 +00002155
2156 ToD->setLexicalDeclContext(LexicalDC);
2157 LexicalDC->addDeclInternal(ToD);
Aleksei Sidorina693b372016-09-28 10:16:56 +00002158 return ToD;
2159}
2160
Balazs Keri3b30d652018-10-19 13:32:20 +00002161ExpectedDecl ASTNodeImporter::VisitNamespaceDecl(NamespaceDecl *D) {
Douglas Gregorf18a2c72010-02-21 18:26:36 +00002162 // Import the major distinguishing characteristics of this namespace.
2163 DeclContext *DC, *LexicalDC;
2164 DeclarationName Name;
2165 SourceLocation Loc;
Sean Callanan59721b32015-04-28 18:41:46 +00002166 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00002167 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
2168 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00002169 if (ToD)
2170 return ToD;
Craig Topper36250ad2014-05-12 05:36:57 +00002171
2172 NamespaceDecl *MergeWithNamespace = nullptr;
Douglas Gregorf18a2c72010-02-21 18:26:36 +00002173 if (!Name) {
2174 // This is an anonymous namespace. Adopt an existing anonymous
2175 // namespace if we can.
2176 // FIXME: Not testable.
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002177 if (auto *TU = dyn_cast<TranslationUnitDecl>(DC))
Douglas Gregorf18a2c72010-02-21 18:26:36 +00002178 MergeWithNamespace = TU->getAnonymousNamespace();
2179 else
2180 MergeWithNamespace = cast<NamespaceDecl>(DC)->getAnonymousNamespace();
2181 } else {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002182 SmallVector<NamedDecl *, 4> ConflictingDecls;
Gabor Marton54058b52018-12-17 13:53:12 +00002183 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002184 for (auto *FoundDecl : FoundDecls) {
2185 if (!FoundDecl->isInIdentifierNamespace(Decl::IDNS_Namespace))
Douglas Gregorf18a2c72010-02-21 18:26:36 +00002186 continue;
Fangrui Song6907ce22018-07-30 19:24:48 +00002187
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002188 if (auto *FoundNS = dyn_cast<NamespaceDecl>(FoundDecl)) {
Douglas Gregorf18a2c72010-02-21 18:26:36 +00002189 MergeWithNamespace = FoundNS;
2190 ConflictingDecls.clear();
2191 break;
2192 }
Fangrui Song6907ce22018-07-30 19:24:48 +00002193
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002194 ConflictingDecls.push_back(FoundDecl);
Douglas Gregorf18a2c72010-02-21 18:26:36 +00002195 }
Fangrui Song6907ce22018-07-30 19:24:48 +00002196
Douglas Gregorf18a2c72010-02-21 18:26:36 +00002197 if (!ConflictingDecls.empty()) {
John McCalle87beb22010-04-23 18:46:30 +00002198 Name = Importer.HandleNameConflict(Name, DC, Decl::IDNS_Namespace,
Fangrui Song6907ce22018-07-30 19:24:48 +00002199 ConflictingDecls.data(),
Douglas Gregorf18a2c72010-02-21 18:26:36 +00002200 ConflictingDecls.size());
Balazs Keri3b30d652018-10-19 13:32:20 +00002201 if (!Name)
2202 return make_error<ImportError>(ImportError::NameConflict);
Douglas Gregorf18a2c72010-02-21 18:26:36 +00002203 }
2204 }
Fangrui Song6907ce22018-07-30 19:24:48 +00002205
Balazs Keri3b30d652018-10-19 13:32:20 +00002206 ExpectedSLoc BeginLocOrErr = import(D->getBeginLoc());
2207 if (!BeginLocOrErr)
2208 return BeginLocOrErr.takeError();
2209
Douglas Gregorf18a2c72010-02-21 18:26:36 +00002210 // Create the "to" namespace, if needed.
2211 NamespaceDecl *ToNamespace = MergeWithNamespace;
2212 if (!ToNamespace) {
Gabor Marton26f72a92018-07-12 09:42:05 +00002213 if (GetImportedOrCreateDecl(
2214 ToNamespace, D, Importer.getToContext(), DC, D->isInline(),
Balazs Keri3b30d652018-10-19 13:32:20 +00002215 *BeginLocOrErr, Loc, Name.getAsIdentifierInfo(),
Gabor Marton26f72a92018-07-12 09:42:05 +00002216 /*PrevDecl=*/nullptr))
2217 return ToNamespace;
Douglas Gregorf18a2c72010-02-21 18:26:36 +00002218 ToNamespace->setLexicalDeclContext(LexicalDC);
Sean Callanan95e74be2011-10-21 02:57:43 +00002219 LexicalDC->addDeclInternal(ToNamespace);
Fangrui Song6907ce22018-07-30 19:24:48 +00002220
Douglas Gregorf18a2c72010-02-21 18:26:36 +00002221 // If this is an anonymous namespace, register it as the anonymous
2222 // namespace within its context.
2223 if (!Name) {
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002224 if (auto *TU = dyn_cast<TranslationUnitDecl>(DC))
Douglas Gregorf18a2c72010-02-21 18:26:36 +00002225 TU->setAnonymousNamespace(ToNamespace);
2226 else
2227 cast<NamespaceDecl>(DC)->setAnonymousNamespace(ToNamespace);
2228 }
2229 }
Gabor Marton26f72a92018-07-12 09:42:05 +00002230 Importer.MapImported(D, ToNamespace);
Fangrui Song6907ce22018-07-30 19:24:48 +00002231
Balazs Keri3b30d652018-10-19 13:32:20 +00002232 if (Error Err = ImportDeclContext(D))
2233 return std::move(Err);
Fangrui Song6907ce22018-07-30 19:24:48 +00002234
Douglas Gregorf18a2c72010-02-21 18:26:36 +00002235 return ToNamespace;
2236}
2237
Balazs Keri3b30d652018-10-19 13:32:20 +00002238ExpectedDecl ASTNodeImporter::VisitNamespaceAliasDecl(NamespaceAliasDecl *D) {
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00002239 // Import the major distinguishing characteristics of this namespace.
2240 DeclContext *DC, *LexicalDC;
2241 DeclarationName Name;
2242 SourceLocation Loc;
2243 NamedDecl *LookupD;
Balazs Keri3b30d652018-10-19 13:32:20 +00002244 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, LookupD, Loc))
2245 return std::move(Err);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00002246 if (LookupD)
2247 return LookupD;
2248
2249 // NOTE: No conflict resolution is done for namespace aliases now.
2250
Balazs Keri3b30d652018-10-19 13:32:20 +00002251 SourceLocation ToNamespaceLoc, ToAliasLoc, ToTargetNameLoc;
2252 NestedNameSpecifierLoc ToQualifierLoc;
2253 NamespaceDecl *ToNamespace;
2254 if (auto Imp = importSeq(
2255 D->getNamespaceLoc(), D->getAliasLoc(), D->getQualifierLoc(),
2256 D->getTargetNameLoc(), D->getNamespace()))
2257 std::tie(
2258 ToNamespaceLoc, ToAliasLoc, ToQualifierLoc, ToTargetNameLoc,
2259 ToNamespace) = *Imp;
2260 else
2261 return Imp.takeError();
2262 IdentifierInfo *ToIdentifier = Importer.Import(D->getIdentifier());
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00002263
Gabor Marton26f72a92018-07-12 09:42:05 +00002264 NamespaceAliasDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00002265 if (GetImportedOrCreateDecl(
2266 ToD, D, Importer.getToContext(), DC, ToNamespaceLoc, ToAliasLoc,
2267 ToIdentifier, ToQualifierLoc, ToTargetNameLoc, ToNamespace))
Gabor Marton26f72a92018-07-12 09:42:05 +00002268 return ToD;
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00002269
2270 ToD->setLexicalDeclContext(LexicalDC);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00002271 LexicalDC->addDeclInternal(ToD);
2272
2273 return ToD;
2274}
2275
Balazs Keri3b30d652018-10-19 13:32:20 +00002276ExpectedDecl
2277ASTNodeImporter::VisitTypedefNameDecl(TypedefNameDecl *D, bool IsAlias) {
Douglas Gregor5fa74c32010-02-10 21:10:29 +00002278 // Import the major distinguishing characteristics of this typedef.
2279 DeclContext *DC, *LexicalDC;
2280 DeclarationName Name;
2281 SourceLocation Loc;
Sean Callanan59721b32015-04-28 18:41:46 +00002282 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00002283 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
2284 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00002285 if (ToD)
2286 return ToD;
Craig Topper36250ad2014-05-12 05:36:57 +00002287
Douglas Gregor5fa74c32010-02-10 21:10:29 +00002288 // If this typedef is not in block scope, determine whether we've
2289 // seen a typedef with the same name (that we can merge with) or any
2290 // other entity by that name (which name lookup could conflict with).
2291 if (!DC->isFunctionOrMethod()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002292 SmallVector<NamedDecl *, 4> ConflictingDecls;
Douglas Gregor5fa74c32010-02-10 21:10:29 +00002293 unsigned IDNS = Decl::IDNS_Ordinary;
Gabor Marton54058b52018-12-17 13:53:12 +00002294 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002295 for (auto *FoundDecl : FoundDecls) {
2296 if (!FoundDecl->isInIdentifierNamespace(IDNS))
Douglas Gregor5fa74c32010-02-10 21:10:29 +00002297 continue;
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002298 if (auto *FoundTypedef = dyn_cast<TypedefNameDecl>(FoundDecl)) {
Gabor Martonb93baf62018-11-27 09:51:36 +00002299 QualType FromUT = D->getUnderlyingType();
2300 QualType FoundUT = FoundTypedef->getUnderlyingType();
2301 if (Importer.IsStructurallyEquivalent(FromUT, FoundUT)) {
2302 // If the "From" context has a complete underlying type but we
2303 // already have a complete underlying type then return with that.
2304 if (!FromUT->isIncompleteType() && !FoundUT->isIncompleteType())
Balazs Keri3b30d652018-10-19 13:32:20 +00002305 return Importer.MapImported(D, FoundTypedef);
Gabor Martonb93baf62018-11-27 09:51:36 +00002306 }
2307 // FIXME Handle redecl chain.
2308 break;
Douglas Gregor5fa74c32010-02-10 21:10:29 +00002309 }
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00002310
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002311 ConflictingDecls.push_back(FoundDecl);
Douglas Gregor5fa74c32010-02-10 21:10:29 +00002312 }
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00002313
Douglas Gregor5fa74c32010-02-10 21:10:29 +00002314 if (!ConflictingDecls.empty()) {
2315 Name = Importer.HandleNameConflict(Name, DC, IDNS,
Fangrui Song6907ce22018-07-30 19:24:48 +00002316 ConflictingDecls.data(),
Douglas Gregor5fa74c32010-02-10 21:10:29 +00002317 ConflictingDecls.size());
2318 if (!Name)
Balazs Keri3b30d652018-10-19 13:32:20 +00002319 return make_error<ImportError>(ImportError::NameConflict);
Douglas Gregor5fa74c32010-02-10 21:10:29 +00002320 }
2321 }
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00002322
Balazs Keri3b30d652018-10-19 13:32:20 +00002323 QualType ToUnderlyingType;
2324 TypeSourceInfo *ToTypeSourceInfo;
2325 SourceLocation ToBeginLoc;
2326 if (auto Imp = importSeq(
2327 D->getUnderlyingType(), D->getTypeSourceInfo(), D->getBeginLoc()))
2328 std::tie(ToUnderlyingType, ToTypeSourceInfo, ToBeginLoc) = *Imp;
2329 else
2330 return Imp.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00002331
Douglas Gregor5fa74c32010-02-10 21:10:29 +00002332 // Create the new typedef node.
Balazs Keri3b30d652018-10-19 13:32:20 +00002333 // FIXME: ToUnderlyingType is not used.
Richard Smithdda56e42011-04-15 14:24:37 +00002334 TypedefNameDecl *ToTypedef;
Gabor Marton26f72a92018-07-12 09:42:05 +00002335 if (IsAlias) {
2336 if (GetImportedOrCreateDecl<TypeAliasDecl>(
Balazs Keri3b30d652018-10-19 13:32:20 +00002337 ToTypedef, D, Importer.getToContext(), DC, ToBeginLoc, Loc,
2338 Name.getAsIdentifierInfo(), ToTypeSourceInfo))
Gabor Marton26f72a92018-07-12 09:42:05 +00002339 return ToTypedef;
2340 } else if (GetImportedOrCreateDecl<TypedefDecl>(
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;
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00002344
Douglas Gregordd483172010-02-22 17:42:47 +00002345 ToTypedef->setAccess(D->getAccess());
Douglas Gregor5fa74c32010-02-10 21:10:29 +00002346 ToTypedef->setLexicalDeclContext(LexicalDC);
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00002347
2348 // Templated declarations should not appear in DeclContext.
2349 TypeAliasDecl *FromAlias = IsAlias ? cast<TypeAliasDecl>(D) : nullptr;
2350 if (!FromAlias || !FromAlias->getDescribedAliasTemplate())
2351 LexicalDC->addDeclInternal(ToTypedef);
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00002352
Douglas Gregor5fa74c32010-02-10 21:10:29 +00002353 return ToTypedef;
2354}
2355
Balazs Keri3b30d652018-10-19 13:32:20 +00002356ExpectedDecl ASTNodeImporter::VisitTypedefDecl(TypedefDecl *D) {
Richard Smithdda56e42011-04-15 14:24:37 +00002357 return VisitTypedefNameDecl(D, /*IsAlias=*/false);
2358}
2359
Balazs Keri3b30d652018-10-19 13:32:20 +00002360ExpectedDecl ASTNodeImporter::VisitTypeAliasDecl(TypeAliasDecl *D) {
Richard Smithdda56e42011-04-15 14:24:37 +00002361 return VisitTypedefNameDecl(D, /*IsAlias=*/true);
2362}
2363
Balazs Keri3b30d652018-10-19 13:32:20 +00002364ExpectedDecl
2365ASTNodeImporter::VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D) {
Gabor Horvath7a91c082017-11-14 11:30:38 +00002366 // Import the major distinguishing characteristics of this typedef.
2367 DeclContext *DC, *LexicalDC;
2368 DeclarationName Name;
2369 SourceLocation Loc;
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00002370 NamedDecl *FoundD;
Balazs Keri3b30d652018-10-19 13:32:20 +00002371 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, FoundD, Loc))
2372 return std::move(Err);
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00002373 if (FoundD)
2374 return FoundD;
Gabor Horvath7a91c082017-11-14 11:30:38 +00002375
2376 // If this typedef is not in block scope, determine whether we've
2377 // seen a typedef with the same name (that we can merge with) or any
2378 // other entity by that name (which name lookup could conflict with).
2379 if (!DC->isFunctionOrMethod()) {
2380 SmallVector<NamedDecl *, 4> ConflictingDecls;
2381 unsigned IDNS = Decl::IDNS_Ordinary;
Gabor Marton54058b52018-12-17 13:53:12 +00002382 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002383 for (auto *FoundDecl : FoundDecls) {
2384 if (!FoundDecl->isInIdentifierNamespace(IDNS))
Gabor Horvath7a91c082017-11-14 11:30:38 +00002385 continue;
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002386 if (auto *FoundAlias = dyn_cast<TypeAliasTemplateDecl>(FoundDecl))
Gabor Marton26f72a92018-07-12 09:42:05 +00002387 return Importer.MapImported(D, FoundAlias);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002388 ConflictingDecls.push_back(FoundDecl);
Gabor Horvath7a91c082017-11-14 11:30:38 +00002389 }
2390
2391 if (!ConflictingDecls.empty()) {
2392 Name = Importer.HandleNameConflict(Name, DC, IDNS,
2393 ConflictingDecls.data(),
2394 ConflictingDecls.size());
2395 if (!Name)
Balazs Keri3b30d652018-10-19 13:32:20 +00002396 return make_error<ImportError>(ImportError::NameConflict);
Gabor Horvath7a91c082017-11-14 11:30:38 +00002397 }
2398 }
2399
Balazs Keri3b30d652018-10-19 13:32:20 +00002400 TemplateParameterList *ToTemplateParameters;
2401 TypeAliasDecl *ToTemplatedDecl;
2402 if (auto Imp = importSeq(D->getTemplateParameters(), D->getTemplatedDecl()))
2403 std::tie(ToTemplateParameters, ToTemplatedDecl) = *Imp;
2404 else
2405 return Imp.takeError();
Gabor Horvath7a91c082017-11-14 11:30:38 +00002406
Gabor Marton26f72a92018-07-12 09:42:05 +00002407 TypeAliasTemplateDecl *ToAlias;
2408 if (GetImportedOrCreateDecl(ToAlias, D, Importer.getToContext(), DC, Loc,
Balazs Keri3b30d652018-10-19 13:32:20 +00002409 Name, ToTemplateParameters, ToTemplatedDecl))
Gabor Marton26f72a92018-07-12 09:42:05 +00002410 return ToAlias;
Gabor Horvath7a91c082017-11-14 11:30:38 +00002411
Balazs Keri3b30d652018-10-19 13:32:20 +00002412 ToTemplatedDecl->setDescribedAliasTemplate(ToAlias);
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00002413
Gabor Horvath7a91c082017-11-14 11:30:38 +00002414 ToAlias->setAccess(D->getAccess());
2415 ToAlias->setLexicalDeclContext(LexicalDC);
Gabor Horvath7a91c082017-11-14 11:30:38 +00002416 LexicalDC->addDeclInternal(ToAlias);
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00002417 return ToAlias;
Gabor Horvath7a91c082017-11-14 11:30:38 +00002418}
2419
Balazs Keri3b30d652018-10-19 13:32:20 +00002420ExpectedDecl ASTNodeImporter::VisitLabelDecl(LabelDecl *D) {
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00002421 // Import the major distinguishing characteristics of this label.
2422 DeclContext *DC, *LexicalDC;
2423 DeclarationName Name;
2424 SourceLocation Loc;
2425 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00002426 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
2427 return std::move(Err);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00002428 if (ToD)
2429 return ToD;
2430
2431 assert(LexicalDC->isFunctionOrMethod());
2432
Gabor Marton26f72a92018-07-12 09:42:05 +00002433 LabelDecl *ToLabel;
Balazs Keri3b30d652018-10-19 13:32:20 +00002434 if (D->isGnuLocal()) {
2435 ExpectedSLoc BeginLocOrErr = import(D->getBeginLoc());
2436 if (!BeginLocOrErr)
2437 return BeginLocOrErr.takeError();
2438 if (GetImportedOrCreateDecl(ToLabel, D, Importer.getToContext(), DC, Loc,
2439 Name.getAsIdentifierInfo(), *BeginLocOrErr))
2440 return ToLabel;
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00002441
Balazs Keri3b30d652018-10-19 13:32:20 +00002442 } else {
2443 if (GetImportedOrCreateDecl(ToLabel, D, Importer.getToContext(), DC, Loc,
2444 Name.getAsIdentifierInfo()))
2445 return ToLabel;
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00002446
Balazs Keri3b30d652018-10-19 13:32:20 +00002447 }
2448
2449 Expected<LabelStmt *> ToStmtOrErr = import(D->getStmt());
2450 if (!ToStmtOrErr)
2451 return ToStmtOrErr.takeError();
2452
2453 ToLabel->setStmt(*ToStmtOrErr);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00002454 ToLabel->setLexicalDeclContext(LexicalDC);
2455 LexicalDC->addDeclInternal(ToLabel);
2456 return ToLabel;
2457}
2458
Balazs Keri3b30d652018-10-19 13:32:20 +00002459ExpectedDecl ASTNodeImporter::VisitEnumDecl(EnumDecl *D) {
Douglas Gregor98c10182010-02-12 22:17:39 +00002460 // Import the major distinguishing characteristics of this enum.
2461 DeclContext *DC, *LexicalDC;
2462 DeclarationName Name;
2463 SourceLocation Loc;
Sean Callanan59721b32015-04-28 18:41:46 +00002464 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00002465 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
2466 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00002467 if (ToD)
2468 return ToD;
Craig Topper36250ad2014-05-12 05:36:57 +00002469
Douglas Gregor98c10182010-02-12 22:17:39 +00002470 // Figure out what enum name we're looking for.
2471 unsigned IDNS = Decl::IDNS_Tag;
2472 DeclarationName SearchName = Name;
Richard Smithdda56e42011-04-15 14:24:37 +00002473 if (!SearchName && D->getTypedefNameForAnonDecl()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00002474 if (Error Err = importInto(
2475 SearchName, D->getTypedefNameForAnonDecl()->getDeclName()))
2476 return std::move(Err);
Douglas Gregor98c10182010-02-12 22:17:39 +00002477 IDNS = Decl::IDNS_Ordinary;
David Blaikiebbafb8a2012-03-11 07:00:24 +00002478 } else if (Importer.getToContext().getLangOpts().CPlusPlus)
Douglas Gregor98c10182010-02-12 22:17:39 +00002479 IDNS |= Decl::IDNS_Ordinary;
Fangrui Song6907ce22018-07-30 19:24:48 +00002480
Douglas Gregor98c10182010-02-12 22:17:39 +00002481 // We may already have an enum of the same name; try to find and match it.
2482 if (!DC->isFunctionOrMethod() && SearchName) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002483 SmallVector<NamedDecl *, 4> ConflictingDecls;
Gabor Marton54058b52018-12-17 13:53:12 +00002484 auto FoundDecls =
2485 Importer.findDeclsInToCtx(DC, SearchName);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002486 for (auto *FoundDecl : FoundDecls) {
2487 if (!FoundDecl->isInIdentifierNamespace(IDNS))
Douglas Gregor98c10182010-02-12 22:17:39 +00002488 continue;
Fangrui Song6907ce22018-07-30 19:24:48 +00002489
Balazs Keri3b30d652018-10-19 13:32:20 +00002490 if (auto *Typedef = dyn_cast<TypedefNameDecl>(FoundDecl)) {
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002491 if (const auto *Tag = Typedef->getUnderlyingType()->getAs<TagType>())
Balazs Keri3b30d652018-10-19 13:32:20 +00002492 FoundDecl = Tag->getDecl();
Douglas Gregor98c10182010-02-12 22:17:39 +00002493 }
Fangrui Song6907ce22018-07-30 19:24:48 +00002494
Balazs Keri3b30d652018-10-19 13:32:20 +00002495 if (auto *FoundEnum = dyn_cast<EnumDecl>(FoundDecl)) {
Douglas Gregor8cdbe642010-02-12 23:44:20 +00002496 if (IsStructuralMatch(D, FoundEnum))
Gabor Marton26f72a92018-07-12 09:42:05 +00002497 return Importer.MapImported(D, FoundEnum);
Douglas Gregor98c10182010-02-12 22:17:39 +00002498 }
Fangrui Song6907ce22018-07-30 19:24:48 +00002499
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002500 ConflictingDecls.push_back(FoundDecl);
Douglas Gregor98c10182010-02-12 22:17:39 +00002501 }
Fangrui Song6907ce22018-07-30 19:24:48 +00002502
Douglas Gregor98c10182010-02-12 22:17:39 +00002503 if (!ConflictingDecls.empty()) {
2504 Name = Importer.HandleNameConflict(Name, DC, IDNS,
Fangrui Song6907ce22018-07-30 19:24:48 +00002505 ConflictingDecls.data(),
Douglas Gregor98c10182010-02-12 22:17:39 +00002506 ConflictingDecls.size());
Balazs Keri3b30d652018-10-19 13:32:20 +00002507 if (!Name)
2508 return make_error<ImportError>(ImportError::NameConflict);
Douglas Gregor98c10182010-02-12 22:17:39 +00002509 }
2510 }
Gabor Marton26f72a92018-07-12 09:42:05 +00002511
Balazs Keri3b30d652018-10-19 13:32:20 +00002512 SourceLocation ToBeginLoc;
2513 NestedNameSpecifierLoc ToQualifierLoc;
2514 QualType ToIntegerType;
2515 if (auto Imp = importSeq(
2516 D->getBeginLoc(), D->getQualifierLoc(), D->getIntegerType()))
2517 std::tie(ToBeginLoc, ToQualifierLoc, ToIntegerType) = *Imp;
2518 else
2519 return Imp.takeError();
2520
Douglas Gregor98c10182010-02-12 22:17:39 +00002521 // Create the enum declaration.
Gabor Marton26f72a92018-07-12 09:42:05 +00002522 EnumDecl *D2;
2523 if (GetImportedOrCreateDecl(
Balazs Keri3b30d652018-10-19 13:32:20 +00002524 D2, D, Importer.getToContext(), DC, ToBeginLoc,
Gabor Marton26f72a92018-07-12 09:42:05 +00002525 Loc, Name.getAsIdentifierInfo(), nullptr, D->isScoped(),
2526 D->isScopedUsingClassTag(), D->isFixed()))
2527 return D2;
2528
Balazs Keri3b30d652018-10-19 13:32:20 +00002529 D2->setQualifierInfo(ToQualifierLoc);
2530 D2->setIntegerType(ToIntegerType);
Douglas Gregordd483172010-02-22 17:42:47 +00002531 D2->setAccess(D->getAccess());
Douglas Gregor3996e242010-02-15 22:01:00 +00002532 D2->setLexicalDeclContext(LexicalDC);
Sean Callanan95e74be2011-10-21 02:57:43 +00002533 LexicalDC->addDeclInternal(D2);
Douglas Gregor98c10182010-02-12 22:17:39 +00002534
Douglas Gregor98c10182010-02-12 22:17:39 +00002535 // Import the definition
Balazs Keri3b30d652018-10-19 13:32:20 +00002536 if (D->isCompleteDefinition())
2537 if (Error Err = ImportDefinition(D, D2))
2538 return std::move(Err);
Douglas Gregor98c10182010-02-12 22:17:39 +00002539
Douglas Gregor3996e242010-02-15 22:01:00 +00002540 return D2;
Douglas Gregor98c10182010-02-12 22:17:39 +00002541}
2542
Balazs Keri3b30d652018-10-19 13:32:20 +00002543ExpectedDecl ASTNodeImporter::VisitRecordDecl(RecordDecl *D) {
Balazs Keri0c23dc52018-08-13 13:08:37 +00002544 bool IsFriendTemplate = false;
2545 if (auto *DCXX = dyn_cast<CXXRecordDecl>(D)) {
2546 IsFriendTemplate =
2547 DCXX->getDescribedClassTemplate() &&
2548 DCXX->getDescribedClassTemplate()->getFriendObjectKind() !=
2549 Decl::FOK_None;
2550 }
2551
Douglas Gregor5c73e912010-02-11 00:48:18 +00002552 // If this record has a definition in the translation unit we're coming from,
2553 // but this particular declaration is not that definition, import the
2554 // definition and map to that.
Douglas Gregor0a5a2212010-02-11 01:04:33 +00002555 TagDecl *Definition = D->getDefinition();
Gabor Martona3af5672018-05-23 14:24:02 +00002556 if (Definition && Definition != D &&
Balazs Keri0c23dc52018-08-13 13:08:37 +00002557 // Friend template declaration must be imported on its own.
2558 !IsFriendTemplate &&
Gabor Martona3af5672018-05-23 14:24:02 +00002559 // In contrast to a normal CXXRecordDecl, the implicit
2560 // CXXRecordDecl of ClassTemplateSpecializationDecl is its redeclaration.
2561 // The definition of the implicit CXXRecordDecl in this case is the
2562 // ClassTemplateSpecializationDecl itself. Thus, we start with an extra
2563 // condition in order to be able to import the implict Decl.
2564 !D->isImplicit()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00002565 ExpectedDecl ImportedDefOrErr = import(Definition);
2566 if (!ImportedDefOrErr)
2567 return ImportedDefOrErr.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00002568
Balazs Keri3b30d652018-10-19 13:32:20 +00002569 return Importer.MapImported(D, *ImportedDefOrErr);
Douglas Gregor5c73e912010-02-11 00:48:18 +00002570 }
Gabor Martona3af5672018-05-23 14:24:02 +00002571
Douglas Gregor5c73e912010-02-11 00:48:18 +00002572 // Import the major distinguishing characteristics of this record.
2573 DeclContext *DC, *LexicalDC;
2574 DeclarationName Name;
2575 SourceLocation Loc;
Sean Callanan59721b32015-04-28 18:41:46 +00002576 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00002577 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
2578 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00002579 if (ToD)
2580 return ToD;
Craig Topper36250ad2014-05-12 05:36:57 +00002581
Douglas Gregor5c73e912010-02-11 00:48:18 +00002582 // Figure out what structure name we're looking for.
2583 unsigned IDNS = Decl::IDNS_Tag;
2584 DeclarationName SearchName = Name;
Richard Smithdda56e42011-04-15 14:24:37 +00002585 if (!SearchName && D->getTypedefNameForAnonDecl()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00002586 if (Error Err = importInto(
2587 SearchName, D->getTypedefNameForAnonDecl()->getDeclName()))
2588 return std::move(Err);
Douglas Gregor5c73e912010-02-11 00:48:18 +00002589 IDNS = Decl::IDNS_Ordinary;
David Blaikiebbafb8a2012-03-11 07:00:24 +00002590 } else if (Importer.getToContext().getLangOpts().CPlusPlus)
Gabor Marton7df342a2018-12-17 12:42:12 +00002591 IDNS |= Decl::IDNS_Ordinary | Decl::IDNS_TagFriend;
Douglas Gregor5c73e912010-02-11 00:48:18 +00002592
2593 // We may already have a record of the same name; try to find and match it.
Sean Callanan9092d472017-05-13 00:46:33 +00002594 RecordDecl *PrevDecl = nullptr;
Douglas Gregordd6006f2012-07-17 21:16:27 +00002595 if (!DC->isFunctionOrMethod()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002596 SmallVector<NamedDecl *, 4> ConflictingDecls;
Gabor Marton54058b52018-12-17 13:53:12 +00002597 auto FoundDecls =
2598 Importer.findDeclsInToCtx(DC, SearchName);
Sean Callanan9092d472017-05-13 00:46:33 +00002599 if (!FoundDecls.empty()) {
2600 // We're going to have to compare D against potentially conflicting Decls, so complete it.
2601 if (D->hasExternalLexicalStorage() && !D->isCompleteDefinition())
2602 D->getASTContext().getExternalSource()->CompleteType(D);
2603 }
2604
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002605 for (auto *FoundDecl : FoundDecls) {
2606 if (!FoundDecl->isInIdentifierNamespace(IDNS))
Douglas Gregor5c73e912010-02-11 00:48:18 +00002607 continue;
Fangrui Song6907ce22018-07-30 19:24:48 +00002608
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002609 Decl *Found = FoundDecl;
2610 if (auto *Typedef = dyn_cast<TypedefNameDecl>(Found)) {
2611 if (const auto *Tag = Typedef->getUnderlyingType()->getAs<TagType>())
Douglas Gregor5c73e912010-02-11 00:48:18 +00002612 Found = Tag->getDecl();
2613 }
Gabor Martona0df7a92018-05-30 09:19:26 +00002614
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002615 if (auto *FoundRecord = dyn_cast<RecordDecl>(Found)) {
Gabor Marton7df342a2018-12-17 12:42:12 +00002616 // Do not emit false positive diagnostic in case of unnamed
2617 // struct/union and in case of anonymous structs. Would be false
2618 // because there may be several anonymous/unnamed structs in a class.
2619 // E.g. these are both valid:
2620 // struct A { // unnamed structs
2621 // struct { struct A *next; } entry0;
2622 // struct { struct A *next; } entry1;
2623 // };
2624 // struct X { struct { int a; }; struct { int b; }; }; // anon structs
2625 if (!SearchName)
Gabor Marton0bebf952018-07-05 09:51:13 +00002626 if (!IsStructuralMatch(D, FoundRecord, false))
2627 continue;
Douglas Gregorceb32bf2012-10-26 16:45:11 +00002628
Gabor Marton7df342a2018-12-17 12:42:12 +00002629 if (IsStructuralMatch(D, FoundRecord)) {
2630 RecordDecl *FoundDef = FoundRecord->getDefinition();
2631 if (D->isThisDeclarationADefinition() && FoundDef) {
Balazs Keri1d20cc22018-07-16 12:16:39 +00002632 // FIXME: Structural equivalence check should check for same
2633 // user-defined methods.
2634 Importer.MapImported(D, FoundDef);
2635 if (const auto *DCXX = dyn_cast<CXXRecordDecl>(D)) {
2636 auto *FoundCXX = dyn_cast<CXXRecordDecl>(FoundDef);
2637 assert(FoundCXX && "Record type mismatch");
2638
Gabor Marton7df342a2018-12-17 12:42:12 +00002639 if (!Importer.isMinimalImport())
Balazs Keri1d20cc22018-07-16 12:16:39 +00002640 // FoundDef may not have every implicit method that D has
2641 // because implicit methods are created only if they are used.
Balazs Keri3b30d652018-10-19 13:32:20 +00002642 if (Error Err = ImportImplicitMethods(DCXX, FoundCXX))
2643 return std::move(Err);
Balazs Keri1d20cc22018-07-16 12:16:39 +00002644 }
Douglas Gregor25791052010-02-12 00:09:27 +00002645 }
Gabor Marton7df342a2018-12-17 12:42:12 +00002646 PrevDecl = FoundRecord->getMostRecentDecl();
2647 break;
Douglas Gregordd6006f2012-07-17 21:16:27 +00002648 }
Gabor Marton7df342a2018-12-17 12:42:12 +00002649 }
Fangrui Song6907ce22018-07-30 19:24:48 +00002650
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002651 ConflictingDecls.push_back(FoundDecl);
Gabor Marton7df342a2018-12-17 12:42:12 +00002652 } // for
Fangrui Song6907ce22018-07-30 19:24:48 +00002653
Douglas Gregordd6006f2012-07-17 21:16:27 +00002654 if (!ConflictingDecls.empty() && SearchName) {
Douglas Gregor5c73e912010-02-11 00:48:18 +00002655 Name = Importer.HandleNameConflict(Name, DC, IDNS,
Fangrui Song6907ce22018-07-30 19:24:48 +00002656 ConflictingDecls.data(),
Douglas Gregor5c73e912010-02-11 00:48:18 +00002657 ConflictingDecls.size());
Balazs Keri3b30d652018-10-19 13:32:20 +00002658 if (!Name)
2659 return make_error<ImportError>(ImportError::NameConflict);
Douglas Gregor5c73e912010-02-11 00:48:18 +00002660 }
2661 }
Fangrui Song6907ce22018-07-30 19:24:48 +00002662
Balazs Keri3b30d652018-10-19 13:32:20 +00002663 ExpectedSLoc BeginLocOrErr = import(D->getBeginLoc());
2664 if (!BeginLocOrErr)
2665 return BeginLocOrErr.takeError();
2666
Douglas Gregor5c73e912010-02-11 00:48:18 +00002667 // Create the record declaration.
Gabor Marton7df342a2018-12-17 12:42:12 +00002668 RecordDecl *D2 = nullptr;
2669 CXXRecordDecl *D2CXX = nullptr;
2670 if (auto *DCXX = dyn_cast<CXXRecordDecl>(D)) {
2671 if (DCXX->isLambda()) {
2672 auto TInfoOrErr = import(DCXX->getLambdaTypeInfo());
2673 if (!TInfoOrErr)
2674 return TInfoOrErr.takeError();
2675 if (GetImportedOrCreateSpecialDecl(
2676 D2CXX, CXXRecordDecl::CreateLambda, D, Importer.getToContext(),
2677 DC, *TInfoOrErr, Loc, DCXX->isDependentLambda(),
2678 DCXX->isGenericLambda(), DCXX->getLambdaCaptureDefault()))
2679 return D2CXX;
2680 ExpectedDecl CDeclOrErr = import(DCXX->getLambdaContextDecl());
2681 if (!CDeclOrErr)
2682 return CDeclOrErr.takeError();
2683 D2CXX->setLambdaMangling(DCXX->getLambdaManglingNumber(), *CDeclOrErr);
2684 } else if (DCXX->isInjectedClassName()) {
2685 // We have to be careful to do a similar dance to the one in
2686 // Sema::ActOnStartCXXMemberDeclarations
2687 const bool DelayTypeCreation = true;
2688 if (GetImportedOrCreateDecl(
2689 D2CXX, D, Importer.getToContext(), D->getTagKind(), DC,
2690 *BeginLocOrErr, Loc, Name.getAsIdentifierInfo(),
2691 cast_or_null<CXXRecordDecl>(PrevDecl), DelayTypeCreation))
2692 return D2CXX;
2693 Importer.getToContext().getTypeDeclType(
2694 D2CXX, dyn_cast<CXXRecordDecl>(DC));
2695 } else {
2696 if (GetImportedOrCreateDecl(D2CXX, D, Importer.getToContext(),
2697 D->getTagKind(), DC, *BeginLocOrErr, Loc,
2698 Name.getAsIdentifierInfo(),
2699 cast_or_null<CXXRecordDecl>(PrevDecl)))
2700 return D2CXX;
2701 }
Gabor Marton26f72a92018-07-12 09:42:05 +00002702
Gabor Marton7df342a2018-12-17 12:42:12 +00002703 D2 = D2CXX;
2704 D2->setAccess(D->getAccess());
2705 D2->setLexicalDeclContext(LexicalDC);
2706 if (!DCXX->getDescribedClassTemplate() || DCXX->isImplicit())
2707 LexicalDC->addDeclInternal(D2);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00002708
Gabor Marton7df342a2018-12-17 12:42:12 +00002709 if (LexicalDC != DC && D->isInIdentifierNamespace(Decl::IDNS_TagFriend))
2710 DC->makeDeclVisibleInContext(D2);
2711
2712 if (ClassTemplateDecl *FromDescribed =
2713 DCXX->getDescribedClassTemplate()) {
2714 ClassTemplateDecl *ToDescribed;
2715 if (Error Err = importInto(ToDescribed, FromDescribed))
2716 return std::move(Err);
2717 D2CXX->setDescribedClassTemplate(ToDescribed);
2718 if (!DCXX->isInjectedClassName() && !IsFriendTemplate) {
2719 // In a record describing a template the type should be an
2720 // InjectedClassNameType (see Sema::CheckClassTemplate). Update the
2721 // previously set type to the correct value here (ToDescribed is not
2722 // available at record create).
2723 // FIXME: The previous type is cleared but not removed from
2724 // ASTContext's internal storage.
2725 CXXRecordDecl *Injected = nullptr;
2726 for (NamedDecl *Found : D2CXX->noload_lookup(Name)) {
2727 auto *Record = dyn_cast<CXXRecordDecl>(Found);
2728 if (Record && Record->isInjectedClassName()) {
2729 Injected = Record;
2730 break;
Gabor Marton5915777e2018-06-26 13:44:24 +00002731 }
2732 }
Gabor Marton7df342a2018-12-17 12:42:12 +00002733 // Create an injected type for the whole redecl chain.
2734 SmallVector<Decl *, 2> Redecls =
2735 getCanonicalForwardRedeclChain(D2CXX);
2736 for (auto *R : Redecls) {
2737 auto *RI = cast<CXXRecordDecl>(R);
2738 RI->setTypeForDecl(nullptr);
2739 // Below we create a new injected type and assign that to the
2740 // canonical decl, subsequent declarations in the chain will reuse
2741 // that type.
2742 Importer.getToContext().getInjectedClassNameType(
2743 RI, ToDescribed->getInjectedClassNameSpecialization());
2744 }
2745 // Set the new type for the previous injected decl too.
2746 if (Injected) {
2747 Injected->setTypeForDecl(nullptr);
2748 Importer.getToContext().getTypeDeclType(Injected, D2CXX);
2749 }
2750 }
2751 } else if (MemberSpecializationInfo *MemberInfo =
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00002752 DCXX->getMemberSpecializationInfo()) {
2753 TemplateSpecializationKind SK =
2754 MemberInfo->getTemplateSpecializationKind();
2755 CXXRecordDecl *FromInst = DCXX->getInstantiatedFromMemberClass();
Balazs Keri3b30d652018-10-19 13:32:20 +00002756
2757 if (Expected<CXXRecordDecl *> ToInstOrErr = import(FromInst))
2758 D2CXX->setInstantiationOfMemberClass(*ToInstOrErr, SK);
2759 else
2760 return ToInstOrErr.takeError();
2761
2762 if (ExpectedSLoc POIOrErr =
2763 import(MemberInfo->getPointOfInstantiation()))
2764 D2CXX->getMemberSpecializationInfo()->setPointOfInstantiation(
2765 *POIOrErr);
2766 else
2767 return POIOrErr.takeError();
Douglas Gregor5c73e912010-02-11 00:48:18 +00002768 }
Gabor Marton26f72a92018-07-12 09:42:05 +00002769
Gabor Marton7df342a2018-12-17 12:42:12 +00002770 } else {
2771 if (GetImportedOrCreateDecl(D2, D, Importer.getToContext(),
2772 D->getTagKind(), DC, *BeginLocOrErr, Loc,
2773 Name.getAsIdentifierInfo(), PrevDecl))
2774 return D2;
2775 D2->setLexicalDeclContext(LexicalDC);
2776 LexicalDC->addDeclInternal(D2);
Douglas Gregor5c73e912010-02-11 00:48:18 +00002777 }
Gabor Marton26f72a92018-07-12 09:42:05 +00002778
Gabor Marton7df342a2018-12-17 12:42:12 +00002779 if (auto QualifierLocOrErr = import(D->getQualifierLoc()))
2780 D2->setQualifierInfo(*QualifierLocOrErr);
2781 else
2782 return QualifierLocOrErr.takeError();
2783
2784 if (D->isAnonymousStructOrUnion())
2785 D2->setAnonymousStructOrUnion(true);
Douglas Gregor25791052010-02-12 00:09:27 +00002786
Balazs Keri3b30d652018-10-19 13:32:20 +00002787 if (D->isCompleteDefinition())
2788 if (Error Err = ImportDefinition(D, D2, IDK_Default))
2789 return std::move(Err);
Craig Topper36250ad2014-05-12 05:36:57 +00002790
Douglas Gregor3996e242010-02-15 22:01:00 +00002791 return D2;
Douglas Gregor5c73e912010-02-11 00:48:18 +00002792}
2793
Balazs Keri3b30d652018-10-19 13:32:20 +00002794ExpectedDecl ASTNodeImporter::VisitEnumConstantDecl(EnumConstantDecl *D) {
Douglas Gregor98c10182010-02-12 22:17:39 +00002795 // Import the major distinguishing characteristics of this enumerator.
2796 DeclContext *DC, *LexicalDC;
2797 DeclarationName Name;
2798 SourceLocation Loc;
Sean Callanan59721b32015-04-28 18:41:46 +00002799 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00002800 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
2801 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00002802 if (ToD)
2803 return ToD;
Douglas Gregorb4964f72010-02-15 23:54:17 +00002804
Fangrui Song6907ce22018-07-30 19:24:48 +00002805 // Determine whether there are any other declarations with the same name and
Douglas Gregor98c10182010-02-12 22:17:39 +00002806 // in the same context.
2807 if (!LexicalDC->isFunctionOrMethod()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002808 SmallVector<NamedDecl *, 4> ConflictingDecls;
Douglas Gregor98c10182010-02-12 22:17:39 +00002809 unsigned IDNS = Decl::IDNS_Ordinary;
Gabor Marton54058b52018-12-17 13:53:12 +00002810 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002811 for (auto *FoundDecl : FoundDecls) {
2812 if (!FoundDecl->isInIdentifierNamespace(IDNS))
Douglas Gregor98c10182010-02-12 22:17:39 +00002813 continue;
Douglas Gregor91155082012-11-14 22:29:20 +00002814
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002815 if (auto *FoundEnumConstant = dyn_cast<EnumConstantDecl>(FoundDecl)) {
Douglas Gregor91155082012-11-14 22:29:20 +00002816 if (IsStructuralMatch(D, FoundEnumConstant))
Gabor Marton26f72a92018-07-12 09:42:05 +00002817 return Importer.MapImported(D, FoundEnumConstant);
Douglas Gregor91155082012-11-14 22:29:20 +00002818 }
2819
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002820 ConflictingDecls.push_back(FoundDecl);
Douglas Gregor98c10182010-02-12 22:17:39 +00002821 }
Fangrui Song6907ce22018-07-30 19:24:48 +00002822
Douglas Gregor98c10182010-02-12 22:17:39 +00002823 if (!ConflictingDecls.empty()) {
2824 Name = Importer.HandleNameConflict(Name, DC, IDNS,
Fangrui Song6907ce22018-07-30 19:24:48 +00002825 ConflictingDecls.data(),
Douglas Gregor98c10182010-02-12 22:17:39 +00002826 ConflictingDecls.size());
2827 if (!Name)
Balazs Keri3b30d652018-10-19 13:32:20 +00002828 return make_error<ImportError>(ImportError::NameConflict);
Douglas Gregor98c10182010-02-12 22:17:39 +00002829 }
2830 }
Fangrui Song6907ce22018-07-30 19:24:48 +00002831
Balazs Keri3b30d652018-10-19 13:32:20 +00002832 ExpectedType TypeOrErr = import(D->getType());
2833 if (!TypeOrErr)
2834 return TypeOrErr.takeError();
2835
2836 ExpectedExpr InitOrErr = import(D->getInitExpr());
2837 if (!InitOrErr)
2838 return InitOrErr.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00002839
Gabor Marton26f72a92018-07-12 09:42:05 +00002840 EnumConstantDecl *ToEnumerator;
2841 if (GetImportedOrCreateDecl(
2842 ToEnumerator, D, Importer.getToContext(), cast<EnumDecl>(DC), Loc,
Balazs Keri3b30d652018-10-19 13:32:20 +00002843 Name.getAsIdentifierInfo(), *TypeOrErr, *InitOrErr, D->getInitVal()))
Gabor Marton26f72a92018-07-12 09:42:05 +00002844 return ToEnumerator;
2845
Douglas Gregordd483172010-02-22 17:42:47 +00002846 ToEnumerator->setAccess(D->getAccess());
Douglas Gregor98c10182010-02-12 22:17:39 +00002847 ToEnumerator->setLexicalDeclContext(LexicalDC);
Sean Callanan95e74be2011-10-21 02:57:43 +00002848 LexicalDC->addDeclInternal(ToEnumerator);
Douglas Gregor98c10182010-02-12 22:17:39 +00002849 return ToEnumerator;
2850}
Douglas Gregor5c73e912010-02-11 00:48:18 +00002851
Balazs Keri3b30d652018-10-19 13:32:20 +00002852Error ASTNodeImporter::ImportTemplateInformation(
2853 FunctionDecl *FromFD, FunctionDecl *ToFD) {
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00002854 switch (FromFD->getTemplatedKind()) {
2855 case FunctionDecl::TK_NonTemplate:
2856 case FunctionDecl::TK_FunctionTemplate:
Balazs Keri3b30d652018-10-19 13:32:20 +00002857 return Error::success();
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00002858
2859 case FunctionDecl::TK_MemberSpecialization: {
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00002860 TemplateSpecializationKind TSK = FromFD->getTemplateSpecializationKind();
Balazs Keri3b30d652018-10-19 13:32:20 +00002861
2862 if (Expected<FunctionDecl *> InstFDOrErr =
2863 import(FromFD->getInstantiatedFromMemberFunction()))
2864 ToFD->setInstantiationOfMemberFunction(*InstFDOrErr, TSK);
2865 else
2866 return InstFDOrErr.takeError();
2867
2868 if (ExpectedSLoc POIOrErr = import(
2869 FromFD->getMemberSpecializationInfo()->getPointOfInstantiation()))
2870 ToFD->getMemberSpecializationInfo()->setPointOfInstantiation(*POIOrErr);
2871 else
2872 return POIOrErr.takeError();
2873
2874 return Error::success();
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00002875 }
2876
2877 case FunctionDecl::TK_FunctionTemplateSpecialization: {
Balazs Keri3b30d652018-10-19 13:32:20 +00002878 auto FunctionAndArgsOrErr =
Gabor Marton5254e642018-06-27 13:32:50 +00002879 ImportFunctionTemplateWithTemplateArgsFromSpecialization(FromFD);
Balazs Keri3b30d652018-10-19 13:32:20 +00002880 if (!FunctionAndArgsOrErr)
2881 return FunctionAndArgsOrErr.takeError();
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00002882
2883 TemplateArgumentList *ToTAList = TemplateArgumentList::CreateCopy(
Balazs Keri3b30d652018-10-19 13:32:20 +00002884 Importer.getToContext(), std::get<1>(*FunctionAndArgsOrErr));
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00002885
Gabor Marton5254e642018-06-27 13:32:50 +00002886 auto *FTSInfo = FromFD->getTemplateSpecializationInfo();
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00002887 TemplateArgumentListInfo ToTAInfo;
2888 const auto *FromTAArgsAsWritten = FTSInfo->TemplateArgumentsAsWritten;
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00002889 if (FromTAArgsAsWritten)
Balazs Keri3b30d652018-10-19 13:32:20 +00002890 if (Error Err = ImportTemplateArgumentListInfo(
2891 *FromTAArgsAsWritten, ToTAInfo))
2892 return Err;
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00002893
Balazs Keri3b30d652018-10-19 13:32:20 +00002894 ExpectedSLoc POIOrErr = import(FTSInfo->getPointOfInstantiation());
2895 if (!POIOrErr)
2896 return POIOrErr.takeError();
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00002897
Gabor Marton5254e642018-06-27 13:32:50 +00002898 TemplateSpecializationKind TSK = FTSInfo->getTemplateSpecializationKind();
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00002899 ToFD->setFunctionTemplateSpecialization(
Balazs Keri3b30d652018-10-19 13:32:20 +00002900 std::get<0>(*FunctionAndArgsOrErr), ToTAList, /* InsertPos= */ nullptr,
2901 TSK, FromTAArgsAsWritten ? &ToTAInfo : nullptr, *POIOrErr);
2902 return Error::success();
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00002903 }
2904
2905 case FunctionDecl::TK_DependentFunctionTemplateSpecialization: {
2906 auto *FromInfo = FromFD->getDependentSpecializationInfo();
2907 UnresolvedSet<8> TemplDecls;
2908 unsigned NumTemplates = FromInfo->getNumTemplates();
2909 for (unsigned I = 0; I < NumTemplates; I++) {
Balazs Keri3b30d652018-10-19 13:32:20 +00002910 if (Expected<FunctionTemplateDecl *> ToFTDOrErr =
2911 import(FromInfo->getTemplate(I)))
2912 TemplDecls.addDecl(*ToFTDOrErr);
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00002913 else
Balazs Keri3b30d652018-10-19 13:32:20 +00002914 return ToFTDOrErr.takeError();
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00002915 }
2916
2917 // Import TemplateArgumentListInfo.
2918 TemplateArgumentListInfo ToTAInfo;
Balazs Keri3b30d652018-10-19 13:32:20 +00002919 if (Error Err = ImportTemplateArgumentListInfo(
2920 FromInfo->getLAngleLoc(), FromInfo->getRAngleLoc(),
2921 llvm::makeArrayRef(
2922 FromInfo->getTemplateArgs(), FromInfo->getNumTemplateArgs()),
2923 ToTAInfo))
2924 return Err;
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00002925
2926 ToFD->setDependentTemplateSpecialization(Importer.getToContext(),
2927 TemplDecls, ToTAInfo);
Balazs Keri3b30d652018-10-19 13:32:20 +00002928 return Error::success();
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00002929 }
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00002930 }
Sam McCallfdc32072018-01-26 12:06:44 +00002931 llvm_unreachable("All cases should be covered!");
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00002932}
2933
Balazs Keri3b30d652018-10-19 13:32:20 +00002934Expected<FunctionDecl *>
Gabor Marton5254e642018-06-27 13:32:50 +00002935ASTNodeImporter::FindFunctionTemplateSpecialization(FunctionDecl *FromFD) {
Balazs Keri3b30d652018-10-19 13:32:20 +00002936 auto FunctionAndArgsOrErr =
Gabor Marton5254e642018-06-27 13:32:50 +00002937 ImportFunctionTemplateWithTemplateArgsFromSpecialization(FromFD);
Balazs Keri3b30d652018-10-19 13:32:20 +00002938 if (!FunctionAndArgsOrErr)
2939 return FunctionAndArgsOrErr.takeError();
Gabor Marton5254e642018-06-27 13:32:50 +00002940
Balazs Keri3b30d652018-10-19 13:32:20 +00002941 FunctionTemplateDecl *Template;
2942 TemplateArgsTy ToTemplArgs;
2943 std::tie(Template, ToTemplArgs) = *FunctionAndArgsOrErr;
Gabor Marton5254e642018-06-27 13:32:50 +00002944 void *InsertPos = nullptr;
Balazs Keri3b30d652018-10-19 13:32:20 +00002945 auto *FoundSpec = Template->findSpecialization(ToTemplArgs, InsertPos);
Gabor Marton5254e642018-06-27 13:32:50 +00002946 return FoundSpec;
2947}
2948
Shafik Yaghmour96b3d202019-01-28 21:55:33 +00002949Error ASTNodeImporter::ImportFunctionDeclBody(FunctionDecl *FromFD,
2950 FunctionDecl *ToFD) {
2951 if (Stmt *FromBody = FromFD->getBody()) {
2952 if (ExpectedStmt ToBodyOrErr = import(FromBody))
2953 ToFD->setBody(*ToBodyOrErr);
2954 else
2955 return ToBodyOrErr.takeError();
2956 }
2957 return Error::success();
2958}
2959
Balazs Keri3b30d652018-10-19 13:32:20 +00002960ExpectedDecl ASTNodeImporter::VisitFunctionDecl(FunctionDecl *D) {
Gabor Marton5254e642018-06-27 13:32:50 +00002961
Balazs Keri3b30d652018-10-19 13:32:20 +00002962 SmallVector<Decl *, 2> Redecls = getCanonicalForwardRedeclChain(D);
Gabor Marton5254e642018-06-27 13:32:50 +00002963 auto RedeclIt = Redecls.begin();
2964 // Import the first part of the decl chain. I.e. import all previous
2965 // declarations starting from the canonical decl.
Balazs Keri3b30d652018-10-19 13:32:20 +00002966 for (; RedeclIt != Redecls.end() && *RedeclIt != D; ++RedeclIt) {
2967 ExpectedDecl ToRedeclOrErr = import(*RedeclIt);
2968 if (!ToRedeclOrErr)
2969 return ToRedeclOrErr.takeError();
2970 }
Gabor Marton5254e642018-06-27 13:32:50 +00002971 assert(*RedeclIt == D);
2972
Douglas Gregorbb7930c2010-02-10 19:54:31 +00002973 // Import the major distinguishing characteristics of this function.
2974 DeclContext *DC, *LexicalDC;
2975 DeclarationName Name;
Douglas Gregorbb7930c2010-02-10 19:54:31 +00002976 SourceLocation Loc;
Sean Callanan59721b32015-04-28 18:41:46 +00002977 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00002978 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
2979 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00002980 if (ToD)
2981 return ToD;
Abramo Bagnarad6d2f182010-08-11 22:01:17 +00002982
Shafik Yaghmour96b3d202019-01-28 21:55:33 +00002983 FunctionDecl *FoundByLookup = nullptr;
Balazs Keria35798d2018-07-17 09:52:41 +00002984 FunctionTemplateDecl *FromFT = D->getDescribedFunctionTemplate();
Gabor Horvathe350b0a2017-09-22 11:11:01 +00002985
Gabor Marton5254e642018-06-27 13:32:50 +00002986 // If this is a function template specialization, then try to find the same
Gabor Marton54058b52018-12-17 13:53:12 +00002987 // existing specialization in the "to" context. The lookup below will not
2988 // find any specialization, but would find the primary template; thus, we
2989 // have to skip normal lookup in case of specializations.
Gabor Marton5254e642018-06-27 13:32:50 +00002990 // FIXME handle member function templates (TK_MemberSpecialization) similarly?
2991 if (D->getTemplatedKind() ==
2992 FunctionDecl::TK_FunctionTemplateSpecialization) {
Balazs Keri3b30d652018-10-19 13:32:20 +00002993 auto FoundFunctionOrErr = FindFunctionTemplateSpecialization(D);
2994 if (!FoundFunctionOrErr)
2995 return FoundFunctionOrErr.takeError();
2996 if (FunctionDecl *FoundFunction = *FoundFunctionOrErr) {
2997 if (D->doesThisDeclarationHaveABody() && FoundFunction->hasBody())
2998 return Importer.MapImported(D, FoundFunction);
Gabor Marton5254e642018-06-27 13:32:50 +00002999 FoundByLookup = FoundFunction;
3000 }
3001 }
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003002 // Try to find a function in our own ("to") context with the same name, same
3003 // type, and in the same context as the function we're importing.
Gabor Marton5254e642018-06-27 13:32:50 +00003004 else if (!LexicalDC->isFunctionOrMethod()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003005 SmallVector<NamedDecl *, 4> ConflictingDecls;
Gabor Marton5254e642018-06-27 13:32:50 +00003006 unsigned IDNS = Decl::IDNS_Ordinary | Decl::IDNS_OrdinaryFriend;
Gabor Marton54058b52018-12-17 13:53:12 +00003007 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00003008 for (auto *FoundDecl : FoundDecls) {
3009 if (!FoundDecl->isInIdentifierNamespace(IDNS))
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003010 continue;
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00003011
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00003012 if (auto *FoundFunction = dyn_cast<FunctionDecl>(FoundDecl)) {
Rafael Espindola3ae00052013-05-13 00:12:11 +00003013 if (FoundFunction->hasExternalFormalLinkage() &&
3014 D->hasExternalFormalLinkage()) {
Balazs Keric7797c42018-07-11 09:37:24 +00003015 if (IsStructuralMatch(D, FoundFunction)) {
3016 const FunctionDecl *Definition = nullptr;
3017 if (D->doesThisDeclarationHaveABody() &&
3018 FoundFunction->hasBody(Definition)) {
Gabor Marton26f72a92018-07-12 09:42:05 +00003019 return Importer.MapImported(
Balazs Keric7797c42018-07-11 09:37:24 +00003020 D, const_cast<FunctionDecl *>(Definition));
3021 }
3022 FoundByLookup = FoundFunction;
3023 break;
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003024 }
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00003025
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003026 // FIXME: Check for overloading more carefully, e.g., by boosting
3027 // Sema::IsOverload out to the AST library.
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00003028
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003029 // Function overloading is okay in C++.
David Blaikiebbafb8a2012-03-11 07:00:24 +00003030 if (Importer.getToContext().getLangOpts().CPlusPlus)
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003031 continue;
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00003032
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003033 // Complain about inconsistent function types.
3034 Importer.ToDiag(Loc, diag::err_odr_function_type_inconsistent)
Douglas Gregorb4964f72010-02-15 23:54:17 +00003035 << Name << D->getType() << FoundFunction->getType();
Fangrui Song6907ce22018-07-30 19:24:48 +00003036 Importer.ToDiag(FoundFunction->getLocation(),
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003037 diag::note_odr_value_here)
3038 << FoundFunction->getType();
3039 }
3040 }
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00003041
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00003042 ConflictingDecls.push_back(FoundDecl);
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003043 }
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00003044
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003045 if (!ConflictingDecls.empty()) {
3046 Name = Importer.HandleNameConflict(Name, DC, IDNS,
Fangrui Song6907ce22018-07-30 19:24:48 +00003047 ConflictingDecls.data(),
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003048 ConflictingDecls.size());
3049 if (!Name)
Balazs Keri3b30d652018-10-19 13:32:20 +00003050 return make_error<ImportError>(ImportError::NameConflict);
Fangrui Song6907ce22018-07-30 19:24:48 +00003051 }
Douglas Gregor62d311f2010-02-09 19:21:46 +00003052 }
Douglas Gregorb4964f72010-02-15 23:54:17 +00003053
Shafik Yaghmour96b3d202019-01-28 21:55:33 +00003054 // We do not allow more than one in-class declaration of a function. This is
3055 // because AST clients like VTableBuilder asserts on this. VTableBuilder
3056 // assumes there is only one in-class declaration. Building a redecl
3057 // chain would result in more than one in-class declaration for
3058 // overrides (even if they are part of the same redecl chain inside the
3059 // derived class.)
3060 if (FoundByLookup) {
Mikael Holmenc1c97aa2019-01-29 06:53:31 +00003061 if (isa<CXXMethodDecl>(FoundByLookup)) {
Shafik Yaghmour96b3d202019-01-28 21:55:33 +00003062 if (D->getLexicalDeclContext() == D->getDeclContext()) {
3063 if (!D->doesThisDeclarationHaveABody())
3064 return Importer.MapImported(D, FoundByLookup);
3065 else {
3066 // Let's continue and build up the redecl chain in this case.
3067 // FIXME Merge the functions into one decl.
3068 }
3069 }
3070 }
3071 }
3072
Abramo Bagnarad6d2f182010-08-11 22:01:17 +00003073 DeclarationNameInfo NameInfo(Name, Loc);
3074 // Import additional name location/type info.
Balazs Keri3b30d652018-10-19 13:32:20 +00003075 if (Error Err = ImportDeclarationNameLoc(D->getNameInfo(), NameInfo))
3076 return std::move(Err);
Abramo Bagnarad6d2f182010-08-11 22:01:17 +00003077
Argyrios Kyrtzidis2f458532012-09-25 19:26:39 +00003078 QualType FromTy = D->getType();
3079 bool usedDifferentExceptionSpec = false;
3080
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00003081 if (const auto *FromFPT = D->getType()->getAs<FunctionProtoType>()) {
Argyrios Kyrtzidis2f458532012-09-25 19:26:39 +00003082 FunctionProtoType::ExtProtoInfo FromEPI = FromFPT->getExtProtoInfo();
3083 // FunctionProtoType::ExtProtoInfo's ExceptionSpecDecl can point to the
3084 // FunctionDecl that we are importing the FunctionProtoType for.
3085 // To avoid an infinite recursion when importing, create the FunctionDecl
3086 // with a simplified function type and update it afterwards.
Richard Smith8acb4282014-07-31 21:57:55 +00003087 if (FromEPI.ExceptionSpec.SourceDecl ||
3088 FromEPI.ExceptionSpec.SourceTemplate ||
3089 FromEPI.ExceptionSpec.NoexceptExpr) {
Argyrios Kyrtzidis2f458532012-09-25 19:26:39 +00003090 FunctionProtoType::ExtProtoInfo DefaultEPI;
3091 FromTy = Importer.getFromContext().getFunctionType(
Alp Toker314cc812014-01-25 16:55:45 +00003092 FromFPT->getReturnType(), FromFPT->getParamTypes(), DefaultEPI);
Argyrios Kyrtzidis2f458532012-09-25 19:26:39 +00003093 usedDifferentExceptionSpec = true;
3094 }
3095 }
3096
Balazs Keri3b30d652018-10-19 13:32:20 +00003097 QualType T;
3098 TypeSourceInfo *TInfo;
3099 SourceLocation ToInnerLocStart, ToEndLoc;
3100 NestedNameSpecifierLoc ToQualifierLoc;
3101 if (auto Imp = importSeq(
3102 FromTy, D->getTypeSourceInfo(), D->getInnerLocStart(),
3103 D->getQualifierLoc(), D->getEndLoc()))
3104 std::tie(T, TInfo, ToInnerLocStart, ToQualifierLoc, ToEndLoc) = *Imp;
3105 else
3106 return Imp.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00003107
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003108 // Import the function parameters.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003109 SmallVector<ParmVarDecl *, 8> Parameters;
David Majnemer59f77922016-06-24 04:05:48 +00003110 for (auto P : D->parameters()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00003111 if (Expected<ParmVarDecl *> ToPOrErr = import(P))
3112 Parameters.push_back(*ToPOrErr);
3113 else
3114 return ToPOrErr.takeError();
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003115 }
Fangrui Song6907ce22018-07-30 19:24:48 +00003116
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00003117 // Create the imported function.
Craig Topper36250ad2014-05-12 05:36:57 +00003118 FunctionDecl *ToFunction = nullptr;
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00003119 if (auto *FromConstructor = dyn_cast<CXXConstructorDecl>(D)) {
Gabor Marton26f72a92018-07-12 09:42:05 +00003120 if (GetImportedOrCreateDecl<CXXConstructorDecl>(
Balazs Keri3b30d652018-10-19 13:32:20 +00003121 ToFunction, D, Importer.getToContext(), cast<CXXRecordDecl>(DC),
3122 ToInnerLocStart, NameInfo, T, TInfo,
3123 FromConstructor->isExplicit(),
3124 D->isInlineSpecified(), D->isImplicit(), D->isConstexpr()))
Gabor Marton26f72a92018-07-12 09:42:05 +00003125 return ToFunction;
Raphael Isemann1c5d23f2019-01-22 17:59:45 +00003126 } else if (CXXDestructorDecl *FromDtor = dyn_cast<CXXDestructorDecl>(D)) {
3127
3128 auto Imp =
3129 importSeq(const_cast<FunctionDecl *>(FromDtor->getOperatorDelete()),
3130 FromDtor->getOperatorDeleteThisArg());
3131
3132 if (!Imp)
3133 return Imp.takeError();
3134
3135 FunctionDecl *ToOperatorDelete;
3136 Expr *ToThisArg;
3137 std::tie(ToOperatorDelete, ToThisArg) = *Imp;
3138
Gabor Marton26f72a92018-07-12 09:42:05 +00003139 if (GetImportedOrCreateDecl<CXXDestructorDecl>(
Balazs Keri3b30d652018-10-19 13:32:20 +00003140 ToFunction, D, Importer.getToContext(), cast<CXXRecordDecl>(DC),
3141 ToInnerLocStart, NameInfo, T, TInfo, D->isInlineSpecified(),
3142 D->isImplicit()))
Gabor Marton26f72a92018-07-12 09:42:05 +00003143 return ToFunction;
Raphael Isemann1c5d23f2019-01-22 17:59:45 +00003144
3145 CXXDestructorDecl *ToDtor = cast<CXXDestructorDecl>(ToFunction);
3146
3147 ToDtor->setOperatorDelete(ToOperatorDelete, ToThisArg);
Gabor Marton26f72a92018-07-12 09:42:05 +00003148 } else if (CXXConversionDecl *FromConversion =
3149 dyn_cast<CXXConversionDecl>(D)) {
3150 if (GetImportedOrCreateDecl<CXXConversionDecl>(
3151 ToFunction, D, Importer.getToContext(), cast<CXXRecordDecl>(DC),
Balazs Keri3b30d652018-10-19 13:32:20 +00003152 ToInnerLocStart, NameInfo, T, TInfo, D->isInlineSpecified(),
Gabor Marton26f72a92018-07-12 09:42:05 +00003153 FromConversion->isExplicit(), D->isConstexpr(), SourceLocation()))
3154 return ToFunction;
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00003155 } else if (auto *Method = dyn_cast<CXXMethodDecl>(D)) {
Gabor Marton26f72a92018-07-12 09:42:05 +00003156 if (GetImportedOrCreateDecl<CXXMethodDecl>(
3157 ToFunction, D, Importer.getToContext(), cast<CXXRecordDecl>(DC),
Balazs Keri3b30d652018-10-19 13:32:20 +00003158 ToInnerLocStart, NameInfo, T, TInfo, Method->getStorageClass(),
Gabor Marton26f72a92018-07-12 09:42:05 +00003159 Method->isInlineSpecified(), D->isConstexpr(), SourceLocation()))
3160 return ToFunction;
Douglas Gregor00eace12010-02-21 18:29:16 +00003161 } else {
Gabor Marton26f72a92018-07-12 09:42:05 +00003162 if (GetImportedOrCreateDecl(ToFunction, D, Importer.getToContext(), DC,
Balazs Keri3b30d652018-10-19 13:32:20 +00003163 ToInnerLocStart, NameInfo, T, TInfo,
Gabor Marton26f72a92018-07-12 09:42:05 +00003164 D->getStorageClass(), D->isInlineSpecified(),
3165 D->hasWrittenPrototype(), D->isConstexpr()))
3166 return ToFunction;
Douglas Gregor00eace12010-02-21 18:29:16 +00003167 }
John McCall3e11ebe2010-03-15 10:12:16 +00003168
Gabor Martonf5e4f0a2018-11-20 14:19:39 +00003169 // Connect the redecl chain.
3170 if (FoundByLookup) {
3171 auto *Recent = const_cast<FunctionDecl *>(
3172 FoundByLookup->getMostRecentDecl());
3173 ToFunction->setPreviousDecl(Recent);
3174 }
3175
3176 // Import Ctor initializers.
3177 if (auto *FromConstructor = dyn_cast<CXXConstructorDecl>(D)) {
3178 if (unsigned NumInitializers = FromConstructor->getNumCtorInitializers()) {
3179 SmallVector<CXXCtorInitializer *, 4> CtorInitializers(NumInitializers);
3180 // Import first, then allocate memory and copy if there was no error.
3181 if (Error Err = ImportContainerChecked(
3182 FromConstructor->inits(), CtorInitializers))
3183 return std::move(Err);
3184 auto **Memory =
3185 new (Importer.getToContext()) CXXCtorInitializer *[NumInitializers];
3186 std::copy(CtorInitializers.begin(), CtorInitializers.end(), Memory);
3187 auto *ToCtor = cast<CXXConstructorDecl>(ToFunction);
3188 ToCtor->setCtorInitializers(Memory);
3189 ToCtor->setNumCtorInitializers(NumInitializers);
3190 }
3191 }
3192
Balazs Keri3b30d652018-10-19 13:32:20 +00003193 ToFunction->setQualifierInfo(ToQualifierLoc);
Douglas Gregordd483172010-02-22 17:42:47 +00003194 ToFunction->setAccess(D->getAccess());
Douglas Gregor43f54792010-02-17 02:12:47 +00003195 ToFunction->setLexicalDeclContext(LexicalDC);
John McCall08432c82011-01-27 02:37:01 +00003196 ToFunction->setVirtualAsWritten(D->isVirtualAsWritten());
3197 ToFunction->setTrivial(D->isTrivial());
3198 ToFunction->setPure(D->isPure());
Balazs Keri3b30d652018-10-19 13:32:20 +00003199 ToFunction->setRangeEnd(ToEndLoc);
Douglas Gregor62d311f2010-02-09 19:21:46 +00003200
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003201 // Set the parameters.
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00003202 for (auto *Param : Parameters) {
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00003203 Param->setOwningFunction(ToFunction);
3204 ToFunction->addDeclInternal(Param);
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003205 }
David Blaikie9c70e042011-09-21 18:16:56 +00003206 ToFunction->setParams(Parameters);
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003207
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00003208 // We need to complete creation of FunctionProtoTypeLoc manually with setting
3209 // params it refers to.
3210 if (TInfo) {
3211 if (auto ProtoLoc =
3212 TInfo->getTypeLoc().IgnoreParens().getAs<FunctionProtoTypeLoc>()) {
3213 for (unsigned I = 0, N = Parameters.size(); I != N; ++I)
3214 ProtoLoc.setParam(I, Parameters[I]);
3215 }
3216 }
3217
Argyrios Kyrtzidis2f458532012-09-25 19:26:39 +00003218 if (usedDifferentExceptionSpec) {
3219 // Update FunctionProtoType::ExtProtoInfo.
Balazs Keri3b30d652018-10-19 13:32:20 +00003220 if (ExpectedType TyOrErr = import(D->getType()))
3221 ToFunction->setType(*TyOrErr);
3222 else
3223 return TyOrErr.takeError();
Argyrios Kyrtzidisb41791d2012-09-22 01:58:06 +00003224 }
3225
Balazs Keria35798d2018-07-17 09:52:41 +00003226 // Import the describing template function, if any.
Balazs Keri3b30d652018-10-19 13:32:20 +00003227 if (FromFT) {
3228 auto ToFTOrErr = import(FromFT);
3229 if (!ToFTOrErr)
3230 return ToFTOrErr.takeError();
3231 }
Balazs Keria35798d2018-07-17 09:52:41 +00003232
Gabor Marton5254e642018-06-27 13:32:50 +00003233 if (D->doesThisDeclarationHaveABody()) {
Shafik Yaghmour96b3d202019-01-28 21:55:33 +00003234 Error Err = ImportFunctionDeclBody(D, ToFunction);
3235
3236 if (Err)
3237 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00003238 }
3239
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003240 // FIXME: Other bits to merge?
Douglas Gregor0eaa2bf2010-10-01 23:55:07 +00003241
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00003242 // If it is a template, import all related things.
Balazs Keri3b30d652018-10-19 13:32:20 +00003243 if (Error Err = ImportTemplateInformation(D, ToFunction))
3244 return std::move(Err);
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00003245
Gabor Marton5254e642018-06-27 13:32:50 +00003246 bool IsFriend = D->isInIdentifierNamespace(Decl::IDNS_OrdinaryFriend);
3247
3248 // TODO Can we generalize this approach to other AST nodes as well?
3249 if (D->getDeclContext()->containsDeclAndLoad(D))
3250 DC->addDeclInternal(ToFunction);
3251 if (DC != LexicalDC && D->getLexicalDeclContext()->containsDeclAndLoad(D))
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00003252 LexicalDC->addDeclInternal(ToFunction);
Douglas Gregor0eaa2bf2010-10-01 23:55:07 +00003253
Gabor Marton5254e642018-06-27 13:32:50 +00003254 // Friend declaration's lexical context is the befriending class, but the
3255 // semantic context is the enclosing scope of the befriending class.
3256 // We want the friend functions to be found in the semantic context by lookup.
3257 // FIXME should we handle this generically in VisitFriendDecl?
3258 // In Other cases when LexicalDC != DC we don't want it to be added,
3259 // e.g out-of-class definitions like void B::f() {} .
3260 if (LexicalDC != DC && IsFriend) {
3261 DC->makeDeclVisibleInContext(ToFunction);
3262 }
3263
Gabor Marton7a0841e2018-10-29 10:18:28 +00003264 if (auto *FromCXXMethod = dyn_cast<CXXMethodDecl>(D))
3265 ImportOverrides(cast<CXXMethodDecl>(ToFunction), FromCXXMethod);
3266
Gabor Marton5254e642018-06-27 13:32:50 +00003267 // Import the rest of the chain. I.e. import all subsequent declarations.
Balazs Keri3b30d652018-10-19 13:32:20 +00003268 for (++RedeclIt; RedeclIt != Redecls.end(); ++RedeclIt) {
3269 ExpectedDecl ToRedeclOrErr = import(*RedeclIt);
3270 if (!ToRedeclOrErr)
3271 return ToRedeclOrErr.takeError();
3272 }
Gabor Marton5254e642018-06-27 13:32:50 +00003273
Douglas Gregor43f54792010-02-17 02:12:47 +00003274 return ToFunction;
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003275}
3276
Balazs Keri3b30d652018-10-19 13:32:20 +00003277ExpectedDecl ASTNodeImporter::VisitCXXMethodDecl(CXXMethodDecl *D) {
Douglas Gregor00eace12010-02-21 18:29:16 +00003278 return VisitFunctionDecl(D);
3279}
3280
Balazs Keri3b30d652018-10-19 13:32:20 +00003281ExpectedDecl ASTNodeImporter::VisitCXXConstructorDecl(CXXConstructorDecl *D) {
Douglas Gregor00eace12010-02-21 18:29:16 +00003282 return VisitCXXMethodDecl(D);
3283}
3284
Balazs Keri3b30d652018-10-19 13:32:20 +00003285ExpectedDecl ASTNodeImporter::VisitCXXDestructorDecl(CXXDestructorDecl *D) {
Douglas Gregor00eace12010-02-21 18:29:16 +00003286 return VisitCXXMethodDecl(D);
3287}
3288
Balazs Keri3b30d652018-10-19 13:32:20 +00003289ExpectedDecl ASTNodeImporter::VisitCXXConversionDecl(CXXConversionDecl *D) {
Douglas Gregor00eace12010-02-21 18:29:16 +00003290 return VisitCXXMethodDecl(D);
3291}
3292
Balazs Keri3b30d652018-10-19 13:32:20 +00003293ExpectedDecl ASTNodeImporter::VisitFieldDecl(FieldDecl *D) {
Douglas Gregor5c73e912010-02-11 00:48:18 +00003294 // Import the major distinguishing characteristics of a variable.
3295 DeclContext *DC, *LexicalDC;
3296 DeclarationName Name;
Douglas Gregor5c73e912010-02-11 00:48:18 +00003297 SourceLocation Loc;
Sean Callanan59721b32015-04-28 18:41:46 +00003298 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00003299 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
3300 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00003301 if (ToD)
3302 return ToD;
Craig Topper36250ad2014-05-12 05:36:57 +00003303
Fangrui Song6907ce22018-07-30 19:24:48 +00003304 // Determine whether we've already imported this field.
Gabor Marton54058b52018-12-17 13:53:12 +00003305 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00003306 for (auto *FoundDecl : FoundDecls) {
Balazs Keri3b30d652018-10-19 13:32:20 +00003307 if (FieldDecl *FoundField = dyn_cast<FieldDecl>(FoundDecl)) {
Douglas Gregorceb32bf2012-10-26 16:45:11 +00003308 // For anonymous fields, match up by index.
Balazs Keri2544b4b2018-08-08 09:40:57 +00003309 if (!Name &&
3310 ASTImporter::getFieldIndex(D) !=
3311 ASTImporter::getFieldIndex(FoundField))
Douglas Gregorceb32bf2012-10-26 16:45:11 +00003312 continue;
3313
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00003314 if (Importer.IsStructurallyEquivalent(D->getType(),
Douglas Gregor03d1ed32011-10-14 21:54:42 +00003315 FoundField->getType())) {
Gabor Marton26f72a92018-07-12 09:42:05 +00003316 Importer.MapImported(D, FoundField);
Gabor Marton42e15de2018-08-22 11:52:14 +00003317 // In case of a FieldDecl of a ClassTemplateSpecializationDecl, the
3318 // initializer of a FieldDecl might not had been instantiated in the
3319 // "To" context. However, the "From" context might instantiated that,
3320 // thus we have to merge that.
3321 if (Expr *FromInitializer = D->getInClassInitializer()) {
3322 // We don't have yet the initializer set.
3323 if (FoundField->hasInClassInitializer() &&
3324 !FoundField->getInClassInitializer()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00003325 if (ExpectedExpr ToInitializerOrErr = import(FromInitializer))
3326 FoundField->setInClassInitializer(*ToInitializerOrErr);
3327 else {
3328 // We can't return error here,
Gabor Marton42e15de2018-08-22 11:52:14 +00003329 // since we already mapped D as imported.
Balazs Keri3b30d652018-10-19 13:32:20 +00003330 // FIXME: warning message?
3331 consumeError(ToInitializerOrErr.takeError());
Gabor Marton42e15de2018-08-22 11:52:14 +00003332 return FoundField;
Balazs Keri3b30d652018-10-19 13:32:20 +00003333 }
Gabor Marton42e15de2018-08-22 11:52:14 +00003334 }
3335 }
Douglas Gregor03d1ed32011-10-14 21:54:42 +00003336 return FoundField;
3337 }
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00003338
Balazs Keri3b30d652018-10-19 13:32:20 +00003339 // FIXME: Why is this case not handled with calling HandleNameConflict?
Douglas Gregor03d1ed32011-10-14 21:54:42 +00003340 Importer.ToDiag(Loc, diag::err_odr_field_type_inconsistent)
3341 << Name << D->getType() << FoundField->getType();
3342 Importer.ToDiag(FoundField->getLocation(), diag::note_odr_value_here)
3343 << FoundField->getType();
Balazs Keri3b30d652018-10-19 13:32:20 +00003344
3345 return make_error<ImportError>(ImportError::NameConflict);
Douglas Gregor03d1ed32011-10-14 21:54:42 +00003346 }
3347 }
3348
Balazs Keri3b30d652018-10-19 13:32:20 +00003349 QualType ToType;
3350 TypeSourceInfo *ToTInfo;
3351 Expr *ToBitWidth;
3352 SourceLocation ToInnerLocStart;
3353 Expr *ToInitializer;
3354 if (auto Imp = importSeq(
3355 D->getType(), D->getTypeSourceInfo(), D->getBitWidth(),
3356 D->getInnerLocStart(), D->getInClassInitializer()))
3357 std::tie(
3358 ToType, ToTInfo, ToBitWidth, ToInnerLocStart, ToInitializer) = *Imp;
3359 else
3360 return Imp.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00003361
Gabor Marton26f72a92018-07-12 09:42:05 +00003362 FieldDecl *ToField;
3363 if (GetImportedOrCreateDecl(ToField, D, Importer.getToContext(), DC,
Balazs Keri3b30d652018-10-19 13:32:20 +00003364 ToInnerLocStart, Loc, Name.getAsIdentifierInfo(),
3365 ToType, ToTInfo, ToBitWidth, D->isMutable(),
3366 D->getInClassInitStyle()))
Gabor Marton26f72a92018-07-12 09:42:05 +00003367 return ToField;
3368
Douglas Gregordd483172010-02-22 17:42:47 +00003369 ToField->setAccess(D->getAccess());
Douglas Gregor5c73e912010-02-11 00:48:18 +00003370 ToField->setLexicalDeclContext(LexicalDC);
Balazs Keri3b30d652018-10-19 13:32:20 +00003371 if (ToInitializer)
3372 ToField->setInClassInitializer(ToInitializer);
Douglas Gregorceb32bf2012-10-26 16:45:11 +00003373 ToField->setImplicit(D->isImplicit());
Sean Callanan95e74be2011-10-21 02:57:43 +00003374 LexicalDC->addDeclInternal(ToField);
Douglas Gregor5c73e912010-02-11 00:48:18 +00003375 return ToField;
3376}
3377
Balazs Keri3b30d652018-10-19 13:32:20 +00003378ExpectedDecl ASTNodeImporter::VisitIndirectFieldDecl(IndirectFieldDecl *D) {
Francois Pichet783dd6e2010-11-21 06:08:52 +00003379 // Import the major distinguishing characteristics of a variable.
3380 DeclContext *DC, *LexicalDC;
3381 DeclarationName Name;
3382 SourceLocation Loc;
Sean Callanan59721b32015-04-28 18:41:46 +00003383 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00003384 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
3385 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00003386 if (ToD)
3387 return ToD;
Francois Pichet783dd6e2010-11-21 06:08:52 +00003388
Fangrui Song6907ce22018-07-30 19:24:48 +00003389 // Determine whether we've already imported this field.
Gabor Marton54058b52018-12-17 13:53:12 +00003390 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
Douglas Gregor9e0a5b32011-10-15 00:10:27 +00003391 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00003392 if (auto *FoundField = dyn_cast<IndirectFieldDecl>(FoundDecls[I])) {
Douglas Gregorceb32bf2012-10-26 16:45:11 +00003393 // For anonymous indirect fields, match up by index.
Balazs Keri2544b4b2018-08-08 09:40:57 +00003394 if (!Name &&
3395 ASTImporter::getFieldIndex(D) !=
3396 ASTImporter::getFieldIndex(FoundField))
Douglas Gregorceb32bf2012-10-26 16:45:11 +00003397 continue;
3398
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00003399 if (Importer.IsStructurallyEquivalent(D->getType(),
Douglas Gregordd6006f2012-07-17 21:16:27 +00003400 FoundField->getType(),
David Blaikie7d170102013-05-15 07:37:26 +00003401 !Name.isEmpty())) {
Gabor Marton26f72a92018-07-12 09:42:05 +00003402 Importer.MapImported(D, FoundField);
Douglas Gregor03d1ed32011-10-14 21:54:42 +00003403 return FoundField;
3404 }
Douglas Gregordd6006f2012-07-17 21:16:27 +00003405
3406 // If there are more anonymous fields to check, continue.
3407 if (!Name && I < N-1)
3408 continue;
3409
Balazs Keri3b30d652018-10-19 13:32:20 +00003410 // FIXME: Why is this case not handled with calling HandleNameConflict?
Douglas Gregor03d1ed32011-10-14 21:54:42 +00003411 Importer.ToDiag(Loc, diag::err_odr_field_type_inconsistent)
3412 << Name << D->getType() << FoundField->getType();
3413 Importer.ToDiag(FoundField->getLocation(), diag::note_odr_value_here)
3414 << FoundField->getType();
Balazs Keri3b30d652018-10-19 13:32:20 +00003415
3416 return make_error<ImportError>(ImportError::NameConflict);
Douglas Gregor03d1ed32011-10-14 21:54:42 +00003417 }
3418 }
3419
Francois Pichet783dd6e2010-11-21 06:08:52 +00003420 // Import the type.
Balazs Keri3b30d652018-10-19 13:32:20 +00003421 auto TypeOrErr = import(D->getType());
3422 if (!TypeOrErr)
3423 return TypeOrErr.takeError();
Francois Pichet783dd6e2010-11-21 06:08:52 +00003424
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00003425 auto **NamedChain =
3426 new (Importer.getToContext()) NamedDecl*[D->getChainingSize()];
Francois Pichet783dd6e2010-11-21 06:08:52 +00003427
3428 unsigned i = 0;
Balazs Keri3b30d652018-10-19 13:32:20 +00003429 for (auto *PI : D->chain())
3430 if (Expected<NamedDecl *> ToD = import(PI))
3431 NamedChain[i++] = *ToD;
3432 else
3433 return ToD.takeError();
Francois Pichet783dd6e2010-11-21 06:08:52 +00003434
Gabor Marton26f72a92018-07-12 09:42:05 +00003435 llvm::MutableArrayRef<NamedDecl *> CH = {NamedChain, D->getChainingSize()};
3436 IndirectFieldDecl *ToIndirectField;
3437 if (GetImportedOrCreateDecl(ToIndirectField, D, Importer.getToContext(), DC,
Balazs Keri3b30d652018-10-19 13:32:20 +00003438 Loc, Name.getAsIdentifierInfo(), *TypeOrErr, CH))
Gabor Marton26f72a92018-07-12 09:42:05 +00003439 // FIXME here we leak `NamedChain` which is allocated before
3440 return ToIndirectField;
Aaron Ballman260995b2014-10-15 16:58:18 +00003441
Balazs Keri3b30d652018-10-19 13:32:20 +00003442 for (const auto *Attr : D->attrs())
3443 ToIndirectField->addAttr(Importer.Import(Attr));
Aaron Ballman260995b2014-10-15 16:58:18 +00003444
Francois Pichet783dd6e2010-11-21 06:08:52 +00003445 ToIndirectField->setAccess(D->getAccess());
3446 ToIndirectField->setLexicalDeclContext(LexicalDC);
Sean Callanan95e74be2011-10-21 02:57:43 +00003447 LexicalDC->addDeclInternal(ToIndirectField);
Francois Pichet783dd6e2010-11-21 06:08:52 +00003448 return ToIndirectField;
3449}
3450
Balazs Keri3b30d652018-10-19 13:32:20 +00003451ExpectedDecl ASTNodeImporter::VisitFriendDecl(FriendDecl *D) {
Aleksei Sidorina693b372016-09-28 10:16:56 +00003452 // Import the major distinguishing characteristics of a declaration.
Balazs Keri3b30d652018-10-19 13:32:20 +00003453 DeclContext *DC, *LexicalDC;
3454 if (Error Err = ImportDeclContext(D, DC, LexicalDC))
3455 return std::move(Err);
Aleksei Sidorina693b372016-09-28 10:16:56 +00003456
3457 // Determine whether we've already imported this decl.
Gabor Marton54058b52018-12-17 13:53:12 +00003458 // FriendDecl is not a NamedDecl so we cannot use lookup.
Aleksei Sidorina693b372016-09-28 10:16:56 +00003459 auto *RD = cast<CXXRecordDecl>(DC);
3460 FriendDecl *ImportedFriend = RD->getFirstFriend();
Aleksei Sidorina693b372016-09-28 10:16:56 +00003461
3462 while (ImportedFriend) {
3463 if (D->getFriendDecl() && ImportedFriend->getFriendDecl()) {
Gabor Marton950fb572018-07-17 12:39:27 +00003464 if (IsStructuralMatch(D->getFriendDecl(), ImportedFriend->getFriendDecl(),
3465 /*Complain=*/false))
Gabor Marton26f72a92018-07-12 09:42:05 +00003466 return Importer.MapImported(D, ImportedFriend);
Aleksei Sidorina693b372016-09-28 10:16:56 +00003467
3468 } else if (D->getFriendType() && ImportedFriend->getFriendType()) {
3469 if (Importer.IsStructurallyEquivalent(
3470 D->getFriendType()->getType(),
3471 ImportedFriend->getFriendType()->getType(), true))
Gabor Marton26f72a92018-07-12 09:42:05 +00003472 return Importer.MapImported(D, ImportedFriend);
Aleksei Sidorina693b372016-09-28 10:16:56 +00003473 }
3474 ImportedFriend = ImportedFriend->getNextFriend();
3475 }
3476
3477 // Not found. Create it.
3478 FriendDecl::FriendUnion ToFU;
Peter Szecsib180eeb2018-04-25 17:28:03 +00003479 if (NamedDecl *FriendD = D->getFriendDecl()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00003480 NamedDecl *ToFriendD;
3481 if (Error Err = importInto(ToFriendD, FriendD))
3482 return std::move(Err);
3483
3484 if (FriendD->getFriendObjectKind() != Decl::FOK_None &&
Peter Szecsib180eeb2018-04-25 17:28:03 +00003485 !(FriendD->isInIdentifierNamespace(Decl::IDNS_NonMemberOperator)))
3486 ToFriendD->setObjectOfFriendDecl(false);
3487
3488 ToFU = ToFriendD;
Balazs Keri3b30d652018-10-19 13:32:20 +00003489 } else { // The friend is a type, not a decl.
3490 if (auto TSIOrErr = import(D->getFriendType()))
3491 ToFU = *TSIOrErr;
3492 else
3493 return TSIOrErr.takeError();
3494 }
Aleksei Sidorina693b372016-09-28 10:16:56 +00003495
3496 SmallVector<TemplateParameterList *, 1> ToTPLists(D->NumTPLists);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00003497 auto **FromTPLists = D->getTrailingObjects<TemplateParameterList *>();
Aleksei Sidorina693b372016-09-28 10:16:56 +00003498 for (unsigned I = 0; I < D->NumTPLists; I++) {
Balazs Keri3b30d652018-10-19 13:32:20 +00003499 if (auto ListOrErr = ImportTemplateParameterList(FromTPLists[I]))
3500 ToTPLists[I] = *ListOrErr;
3501 else
3502 return ListOrErr.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00003503 }
3504
Balazs Keri3b30d652018-10-19 13:32:20 +00003505 auto LocationOrErr = import(D->getLocation());
3506 if (!LocationOrErr)
3507 return LocationOrErr.takeError();
3508 auto FriendLocOrErr = import(D->getFriendLoc());
3509 if (!FriendLocOrErr)
3510 return FriendLocOrErr.takeError();
3511
Gabor Marton26f72a92018-07-12 09:42:05 +00003512 FriendDecl *FrD;
3513 if (GetImportedOrCreateDecl(FrD, D, Importer.getToContext(), DC,
Balazs Keri3b30d652018-10-19 13:32:20 +00003514 *LocationOrErr, ToFU,
3515 *FriendLocOrErr, ToTPLists))
Gabor Marton26f72a92018-07-12 09:42:05 +00003516 return FrD;
Aleksei Sidorina693b372016-09-28 10:16:56 +00003517
3518 FrD->setAccess(D->getAccess());
3519 FrD->setLexicalDeclContext(LexicalDC);
3520 LexicalDC->addDeclInternal(FrD);
3521 return FrD;
3522}
3523
Balazs Keri3b30d652018-10-19 13:32:20 +00003524ExpectedDecl ASTNodeImporter::VisitObjCIvarDecl(ObjCIvarDecl *D) {
Douglas Gregor7244b0b2010-02-17 00:34:30 +00003525 // Import the major distinguishing characteristics of an ivar.
3526 DeclContext *DC, *LexicalDC;
3527 DeclarationName Name;
3528 SourceLocation Loc;
Sean Callanan59721b32015-04-28 18:41:46 +00003529 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00003530 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
3531 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00003532 if (ToD)
3533 return ToD;
Craig Topper36250ad2014-05-12 05:36:57 +00003534
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00003535 // Determine whether we've already imported this ivar
Gabor Marton54058b52018-12-17 13:53:12 +00003536 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00003537 for (auto *FoundDecl : FoundDecls) {
Balazs Keri3b30d652018-10-19 13:32:20 +00003538 if (ObjCIvarDecl *FoundIvar = dyn_cast<ObjCIvarDecl>(FoundDecl)) {
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00003539 if (Importer.IsStructurallyEquivalent(D->getType(),
Douglas Gregor7244b0b2010-02-17 00:34:30 +00003540 FoundIvar->getType())) {
Gabor Marton26f72a92018-07-12 09:42:05 +00003541 Importer.MapImported(D, FoundIvar);
Douglas Gregor7244b0b2010-02-17 00:34:30 +00003542 return FoundIvar;
3543 }
3544
3545 Importer.ToDiag(Loc, diag::err_odr_ivar_type_inconsistent)
3546 << Name << D->getType() << FoundIvar->getType();
3547 Importer.ToDiag(FoundIvar->getLocation(), diag::note_odr_value_here)
3548 << FoundIvar->getType();
Balazs Keri3b30d652018-10-19 13:32:20 +00003549
3550 return make_error<ImportError>(ImportError::NameConflict);
Douglas Gregor7244b0b2010-02-17 00:34:30 +00003551 }
3552 }
3553
Balazs Keri3b30d652018-10-19 13:32:20 +00003554 QualType ToType;
3555 TypeSourceInfo *ToTypeSourceInfo;
3556 Expr *ToBitWidth;
3557 SourceLocation ToInnerLocStart;
3558 if (auto Imp = importSeq(
3559 D->getType(), D->getTypeSourceInfo(), D->getBitWidth(), D->getInnerLocStart()))
3560 std::tie(ToType, ToTypeSourceInfo, ToBitWidth, ToInnerLocStart) = *Imp;
3561 else
3562 return Imp.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00003563
Gabor Marton26f72a92018-07-12 09:42:05 +00003564 ObjCIvarDecl *ToIvar;
3565 if (GetImportedOrCreateDecl(
3566 ToIvar, D, Importer.getToContext(), cast<ObjCContainerDecl>(DC),
Balazs Keri3b30d652018-10-19 13:32:20 +00003567 ToInnerLocStart, Loc, Name.getAsIdentifierInfo(),
3568 ToType, ToTypeSourceInfo,
3569 D->getAccessControl(),ToBitWidth, D->getSynthesize()))
Gabor Marton26f72a92018-07-12 09:42:05 +00003570 return ToIvar;
3571
Douglas Gregor7244b0b2010-02-17 00:34:30 +00003572 ToIvar->setLexicalDeclContext(LexicalDC);
Sean Callanan95e74be2011-10-21 02:57:43 +00003573 LexicalDC->addDeclInternal(ToIvar);
Douglas Gregor7244b0b2010-02-17 00:34:30 +00003574 return ToIvar;
Douglas Gregor7244b0b2010-02-17 00:34:30 +00003575}
3576
Balazs Keri3b30d652018-10-19 13:32:20 +00003577ExpectedDecl ASTNodeImporter::VisitVarDecl(VarDecl *D) {
Gabor Martonac3a5d62018-09-17 12:04:52 +00003578
3579 SmallVector<Decl*, 2> Redecls = getCanonicalForwardRedeclChain(D);
3580 auto RedeclIt = Redecls.begin();
3581 // Import the first part of the decl chain. I.e. import all previous
3582 // declarations starting from the canonical decl.
Balazs Keri3b30d652018-10-19 13:32:20 +00003583 for (; RedeclIt != Redecls.end() && *RedeclIt != D; ++RedeclIt) {
3584 ExpectedDecl RedeclOrErr = import(*RedeclIt);
3585 if (!RedeclOrErr)
3586 return RedeclOrErr.takeError();
3587 }
Gabor Martonac3a5d62018-09-17 12:04:52 +00003588 assert(*RedeclIt == D);
3589
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003590 // Import the major distinguishing characteristics of a variable.
3591 DeclContext *DC, *LexicalDC;
3592 DeclarationName Name;
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003593 SourceLocation Loc;
Sean Callanan59721b32015-04-28 18:41:46 +00003594 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00003595 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
3596 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00003597 if (ToD)
3598 return ToD;
Craig Topper36250ad2014-05-12 05:36:57 +00003599
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00003600 // Try to find a variable in our own ("to") context with the same name and
3601 // in the same context as the variable we're importing.
Gabor Martonac3a5d62018-09-17 12:04:52 +00003602 VarDecl *FoundByLookup = nullptr;
Douglas Gregor62d311f2010-02-09 19:21:46 +00003603 if (D->isFileVarDecl()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003604 SmallVector<NamedDecl *, 4> ConflictingDecls;
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00003605 unsigned IDNS = Decl::IDNS_Ordinary;
Gabor Marton54058b52018-12-17 13:53:12 +00003606 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00003607 for (auto *FoundDecl : FoundDecls) {
3608 if (!FoundDecl->isInIdentifierNamespace(IDNS))
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00003609 continue;
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00003610
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00003611 if (auto *FoundVar = dyn_cast<VarDecl>(FoundDecl)) {
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00003612 // We have found a variable that we may need to merge with. Check it.
Rafael Espindola3ae00052013-05-13 00:12:11 +00003613 if (FoundVar->hasExternalFormalLinkage() &&
3614 D->hasExternalFormalLinkage()) {
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00003615 if (Importer.IsStructurallyEquivalent(D->getType(),
Douglas Gregorb4964f72010-02-15 23:54:17 +00003616 FoundVar->getType())) {
Gabor Martonac3a5d62018-09-17 12:04:52 +00003617
3618 // The VarDecl in the "From" context has a definition, but in the
3619 // "To" context we already have a definition.
3620 VarDecl *FoundDef = FoundVar->getDefinition();
3621 if (D->isThisDeclarationADefinition() && FoundDef)
3622 // FIXME Check for ODR error if the two definitions have
3623 // different initializers?
3624 return Importer.MapImported(D, FoundDef);
3625
3626 // The VarDecl in the "From" context has an initializer, but in the
3627 // "To" context we already have an initializer.
3628 const VarDecl *FoundDInit = nullptr;
3629 if (D->getInit() && FoundVar->getAnyInitializer(FoundDInit))
3630 // FIXME Diagnose ODR error if the two initializers are different?
3631 return Importer.MapImported(D, const_cast<VarDecl*>(FoundDInit));
3632
3633 FoundByLookup = FoundVar;
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00003634 break;
3635 }
3636
Douglas Gregor56521c52010-02-12 17:23:39 +00003637 const ArrayType *FoundArray
3638 = Importer.getToContext().getAsArrayType(FoundVar->getType());
3639 const ArrayType *TArray
Douglas Gregorb4964f72010-02-15 23:54:17 +00003640 = Importer.getToContext().getAsArrayType(D->getType());
Douglas Gregor56521c52010-02-12 17:23:39 +00003641 if (FoundArray && TArray) {
3642 if (isa<IncompleteArrayType>(FoundArray) &&
3643 isa<ConstantArrayType>(TArray)) {
Douglas Gregorb4964f72010-02-15 23:54:17 +00003644 // Import the type.
Balazs Keri3b30d652018-10-19 13:32:20 +00003645 if (auto TyOrErr = import(D->getType()))
3646 FoundVar->setType(*TyOrErr);
3647 else
3648 return TyOrErr.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00003649
Gabor Martonac3a5d62018-09-17 12:04:52 +00003650 FoundByLookup = FoundVar;
Douglas Gregor56521c52010-02-12 17:23:39 +00003651 break;
3652 } else if (isa<IncompleteArrayType>(TArray) &&
3653 isa<ConstantArrayType>(FoundArray)) {
Gabor Martonac3a5d62018-09-17 12:04:52 +00003654 FoundByLookup = FoundVar;
Douglas Gregor56521c52010-02-12 17:23:39 +00003655 break;
Douglas Gregor2fbe5582010-02-10 17:16:49 +00003656 }
3657 }
3658
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00003659 Importer.ToDiag(Loc, diag::err_odr_variable_type_inconsistent)
Douglas Gregorb4964f72010-02-15 23:54:17 +00003660 << Name << D->getType() << FoundVar->getType();
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00003661 Importer.ToDiag(FoundVar->getLocation(), diag::note_odr_value_here)
3662 << FoundVar->getType();
3663 }
3664 }
Fangrui Song6907ce22018-07-30 19:24:48 +00003665
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00003666 ConflictingDecls.push_back(FoundDecl);
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00003667 }
3668
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00003669 if (!ConflictingDecls.empty()) {
3670 Name = Importer.HandleNameConflict(Name, DC, IDNS,
Fangrui Song6907ce22018-07-30 19:24:48 +00003671 ConflictingDecls.data(),
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00003672 ConflictingDecls.size());
3673 if (!Name)
Balazs Keri3b30d652018-10-19 13:32:20 +00003674 return make_error<ImportError>(ImportError::NameConflict);
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00003675 }
3676 }
Fangrui Song6907ce22018-07-30 19:24:48 +00003677
Balazs Keri3b30d652018-10-19 13:32:20 +00003678 QualType ToType;
3679 TypeSourceInfo *ToTypeSourceInfo;
3680 SourceLocation ToInnerLocStart;
3681 NestedNameSpecifierLoc ToQualifierLoc;
3682 if (auto Imp = importSeq(
3683 D->getType(), D->getTypeSourceInfo(), D->getInnerLocStart(),
3684 D->getQualifierLoc()))
3685 std::tie(ToType, ToTypeSourceInfo, ToInnerLocStart, ToQualifierLoc) = *Imp;
3686 else
3687 return Imp.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00003688
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00003689 // Create the imported variable.
Gabor Marton26f72a92018-07-12 09:42:05 +00003690 VarDecl *ToVar;
3691 if (GetImportedOrCreateDecl(ToVar, D, Importer.getToContext(), DC,
Balazs Keri3b30d652018-10-19 13:32:20 +00003692 ToInnerLocStart, Loc,
3693 Name.getAsIdentifierInfo(),
3694 ToType, ToTypeSourceInfo,
Gabor Marton26f72a92018-07-12 09:42:05 +00003695 D->getStorageClass()))
3696 return ToVar;
3697
Balazs Keri3b30d652018-10-19 13:32:20 +00003698 ToVar->setQualifierInfo(ToQualifierLoc);
Douglas Gregordd483172010-02-22 17:42:47 +00003699 ToVar->setAccess(D->getAccess());
Douglas Gregor62d311f2010-02-09 19:21:46 +00003700 ToVar->setLexicalDeclContext(LexicalDC);
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00003701
Gabor Martonac3a5d62018-09-17 12:04:52 +00003702 if (FoundByLookup) {
3703 auto *Recent = const_cast<VarDecl *>(FoundByLookup->getMostRecentDecl());
3704 ToVar->setPreviousDecl(Recent);
3705 }
Douglas Gregor62d311f2010-02-09 19:21:46 +00003706
Balazs Keri3b30d652018-10-19 13:32:20 +00003707 if (Error Err = ImportInitializer(D, ToVar))
3708 return std::move(Err);
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00003709
Aleksei Sidorin855086d2017-01-23 09:30:36 +00003710 if (D->isConstexpr())
3711 ToVar->setConstexpr(true);
3712
Gabor Martonac3a5d62018-09-17 12:04:52 +00003713 if (D->getDeclContext()->containsDeclAndLoad(D))
3714 DC->addDeclInternal(ToVar);
3715 if (DC != LexicalDC && D->getLexicalDeclContext()->containsDeclAndLoad(D))
3716 LexicalDC->addDeclInternal(ToVar);
3717
3718 // Import the rest of the chain. I.e. import all subsequent declarations.
Balazs Keri3b30d652018-10-19 13:32:20 +00003719 for (++RedeclIt; RedeclIt != Redecls.end(); ++RedeclIt) {
3720 ExpectedDecl RedeclOrErr = import(*RedeclIt);
3721 if (!RedeclOrErr)
3722 return RedeclOrErr.takeError();
3723 }
Gabor Martonac3a5d62018-09-17 12:04:52 +00003724
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00003725 return ToVar;
3726}
3727
Balazs Keri3b30d652018-10-19 13:32:20 +00003728ExpectedDecl ASTNodeImporter::VisitImplicitParamDecl(ImplicitParamDecl *D) {
Douglas Gregor8b228d72010-02-17 21:22:52 +00003729 // Parameters are created in the translation unit's context, then moved
3730 // into the function declaration's context afterward.
3731 DeclContext *DC = Importer.getToContext().getTranslationUnitDecl();
Fangrui Song6907ce22018-07-30 19:24:48 +00003732
Balazs Keri3b30d652018-10-19 13:32:20 +00003733 DeclarationName ToDeclName;
3734 SourceLocation ToLocation;
3735 QualType ToType;
3736 if (auto Imp = importSeq(D->getDeclName(), D->getLocation(), D->getType()))
3737 std::tie(ToDeclName, ToLocation, ToType) = *Imp;
3738 else
3739 return Imp.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00003740
Douglas Gregor8b228d72010-02-17 21:22:52 +00003741 // Create the imported parameter.
Gabor Marton26f72a92018-07-12 09:42:05 +00003742 ImplicitParamDecl *ToParm = nullptr;
Balazs Keri3b30d652018-10-19 13:32:20 +00003743 if (GetImportedOrCreateDecl(ToParm, D, Importer.getToContext(), DC,
3744 ToLocation, ToDeclName.getAsIdentifierInfo(),
3745 ToType, D->getParameterKind()))
Gabor Marton26f72a92018-07-12 09:42:05 +00003746 return ToParm;
3747 return ToParm;
Douglas Gregor8b228d72010-02-17 21:22:52 +00003748}
3749
Balazs Keri3b30d652018-10-19 13:32:20 +00003750ExpectedDecl ASTNodeImporter::VisitParmVarDecl(ParmVarDecl *D) {
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003751 // Parameters are created in the translation unit's context, then moved
3752 // into the function declaration's context afterward.
3753 DeclContext *DC = Importer.getToContext().getTranslationUnitDecl();
Fangrui Song6907ce22018-07-30 19:24:48 +00003754
Balazs Keri3b30d652018-10-19 13:32:20 +00003755 DeclarationName ToDeclName;
3756 SourceLocation ToLocation, ToInnerLocStart;
3757 QualType ToType;
3758 TypeSourceInfo *ToTypeSourceInfo;
3759 if (auto Imp = importSeq(
3760 D->getDeclName(), D->getLocation(), D->getType(), D->getInnerLocStart(),
3761 D->getTypeSourceInfo()))
3762 std::tie(
3763 ToDeclName, ToLocation, ToType, ToInnerLocStart,
3764 ToTypeSourceInfo) = *Imp;
3765 else
3766 return Imp.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00003767
Gabor Marton26f72a92018-07-12 09:42:05 +00003768 ParmVarDecl *ToParm;
3769 if (GetImportedOrCreateDecl(ToParm, D, Importer.getToContext(), DC,
Balazs Keri3b30d652018-10-19 13:32:20 +00003770 ToInnerLocStart, ToLocation,
3771 ToDeclName.getAsIdentifierInfo(), ToType,
3772 ToTypeSourceInfo, D->getStorageClass(),
Gabor Marton26f72a92018-07-12 09:42:05 +00003773 /*DefaultArg*/ nullptr))
3774 return ToParm;
Aleksei Sidorin55a63502017-02-20 11:57:12 +00003775
3776 // Set the default argument.
John McCallf3cd6652010-03-12 18:31:32 +00003777 ToParm->setHasInheritedDefaultArg(D->hasInheritedDefaultArg());
Aleksei Sidorin55a63502017-02-20 11:57:12 +00003778 ToParm->setKNRPromoted(D->isKNRPromoted());
3779
Aleksei Sidorin55a63502017-02-20 11:57:12 +00003780 if (D->hasUninstantiatedDefaultArg()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00003781 if (auto ToDefArgOrErr = import(D->getUninstantiatedDefaultArg()))
3782 ToParm->setUninstantiatedDefaultArg(*ToDefArgOrErr);
3783 else
3784 return ToDefArgOrErr.takeError();
Aleksei Sidorin55a63502017-02-20 11:57:12 +00003785 } else if (D->hasUnparsedDefaultArg()) {
3786 ToParm->setUnparsedDefaultArg();
3787 } else if (D->hasDefaultArg()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00003788 if (auto ToDefArgOrErr = import(D->getDefaultArg()))
3789 ToParm->setDefaultArg(*ToDefArgOrErr);
3790 else
3791 return ToDefArgOrErr.takeError();
Aleksei Sidorin55a63502017-02-20 11:57:12 +00003792 }
Sean Callanan59721b32015-04-28 18:41:46 +00003793
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00003794 if (D->isObjCMethodParameter()) {
3795 ToParm->setObjCMethodScopeInfo(D->getFunctionScopeIndex());
3796 ToParm->setObjCDeclQualifier(D->getObjCDeclQualifier());
3797 } else {
3798 ToParm->setScopeInfo(D->getFunctionScopeDepth(),
3799 D->getFunctionScopeIndex());
3800 }
3801
Gabor Marton26f72a92018-07-12 09:42:05 +00003802 return ToParm;
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003803}
3804
Balazs Keri3b30d652018-10-19 13:32:20 +00003805ExpectedDecl ASTNodeImporter::VisitObjCMethodDecl(ObjCMethodDecl *D) {
Douglas Gregor43f54792010-02-17 02:12:47 +00003806 // Import the major distinguishing characteristics of a method.
3807 DeclContext *DC, *LexicalDC;
3808 DeclarationName Name;
3809 SourceLocation Loc;
Sean Callanan59721b32015-04-28 18:41:46 +00003810 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00003811 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
3812 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00003813 if (ToD)
3814 return ToD;
Craig Topper36250ad2014-05-12 05:36:57 +00003815
Gabor Marton54058b52018-12-17 13:53:12 +00003816 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00003817 for (auto *FoundDecl : FoundDecls) {
3818 if (auto *FoundMethod = dyn_cast<ObjCMethodDecl>(FoundDecl)) {
Douglas Gregor43f54792010-02-17 02:12:47 +00003819 if (FoundMethod->isInstanceMethod() != D->isInstanceMethod())
3820 continue;
3821
3822 // Check return types.
Alp Toker314cc812014-01-25 16:55:45 +00003823 if (!Importer.IsStructurallyEquivalent(D->getReturnType(),
3824 FoundMethod->getReturnType())) {
Douglas Gregor43f54792010-02-17 02:12:47 +00003825 Importer.ToDiag(Loc, diag::err_odr_objc_method_result_type_inconsistent)
Alp Toker314cc812014-01-25 16:55:45 +00003826 << D->isInstanceMethod() << Name << D->getReturnType()
3827 << FoundMethod->getReturnType();
Fangrui Song6907ce22018-07-30 19:24:48 +00003828 Importer.ToDiag(FoundMethod->getLocation(),
Douglas Gregor43f54792010-02-17 02:12:47 +00003829 diag::note_odr_objc_method_here)
3830 << D->isInstanceMethod() << Name;
Balazs Keri3b30d652018-10-19 13:32:20 +00003831
3832 return make_error<ImportError>(ImportError::NameConflict);
Douglas Gregor43f54792010-02-17 02:12:47 +00003833 }
3834
3835 // Check the number of parameters.
3836 if (D->param_size() != FoundMethod->param_size()) {
3837 Importer.ToDiag(Loc, diag::err_odr_objc_method_num_params_inconsistent)
3838 << D->isInstanceMethod() << Name
3839 << D->param_size() << FoundMethod->param_size();
Fangrui Song6907ce22018-07-30 19:24:48 +00003840 Importer.ToDiag(FoundMethod->getLocation(),
Douglas Gregor43f54792010-02-17 02:12:47 +00003841 diag::note_odr_objc_method_here)
3842 << D->isInstanceMethod() << Name;
Balazs Keri3b30d652018-10-19 13:32:20 +00003843
3844 return make_error<ImportError>(ImportError::NameConflict);
Douglas Gregor43f54792010-02-17 02:12:47 +00003845 }
3846
3847 // Check parameter types.
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00003848 for (ObjCMethodDecl::param_iterator P = D->param_begin(),
Douglas Gregor43f54792010-02-17 02:12:47 +00003849 PEnd = D->param_end(), FoundP = FoundMethod->param_begin();
3850 P != PEnd; ++P, ++FoundP) {
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00003851 if (!Importer.IsStructurallyEquivalent((*P)->getType(),
Douglas Gregor43f54792010-02-17 02:12:47 +00003852 (*FoundP)->getType())) {
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00003853 Importer.FromDiag((*P)->getLocation(),
Douglas Gregor43f54792010-02-17 02:12:47 +00003854 diag::err_odr_objc_method_param_type_inconsistent)
3855 << D->isInstanceMethod() << Name
3856 << (*P)->getType() << (*FoundP)->getType();
3857 Importer.ToDiag((*FoundP)->getLocation(), diag::note_odr_value_here)
3858 << (*FoundP)->getType();
Balazs Keri3b30d652018-10-19 13:32:20 +00003859
3860 return make_error<ImportError>(ImportError::NameConflict);
Douglas Gregor43f54792010-02-17 02:12:47 +00003861 }
3862 }
3863
3864 // Check variadic/non-variadic.
3865 // Check the number of parameters.
3866 if (D->isVariadic() != FoundMethod->isVariadic()) {
3867 Importer.ToDiag(Loc, diag::err_odr_objc_method_variadic_inconsistent)
3868 << D->isInstanceMethod() << Name;
Fangrui Song6907ce22018-07-30 19:24:48 +00003869 Importer.ToDiag(FoundMethod->getLocation(),
Douglas Gregor43f54792010-02-17 02:12:47 +00003870 diag::note_odr_objc_method_here)
3871 << D->isInstanceMethod() << Name;
Balazs Keri3b30d652018-10-19 13:32:20 +00003872
3873 return make_error<ImportError>(ImportError::NameConflict);
Douglas Gregor43f54792010-02-17 02:12:47 +00003874 }
3875
3876 // FIXME: Any other bits we need to merge?
Gabor Marton26f72a92018-07-12 09:42:05 +00003877 return Importer.MapImported(D, FoundMethod);
Douglas Gregor43f54792010-02-17 02:12:47 +00003878 }
3879 }
3880
Balazs Keri3b30d652018-10-19 13:32:20 +00003881 SourceLocation ToEndLoc;
3882 QualType ToReturnType;
3883 TypeSourceInfo *ToReturnTypeSourceInfo;
3884 if (auto Imp = importSeq(
3885 D->getEndLoc(), D->getReturnType(), D->getReturnTypeSourceInfo()))
3886 std::tie(ToEndLoc, ToReturnType, ToReturnTypeSourceInfo) = *Imp;
3887 else
3888 return Imp.takeError();
Douglas Gregor12852d92010-03-08 14:59:44 +00003889
Gabor Marton26f72a92018-07-12 09:42:05 +00003890 ObjCMethodDecl *ToMethod;
3891 if (GetImportedOrCreateDecl(
3892 ToMethod, D, Importer.getToContext(), Loc,
Balazs Keri3b30d652018-10-19 13:32:20 +00003893 ToEndLoc, Name.getObjCSelector(), ToReturnType,
3894 ToReturnTypeSourceInfo, DC, D->isInstanceMethod(), D->isVariadic(),
Gabor Marton26f72a92018-07-12 09:42:05 +00003895 D->isPropertyAccessor(), D->isImplicit(), D->isDefined(),
3896 D->getImplementationControl(), D->hasRelatedResultType()))
3897 return ToMethod;
Douglas Gregor43f54792010-02-17 02:12:47 +00003898
3899 // FIXME: When we decide to merge method definitions, we'll need to
3900 // deal with implicit parameters.
3901
3902 // Import the parameters
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003903 SmallVector<ParmVarDecl *, 5> ToParams;
David Majnemer59f77922016-06-24 04:05:48 +00003904 for (auto *FromP : D->parameters()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00003905 if (Expected<ParmVarDecl *> ToPOrErr = import(FromP))
3906 ToParams.push_back(*ToPOrErr);
3907 else
3908 return ToPOrErr.takeError();
Douglas Gregor43f54792010-02-17 02:12:47 +00003909 }
Fangrui Song6907ce22018-07-30 19:24:48 +00003910
Douglas Gregor43f54792010-02-17 02:12:47 +00003911 // Set the parameters.
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00003912 for (auto *ToParam : ToParams) {
3913 ToParam->setOwningFunction(ToMethod);
3914 ToMethod->addDeclInternal(ToParam);
Douglas Gregor43f54792010-02-17 02:12:47 +00003915 }
Aleksei Sidorin47dbaf62018-01-09 14:25:05 +00003916
Balazs Keri3b30d652018-10-19 13:32:20 +00003917 SmallVector<SourceLocation, 12> FromSelLocs;
3918 D->getSelectorLocs(FromSelLocs);
3919 SmallVector<SourceLocation, 12> ToSelLocs(FromSelLocs.size());
3920 if (Error Err = ImportContainerChecked(FromSelLocs, ToSelLocs))
3921 return std::move(Err);
Aleksei Sidorin47dbaf62018-01-09 14:25:05 +00003922
Balazs Keri3b30d652018-10-19 13:32:20 +00003923 ToMethod->setMethodParams(Importer.getToContext(), ToParams, ToSelLocs);
Douglas Gregor43f54792010-02-17 02:12:47 +00003924
3925 ToMethod->setLexicalDeclContext(LexicalDC);
Sean Callanan95e74be2011-10-21 02:57:43 +00003926 LexicalDC->addDeclInternal(ToMethod);
Douglas Gregor43f54792010-02-17 02:12:47 +00003927 return ToMethod;
3928}
3929
Balazs Keri3b30d652018-10-19 13:32:20 +00003930ExpectedDecl ASTNodeImporter::VisitObjCTypeParamDecl(ObjCTypeParamDecl *D) {
Douglas Gregor85f3f952015-07-07 03:57:15 +00003931 // Import the major distinguishing characteristics of a category.
3932 DeclContext *DC, *LexicalDC;
3933 DeclarationName Name;
3934 SourceLocation Loc;
3935 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00003936 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
3937 return std::move(Err);
Douglas Gregor85f3f952015-07-07 03:57:15 +00003938 if (ToD)
3939 return ToD;
3940
Balazs Keri3b30d652018-10-19 13:32:20 +00003941 SourceLocation ToVarianceLoc, ToLocation, ToColonLoc;
3942 TypeSourceInfo *ToTypeSourceInfo;
3943 if (auto Imp = importSeq(
3944 D->getVarianceLoc(), D->getLocation(), D->getColonLoc(),
3945 D->getTypeSourceInfo()))
3946 std::tie(ToVarianceLoc, ToLocation, ToColonLoc, ToTypeSourceInfo) = *Imp;
3947 else
3948 return Imp.takeError();
Douglas Gregor85f3f952015-07-07 03:57:15 +00003949
Gabor Marton26f72a92018-07-12 09:42:05 +00003950 ObjCTypeParamDecl *Result;
3951 if (GetImportedOrCreateDecl(
3952 Result, D, Importer.getToContext(), DC, D->getVariance(),
Balazs Keri3b30d652018-10-19 13:32:20 +00003953 ToVarianceLoc, D->getIndex(),
3954 ToLocation, Name.getAsIdentifierInfo(),
3955 ToColonLoc, ToTypeSourceInfo))
Gabor Marton26f72a92018-07-12 09:42:05 +00003956 return Result;
3957
Douglas Gregor85f3f952015-07-07 03:57:15 +00003958 Result->setLexicalDeclContext(LexicalDC);
3959 return Result;
3960}
3961
Balazs Keri3b30d652018-10-19 13:32:20 +00003962ExpectedDecl ASTNodeImporter::VisitObjCCategoryDecl(ObjCCategoryDecl *D) {
Douglas Gregor84c51c32010-02-18 01:47:50 +00003963 // Import the major distinguishing characteristics of a category.
3964 DeclContext *DC, *LexicalDC;
3965 DeclarationName Name;
3966 SourceLocation Loc;
Sean Callanan59721b32015-04-28 18:41:46 +00003967 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00003968 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
3969 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00003970 if (ToD)
3971 return ToD;
Craig Topper36250ad2014-05-12 05:36:57 +00003972
Balazs Keri3b30d652018-10-19 13:32:20 +00003973 ObjCInterfaceDecl *ToInterface;
3974 if (Error Err = importInto(ToInterface, D->getClassInterface()))
3975 return std::move(Err);
Craig Topper36250ad2014-05-12 05:36:57 +00003976
Douglas Gregor84c51c32010-02-18 01:47:50 +00003977 // Determine if we've already encountered this category.
3978 ObjCCategoryDecl *MergeWithCategory
3979 = ToInterface->FindCategoryDeclaration(Name.getAsIdentifierInfo());
3980 ObjCCategoryDecl *ToCategory = MergeWithCategory;
3981 if (!ToCategory) {
Balazs Keri3b30d652018-10-19 13:32:20 +00003982 SourceLocation ToAtStartLoc, ToCategoryNameLoc;
3983 SourceLocation ToIvarLBraceLoc, ToIvarRBraceLoc;
3984 if (auto Imp = importSeq(
3985 D->getAtStartLoc(), D->getCategoryNameLoc(),
3986 D->getIvarLBraceLoc(), D->getIvarRBraceLoc()))
3987 std::tie(
3988 ToAtStartLoc, ToCategoryNameLoc,
3989 ToIvarLBraceLoc, ToIvarRBraceLoc) = *Imp;
3990 else
3991 return Imp.takeError();
Gabor Marton26f72a92018-07-12 09:42:05 +00003992
3993 if (GetImportedOrCreateDecl(ToCategory, D, Importer.getToContext(), DC,
Balazs Keri3b30d652018-10-19 13:32:20 +00003994 ToAtStartLoc, Loc,
3995 ToCategoryNameLoc,
Gabor Marton26f72a92018-07-12 09:42:05 +00003996 Name.getAsIdentifierInfo(), ToInterface,
3997 /*TypeParamList=*/nullptr,
Balazs Keri3b30d652018-10-19 13:32:20 +00003998 ToIvarLBraceLoc,
3999 ToIvarRBraceLoc))
Gabor Marton26f72a92018-07-12 09:42:05 +00004000 return ToCategory;
4001
Douglas Gregor84c51c32010-02-18 01:47:50 +00004002 ToCategory->setLexicalDeclContext(LexicalDC);
Sean Callanan95e74be2011-10-21 02:57:43 +00004003 LexicalDC->addDeclInternal(ToCategory);
Balazs Keri3b30d652018-10-19 13:32:20 +00004004 // Import the type parameter list after MapImported, to avoid
Douglas Gregorab7f0b32015-07-07 06:20:12 +00004005 // loops when bringing in their DeclContext.
Balazs Keri3b30d652018-10-19 13:32:20 +00004006 if (auto PListOrErr = ImportObjCTypeParamList(D->getTypeParamList()))
4007 ToCategory->setTypeParamList(*PListOrErr);
4008 else
4009 return PListOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00004010
Douglas Gregor84c51c32010-02-18 01:47:50 +00004011 // Import protocols
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004012 SmallVector<ObjCProtocolDecl *, 4> Protocols;
4013 SmallVector<SourceLocation, 4> ProtocolLocs;
Douglas Gregor84c51c32010-02-18 01:47:50 +00004014 ObjCCategoryDecl::protocol_loc_iterator FromProtoLoc
4015 = D->protocol_loc_begin();
4016 for (ObjCCategoryDecl::protocol_iterator FromProto = D->protocol_begin(),
4017 FromProtoEnd = D->protocol_end();
4018 FromProto != FromProtoEnd;
4019 ++FromProto, ++FromProtoLoc) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004020 if (Expected<ObjCProtocolDecl *> ToProtoOrErr = import(*FromProto))
4021 Protocols.push_back(*ToProtoOrErr);
4022 else
4023 return ToProtoOrErr.takeError();
4024
4025 if (ExpectedSLoc ToProtoLocOrErr = import(*FromProtoLoc))
4026 ProtocolLocs.push_back(*ToProtoLocOrErr);
4027 else
4028 return ToProtoLocOrErr.takeError();
Douglas Gregor84c51c32010-02-18 01:47:50 +00004029 }
Fangrui Song6907ce22018-07-30 19:24:48 +00004030
Douglas Gregor84c51c32010-02-18 01:47:50 +00004031 // FIXME: If we're merging, make sure that the protocol list is the same.
4032 ToCategory->setProtocolList(Protocols.data(), Protocols.size(),
4033 ProtocolLocs.data(), Importer.getToContext());
Balazs Keri3b30d652018-10-19 13:32:20 +00004034
Douglas Gregor84c51c32010-02-18 01:47:50 +00004035 } else {
Gabor Marton26f72a92018-07-12 09:42:05 +00004036 Importer.MapImported(D, ToCategory);
Douglas Gregor84c51c32010-02-18 01:47:50 +00004037 }
Fangrui Song6907ce22018-07-30 19:24:48 +00004038
Douglas Gregor84c51c32010-02-18 01:47:50 +00004039 // Import all of the members of this category.
Balazs Keri3b30d652018-10-19 13:32:20 +00004040 if (Error Err = ImportDeclContext(D))
4041 return std::move(Err);
Fangrui Song6907ce22018-07-30 19:24:48 +00004042
Douglas Gregor84c51c32010-02-18 01:47:50 +00004043 // If we have an implementation, import it as well.
4044 if (D->getImplementation()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004045 if (Expected<ObjCCategoryImplDecl *> ToImplOrErr =
4046 import(D->getImplementation()))
4047 ToCategory->setImplementation(*ToImplOrErr);
4048 else
4049 return ToImplOrErr.takeError();
Douglas Gregor84c51c32010-02-18 01:47:50 +00004050 }
Fangrui Song6907ce22018-07-30 19:24:48 +00004051
Douglas Gregor84c51c32010-02-18 01:47:50 +00004052 return ToCategory;
4053}
4054
Balazs Keri3b30d652018-10-19 13:32:20 +00004055Error ASTNodeImporter::ImportDefinition(
4056 ObjCProtocolDecl *From, ObjCProtocolDecl *To, ImportDefinitionKind Kind) {
Douglas Gregor2aa53772012-01-24 17:42:07 +00004057 if (To->getDefinition()) {
Douglas Gregor2e15c842012-02-01 21:00:38 +00004058 if (shouldForceImportDeclContext(Kind))
Balazs Keri3b30d652018-10-19 13:32:20 +00004059 if (Error Err = ImportDeclContext(From))
4060 return Err;
4061 return Error::success();
Douglas Gregor2aa53772012-01-24 17:42:07 +00004062 }
4063
4064 // Start the protocol definition
4065 To->startDefinition();
Fangrui Song6907ce22018-07-30 19:24:48 +00004066
Douglas Gregor2aa53772012-01-24 17:42:07 +00004067 // Import protocols
4068 SmallVector<ObjCProtocolDecl *, 4> Protocols;
4069 SmallVector<SourceLocation, 4> ProtocolLocs;
Balazs Keri3b30d652018-10-19 13:32:20 +00004070 ObjCProtocolDecl::protocol_loc_iterator FromProtoLoc =
4071 From->protocol_loc_begin();
Douglas Gregor2aa53772012-01-24 17:42:07 +00004072 for (ObjCProtocolDecl::protocol_iterator FromProto = From->protocol_begin(),
4073 FromProtoEnd = From->protocol_end();
4074 FromProto != FromProtoEnd;
4075 ++FromProto, ++FromProtoLoc) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004076 if (Expected<ObjCProtocolDecl *> ToProtoOrErr = import(*FromProto))
4077 Protocols.push_back(*ToProtoOrErr);
4078 else
4079 return ToProtoOrErr.takeError();
4080
4081 if (ExpectedSLoc ToProtoLocOrErr = import(*FromProtoLoc))
4082 ProtocolLocs.push_back(*ToProtoLocOrErr);
4083 else
4084 return ToProtoLocOrErr.takeError();
4085
Douglas Gregor2aa53772012-01-24 17:42:07 +00004086 }
Fangrui Song6907ce22018-07-30 19:24:48 +00004087
Douglas Gregor2aa53772012-01-24 17:42:07 +00004088 // FIXME: If we're merging, make sure that the protocol list is the same.
4089 To->setProtocolList(Protocols.data(), Protocols.size(),
4090 ProtocolLocs.data(), Importer.getToContext());
4091
Douglas Gregor2e15c842012-02-01 21:00:38 +00004092 if (shouldForceImportDeclContext(Kind)) {
4093 // Import all of the members of this protocol.
Balazs Keri3b30d652018-10-19 13:32:20 +00004094 if (Error Err = ImportDeclContext(From, /*ForceImport=*/true))
4095 return Err;
Douglas Gregor2e15c842012-02-01 21:00:38 +00004096 }
Balazs Keri3b30d652018-10-19 13:32:20 +00004097 return Error::success();
Douglas Gregor2aa53772012-01-24 17:42:07 +00004098}
4099
Balazs Keri3b30d652018-10-19 13:32:20 +00004100ExpectedDecl ASTNodeImporter::VisitObjCProtocolDecl(ObjCProtocolDecl *D) {
Fangrui Song6907ce22018-07-30 19:24:48 +00004101 // If this protocol has a definition in the translation unit we're coming
Douglas Gregor2aa53772012-01-24 17:42:07 +00004102 // from, but this particular declaration is not that definition, import the
4103 // definition and map to that.
4104 ObjCProtocolDecl *Definition = D->getDefinition();
4105 if (Definition && Definition != D) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004106 if (ExpectedDecl ImportedDefOrErr = import(Definition))
4107 return Importer.MapImported(D, *ImportedDefOrErr);
4108 else
4109 return ImportedDefOrErr.takeError();
Douglas Gregor2aa53772012-01-24 17:42:07 +00004110 }
4111
Douglas Gregor84c51c32010-02-18 01:47:50 +00004112 // Import the major distinguishing characteristics of a protocol.
Douglas Gregor98d156a2010-02-17 16:12:00 +00004113 DeclContext *DC, *LexicalDC;
4114 DeclarationName Name;
4115 SourceLocation Loc;
Sean Callanan59721b32015-04-28 18:41:46 +00004116 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00004117 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
4118 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00004119 if (ToD)
4120 return ToD;
Douglas Gregor98d156a2010-02-17 16:12:00 +00004121
Craig Topper36250ad2014-05-12 05:36:57 +00004122 ObjCProtocolDecl *MergeWithProtocol = nullptr;
Gabor Marton54058b52018-12-17 13:53:12 +00004123 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00004124 for (auto *FoundDecl : FoundDecls) {
4125 if (!FoundDecl->isInIdentifierNamespace(Decl::IDNS_ObjCProtocol))
Douglas Gregor98d156a2010-02-17 16:12:00 +00004126 continue;
Fangrui Song6907ce22018-07-30 19:24:48 +00004127
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00004128 if ((MergeWithProtocol = dyn_cast<ObjCProtocolDecl>(FoundDecl)))
Douglas Gregor98d156a2010-02-17 16:12:00 +00004129 break;
4130 }
Fangrui Song6907ce22018-07-30 19:24:48 +00004131
Douglas Gregor98d156a2010-02-17 16:12:00 +00004132 ObjCProtocolDecl *ToProto = MergeWithProtocol;
Douglas Gregor2aa53772012-01-24 17:42:07 +00004133 if (!ToProto) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004134 auto ToAtBeginLocOrErr = import(D->getAtStartLoc());
4135 if (!ToAtBeginLocOrErr)
4136 return ToAtBeginLocOrErr.takeError();
4137
Gabor Marton26f72a92018-07-12 09:42:05 +00004138 if (GetImportedOrCreateDecl(ToProto, D, Importer.getToContext(), DC,
4139 Name.getAsIdentifierInfo(), Loc,
Balazs Keri3b30d652018-10-19 13:32:20 +00004140 *ToAtBeginLocOrErr,
Gabor Marton26f72a92018-07-12 09:42:05 +00004141 /*PrevDecl=*/nullptr))
4142 return ToProto;
Douglas Gregor2aa53772012-01-24 17:42:07 +00004143 ToProto->setLexicalDeclContext(LexicalDC);
4144 LexicalDC->addDeclInternal(ToProto);
Douglas Gregor98d156a2010-02-17 16:12:00 +00004145 }
Gabor Marton26f72a92018-07-12 09:42:05 +00004146
4147 Importer.MapImported(D, ToProto);
Douglas Gregor98d156a2010-02-17 16:12:00 +00004148
Balazs Keri3b30d652018-10-19 13:32:20 +00004149 if (D->isThisDeclarationADefinition())
4150 if (Error Err = ImportDefinition(D, ToProto))
4151 return std::move(Err);
Craig Topper36250ad2014-05-12 05:36:57 +00004152
Douglas Gregor98d156a2010-02-17 16:12:00 +00004153 return ToProto;
4154}
4155
Balazs Keri3b30d652018-10-19 13:32:20 +00004156ExpectedDecl ASTNodeImporter::VisitLinkageSpecDecl(LinkageSpecDecl *D) {
4157 DeclContext *DC, *LexicalDC;
4158 if (Error Err = ImportDeclContext(D, DC, LexicalDC))
4159 return std::move(Err);
Sean Callanan0aae0412014-12-10 00:00:37 +00004160
Balazs Keri3b30d652018-10-19 13:32:20 +00004161 ExpectedSLoc ExternLocOrErr = import(D->getExternLoc());
4162 if (!ExternLocOrErr)
4163 return ExternLocOrErr.takeError();
4164
4165 ExpectedSLoc LangLocOrErr = import(D->getLocation());
4166 if (!LangLocOrErr)
4167 return LangLocOrErr.takeError();
Sean Callanan0aae0412014-12-10 00:00:37 +00004168
4169 bool HasBraces = D->hasBraces();
Gabor Marton26f72a92018-07-12 09:42:05 +00004170
4171 LinkageSpecDecl *ToLinkageSpec;
4172 if (GetImportedOrCreateDecl(ToLinkageSpec, D, Importer.getToContext(), DC,
Balazs Keri3b30d652018-10-19 13:32:20 +00004173 *ExternLocOrErr, *LangLocOrErr,
4174 D->getLanguage(), HasBraces))
Gabor Marton26f72a92018-07-12 09:42:05 +00004175 return ToLinkageSpec;
Sean Callanan0aae0412014-12-10 00:00:37 +00004176
4177 if (HasBraces) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004178 ExpectedSLoc RBraceLocOrErr = import(D->getRBraceLoc());
4179 if (!RBraceLocOrErr)
4180 return RBraceLocOrErr.takeError();
4181 ToLinkageSpec->setRBraceLoc(*RBraceLocOrErr);
Sean Callanan0aae0412014-12-10 00:00:37 +00004182 }
4183
4184 ToLinkageSpec->setLexicalDeclContext(LexicalDC);
4185 LexicalDC->addDeclInternal(ToLinkageSpec);
4186
Sean Callanan0aae0412014-12-10 00:00:37 +00004187 return ToLinkageSpec;
4188}
4189
Balazs Keri3b30d652018-10-19 13:32:20 +00004190ExpectedDecl ASTNodeImporter::VisitUsingDecl(UsingDecl *D) {
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004191 DeclContext *DC, *LexicalDC;
4192 DeclarationName Name;
4193 SourceLocation Loc;
4194 NamedDecl *ToD = nullptr;
Balazs Keri3b30d652018-10-19 13:32:20 +00004195 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
4196 return std::move(Err);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004197 if (ToD)
4198 return ToD;
4199
Balazs Keri3b30d652018-10-19 13:32:20 +00004200 SourceLocation ToLoc, ToUsingLoc;
4201 NestedNameSpecifierLoc ToQualifierLoc;
4202 if (auto Imp = importSeq(
4203 D->getNameInfo().getLoc(), D->getUsingLoc(), D->getQualifierLoc()))
4204 std::tie(ToLoc, ToUsingLoc, ToQualifierLoc) = *Imp;
4205 else
4206 return Imp.takeError();
4207
4208 DeclarationNameInfo NameInfo(Name, ToLoc);
4209 if (Error Err = ImportDeclarationNameLoc(D->getNameInfo(), NameInfo))
4210 return std::move(Err);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004211
Gabor Marton26f72a92018-07-12 09:42:05 +00004212 UsingDecl *ToUsing;
4213 if (GetImportedOrCreateDecl(ToUsing, D, Importer.getToContext(), DC,
Balazs Keri3b30d652018-10-19 13:32:20 +00004214 ToUsingLoc, ToQualifierLoc, NameInfo,
Gabor Marton26f72a92018-07-12 09:42:05 +00004215 D->hasTypename()))
4216 return ToUsing;
4217
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004218 ToUsing->setLexicalDeclContext(LexicalDC);
4219 LexicalDC->addDeclInternal(ToUsing);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004220
4221 if (NamedDecl *FromPattern =
4222 Importer.getFromContext().getInstantiatedFromUsingDecl(D)) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004223 if (Expected<NamedDecl *> ToPatternOrErr = import(FromPattern))
4224 Importer.getToContext().setInstantiatedFromUsingDecl(
4225 ToUsing, *ToPatternOrErr);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004226 else
Balazs Keri3b30d652018-10-19 13:32:20 +00004227 return ToPatternOrErr.takeError();
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004228 }
4229
Balazs Keri3b30d652018-10-19 13:32:20 +00004230 for (UsingShadowDecl *FromShadow : D->shadows()) {
4231 if (Expected<UsingShadowDecl *> ToShadowOrErr = import(FromShadow))
4232 ToUsing->addShadowDecl(*ToShadowOrErr);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004233 else
Balazs Keri3b30d652018-10-19 13:32:20 +00004234 // FIXME: We return error here but the definition is already created
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004235 // and available with lookups. How to fix this?..
Balazs Keri3b30d652018-10-19 13:32:20 +00004236 return ToShadowOrErr.takeError();
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004237 }
4238 return ToUsing;
4239}
4240
Balazs Keri3b30d652018-10-19 13:32:20 +00004241ExpectedDecl ASTNodeImporter::VisitUsingShadowDecl(UsingShadowDecl *D) {
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004242 DeclContext *DC, *LexicalDC;
4243 DeclarationName Name;
4244 SourceLocation Loc;
4245 NamedDecl *ToD = nullptr;
Balazs Keri3b30d652018-10-19 13:32:20 +00004246 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
4247 return std::move(Err);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004248 if (ToD)
4249 return ToD;
4250
Balazs Keri3b30d652018-10-19 13:32:20 +00004251 Expected<UsingDecl *> ToUsingOrErr = import(D->getUsingDecl());
4252 if (!ToUsingOrErr)
4253 return ToUsingOrErr.takeError();
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004254
Balazs Keri3b30d652018-10-19 13:32:20 +00004255 Expected<NamedDecl *> ToTargetOrErr = import(D->getTargetDecl());
4256 if (!ToTargetOrErr)
4257 return ToTargetOrErr.takeError();
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004258
Gabor Marton26f72a92018-07-12 09:42:05 +00004259 UsingShadowDecl *ToShadow;
4260 if (GetImportedOrCreateDecl(ToShadow, D, Importer.getToContext(), DC, Loc,
Balazs Keri3b30d652018-10-19 13:32:20 +00004261 *ToUsingOrErr, *ToTargetOrErr))
Gabor Marton26f72a92018-07-12 09:42:05 +00004262 return ToShadow;
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004263
4264 ToShadow->setLexicalDeclContext(LexicalDC);
4265 ToShadow->setAccess(D->getAccess());
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004266
4267 if (UsingShadowDecl *FromPattern =
4268 Importer.getFromContext().getInstantiatedFromUsingShadowDecl(D)) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004269 if (Expected<UsingShadowDecl *> ToPatternOrErr = import(FromPattern))
4270 Importer.getToContext().setInstantiatedFromUsingShadowDecl(
4271 ToShadow, *ToPatternOrErr);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004272 else
Balazs Keri3b30d652018-10-19 13:32:20 +00004273 // FIXME: We return error here but the definition is already created
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004274 // and available with lookups. How to fix this?..
Balazs Keri3b30d652018-10-19 13:32:20 +00004275 return ToPatternOrErr.takeError();
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004276 }
4277
4278 LexicalDC->addDeclInternal(ToShadow);
4279
4280 return ToShadow;
4281}
4282
Balazs Keri3b30d652018-10-19 13:32:20 +00004283ExpectedDecl ASTNodeImporter::VisitUsingDirectiveDecl(UsingDirectiveDecl *D) {
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004284 DeclContext *DC, *LexicalDC;
4285 DeclarationName Name;
4286 SourceLocation Loc;
4287 NamedDecl *ToD = nullptr;
Balazs Keri3b30d652018-10-19 13:32:20 +00004288 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
4289 return std::move(Err);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004290 if (ToD)
4291 return ToD;
4292
Balazs Keri3b30d652018-10-19 13:32:20 +00004293 auto ToComAncestorOrErr = Importer.ImportContext(D->getCommonAncestor());
4294 if (!ToComAncestorOrErr)
4295 return ToComAncestorOrErr.takeError();
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004296
Balazs Keri3b30d652018-10-19 13:32:20 +00004297 NamespaceDecl *ToNominatedNamespace;
4298 SourceLocation ToUsingLoc, ToNamespaceKeyLocation, ToIdentLocation;
4299 NestedNameSpecifierLoc ToQualifierLoc;
4300 if (auto Imp = importSeq(
4301 D->getNominatedNamespace(), D->getUsingLoc(),
4302 D->getNamespaceKeyLocation(), D->getQualifierLoc(),
4303 D->getIdentLocation()))
4304 std::tie(
4305 ToNominatedNamespace, ToUsingLoc, ToNamespaceKeyLocation,
4306 ToQualifierLoc, ToIdentLocation) = *Imp;
4307 else
4308 return Imp.takeError();
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004309
Gabor Marton26f72a92018-07-12 09:42:05 +00004310 UsingDirectiveDecl *ToUsingDir;
4311 if (GetImportedOrCreateDecl(ToUsingDir, D, Importer.getToContext(), DC,
Balazs Keri3b30d652018-10-19 13:32:20 +00004312 ToUsingLoc,
4313 ToNamespaceKeyLocation,
4314 ToQualifierLoc,
4315 ToIdentLocation,
4316 ToNominatedNamespace, *ToComAncestorOrErr))
Gabor Marton26f72a92018-07-12 09:42:05 +00004317 return ToUsingDir;
4318
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004319 ToUsingDir->setLexicalDeclContext(LexicalDC);
4320 LexicalDC->addDeclInternal(ToUsingDir);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004321
4322 return ToUsingDir;
4323}
4324
Balazs Keri3b30d652018-10-19 13:32:20 +00004325ExpectedDecl ASTNodeImporter::VisitUnresolvedUsingValueDecl(
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004326 UnresolvedUsingValueDecl *D) {
4327 DeclContext *DC, *LexicalDC;
4328 DeclarationName Name;
4329 SourceLocation Loc;
4330 NamedDecl *ToD = nullptr;
Balazs Keri3b30d652018-10-19 13:32:20 +00004331 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
4332 return std::move(Err);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004333 if (ToD)
4334 return ToD;
4335
Balazs Keri3b30d652018-10-19 13:32:20 +00004336 SourceLocation ToLoc, ToUsingLoc, ToEllipsisLoc;
4337 NestedNameSpecifierLoc ToQualifierLoc;
4338 if (auto Imp = importSeq(
4339 D->getNameInfo().getLoc(), D->getUsingLoc(), D->getQualifierLoc(),
4340 D->getEllipsisLoc()))
4341 std::tie(ToLoc, ToUsingLoc, ToQualifierLoc, ToEllipsisLoc) = *Imp;
4342 else
4343 return Imp.takeError();
4344
4345 DeclarationNameInfo NameInfo(Name, ToLoc);
4346 if (Error Err = ImportDeclarationNameLoc(D->getNameInfo(), NameInfo))
4347 return std::move(Err);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004348
Gabor Marton26f72a92018-07-12 09:42:05 +00004349 UnresolvedUsingValueDecl *ToUsingValue;
4350 if (GetImportedOrCreateDecl(ToUsingValue, D, Importer.getToContext(), DC,
Balazs Keri3b30d652018-10-19 13:32:20 +00004351 ToUsingLoc, ToQualifierLoc, NameInfo,
4352 ToEllipsisLoc))
Gabor Marton26f72a92018-07-12 09:42:05 +00004353 return ToUsingValue;
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004354
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004355 ToUsingValue->setAccess(D->getAccess());
4356 ToUsingValue->setLexicalDeclContext(LexicalDC);
4357 LexicalDC->addDeclInternal(ToUsingValue);
4358
4359 return ToUsingValue;
4360}
4361
Balazs Keri3b30d652018-10-19 13:32:20 +00004362ExpectedDecl ASTNodeImporter::VisitUnresolvedUsingTypenameDecl(
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004363 UnresolvedUsingTypenameDecl *D) {
4364 DeclContext *DC, *LexicalDC;
4365 DeclarationName Name;
4366 SourceLocation Loc;
4367 NamedDecl *ToD = nullptr;
Balazs Keri3b30d652018-10-19 13:32:20 +00004368 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
4369 return std::move(Err);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004370 if (ToD)
4371 return ToD;
4372
Balazs Keri3b30d652018-10-19 13:32:20 +00004373 SourceLocation ToUsingLoc, ToTypenameLoc, ToEllipsisLoc;
4374 NestedNameSpecifierLoc ToQualifierLoc;
4375 if (auto Imp = importSeq(
4376 D->getUsingLoc(), D->getTypenameLoc(), D->getQualifierLoc(),
4377 D->getEllipsisLoc()))
4378 std::tie(ToUsingLoc, ToTypenameLoc, ToQualifierLoc, ToEllipsisLoc) = *Imp;
4379 else
4380 return Imp.takeError();
4381
Gabor Marton26f72a92018-07-12 09:42:05 +00004382 UnresolvedUsingTypenameDecl *ToUsing;
4383 if (GetImportedOrCreateDecl(ToUsing, D, Importer.getToContext(), DC,
Balazs Keri3b30d652018-10-19 13:32:20 +00004384 ToUsingLoc, ToTypenameLoc,
4385 ToQualifierLoc, Loc, Name, ToEllipsisLoc))
Gabor Marton26f72a92018-07-12 09:42:05 +00004386 return ToUsing;
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004387
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004388 ToUsing->setAccess(D->getAccess());
4389 ToUsing->setLexicalDeclContext(LexicalDC);
4390 LexicalDC->addDeclInternal(ToUsing);
4391
4392 return ToUsing;
4393}
4394
Balazs Keri3b30d652018-10-19 13:32:20 +00004395
4396Error ASTNodeImporter::ImportDefinition(
4397 ObjCInterfaceDecl *From, ObjCInterfaceDecl *To, ImportDefinitionKind Kind) {
Douglas Gregor2aa53772012-01-24 17:42:07 +00004398 if (To->getDefinition()) {
4399 // Check consistency of superclass.
4400 ObjCInterfaceDecl *FromSuper = From->getSuperClass();
4401 if (FromSuper) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004402 if (auto FromSuperOrErr = import(FromSuper))
4403 FromSuper = *FromSuperOrErr;
4404 else
4405 return FromSuperOrErr.takeError();
Douglas Gregor2aa53772012-01-24 17:42:07 +00004406 }
Fangrui Song6907ce22018-07-30 19:24:48 +00004407
4408 ObjCInterfaceDecl *ToSuper = To->getSuperClass();
Douglas Gregor2aa53772012-01-24 17:42:07 +00004409 if ((bool)FromSuper != (bool)ToSuper ||
4410 (FromSuper && !declaresSameEntity(FromSuper, ToSuper))) {
Fangrui Song6907ce22018-07-30 19:24:48 +00004411 Importer.ToDiag(To->getLocation(),
Douglas Gregor2aa53772012-01-24 17:42:07 +00004412 diag::err_odr_objc_superclass_inconsistent)
4413 << To->getDeclName();
4414 if (ToSuper)
4415 Importer.ToDiag(To->getSuperClassLoc(), diag::note_odr_objc_superclass)
4416 << To->getSuperClass()->getDeclName();
4417 else
Fangrui Song6907ce22018-07-30 19:24:48 +00004418 Importer.ToDiag(To->getLocation(),
Douglas Gregor2aa53772012-01-24 17:42:07 +00004419 diag::note_odr_objc_missing_superclass);
4420 if (From->getSuperClass())
Fangrui Song6907ce22018-07-30 19:24:48 +00004421 Importer.FromDiag(From->getSuperClassLoc(),
Douglas Gregor2aa53772012-01-24 17:42:07 +00004422 diag::note_odr_objc_superclass)
4423 << From->getSuperClass()->getDeclName();
4424 else
Fangrui Song6907ce22018-07-30 19:24:48 +00004425 Importer.FromDiag(From->getLocation(),
4426 diag::note_odr_objc_missing_superclass);
Douglas Gregor2aa53772012-01-24 17:42:07 +00004427 }
Fangrui Song6907ce22018-07-30 19:24:48 +00004428
Douglas Gregor2e15c842012-02-01 21:00:38 +00004429 if (shouldForceImportDeclContext(Kind))
Balazs Keri3b30d652018-10-19 13:32:20 +00004430 if (Error Err = ImportDeclContext(From))
4431 return Err;
4432 return Error::success();
Douglas Gregor2aa53772012-01-24 17:42:07 +00004433 }
Fangrui Song6907ce22018-07-30 19:24:48 +00004434
Douglas Gregor2aa53772012-01-24 17:42:07 +00004435 // Start the definition.
4436 To->startDefinition();
Fangrui Song6907ce22018-07-30 19:24:48 +00004437
Douglas Gregor2aa53772012-01-24 17:42:07 +00004438 // If this class has a superclass, import it.
4439 if (From->getSuperClass()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004440 if (auto SuperTInfoOrErr = import(From->getSuperClassTInfo()))
4441 To->setSuperClass(*SuperTInfoOrErr);
4442 else
4443 return SuperTInfoOrErr.takeError();
Douglas Gregor2aa53772012-01-24 17:42:07 +00004444 }
Fangrui Song6907ce22018-07-30 19:24:48 +00004445
Douglas Gregor2aa53772012-01-24 17:42:07 +00004446 // Import protocols
4447 SmallVector<ObjCProtocolDecl *, 4> Protocols;
4448 SmallVector<SourceLocation, 4> ProtocolLocs;
Balazs Keri3b30d652018-10-19 13:32:20 +00004449 ObjCInterfaceDecl::protocol_loc_iterator FromProtoLoc =
4450 From->protocol_loc_begin();
Fangrui Song6907ce22018-07-30 19:24:48 +00004451
Douglas Gregor2aa53772012-01-24 17:42:07 +00004452 for (ObjCInterfaceDecl::protocol_iterator FromProto = From->protocol_begin(),
4453 FromProtoEnd = From->protocol_end();
4454 FromProto != FromProtoEnd;
4455 ++FromProto, ++FromProtoLoc) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004456 if (Expected<ObjCProtocolDecl *> ToProtoOrErr = import(*FromProto))
4457 Protocols.push_back(*ToProtoOrErr);
4458 else
4459 return ToProtoOrErr.takeError();
4460
4461 if (ExpectedSLoc ToProtoLocOrErr = import(*FromProtoLoc))
4462 ProtocolLocs.push_back(*ToProtoLocOrErr);
4463 else
4464 return ToProtoLocOrErr.takeError();
4465
Douglas Gregor2aa53772012-01-24 17:42:07 +00004466 }
Fangrui Song6907ce22018-07-30 19:24:48 +00004467
Douglas Gregor2aa53772012-01-24 17:42:07 +00004468 // FIXME: If we're merging, make sure that the protocol list is the same.
4469 To->setProtocolList(Protocols.data(), Protocols.size(),
4470 ProtocolLocs.data(), Importer.getToContext());
Fangrui Song6907ce22018-07-30 19:24:48 +00004471
Douglas Gregor2aa53772012-01-24 17:42:07 +00004472 // Import categories. When the categories themselves are imported, they'll
4473 // hook themselves into this interface.
Balazs Keri3b30d652018-10-19 13:32:20 +00004474 for (auto *Cat : From->known_categories()) {
4475 auto ToCatOrErr = import(Cat);
4476 if (!ToCatOrErr)
4477 return ToCatOrErr.takeError();
4478 }
Fangrui Song6907ce22018-07-30 19:24:48 +00004479
Douglas Gregor2aa53772012-01-24 17:42:07 +00004480 // If we have an @implementation, import it as well.
4481 if (From->getImplementation()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004482 if (Expected<ObjCImplementationDecl *> ToImplOrErr =
4483 import(From->getImplementation()))
4484 To->setImplementation(*ToImplOrErr);
4485 else
4486 return ToImplOrErr.takeError();
Douglas Gregor2aa53772012-01-24 17:42:07 +00004487 }
4488
Douglas Gregor2e15c842012-02-01 21:00:38 +00004489 if (shouldForceImportDeclContext(Kind)) {
4490 // Import all of the members of this class.
Balazs Keri3b30d652018-10-19 13:32:20 +00004491 if (Error Err = ImportDeclContext(From, /*ForceImport=*/true))
4492 return Err;
Douglas Gregor2e15c842012-02-01 21:00:38 +00004493 }
Balazs Keri3b30d652018-10-19 13:32:20 +00004494 return Error::success();
Douglas Gregor2aa53772012-01-24 17:42:07 +00004495}
4496
Balazs Keri3b30d652018-10-19 13:32:20 +00004497Expected<ObjCTypeParamList *>
Douglas Gregor85f3f952015-07-07 03:57:15 +00004498ASTNodeImporter::ImportObjCTypeParamList(ObjCTypeParamList *list) {
4499 if (!list)
4500 return nullptr;
4501
4502 SmallVector<ObjCTypeParamDecl *, 4> toTypeParams;
Balazs Keri3b30d652018-10-19 13:32:20 +00004503 for (auto *fromTypeParam : *list) {
4504 if (auto toTypeParamOrErr = import(fromTypeParam))
4505 toTypeParams.push_back(*toTypeParamOrErr);
4506 else
4507 return toTypeParamOrErr.takeError();
Douglas Gregor85f3f952015-07-07 03:57:15 +00004508 }
4509
Balazs Keri3b30d652018-10-19 13:32:20 +00004510 auto LAngleLocOrErr = import(list->getLAngleLoc());
4511 if (!LAngleLocOrErr)
4512 return LAngleLocOrErr.takeError();
4513
4514 auto RAngleLocOrErr = import(list->getRAngleLoc());
4515 if (!RAngleLocOrErr)
4516 return RAngleLocOrErr.takeError();
4517
Douglas Gregor85f3f952015-07-07 03:57:15 +00004518 return ObjCTypeParamList::create(Importer.getToContext(),
Balazs Keri3b30d652018-10-19 13:32:20 +00004519 *LAngleLocOrErr,
Douglas Gregor85f3f952015-07-07 03:57:15 +00004520 toTypeParams,
Balazs Keri3b30d652018-10-19 13:32:20 +00004521 *RAngleLocOrErr);
Douglas Gregor85f3f952015-07-07 03:57:15 +00004522}
4523
Balazs Keri3b30d652018-10-19 13:32:20 +00004524ExpectedDecl ASTNodeImporter::VisitObjCInterfaceDecl(ObjCInterfaceDecl *D) {
Douglas Gregor2aa53772012-01-24 17:42:07 +00004525 // If this class has a definition in the translation unit we're coming from,
4526 // but this particular declaration is not that definition, import the
4527 // definition and map to that.
4528 ObjCInterfaceDecl *Definition = D->getDefinition();
4529 if (Definition && Definition != D) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004530 if (ExpectedDecl ImportedDefOrErr = import(Definition))
4531 return Importer.MapImported(D, *ImportedDefOrErr);
4532 else
4533 return ImportedDefOrErr.takeError();
Douglas Gregor2aa53772012-01-24 17:42:07 +00004534 }
4535
Douglas Gregor45635322010-02-16 01:20:57 +00004536 // Import the major distinguishing characteristics of an @interface.
4537 DeclContext *DC, *LexicalDC;
4538 DeclarationName Name;
4539 SourceLocation Loc;
Sean Callanan59721b32015-04-28 18:41:46 +00004540 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00004541 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
4542 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00004543 if (ToD)
4544 return ToD;
Douglas Gregor45635322010-02-16 01:20:57 +00004545
Douglas Gregor2aa53772012-01-24 17:42:07 +00004546 // Look for an existing interface with the same name.
Craig Topper36250ad2014-05-12 05:36:57 +00004547 ObjCInterfaceDecl *MergeWithIface = nullptr;
Gabor Marton54058b52018-12-17 13:53:12 +00004548 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00004549 for (auto *FoundDecl : FoundDecls) {
4550 if (!FoundDecl->isInIdentifierNamespace(Decl::IDNS_Ordinary))
Douglas Gregor45635322010-02-16 01:20:57 +00004551 continue;
Fangrui Song6907ce22018-07-30 19:24:48 +00004552
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00004553 if ((MergeWithIface = dyn_cast<ObjCInterfaceDecl>(FoundDecl)))
Douglas Gregor45635322010-02-16 01:20:57 +00004554 break;
4555 }
Fangrui Song6907ce22018-07-30 19:24:48 +00004556
Douglas Gregor2aa53772012-01-24 17:42:07 +00004557 // Create an interface declaration, if one does not already exist.
Douglas Gregor45635322010-02-16 01:20:57 +00004558 ObjCInterfaceDecl *ToIface = MergeWithIface;
Douglas Gregor2aa53772012-01-24 17:42:07 +00004559 if (!ToIface) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004560 ExpectedSLoc AtBeginLocOrErr = import(D->getAtStartLoc());
4561 if (!AtBeginLocOrErr)
4562 return AtBeginLocOrErr.takeError();
4563
Gabor Marton26f72a92018-07-12 09:42:05 +00004564 if (GetImportedOrCreateDecl(
4565 ToIface, D, Importer.getToContext(), DC,
Balazs Keri3b30d652018-10-19 13:32:20 +00004566 *AtBeginLocOrErr, Name.getAsIdentifierInfo(),
Gabor Marton26f72a92018-07-12 09:42:05 +00004567 /*TypeParamList=*/nullptr,
4568 /*PrevDecl=*/nullptr, Loc, D->isImplicitInterfaceDecl()))
4569 return ToIface;
Douglas Gregor2aa53772012-01-24 17:42:07 +00004570 ToIface->setLexicalDeclContext(LexicalDC);
4571 LexicalDC->addDeclInternal(ToIface);
Douglas Gregor45635322010-02-16 01:20:57 +00004572 }
Gabor Marton26f72a92018-07-12 09:42:05 +00004573 Importer.MapImported(D, ToIface);
Balazs Keri3b30d652018-10-19 13:32:20 +00004574 // Import the type parameter list after MapImported, to avoid
Douglas Gregorab7f0b32015-07-07 06:20:12 +00004575 // loops when bringing in their DeclContext.
Balazs Keri3b30d652018-10-19 13:32:20 +00004576 if (auto ToPListOrErr =
4577 ImportObjCTypeParamList(D->getTypeParamListAsWritten()))
4578 ToIface->setTypeParamList(*ToPListOrErr);
4579 else
4580 return ToPListOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00004581
Balazs Keri3b30d652018-10-19 13:32:20 +00004582 if (D->isThisDeclarationADefinition())
4583 if (Error Err = ImportDefinition(D, ToIface))
4584 return std::move(Err);
Craig Topper36250ad2014-05-12 05:36:57 +00004585
Douglas Gregor98d156a2010-02-17 16:12:00 +00004586 return ToIface;
Douglas Gregor45635322010-02-16 01:20:57 +00004587}
4588
Balazs Keri3b30d652018-10-19 13:32:20 +00004589ExpectedDecl
4590ASTNodeImporter::VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D) {
4591 ObjCCategoryDecl *Category;
4592 if (Error Err = importInto(Category, D->getCategoryDecl()))
4593 return std::move(Err);
Craig Topper36250ad2014-05-12 05:36:57 +00004594
Douglas Gregor4da9d682010-12-07 15:32:12 +00004595 ObjCCategoryImplDecl *ToImpl = Category->getImplementation();
4596 if (!ToImpl) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004597 DeclContext *DC, *LexicalDC;
4598 if (Error Err = ImportDeclContext(D, DC, LexicalDC))
4599 return std::move(Err);
Craig Topper36250ad2014-05-12 05:36:57 +00004600
Balazs Keri3b30d652018-10-19 13:32:20 +00004601 SourceLocation ToLocation, ToAtStartLoc, ToCategoryNameLoc;
4602 if (auto Imp = importSeq(
4603 D->getLocation(), D->getAtStartLoc(), D->getCategoryNameLoc()))
4604 std::tie(ToLocation, ToAtStartLoc, ToCategoryNameLoc) = *Imp;
4605 else
4606 return Imp.takeError();
4607
Gabor Marton26f72a92018-07-12 09:42:05 +00004608 if (GetImportedOrCreateDecl(
4609 ToImpl, D, Importer.getToContext(), DC,
4610 Importer.Import(D->getIdentifier()), Category->getClassInterface(),
Balazs Keri3b30d652018-10-19 13:32:20 +00004611 ToLocation, ToAtStartLoc, ToCategoryNameLoc))
Gabor Marton26f72a92018-07-12 09:42:05 +00004612 return ToImpl;
4613
Balazs Keri3b30d652018-10-19 13:32:20 +00004614 ToImpl->setLexicalDeclContext(LexicalDC);
Sean Callanan95e74be2011-10-21 02:57:43 +00004615 LexicalDC->addDeclInternal(ToImpl);
Douglas Gregor4da9d682010-12-07 15:32:12 +00004616 Category->setImplementation(ToImpl);
4617 }
Fangrui Song6907ce22018-07-30 19:24:48 +00004618
Gabor Marton26f72a92018-07-12 09:42:05 +00004619 Importer.MapImported(D, ToImpl);
Balazs Keri3b30d652018-10-19 13:32:20 +00004620 if (Error Err = ImportDeclContext(D))
4621 return std::move(Err);
4622
Douglas Gregor4da9d682010-12-07 15:32:12 +00004623 return ToImpl;
4624}
4625
Balazs Keri3b30d652018-10-19 13:32:20 +00004626ExpectedDecl
4627ASTNodeImporter::VisitObjCImplementationDecl(ObjCImplementationDecl *D) {
Douglas Gregorda8025c2010-12-07 01:26:03 +00004628 // Find the corresponding interface.
Balazs Keri3b30d652018-10-19 13:32:20 +00004629 ObjCInterfaceDecl *Iface;
4630 if (Error Err = importInto(Iface, D->getClassInterface()))
4631 return std::move(Err);
Douglas Gregorda8025c2010-12-07 01:26:03 +00004632
4633 // Import the superclass, if any.
Balazs Keri3b30d652018-10-19 13:32:20 +00004634 ObjCInterfaceDecl *Super;
4635 if (Error Err = importInto(Super, D->getSuperClass()))
4636 return std::move(Err);
Douglas Gregorda8025c2010-12-07 01:26:03 +00004637
4638 ObjCImplementationDecl *Impl = Iface->getImplementation();
4639 if (!Impl) {
4640 // We haven't imported an implementation yet. Create a new @implementation
4641 // now.
Balazs Keri3b30d652018-10-19 13:32:20 +00004642 DeclContext *DC, *LexicalDC;
4643 if (Error Err = ImportDeclContext(D, DC, LexicalDC))
4644 return std::move(Err);
4645
4646 SourceLocation ToLocation, ToAtStartLoc, ToSuperClassLoc;
4647 SourceLocation ToIvarLBraceLoc, ToIvarRBraceLoc;
4648 if (auto Imp = importSeq(
4649 D->getLocation(), D->getAtStartLoc(), D->getSuperClassLoc(),
4650 D->getIvarLBraceLoc(), D->getIvarRBraceLoc()))
4651 std::tie(
4652 ToLocation, ToAtStartLoc, ToSuperClassLoc,
4653 ToIvarLBraceLoc, ToIvarRBraceLoc) = *Imp;
4654 else
4655 return Imp.takeError();
4656
Gabor Marton26f72a92018-07-12 09:42:05 +00004657 if (GetImportedOrCreateDecl(Impl, D, Importer.getToContext(),
Balazs Keri3b30d652018-10-19 13:32:20 +00004658 DC, Iface, Super,
4659 ToLocation,
4660 ToAtStartLoc,
4661 ToSuperClassLoc,
4662 ToIvarLBraceLoc,
4663 ToIvarRBraceLoc))
Gabor Marton26f72a92018-07-12 09:42:05 +00004664 return Impl;
4665
Balazs Keri3b30d652018-10-19 13:32:20 +00004666 Impl->setLexicalDeclContext(LexicalDC);
Gabor Marton26f72a92018-07-12 09:42:05 +00004667
Douglas Gregorda8025c2010-12-07 01:26:03 +00004668 // Associate the implementation with the class it implements.
4669 Iface->setImplementation(Impl);
Gabor Marton26f72a92018-07-12 09:42:05 +00004670 Importer.MapImported(D, Iface->getImplementation());
Douglas Gregorda8025c2010-12-07 01:26:03 +00004671 } else {
Gabor Marton26f72a92018-07-12 09:42:05 +00004672 Importer.MapImported(D, Iface->getImplementation());
Douglas Gregorda8025c2010-12-07 01:26:03 +00004673
4674 // Verify that the existing @implementation has the same superclass.
4675 if ((Super && !Impl->getSuperClass()) ||
4676 (!Super && Impl->getSuperClass()) ||
Craig Topperdcfc60f2014-05-07 06:57:44 +00004677 (Super && Impl->getSuperClass() &&
4678 !declaresSameEntity(Super->getCanonicalDecl(),
4679 Impl->getSuperClass()))) {
4680 Importer.ToDiag(Impl->getLocation(),
4681 diag::err_odr_objc_superclass_inconsistent)
4682 << Iface->getDeclName();
4683 // FIXME: It would be nice to have the location of the superclass
4684 // below.
4685 if (Impl->getSuperClass())
4686 Importer.ToDiag(Impl->getLocation(),
4687 diag::note_odr_objc_superclass)
4688 << Impl->getSuperClass()->getDeclName();
4689 else
4690 Importer.ToDiag(Impl->getLocation(),
4691 diag::note_odr_objc_missing_superclass);
4692 if (D->getSuperClass())
4693 Importer.FromDiag(D->getLocation(),
Douglas Gregorda8025c2010-12-07 01:26:03 +00004694 diag::note_odr_objc_superclass)
Craig Topperdcfc60f2014-05-07 06:57:44 +00004695 << D->getSuperClass()->getDeclName();
4696 else
4697 Importer.FromDiag(D->getLocation(),
Douglas Gregorda8025c2010-12-07 01:26:03 +00004698 diag::note_odr_objc_missing_superclass);
Balazs Keri3b30d652018-10-19 13:32:20 +00004699
4700 return make_error<ImportError>(ImportError::NameConflict);
Douglas Gregorda8025c2010-12-07 01:26:03 +00004701 }
4702 }
Fangrui Song6907ce22018-07-30 19:24:48 +00004703
Douglas Gregorda8025c2010-12-07 01:26:03 +00004704 // Import all of the members of this @implementation.
Balazs Keri3b30d652018-10-19 13:32:20 +00004705 if (Error Err = ImportDeclContext(D))
4706 return std::move(Err);
Douglas Gregorda8025c2010-12-07 01:26:03 +00004707
4708 return Impl;
4709}
4710
Balazs Keri3b30d652018-10-19 13:32:20 +00004711ExpectedDecl ASTNodeImporter::VisitObjCPropertyDecl(ObjCPropertyDecl *D) {
Douglas Gregora11c4582010-02-17 18:02:10 +00004712 // Import the major distinguishing characteristics of an @property.
4713 DeclContext *DC, *LexicalDC;
4714 DeclarationName Name;
4715 SourceLocation Loc;
Sean Callanan59721b32015-04-28 18:41:46 +00004716 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00004717 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
4718 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00004719 if (ToD)
4720 return ToD;
Douglas Gregora11c4582010-02-17 18:02:10 +00004721
4722 // Check whether we have already imported this property.
Gabor Marton54058b52018-12-17 13:53:12 +00004723 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00004724 for (auto *FoundDecl : FoundDecls) {
4725 if (auto *FoundProp = dyn_cast<ObjCPropertyDecl>(FoundDecl)) {
Douglas Gregora11c4582010-02-17 18:02:10 +00004726 // Check property types.
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00004727 if (!Importer.IsStructurallyEquivalent(D->getType(),
Douglas Gregora11c4582010-02-17 18:02:10 +00004728 FoundProp->getType())) {
4729 Importer.ToDiag(Loc, diag::err_odr_objc_property_type_inconsistent)
4730 << Name << D->getType() << FoundProp->getType();
4731 Importer.ToDiag(FoundProp->getLocation(), diag::note_odr_value_here)
4732 << FoundProp->getType();
Balazs Keri3b30d652018-10-19 13:32:20 +00004733
4734 return make_error<ImportError>(ImportError::NameConflict);
Douglas Gregora11c4582010-02-17 18:02:10 +00004735 }
4736
4737 // FIXME: Check property attributes, getters, setters, etc.?
4738
4739 // Consider these properties to be equivalent.
Gabor Marton26f72a92018-07-12 09:42:05 +00004740 Importer.MapImported(D, FoundProp);
Douglas Gregora11c4582010-02-17 18:02:10 +00004741 return FoundProp;
4742 }
4743 }
4744
Balazs Keri3b30d652018-10-19 13:32:20 +00004745 QualType ToType;
4746 TypeSourceInfo *ToTypeSourceInfo;
4747 SourceLocation ToAtLoc, ToLParenLoc;
4748 if (auto Imp = importSeq(
4749 D->getType(), D->getTypeSourceInfo(), D->getAtLoc(), D->getLParenLoc()))
4750 std::tie(ToType, ToTypeSourceInfo, ToAtLoc, ToLParenLoc) = *Imp;
4751 else
4752 return Imp.takeError();
Douglas Gregora11c4582010-02-17 18:02:10 +00004753
4754 // Create the new property.
Gabor Marton26f72a92018-07-12 09:42:05 +00004755 ObjCPropertyDecl *ToProperty;
4756 if (GetImportedOrCreateDecl(
4757 ToProperty, D, Importer.getToContext(), DC, Loc,
Balazs Keri3b30d652018-10-19 13:32:20 +00004758 Name.getAsIdentifierInfo(), ToAtLoc,
4759 ToLParenLoc, ToType,
4760 ToTypeSourceInfo, D->getPropertyImplementation()))
Gabor Marton26f72a92018-07-12 09:42:05 +00004761 return ToProperty;
4762
Balazs Keri3b30d652018-10-19 13:32:20 +00004763 Selector ToGetterName, ToSetterName;
4764 SourceLocation ToGetterNameLoc, ToSetterNameLoc;
4765 ObjCMethodDecl *ToGetterMethodDecl, *ToSetterMethodDecl;
4766 ObjCIvarDecl *ToPropertyIvarDecl;
4767 if (auto Imp = importSeq(
4768 D->getGetterName(), D->getSetterName(),
4769 D->getGetterNameLoc(), D->getSetterNameLoc(),
4770 D->getGetterMethodDecl(), D->getSetterMethodDecl(),
4771 D->getPropertyIvarDecl()))
4772 std::tie(
4773 ToGetterName, ToSetterName,
4774 ToGetterNameLoc, ToSetterNameLoc,
4775 ToGetterMethodDecl, ToSetterMethodDecl,
4776 ToPropertyIvarDecl) = *Imp;
4777 else
4778 return Imp.takeError();
4779
Douglas Gregora11c4582010-02-17 18:02:10 +00004780 ToProperty->setLexicalDeclContext(LexicalDC);
Sean Callanan95e74be2011-10-21 02:57:43 +00004781 LexicalDC->addDeclInternal(ToProperty);
Douglas Gregora11c4582010-02-17 18:02:10 +00004782
4783 ToProperty->setPropertyAttributes(D->getPropertyAttributes());
Fariborz Jahanian3bf0ded2010-06-22 23:20:40 +00004784 ToProperty->setPropertyAttributesAsWritten(
4785 D->getPropertyAttributesAsWritten());
Balazs Keri3b30d652018-10-19 13:32:20 +00004786 ToProperty->setGetterName(ToGetterName, ToGetterNameLoc);
4787 ToProperty->setSetterName(ToSetterName, ToSetterNameLoc);
4788 ToProperty->setGetterMethodDecl(ToGetterMethodDecl);
4789 ToProperty->setSetterMethodDecl(ToSetterMethodDecl);
4790 ToProperty->setPropertyIvarDecl(ToPropertyIvarDecl);
Douglas Gregora11c4582010-02-17 18:02:10 +00004791 return ToProperty;
4792}
4793
Balazs Keri3b30d652018-10-19 13:32:20 +00004794ExpectedDecl
4795ASTNodeImporter::VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D) {
4796 ObjCPropertyDecl *Property;
4797 if (Error Err = importInto(Property, D->getPropertyDecl()))
4798 return std::move(Err);
Douglas Gregor14a49e22010-12-07 18:32:03 +00004799
Balazs Keri3b30d652018-10-19 13:32:20 +00004800 DeclContext *DC, *LexicalDC;
4801 if (Error Err = ImportDeclContext(D, DC, LexicalDC))
4802 return std::move(Err);
Craig Topper36250ad2014-05-12 05:36:57 +00004803
Balazs Keri3b30d652018-10-19 13:32:20 +00004804 auto *InImpl = cast<ObjCImplDecl>(LexicalDC);
Douglas Gregor14a49e22010-12-07 18:32:03 +00004805
4806 // Import the ivar (for an @synthesize).
Craig Topper36250ad2014-05-12 05:36:57 +00004807 ObjCIvarDecl *Ivar = nullptr;
Balazs Keri3b30d652018-10-19 13:32:20 +00004808 if (Error Err = importInto(Ivar, D->getPropertyIvarDecl()))
4809 return std::move(Err);
Douglas Gregor14a49e22010-12-07 18:32:03 +00004810
4811 ObjCPropertyImplDecl *ToImpl
Manman Ren5b786402016-01-28 18:49:28 +00004812 = InImpl->FindPropertyImplDecl(Property->getIdentifier(),
4813 Property->getQueryKind());
Gabor Marton26f72a92018-07-12 09:42:05 +00004814 if (!ToImpl) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004815 SourceLocation ToBeginLoc, ToLocation, ToPropertyIvarDeclLoc;
4816 if (auto Imp = importSeq(
4817 D->getBeginLoc(), D->getLocation(), D->getPropertyIvarDeclLoc()))
4818 std::tie(ToBeginLoc, ToLocation, ToPropertyIvarDeclLoc) = *Imp;
4819 else
4820 return Imp.takeError();
4821
Gabor Marton26f72a92018-07-12 09:42:05 +00004822 if (GetImportedOrCreateDecl(ToImpl, D, Importer.getToContext(), DC,
Balazs Keri3b30d652018-10-19 13:32:20 +00004823 ToBeginLoc,
4824 ToLocation, Property,
Gabor Marton26f72a92018-07-12 09:42:05 +00004825 D->getPropertyImplementation(), Ivar,
Balazs Keri3b30d652018-10-19 13:32:20 +00004826 ToPropertyIvarDeclLoc))
Gabor Marton26f72a92018-07-12 09:42:05 +00004827 return ToImpl;
4828
Douglas Gregor14a49e22010-12-07 18:32:03 +00004829 ToImpl->setLexicalDeclContext(LexicalDC);
Sean Callanan95e74be2011-10-21 02:57:43 +00004830 LexicalDC->addDeclInternal(ToImpl);
Douglas Gregor14a49e22010-12-07 18:32:03 +00004831 } else {
4832 // Check that we have the same kind of property implementation (@synthesize
4833 // vs. @dynamic).
4834 if (D->getPropertyImplementation() != ToImpl->getPropertyImplementation()) {
Fangrui Song6907ce22018-07-30 19:24:48 +00004835 Importer.ToDiag(ToImpl->getLocation(),
Douglas Gregor14a49e22010-12-07 18:32:03 +00004836 diag::err_odr_objc_property_impl_kind_inconsistent)
Fangrui Song6907ce22018-07-30 19:24:48 +00004837 << Property->getDeclName()
4838 << (ToImpl->getPropertyImplementation()
Douglas Gregor14a49e22010-12-07 18:32:03 +00004839 == ObjCPropertyImplDecl::Dynamic);
4840 Importer.FromDiag(D->getLocation(),
4841 diag::note_odr_objc_property_impl_kind)
4842 << D->getPropertyDecl()->getDeclName()
4843 << (D->getPropertyImplementation() == ObjCPropertyImplDecl::Dynamic);
Balazs Keri3b30d652018-10-19 13:32:20 +00004844
4845 return make_error<ImportError>(ImportError::NameConflict);
Douglas Gregor14a49e22010-12-07 18:32:03 +00004846 }
Fangrui Song6907ce22018-07-30 19:24:48 +00004847
4848 // For @synthesize, check that we have the same
Douglas Gregor14a49e22010-12-07 18:32:03 +00004849 if (D->getPropertyImplementation() == ObjCPropertyImplDecl::Synthesize &&
4850 Ivar != ToImpl->getPropertyIvarDecl()) {
Fangrui Song6907ce22018-07-30 19:24:48 +00004851 Importer.ToDiag(ToImpl->getPropertyIvarDeclLoc(),
Douglas Gregor14a49e22010-12-07 18:32:03 +00004852 diag::err_odr_objc_synthesize_ivar_inconsistent)
4853 << Property->getDeclName()
4854 << ToImpl->getPropertyIvarDecl()->getDeclName()
4855 << Ivar->getDeclName();
Fangrui Song6907ce22018-07-30 19:24:48 +00004856 Importer.FromDiag(D->getPropertyIvarDeclLoc(),
Douglas Gregor14a49e22010-12-07 18:32:03 +00004857 diag::note_odr_objc_synthesize_ivar_here)
4858 << D->getPropertyIvarDecl()->getDeclName();
Balazs Keri3b30d652018-10-19 13:32:20 +00004859
4860 return make_error<ImportError>(ImportError::NameConflict);
Douglas Gregor14a49e22010-12-07 18:32:03 +00004861 }
Fangrui Song6907ce22018-07-30 19:24:48 +00004862
Douglas Gregor14a49e22010-12-07 18:32:03 +00004863 // Merge the existing implementation with the new implementation.
Gabor Marton26f72a92018-07-12 09:42:05 +00004864 Importer.MapImported(D, ToImpl);
Douglas Gregor14a49e22010-12-07 18:32:03 +00004865 }
Fangrui Song6907ce22018-07-30 19:24:48 +00004866
Douglas Gregor14a49e22010-12-07 18:32:03 +00004867 return ToImpl;
4868}
4869
Balazs Keri3b30d652018-10-19 13:32:20 +00004870ExpectedDecl
4871ASTNodeImporter::VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D) {
Douglas Gregora082a492010-11-30 19:14:50 +00004872 // For template arguments, we adopt the translation unit as our declaration
4873 // context. This context will be fixed when the actual template declaration
4874 // is created.
Fangrui Song6907ce22018-07-30 19:24:48 +00004875
Douglas Gregora082a492010-11-30 19:14:50 +00004876 // FIXME: Import default argument.
Balazs Keri3b30d652018-10-19 13:32:20 +00004877
4878 ExpectedSLoc BeginLocOrErr = import(D->getBeginLoc());
4879 if (!BeginLocOrErr)
4880 return BeginLocOrErr.takeError();
4881
4882 ExpectedSLoc LocationOrErr = import(D->getLocation());
4883 if (!LocationOrErr)
4884 return LocationOrErr.takeError();
4885
Gabor Marton26f72a92018-07-12 09:42:05 +00004886 TemplateTypeParmDecl *ToD = nullptr;
4887 (void)GetImportedOrCreateDecl(
4888 ToD, D, Importer.getToContext(),
4889 Importer.getToContext().getTranslationUnitDecl(),
Balazs Keri3b30d652018-10-19 13:32:20 +00004890 *BeginLocOrErr, *LocationOrErr,
Gabor Marton26f72a92018-07-12 09:42:05 +00004891 D->getDepth(), D->getIndex(), Importer.Import(D->getIdentifier()),
4892 D->wasDeclaredWithTypename(), D->isParameterPack());
4893 return ToD;
Douglas Gregora082a492010-11-30 19:14:50 +00004894}
4895
Balazs Keri3b30d652018-10-19 13:32:20 +00004896ExpectedDecl
Douglas Gregora082a492010-11-30 19:14:50 +00004897ASTNodeImporter::VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004898 DeclarationName ToDeclName;
4899 SourceLocation ToLocation, ToInnerLocStart;
4900 QualType ToType;
4901 TypeSourceInfo *ToTypeSourceInfo;
4902 if (auto Imp = importSeq(
4903 D->getDeclName(), D->getLocation(), D->getType(), D->getTypeSourceInfo(),
4904 D->getInnerLocStart()))
4905 std::tie(
4906 ToDeclName, ToLocation, ToType, ToTypeSourceInfo,
4907 ToInnerLocStart) = *Imp;
4908 else
4909 return Imp.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00004910
Douglas Gregora082a492010-11-30 19:14:50 +00004911 // FIXME: Import default argument.
Gabor Marton26f72a92018-07-12 09:42:05 +00004912
4913 NonTypeTemplateParmDecl *ToD = nullptr;
4914 (void)GetImportedOrCreateDecl(
4915 ToD, D, Importer.getToContext(),
4916 Importer.getToContext().getTranslationUnitDecl(),
Balazs Keri3b30d652018-10-19 13:32:20 +00004917 ToInnerLocStart, ToLocation, D->getDepth(),
4918 D->getPosition(), ToDeclName.getAsIdentifierInfo(), ToType,
4919 D->isParameterPack(), ToTypeSourceInfo);
Gabor Marton26f72a92018-07-12 09:42:05 +00004920 return ToD;
Douglas Gregora082a492010-11-30 19:14:50 +00004921}
4922
Balazs Keri3b30d652018-10-19 13:32:20 +00004923ExpectedDecl
Douglas Gregora082a492010-11-30 19:14:50 +00004924ASTNodeImporter::VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D) {
4925 // Import the name of this declaration.
Balazs Keri3b30d652018-10-19 13:32:20 +00004926 auto NameOrErr = import(D->getDeclName());
4927 if (!NameOrErr)
4928 return NameOrErr.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00004929
Douglas Gregora082a492010-11-30 19:14:50 +00004930 // Import the location of this declaration.
Balazs Keri3b30d652018-10-19 13:32:20 +00004931 ExpectedSLoc LocationOrErr = import(D->getLocation());
4932 if (!LocationOrErr)
4933 return LocationOrErr.takeError();
Gabor Marton26f72a92018-07-12 09:42:05 +00004934
Douglas Gregora082a492010-11-30 19:14:50 +00004935 // Import template parameters.
Balazs Keri3b30d652018-10-19 13:32:20 +00004936 auto TemplateParamsOrErr = ImportTemplateParameterList(
4937 D->getTemplateParameters());
4938 if (!TemplateParamsOrErr)
4939 return TemplateParamsOrErr.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00004940
Douglas Gregora082a492010-11-30 19:14:50 +00004941 // FIXME: Import default argument.
Gabor Marton26f72a92018-07-12 09:42:05 +00004942
4943 TemplateTemplateParmDecl *ToD = nullptr;
4944 (void)GetImportedOrCreateDecl(
4945 ToD, D, Importer.getToContext(),
Balazs Keri3b30d652018-10-19 13:32:20 +00004946 Importer.getToContext().getTranslationUnitDecl(), *LocationOrErr,
4947 D->getDepth(), D->getPosition(), D->isParameterPack(),
4948 (*NameOrErr).getAsIdentifierInfo(),
4949 *TemplateParamsOrErr);
Gabor Marton26f72a92018-07-12 09:42:05 +00004950 return ToD;
Douglas Gregora082a492010-11-30 19:14:50 +00004951}
4952
Gabor Marton9581c332018-05-23 13:53:36 +00004953// Returns the definition for a (forward) declaration of a ClassTemplateDecl, if
4954// it has any definition in the redecl chain.
4955static ClassTemplateDecl *getDefinition(ClassTemplateDecl *D) {
4956 CXXRecordDecl *ToTemplatedDef = D->getTemplatedDecl()->getDefinition();
4957 if (!ToTemplatedDef)
4958 return nullptr;
4959 ClassTemplateDecl *TemplateWithDef =
4960 ToTemplatedDef->getDescribedClassTemplate();
4961 return TemplateWithDef;
4962}
4963
Balazs Keri3b30d652018-10-19 13:32:20 +00004964ExpectedDecl ASTNodeImporter::VisitClassTemplateDecl(ClassTemplateDecl *D) {
Balazs Keri0c23dc52018-08-13 13:08:37 +00004965 bool IsFriend = D->getFriendObjectKind() != Decl::FOK_None;
4966
Gabor Marton7df342a2018-12-17 12:42:12 +00004967 // If this template has a definition in the translation unit we're coming
4968 // from, but this particular declaration is not that definition, import the
Douglas Gregora082a492010-11-30 19:14:50 +00004969 // definition and map to that.
Gabor Marton7df342a2018-12-17 12:42:12 +00004970 ClassTemplateDecl *Definition = getDefinition(D);
4971 if (Definition && Definition != D && !IsFriend) {
4972 if (ExpectedDecl ImportedDefOrErr = import(Definition))
Balazs Keri3b30d652018-10-19 13:32:20 +00004973 return Importer.MapImported(D, *ImportedDefOrErr);
4974 else
4975 return ImportedDefOrErr.takeError();
Douglas Gregora082a492010-11-30 19:14:50 +00004976 }
Gabor Marton9581c332018-05-23 13:53:36 +00004977
Douglas Gregora082a492010-11-30 19:14:50 +00004978 // Import the major distinguishing characteristics of this class template.
4979 DeclContext *DC, *LexicalDC;
4980 DeclarationName Name;
4981 SourceLocation Loc;
Sean Callanan59721b32015-04-28 18:41:46 +00004982 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00004983 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
4984 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00004985 if (ToD)
4986 return ToD;
Craig Topper36250ad2014-05-12 05:36:57 +00004987
Gabor Marton7df342a2018-12-17 12:42:12 +00004988 ClassTemplateDecl *FoundByLookup = nullptr;
4989
Douglas Gregora082a492010-11-30 19:14:50 +00004990 // We may already have a template of the same name; try to find and match it.
4991 if (!DC->isFunctionOrMethod()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004992 SmallVector<NamedDecl *, 4> ConflictingDecls;
Gabor Marton54058b52018-12-17 13:53:12 +00004993 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00004994 for (auto *FoundDecl : FoundDecls) {
Gabor Marton7df342a2018-12-17 12:42:12 +00004995 if (!FoundDecl->isInIdentifierNamespace(Decl::IDNS_Ordinary |
4996 Decl::IDNS_TagFriend))
Douglas Gregora082a492010-11-30 19:14:50 +00004997 continue;
Gabor Marton9581c332018-05-23 13:53:36 +00004998
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00004999 Decl *Found = FoundDecl;
Gabor Marton7df342a2018-12-17 12:42:12 +00005000 auto *FoundTemplate = dyn_cast<ClassTemplateDecl>(Found);
5001 if (FoundTemplate) {
Gabor Marton9581c332018-05-23 13:53:36 +00005002
Douglas Gregora082a492010-11-30 19:14:50 +00005003 if (IsStructuralMatch(D, FoundTemplate)) {
Gabor Marton7df342a2018-12-17 12:42:12 +00005004 ClassTemplateDecl *TemplateWithDef = getDefinition(FoundTemplate);
5005 if (D->isThisDeclarationADefinition() && TemplateWithDef) {
5006 return Importer.MapImported(D, TemplateWithDef);
Balazs Keri0c23dc52018-08-13 13:08:37 +00005007 }
Gabor Marton7df342a2018-12-17 12:42:12 +00005008 FoundByLookup = FoundTemplate;
5009 break;
Gabor Marton9581c332018-05-23 13:53:36 +00005010 }
Douglas Gregora082a492010-11-30 19:14:50 +00005011 }
Gabor Marton9581c332018-05-23 13:53:36 +00005012
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00005013 ConflictingDecls.push_back(FoundDecl);
Douglas Gregora082a492010-11-30 19:14:50 +00005014 }
Gabor Marton9581c332018-05-23 13:53:36 +00005015
Douglas Gregora082a492010-11-30 19:14:50 +00005016 if (!ConflictingDecls.empty()) {
5017 Name = Importer.HandleNameConflict(Name, DC, Decl::IDNS_Ordinary,
Gabor Marton9581c332018-05-23 13:53:36 +00005018 ConflictingDecls.data(),
Douglas Gregora082a492010-11-30 19:14:50 +00005019 ConflictingDecls.size());
5020 }
Gabor Marton9581c332018-05-23 13:53:36 +00005021
Douglas Gregora082a492010-11-30 19:14:50 +00005022 if (!Name)
Balazs Keri3b30d652018-10-19 13:32:20 +00005023 return make_error<ImportError>(ImportError::NameConflict);
Douglas Gregora082a492010-11-30 19:14:50 +00005024 }
5025
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00005026 CXXRecordDecl *FromTemplated = D->getTemplatedDecl();
5027
Douglas Gregora082a492010-11-30 19:14:50 +00005028 // Create the declaration that is being templated.
Balazs Keri3b30d652018-10-19 13:32:20 +00005029 CXXRecordDecl *ToTemplated;
5030 if (Error Err = importInto(ToTemplated, FromTemplated))
5031 return std::move(Err);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00005032
Douglas Gregora082a492010-11-30 19:14:50 +00005033 // Create the class template declaration itself.
Balazs Keri3b30d652018-10-19 13:32:20 +00005034 auto TemplateParamsOrErr = ImportTemplateParameterList(
5035 D->getTemplateParameters());
5036 if (!TemplateParamsOrErr)
5037 return TemplateParamsOrErr.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00005038
Gabor Marton26f72a92018-07-12 09:42:05 +00005039 ClassTemplateDecl *D2;
5040 if (GetImportedOrCreateDecl(D2, D, Importer.getToContext(), DC, Loc, Name,
Balazs Keri3b30d652018-10-19 13:32:20 +00005041 *TemplateParamsOrErr, ToTemplated))
Gabor Marton26f72a92018-07-12 09:42:05 +00005042 return D2;
5043
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00005044 ToTemplated->setDescribedClassTemplate(D2);
Fangrui Song6907ce22018-07-30 19:24:48 +00005045
Douglas Gregora082a492010-11-30 19:14:50 +00005046 D2->setAccess(D->getAccess());
5047 D2->setLexicalDeclContext(LexicalDC);
Gabor Marton7df342a2018-12-17 12:42:12 +00005048
5049 if (D->getDeclContext()->containsDeclAndLoad(D))
5050 DC->addDeclInternal(D2);
5051 if (DC != LexicalDC && D->getLexicalDeclContext()->containsDeclAndLoad(D))
Balazs Keri0c23dc52018-08-13 13:08:37 +00005052 LexicalDC->addDeclInternal(D2);
Fangrui Song6907ce22018-07-30 19:24:48 +00005053
Gabor Marton7df342a2018-12-17 12:42:12 +00005054 if (FoundByLookup) {
5055 auto *Recent =
5056 const_cast<ClassTemplateDecl *>(FoundByLookup->getMostRecentDecl());
5057
5058 // It is possible that during the import of the class template definition
5059 // we start the import of a fwd friend decl of the very same class template
5060 // and we add the fwd friend decl to the lookup table. But the ToTemplated
5061 // had been created earlier and by that time the lookup could not find
5062 // anything existing, so it has no previous decl. Later, (still during the
5063 // import of the fwd friend decl) we start to import the definition again
5064 // and this time the lookup finds the previous fwd friend class template.
5065 // In this case we must set up the previous decl for the templated decl.
5066 if (!ToTemplated->getPreviousDecl()) {
5067 CXXRecordDecl *PrevTemplated =
5068 FoundByLookup->getTemplatedDecl()->getMostRecentDecl();
5069 if (ToTemplated != PrevTemplated)
5070 ToTemplated->setPreviousDecl(PrevTemplated);
5071 }
5072
5073 D2->setPreviousDecl(Recent);
5074 }
5075
5076 if (LexicalDC != DC && IsFriend)
5077 DC->makeDeclVisibleInContext(D2);
5078
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00005079 if (FromTemplated->isCompleteDefinition() &&
5080 !ToTemplated->isCompleteDefinition()) {
Douglas Gregora082a492010-11-30 19:14:50 +00005081 // FIXME: Import definition!
5082 }
Fangrui Song6907ce22018-07-30 19:24:48 +00005083
Douglas Gregora082a492010-11-30 19:14:50 +00005084 return D2;
5085}
5086
Balazs Keri3b30d652018-10-19 13:32:20 +00005087ExpectedDecl ASTNodeImporter::VisitClassTemplateSpecializationDecl(
Douglas Gregore2e50d332010-12-01 01:36:18 +00005088 ClassTemplateSpecializationDecl *D) {
5089 // If this record has a definition in the translation unit we're coming from,
5090 // but this particular declaration is not that definition, import the
5091 // definition and map to that.
5092 TagDecl *Definition = D->getDefinition();
5093 if (Definition && Definition != D) {
Balazs Keri3b30d652018-10-19 13:32:20 +00005094 if (ExpectedDecl ImportedDefOrErr = import(Definition))
5095 return Importer.MapImported(D, *ImportedDefOrErr);
5096 else
5097 return ImportedDefOrErr.takeError();
Douglas Gregore2e50d332010-12-01 01:36:18 +00005098 }
5099
Balazs Keri3b30d652018-10-19 13:32:20 +00005100 ClassTemplateDecl *ClassTemplate;
5101 if (Error Err = importInto(ClassTemplate, D->getSpecializedTemplate()))
5102 return std::move(Err);
Craig Topper36250ad2014-05-12 05:36:57 +00005103
Douglas Gregore2e50d332010-12-01 01:36:18 +00005104 // Import the context of this declaration.
Balazs Keri3b30d652018-10-19 13:32:20 +00005105 DeclContext *DC, *LexicalDC;
5106 if (Error Err = ImportDeclContext(D, DC, LexicalDC))
5107 return std::move(Err);
Douglas Gregore2e50d332010-12-01 01:36:18 +00005108
5109 // Import template arguments.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005110 SmallVector<TemplateArgument, 2> TemplateArgs;
Balazs Keri3b30d652018-10-19 13:32:20 +00005111 if (Error Err = ImportTemplateArguments(
5112 D->getTemplateArgs().data(), D->getTemplateArgs().size(), TemplateArgs))
5113 return std::move(Err);
Craig Topper36250ad2014-05-12 05:36:57 +00005114
Douglas Gregore2e50d332010-12-01 01:36:18 +00005115 // Try to find an existing specialization with these template arguments.
Craig Topper36250ad2014-05-12 05:36:57 +00005116 void *InsertPos = nullptr;
Gabor Marton42e15de2018-08-22 11:52:14 +00005117 ClassTemplateSpecializationDecl *D2 = nullptr;
5118 ClassTemplatePartialSpecializationDecl *PartialSpec =
5119 dyn_cast<ClassTemplatePartialSpecializationDecl>(D);
5120 if (PartialSpec)
5121 D2 = ClassTemplate->findPartialSpecialization(TemplateArgs, InsertPos);
5122 else
5123 D2 = ClassTemplate->findSpecialization(TemplateArgs, InsertPos);
5124 ClassTemplateSpecializationDecl * const PrevDecl = D2;
5125 RecordDecl *FoundDef = D2 ? D2->getDefinition() : nullptr;
5126 if (FoundDef) {
5127 if (!D->isCompleteDefinition()) {
5128 // The "From" translation unit only had a forward declaration; call it
5129 // the same declaration.
5130 // TODO Handle the redecl chain properly!
5131 return Importer.MapImported(D, FoundDef);
Douglas Gregore2e50d332010-12-01 01:36:18 +00005132 }
Gabor Marton42e15de2018-08-22 11:52:14 +00005133
5134 if (IsStructuralMatch(D, FoundDef)) {
5135
5136 Importer.MapImported(D, FoundDef);
5137
5138 // Import those those default field initializers which have been
5139 // instantiated in the "From" context, but not in the "To" context.
Balazs Keri3b30d652018-10-19 13:32:20 +00005140 for (auto *FromField : D->fields()) {
5141 auto ToOrErr = import(FromField);
5142 if (!ToOrErr)
5143 // FIXME: return the error?
5144 consumeError(ToOrErr.takeError());
5145 }
Gabor Marton42e15de2018-08-22 11:52:14 +00005146
5147 // Import those methods which have been instantiated in the
5148 // "From" context, but not in the "To" context.
Balazs Keri3b30d652018-10-19 13:32:20 +00005149 for (CXXMethodDecl *FromM : D->methods()) {
5150 auto ToOrErr = import(FromM);
5151 if (!ToOrErr)
5152 // FIXME: return the error?
5153 consumeError(ToOrErr.takeError());
5154 }
Gabor Marton42e15de2018-08-22 11:52:14 +00005155
5156 // TODO Import instantiated default arguments.
5157 // TODO Import instantiated exception specifications.
5158 //
5159 // Generally, ASTCommon.h/DeclUpdateKind enum gives a very good hint what
5160 // else could be fused during an AST merge.
5161
5162 return FoundDef;
5163 }
5164 } else { // We either couldn't find any previous specialization in the "To"
5165 // context, or we found one but without definition. Let's create a
5166 // new specialization and register that at the class template.
Balazs Keri3b30d652018-10-19 13:32:20 +00005167
5168 // Import the location of this declaration.
5169 ExpectedSLoc BeginLocOrErr = import(D->getBeginLoc());
5170 if (!BeginLocOrErr)
5171 return BeginLocOrErr.takeError();
5172 ExpectedSLoc IdLocOrErr = import(D->getLocation());
5173 if (!IdLocOrErr)
5174 return IdLocOrErr.takeError();
5175
Gabor Marton42e15de2018-08-22 11:52:14 +00005176 if (PartialSpec) {
5177 // Import TemplateArgumentListInfo.
Aleksei Sidorin855086d2017-01-23 09:30:36 +00005178 TemplateArgumentListInfo ToTAInfo;
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005179 const auto &ASTTemplateArgs = *PartialSpec->getTemplateArgsAsWritten();
Balazs Keri3b30d652018-10-19 13:32:20 +00005180 if (Error Err = ImportTemplateArgumentListInfo(ASTTemplateArgs, ToTAInfo))
5181 return std::move(Err);
Aleksei Sidorin855086d2017-01-23 09:30:36 +00005182
Balazs Keri3b30d652018-10-19 13:32:20 +00005183 QualType CanonInjType;
5184 if (Error Err = importInto(
5185 CanonInjType, PartialSpec->getInjectedSpecializationType()))
5186 return std::move(Err);
Aleksei Sidorin855086d2017-01-23 09:30:36 +00005187 CanonInjType = CanonInjType.getCanonicalType();
5188
Balazs Keri3b30d652018-10-19 13:32:20 +00005189 auto ToTPListOrErr = ImportTemplateParameterList(
5190 PartialSpec->getTemplateParameters());
5191 if (!ToTPListOrErr)
5192 return ToTPListOrErr.takeError();
Aleksei Sidorin855086d2017-01-23 09:30:36 +00005193
Gabor Marton26f72a92018-07-12 09:42:05 +00005194 if (GetImportedOrCreateDecl<ClassTemplatePartialSpecializationDecl>(
Balazs Keri3b30d652018-10-19 13:32:20 +00005195 D2, D, Importer.getToContext(), D->getTagKind(), DC,
5196 *BeginLocOrErr, *IdLocOrErr, *ToTPListOrErr, ClassTemplate,
Gabor Marton26f72a92018-07-12 09:42:05 +00005197 llvm::makeArrayRef(TemplateArgs.data(), TemplateArgs.size()),
Gabor Marton42e15de2018-08-22 11:52:14 +00005198 ToTAInfo, CanonInjType,
5199 cast_or_null<ClassTemplatePartialSpecializationDecl>(PrevDecl)))
Gabor Marton26f72a92018-07-12 09:42:05 +00005200 return D2;
Aleksei Sidorin855086d2017-01-23 09:30:36 +00005201
Gabor Marton42e15de2018-08-22 11:52:14 +00005202 // Update InsertPos, because preceding import calls may have invalidated
5203 // it by adding new specializations.
5204 if (!ClassTemplate->findPartialSpecialization(TemplateArgs, InsertPos))
5205 // Add this partial specialization to the class template.
5206 ClassTemplate->AddPartialSpecialization(
5207 cast<ClassTemplatePartialSpecializationDecl>(D2), InsertPos);
5208
5209 } else { // Not a partial specialization.
Gabor Marton26f72a92018-07-12 09:42:05 +00005210 if (GetImportedOrCreateDecl(
Balazs Keri3b30d652018-10-19 13:32:20 +00005211 D2, D, Importer.getToContext(), D->getTagKind(), DC,
5212 *BeginLocOrErr, *IdLocOrErr, ClassTemplate, TemplateArgs,
5213 PrevDecl))
Gabor Marton26f72a92018-07-12 09:42:05 +00005214 return D2;
Gabor Marton42e15de2018-08-22 11:52:14 +00005215
5216 // Update InsertPos, because preceding import calls may have invalidated
5217 // it by adding new specializations.
5218 if (!ClassTemplate->findSpecialization(TemplateArgs, InsertPos))
5219 // Add this specialization to the class template.
5220 ClassTemplate->AddSpecialization(D2, InsertPos);
Aleksei Sidorin855086d2017-01-23 09:30:36 +00005221 }
5222
Douglas Gregore2e50d332010-12-01 01:36:18 +00005223 D2->setSpecializationKind(D->getSpecializationKind());
5224
Douglas Gregore2e50d332010-12-01 01:36:18 +00005225 // Import the qualifier, if any.
Balazs Keri3b30d652018-10-19 13:32:20 +00005226 if (auto LocOrErr = import(D->getQualifierLoc()))
5227 D2->setQualifierInfo(*LocOrErr);
5228 else
5229 return LocOrErr.takeError();
Aleksei Sidorin855086d2017-01-23 09:30:36 +00005230
Aleksei Sidorin855086d2017-01-23 09:30:36 +00005231 if (auto *TSI = D->getTypeAsWritten()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00005232 if (auto TInfoOrErr = import(TSI))
5233 D2->setTypeAsWritten(*TInfoOrErr);
5234 else
5235 return TInfoOrErr.takeError();
5236
5237 if (auto LocOrErr = import(D->getTemplateKeywordLoc()))
5238 D2->setTemplateKeywordLoc(*LocOrErr);
5239 else
5240 return LocOrErr.takeError();
5241
5242 if (auto LocOrErr = import(D->getExternLoc()))
5243 D2->setExternLoc(*LocOrErr);
5244 else
5245 return LocOrErr.takeError();
Aleksei Sidorin855086d2017-01-23 09:30:36 +00005246 }
5247
Balazs Keri3b30d652018-10-19 13:32:20 +00005248 if (D->getPointOfInstantiation().isValid()) {
5249 if (auto POIOrErr = import(D->getPointOfInstantiation()))
5250 D2->setPointOfInstantiation(*POIOrErr);
5251 else
5252 return POIOrErr.takeError();
5253 }
Aleksei Sidorin855086d2017-01-23 09:30:36 +00005254
5255 D2->setTemplateSpecializationKind(D->getTemplateSpecializationKind());
5256
Gabor Martonb14056b2018-05-25 11:21:24 +00005257 // Set the context of this specialization/instantiation.
Douglas Gregore2e50d332010-12-01 01:36:18 +00005258 D2->setLexicalDeclContext(LexicalDC);
Gabor Martonb14056b2018-05-25 11:21:24 +00005259
5260 // Add to the DC only if it was an explicit specialization/instantiation.
5261 if (D2->isExplicitInstantiationOrSpecialization()) {
5262 LexicalDC->addDeclInternal(D2);
5263 }
Douglas Gregore2e50d332010-12-01 01:36:18 +00005264 }
Balazs Keri3b30d652018-10-19 13:32:20 +00005265 if (D->isCompleteDefinition())
5266 if (Error Err = ImportDefinition(D, D2))
5267 return std::move(Err);
Craig Topper36250ad2014-05-12 05:36:57 +00005268
Douglas Gregore2e50d332010-12-01 01:36:18 +00005269 return D2;
5270}
5271
Balazs Keri3b30d652018-10-19 13:32:20 +00005272ExpectedDecl ASTNodeImporter::VisitVarTemplateDecl(VarTemplateDecl *D) {
Larisse Voufo39a1e502013-08-06 01:03:05 +00005273 // If this variable has a definition in the translation unit we're coming
5274 // from,
5275 // but this particular declaration is not that definition, import the
5276 // definition and map to that.
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00005277 auto *Definition =
Larisse Voufo39a1e502013-08-06 01:03:05 +00005278 cast_or_null<VarDecl>(D->getTemplatedDecl()->getDefinition());
5279 if (Definition && Definition != D->getTemplatedDecl()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00005280 if (ExpectedDecl ImportedDefOrErr = import(
5281 Definition->getDescribedVarTemplate()))
5282 return Importer.MapImported(D, *ImportedDefOrErr);
5283 else
5284 return ImportedDefOrErr.takeError();
Larisse Voufo39a1e502013-08-06 01:03:05 +00005285 }
5286
5287 // Import the major distinguishing characteristics of this variable template.
5288 DeclContext *DC, *LexicalDC;
5289 DeclarationName Name;
5290 SourceLocation Loc;
Sean Callanan59721b32015-04-28 18:41:46 +00005291 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00005292 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
5293 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00005294 if (ToD)
5295 return ToD;
Larisse Voufo39a1e502013-08-06 01:03:05 +00005296
5297 // We may already have a template of the same name; try to find and match it.
5298 assert(!DC->isFunctionOrMethod() &&
5299 "Variable templates cannot be declared at function scope");
5300 SmallVector<NamedDecl *, 4> ConflictingDecls;
Gabor Marton54058b52018-12-17 13:53:12 +00005301 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00005302 for (auto *FoundDecl : FoundDecls) {
5303 if (!FoundDecl->isInIdentifierNamespace(Decl::IDNS_Ordinary))
Larisse Voufo39a1e502013-08-06 01:03:05 +00005304 continue;
5305
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00005306 Decl *Found = FoundDecl;
Balazs Keri3b30d652018-10-19 13:32:20 +00005307 if (VarTemplateDecl *FoundTemplate = dyn_cast<VarTemplateDecl>(Found)) {
Larisse Voufo39a1e502013-08-06 01:03:05 +00005308 if (IsStructuralMatch(D, FoundTemplate)) {
5309 // The variable templates structurally match; call it the same template.
Gabor Marton26f72a92018-07-12 09:42:05 +00005310 Importer.MapImported(D->getTemplatedDecl(),
5311 FoundTemplate->getTemplatedDecl());
5312 return Importer.MapImported(D, FoundTemplate);
Larisse Voufo39a1e502013-08-06 01:03:05 +00005313 }
5314 }
5315
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00005316 ConflictingDecls.push_back(FoundDecl);
Larisse Voufo39a1e502013-08-06 01:03:05 +00005317 }
5318
5319 if (!ConflictingDecls.empty()) {
5320 Name = Importer.HandleNameConflict(Name, DC, Decl::IDNS_Ordinary,
5321 ConflictingDecls.data(),
5322 ConflictingDecls.size());
5323 }
5324
5325 if (!Name)
Balazs Keri3b30d652018-10-19 13:32:20 +00005326 // FIXME: Is it possible to get other error than name conflict?
5327 // (Put this `if` into the previous `if`?)
5328 return make_error<ImportError>(ImportError::NameConflict);
Larisse Voufo39a1e502013-08-06 01:03:05 +00005329
5330 VarDecl *DTemplated = D->getTemplatedDecl();
5331
5332 // Import the type.
Balazs Keri3b30d652018-10-19 13:32:20 +00005333 // FIXME: Value not used?
5334 ExpectedType TypeOrErr = import(DTemplated->getType());
5335 if (!TypeOrErr)
5336 return TypeOrErr.takeError();
Larisse Voufo39a1e502013-08-06 01:03:05 +00005337
5338 // Create the declaration that is being templated.
Balazs Keri3b30d652018-10-19 13:32:20 +00005339 VarDecl *ToTemplated;
5340 if (Error Err = importInto(ToTemplated, DTemplated))
5341 return std::move(Err);
Larisse Voufo39a1e502013-08-06 01:03:05 +00005342
5343 // Create the variable template declaration itself.
Balazs Keri3b30d652018-10-19 13:32:20 +00005344 auto TemplateParamsOrErr = ImportTemplateParameterList(
5345 D->getTemplateParameters());
5346 if (!TemplateParamsOrErr)
5347 return TemplateParamsOrErr.takeError();
Larisse Voufo39a1e502013-08-06 01:03:05 +00005348
Gabor Marton26f72a92018-07-12 09:42:05 +00005349 VarTemplateDecl *ToVarTD;
5350 if (GetImportedOrCreateDecl(ToVarTD, D, Importer.getToContext(), DC, Loc,
Balazs Keri3b30d652018-10-19 13:32:20 +00005351 Name, *TemplateParamsOrErr, ToTemplated))
Gabor Marton26f72a92018-07-12 09:42:05 +00005352 return ToVarTD;
5353
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005354 ToTemplated->setDescribedVarTemplate(ToVarTD);
Larisse Voufo39a1e502013-08-06 01:03:05 +00005355
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005356 ToVarTD->setAccess(D->getAccess());
5357 ToVarTD->setLexicalDeclContext(LexicalDC);
5358 LexicalDC->addDeclInternal(ToVarTD);
Larisse Voufo39a1e502013-08-06 01:03:05 +00005359
Larisse Voufo39a1e502013-08-06 01:03:05 +00005360 if (DTemplated->isThisDeclarationADefinition() &&
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005361 !ToTemplated->isThisDeclarationADefinition()) {
Larisse Voufo39a1e502013-08-06 01:03:05 +00005362 // FIXME: Import definition!
5363 }
5364
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005365 return ToVarTD;
Larisse Voufo39a1e502013-08-06 01:03:05 +00005366}
5367
Balazs Keri3b30d652018-10-19 13:32:20 +00005368ExpectedDecl ASTNodeImporter::VisitVarTemplateSpecializationDecl(
Larisse Voufo39a1e502013-08-06 01:03:05 +00005369 VarTemplateSpecializationDecl *D) {
5370 // If this record has a definition in the translation unit we're coming from,
5371 // but this particular declaration is not that definition, import the
5372 // definition and map to that.
5373 VarDecl *Definition = D->getDefinition();
5374 if (Definition && Definition != D) {
Balazs Keri3b30d652018-10-19 13:32:20 +00005375 if (ExpectedDecl ImportedDefOrErr = import(Definition))
5376 return Importer.MapImported(D, *ImportedDefOrErr);
5377 else
5378 return ImportedDefOrErr.takeError();
Larisse Voufo39a1e502013-08-06 01:03:05 +00005379 }
5380
Balazs Keri3b30d652018-10-19 13:32:20 +00005381 VarTemplateDecl *VarTemplate;
5382 if (Error Err = importInto(VarTemplate, D->getSpecializedTemplate()))
5383 return std::move(Err);
Larisse Voufo39a1e502013-08-06 01:03:05 +00005384
5385 // Import the context of this declaration.
Balazs Keri3b30d652018-10-19 13:32:20 +00005386 DeclContext *DC, *LexicalDC;
5387 if (Error Err = ImportDeclContext(D, DC, LexicalDC))
5388 return std::move(Err);
Larisse Voufo39a1e502013-08-06 01:03:05 +00005389
5390 // Import the location of this declaration.
Balazs Keri3b30d652018-10-19 13:32:20 +00005391 ExpectedSLoc BeginLocOrErr = import(D->getBeginLoc());
5392 if (!BeginLocOrErr)
5393 return BeginLocOrErr.takeError();
5394
5395 auto IdLocOrErr = import(D->getLocation());
5396 if (!IdLocOrErr)
5397 return IdLocOrErr.takeError();
Larisse Voufo39a1e502013-08-06 01:03:05 +00005398
5399 // Import template arguments.
5400 SmallVector<TemplateArgument, 2> TemplateArgs;
Balazs Keri3b30d652018-10-19 13:32:20 +00005401 if (Error Err = ImportTemplateArguments(
5402 D->getTemplateArgs().data(), D->getTemplateArgs().size(), TemplateArgs))
5403 return std::move(Err);
Larisse Voufo39a1e502013-08-06 01:03:05 +00005404
5405 // Try to find an existing specialization with these template arguments.
Craig Topper36250ad2014-05-12 05:36:57 +00005406 void *InsertPos = nullptr;
Larisse Voufo39a1e502013-08-06 01:03:05 +00005407 VarTemplateSpecializationDecl *D2 = VarTemplate->findSpecialization(
Craig Topper7e0daca2014-06-26 04:58:53 +00005408 TemplateArgs, InsertPos);
Larisse Voufo39a1e502013-08-06 01:03:05 +00005409 if (D2) {
5410 // We already have a variable template specialization with these template
5411 // arguments.
5412
5413 // FIXME: Check for specialization vs. instantiation errors.
5414
5415 if (VarDecl *FoundDef = D2->getDefinition()) {
5416 if (!D->isThisDeclarationADefinition() ||
5417 IsStructuralMatch(D, FoundDef)) {
5418 // The record types structurally match, or the "from" translation
5419 // unit only had a forward declaration anyway; call it the same
5420 // variable.
Gabor Marton26f72a92018-07-12 09:42:05 +00005421 return Importer.MapImported(D, FoundDef);
Larisse Voufo39a1e502013-08-06 01:03:05 +00005422 }
5423 }
5424 } else {
Larisse Voufo39a1e502013-08-06 01:03:05 +00005425 // Import the type.
Balazs Keri3b30d652018-10-19 13:32:20 +00005426 QualType T;
5427 if (Error Err = importInto(T, D->getType()))
5428 return std::move(Err);
Larisse Voufo39a1e502013-08-06 01:03:05 +00005429
Balazs Keri3b30d652018-10-19 13:32:20 +00005430 auto TInfoOrErr = import(D->getTypeSourceInfo());
5431 if (!TInfoOrErr)
5432 return TInfoOrErr.takeError();
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005433
5434 TemplateArgumentListInfo ToTAInfo;
Balazs Keri3b30d652018-10-19 13:32:20 +00005435 if (Error Err = ImportTemplateArgumentListInfo(
5436 D->getTemplateArgsInfo(), ToTAInfo))
5437 return std::move(Err);
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005438
5439 using PartVarSpecDecl = VarTemplatePartialSpecializationDecl;
Larisse Voufo39a1e502013-08-06 01:03:05 +00005440 // Create a new specialization.
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005441 if (auto *FromPartial = dyn_cast<PartVarSpecDecl>(D)) {
5442 // Import TemplateArgumentListInfo
5443 TemplateArgumentListInfo ArgInfos;
5444 const auto *FromTAArgsAsWritten = FromPartial->getTemplateArgsAsWritten();
5445 // NOTE: FromTAArgsAsWritten and template parameter list are non-null.
Balazs Keri3b30d652018-10-19 13:32:20 +00005446 if (Error Err = ImportTemplateArgumentListInfo(
5447 *FromTAArgsAsWritten, ArgInfos))
5448 return std::move(Err);
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005449
Balazs Keri3b30d652018-10-19 13:32:20 +00005450 auto ToTPListOrErr = ImportTemplateParameterList(
5451 FromPartial->getTemplateParameters());
5452 if (!ToTPListOrErr)
5453 return ToTPListOrErr.takeError();
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005454
Gabor Marton26f72a92018-07-12 09:42:05 +00005455 PartVarSpecDecl *ToPartial;
5456 if (GetImportedOrCreateDecl(ToPartial, D, Importer.getToContext(), DC,
Balazs Keri3b30d652018-10-19 13:32:20 +00005457 *BeginLocOrErr, *IdLocOrErr, *ToTPListOrErr,
5458 VarTemplate, T, *TInfoOrErr,
5459 D->getStorageClass(), TemplateArgs, ArgInfos))
Gabor Marton26f72a92018-07-12 09:42:05 +00005460 return ToPartial;
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005461
Balazs Keri3b30d652018-10-19 13:32:20 +00005462 if (Expected<PartVarSpecDecl *> ToInstOrErr = import(
5463 FromPartial->getInstantiatedFromMember()))
5464 ToPartial->setInstantiatedFromMember(*ToInstOrErr);
5465 else
5466 return ToInstOrErr.takeError();
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005467
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005468 if (FromPartial->isMemberSpecialization())
5469 ToPartial->setMemberSpecialization();
5470
5471 D2 = ToPartial;
Balazs Keri3b30d652018-10-19 13:32:20 +00005472
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005473 } else { // Full specialization
Balazs Keri3b30d652018-10-19 13:32:20 +00005474 if (GetImportedOrCreateDecl(D2, D, Importer.getToContext(), DC,
5475 *BeginLocOrErr, *IdLocOrErr, VarTemplate,
5476 T, *TInfoOrErr,
Gabor Marton26f72a92018-07-12 09:42:05 +00005477 D->getStorageClass(), TemplateArgs))
5478 return D2;
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005479 }
5480
Balazs Keri3b30d652018-10-19 13:32:20 +00005481 if (D->getPointOfInstantiation().isValid()) {
5482 if (ExpectedSLoc POIOrErr = import(D->getPointOfInstantiation()))
5483 D2->setPointOfInstantiation(*POIOrErr);
5484 else
5485 return POIOrErr.takeError();
5486 }
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005487
Larisse Voufo39a1e502013-08-06 01:03:05 +00005488 D2->setSpecializationKind(D->getSpecializationKind());
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005489 D2->setTemplateArgsInfo(ToTAInfo);
Larisse Voufo39a1e502013-08-06 01:03:05 +00005490
5491 // Add this specialization to the class template.
5492 VarTemplate->AddSpecialization(D2, InsertPos);
5493
5494 // Import the qualifier, if any.
Balazs Keri3b30d652018-10-19 13:32:20 +00005495 if (auto LocOrErr = import(D->getQualifierLoc()))
5496 D2->setQualifierInfo(*LocOrErr);
5497 else
5498 return LocOrErr.takeError();
Larisse Voufo39a1e502013-08-06 01:03:05 +00005499
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005500 if (D->isConstexpr())
5501 D2->setConstexpr(true);
5502
Larisse Voufo39a1e502013-08-06 01:03:05 +00005503 // Add the specialization to this context.
5504 D2->setLexicalDeclContext(LexicalDC);
5505 LexicalDC->addDeclInternal(D2);
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005506
5507 D2->setAccess(D->getAccess());
Larisse Voufo39a1e502013-08-06 01:03:05 +00005508 }
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005509
Balazs Keri3b30d652018-10-19 13:32:20 +00005510 if (Error Err = ImportInitializer(D, D2))
5511 return std::move(Err);
Larisse Voufo39a1e502013-08-06 01:03:05 +00005512
5513 return D2;
5514}
5515
Balazs Keri3b30d652018-10-19 13:32:20 +00005516ExpectedDecl
5517ASTNodeImporter::VisitFunctionTemplateDecl(FunctionTemplateDecl *D) {
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00005518 DeclContext *DC, *LexicalDC;
5519 DeclarationName Name;
5520 SourceLocation Loc;
5521 NamedDecl *ToD;
5522
Balazs Keri3b30d652018-10-19 13:32:20 +00005523 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
5524 return std::move(Err);
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00005525
5526 if (ToD)
5527 return ToD;
5528
5529 // Try to find a function in our own ("to") context with the same name, same
5530 // type, and in the same context as the function we're importing.
5531 if (!LexicalDC->isFunctionOrMethod()) {
5532 unsigned IDNS = Decl::IDNS_Ordinary;
Gabor Marton54058b52018-12-17 13:53:12 +00005533 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00005534 for (auto *FoundDecl : FoundDecls) {
5535 if (!FoundDecl->isInIdentifierNamespace(IDNS))
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00005536 continue;
5537
Balazs Keri3b30d652018-10-19 13:32:20 +00005538 if (auto *FoundFunction =
5539 dyn_cast<FunctionTemplateDecl>(FoundDecl)) {
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00005540 if (FoundFunction->hasExternalFormalLinkage() &&
5541 D->hasExternalFormalLinkage()) {
5542 if (IsStructuralMatch(D, FoundFunction)) {
Gabor Marton26f72a92018-07-12 09:42:05 +00005543 Importer.MapImported(D, FoundFunction);
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00005544 // FIXME: Actually try to merge the body and other attributes.
5545 return FoundFunction;
5546 }
5547 }
5548 }
Balazs Keri3b30d652018-10-19 13:32:20 +00005549 // TODO: handle conflicting names
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00005550 }
5551 }
5552
Balazs Keri3b30d652018-10-19 13:32:20 +00005553 auto ParamsOrErr = ImportTemplateParameterList(
5554 D->getTemplateParameters());
5555 if (!ParamsOrErr)
5556 return ParamsOrErr.takeError();
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00005557
Balazs Keri3b30d652018-10-19 13:32:20 +00005558 FunctionDecl *TemplatedFD;
5559 if (Error Err = importInto(TemplatedFD, D->getTemplatedDecl()))
5560 return std::move(Err);
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00005561
Gabor Marton26f72a92018-07-12 09:42:05 +00005562 FunctionTemplateDecl *ToFunc;
5563 if (GetImportedOrCreateDecl(ToFunc, D, Importer.getToContext(), DC, Loc, Name,
Balazs Keri3b30d652018-10-19 13:32:20 +00005564 *ParamsOrErr, TemplatedFD))
Gabor Marton26f72a92018-07-12 09:42:05 +00005565 return ToFunc;
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00005566
5567 TemplatedFD->setDescribedFunctionTemplate(ToFunc);
5568 ToFunc->setAccess(D->getAccess());
5569 ToFunc->setLexicalDeclContext(LexicalDC);
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00005570
5571 LexicalDC->addDeclInternal(ToFunc);
5572 return ToFunc;
5573}
5574
Douglas Gregor7eeb5972010-02-11 19:21:55 +00005575//----------------------------------------------------------------------------
5576// Import Statements
5577//----------------------------------------------------------------------------
5578
Balazs Keri3b30d652018-10-19 13:32:20 +00005579ExpectedStmt ASTNodeImporter::VisitStmt(Stmt *S) {
Stephen Kellyf2ceec42018-08-09 21:08:08 +00005580 Importer.FromDiag(S->getBeginLoc(), diag::err_unsupported_ast_node)
5581 << S->getStmtClassName();
Balazs Keri3b30d652018-10-19 13:32:20 +00005582 return make_error<ImportError>(ImportError::UnsupportedConstruct);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00005583}
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00005584
Balazs Keri3b30d652018-10-19 13:32:20 +00005585
5586ExpectedStmt ASTNodeImporter::VisitGCCAsmStmt(GCCAsmStmt *S) {
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00005587 SmallVector<IdentifierInfo *, 4> Names;
5588 for (unsigned I = 0, E = S->getNumOutputs(); I != E; I++) {
5589 IdentifierInfo *ToII = Importer.Import(S->getOutputIdentifier(I));
Gabor Horvath27f5ff62017-03-13 15:32:24 +00005590 // ToII is nullptr when no symbolic name is given for output operand
5591 // see ParseStmtAsm::ParseAsmOperandsOpt
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00005592 Names.push_back(ToII);
5593 }
Balazs Keri3b30d652018-10-19 13:32:20 +00005594
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00005595 for (unsigned I = 0, E = S->getNumInputs(); I != E; I++) {
5596 IdentifierInfo *ToII = Importer.Import(S->getInputIdentifier(I));
Gabor Horvath27f5ff62017-03-13 15:32:24 +00005597 // ToII is nullptr when no symbolic name is given for input operand
5598 // see ParseStmtAsm::ParseAsmOperandsOpt
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00005599 Names.push_back(ToII);
5600 }
5601
5602 SmallVector<StringLiteral *, 4> Clobbers;
5603 for (unsigned I = 0, E = S->getNumClobbers(); I != E; I++) {
Balazs Keri3b30d652018-10-19 13:32:20 +00005604 if (auto ClobberOrErr = import(S->getClobberStringLiteral(I)))
5605 Clobbers.push_back(*ClobberOrErr);
5606 else
5607 return ClobberOrErr.takeError();
5608
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00005609 }
5610
5611 SmallVector<StringLiteral *, 4> Constraints;
5612 for (unsigned I = 0, E = S->getNumOutputs(); I != E; I++) {
Balazs Keri3b30d652018-10-19 13:32:20 +00005613 if (auto OutputOrErr = import(S->getOutputConstraintLiteral(I)))
5614 Constraints.push_back(*OutputOrErr);
5615 else
5616 return OutputOrErr.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00005617 }
5618
5619 for (unsigned I = 0, E = S->getNumInputs(); I != E; I++) {
Balazs Keri3b30d652018-10-19 13:32:20 +00005620 if (auto InputOrErr = import(S->getInputConstraintLiteral(I)))
5621 Constraints.push_back(*InputOrErr);
5622 else
5623 return InputOrErr.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00005624 }
5625
5626 SmallVector<Expr *, 4> Exprs(S->getNumOutputs() + S->getNumInputs());
Balazs Keri3b30d652018-10-19 13:32:20 +00005627 if (Error Err = ImportContainerChecked(S->outputs(), Exprs))
5628 return std::move(Err);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00005629
Balazs Keri3b30d652018-10-19 13:32:20 +00005630 if (Error Err = ImportArrayChecked(
5631 S->inputs(), Exprs.begin() + S->getNumOutputs()))
5632 return std::move(Err);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00005633
Balazs Keri3b30d652018-10-19 13:32:20 +00005634 ExpectedSLoc AsmLocOrErr = import(S->getAsmLoc());
5635 if (!AsmLocOrErr)
5636 return AsmLocOrErr.takeError();
5637 auto AsmStrOrErr = import(S->getAsmString());
5638 if (!AsmStrOrErr)
5639 return AsmStrOrErr.takeError();
5640 ExpectedSLoc RParenLocOrErr = import(S->getRParenLoc());
5641 if (!RParenLocOrErr)
5642 return RParenLocOrErr.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00005643
5644 return new (Importer.getToContext()) GCCAsmStmt(
Balazs Keri3b30d652018-10-19 13:32:20 +00005645 Importer.getToContext(),
5646 *AsmLocOrErr,
5647 S->isSimple(),
5648 S->isVolatile(),
5649 S->getNumOutputs(),
5650 S->getNumInputs(),
5651 Names.data(),
5652 Constraints.data(),
5653 Exprs.data(),
5654 *AsmStrOrErr,
5655 S->getNumClobbers(),
5656 Clobbers.data(),
5657 *RParenLocOrErr);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00005658}
5659
Balazs Keri3b30d652018-10-19 13:32:20 +00005660ExpectedStmt ASTNodeImporter::VisitDeclStmt(DeclStmt *S) {
5661 auto Imp = importSeq(S->getDeclGroup(), S->getBeginLoc(), S->getEndLoc());
5662 if (!Imp)
5663 return Imp.takeError();
5664
5665 DeclGroupRef ToDG;
5666 SourceLocation ToBeginLoc, ToEndLoc;
5667 std::tie(ToDG, ToBeginLoc, ToEndLoc) = *Imp;
5668
5669 return new (Importer.getToContext()) DeclStmt(ToDG, ToBeginLoc, ToEndLoc);
Sean Callanan59721b32015-04-28 18:41:46 +00005670}
5671
Balazs Keri3b30d652018-10-19 13:32:20 +00005672ExpectedStmt ASTNodeImporter::VisitNullStmt(NullStmt *S) {
5673 ExpectedSLoc ToSemiLocOrErr = import(S->getSemiLoc());
5674 if (!ToSemiLocOrErr)
5675 return ToSemiLocOrErr.takeError();
5676 return new (Importer.getToContext()) NullStmt(
5677 *ToSemiLocOrErr, S->hasLeadingEmptyMacro());
Sean Callanan59721b32015-04-28 18:41:46 +00005678}
5679
Balazs Keri3b30d652018-10-19 13:32:20 +00005680ExpectedStmt ASTNodeImporter::VisitCompoundStmt(CompoundStmt *S) {
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00005681 SmallVector<Stmt *, 8> ToStmts(S->size());
Aleksei Sidorina693b372016-09-28 10:16:56 +00005682
Balazs Keri3b30d652018-10-19 13:32:20 +00005683 if (Error Err = ImportContainerChecked(S->body(), ToStmts))
5684 return std::move(Err);
Sean Callanan8bca9962016-03-28 21:43:01 +00005685
Balazs Keri3b30d652018-10-19 13:32:20 +00005686 ExpectedSLoc ToLBracLocOrErr = import(S->getLBracLoc());
5687 if (!ToLBracLocOrErr)
5688 return ToLBracLocOrErr.takeError();
5689
5690 ExpectedSLoc ToRBracLocOrErr = import(S->getRBracLoc());
5691 if (!ToRBracLocOrErr)
5692 return ToRBracLocOrErr.takeError();
5693
5694 return CompoundStmt::Create(
5695 Importer.getToContext(), ToStmts,
5696 *ToLBracLocOrErr, *ToRBracLocOrErr);
Sean Callanan59721b32015-04-28 18:41:46 +00005697}
5698
Balazs Keri3b30d652018-10-19 13:32:20 +00005699ExpectedStmt ASTNodeImporter::VisitCaseStmt(CaseStmt *S) {
5700 auto Imp = importSeq(
5701 S->getLHS(), S->getRHS(), S->getSubStmt(), S->getCaseLoc(),
5702 S->getEllipsisLoc(), S->getColonLoc());
5703 if (!Imp)
5704 return Imp.takeError();
5705
5706 Expr *ToLHS, *ToRHS;
5707 Stmt *ToSubStmt;
5708 SourceLocation ToCaseLoc, ToEllipsisLoc, ToColonLoc;
5709 std::tie(ToLHS, ToRHS, ToSubStmt, ToCaseLoc, ToEllipsisLoc, ToColonLoc) =
5710 *Imp;
5711
Bruno Ricci5b30571752018-10-28 12:30:53 +00005712 auto *ToStmt = CaseStmt::Create(Importer.getToContext(), ToLHS, ToRHS,
5713 ToCaseLoc, ToEllipsisLoc, ToColonLoc);
Gabor Horvath480892b2017-10-18 09:25:18 +00005714 ToStmt->setSubStmt(ToSubStmt);
Balazs Keri3b30d652018-10-19 13:32:20 +00005715
Gabor Horvath480892b2017-10-18 09:25:18 +00005716 return ToStmt;
Sean Callanan59721b32015-04-28 18:41:46 +00005717}
5718
Balazs Keri3b30d652018-10-19 13:32:20 +00005719ExpectedStmt ASTNodeImporter::VisitDefaultStmt(DefaultStmt *S) {
5720 auto Imp = importSeq(S->getDefaultLoc(), S->getColonLoc(), S->getSubStmt());
5721 if (!Imp)
5722 return Imp.takeError();
5723
5724 SourceLocation ToDefaultLoc, ToColonLoc;
5725 Stmt *ToSubStmt;
5726 std::tie(ToDefaultLoc, ToColonLoc, ToSubStmt) = *Imp;
5727
5728 return new (Importer.getToContext()) DefaultStmt(
5729 ToDefaultLoc, ToColonLoc, ToSubStmt);
Sean Callanan59721b32015-04-28 18:41:46 +00005730}
5731
Balazs Keri3b30d652018-10-19 13:32:20 +00005732ExpectedStmt ASTNodeImporter::VisitLabelStmt(LabelStmt *S) {
5733 auto Imp = importSeq(S->getIdentLoc(), S->getDecl(), S->getSubStmt());
5734 if (!Imp)
5735 return Imp.takeError();
5736
5737 SourceLocation ToIdentLoc;
5738 LabelDecl *ToLabelDecl;
5739 Stmt *ToSubStmt;
5740 std::tie(ToIdentLoc, ToLabelDecl, ToSubStmt) = *Imp;
5741
5742 return new (Importer.getToContext()) LabelStmt(
5743 ToIdentLoc, ToLabelDecl, ToSubStmt);
Sean Callanan59721b32015-04-28 18:41:46 +00005744}
5745
Balazs Keri3b30d652018-10-19 13:32:20 +00005746ExpectedStmt ASTNodeImporter::VisitAttributedStmt(AttributedStmt *S) {
5747 ExpectedSLoc ToAttrLocOrErr = import(S->getAttrLoc());
5748 if (!ToAttrLocOrErr)
5749 return ToAttrLocOrErr.takeError();
Sean Callanan59721b32015-04-28 18:41:46 +00005750 ArrayRef<const Attr*> FromAttrs(S->getAttrs());
5751 SmallVector<const Attr *, 1> ToAttrs(FromAttrs.size());
Balazs Keri3b30d652018-10-19 13:32:20 +00005752 if (Error Err = ImportContainerChecked(FromAttrs, ToAttrs))
5753 return std::move(Err);
5754 ExpectedStmt ToSubStmtOrErr = import(S->getSubStmt());
5755 if (!ToSubStmtOrErr)
5756 return ToSubStmtOrErr.takeError();
5757
5758 return AttributedStmt::Create(
5759 Importer.getToContext(), *ToAttrLocOrErr, ToAttrs, *ToSubStmtOrErr);
Sean Callanan59721b32015-04-28 18:41:46 +00005760}
5761
Balazs Keri3b30d652018-10-19 13:32:20 +00005762ExpectedStmt ASTNodeImporter::VisitIfStmt(IfStmt *S) {
5763 auto Imp = importSeq(
5764 S->getIfLoc(), S->getInit(), S->getConditionVariable(), S->getCond(),
5765 S->getThen(), S->getElseLoc(), S->getElse());
5766 if (!Imp)
5767 return Imp.takeError();
5768
5769 SourceLocation ToIfLoc, ToElseLoc;
5770 Stmt *ToInit, *ToThen, *ToElse;
5771 VarDecl *ToConditionVariable;
5772 Expr *ToCond;
5773 std::tie(
5774 ToIfLoc, ToInit, ToConditionVariable, ToCond, ToThen, ToElseLoc, ToElse) =
5775 *Imp;
5776
Bruno Riccib1cc94b2018-10-27 21:12:20 +00005777 return IfStmt::Create(Importer.getToContext(), ToIfLoc, S->isConstexpr(),
5778 ToInit, ToConditionVariable, ToCond, ToThen, ToElseLoc,
5779 ToElse);
Sean Callanan59721b32015-04-28 18:41:46 +00005780}
5781
Balazs Keri3b30d652018-10-19 13:32:20 +00005782ExpectedStmt ASTNodeImporter::VisitSwitchStmt(SwitchStmt *S) {
5783 auto Imp = importSeq(
5784 S->getInit(), S->getConditionVariable(), S->getCond(),
5785 S->getBody(), S->getSwitchLoc());
5786 if (!Imp)
5787 return Imp.takeError();
5788
5789 Stmt *ToInit, *ToBody;
5790 VarDecl *ToConditionVariable;
5791 Expr *ToCond;
5792 SourceLocation ToSwitchLoc;
5793 std::tie(ToInit, ToConditionVariable, ToCond, ToBody, ToSwitchLoc) = *Imp;
5794
Bruno Riccie2806f82018-10-29 16:12:37 +00005795 auto *ToStmt = SwitchStmt::Create(Importer.getToContext(), ToInit,
5796 ToConditionVariable, ToCond);
Sean Callanan59721b32015-04-28 18:41:46 +00005797 ToStmt->setBody(ToBody);
Balazs Keri3b30d652018-10-19 13:32:20 +00005798 ToStmt->setSwitchLoc(ToSwitchLoc);
5799
Sean Callanan59721b32015-04-28 18:41:46 +00005800 // Now we have to re-chain the cases.
5801 SwitchCase *LastChainedSwitchCase = nullptr;
5802 for (SwitchCase *SC = S->getSwitchCaseList(); SC != nullptr;
5803 SC = SC->getNextSwitchCase()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00005804 Expected<SwitchCase *> ToSCOrErr = import(SC);
5805 if (!ToSCOrErr)
5806 return ToSCOrErr.takeError();
Sean Callanan59721b32015-04-28 18:41:46 +00005807 if (LastChainedSwitchCase)
Balazs Keri3b30d652018-10-19 13:32:20 +00005808 LastChainedSwitchCase->setNextSwitchCase(*ToSCOrErr);
Sean Callanan59721b32015-04-28 18:41:46 +00005809 else
Balazs Keri3b30d652018-10-19 13:32:20 +00005810 ToStmt->setSwitchCaseList(*ToSCOrErr);
5811 LastChainedSwitchCase = *ToSCOrErr;
Sean Callanan59721b32015-04-28 18:41:46 +00005812 }
Balazs Keri3b30d652018-10-19 13:32:20 +00005813
Sean Callanan59721b32015-04-28 18:41:46 +00005814 return ToStmt;
5815}
5816
Balazs Keri3b30d652018-10-19 13:32:20 +00005817ExpectedStmt ASTNodeImporter::VisitWhileStmt(WhileStmt *S) {
5818 auto Imp = importSeq(
5819 S->getConditionVariable(), S->getCond(), S->getBody(), S->getWhileLoc());
5820 if (!Imp)
5821 return Imp.takeError();
5822
5823 VarDecl *ToConditionVariable;
5824 Expr *ToCond;
5825 Stmt *ToBody;
5826 SourceLocation ToWhileLoc;
5827 std::tie(ToConditionVariable, ToCond, ToBody, ToWhileLoc) = *Imp;
5828
Bruno Riccibacf7512018-10-30 13:42:41 +00005829 return WhileStmt::Create(Importer.getToContext(), ToConditionVariable, ToCond,
5830 ToBody, ToWhileLoc);
Sean Callanan59721b32015-04-28 18:41:46 +00005831}
5832
Balazs Keri3b30d652018-10-19 13:32:20 +00005833ExpectedStmt ASTNodeImporter::VisitDoStmt(DoStmt *S) {
5834 auto Imp = importSeq(
5835 S->getBody(), S->getCond(), S->getDoLoc(), S->getWhileLoc(),
5836 S->getRParenLoc());
5837 if (!Imp)
5838 return Imp.takeError();
5839
5840 Stmt *ToBody;
5841 Expr *ToCond;
5842 SourceLocation ToDoLoc, ToWhileLoc, ToRParenLoc;
5843 std::tie(ToBody, ToCond, ToDoLoc, ToWhileLoc, ToRParenLoc) = *Imp;
5844
5845 return new (Importer.getToContext()) DoStmt(
5846 ToBody, ToCond, ToDoLoc, ToWhileLoc, ToRParenLoc);
Sean Callanan59721b32015-04-28 18:41:46 +00005847}
5848
Balazs Keri3b30d652018-10-19 13:32:20 +00005849ExpectedStmt ASTNodeImporter::VisitForStmt(ForStmt *S) {
5850 auto Imp = importSeq(
5851 S->getInit(), S->getCond(), S->getConditionVariable(), S->getInc(),
5852 S->getBody(), S->getForLoc(), S->getLParenLoc(), S->getRParenLoc());
5853 if (!Imp)
5854 return Imp.takeError();
5855
5856 Stmt *ToInit;
5857 Expr *ToCond, *ToInc;
5858 VarDecl *ToConditionVariable;
5859 Stmt *ToBody;
5860 SourceLocation ToForLoc, ToLParenLoc, ToRParenLoc;
5861 std::tie(
5862 ToInit, ToCond, ToConditionVariable, ToInc, ToBody, ToForLoc,
5863 ToLParenLoc, ToRParenLoc) = *Imp;
5864
5865 return new (Importer.getToContext()) ForStmt(
5866 Importer.getToContext(),
5867 ToInit, ToCond, ToConditionVariable, ToInc, ToBody, ToForLoc, ToLParenLoc,
5868 ToRParenLoc);
Sean Callanan59721b32015-04-28 18:41:46 +00005869}
5870
Balazs Keri3b30d652018-10-19 13:32:20 +00005871ExpectedStmt ASTNodeImporter::VisitGotoStmt(GotoStmt *S) {
5872 auto Imp = importSeq(S->getLabel(), S->getGotoLoc(), S->getLabelLoc());
5873 if (!Imp)
5874 return Imp.takeError();
5875
5876 LabelDecl *ToLabel;
5877 SourceLocation ToGotoLoc, ToLabelLoc;
5878 std::tie(ToLabel, ToGotoLoc, ToLabelLoc) = *Imp;
5879
5880 return new (Importer.getToContext()) GotoStmt(
5881 ToLabel, ToGotoLoc, ToLabelLoc);
Sean Callanan59721b32015-04-28 18:41:46 +00005882}
5883
Balazs Keri3b30d652018-10-19 13:32:20 +00005884ExpectedStmt ASTNodeImporter::VisitIndirectGotoStmt(IndirectGotoStmt *S) {
5885 auto Imp = importSeq(S->getGotoLoc(), S->getStarLoc(), S->getTarget());
5886 if (!Imp)
5887 return Imp.takeError();
5888
5889 SourceLocation ToGotoLoc, ToStarLoc;
5890 Expr *ToTarget;
5891 std::tie(ToGotoLoc, ToStarLoc, ToTarget) = *Imp;
5892
5893 return new (Importer.getToContext()) IndirectGotoStmt(
5894 ToGotoLoc, ToStarLoc, ToTarget);
Sean Callanan59721b32015-04-28 18:41:46 +00005895}
5896
Balazs Keri3b30d652018-10-19 13:32:20 +00005897ExpectedStmt ASTNodeImporter::VisitContinueStmt(ContinueStmt *S) {
5898 ExpectedSLoc ToContinueLocOrErr = import(S->getContinueLoc());
5899 if (!ToContinueLocOrErr)
5900 return ToContinueLocOrErr.takeError();
5901 return new (Importer.getToContext()) ContinueStmt(*ToContinueLocOrErr);
Sean Callanan59721b32015-04-28 18:41:46 +00005902}
5903
Balazs Keri3b30d652018-10-19 13:32:20 +00005904ExpectedStmt ASTNodeImporter::VisitBreakStmt(BreakStmt *S) {
5905 auto ToBreakLocOrErr = import(S->getBreakLoc());
5906 if (!ToBreakLocOrErr)
5907 return ToBreakLocOrErr.takeError();
5908 return new (Importer.getToContext()) BreakStmt(*ToBreakLocOrErr);
Sean Callanan59721b32015-04-28 18:41:46 +00005909}
5910
Balazs Keri3b30d652018-10-19 13:32:20 +00005911ExpectedStmt ASTNodeImporter::VisitReturnStmt(ReturnStmt *S) {
5912 auto Imp = importSeq(
5913 S->getReturnLoc(), S->getRetValue(), S->getNRVOCandidate());
5914 if (!Imp)
5915 return Imp.takeError();
5916
5917 SourceLocation ToReturnLoc;
5918 Expr *ToRetValue;
5919 const VarDecl *ToNRVOCandidate;
5920 std::tie(ToReturnLoc, ToRetValue, ToNRVOCandidate) = *Imp;
5921
Bruno Ricci023b1d12018-10-30 14:40:49 +00005922 return ReturnStmt::Create(Importer.getToContext(), ToReturnLoc, ToRetValue,
5923 ToNRVOCandidate);
Sean Callanan59721b32015-04-28 18:41:46 +00005924}
5925
Balazs Keri3b30d652018-10-19 13:32:20 +00005926ExpectedStmt ASTNodeImporter::VisitCXXCatchStmt(CXXCatchStmt *S) {
5927 auto Imp = importSeq(
5928 S->getCatchLoc(), S->getExceptionDecl(), S->getHandlerBlock());
5929 if (!Imp)
5930 return Imp.takeError();
5931
5932 SourceLocation ToCatchLoc;
5933 VarDecl *ToExceptionDecl;
5934 Stmt *ToHandlerBlock;
5935 std::tie(ToCatchLoc, ToExceptionDecl, ToHandlerBlock) = *Imp;
5936
5937 return new (Importer.getToContext()) CXXCatchStmt (
5938 ToCatchLoc, ToExceptionDecl, ToHandlerBlock);
Sean Callanan59721b32015-04-28 18:41:46 +00005939}
5940
Balazs Keri3b30d652018-10-19 13:32:20 +00005941ExpectedStmt ASTNodeImporter::VisitCXXTryStmt(CXXTryStmt *S) {
5942 ExpectedSLoc ToTryLocOrErr = import(S->getTryLoc());
5943 if (!ToTryLocOrErr)
5944 return ToTryLocOrErr.takeError();
5945
5946 ExpectedStmt ToTryBlockOrErr = import(S->getTryBlock());
5947 if (!ToTryBlockOrErr)
5948 return ToTryBlockOrErr.takeError();
5949
Sean Callanan59721b32015-04-28 18:41:46 +00005950 SmallVector<Stmt *, 1> ToHandlers(S->getNumHandlers());
5951 for (unsigned HI = 0, HE = S->getNumHandlers(); HI != HE; ++HI) {
5952 CXXCatchStmt *FromHandler = S->getHandler(HI);
Balazs Keri3b30d652018-10-19 13:32:20 +00005953 if (auto ToHandlerOrErr = import(FromHandler))
5954 ToHandlers[HI] = *ToHandlerOrErr;
Sean Callanan59721b32015-04-28 18:41:46 +00005955 else
Balazs Keri3b30d652018-10-19 13:32:20 +00005956 return ToHandlerOrErr.takeError();
Sean Callanan59721b32015-04-28 18:41:46 +00005957 }
Balazs Keri3b30d652018-10-19 13:32:20 +00005958
5959 return CXXTryStmt::Create(
5960 Importer.getToContext(), *ToTryLocOrErr,*ToTryBlockOrErr, ToHandlers);
Sean Callanan59721b32015-04-28 18:41:46 +00005961}
5962
Balazs Keri3b30d652018-10-19 13:32:20 +00005963ExpectedStmt ASTNodeImporter::VisitCXXForRangeStmt(CXXForRangeStmt *S) {
5964 auto Imp1 = importSeq(
5965 S->getInit(), S->getRangeStmt(), S->getBeginStmt(), S->getEndStmt(),
5966 S->getCond(), S->getInc(), S->getLoopVarStmt(), S->getBody());
5967 if (!Imp1)
5968 return Imp1.takeError();
5969 auto Imp2 = importSeq(
5970 S->getForLoc(), S->getCoawaitLoc(), S->getColonLoc(), S->getRParenLoc());
5971 if (!Imp2)
5972 return Imp2.takeError();
5973
5974 DeclStmt *ToRangeStmt, *ToBeginStmt, *ToEndStmt, *ToLoopVarStmt;
5975 Expr *ToCond, *ToInc;
5976 Stmt *ToInit, *ToBody;
5977 std::tie(
5978 ToInit, ToRangeStmt, ToBeginStmt, ToEndStmt, ToCond, ToInc, ToLoopVarStmt,
5979 ToBody) = *Imp1;
5980 SourceLocation ToForLoc, ToCoawaitLoc, ToColonLoc, ToRParenLoc;
5981 std::tie(ToForLoc, ToCoawaitLoc, ToColonLoc, ToRParenLoc) = *Imp2;
5982
5983 return new (Importer.getToContext()) CXXForRangeStmt(
5984 ToInit, ToRangeStmt, ToBeginStmt, ToEndStmt, ToCond, ToInc, ToLoopVarStmt,
5985 ToBody, ToForLoc, ToCoawaitLoc, ToColonLoc, ToRParenLoc);
Sean Callanan59721b32015-04-28 18:41:46 +00005986}
5987
Balazs Keri3b30d652018-10-19 13:32:20 +00005988ExpectedStmt
5989ASTNodeImporter::VisitObjCForCollectionStmt(ObjCForCollectionStmt *S) {
5990 auto Imp = importSeq(
5991 S->getElement(), S->getCollection(), S->getBody(),
5992 S->getForLoc(), S->getRParenLoc());
5993 if (!Imp)
5994 return Imp.takeError();
5995
5996 Stmt *ToElement, *ToBody;
5997 Expr *ToCollection;
5998 SourceLocation ToForLoc, ToRParenLoc;
5999 std::tie(ToElement, ToCollection, ToBody, ToForLoc, ToRParenLoc) = *Imp;
6000
6001 return new (Importer.getToContext()) ObjCForCollectionStmt(ToElement,
6002 ToCollection,
6003 ToBody,
6004 ToForLoc,
Sean Callanan59721b32015-04-28 18:41:46 +00006005 ToRParenLoc);
6006}
6007
Balazs Keri3b30d652018-10-19 13:32:20 +00006008ExpectedStmt ASTNodeImporter::VisitObjCAtCatchStmt(ObjCAtCatchStmt *S) {
6009 auto Imp = importSeq(
6010 S->getAtCatchLoc(), S->getRParenLoc(), S->getCatchParamDecl(),
6011 S->getCatchBody());
6012 if (!Imp)
6013 return Imp.takeError();
6014
6015 SourceLocation ToAtCatchLoc, ToRParenLoc;
6016 VarDecl *ToCatchParamDecl;
6017 Stmt *ToCatchBody;
6018 std::tie(ToAtCatchLoc, ToRParenLoc, ToCatchParamDecl, ToCatchBody) = *Imp;
6019
6020 return new (Importer.getToContext()) ObjCAtCatchStmt (
6021 ToAtCatchLoc, ToRParenLoc, ToCatchParamDecl, ToCatchBody);
Sean Callanan59721b32015-04-28 18:41:46 +00006022}
6023
Balazs Keri3b30d652018-10-19 13:32:20 +00006024ExpectedStmt ASTNodeImporter::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
6025 ExpectedSLoc ToAtFinallyLocOrErr = import(S->getAtFinallyLoc());
6026 if (!ToAtFinallyLocOrErr)
6027 return ToAtFinallyLocOrErr.takeError();
6028 ExpectedStmt ToAtFinallyStmtOrErr = import(S->getFinallyBody());
6029 if (!ToAtFinallyStmtOrErr)
6030 return ToAtFinallyStmtOrErr.takeError();
6031 return new (Importer.getToContext()) ObjCAtFinallyStmt(*ToAtFinallyLocOrErr,
6032 *ToAtFinallyStmtOrErr);
Sean Callanan59721b32015-04-28 18:41:46 +00006033}
6034
Balazs Keri3b30d652018-10-19 13:32:20 +00006035ExpectedStmt ASTNodeImporter::VisitObjCAtTryStmt(ObjCAtTryStmt *S) {
6036 auto Imp = importSeq(
6037 S->getAtTryLoc(), S->getTryBody(), S->getFinallyStmt());
6038 if (!Imp)
6039 return Imp.takeError();
6040
6041 SourceLocation ToAtTryLoc;
6042 Stmt *ToTryBody, *ToFinallyStmt;
6043 std::tie(ToAtTryLoc, ToTryBody, ToFinallyStmt) = *Imp;
6044
Sean Callanan59721b32015-04-28 18:41:46 +00006045 SmallVector<Stmt *, 1> ToCatchStmts(S->getNumCatchStmts());
6046 for (unsigned CI = 0, CE = S->getNumCatchStmts(); CI != CE; ++CI) {
6047 ObjCAtCatchStmt *FromCatchStmt = S->getCatchStmt(CI);
Balazs Keri3b30d652018-10-19 13:32:20 +00006048 if (ExpectedStmt ToCatchStmtOrErr = import(FromCatchStmt))
6049 ToCatchStmts[CI] = *ToCatchStmtOrErr;
Sean Callanan59721b32015-04-28 18:41:46 +00006050 else
Balazs Keri3b30d652018-10-19 13:32:20 +00006051 return ToCatchStmtOrErr.takeError();
Sean Callanan59721b32015-04-28 18:41:46 +00006052 }
Balazs Keri3b30d652018-10-19 13:32:20 +00006053
Sean Callanan59721b32015-04-28 18:41:46 +00006054 return ObjCAtTryStmt::Create(Importer.getToContext(),
Balazs Keri3b30d652018-10-19 13:32:20 +00006055 ToAtTryLoc, ToTryBody,
Sean Callanan59721b32015-04-28 18:41:46 +00006056 ToCatchStmts.begin(), ToCatchStmts.size(),
Balazs Keri3b30d652018-10-19 13:32:20 +00006057 ToFinallyStmt);
Sean Callanan59721b32015-04-28 18:41:46 +00006058}
6059
Balazs Keri3b30d652018-10-19 13:32:20 +00006060ExpectedStmt ASTNodeImporter::VisitObjCAtSynchronizedStmt
Sean Callanan59721b32015-04-28 18:41:46 +00006061 (ObjCAtSynchronizedStmt *S) {
Balazs Keri3b30d652018-10-19 13:32:20 +00006062 auto Imp = importSeq(
6063 S->getAtSynchronizedLoc(), S->getSynchExpr(), S->getSynchBody());
6064 if (!Imp)
6065 return Imp.takeError();
6066
6067 SourceLocation ToAtSynchronizedLoc;
6068 Expr *ToSynchExpr;
6069 Stmt *ToSynchBody;
6070 std::tie(ToAtSynchronizedLoc, ToSynchExpr, ToSynchBody) = *Imp;
6071
Sean Callanan59721b32015-04-28 18:41:46 +00006072 return new (Importer.getToContext()) ObjCAtSynchronizedStmt(
6073 ToAtSynchronizedLoc, ToSynchExpr, ToSynchBody);
6074}
6075
Balazs Keri3b30d652018-10-19 13:32:20 +00006076ExpectedStmt ASTNodeImporter::VisitObjCAtThrowStmt(ObjCAtThrowStmt *S) {
6077 ExpectedSLoc ToThrowLocOrErr = import(S->getThrowLoc());
6078 if (!ToThrowLocOrErr)
6079 return ToThrowLocOrErr.takeError();
6080 ExpectedExpr ToThrowExprOrErr = import(S->getThrowExpr());
6081 if (!ToThrowExprOrErr)
6082 return ToThrowExprOrErr.takeError();
6083 return new (Importer.getToContext()) ObjCAtThrowStmt(
6084 *ToThrowLocOrErr, *ToThrowExprOrErr);
Sean Callanan59721b32015-04-28 18:41:46 +00006085}
6086
Balazs Keri3b30d652018-10-19 13:32:20 +00006087ExpectedStmt ASTNodeImporter::VisitObjCAutoreleasePoolStmt(
6088 ObjCAutoreleasePoolStmt *S) {
6089 ExpectedSLoc ToAtLocOrErr = import(S->getAtLoc());
6090 if (!ToAtLocOrErr)
6091 return ToAtLocOrErr.takeError();
6092 ExpectedStmt ToSubStmtOrErr = import(S->getSubStmt());
6093 if (!ToSubStmtOrErr)
6094 return ToSubStmtOrErr.takeError();
6095 return new (Importer.getToContext()) ObjCAutoreleasePoolStmt(*ToAtLocOrErr,
6096 *ToSubStmtOrErr);
Douglas Gregor7eeb5972010-02-11 19:21:55 +00006097}
6098
6099//----------------------------------------------------------------------------
6100// Import Expressions
6101//----------------------------------------------------------------------------
Balazs Keri3b30d652018-10-19 13:32:20 +00006102ExpectedStmt ASTNodeImporter::VisitExpr(Expr *E) {
Stephen Kellyf2ceec42018-08-09 21:08:08 +00006103 Importer.FromDiag(E->getBeginLoc(), diag::err_unsupported_ast_node)
6104 << E->getStmtClassName();
Balazs Keri3b30d652018-10-19 13:32:20 +00006105 return make_error<ImportError>(ImportError::UnsupportedConstruct);
Douglas Gregor7eeb5972010-02-11 19:21:55 +00006106}
6107
Balazs Keri3b30d652018-10-19 13:32:20 +00006108ExpectedStmt ASTNodeImporter::VisitVAArgExpr(VAArgExpr *E) {
6109 auto Imp = importSeq(
6110 E->getBuiltinLoc(), E->getSubExpr(), E->getWrittenTypeInfo(),
6111 E->getRParenLoc(), E->getType());
6112 if (!Imp)
6113 return Imp.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006114
Balazs Keri3b30d652018-10-19 13:32:20 +00006115 SourceLocation ToBuiltinLoc, ToRParenLoc;
6116 Expr *ToSubExpr;
6117 TypeSourceInfo *ToWrittenTypeInfo;
6118 QualType ToType;
6119 std::tie(ToBuiltinLoc, ToSubExpr, ToWrittenTypeInfo, ToRParenLoc, ToType) =
6120 *Imp;
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006121
6122 return new (Importer.getToContext()) VAArgExpr(
Balazs Keri3b30d652018-10-19 13:32:20 +00006123 ToBuiltinLoc, ToSubExpr, ToWrittenTypeInfo, ToRParenLoc, ToType,
6124 E->isMicrosoftABI());
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006125}
6126
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006127
Balazs Keri3b30d652018-10-19 13:32:20 +00006128ExpectedStmt ASTNodeImporter::VisitGNUNullExpr(GNUNullExpr *E) {
6129 ExpectedType TypeOrErr = import(E->getType());
6130 if (!TypeOrErr)
6131 return TypeOrErr.takeError();
6132
6133 ExpectedSLoc BeginLocOrErr = import(E->getBeginLoc());
6134 if (!BeginLocOrErr)
6135 return BeginLocOrErr.takeError();
6136
6137 return new (Importer.getToContext()) GNUNullExpr(*TypeOrErr, *BeginLocOrErr);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006138}
6139
Balazs Keri3b30d652018-10-19 13:32:20 +00006140ExpectedStmt ASTNodeImporter::VisitPredefinedExpr(PredefinedExpr *E) {
6141 auto Imp = importSeq(
6142 E->getBeginLoc(), E->getType(), E->getFunctionName());
6143 if (!Imp)
6144 return Imp.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006145
Balazs Keri3b30d652018-10-19 13:32:20 +00006146 SourceLocation ToBeginLoc;
6147 QualType ToType;
6148 StringLiteral *ToFunctionName;
6149 std::tie(ToBeginLoc, ToType, ToFunctionName) = *Imp;
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006150
Bruno Ricci17ff0262018-10-27 19:21:19 +00006151 return PredefinedExpr::Create(Importer.getToContext(), ToBeginLoc, ToType,
6152 E->getIdentKind(), ToFunctionName);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006153}
6154
Balazs Keri3b30d652018-10-19 13:32:20 +00006155ExpectedStmt ASTNodeImporter::VisitDeclRefExpr(DeclRefExpr *E) {
6156 auto Imp = importSeq(
6157 E->getQualifierLoc(), E->getTemplateKeywordLoc(), E->getDecl(),
6158 E->getLocation(), E->getType());
6159 if (!Imp)
6160 return Imp.takeError();
Chandler Carruth8d26bb02011-05-01 23:48:14 +00006161
Balazs Keri3b30d652018-10-19 13:32:20 +00006162 NestedNameSpecifierLoc ToQualifierLoc;
6163 SourceLocation ToTemplateKeywordLoc, ToLocation;
6164 ValueDecl *ToDecl;
6165 QualType ToType;
6166 std::tie(ToQualifierLoc, ToTemplateKeywordLoc, ToDecl, ToLocation, ToType) =
6167 *Imp;
6168
6169 NamedDecl *ToFoundD = nullptr;
Chandler Carruth8d26bb02011-05-01 23:48:14 +00006170 if (E->getDecl() != E->getFoundDecl()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00006171 auto FoundDOrErr = import(E->getFoundDecl());
6172 if (!FoundDOrErr)
6173 return FoundDOrErr.takeError();
6174 ToFoundD = *FoundDOrErr;
Chandler Carruth8d26bb02011-05-01 23:48:14 +00006175 }
Fangrui Song6907ce22018-07-30 19:24:48 +00006176
Aleksei Sidorina693b372016-09-28 10:16:56 +00006177 TemplateArgumentListInfo ToTAInfo;
Balazs Keri3b30d652018-10-19 13:32:20 +00006178 TemplateArgumentListInfo *ToResInfo = nullptr;
Aleksei Sidorina693b372016-09-28 10:16:56 +00006179 if (E->hasExplicitTemplateArgs()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00006180 if (Error Err =
6181 ImportTemplateArgumentListInfo(E->template_arguments(), ToTAInfo))
6182 return std::move(Err);
6183 ToResInfo = &ToTAInfo;
Aleksei Sidorina693b372016-09-28 10:16:56 +00006184 }
6185
Balazs Keri3b30d652018-10-19 13:32:20 +00006186 auto *ToE = DeclRefExpr::Create(
6187 Importer.getToContext(), ToQualifierLoc, ToTemplateKeywordLoc, ToDecl,
6188 E->refersToEnclosingVariableOrCapture(), ToLocation, ToType,
6189 E->getValueKind(), ToFoundD, ToResInfo);
Abramo Bagnara635ed24e2011-10-05 07:56:41 +00006190 if (E->hadMultipleCandidates())
Balazs Keri3b30d652018-10-19 13:32:20 +00006191 ToE->setHadMultipleCandidates(true);
6192 return ToE;
Douglas Gregor52f820e2010-02-19 01:17:02 +00006193}
6194
Balazs Keri3b30d652018-10-19 13:32:20 +00006195ExpectedStmt ASTNodeImporter::VisitImplicitValueInitExpr(ImplicitValueInitExpr *E) {
6196 ExpectedType TypeOrErr = import(E->getType());
6197 if (!TypeOrErr)
6198 return TypeOrErr.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006199
Balazs Keri3b30d652018-10-19 13:32:20 +00006200 return new (Importer.getToContext()) ImplicitValueInitExpr(*TypeOrErr);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006201}
6202
Balazs Keri3b30d652018-10-19 13:32:20 +00006203ExpectedStmt ASTNodeImporter::VisitDesignatedInitExpr(DesignatedInitExpr *E) {
6204 ExpectedExpr ToInitOrErr = import(E->getInit());
6205 if (!ToInitOrErr)
6206 return ToInitOrErr.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006207
Balazs Keri3b30d652018-10-19 13:32:20 +00006208 ExpectedSLoc ToEqualOrColonLocOrErr = import(E->getEqualOrColonLoc());
6209 if (!ToEqualOrColonLocOrErr)
6210 return ToEqualOrColonLocOrErr.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006211
Balazs Keri3b30d652018-10-19 13:32:20 +00006212 SmallVector<Expr *, 4> ToIndexExprs(E->getNumSubExprs() - 1);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006213 // List elements from the second, the first is Init itself
Balazs Keri3b30d652018-10-19 13:32:20 +00006214 for (unsigned I = 1, N = E->getNumSubExprs(); I < N; I++) {
6215 if (ExpectedExpr ToArgOrErr = import(E->getSubExpr(I)))
6216 ToIndexExprs[I - 1] = *ToArgOrErr;
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006217 else
Balazs Keri3b30d652018-10-19 13:32:20 +00006218 return ToArgOrErr.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006219 }
6220
Balazs Keri3b30d652018-10-19 13:32:20 +00006221 SmallVector<Designator, 4> ToDesignators(E->size());
6222 if (Error Err = ImportContainerChecked(E->designators(), ToDesignators))
6223 return std::move(Err);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006224
6225 return DesignatedInitExpr::Create(
Balazs Keri3b30d652018-10-19 13:32:20 +00006226 Importer.getToContext(), ToDesignators,
6227 ToIndexExprs, *ToEqualOrColonLocOrErr,
6228 E->usesGNUSyntax(), *ToInitOrErr);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006229}
6230
Balazs Keri3b30d652018-10-19 13:32:20 +00006231ExpectedStmt
6232ASTNodeImporter::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E) {
6233 ExpectedType ToTypeOrErr = import(E->getType());
6234 if (!ToTypeOrErr)
6235 return ToTypeOrErr.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006236
Balazs Keri3b30d652018-10-19 13:32:20 +00006237 ExpectedSLoc ToLocationOrErr = import(E->getLocation());
6238 if (!ToLocationOrErr)
6239 return ToLocationOrErr.takeError();
6240
6241 return new (Importer.getToContext()) CXXNullPtrLiteralExpr(
6242 *ToTypeOrErr, *ToLocationOrErr);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006243}
6244
Balazs Keri3b30d652018-10-19 13:32:20 +00006245ExpectedStmt ASTNodeImporter::VisitIntegerLiteral(IntegerLiteral *E) {
6246 ExpectedType ToTypeOrErr = import(E->getType());
6247 if (!ToTypeOrErr)
6248 return ToTypeOrErr.takeError();
Douglas Gregor7eeb5972010-02-11 19:21:55 +00006249
Balazs Keri3b30d652018-10-19 13:32:20 +00006250 ExpectedSLoc ToLocationOrErr = import(E->getLocation());
6251 if (!ToLocationOrErr)
6252 return ToLocationOrErr.takeError();
6253
6254 return IntegerLiteral::Create(
6255 Importer.getToContext(), E->getValue(), *ToTypeOrErr, *ToLocationOrErr);
Douglas Gregor7eeb5972010-02-11 19:21:55 +00006256}
6257
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006258
Balazs Keri3b30d652018-10-19 13:32:20 +00006259ExpectedStmt ASTNodeImporter::VisitFloatingLiteral(FloatingLiteral *E) {
6260 ExpectedType ToTypeOrErr = import(E->getType());
6261 if (!ToTypeOrErr)
6262 return ToTypeOrErr.takeError();
6263
6264 ExpectedSLoc ToLocationOrErr = import(E->getLocation());
6265 if (!ToLocationOrErr)
6266 return ToLocationOrErr.takeError();
6267
6268 return FloatingLiteral::Create(
6269 Importer.getToContext(), E->getValue(), E->isExact(),
6270 *ToTypeOrErr, *ToLocationOrErr);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006271}
6272
Balazs Keri3b30d652018-10-19 13:32:20 +00006273ExpectedStmt ASTNodeImporter::VisitImaginaryLiteral(ImaginaryLiteral *E) {
6274 auto ToTypeOrErr = import(E->getType());
6275 if (!ToTypeOrErr)
6276 return ToTypeOrErr.takeError();
Gabor Martonbf7f18b2018-08-09 12:18:07 +00006277
Balazs Keri3b30d652018-10-19 13:32:20 +00006278 ExpectedExpr ToSubExprOrErr = import(E->getSubExpr());
6279 if (!ToSubExprOrErr)
6280 return ToSubExprOrErr.takeError();
Gabor Martonbf7f18b2018-08-09 12:18:07 +00006281
Balazs Keri3b30d652018-10-19 13:32:20 +00006282 return new (Importer.getToContext()) ImaginaryLiteral(
6283 *ToSubExprOrErr, *ToTypeOrErr);
Gabor Martonbf7f18b2018-08-09 12:18:07 +00006284}
6285
Balazs Keri3b30d652018-10-19 13:32:20 +00006286ExpectedStmt ASTNodeImporter::VisitCharacterLiteral(CharacterLiteral *E) {
6287 ExpectedType ToTypeOrErr = import(E->getType());
6288 if (!ToTypeOrErr)
6289 return ToTypeOrErr.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00006290
Balazs Keri3b30d652018-10-19 13:32:20 +00006291 ExpectedSLoc ToLocationOrErr = import(E->getLocation());
6292 if (!ToLocationOrErr)
6293 return ToLocationOrErr.takeError();
6294
6295 return new (Importer.getToContext()) CharacterLiteral(
6296 E->getValue(), E->getKind(), *ToTypeOrErr, *ToLocationOrErr);
Douglas Gregor623421d2010-02-18 02:21:22 +00006297}
6298
Balazs Keri3b30d652018-10-19 13:32:20 +00006299ExpectedStmt ASTNodeImporter::VisitStringLiteral(StringLiteral *E) {
6300 ExpectedType ToTypeOrErr = import(E->getType());
6301 if (!ToTypeOrErr)
6302 return ToTypeOrErr.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006303
Balazs Keri3b30d652018-10-19 13:32:20 +00006304 SmallVector<SourceLocation, 4> ToLocations(E->getNumConcatenated());
6305 if (Error Err = ImportArrayChecked(
6306 E->tokloc_begin(), E->tokloc_end(), ToLocations.begin()))
6307 return std::move(Err);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006308
Balazs Keri3b30d652018-10-19 13:32:20 +00006309 return StringLiteral::Create(
6310 Importer.getToContext(), E->getBytes(), E->getKind(), E->isPascal(),
6311 *ToTypeOrErr, ToLocations.data(), ToLocations.size());
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006312}
6313
Balazs Keri3b30d652018-10-19 13:32:20 +00006314ExpectedStmt ASTNodeImporter::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {
6315 auto Imp = importSeq(
6316 E->getLParenLoc(), E->getTypeSourceInfo(), E->getType(),
6317 E->getInitializer());
6318 if (!Imp)
6319 return Imp.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006320
Balazs Keri3b30d652018-10-19 13:32:20 +00006321 SourceLocation ToLParenLoc;
6322 TypeSourceInfo *ToTypeSourceInfo;
6323 QualType ToType;
6324 Expr *ToInitializer;
6325 std::tie(ToLParenLoc, ToTypeSourceInfo, ToType, ToInitializer) = *Imp;
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006326
6327 return new (Importer.getToContext()) CompoundLiteralExpr(
Balazs Keri3b30d652018-10-19 13:32:20 +00006328 ToLParenLoc, ToTypeSourceInfo, ToType, E->getValueKind(),
6329 ToInitializer, E->isFileScope());
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006330}
6331
Balazs Keri3b30d652018-10-19 13:32:20 +00006332ExpectedStmt ASTNodeImporter::VisitAtomicExpr(AtomicExpr *E) {
6333 auto Imp = importSeq(
6334 E->getBuiltinLoc(), E->getType(), E->getRParenLoc());
6335 if (!Imp)
6336 return Imp.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006337
Balazs Keri3b30d652018-10-19 13:32:20 +00006338 SourceLocation ToBuiltinLoc, ToRParenLoc;
6339 QualType ToType;
6340 std::tie(ToBuiltinLoc, ToType, ToRParenLoc) = *Imp;
6341
6342 SmallVector<Expr *, 6> ToExprs(E->getNumSubExprs());
6343 if (Error Err = ImportArrayChecked(
6344 E->getSubExprs(), E->getSubExprs() + E->getNumSubExprs(),
6345 ToExprs.begin()))
6346 return std::move(Err);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006347
6348 return new (Importer.getToContext()) AtomicExpr(
Balazs Keri3b30d652018-10-19 13:32:20 +00006349 ToBuiltinLoc, ToExprs, ToType, E->getOp(), ToRParenLoc);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006350}
6351
Balazs Keri3b30d652018-10-19 13:32:20 +00006352ExpectedStmt ASTNodeImporter::VisitAddrLabelExpr(AddrLabelExpr *E) {
6353 auto Imp = importSeq(
6354 E->getAmpAmpLoc(), E->getLabelLoc(), E->getLabel(), E->getType());
6355 if (!Imp)
6356 return Imp.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006357
Balazs Keri3b30d652018-10-19 13:32:20 +00006358 SourceLocation ToAmpAmpLoc, ToLabelLoc;
6359 LabelDecl *ToLabel;
6360 QualType ToType;
6361 std::tie(ToAmpAmpLoc, ToLabelLoc, ToLabel, ToType) = *Imp;
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006362
6363 return new (Importer.getToContext()) AddrLabelExpr(
Balazs Keri3b30d652018-10-19 13:32:20 +00006364 ToAmpAmpLoc, ToLabelLoc, ToLabel, ToType);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006365}
6366
Bill Wendling8003edc2018-11-09 00:41:36 +00006367ExpectedStmt ASTNodeImporter::VisitConstantExpr(ConstantExpr *E) {
6368 auto Imp = importSeq(E->getSubExpr());
6369 if (!Imp)
6370 return Imp.takeError();
6371
6372 Expr *ToSubExpr;
6373 std::tie(ToSubExpr) = *Imp;
6374
Fangrui Song407659a2018-11-30 23:41:18 +00006375 return ConstantExpr::Create(Importer.getToContext(), ToSubExpr);
Bill Wendling8003edc2018-11-09 00:41:36 +00006376}
6377
Balazs Keri3b30d652018-10-19 13:32:20 +00006378ExpectedStmt ASTNodeImporter::VisitParenExpr(ParenExpr *E) {
6379 auto Imp = importSeq(E->getLParen(), E->getRParen(), E->getSubExpr());
6380 if (!Imp)
6381 return Imp.takeError();
6382
6383 SourceLocation ToLParen, ToRParen;
6384 Expr *ToSubExpr;
6385 std::tie(ToLParen, ToRParen, ToSubExpr) = *Imp;
Craig Topper36250ad2014-05-12 05:36:57 +00006386
Fangrui Song6907ce22018-07-30 19:24:48 +00006387 return new (Importer.getToContext())
Balazs Keri3b30d652018-10-19 13:32:20 +00006388 ParenExpr(ToLParen, ToRParen, ToSubExpr);
Douglas Gregorc74247e2010-02-19 01:07:06 +00006389}
6390
Balazs Keri3b30d652018-10-19 13:32:20 +00006391ExpectedStmt ASTNodeImporter::VisitParenListExpr(ParenListExpr *E) {
6392 SmallVector<Expr *, 4> ToExprs(E->getNumExprs());
6393 if (Error Err = ImportContainerChecked(E->exprs(), ToExprs))
6394 return std::move(Err);
6395
6396 ExpectedSLoc ToLParenLocOrErr = import(E->getLParenLoc());
6397 if (!ToLParenLocOrErr)
6398 return ToLParenLocOrErr.takeError();
6399
6400 ExpectedSLoc ToRParenLocOrErr = import(E->getRParenLoc());
6401 if (!ToRParenLocOrErr)
6402 return ToRParenLocOrErr.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006403
Bruno Riccif49e1ca2018-11-20 16:20:40 +00006404 return ParenListExpr::Create(Importer.getToContext(), *ToLParenLocOrErr,
6405 ToExprs, *ToRParenLocOrErr);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006406}
6407
Balazs Keri3b30d652018-10-19 13:32:20 +00006408ExpectedStmt ASTNodeImporter::VisitStmtExpr(StmtExpr *E) {
6409 auto Imp = importSeq(
6410 E->getSubStmt(), E->getType(), E->getLParenLoc(), E->getRParenLoc());
6411 if (!Imp)
6412 return Imp.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006413
Balazs Keri3b30d652018-10-19 13:32:20 +00006414 CompoundStmt *ToSubStmt;
6415 QualType ToType;
6416 SourceLocation ToLParenLoc, ToRParenLoc;
6417 std::tie(ToSubStmt, ToType, ToLParenLoc, ToRParenLoc) = *Imp;
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006418
Balazs Keri3b30d652018-10-19 13:32:20 +00006419 return new (Importer.getToContext()) StmtExpr(
6420 ToSubStmt, ToType, ToLParenLoc, ToRParenLoc);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006421}
6422
Balazs Keri3b30d652018-10-19 13:32:20 +00006423ExpectedStmt ASTNodeImporter::VisitUnaryOperator(UnaryOperator *E) {
6424 auto Imp = importSeq(
6425 E->getSubExpr(), E->getType(), E->getOperatorLoc());
6426 if (!Imp)
6427 return Imp.takeError();
Douglas Gregorc74247e2010-02-19 01:07:06 +00006428
Balazs Keri3b30d652018-10-19 13:32:20 +00006429 Expr *ToSubExpr;
6430 QualType ToType;
6431 SourceLocation ToOperatorLoc;
6432 std::tie(ToSubExpr, ToType, ToOperatorLoc) = *Imp;
Craig Topper36250ad2014-05-12 05:36:57 +00006433
Aaron Ballmana5038552018-01-09 13:07:03 +00006434 return new (Importer.getToContext()) UnaryOperator(
Balazs Keri3b30d652018-10-19 13:32:20 +00006435 ToSubExpr, E->getOpcode(), ToType, E->getValueKind(), E->getObjectKind(),
6436 ToOperatorLoc, E->canOverflow());
Douglas Gregorc74247e2010-02-19 01:07:06 +00006437}
6438
Balazs Keri3b30d652018-10-19 13:32:20 +00006439ExpectedStmt
Aaron Ballmana5038552018-01-09 13:07:03 +00006440ASTNodeImporter::VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *E) {
Balazs Keri3b30d652018-10-19 13:32:20 +00006441 auto Imp = importSeq(E->getType(), E->getOperatorLoc(), E->getRParenLoc());
6442 if (!Imp)
6443 return Imp.takeError();
6444
6445 QualType ToType;
6446 SourceLocation ToOperatorLoc, ToRParenLoc;
6447 std::tie(ToType, ToOperatorLoc, ToRParenLoc) = *Imp;
Fangrui Song6907ce22018-07-30 19:24:48 +00006448
Douglas Gregord8552cd2010-02-19 01:24:23 +00006449 if (E->isArgumentType()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00006450 Expected<TypeSourceInfo *> ToArgumentTypeInfoOrErr =
6451 import(E->getArgumentTypeInfo());
6452 if (!ToArgumentTypeInfoOrErr)
6453 return ToArgumentTypeInfoOrErr.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00006454
Balazs Keri3b30d652018-10-19 13:32:20 +00006455 return new (Importer.getToContext()) UnaryExprOrTypeTraitExpr(
6456 E->getKind(), *ToArgumentTypeInfoOrErr, ToType, ToOperatorLoc,
6457 ToRParenLoc);
Douglas Gregord8552cd2010-02-19 01:24:23 +00006458 }
Fangrui Song6907ce22018-07-30 19:24:48 +00006459
Balazs Keri3b30d652018-10-19 13:32:20 +00006460 ExpectedExpr ToArgumentExprOrErr = import(E->getArgumentExpr());
6461 if (!ToArgumentExprOrErr)
6462 return ToArgumentExprOrErr.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(), *ToArgumentExprOrErr, ToType, ToOperatorLoc, ToRParenLoc);
Douglas Gregord8552cd2010-02-19 01:24:23 +00006466}
6467
Balazs Keri3b30d652018-10-19 13:32:20 +00006468ExpectedStmt ASTNodeImporter::VisitBinaryOperator(BinaryOperator *E) {
6469 auto Imp = importSeq(
6470 E->getLHS(), E->getRHS(), E->getType(), E->getOperatorLoc());
6471 if (!Imp)
6472 return Imp.takeError();
Douglas Gregorc74247e2010-02-19 01:07:06 +00006473
Balazs Keri3b30d652018-10-19 13:32:20 +00006474 Expr *ToLHS, *ToRHS;
6475 QualType ToType;
6476 SourceLocation ToOperatorLoc;
6477 std::tie(ToLHS, ToRHS, ToType, ToOperatorLoc) = *Imp;
Craig Topper36250ad2014-05-12 05:36:57 +00006478
Balazs Keri3b30d652018-10-19 13:32:20 +00006479 return new (Importer.getToContext()) BinaryOperator(
6480 ToLHS, ToRHS, E->getOpcode(), ToType, E->getValueKind(),
6481 E->getObjectKind(), ToOperatorLoc, E->getFPFeatures());
Douglas Gregorc74247e2010-02-19 01:07:06 +00006482}
6483
Balazs Keri3b30d652018-10-19 13:32:20 +00006484ExpectedStmt ASTNodeImporter::VisitConditionalOperator(ConditionalOperator *E) {
6485 auto Imp = importSeq(
6486 E->getCond(), E->getQuestionLoc(), E->getLHS(), E->getColonLoc(),
6487 E->getRHS(), E->getType());
6488 if (!Imp)
6489 return Imp.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006490
Balazs Keri3b30d652018-10-19 13:32:20 +00006491 Expr *ToCond, *ToLHS, *ToRHS;
6492 SourceLocation ToQuestionLoc, ToColonLoc;
6493 QualType ToType;
6494 std::tie(ToCond, ToQuestionLoc, ToLHS, ToColonLoc, ToRHS, ToType) = *Imp;
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006495
6496 return new (Importer.getToContext()) ConditionalOperator(
Balazs Keri3b30d652018-10-19 13:32:20 +00006497 ToCond, ToQuestionLoc, ToLHS, ToColonLoc, ToRHS, ToType,
6498 E->getValueKind(), E->getObjectKind());
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006499}
6500
Balazs Keri3b30d652018-10-19 13:32:20 +00006501ExpectedStmt ASTNodeImporter::VisitBinaryConditionalOperator(
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006502 BinaryConditionalOperator *E) {
Balazs Keri3b30d652018-10-19 13:32:20 +00006503 auto Imp = importSeq(
6504 E->getCommon(), E->getOpaqueValue(), E->getCond(), E->getTrueExpr(),
6505 E->getFalseExpr(), E->getQuestionLoc(), E->getColonLoc(), E->getType());
6506 if (!Imp)
6507 return Imp.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006508
Balazs Keri3b30d652018-10-19 13:32:20 +00006509 Expr *ToCommon, *ToCond, *ToTrueExpr, *ToFalseExpr;
6510 OpaqueValueExpr *ToOpaqueValue;
6511 SourceLocation ToQuestionLoc, ToColonLoc;
6512 QualType ToType;
6513 std::tie(
6514 ToCommon, ToOpaqueValue, ToCond, ToTrueExpr, ToFalseExpr, ToQuestionLoc,
6515 ToColonLoc, ToType) = *Imp;
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006516
6517 return new (Importer.getToContext()) BinaryConditionalOperator(
Balazs Keri3b30d652018-10-19 13:32:20 +00006518 ToCommon, ToOpaqueValue, ToCond, ToTrueExpr, ToFalseExpr,
6519 ToQuestionLoc, ToColonLoc, ToType, E->getValueKind(),
6520 E->getObjectKind());
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006521}
6522
Balazs Keri3b30d652018-10-19 13:32:20 +00006523ExpectedStmt ASTNodeImporter::VisitArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
6524 auto Imp = importSeq(
6525 E->getBeginLoc(), E->getQueriedTypeSourceInfo(),
6526 E->getDimensionExpression(), E->getEndLoc(), E->getType());
6527 if (!Imp)
6528 return Imp.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00006529
Balazs Keri3b30d652018-10-19 13:32:20 +00006530 SourceLocation ToBeginLoc, ToEndLoc;
6531 TypeSourceInfo *ToQueriedTypeSourceInfo;
6532 Expr *ToDimensionExpression;
6533 QualType ToType;
6534 std::tie(
6535 ToBeginLoc, ToQueriedTypeSourceInfo, ToDimensionExpression, ToEndLoc,
6536 ToType) = *Imp;
Aleksei Sidorina693b372016-09-28 10:16:56 +00006537
6538 return new (Importer.getToContext()) ArrayTypeTraitExpr(
Balazs Keri3b30d652018-10-19 13:32:20 +00006539 ToBeginLoc, E->getTrait(), ToQueriedTypeSourceInfo, E->getValue(),
6540 ToDimensionExpression, ToEndLoc, ToType);
Aleksei Sidorina693b372016-09-28 10:16:56 +00006541}
6542
Balazs Keri3b30d652018-10-19 13:32:20 +00006543ExpectedStmt ASTNodeImporter::VisitExpressionTraitExpr(ExpressionTraitExpr *E) {
6544 auto Imp = importSeq(
6545 E->getBeginLoc(), E->getQueriedExpression(), E->getEndLoc(), E->getType());
6546 if (!Imp)
6547 return Imp.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00006548
Balazs Keri3b30d652018-10-19 13:32:20 +00006549 SourceLocation ToBeginLoc, ToEndLoc;
6550 Expr *ToQueriedExpression;
6551 QualType ToType;
6552 std::tie(ToBeginLoc, ToQueriedExpression, ToEndLoc, ToType) = *Imp;
Aleksei Sidorina693b372016-09-28 10:16:56 +00006553
6554 return new (Importer.getToContext()) ExpressionTraitExpr(
Balazs Keri3b30d652018-10-19 13:32:20 +00006555 ToBeginLoc, E->getTrait(), ToQueriedExpression, E->getValue(),
6556 ToEndLoc, ToType);
Aleksei Sidorina693b372016-09-28 10:16:56 +00006557}
6558
Balazs Keri3b30d652018-10-19 13:32:20 +00006559ExpectedStmt ASTNodeImporter::VisitOpaqueValueExpr(OpaqueValueExpr *E) {
6560 auto Imp = importSeq(
6561 E->getLocation(), E->getType(), E->getSourceExpr());
6562 if (!Imp)
6563 return Imp.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006564
Balazs Keri3b30d652018-10-19 13:32:20 +00006565 SourceLocation ToLocation;
6566 QualType ToType;
6567 Expr *ToSourceExpr;
6568 std::tie(ToLocation, ToType, ToSourceExpr) = *Imp;
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006569
6570 return new (Importer.getToContext()) OpaqueValueExpr(
Balazs Keri3b30d652018-10-19 13:32:20 +00006571 ToLocation, ToType, E->getValueKind(), E->getObjectKind(), ToSourceExpr);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006572}
6573
Balazs Keri3b30d652018-10-19 13:32:20 +00006574ExpectedStmt ASTNodeImporter::VisitArraySubscriptExpr(ArraySubscriptExpr *E) {
6575 auto Imp = importSeq(
6576 E->getLHS(), E->getRHS(), E->getType(), E->getRBracketLoc());
6577 if (!Imp)
6578 return Imp.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00006579
Balazs Keri3b30d652018-10-19 13:32:20 +00006580 Expr *ToLHS, *ToRHS;
6581 SourceLocation ToRBracketLoc;
6582 QualType ToType;
6583 std::tie(ToLHS, ToRHS, ToType, ToRBracketLoc) = *Imp;
Aleksei Sidorina693b372016-09-28 10:16:56 +00006584
6585 return new (Importer.getToContext()) ArraySubscriptExpr(
Balazs Keri3b30d652018-10-19 13:32:20 +00006586 ToLHS, ToRHS, ToType, E->getValueKind(), E->getObjectKind(),
6587 ToRBracketLoc);
Aleksei Sidorina693b372016-09-28 10:16:56 +00006588}
6589
Balazs Keri3b30d652018-10-19 13:32:20 +00006590ExpectedStmt
6591ASTNodeImporter::VisitCompoundAssignOperator(CompoundAssignOperator *E) {
6592 auto Imp = importSeq(
6593 E->getLHS(), E->getRHS(), E->getType(), E->getComputationLHSType(),
6594 E->getComputationResultType(), E->getOperatorLoc());
6595 if (!Imp)
6596 return Imp.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00006597
Balazs Keri3b30d652018-10-19 13:32:20 +00006598 Expr *ToLHS, *ToRHS;
6599 QualType ToType, ToComputationLHSType, ToComputationResultType;
6600 SourceLocation ToOperatorLoc;
6601 std::tie(ToLHS, ToRHS, ToType, ToComputationLHSType, ToComputationResultType,
6602 ToOperatorLoc) = *Imp;
Craig Topper36250ad2014-05-12 05:36:57 +00006603
Balazs Keri3b30d652018-10-19 13:32:20 +00006604 return new (Importer.getToContext()) CompoundAssignOperator(
6605 ToLHS, ToRHS, E->getOpcode(), ToType, E->getValueKind(),
6606 E->getObjectKind(), ToComputationLHSType, ToComputationResultType,
6607 ToOperatorLoc, E->getFPFeatures());
Douglas Gregorc74247e2010-02-19 01:07:06 +00006608}
6609
Balazs Keri3b30d652018-10-19 13:32:20 +00006610Expected<CXXCastPath>
6611ASTNodeImporter::ImportCastPath(CastExpr *CE) {
6612 CXXCastPath Path;
Aleksei Sidorina693b372016-09-28 10:16:56 +00006613 for (auto I = CE->path_begin(), E = CE->path_end(); I != E; ++I) {
Balazs Keri3b30d652018-10-19 13:32:20 +00006614 if (auto SpecOrErr = import(*I))
6615 Path.push_back(*SpecOrErr);
Aleksei Sidorina693b372016-09-28 10:16:56 +00006616 else
Balazs Keri3b30d652018-10-19 13:32:20 +00006617 return SpecOrErr.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00006618 }
Balazs Keri3b30d652018-10-19 13:32:20 +00006619 return Path;
John McCallcf142162010-08-07 06:22:56 +00006620}
6621
Balazs Keri3b30d652018-10-19 13:32:20 +00006622ExpectedStmt ASTNodeImporter::VisitImplicitCastExpr(ImplicitCastExpr *E) {
6623 ExpectedType ToTypeOrErr = import(E->getType());
6624 if (!ToTypeOrErr)
6625 return ToTypeOrErr.takeError();
Douglas Gregor98c10182010-02-12 22:17:39 +00006626
Balazs Keri3b30d652018-10-19 13:32:20 +00006627 ExpectedExpr ToSubExprOrErr = import(E->getSubExpr());
6628 if (!ToSubExprOrErr)
6629 return ToSubExprOrErr.takeError();
John McCallcf142162010-08-07 06:22:56 +00006630
Balazs Keri3b30d652018-10-19 13:32:20 +00006631 Expected<CXXCastPath> ToBasePathOrErr = ImportCastPath(E);
6632 if (!ToBasePathOrErr)
6633 return ToBasePathOrErr.takeError();
John McCallcf142162010-08-07 06:22:56 +00006634
Balazs Keri3b30d652018-10-19 13:32:20 +00006635 return ImplicitCastExpr::Create(
6636 Importer.getToContext(), *ToTypeOrErr, E->getCastKind(), *ToSubExprOrErr,
6637 &(*ToBasePathOrErr), E->getValueKind());
Douglas Gregor98c10182010-02-12 22:17:39 +00006638}
6639
Balazs Keri3b30d652018-10-19 13:32:20 +00006640ExpectedStmt ASTNodeImporter::VisitExplicitCastExpr(ExplicitCastExpr *E) {
6641 auto Imp1 = importSeq(
6642 E->getType(), E->getSubExpr(), E->getTypeInfoAsWritten());
6643 if (!Imp1)
6644 return Imp1.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00006645
Balazs Keri3b30d652018-10-19 13:32:20 +00006646 QualType ToType;
6647 Expr *ToSubExpr;
6648 TypeSourceInfo *ToTypeInfoAsWritten;
6649 std::tie(ToType, ToSubExpr, ToTypeInfoAsWritten) = *Imp1;
Douglas Gregor5481d322010-02-19 01:32:14 +00006650
Balazs Keri3b30d652018-10-19 13:32:20 +00006651 Expected<CXXCastPath> ToBasePathOrErr = ImportCastPath(E);
6652 if (!ToBasePathOrErr)
6653 return ToBasePathOrErr.takeError();
6654 CXXCastPath *ToBasePath = &(*ToBasePathOrErr);
John McCallcf142162010-08-07 06:22:56 +00006655
Aleksei Sidorina693b372016-09-28 10:16:56 +00006656 switch (E->getStmtClass()) {
6657 case Stmt::CStyleCastExprClass: {
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00006658 auto *CCE = cast<CStyleCastExpr>(E);
Balazs Keri3b30d652018-10-19 13:32:20 +00006659 ExpectedSLoc ToLParenLocOrErr = import(CCE->getLParenLoc());
6660 if (!ToLParenLocOrErr)
6661 return ToLParenLocOrErr.takeError();
6662 ExpectedSLoc ToRParenLocOrErr = import(CCE->getRParenLoc());
6663 if (!ToRParenLocOrErr)
6664 return ToRParenLocOrErr.takeError();
6665 return CStyleCastExpr::Create(
6666 Importer.getToContext(), ToType, E->getValueKind(), E->getCastKind(),
6667 ToSubExpr, ToBasePath, ToTypeInfoAsWritten, *ToLParenLocOrErr,
6668 *ToRParenLocOrErr);
Aleksei Sidorina693b372016-09-28 10:16:56 +00006669 }
6670
6671 case Stmt::CXXFunctionalCastExprClass: {
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00006672 auto *FCE = cast<CXXFunctionalCastExpr>(E);
Balazs Keri3b30d652018-10-19 13:32:20 +00006673 ExpectedSLoc ToLParenLocOrErr = import(FCE->getLParenLoc());
6674 if (!ToLParenLocOrErr)
6675 return ToLParenLocOrErr.takeError();
6676 ExpectedSLoc ToRParenLocOrErr = import(FCE->getRParenLoc());
6677 if (!ToRParenLocOrErr)
6678 return ToRParenLocOrErr.takeError();
6679 return CXXFunctionalCastExpr::Create(
6680 Importer.getToContext(), ToType, E->getValueKind(), ToTypeInfoAsWritten,
6681 E->getCastKind(), ToSubExpr, ToBasePath, *ToLParenLocOrErr,
6682 *ToRParenLocOrErr);
Aleksei Sidorina693b372016-09-28 10:16:56 +00006683 }
6684
6685 case Stmt::ObjCBridgedCastExprClass: {
Balazs Keri3b30d652018-10-19 13:32:20 +00006686 auto *OCE = cast<ObjCBridgedCastExpr>(E);
6687 ExpectedSLoc ToLParenLocOrErr = import(OCE->getLParenLoc());
6688 if (!ToLParenLocOrErr)
6689 return ToLParenLocOrErr.takeError();
6690 ExpectedSLoc ToBridgeKeywordLocOrErr = import(OCE->getBridgeKeywordLoc());
6691 if (!ToBridgeKeywordLocOrErr)
6692 return ToBridgeKeywordLocOrErr.takeError();
6693 return new (Importer.getToContext()) ObjCBridgedCastExpr(
6694 *ToLParenLocOrErr, OCE->getBridgeKind(), E->getCastKind(),
6695 *ToBridgeKeywordLocOrErr, ToTypeInfoAsWritten, ToSubExpr);
Aleksei Sidorina693b372016-09-28 10:16:56 +00006696 }
6697 default:
Aleksei Sidorina693b372016-09-28 10:16:56 +00006698 llvm_unreachable("Cast expression of unsupported type!");
Balazs Keri3b30d652018-10-19 13:32:20 +00006699 return make_error<ImportError>(ImportError::UnsupportedConstruct);
Aleksei Sidorina693b372016-09-28 10:16:56 +00006700 }
6701}
6702
Balazs Keri3b30d652018-10-19 13:32:20 +00006703ExpectedStmt ASTNodeImporter::VisitOffsetOfExpr(OffsetOfExpr *E) {
6704 SmallVector<OffsetOfNode, 4> ToNodes;
6705 for (int I = 0, N = E->getNumComponents(); I < N; ++I) {
6706 const OffsetOfNode &FromNode = E->getComponent(I);
Aleksei Sidorina693b372016-09-28 10:16:56 +00006707
Balazs Keri3b30d652018-10-19 13:32:20 +00006708 SourceLocation ToBeginLoc, ToEndLoc;
6709 if (FromNode.getKind() != OffsetOfNode::Base) {
6710 auto Imp = importSeq(FromNode.getBeginLoc(), FromNode.getEndLoc());
6711 if (!Imp)
6712 return Imp.takeError();
6713 std::tie(ToBeginLoc, ToEndLoc) = *Imp;
6714 }
Aleksei Sidorina693b372016-09-28 10:16:56 +00006715
Balazs Keri3b30d652018-10-19 13:32:20 +00006716 switch (FromNode.getKind()) {
Aleksei Sidorina693b372016-09-28 10:16:56 +00006717 case OffsetOfNode::Array:
Balazs Keri3b30d652018-10-19 13:32:20 +00006718 ToNodes.push_back(
6719 OffsetOfNode(ToBeginLoc, FromNode.getArrayExprIndex(), ToEndLoc));
Aleksei Sidorina693b372016-09-28 10:16:56 +00006720 break;
Aleksei Sidorina693b372016-09-28 10:16:56 +00006721 case OffsetOfNode::Base: {
Balazs Keri3b30d652018-10-19 13:32:20 +00006722 auto ToBSOrErr = import(FromNode.getBase());
6723 if (!ToBSOrErr)
6724 return ToBSOrErr.takeError();
6725 ToNodes.push_back(OffsetOfNode(*ToBSOrErr));
Aleksei Sidorina693b372016-09-28 10:16:56 +00006726 break;
6727 }
6728 case OffsetOfNode::Field: {
Balazs Keri3b30d652018-10-19 13:32:20 +00006729 auto ToFieldOrErr = import(FromNode.getField());
6730 if (!ToFieldOrErr)
6731 return ToFieldOrErr.takeError();
6732 ToNodes.push_back(OffsetOfNode(ToBeginLoc, *ToFieldOrErr, ToEndLoc));
Aleksei Sidorina693b372016-09-28 10:16:56 +00006733 break;
6734 }
6735 case OffsetOfNode::Identifier: {
Balazs Keri3b30d652018-10-19 13:32:20 +00006736 IdentifierInfo *ToII = Importer.Import(FromNode.getFieldName());
6737 ToNodes.push_back(OffsetOfNode(ToBeginLoc, ToII, ToEndLoc));
Aleksei Sidorina693b372016-09-28 10:16:56 +00006738 break;
6739 }
6740 }
6741 }
6742
Balazs Keri3b30d652018-10-19 13:32:20 +00006743 SmallVector<Expr *, 4> ToExprs(E->getNumExpressions());
6744 for (int I = 0, N = E->getNumExpressions(); I < N; ++I) {
6745 ExpectedExpr ToIndexExprOrErr = import(E->getIndexExpr(I));
6746 if (!ToIndexExprOrErr)
6747 return ToIndexExprOrErr.takeError();
6748 ToExprs[I] = *ToIndexExprOrErr;
Aleksei Sidorina693b372016-09-28 10:16:56 +00006749 }
6750
Balazs Keri3b30d652018-10-19 13:32:20 +00006751 auto Imp = importSeq(
6752 E->getType(), E->getTypeSourceInfo(), E->getOperatorLoc(),
6753 E->getRParenLoc());
6754 if (!Imp)
6755 return Imp.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00006756
Balazs Keri3b30d652018-10-19 13:32:20 +00006757 QualType ToType;
6758 TypeSourceInfo *ToTypeSourceInfo;
6759 SourceLocation ToOperatorLoc, ToRParenLoc;
6760 std::tie(ToType, ToTypeSourceInfo, ToOperatorLoc, ToRParenLoc) = *Imp;
6761
6762 return OffsetOfExpr::Create(
6763 Importer.getToContext(), ToType, ToOperatorLoc, ToTypeSourceInfo, ToNodes,
6764 ToExprs, ToRParenLoc);
Aleksei Sidorina693b372016-09-28 10:16:56 +00006765}
6766
Balazs Keri3b30d652018-10-19 13:32:20 +00006767ExpectedStmt ASTNodeImporter::VisitCXXNoexceptExpr(CXXNoexceptExpr *E) {
6768 auto Imp = importSeq(
6769 E->getType(), E->getOperand(), E->getBeginLoc(), E->getEndLoc());
6770 if (!Imp)
6771 return Imp.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00006772
Balazs Keri3b30d652018-10-19 13:32:20 +00006773 QualType ToType;
6774 Expr *ToOperand;
6775 SourceLocation ToBeginLoc, ToEndLoc;
6776 std::tie(ToType, ToOperand, ToBeginLoc, ToEndLoc) = *Imp;
Aleksei Sidorina693b372016-09-28 10:16:56 +00006777
Balazs Keri3b30d652018-10-19 13:32:20 +00006778 CanThrowResult ToCanThrow;
Aleksei Sidorina693b372016-09-28 10:16:56 +00006779 if (E->isValueDependent())
Balazs Keri3b30d652018-10-19 13:32:20 +00006780 ToCanThrow = CT_Dependent;
Aleksei Sidorina693b372016-09-28 10:16:56 +00006781 else
Balazs Keri3b30d652018-10-19 13:32:20 +00006782 ToCanThrow = E->getValue() ? CT_Can : CT_Cannot;
Aleksei Sidorina693b372016-09-28 10:16:56 +00006783
Balazs Keri3b30d652018-10-19 13:32:20 +00006784 return new (Importer.getToContext()) CXXNoexceptExpr(
6785 ToType, ToOperand, ToCanThrow, ToBeginLoc, ToEndLoc);
Aleksei Sidorina693b372016-09-28 10:16:56 +00006786}
6787
Balazs Keri3b30d652018-10-19 13:32:20 +00006788ExpectedStmt ASTNodeImporter::VisitCXXThrowExpr(CXXThrowExpr *E) {
6789 auto Imp = importSeq(E->getSubExpr(), E->getType(), E->getThrowLoc());
6790 if (!Imp)
6791 return Imp.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00006792
Balazs Keri3b30d652018-10-19 13:32:20 +00006793 Expr *ToSubExpr;
6794 QualType ToType;
6795 SourceLocation ToThrowLoc;
6796 std::tie(ToSubExpr, ToType, ToThrowLoc) = *Imp;
Aleksei Sidorina693b372016-09-28 10:16:56 +00006797
6798 return new (Importer.getToContext()) CXXThrowExpr(
Balazs Keri3b30d652018-10-19 13:32:20 +00006799 ToSubExpr, ToType, ToThrowLoc, E->isThrownVariableInScope());
Aleksei Sidorina693b372016-09-28 10:16:56 +00006800}
6801
Balazs Keri3b30d652018-10-19 13:32:20 +00006802ExpectedStmt ASTNodeImporter::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
6803 ExpectedSLoc ToUsedLocOrErr = import(E->getUsedLocation());
6804 if (!ToUsedLocOrErr)
6805 return ToUsedLocOrErr.takeError();
6806
6807 auto ToParamOrErr = import(E->getParam());
6808 if (!ToParamOrErr)
6809 return ToParamOrErr.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00006810
6811 return CXXDefaultArgExpr::Create(
Balazs Keri3b30d652018-10-19 13:32:20 +00006812 Importer.getToContext(), *ToUsedLocOrErr, *ToParamOrErr);
Aleksei Sidorina693b372016-09-28 10:16:56 +00006813}
6814
Balazs Keri3b30d652018-10-19 13:32:20 +00006815ExpectedStmt
6816ASTNodeImporter::VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E) {
6817 auto Imp = importSeq(
6818 E->getType(), E->getTypeSourceInfo(), E->getRParenLoc());
6819 if (!Imp)
6820 return Imp.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00006821
Balazs Keri3b30d652018-10-19 13:32:20 +00006822 QualType ToType;
6823 TypeSourceInfo *ToTypeSourceInfo;
6824 SourceLocation ToRParenLoc;
6825 std::tie(ToType, ToTypeSourceInfo, ToRParenLoc) = *Imp;
Aleksei Sidorina693b372016-09-28 10:16:56 +00006826
6827 return new (Importer.getToContext()) CXXScalarValueInitExpr(
Balazs Keri3b30d652018-10-19 13:32:20 +00006828 ToType, ToTypeSourceInfo, ToRParenLoc);
Aleksei Sidorina693b372016-09-28 10:16:56 +00006829}
6830
Balazs Keri3b30d652018-10-19 13:32:20 +00006831ExpectedStmt
6832ASTNodeImporter::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
6833 ExpectedExpr ToSubExprOrErr = import(E->getSubExpr());
6834 if (!ToSubExprOrErr)
6835 return ToSubExprOrErr.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00006836
Balazs Keri3b30d652018-10-19 13:32:20 +00006837 auto ToDtorOrErr = import(E->getTemporary()->getDestructor());
6838 if (!ToDtorOrErr)
6839 return ToDtorOrErr.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00006840
6841 ASTContext &ToCtx = Importer.getToContext();
Balazs Keri3b30d652018-10-19 13:32:20 +00006842 CXXTemporary *Temp = CXXTemporary::Create(ToCtx, *ToDtorOrErr);
6843 return CXXBindTemporaryExpr::Create(ToCtx, Temp, *ToSubExprOrErr);
Aleksei Sidorina693b372016-09-28 10:16:56 +00006844}
6845
Balazs Keri3b30d652018-10-19 13:32:20 +00006846ExpectedStmt
6847ASTNodeImporter::VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E) {
6848 auto Imp = importSeq(
6849 E->getConstructor(), E->getType(), E->getTypeSourceInfo(),
6850 E->getParenOrBraceRange());
6851 if (!Imp)
6852 return Imp.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00006853
Balazs Keri3b30d652018-10-19 13:32:20 +00006854 CXXConstructorDecl *ToConstructor;
6855 QualType ToType;
6856 TypeSourceInfo *ToTypeSourceInfo;
6857 SourceRange ToParenOrBraceRange;
6858 std::tie(ToConstructor, ToType, ToTypeSourceInfo, ToParenOrBraceRange) = *Imp;
Gabor Horvathc78d99a2018-01-27 16:11:45 +00006859
Balazs Keri3b30d652018-10-19 13:32:20 +00006860 SmallVector<Expr *, 8> ToArgs(E->getNumArgs());
6861 if (Error Err = ImportContainerChecked(E->arguments(), ToArgs))
6862 return std::move(Err);
Aleksei Sidorina693b372016-09-28 10:16:56 +00006863
Bruno Ricciddb8f6b2018-12-22 14:39:30 +00006864 return CXXTemporaryObjectExpr::Create(
Balazs Keri3b30d652018-10-19 13:32:20 +00006865 Importer.getToContext(), ToConstructor, ToType, ToTypeSourceInfo, ToArgs,
6866 ToParenOrBraceRange, E->hadMultipleCandidates(),
6867 E->isListInitialization(), E->isStdInitListInitialization(),
6868 E->requiresZeroInitialization());
Aleksei Sidorina693b372016-09-28 10:16:56 +00006869}
6870
Balazs Keri3b30d652018-10-19 13:32:20 +00006871ExpectedStmt
Aleksei Sidorina693b372016-09-28 10:16:56 +00006872ASTNodeImporter::VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *E) {
Balazs Keri3b30d652018-10-19 13:32:20 +00006873 auto Imp = importSeq(
6874 E->getType(), E->GetTemporaryExpr(), E->getExtendingDecl());
6875 if (!Imp)
6876 return Imp.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00006877
Balazs Keri3b30d652018-10-19 13:32:20 +00006878 QualType ToType;
6879 Expr *ToTemporaryExpr;
6880 const ValueDecl *ToExtendingDecl;
6881 std::tie(ToType, ToTemporaryExpr, ToExtendingDecl) = *Imp;
Aleksei Sidorina693b372016-09-28 10:16:56 +00006882
6883 auto *ToMTE = new (Importer.getToContext()) MaterializeTemporaryExpr(
Balazs Keri3b30d652018-10-19 13:32:20 +00006884 ToType, ToTemporaryExpr, E->isBoundToLvalueReference());
Aleksei Sidorina693b372016-09-28 10:16:56 +00006885
6886 // FIXME: Should ManglingNumber get numbers associated with 'to' context?
Balazs Keri3b30d652018-10-19 13:32:20 +00006887 ToMTE->setExtendingDecl(ToExtendingDecl, E->getManglingNumber());
Aleksei Sidorina693b372016-09-28 10:16:56 +00006888 return ToMTE;
6889}
6890
Balazs Keri3b30d652018-10-19 13:32:20 +00006891ExpectedStmt ASTNodeImporter::VisitPackExpansionExpr(PackExpansionExpr *E) {
6892 auto Imp = importSeq(
6893 E->getType(), E->getPattern(), E->getEllipsisLoc());
6894 if (!Imp)
6895 return Imp.takeError();
Gabor Horvath7a91c082017-11-14 11:30:38 +00006896
Balazs Keri3b30d652018-10-19 13:32:20 +00006897 QualType ToType;
6898 Expr *ToPattern;
6899 SourceLocation ToEllipsisLoc;
6900 std::tie(ToType, ToPattern, ToEllipsisLoc) = *Imp;
Gabor Horvath7a91c082017-11-14 11:30:38 +00006901
6902 return new (Importer.getToContext()) PackExpansionExpr(
Balazs Keri3b30d652018-10-19 13:32:20 +00006903 ToType, ToPattern, ToEllipsisLoc, E->getNumExpansions());
Gabor Horvath7a91c082017-11-14 11:30:38 +00006904}
6905
Balazs Keri3b30d652018-10-19 13:32:20 +00006906ExpectedStmt ASTNodeImporter::VisitSizeOfPackExpr(SizeOfPackExpr *E) {
6907 auto Imp = importSeq(
6908 E->getOperatorLoc(), E->getPack(), E->getPackLoc(), E->getRParenLoc());
6909 if (!Imp)
6910 return Imp.takeError();
6911
6912 SourceLocation ToOperatorLoc, ToPackLoc, ToRParenLoc;
6913 NamedDecl *ToPack;
6914 std::tie(ToOperatorLoc, ToPack, ToPackLoc, ToRParenLoc) = *Imp;
Gabor Horvathc78d99a2018-01-27 16:11:45 +00006915
6916 Optional<unsigned> Length;
Gabor Horvathc78d99a2018-01-27 16:11:45 +00006917 if (!E->isValueDependent())
6918 Length = E->getPackLength();
6919
Balazs Keri3b30d652018-10-19 13:32:20 +00006920 SmallVector<TemplateArgument, 8> ToPartialArguments;
Gabor Horvathc78d99a2018-01-27 16:11:45 +00006921 if (E->isPartiallySubstituted()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00006922 if (Error Err = ImportTemplateArguments(
6923 E->getPartialArguments().data(),
6924 E->getPartialArguments().size(),
6925 ToPartialArguments))
6926 return std::move(Err);
Gabor Horvathc78d99a2018-01-27 16:11:45 +00006927 }
6928
6929 return SizeOfPackExpr::Create(
Balazs Keri3b30d652018-10-19 13:32:20 +00006930 Importer.getToContext(), ToOperatorLoc, ToPack, ToPackLoc, ToRParenLoc,
6931 Length, ToPartialArguments);
Gabor Horvathc78d99a2018-01-27 16:11:45 +00006932}
6933
Aleksei Sidorina693b372016-09-28 10:16:56 +00006934
Balazs Keri3b30d652018-10-19 13:32:20 +00006935ExpectedStmt ASTNodeImporter::VisitCXXNewExpr(CXXNewExpr *E) {
6936 auto Imp = importSeq(
6937 E->getOperatorNew(), E->getOperatorDelete(), E->getTypeIdParens(),
6938 E->getArraySize(), E->getInitializer(), E->getType(),
6939 E->getAllocatedTypeSourceInfo(), E->getSourceRange(),
6940 E->getDirectInitRange());
6941 if (!Imp)
6942 return Imp.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00006943
Balazs Keri3b30d652018-10-19 13:32:20 +00006944 FunctionDecl *ToOperatorNew, *ToOperatorDelete;
6945 SourceRange ToTypeIdParens, ToSourceRange, ToDirectInitRange;
6946 Expr *ToArraySize, *ToInitializer;
6947 QualType ToType;
6948 TypeSourceInfo *ToAllocatedTypeSourceInfo;
6949 std::tie(
6950 ToOperatorNew, ToOperatorDelete, ToTypeIdParens, ToArraySize, ToInitializer,
6951 ToType, ToAllocatedTypeSourceInfo, ToSourceRange, ToDirectInitRange) = *Imp;
Aleksei Sidorina693b372016-09-28 10:16:56 +00006952
Balazs Keri3b30d652018-10-19 13:32:20 +00006953 SmallVector<Expr *, 4> ToPlacementArgs(E->getNumPlacementArgs());
6954 if (Error Err =
6955 ImportContainerChecked(E->placement_arguments(), ToPlacementArgs))
6956 return std::move(Err);
Aleksei Sidorina693b372016-09-28 10:16:56 +00006957
Bruno Ricci9b6dfac2019-01-07 15:04:45 +00006958 return CXXNewExpr::Create(
Balazs Keri3b30d652018-10-19 13:32:20 +00006959 Importer.getToContext(), E->isGlobalNew(), ToOperatorNew,
6960 ToOperatorDelete, E->passAlignment(), E->doesUsualArrayDeleteWantSize(),
6961 ToPlacementArgs, ToTypeIdParens, ToArraySize, E->getInitializationStyle(),
6962 ToInitializer, ToType, ToAllocatedTypeSourceInfo, ToSourceRange,
6963 ToDirectInitRange);
Aleksei Sidorina693b372016-09-28 10:16:56 +00006964}
6965
Balazs Keri3b30d652018-10-19 13:32:20 +00006966ExpectedStmt ASTNodeImporter::VisitCXXDeleteExpr(CXXDeleteExpr *E) {
6967 auto Imp = importSeq(
6968 E->getType(), E->getOperatorDelete(), E->getArgument(), E->getBeginLoc());
6969 if (!Imp)
6970 return Imp.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00006971
Balazs Keri3b30d652018-10-19 13:32:20 +00006972 QualType ToType;
6973 FunctionDecl *ToOperatorDelete;
6974 Expr *ToArgument;
6975 SourceLocation ToBeginLoc;
6976 std::tie(ToType, ToOperatorDelete, ToArgument, ToBeginLoc) = *Imp;
Aleksei Sidorina693b372016-09-28 10:16:56 +00006977
6978 return new (Importer.getToContext()) CXXDeleteExpr(
Balazs Keri3b30d652018-10-19 13:32:20 +00006979 ToType, E->isGlobalDelete(), E->isArrayForm(), E->isArrayFormAsWritten(),
6980 E->doesUsualArrayDeleteWantSize(), ToOperatorDelete, ToArgument,
6981 ToBeginLoc);
Douglas Gregor5481d322010-02-19 01:32:14 +00006982}
6983
Balazs Keri3b30d652018-10-19 13:32:20 +00006984ExpectedStmt ASTNodeImporter::VisitCXXConstructExpr(CXXConstructExpr *E) {
6985 auto Imp = importSeq(
6986 E->getType(), E->getLocation(), E->getConstructor(),
6987 E->getParenOrBraceRange());
6988 if (!Imp)
6989 return Imp.takeError();
Sean Callanan59721b32015-04-28 18:41:46 +00006990
Balazs Keri3b30d652018-10-19 13:32:20 +00006991 QualType ToType;
6992 SourceLocation ToLocation;
6993 CXXConstructorDecl *ToConstructor;
6994 SourceRange ToParenOrBraceRange;
6995 std::tie(ToType, ToLocation, ToConstructor, ToParenOrBraceRange) = *Imp;
Sean Callanan59721b32015-04-28 18:41:46 +00006996
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006997 SmallVector<Expr *, 6> ToArgs(E->getNumArgs());
Balazs Keri3b30d652018-10-19 13:32:20 +00006998 if (Error Err = ImportContainerChecked(E->arguments(), ToArgs))
6999 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00007000
Balazs Keri3b30d652018-10-19 13:32:20 +00007001 return CXXConstructExpr::Create(
7002 Importer.getToContext(), ToType, ToLocation, ToConstructor,
7003 E->isElidable(), ToArgs, E->hadMultipleCandidates(),
7004 E->isListInitialization(), E->isStdInitListInitialization(),
7005 E->requiresZeroInitialization(), E->getConstructionKind(),
7006 ToParenOrBraceRange);
Sean Callanan59721b32015-04-28 18:41:46 +00007007}
7008
Balazs Keri3b30d652018-10-19 13:32:20 +00007009ExpectedStmt ASTNodeImporter::VisitExprWithCleanups(ExprWithCleanups *E) {
7010 ExpectedExpr ToSubExprOrErr = import(E->getSubExpr());
7011 if (!ToSubExprOrErr)
7012 return ToSubExprOrErr.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00007013
Balazs Keri3b30d652018-10-19 13:32:20 +00007014 SmallVector<ExprWithCleanups::CleanupObject, 8> ToObjects(E->getNumObjects());
7015 if (Error Err = ImportContainerChecked(E->getObjects(), ToObjects))
7016 return std::move(Err);
Aleksei Sidorina693b372016-09-28 10:16:56 +00007017
Balazs Keri3b30d652018-10-19 13:32:20 +00007018 return ExprWithCleanups::Create(
7019 Importer.getToContext(), *ToSubExprOrErr, E->cleanupsHaveSideEffects(),
7020 ToObjects);
Aleksei Sidorina693b372016-09-28 10:16:56 +00007021}
7022
Balazs Keri3b30d652018-10-19 13:32:20 +00007023ExpectedStmt ASTNodeImporter::VisitCXXMemberCallExpr(CXXMemberCallExpr *E) {
7024 auto Imp = importSeq(
7025 E->getCallee(), E->getType(), E->getRParenLoc());
7026 if (!Imp)
7027 return Imp.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00007028
Balazs Keri3b30d652018-10-19 13:32:20 +00007029 Expr *ToCallee;
7030 QualType ToType;
7031 SourceLocation ToRParenLoc;
7032 std::tie(ToCallee, ToType, ToRParenLoc) = *Imp;
Fangrui Song6907ce22018-07-30 19:24:48 +00007033
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00007034 SmallVector<Expr *, 4> ToArgs(E->getNumArgs());
Balazs Keri3b30d652018-10-19 13:32:20 +00007035 if (Error Err = ImportContainerChecked(E->arguments(), ToArgs))
7036 return std::move(Err);
Sean Callanan8bca9962016-03-28 21:43:01 +00007037
Bruno Riccic5885cf2018-12-21 15:20:32 +00007038 return CXXMemberCallExpr::Create(Importer.getToContext(), ToCallee, ToArgs,
7039 ToType, E->getValueKind(), ToRParenLoc);
Sean Callanan8bca9962016-03-28 21:43:01 +00007040}
7041
Balazs Keri3b30d652018-10-19 13:32:20 +00007042ExpectedStmt ASTNodeImporter::VisitCXXThisExpr(CXXThisExpr *E) {
7043 ExpectedType ToTypeOrErr = import(E->getType());
7044 if (!ToTypeOrErr)
7045 return ToTypeOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00007046
Balazs Keri3b30d652018-10-19 13:32:20 +00007047 ExpectedSLoc ToLocationOrErr = import(E->getLocation());
7048 if (!ToLocationOrErr)
7049 return ToLocationOrErr.takeError();
7050
7051 return new (Importer.getToContext()) CXXThisExpr(
7052 *ToLocationOrErr, *ToTypeOrErr, E->isImplicit());
Sean Callanan8bca9962016-03-28 21:43:01 +00007053}
7054
Balazs Keri3b30d652018-10-19 13:32:20 +00007055ExpectedStmt ASTNodeImporter::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
7056 ExpectedType ToTypeOrErr = import(E->getType());
7057 if (!ToTypeOrErr)
7058 return ToTypeOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00007059
Balazs Keri3b30d652018-10-19 13:32:20 +00007060 ExpectedSLoc ToLocationOrErr = import(E->getLocation());
7061 if (!ToLocationOrErr)
7062 return ToLocationOrErr.takeError();
7063
7064 return new (Importer.getToContext()) CXXBoolLiteralExpr(
7065 E->getValue(), *ToTypeOrErr, *ToLocationOrErr);
Sean Callanan8bca9962016-03-28 21:43:01 +00007066}
7067
Balazs Keri3b30d652018-10-19 13:32:20 +00007068ExpectedStmt ASTNodeImporter::VisitMemberExpr(MemberExpr *E) {
7069 auto Imp1 = importSeq(
7070 E->getBase(), E->getOperatorLoc(), E->getQualifierLoc(),
7071 E->getTemplateKeywordLoc(), E->getMemberDecl(), E->getType());
7072 if (!Imp1)
7073 return Imp1.takeError();
Sean Callanan8bca9962016-03-28 21:43:01 +00007074
Balazs Keri3b30d652018-10-19 13:32:20 +00007075 Expr *ToBase;
7076 SourceLocation ToOperatorLoc, ToTemplateKeywordLoc;
7077 NestedNameSpecifierLoc ToQualifierLoc;
7078 ValueDecl *ToMemberDecl;
7079 QualType ToType;
7080 std::tie(
7081 ToBase, ToOperatorLoc, ToQualifierLoc, ToTemplateKeywordLoc, ToMemberDecl,
7082 ToType) = *Imp1;
Sean Callanan59721b32015-04-28 18:41:46 +00007083
Balazs Keri3b30d652018-10-19 13:32:20 +00007084 auto Imp2 = importSeq(
7085 E->getFoundDecl().getDecl(), E->getMemberNameInfo().getName(),
7086 E->getMemberNameInfo().getLoc(), E->getLAngleLoc(), E->getRAngleLoc());
7087 if (!Imp2)
7088 return Imp2.takeError();
7089 NamedDecl *ToDecl;
7090 DeclarationName ToName;
7091 SourceLocation ToLoc, ToLAngleLoc, ToRAngleLoc;
7092 std::tie(ToDecl, ToName, ToLoc, ToLAngleLoc, ToRAngleLoc) = *Imp2;
Peter Szecsief972522018-05-02 11:52:54 +00007093
7094 DeclAccessPair ToFoundDecl =
7095 DeclAccessPair::make(ToDecl, E->getFoundDecl().getAccess());
Sean Callanan59721b32015-04-28 18:41:46 +00007096
Balazs Keri3b30d652018-10-19 13:32:20 +00007097 DeclarationNameInfo ToMemberNameInfo(ToName, ToLoc);
Sean Callanan59721b32015-04-28 18:41:46 +00007098
7099 if (E->hasExplicitTemplateArgs()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00007100 // FIXME: handle template arguments
7101 return make_error<ImportError>(ImportError::UnsupportedConstruct);
Sean Callanan59721b32015-04-28 18:41:46 +00007102 }
7103
Balazs Keri3b30d652018-10-19 13:32:20 +00007104 return MemberExpr::Create(
7105 Importer.getToContext(), ToBase, E->isArrow(), ToOperatorLoc,
7106 ToQualifierLoc, ToTemplateKeywordLoc, ToMemberDecl, ToFoundDecl,
7107 ToMemberNameInfo, nullptr, ToType, E->getValueKind(), E->getObjectKind());
Sean Callanan59721b32015-04-28 18:41:46 +00007108}
7109
Balazs Keri3b30d652018-10-19 13:32:20 +00007110ExpectedStmt
7111ASTNodeImporter::VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E) {
7112 auto Imp = importSeq(
7113 E->getBase(), E->getOperatorLoc(), E->getQualifierLoc(),
7114 E->getScopeTypeInfo(), E->getColonColonLoc(), E->getTildeLoc());
7115 if (!Imp)
7116 return Imp.takeError();
Aleksei Sidorin60ccb7d2017-11-27 10:30:00 +00007117
Balazs Keri3b30d652018-10-19 13:32:20 +00007118 Expr *ToBase;
7119 SourceLocation ToOperatorLoc, ToColonColonLoc, ToTildeLoc;
7120 NestedNameSpecifierLoc ToQualifierLoc;
7121 TypeSourceInfo *ToScopeTypeInfo;
7122 std::tie(
7123 ToBase, ToOperatorLoc, ToQualifierLoc, ToScopeTypeInfo, ToColonColonLoc,
7124 ToTildeLoc) = *Imp;
Aleksei Sidorin60ccb7d2017-11-27 10:30:00 +00007125
7126 PseudoDestructorTypeStorage Storage;
7127 if (IdentifierInfo *FromII = E->getDestroyedTypeIdentifier()) {
7128 IdentifierInfo *ToII = Importer.Import(FromII);
Balazs Keri3b30d652018-10-19 13:32:20 +00007129 ExpectedSLoc ToDestroyedTypeLocOrErr = import(E->getDestroyedTypeLoc());
7130 if (!ToDestroyedTypeLocOrErr)
7131 return ToDestroyedTypeLocOrErr.takeError();
7132 Storage = PseudoDestructorTypeStorage(ToII, *ToDestroyedTypeLocOrErr);
Aleksei Sidorin60ccb7d2017-11-27 10:30:00 +00007133 } else {
Balazs Keri3b30d652018-10-19 13:32:20 +00007134 if (auto ToTIOrErr = import(E->getDestroyedTypeInfo()))
7135 Storage = PseudoDestructorTypeStorage(*ToTIOrErr);
7136 else
7137 return ToTIOrErr.takeError();
Aleksei Sidorin60ccb7d2017-11-27 10:30:00 +00007138 }
7139
7140 return new (Importer.getToContext()) CXXPseudoDestructorExpr(
Balazs Keri3b30d652018-10-19 13:32:20 +00007141 Importer.getToContext(), ToBase, E->isArrow(), ToOperatorLoc,
7142 ToQualifierLoc, ToScopeTypeInfo, ToColonColonLoc, ToTildeLoc, Storage);
Aleksei Sidorin60ccb7d2017-11-27 10:30:00 +00007143}
7144
Balazs Keri3b30d652018-10-19 13:32:20 +00007145ExpectedStmt ASTNodeImporter::VisitCXXDependentScopeMemberExpr(
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00007146 CXXDependentScopeMemberExpr *E) {
Balazs Keri3b30d652018-10-19 13:32:20 +00007147 auto Imp = importSeq(
7148 E->getType(), E->getOperatorLoc(), E->getQualifierLoc(),
7149 E->getTemplateKeywordLoc(), E->getFirstQualifierFoundInScope());
7150 if (!Imp)
7151 return Imp.takeError();
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00007152
Balazs Keri3b30d652018-10-19 13:32:20 +00007153 QualType ToType;
7154 SourceLocation ToOperatorLoc, ToTemplateKeywordLoc;
7155 NestedNameSpecifierLoc ToQualifierLoc;
7156 NamedDecl *ToFirstQualifierFoundInScope;
7157 std::tie(
7158 ToType, ToOperatorLoc, ToQualifierLoc, ToTemplateKeywordLoc,
7159 ToFirstQualifierFoundInScope) = *Imp;
7160
7161 Expr *ToBase = nullptr;
7162 if (!E->isImplicitAccess()) {
7163 if (ExpectedExpr ToBaseOrErr = import(E->getBase()))
7164 ToBase = *ToBaseOrErr;
7165 else
7166 return ToBaseOrErr.takeError();
7167 }
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00007168
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00007169 TemplateArgumentListInfo ToTAInfo, *ResInfo = nullptr;
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00007170 if (E->hasExplicitTemplateArgs()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00007171 if (Error Err = ImportTemplateArgumentListInfo(
7172 E->getLAngleLoc(), E->getRAngleLoc(), E->template_arguments(),
7173 ToTAInfo))
7174 return std::move(Err);
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00007175 ResInfo = &ToTAInfo;
7176 }
7177
Balazs Keri3b30d652018-10-19 13:32:20 +00007178 auto ToMemberNameInfoOrErr = importSeq(E->getMember(), E->getMemberLoc());
7179 if (!ToMemberNameInfoOrErr)
7180 return ToMemberNameInfoOrErr.takeError();
7181 DeclarationNameInfo ToMemberNameInfo(
7182 std::get<0>(*ToMemberNameInfoOrErr), std::get<1>(*ToMemberNameInfoOrErr));
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00007183 // Import additional name location/type info.
Balazs Keri3b30d652018-10-19 13:32:20 +00007184 if (Error Err = ImportDeclarationNameLoc(
7185 E->getMemberNameInfo(), ToMemberNameInfo))
7186 return std::move(Err);
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00007187
7188 return CXXDependentScopeMemberExpr::Create(
Balazs Keri3b30d652018-10-19 13:32:20 +00007189 Importer.getToContext(), ToBase, ToType, E->isArrow(), ToOperatorLoc,
7190 ToQualifierLoc, ToTemplateKeywordLoc, ToFirstQualifierFoundInScope,
7191 ToMemberNameInfo, ResInfo);
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00007192}
7193
Balazs Keri3b30d652018-10-19 13:32:20 +00007194ExpectedStmt
Peter Szecsice7f3182018-05-07 12:08:27 +00007195ASTNodeImporter::VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E) {
Balazs Keri3b30d652018-10-19 13:32:20 +00007196 auto Imp = importSeq(
7197 E->getQualifierLoc(), E->getTemplateKeywordLoc(), E->getDeclName(),
7198 E->getExprLoc(), E->getLAngleLoc(), E->getRAngleLoc());
7199 if (!Imp)
7200 return Imp.takeError();
Peter Szecsice7f3182018-05-07 12:08:27 +00007201
Balazs Keri3b30d652018-10-19 13:32:20 +00007202 NestedNameSpecifierLoc ToQualifierLoc;
7203 SourceLocation ToTemplateKeywordLoc, ToExprLoc, ToLAngleLoc, ToRAngleLoc;
7204 DeclarationName ToDeclName;
7205 std::tie(
7206 ToQualifierLoc, ToTemplateKeywordLoc, ToDeclName, ToExprLoc,
7207 ToLAngleLoc, ToRAngleLoc) = *Imp;
Peter Szecsice7f3182018-05-07 12:08:27 +00007208
Balazs Keri3b30d652018-10-19 13:32:20 +00007209 DeclarationNameInfo ToNameInfo(ToDeclName, ToExprLoc);
7210 if (Error Err = ImportDeclarationNameLoc(E->getNameInfo(), ToNameInfo))
7211 return std::move(Err);
7212
7213 TemplateArgumentListInfo ToTAInfo(ToLAngleLoc, ToRAngleLoc);
Peter Szecsice7f3182018-05-07 12:08:27 +00007214 TemplateArgumentListInfo *ResInfo = nullptr;
7215 if (E->hasExplicitTemplateArgs()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00007216 if (Error Err =
7217 ImportTemplateArgumentListInfo(E->template_arguments(), ToTAInfo))
7218 return std::move(Err);
Peter Szecsice7f3182018-05-07 12:08:27 +00007219 ResInfo = &ToTAInfo;
7220 }
7221
7222 return DependentScopeDeclRefExpr::Create(
Balazs Keri3b30d652018-10-19 13:32:20 +00007223 Importer.getToContext(), ToQualifierLoc, ToTemplateKeywordLoc,
7224 ToNameInfo, ResInfo);
Peter Szecsice7f3182018-05-07 12:08:27 +00007225}
7226
Balazs Keri3b30d652018-10-19 13:32:20 +00007227ExpectedStmt ASTNodeImporter::VisitCXXUnresolvedConstructExpr(
7228 CXXUnresolvedConstructExpr *E) {
7229 auto Imp = importSeq(
7230 E->getLParenLoc(), E->getRParenLoc(), E->getTypeSourceInfo());
7231 if (!Imp)
7232 return Imp.takeError();
Aleksei Sidorine267a0f2018-01-09 16:40:40 +00007233
Balazs Keri3b30d652018-10-19 13:32:20 +00007234 SourceLocation ToLParenLoc, ToRParenLoc;
7235 TypeSourceInfo *ToTypeSourceInfo;
7236 std::tie(ToLParenLoc, ToRParenLoc, ToTypeSourceInfo) = *Imp;
7237
7238 SmallVector<Expr *, 8> ToArgs(E->arg_size());
7239 if (Error Err =
7240 ImportArrayChecked(E->arg_begin(), E->arg_end(), ToArgs.begin()))
7241 return std::move(Err);
Aleksei Sidorine267a0f2018-01-09 16:40:40 +00007242
7243 return CXXUnresolvedConstructExpr::Create(
Balazs Keri3b30d652018-10-19 13:32:20 +00007244 Importer.getToContext(), ToTypeSourceInfo, ToLParenLoc,
7245 llvm::makeArrayRef(ToArgs), ToRParenLoc);
Aleksei Sidorine267a0f2018-01-09 16:40:40 +00007246}
7247
Balazs Keri3b30d652018-10-19 13:32:20 +00007248ExpectedStmt
7249ASTNodeImporter::VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E) {
7250 Expected<CXXRecordDecl *> ToNamingClassOrErr = import(E->getNamingClass());
7251 if (!ToNamingClassOrErr)
7252 return ToNamingClassOrErr.takeError();
Aleksei Sidorine267a0f2018-01-09 16:40:40 +00007253
Balazs Keri3b30d652018-10-19 13:32:20 +00007254 auto ToQualifierLocOrErr = import(E->getQualifierLoc());
7255 if (!ToQualifierLocOrErr)
7256 return ToQualifierLocOrErr.takeError();
Aleksei Sidorine267a0f2018-01-09 16:40:40 +00007257
Balazs Keri3b30d652018-10-19 13:32:20 +00007258 auto ToNameInfoOrErr = importSeq(E->getName(), E->getNameLoc());
7259 if (!ToNameInfoOrErr)
7260 return ToNameInfoOrErr.takeError();
7261 DeclarationNameInfo ToNameInfo(
7262 std::get<0>(*ToNameInfoOrErr), std::get<1>(*ToNameInfoOrErr));
Aleksei Sidorine267a0f2018-01-09 16:40:40 +00007263 // Import additional name location/type info.
Balazs Keri3b30d652018-10-19 13:32:20 +00007264 if (Error Err = ImportDeclarationNameLoc(E->getNameInfo(), ToNameInfo))
7265 return std::move(Err);
Aleksei Sidorine267a0f2018-01-09 16:40:40 +00007266
7267 UnresolvedSet<8> ToDecls;
Balazs Keri3b30d652018-10-19 13:32:20 +00007268 for (auto *D : E->decls())
7269 if (auto ToDOrErr = import(D))
7270 ToDecls.addDecl(cast<NamedDecl>(*ToDOrErr));
Aleksei Sidorine267a0f2018-01-09 16:40:40 +00007271 else
Balazs Keri3b30d652018-10-19 13:32:20 +00007272 return ToDOrErr.takeError();
Aleksei Sidorine267a0f2018-01-09 16:40:40 +00007273
Balazs Keri3b30d652018-10-19 13:32:20 +00007274 if (E->hasExplicitTemplateArgs() && E->getTemplateKeywordLoc().isValid()) {
7275 TemplateArgumentListInfo ToTAInfo;
7276 if (Error Err = ImportTemplateArgumentListInfo(
7277 E->getLAngleLoc(), E->getRAngleLoc(), E->template_arguments(),
7278 ToTAInfo))
7279 return std::move(Err);
Aleksei Sidorine267a0f2018-01-09 16:40:40 +00007280
Balazs Keri3b30d652018-10-19 13:32:20 +00007281 ExpectedSLoc ToTemplateKeywordLocOrErr = import(E->getTemplateKeywordLoc());
7282 if (!ToTemplateKeywordLocOrErr)
7283 return ToTemplateKeywordLocOrErr.takeError();
7284
Aleksei Sidorine267a0f2018-01-09 16:40:40 +00007285 return UnresolvedLookupExpr::Create(
Balazs Keri3b30d652018-10-19 13:32:20 +00007286 Importer.getToContext(), *ToNamingClassOrErr, *ToQualifierLocOrErr,
7287 *ToTemplateKeywordLocOrErr, ToNameInfo, E->requiresADL(), &ToTAInfo,
7288 ToDecls.begin(), ToDecls.end());
7289 }
Aleksei Sidorine267a0f2018-01-09 16:40:40 +00007290
7291 return UnresolvedLookupExpr::Create(
Balazs Keri3b30d652018-10-19 13:32:20 +00007292 Importer.getToContext(), *ToNamingClassOrErr, *ToQualifierLocOrErr,
7293 ToNameInfo, E->requiresADL(), E->isOverloaded(), ToDecls.begin(),
7294 ToDecls.end());
Aleksei Sidorine267a0f2018-01-09 16:40:40 +00007295}
7296
Balazs Keri3b30d652018-10-19 13:32:20 +00007297ExpectedStmt
7298ASTNodeImporter::VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E) {
7299 auto Imp1 = importSeq(
7300 E->getType(), E->getOperatorLoc(), E->getQualifierLoc(),
7301 E->getTemplateKeywordLoc());
7302 if (!Imp1)
7303 return Imp1.takeError();
Peter Szecsice7f3182018-05-07 12:08:27 +00007304
Balazs Keri3b30d652018-10-19 13:32:20 +00007305 QualType ToType;
7306 SourceLocation ToOperatorLoc, ToTemplateKeywordLoc;
7307 NestedNameSpecifierLoc ToQualifierLoc;
7308 std::tie(ToType, ToOperatorLoc, ToQualifierLoc, ToTemplateKeywordLoc) = *Imp1;
7309
7310 auto Imp2 = importSeq(E->getName(), E->getNameLoc());
7311 if (!Imp2)
7312 return Imp2.takeError();
7313 DeclarationNameInfo ToNameInfo(std::get<0>(*Imp2), std::get<1>(*Imp2));
7314 // Import additional name location/type info.
7315 if (Error Err = ImportDeclarationNameLoc(E->getNameInfo(), ToNameInfo))
7316 return std::move(Err);
Peter Szecsice7f3182018-05-07 12:08:27 +00007317
7318 UnresolvedSet<8> ToDecls;
Balazs Keri3b30d652018-10-19 13:32:20 +00007319 for (Decl *D : E->decls())
7320 if (auto ToDOrErr = import(D))
7321 ToDecls.addDecl(cast<NamedDecl>(*ToDOrErr));
Peter Szecsice7f3182018-05-07 12:08:27 +00007322 else
Balazs Keri3b30d652018-10-19 13:32:20 +00007323 return ToDOrErr.takeError();
Peter Szecsice7f3182018-05-07 12:08:27 +00007324
7325 TemplateArgumentListInfo ToTAInfo;
7326 TemplateArgumentListInfo *ResInfo = nullptr;
7327 if (E->hasExplicitTemplateArgs()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00007328 if (Error Err =
7329 ImportTemplateArgumentListInfo(E->template_arguments(), ToTAInfo))
7330 return std::move(Err);
Peter Szecsice7f3182018-05-07 12:08:27 +00007331 ResInfo = &ToTAInfo;
7332 }
7333
Balazs Keri3b30d652018-10-19 13:32:20 +00007334 Expr *ToBase = nullptr;
7335 if (!E->isImplicitAccess()) {
7336 if (ExpectedExpr ToBaseOrErr = import(E->getBase()))
7337 ToBase = *ToBaseOrErr;
7338 else
7339 return ToBaseOrErr.takeError();
Peter Szecsice7f3182018-05-07 12:08:27 +00007340 }
7341
7342 return UnresolvedMemberExpr::Create(
Balazs Keri3b30d652018-10-19 13:32:20 +00007343 Importer.getToContext(), E->hasUnresolvedUsing(), ToBase, ToType,
7344 E->isArrow(), ToOperatorLoc, ToQualifierLoc, ToTemplateKeywordLoc,
7345 ToNameInfo, ResInfo, ToDecls.begin(), ToDecls.end());
Peter Szecsice7f3182018-05-07 12:08:27 +00007346}
7347
Balazs Keri3b30d652018-10-19 13:32:20 +00007348ExpectedStmt ASTNodeImporter::VisitCallExpr(CallExpr *E) {
7349 auto Imp = importSeq(E->getCallee(), E->getType(), E->getRParenLoc());
7350 if (!Imp)
7351 return Imp.takeError();
Sean Callanan59721b32015-04-28 18:41:46 +00007352
Balazs Keri3b30d652018-10-19 13:32:20 +00007353 Expr *ToCallee;
7354 QualType ToType;
7355 SourceLocation ToRParenLoc;
7356 std::tie(ToCallee, ToType, ToRParenLoc) = *Imp;
Sean Callanan59721b32015-04-28 18:41:46 +00007357
7358 unsigned NumArgs = E->getNumArgs();
Balazs Keri3b30d652018-10-19 13:32:20 +00007359 llvm::SmallVector<Expr *, 2> ToArgs(NumArgs);
7360 if (Error Err = ImportContainerChecked(E->arguments(), ToArgs))
7361 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00007362
Gabor Horvathc78d99a2018-01-27 16:11:45 +00007363 if (const auto *OCE = dyn_cast<CXXOperatorCallExpr>(E)) {
Bruno Riccic5885cf2018-12-21 15:20:32 +00007364 return CXXOperatorCallExpr::Create(
Balazs Keri3b30d652018-10-19 13:32:20 +00007365 Importer.getToContext(), OCE->getOperator(), ToCallee, ToArgs, ToType,
Eric Fiselier5cdc2cd2018-12-12 21:50:55 +00007366 OCE->getValueKind(), ToRParenLoc, OCE->getFPFeatures(),
7367 OCE->getADLCallKind());
Gabor Horvathc78d99a2018-01-27 16:11:45 +00007368 }
7369
Bruno Riccic5885cf2018-12-21 15:20:32 +00007370 return CallExpr::Create(Importer.getToContext(), ToCallee, ToArgs, ToType,
7371 E->getValueKind(), ToRParenLoc, /*MinNumArgs=*/0,
7372 E->getADLCallKind());
Sean Callanan59721b32015-04-28 18:41:46 +00007373}
7374
Balazs Keri3b30d652018-10-19 13:32:20 +00007375ExpectedStmt ASTNodeImporter::VisitLambdaExpr(LambdaExpr *E) {
7376 CXXRecordDecl *FromClass = E->getLambdaClass();
7377 auto ToClassOrErr = import(FromClass);
7378 if (!ToClassOrErr)
7379 return ToClassOrErr.takeError();
7380 CXXRecordDecl *ToClass = *ToClassOrErr;
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00007381
7382 // NOTE: lambda classes are created with BeingDefined flag set up.
7383 // It means that ImportDefinition doesn't work for them and we should fill it
7384 // manually.
7385 if (ToClass->isBeingDefined()) {
7386 for (auto FromField : FromClass->fields()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00007387 auto ToFieldOrErr = import(FromField);
7388 if (!ToFieldOrErr)
7389 return ToFieldOrErr.takeError();
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00007390 }
7391 }
7392
Balazs Keri3b30d652018-10-19 13:32:20 +00007393 auto ToCallOpOrErr = import(E->getCallOperator());
7394 if (!ToCallOpOrErr)
7395 return ToCallOpOrErr.takeError();
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00007396
7397 ToClass->completeDefinition();
7398
Balazs Keri3b30d652018-10-19 13:32:20 +00007399 SmallVector<LambdaCapture, 8> ToCaptures;
7400 ToCaptures.reserve(E->capture_size());
7401 for (const auto &FromCapture : E->captures()) {
7402 if (auto ToCaptureOrErr = import(FromCapture))
7403 ToCaptures.push_back(*ToCaptureOrErr);
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00007404 else
Balazs Keri3b30d652018-10-19 13:32:20 +00007405 return ToCaptureOrErr.takeError();
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00007406 }
7407
Balazs Keri3b30d652018-10-19 13:32:20 +00007408 SmallVector<Expr *, 8> ToCaptureInits(E->capture_size());
7409 if (Error Err = ImportContainerChecked(E->capture_inits(), ToCaptureInits))
7410 return std::move(Err);
7411
7412 auto Imp = importSeq(
7413 E->getIntroducerRange(), E->getCaptureDefaultLoc(), E->getEndLoc());
7414 if (!Imp)
7415 return Imp.takeError();
7416
7417 SourceRange ToIntroducerRange;
7418 SourceLocation ToCaptureDefaultLoc, ToEndLoc;
7419 std::tie(ToIntroducerRange, ToCaptureDefaultLoc, ToEndLoc) = *Imp;
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00007420
Stephen Kelly1c301dc2018-08-09 21:09:38 +00007421 return LambdaExpr::Create(
Balazs Keri3b30d652018-10-19 13:32:20 +00007422 Importer.getToContext(), ToClass, ToIntroducerRange,
7423 E->getCaptureDefault(), ToCaptureDefaultLoc, ToCaptures,
7424 E->hasExplicitParameters(), E->hasExplicitResultType(), ToCaptureInits,
7425 ToEndLoc, E->containsUnexpandedParameterPack());
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00007426}
7427
Sean Callanan8bca9962016-03-28 21:43:01 +00007428
Balazs Keri3b30d652018-10-19 13:32:20 +00007429ExpectedStmt ASTNodeImporter::VisitInitListExpr(InitListExpr *E) {
7430 auto Imp = importSeq(E->getLBraceLoc(), E->getRBraceLoc(), E->getType());
7431 if (!Imp)
7432 return Imp.takeError();
7433
7434 SourceLocation ToLBraceLoc, ToRBraceLoc;
7435 QualType ToType;
7436 std::tie(ToLBraceLoc, ToRBraceLoc, ToType) = *Imp;
7437
7438 SmallVector<Expr *, 4> ToExprs(E->getNumInits());
7439 if (Error Err = ImportContainerChecked(E->inits(), ToExprs))
7440 return std::move(Err);
Sean Callanan8bca9962016-03-28 21:43:01 +00007441
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00007442 ASTContext &ToCtx = Importer.getToContext();
7443 InitListExpr *To = new (ToCtx) InitListExpr(
Balazs Keri3b30d652018-10-19 13:32:20 +00007444 ToCtx, ToLBraceLoc, ToExprs, ToRBraceLoc);
7445 To->setType(ToType);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00007446
Balazs Keri3b30d652018-10-19 13:32:20 +00007447 if (E->hasArrayFiller()) {
7448 if (ExpectedExpr ToFillerOrErr = import(E->getArrayFiller()))
7449 To->setArrayFiller(*ToFillerOrErr);
7450 else
7451 return ToFillerOrErr.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00007452 }
7453
Balazs Keri3b30d652018-10-19 13:32:20 +00007454 if (FieldDecl *FromFD = E->getInitializedFieldInUnion()) {
7455 if (auto ToFDOrErr = import(FromFD))
7456 To->setInitializedFieldInUnion(*ToFDOrErr);
7457 else
7458 return ToFDOrErr.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00007459 }
7460
Balazs Keri3b30d652018-10-19 13:32:20 +00007461 if (InitListExpr *SyntForm = E->getSyntacticForm()) {
7462 if (auto ToSyntFormOrErr = import(SyntForm))
7463 To->setSyntacticForm(*ToSyntFormOrErr);
7464 else
7465 return ToSyntFormOrErr.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00007466 }
7467
Gabor Martona20ce602018-09-03 13:10:53 +00007468 // Copy InitListExprBitfields, which are not handled in the ctor of
7469 // InitListExpr.
Balazs Keri3b30d652018-10-19 13:32:20 +00007470 To->sawArrayRangeDesignator(E->hadArrayRangeDesignator());
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00007471
7472 return To;
Sean Callanan8bca9962016-03-28 21:43:01 +00007473}
7474
Balazs Keri3b30d652018-10-19 13:32:20 +00007475ExpectedStmt ASTNodeImporter::VisitCXXStdInitializerListExpr(
Gabor Marton07b01ff2018-06-29 12:17:34 +00007476 CXXStdInitializerListExpr *E) {
Balazs Keri3b30d652018-10-19 13:32:20 +00007477 ExpectedType ToTypeOrErr = import(E->getType());
7478 if (!ToTypeOrErr)
7479 return ToTypeOrErr.takeError();
Gabor Marton07b01ff2018-06-29 12:17:34 +00007480
Balazs Keri3b30d652018-10-19 13:32:20 +00007481 ExpectedExpr ToSubExprOrErr = import(E->getSubExpr());
7482 if (!ToSubExprOrErr)
7483 return ToSubExprOrErr.takeError();
Gabor Marton07b01ff2018-06-29 12:17:34 +00007484
Balazs Keri3b30d652018-10-19 13:32:20 +00007485 return new (Importer.getToContext()) CXXStdInitializerListExpr(
7486 *ToTypeOrErr, *ToSubExprOrErr);
Gabor Marton07b01ff2018-06-29 12:17:34 +00007487}
7488
Balazs Keri3b30d652018-10-19 13:32:20 +00007489ExpectedStmt ASTNodeImporter::VisitCXXInheritedCtorInitExpr(
Balazs Keri95baa842018-07-25 10:21:06 +00007490 CXXInheritedCtorInitExpr *E) {
Balazs Keri3b30d652018-10-19 13:32:20 +00007491 auto Imp = importSeq(E->getLocation(), E->getType(), E->getConstructor());
7492 if (!Imp)
7493 return Imp.takeError();
Balazs Keri95baa842018-07-25 10:21:06 +00007494
Balazs Keri3b30d652018-10-19 13:32:20 +00007495 SourceLocation ToLocation;
7496 QualType ToType;
7497 CXXConstructorDecl *ToConstructor;
7498 std::tie(ToLocation, ToType, ToConstructor) = *Imp;
Balazs Keri95baa842018-07-25 10:21:06 +00007499
7500 return new (Importer.getToContext()) CXXInheritedCtorInitExpr(
Balazs Keri3b30d652018-10-19 13:32:20 +00007501 ToLocation, ToType, ToConstructor, E->constructsVBase(),
7502 E->inheritedFromVBase());
Balazs Keri95baa842018-07-25 10:21:06 +00007503}
7504
Balazs Keri3b30d652018-10-19 13:32:20 +00007505ExpectedStmt ASTNodeImporter::VisitArrayInitLoopExpr(ArrayInitLoopExpr *E) {
7506 auto Imp = importSeq(E->getType(), E->getCommonExpr(), E->getSubExpr());
7507 if (!Imp)
7508 return Imp.takeError();
Richard Smith30e304e2016-12-14 00:03:17 +00007509
Balazs Keri3b30d652018-10-19 13:32:20 +00007510 QualType ToType;
7511 Expr *ToCommonExpr, *ToSubExpr;
7512 std::tie(ToType, ToCommonExpr, ToSubExpr) = *Imp;
Richard Smith30e304e2016-12-14 00:03:17 +00007513
Balazs Keri3b30d652018-10-19 13:32:20 +00007514 return new (Importer.getToContext()) ArrayInitLoopExpr(
7515 ToType, ToCommonExpr, ToSubExpr);
Richard Smith30e304e2016-12-14 00:03:17 +00007516}
7517
Balazs Keri3b30d652018-10-19 13:32:20 +00007518ExpectedStmt ASTNodeImporter::VisitArrayInitIndexExpr(ArrayInitIndexExpr *E) {
7519 ExpectedType ToTypeOrErr = import(E->getType());
7520 if (!ToTypeOrErr)
7521 return ToTypeOrErr.takeError();
7522 return new (Importer.getToContext()) ArrayInitIndexExpr(*ToTypeOrErr);
Richard Smith30e304e2016-12-14 00:03:17 +00007523}
7524
Balazs Keri3b30d652018-10-19 13:32:20 +00007525ExpectedStmt ASTNodeImporter::VisitCXXDefaultInitExpr(CXXDefaultInitExpr *E) {
7526 ExpectedSLoc ToBeginLocOrErr = import(E->getBeginLoc());
7527 if (!ToBeginLocOrErr)
7528 return ToBeginLocOrErr.takeError();
7529
7530 auto ToFieldOrErr = import(E->getField());
7531 if (!ToFieldOrErr)
7532 return ToFieldOrErr.takeError();
Sean Callanandd2c1742016-05-16 20:48:03 +00007533
7534 return CXXDefaultInitExpr::Create(
Balazs Keri3b30d652018-10-19 13:32:20 +00007535 Importer.getToContext(), *ToBeginLocOrErr, *ToFieldOrErr);
Sean Callanandd2c1742016-05-16 20:48:03 +00007536}
7537
Balazs Keri3b30d652018-10-19 13:32:20 +00007538ExpectedStmt ASTNodeImporter::VisitCXXNamedCastExpr(CXXNamedCastExpr *E) {
7539 auto Imp = importSeq(
7540 E->getType(), E->getSubExpr(), E->getTypeInfoAsWritten(),
7541 E->getOperatorLoc(), E->getRParenLoc(), E->getAngleBrackets());
7542 if (!Imp)
7543 return Imp.takeError();
7544
7545 QualType ToType;
7546 Expr *ToSubExpr;
7547 TypeSourceInfo *ToTypeInfoAsWritten;
7548 SourceLocation ToOperatorLoc, ToRParenLoc;
7549 SourceRange ToAngleBrackets;
7550 std::tie(
7551 ToType, ToSubExpr, ToTypeInfoAsWritten, ToOperatorLoc, ToRParenLoc,
7552 ToAngleBrackets) = *Imp;
7553
Sean Callanandd2c1742016-05-16 20:48:03 +00007554 ExprValueKind VK = E->getValueKind();
7555 CastKind CK = E->getCastKind();
Balazs Keri3b30d652018-10-19 13:32:20 +00007556 auto ToBasePathOrErr = ImportCastPath(E);
7557 if (!ToBasePathOrErr)
7558 return ToBasePathOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00007559
Sean Callanandd2c1742016-05-16 20:48:03 +00007560 if (isa<CXXStaticCastExpr>(E)) {
7561 return CXXStaticCastExpr::Create(
Balazs Keri3b30d652018-10-19 13:32:20 +00007562 Importer.getToContext(), ToType, VK, CK, ToSubExpr, &(*ToBasePathOrErr),
7563 ToTypeInfoAsWritten, ToOperatorLoc, ToRParenLoc, ToAngleBrackets);
Sean Callanandd2c1742016-05-16 20:48:03 +00007564 } else if (isa<CXXDynamicCastExpr>(E)) {
7565 return CXXDynamicCastExpr::Create(
Balazs Keri3b30d652018-10-19 13:32:20 +00007566 Importer.getToContext(), ToType, VK, CK, ToSubExpr, &(*ToBasePathOrErr),
7567 ToTypeInfoAsWritten, ToOperatorLoc, ToRParenLoc, ToAngleBrackets);
Sean Callanandd2c1742016-05-16 20:48:03 +00007568 } else if (isa<CXXReinterpretCastExpr>(E)) {
7569 return CXXReinterpretCastExpr::Create(
Balazs Keri3b30d652018-10-19 13:32:20 +00007570 Importer.getToContext(), ToType, VK, CK, ToSubExpr, &(*ToBasePathOrErr),
7571 ToTypeInfoAsWritten, ToOperatorLoc, ToRParenLoc, ToAngleBrackets);
Raphael Isemannc705bb82018-08-20 16:20:01 +00007572 } else if (isa<CXXConstCastExpr>(E)) {
Balazs Keri3b30d652018-10-19 13:32:20 +00007573 return CXXConstCastExpr::Create(
7574 Importer.getToContext(), ToType, VK, ToSubExpr, ToTypeInfoAsWritten,
7575 ToOperatorLoc, ToRParenLoc, ToAngleBrackets);
Sean Callanandd2c1742016-05-16 20:48:03 +00007576 } else {
Balazs Keri3b30d652018-10-19 13:32:20 +00007577 llvm_unreachable("Unknown cast type");
7578 return make_error<ImportError>();
Sean Callanandd2c1742016-05-16 20:48:03 +00007579 }
7580}
7581
Balazs Keri3b30d652018-10-19 13:32:20 +00007582ExpectedStmt ASTNodeImporter::VisitSubstNonTypeTemplateParmExpr(
Aleksei Sidorin855086d2017-01-23 09:30:36 +00007583 SubstNonTypeTemplateParmExpr *E) {
Balazs Keri3b30d652018-10-19 13:32:20 +00007584 auto Imp = importSeq(
7585 E->getType(), E->getExprLoc(), E->getParameter(), E->getReplacement());
7586 if (!Imp)
7587 return Imp.takeError();
Aleksei Sidorin855086d2017-01-23 09:30:36 +00007588
Balazs Keri3b30d652018-10-19 13:32:20 +00007589 QualType ToType;
7590 SourceLocation ToExprLoc;
7591 NonTypeTemplateParmDecl *ToParameter;
7592 Expr *ToReplacement;
7593 std::tie(ToType, ToExprLoc, ToParameter, ToReplacement) = *Imp;
Aleksei Sidorin855086d2017-01-23 09:30:36 +00007594
7595 return new (Importer.getToContext()) SubstNonTypeTemplateParmExpr(
Balazs Keri3b30d652018-10-19 13:32:20 +00007596 ToType, E->getValueKind(), ToExprLoc, ToParameter, ToReplacement);
Aleksei Sidorin855086d2017-01-23 09:30:36 +00007597}
7598
Balazs Keri3b30d652018-10-19 13:32:20 +00007599ExpectedStmt ASTNodeImporter::VisitTypeTraitExpr(TypeTraitExpr *E) {
7600 auto Imp = importSeq(
7601 E->getType(), E->getBeginLoc(), E->getEndLoc());
7602 if (!Imp)
7603 return Imp.takeError();
7604
7605 QualType ToType;
7606 SourceLocation ToBeginLoc, ToEndLoc;
7607 std::tie(ToType, ToBeginLoc, ToEndLoc) = *Imp;
Aleksei Sidorinb05f37a2017-11-26 17:04:06 +00007608
7609 SmallVector<TypeSourceInfo *, 4> ToArgs(E->getNumArgs());
Balazs Keri3b30d652018-10-19 13:32:20 +00007610 if (Error Err = ImportContainerChecked(E->getArgs(), ToArgs))
7611 return std::move(Err);
Aleksei Sidorinb05f37a2017-11-26 17:04:06 +00007612
7613 // According to Sema::BuildTypeTrait(), if E is value-dependent,
7614 // Value is always false.
Balazs Keri3b30d652018-10-19 13:32:20 +00007615 bool ToValue = (E->isValueDependent() ? false : E->getValue());
Aleksei Sidorinb05f37a2017-11-26 17:04:06 +00007616
7617 return TypeTraitExpr::Create(
Balazs Keri3b30d652018-10-19 13:32:20 +00007618 Importer.getToContext(), ToType, ToBeginLoc, E->getTrait(), ToArgs,
7619 ToEndLoc, ToValue);
Aleksei Sidorinb05f37a2017-11-26 17:04:06 +00007620}
7621
Balazs Keri3b30d652018-10-19 13:32:20 +00007622ExpectedStmt ASTNodeImporter::VisitCXXTypeidExpr(CXXTypeidExpr *E) {
7623 ExpectedType ToTypeOrErr = import(E->getType());
7624 if (!ToTypeOrErr)
7625 return ToTypeOrErr.takeError();
7626
7627 auto ToSourceRangeOrErr = import(E->getSourceRange());
7628 if (!ToSourceRangeOrErr)
7629 return ToSourceRangeOrErr.takeError();
Gabor Horvathc78d99a2018-01-27 16:11:45 +00007630
7631 if (E->isTypeOperand()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00007632 if (auto ToTSIOrErr = import(E->getTypeOperandSourceInfo()))
7633 return new (Importer.getToContext()) CXXTypeidExpr(
7634 *ToTypeOrErr, *ToTSIOrErr, *ToSourceRangeOrErr);
7635 else
7636 return ToTSIOrErr.takeError();
Gabor Horvathc78d99a2018-01-27 16:11:45 +00007637 }
7638
Balazs Keri3b30d652018-10-19 13:32:20 +00007639 ExpectedExpr ToExprOperandOrErr = import(E->getExprOperand());
7640 if (!ToExprOperandOrErr)
7641 return ToExprOperandOrErr.takeError();
Gabor Horvathc78d99a2018-01-27 16:11:45 +00007642
Balazs Keri3b30d652018-10-19 13:32:20 +00007643 return new (Importer.getToContext()) CXXTypeidExpr(
7644 *ToTypeOrErr, *ToExprOperandOrErr, *ToSourceRangeOrErr);
Gabor Horvathc78d99a2018-01-27 16:11:45 +00007645}
7646
Lang Hames19e07e12017-06-20 21:06:00 +00007647void ASTNodeImporter::ImportOverrides(CXXMethodDecl *ToMethod,
7648 CXXMethodDecl *FromMethod) {
Balazs Keri3b30d652018-10-19 13:32:20 +00007649 for (auto *FromOverriddenMethod : FromMethod->overridden_methods()) {
7650 if (auto ImportedOrErr = import(FromOverriddenMethod))
7651 ToMethod->getCanonicalDecl()->addOverriddenMethod(cast<CXXMethodDecl>(
7652 (*ImportedOrErr)->getCanonicalDecl()));
7653 else
7654 consumeError(ImportedOrErr.takeError());
7655 }
Lang Hames19e07e12017-06-20 21:06:00 +00007656}
7657
Argyrios Kyrtzidisd0040642010-11-18 20:06:41 +00007658ASTImporter::ASTImporter(ASTContext &ToContext, FileManager &ToFileManager,
Douglas Gregor0a791672011-01-18 03:11:38 +00007659 ASTContext &FromContext, FileManager &FromFileManager,
Gabor Marton54058b52018-12-17 13:53:12 +00007660 bool MinimalImport,
7661 ASTImporterLookupTable *LookupTable)
7662 : LookupTable(LookupTable), ToContext(ToContext), FromContext(FromContext),
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00007663 ToFileManager(ToFileManager), FromFileManager(FromFileManager),
7664 Minimal(MinimalImport) {
Gabor Marton54058b52018-12-17 13:53:12 +00007665
7666 ImportedDecls[FromContext.getTranslationUnitDecl()] =
7667 ToContext.getTranslationUnitDecl();
Douglas Gregor62d311f2010-02-09 19:21:46 +00007668}
7669
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00007670ASTImporter::~ASTImporter() = default;
Douglas Gregor96e578d2010-02-05 17:54:41 +00007671
Balazs Keri4a3d7582018-11-27 18:36:31 +00007672Expected<QualType> ASTImporter::Import_New(QualType FromT) {
Davide Italianofaee83d2018-11-28 19:15:23 +00007673 QualType ToT = Import(FromT);
7674 if (ToT.isNull() && !FromT.isNull())
7675 return make_error<ImportError>();
7676 return ToT;
7677}
Gabor Marton54058b52018-12-17 13:53:12 +00007678
7679Optional<unsigned> ASTImporter::getFieldIndex(Decl *F) {
7680 assert(F && (isa<FieldDecl>(*F) || isa<IndirectFieldDecl>(*F)) &&
7681 "Try to get field index for non-field.");
7682
7683 auto *Owner = dyn_cast<RecordDecl>(F->getDeclContext());
7684 if (!Owner)
7685 return None;
7686
7687 unsigned Index = 0;
7688 for (const auto *D : Owner->decls()) {
7689 if (D == F)
7690 return Index;
7691
7692 if (isa<FieldDecl>(*D) || isa<IndirectFieldDecl>(*D))
7693 ++Index;
7694 }
7695
7696 llvm_unreachable("Field was not found in its parent context.");
7697
7698 return None;
7699}
7700
7701ASTImporter::FoundDeclsTy
7702ASTImporter::findDeclsInToCtx(DeclContext *DC, DeclarationName Name) {
7703 // We search in the redecl context because of transparent contexts.
7704 // E.g. a simple C language enum is a transparent context:
7705 // enum E { A, B };
7706 // Now if we had a global variable in the TU
7707 // int A;
7708 // then the enum constant 'A' and the variable 'A' violates ODR.
7709 // We can diagnose this only if we search in the redecl context.
7710 DeclContext *ReDC = DC->getRedeclContext();
7711 if (LookupTable) {
7712 ASTImporterLookupTable::LookupResult LookupResult =
7713 LookupTable->lookup(ReDC, Name);
7714 return FoundDeclsTy(LookupResult.begin(), LookupResult.end());
7715 } else {
7716 // FIXME Can we remove this kind of lookup?
7717 // Or lldb really needs this C/C++ lookup?
7718 FoundDeclsTy Result;
7719 ReDC->localUncachedLookup(Name, Result);
7720 return Result;
7721 }
7722}
7723
7724void ASTImporter::AddToLookupTable(Decl *ToD) {
7725 if (LookupTable)
7726 if (auto *ToND = dyn_cast<NamedDecl>(ToD))
7727 LookupTable->add(ToND);
7728}
7729
Davide Italianofaee83d2018-11-28 19:15:23 +00007730QualType ASTImporter::Import(QualType FromT) {
Douglas Gregor96e578d2010-02-05 17:54:41 +00007731 if (FromT.isNull())
Davide Italianofaee83d2018-11-28 19:15:23 +00007732 return {};
John McCall424cec92011-01-19 06:33:43 +00007733
Balazs Keri3b30d652018-10-19 13:32:20 +00007734 const Type *FromTy = FromT.getTypePtr();
Fangrui Song6907ce22018-07-30 19:24:48 +00007735
7736 // Check whether we've already imported this type.
John McCall424cec92011-01-19 06:33:43 +00007737 llvm::DenseMap<const Type *, const Type *>::iterator Pos
Balazs Keri3b30d652018-10-19 13:32:20 +00007738 = ImportedTypes.find(FromTy);
Douglas Gregorf65bbb32010-02-08 15:18:58 +00007739 if (Pos != ImportedTypes.end())
John McCall424cec92011-01-19 06:33:43 +00007740 return ToContext.getQualifiedType(Pos->second, FromT.getLocalQualifiers());
Fangrui Song6907ce22018-07-30 19:24:48 +00007741
Douglas Gregorf65bbb32010-02-08 15:18:58 +00007742 // Import the type
Douglas Gregor96e578d2010-02-05 17:54:41 +00007743 ASTNodeImporter Importer(*this);
Balazs Keri3b30d652018-10-19 13:32:20 +00007744 ExpectedType ToTOrErr = Importer.Visit(FromTy);
Davide Italianofaee83d2018-11-28 19:15:23 +00007745 if (!ToTOrErr) {
7746 llvm::consumeError(ToTOrErr.takeError());
7747 return {};
7748 }
Fangrui Song6907ce22018-07-30 19:24:48 +00007749
Douglas Gregorf65bbb32010-02-08 15:18:58 +00007750 // Record the imported type.
Balazs Keri3b30d652018-10-19 13:32:20 +00007751 ImportedTypes[FromTy] = (*ToTOrErr).getTypePtr();
Fangrui Song6907ce22018-07-30 19:24:48 +00007752
Balazs Keri3b30d652018-10-19 13:32:20 +00007753 return ToContext.getQualifiedType(*ToTOrErr, FromT.getLocalQualifiers());
Douglas Gregor96e578d2010-02-05 17:54:41 +00007754}
7755
Balazs Keri4a3d7582018-11-27 18:36:31 +00007756Expected<TypeSourceInfo *> ASTImporter::Import_New(TypeSourceInfo *FromTSI) {
Davide Italianofaee83d2018-11-28 19:15:23 +00007757 TypeSourceInfo *ToTSI = Import(FromTSI);
7758 if (!ToTSI && FromTSI)
7759 return llvm::make_error<ImportError>();
7760 return ToTSI;
7761}
7762TypeSourceInfo *ASTImporter::Import(TypeSourceInfo *FromTSI) {
Douglas Gregorfa7a0e52010-02-10 17:47:19 +00007763 if (!FromTSI)
7764 return FromTSI;
7765
7766 // FIXME: For now we just create a "trivial" type source info based
Nick Lewycky19b9f952010-07-26 16:56:01 +00007767 // on the type and a single location. Implement a real version of this.
Davide Italianofaee83d2018-11-28 19:15:23 +00007768 QualType T = Import(FromTSI->getType());
7769 if (T.isNull())
7770 return nullptr;
Douglas Gregorfa7a0e52010-02-10 17:47:19 +00007771
Davide Italianofaee83d2018-11-28 19:15:23 +00007772 return ToContext.getTrivialTypeSourceInfo(
7773 T, Import(FromTSI->getTypeLoc().getBeginLoc()));
Douglas Gregor62d311f2010-02-09 19:21:46 +00007774}
7775
Balazs Keri4a3d7582018-11-27 18:36:31 +00007776Expected<Attr *> ASTImporter::Import_New(const Attr *FromAttr) {
Davide Italianofaee83d2018-11-28 19:15:23 +00007777 return Import(FromAttr);
Aleksei Sidorin8f266db2018-05-08 12:45:21 +00007778}
Davide Italianofaee83d2018-11-28 19:15:23 +00007779Attr *ASTImporter::Import(const Attr *FromAttr) {
7780 Attr *ToAttr = FromAttr->clone(ToContext);
7781 // NOTE: Import of SourceRange may fail.
7782 ToAttr->setRange(Import(FromAttr->getRange()));
7783 return ToAttr;
Balazs Kerideaf7ab2018-11-28 13:21:26 +00007784}
Aleksei Sidorin8f266db2018-05-08 12:45:21 +00007785
Gabor Martonbe77a982018-12-12 11:22:55 +00007786Decl *ASTImporter::GetAlreadyImportedOrNull(const Decl *FromD) const {
7787 auto Pos = ImportedDecls.find(FromD);
7788 if (Pos != ImportedDecls.end())
7789 return Pos->second;
7790 else
Sean Callanan59721b32015-04-28 18:41:46 +00007791 return nullptr;
Sean Callanan59721b32015-04-28 18:41:46 +00007792}
7793
Balazs Keri4a3d7582018-11-27 18:36:31 +00007794Expected<Decl *> ASTImporter::Import_New(Decl *FromD) {
Davide Italianofaee83d2018-11-28 19:15:23 +00007795 Decl *ToD = Import(FromD);
7796 if (!ToD && FromD)
7797 return llvm::make_error<ImportError>();
7798 return ToD;
7799}
7800Decl *ASTImporter::Import(Decl *FromD) {
Douglas Gregor62d311f2010-02-09 19:21:46 +00007801 if (!FromD)
Craig Topper36250ad2014-05-12 05:36:57 +00007802 return nullptr;
Douglas Gregor62d311f2010-02-09 19:21:46 +00007803
Douglas Gregord451ea92011-07-29 23:31:30 +00007804 ASTNodeImporter Importer(*this);
7805
Gabor Marton26f72a92018-07-12 09:42:05 +00007806 // Check whether we've already imported this declaration.
7807 Decl *ToD = GetAlreadyImportedOrNull(FromD);
7808 if (ToD) {
7809 // If FromD has some updated flags after last import, apply it
7810 updateFlags(FromD, ToD);
Douglas Gregord451ea92011-07-29 23:31:30 +00007811 return ToD;
7812 }
Gabor Marton26f72a92018-07-12 09:42:05 +00007813
Davide Italianofaee83d2018-11-28 19:15:23 +00007814 // Import the type.
Balazs Keri3b30d652018-10-19 13:32:20 +00007815 ExpectedDecl ToDOrErr = Importer.Visit(FromD);
Davide Italianofaee83d2018-11-28 19:15:23 +00007816 if (!ToDOrErr) {
7817 llvm::consumeError(ToDOrErr.takeError());
7818 return nullptr;
7819 }
Balazs Keri3b30d652018-10-19 13:32:20 +00007820 ToD = *ToDOrErr;
Craig Topper36250ad2014-05-12 05:36:57 +00007821
Gabor Marton54058b52018-12-17 13:53:12 +00007822 // Once the decl is connected to the existing declarations, i.e. when the
7823 // redecl chain is properly set then we populate the lookup again.
7824 // This way the primary context will be able to find all decls.
7825 AddToLookupTable(ToD);
7826
Gabor Marton26f72a92018-07-12 09:42:05 +00007827 // Notify subclasses.
7828 Imported(FromD, ToD);
7829
Gabor Martonac3a5d62018-09-17 12:04:52 +00007830 updateFlags(FromD, ToD);
Davide Italianofaee83d2018-11-28 19:15:23 +00007831 return ToD;
Douglas Gregor62d311f2010-02-09 19:21:46 +00007832}
7833
Balazs Keri3b30d652018-10-19 13:32:20 +00007834Expected<DeclContext *> ASTImporter::ImportContext(DeclContext *FromDC) {
Douglas Gregor62d311f2010-02-09 19:21:46 +00007835 if (!FromDC)
7836 return FromDC;
7837
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00007838 auto *ToDC = cast_or_null<DeclContext>(Import(cast<Decl>(FromDC)));
Douglas Gregor2e15c842012-02-01 21:00:38 +00007839 if (!ToDC)
Craig Topper36250ad2014-05-12 05:36:57 +00007840 return nullptr;
7841
Fangrui Song6907ce22018-07-30 19:24:48 +00007842 // When we're using a record/enum/Objective-C class/protocol as a context, we
Douglas Gregor2e15c842012-02-01 21:00:38 +00007843 // need it to have a definition.
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00007844 if (auto *ToRecord = dyn_cast<RecordDecl>(ToDC)) {
7845 auto *FromRecord = cast<RecordDecl>(FromDC);
Douglas Gregor2e15c842012-02-01 21:00:38 +00007846 if (ToRecord->isCompleteDefinition()) {
7847 // Do nothing.
7848 } else if (FromRecord->isCompleteDefinition()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00007849 if (Error Err = ASTNodeImporter(*this).ImportDefinition(
7850 FromRecord, ToRecord, ASTNodeImporter::IDK_Basic))
7851 return std::move(Err);
Douglas Gregor2e15c842012-02-01 21:00:38 +00007852 } else {
7853 CompleteDecl(ToRecord);
7854 }
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00007855 } else if (auto *ToEnum = dyn_cast<EnumDecl>(ToDC)) {
7856 auto *FromEnum = cast<EnumDecl>(FromDC);
Douglas Gregor2e15c842012-02-01 21:00:38 +00007857 if (ToEnum->isCompleteDefinition()) {
7858 // Do nothing.
7859 } else if (FromEnum->isCompleteDefinition()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00007860 if (Error Err = ASTNodeImporter(*this).ImportDefinition(
7861 FromEnum, ToEnum, ASTNodeImporter::IDK_Basic))
7862 return std::move(Err);
Douglas Gregor2e15c842012-02-01 21:00:38 +00007863 } else {
7864 CompleteDecl(ToEnum);
Fangrui Song6907ce22018-07-30 19:24:48 +00007865 }
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00007866 } else if (auto *ToClass = dyn_cast<ObjCInterfaceDecl>(ToDC)) {
7867 auto *FromClass = cast<ObjCInterfaceDecl>(FromDC);
Douglas Gregor2e15c842012-02-01 21:00:38 +00007868 if (ToClass->getDefinition()) {
7869 // Do nothing.
7870 } else if (ObjCInterfaceDecl *FromDef = FromClass->getDefinition()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00007871 if (Error Err = ASTNodeImporter(*this).ImportDefinition(
7872 FromDef, ToClass, ASTNodeImporter::IDK_Basic))
7873 return std::move(Err);
Douglas Gregor2e15c842012-02-01 21:00:38 +00007874 } else {
7875 CompleteDecl(ToClass);
7876 }
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00007877 } else if (auto *ToProto = dyn_cast<ObjCProtocolDecl>(ToDC)) {
7878 auto *FromProto = cast<ObjCProtocolDecl>(FromDC);
Douglas Gregor2e15c842012-02-01 21:00:38 +00007879 if (ToProto->getDefinition()) {
7880 // Do nothing.
7881 } else if (ObjCProtocolDecl *FromDef = FromProto->getDefinition()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00007882 if (Error Err = ASTNodeImporter(*this).ImportDefinition(
7883 FromDef, ToProto, ASTNodeImporter::IDK_Basic))
7884 return std::move(Err);
Douglas Gregor2e15c842012-02-01 21:00:38 +00007885 } else {
7886 CompleteDecl(ToProto);
Fangrui Song6907ce22018-07-30 19:24:48 +00007887 }
Douglas Gregor95d82832012-01-24 18:36:04 +00007888 }
Fangrui Song6907ce22018-07-30 19:24:48 +00007889
Douglas Gregor95d82832012-01-24 18:36:04 +00007890 return ToDC;
Douglas Gregor62d311f2010-02-09 19:21:46 +00007891}
7892
Balazs Keri4a3d7582018-11-27 18:36:31 +00007893Expected<Expr *> ASTImporter::Import_New(Expr *FromE) {
Davide Italianofaee83d2018-11-28 19:15:23 +00007894 Expr *ToE = Import(FromE);
7895 if (!ToE && FromE)
7896 return llvm::make_error<ImportError>();
7897 return ToE;
Balazs Keri4a3d7582018-11-27 18:36:31 +00007898}
Davide Italianofaee83d2018-11-28 19:15:23 +00007899Expr *ASTImporter::Import(Expr *FromE) {
7900 if (!FromE)
7901 return nullptr;
7902
7903 return cast_or_null<Expr>(Import(cast<Stmt>(FromE)));
Douglas Gregor62d311f2010-02-09 19:21:46 +00007904}
7905
Balazs Keri4a3d7582018-11-27 18:36:31 +00007906Expected<Stmt *> ASTImporter::Import_New(Stmt *FromS) {
Davide Italianofaee83d2018-11-28 19:15:23 +00007907 Stmt *ToS = Import(FromS);
7908 if (!ToS && FromS)
7909 return llvm::make_error<ImportError>();
7910 return ToS;
7911}
7912Stmt *ASTImporter::Import(Stmt *FromS) {
Douglas Gregor62d311f2010-02-09 19:21:46 +00007913 if (!FromS)
Craig Topper36250ad2014-05-12 05:36:57 +00007914 return nullptr;
Douglas Gregor62d311f2010-02-09 19:21:46 +00007915
Davide Italianofaee83d2018-11-28 19:15:23 +00007916 // Check whether we've already imported this declaration.
Douglas Gregor7eeb5972010-02-11 19:21:55 +00007917 llvm::DenseMap<Stmt *, Stmt *>::iterator Pos = ImportedStmts.find(FromS);
7918 if (Pos != ImportedStmts.end())
7919 return Pos->second;
Fangrui Song6907ce22018-07-30 19:24:48 +00007920
Balazs Keri3b30d652018-10-19 13:32:20 +00007921 // Import the statement.
Douglas Gregor7eeb5972010-02-11 19:21:55 +00007922 ASTNodeImporter Importer(*this);
Balazs Keri3b30d652018-10-19 13:32:20 +00007923 ExpectedStmt ToSOrErr = Importer.Visit(FromS);
Davide Italianofaee83d2018-11-28 19:15:23 +00007924 if (!ToSOrErr) {
7925 llvm::consumeError(ToSOrErr.takeError());
7926 return nullptr;
7927 }
Craig Topper36250ad2014-05-12 05:36:57 +00007928
Balazs Keri3b30d652018-10-19 13:32:20 +00007929 if (auto *ToE = dyn_cast<Expr>(*ToSOrErr)) {
Gabor Martona20ce602018-09-03 13:10:53 +00007930 auto *FromE = cast<Expr>(FromS);
7931 // Copy ExprBitfields, which may not be handled in Expr subclasses
7932 // constructors.
7933 ToE->setValueKind(FromE->getValueKind());
7934 ToE->setObjectKind(FromE->getObjectKind());
7935 ToE->setTypeDependent(FromE->isTypeDependent());
7936 ToE->setValueDependent(FromE->isValueDependent());
7937 ToE->setInstantiationDependent(FromE->isInstantiationDependent());
7938 ToE->setContainsUnexpandedParameterPack(
7939 FromE->containsUnexpandedParameterPack());
7940 }
7941
Davide Italianofaee83d2018-11-28 19:15:23 +00007942 // Record the imported declaration.
Balazs Keri3b30d652018-10-19 13:32:20 +00007943 ImportedStmts[FromS] = *ToSOrErr;
Davide Italianofaee83d2018-11-28 19:15:23 +00007944 return *ToSOrErr;
Douglas Gregor62d311f2010-02-09 19:21:46 +00007945}
7946
Balazs Keri4a3d7582018-11-27 18:36:31 +00007947Expected<NestedNameSpecifier *>
7948ASTImporter::Import_New(NestedNameSpecifier *FromNNS) {
Davide Italianofaee83d2018-11-28 19:15:23 +00007949 NestedNameSpecifier *ToNNS = Import(FromNNS);
7950 if (!ToNNS && FromNNS)
7951 return llvm::make_error<ImportError>();
7952 return ToNNS;
7953}
7954NestedNameSpecifier *ASTImporter::Import(NestedNameSpecifier *FromNNS) {
Douglas Gregor62d311f2010-02-09 19:21:46 +00007955 if (!FromNNS)
Craig Topper36250ad2014-05-12 05:36:57 +00007956 return nullptr;
Douglas Gregor62d311f2010-02-09 19:21:46 +00007957
Davide Italianofaee83d2018-11-28 19:15:23 +00007958 NestedNameSpecifier *prefix = Import(FromNNS->getPrefix());
Douglas Gregor90ebf252011-04-27 16:48:40 +00007959
7960 switch (FromNNS->getKind()) {
7961 case NestedNameSpecifier::Identifier:
Davide Italianofaee83d2018-11-28 19:15:23 +00007962 if (IdentifierInfo *II = Import(FromNNS->getAsIdentifier())) {
7963 return NestedNameSpecifier::Create(ToContext, prefix, II);
7964 }
7965 return nullptr;
Douglas Gregor90ebf252011-04-27 16:48:40 +00007966
7967 case NestedNameSpecifier::Namespace:
Davide Italianofaee83d2018-11-28 19:15:23 +00007968 if (auto *NS =
7969 cast_or_null<NamespaceDecl>(Import(FromNNS->getAsNamespace()))) {
7970 return NestedNameSpecifier::Create(ToContext, prefix, NS);
7971 }
7972 return nullptr;
Douglas Gregor90ebf252011-04-27 16:48:40 +00007973
7974 case NestedNameSpecifier::NamespaceAlias:
Davide Italianofaee83d2018-11-28 19:15:23 +00007975 if (auto *NSAD =
7976 cast_or_null<NamespaceAliasDecl>(Import(FromNNS->getAsNamespaceAlias()))) {
7977 return NestedNameSpecifier::Create(ToContext, prefix, NSAD);
7978 }
7979 return nullptr;
Douglas Gregor90ebf252011-04-27 16:48:40 +00007980
7981 case NestedNameSpecifier::Global:
7982 return NestedNameSpecifier::GlobalSpecifier(ToContext);
7983
Nikola Smiljanic67860242014-09-26 00:28:20 +00007984 case NestedNameSpecifier::Super:
Davide Italianofaee83d2018-11-28 19:15:23 +00007985 if (auto *RD =
7986 cast_or_null<CXXRecordDecl>(Import(FromNNS->getAsRecordDecl()))) {
7987 return NestedNameSpecifier::SuperSpecifier(ToContext, RD);
7988 }
7989 return nullptr;
Nikola Smiljanic67860242014-09-26 00:28:20 +00007990
Douglas Gregor90ebf252011-04-27 16:48:40 +00007991 case NestedNameSpecifier::TypeSpec:
Davide Italianofaee83d2018-11-28 19:15:23 +00007992 case NestedNameSpecifier::TypeSpecWithTemplate: {
7993 QualType T = Import(QualType(FromNNS->getAsType(), 0u));
7994 if (!T.isNull()) {
7995 bool bTemplate = FromNNS->getKind() ==
7996 NestedNameSpecifier::TypeSpecWithTemplate;
7997 return NestedNameSpecifier::Create(ToContext, prefix,
7998 bTemplate, T.getTypePtr());
7999 }
Douglas Gregor90ebf252011-04-27 16:48:40 +00008000 }
Davide Italianofaee83d2018-11-28 19:15:23 +00008001 return nullptr;
Douglas Gregor90ebf252011-04-27 16:48:40 +00008002 }
8003
8004 llvm_unreachable("Invalid nested name specifier kind");
Douglas Gregor62d311f2010-02-09 19:21:46 +00008005}
8006
Balazs Keri4a3d7582018-11-27 18:36:31 +00008007Expected<NestedNameSpecifierLoc>
8008ASTImporter::Import_New(NestedNameSpecifierLoc FromNNS) {
Davide Italianofaee83d2018-11-28 19:15:23 +00008009 NestedNameSpecifierLoc ToNNS = Import(FromNNS);
8010 return ToNNS;
8011}
8012NestedNameSpecifierLoc ASTImporter::Import(NestedNameSpecifierLoc FromNNS) {
Aleksei Sidorin855086d2017-01-23 09:30:36 +00008013 // Copied from NestedNameSpecifier mostly.
8014 SmallVector<NestedNameSpecifierLoc , 8> NestedNames;
8015 NestedNameSpecifierLoc NNS = FromNNS;
8016
8017 // Push each of the nested-name-specifiers's onto a stack for
8018 // serialization in reverse order.
8019 while (NNS) {
8020 NestedNames.push_back(NNS);
8021 NNS = NNS.getPrefix();
8022 }
8023
8024 NestedNameSpecifierLocBuilder Builder;
8025
8026 while (!NestedNames.empty()) {
8027 NNS = NestedNames.pop_back_val();
Davide Italianofaee83d2018-11-28 19:15:23 +00008028 NestedNameSpecifier *Spec = Import(NNS.getNestedNameSpecifier());
8029 if (!Spec)
8030 return NestedNameSpecifierLoc();
Aleksei Sidorin855086d2017-01-23 09:30:36 +00008031
8032 NestedNameSpecifier::SpecifierKind Kind = Spec->getKind();
8033 switch (Kind) {
8034 case NestedNameSpecifier::Identifier:
Davide Italianofaee83d2018-11-28 19:15:23 +00008035 Builder.Extend(getToContext(),
8036 Spec->getAsIdentifier(),
8037 Import(NNS.getLocalBeginLoc()),
8038 Import(NNS.getLocalEndLoc()));
Aleksei Sidorin855086d2017-01-23 09:30:36 +00008039 break;
8040
8041 case NestedNameSpecifier::Namespace:
Davide Italianofaee83d2018-11-28 19:15:23 +00008042 Builder.Extend(getToContext(),
8043 Spec->getAsNamespace(),
8044 Import(NNS.getLocalBeginLoc()),
8045 Import(NNS.getLocalEndLoc()));
Aleksei Sidorin855086d2017-01-23 09:30:36 +00008046 break;
8047
8048 case NestedNameSpecifier::NamespaceAlias:
Davide Italianofaee83d2018-11-28 19:15:23 +00008049 Builder.Extend(getToContext(),
8050 Spec->getAsNamespaceAlias(),
8051 Import(NNS.getLocalBeginLoc()),
8052 Import(NNS.getLocalEndLoc()));
Aleksei Sidorin855086d2017-01-23 09:30:36 +00008053 break;
8054
8055 case NestedNameSpecifier::TypeSpec:
8056 case NestedNameSpecifier::TypeSpecWithTemplate: {
8057 TypeSourceInfo *TSI = getToContext().getTrivialTypeSourceInfo(
8058 QualType(Spec->getAsType(), 0));
Davide Italianofaee83d2018-11-28 19:15:23 +00008059 Builder.Extend(getToContext(),
8060 Import(NNS.getLocalBeginLoc()),
8061 TSI->getTypeLoc(),
8062 Import(NNS.getLocalEndLoc()));
Aleksei Sidorin855086d2017-01-23 09:30:36 +00008063 break;
8064 }
8065
8066 case NestedNameSpecifier::Global:
Davide Italianofaee83d2018-11-28 19:15:23 +00008067 Builder.MakeGlobal(getToContext(), Import(NNS.getLocalBeginLoc()));
Aleksei Sidorin855086d2017-01-23 09:30:36 +00008068 break;
8069
8070 case NestedNameSpecifier::Super: {
Davide Italianofaee83d2018-11-28 19:15:23 +00008071 SourceRange ToRange = Import(NNS.getSourceRange());
8072 Builder.MakeSuper(getToContext(),
8073 Spec->getAsRecordDecl(),
8074 ToRange.getBegin(),
8075 ToRange.getEnd());
Aleksei Sidorin855086d2017-01-23 09:30:36 +00008076 }
8077 }
8078 }
8079
8080 return Builder.getWithLocInContext(getToContext());
Douglas Gregor14454802011-02-25 02:25:35 +00008081}
8082
Balazs Keri4a3d7582018-11-27 18:36:31 +00008083Expected<TemplateName> ASTImporter::Import_New(TemplateName From) {
Davide Italianofaee83d2018-11-28 19:15:23 +00008084 TemplateName To = Import(From);
8085 if (To.isNull() && !From.isNull())
8086 return llvm::make_error<ImportError>();
8087 return To;
8088}
8089TemplateName ASTImporter::Import(TemplateName From) {
Douglas Gregore2e50d332010-12-01 01:36:18 +00008090 switch (From.getKind()) {
8091 case TemplateName::Template:
Davide Italianofaee83d2018-11-28 19:15:23 +00008092 if (auto *ToTemplate =
8093 cast_or_null<TemplateDecl>(Import(From.getAsTemplateDecl())))
8094 return TemplateName(ToTemplate);
8095
8096 return {};
Fangrui Song6907ce22018-07-30 19:24:48 +00008097
Douglas Gregore2e50d332010-12-01 01:36:18 +00008098 case TemplateName::OverloadedTemplate: {
8099 OverloadedTemplateStorage *FromStorage = From.getAsOverloadedTemplate();
8100 UnresolvedSet<2> ToTemplates;
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00008101 for (auto *I : *FromStorage) {
Davide Italianofaee83d2018-11-28 19:15:23 +00008102 if (auto *To = cast_or_null<NamedDecl>(Import(I)))
8103 ToTemplates.addDecl(To);
Douglas Gregore2e50d332010-12-01 01:36:18 +00008104 else
Davide Italianofaee83d2018-11-28 19:15:23 +00008105 return {};
Douglas Gregore2e50d332010-12-01 01:36:18 +00008106 }
Fangrui Song6907ce22018-07-30 19:24:48 +00008107 return ToContext.getOverloadedTemplateName(ToTemplates.begin(),
Douglas Gregore2e50d332010-12-01 01:36:18 +00008108 ToTemplates.end());
8109 }
Fangrui Song6907ce22018-07-30 19:24:48 +00008110
Douglas Gregore2e50d332010-12-01 01:36:18 +00008111 case TemplateName::QualifiedTemplate: {
8112 QualifiedTemplateName *QTN = From.getAsQualifiedTemplateName();
Davide Italianofaee83d2018-11-28 19:15:23 +00008113 NestedNameSpecifier *Qualifier = Import(QTN->getQualifier());
8114 if (!Qualifier)
8115 return {};
Fangrui Song6907ce22018-07-30 19:24:48 +00008116
Davide Italianofaee83d2018-11-28 19:15:23 +00008117 if (auto *ToTemplate =
8118 cast_or_null<TemplateDecl>(Import(From.getAsTemplateDecl())))
8119 return ToContext.getQualifiedTemplateName(Qualifier,
8120 QTN->hasTemplateKeyword(),
8121 ToTemplate);
8122
8123 return {};
Douglas Gregore2e50d332010-12-01 01:36:18 +00008124 }
Fangrui Song6907ce22018-07-30 19:24:48 +00008125
Douglas Gregore2e50d332010-12-01 01:36:18 +00008126 case TemplateName::DependentTemplate: {
8127 DependentTemplateName *DTN = From.getAsDependentTemplateName();
Davide Italianofaee83d2018-11-28 19:15:23 +00008128 NestedNameSpecifier *Qualifier = Import(DTN->getQualifier());
8129 if (!Qualifier)
8130 return {};
Fangrui Song6907ce22018-07-30 19:24:48 +00008131
Douglas Gregore2e50d332010-12-01 01:36:18 +00008132 if (DTN->isIdentifier()) {
Davide Italianofaee83d2018-11-28 19:15:23 +00008133 return ToContext.getDependentTemplateName(Qualifier,
Douglas Gregore2e50d332010-12-01 01:36:18 +00008134 Import(DTN->getIdentifier()));
8135 }
Fangrui Song6907ce22018-07-30 19:24:48 +00008136
Davide Italianofaee83d2018-11-28 19:15:23 +00008137 return ToContext.getDependentTemplateName(Qualifier, DTN->getOperator());
Douglas Gregore2e50d332010-12-01 01:36:18 +00008138 }
John McCalld9dfe3a2011-06-30 08:33:18 +00008139
8140 case TemplateName::SubstTemplateTemplateParm: {
Davide Italianofaee83d2018-11-28 19:15:23 +00008141 SubstTemplateTemplateParmStorage *subst
8142 = From.getAsSubstTemplateTemplateParm();
8143 auto *param =
8144 cast_or_null<TemplateTemplateParmDecl>(Import(subst->getParameter()));
8145 if (!param)
8146 return {};
John McCalld9dfe3a2011-06-30 08:33:18 +00008147
Davide Italianofaee83d2018-11-28 19:15:23 +00008148 TemplateName replacement = Import(subst->getReplacement());
8149 if (replacement.isNull())
8150 return {};
Fangrui Song6907ce22018-07-30 19:24:48 +00008151
Davide Italianofaee83d2018-11-28 19:15:23 +00008152 return ToContext.getSubstTemplateTemplateParm(param, replacement);
John McCalld9dfe3a2011-06-30 08:33:18 +00008153 }
Fangrui Song6907ce22018-07-30 19:24:48 +00008154
Douglas Gregor5590be02011-01-15 06:45:20 +00008155 case TemplateName::SubstTemplateTemplateParmPack: {
8156 SubstTemplateTemplateParmPackStorage *SubstPack
8157 = From.getAsSubstTemplateTemplateParmPack();
Davide Italianofaee83d2018-11-28 19:15:23 +00008158 auto *Param =
8159 cast_or_null<TemplateTemplateParmDecl>(
8160 Import(SubstPack->getParameterPack()));
8161 if (!Param)
8162 return {};
Fangrui Song6907ce22018-07-30 19:24:48 +00008163
Douglas Gregor5590be02011-01-15 06:45:20 +00008164 ASTNodeImporter Importer(*this);
Davide Italianofaee83d2018-11-28 19:15:23 +00008165 Expected<TemplateArgument> ArgPack
8166 = Importer.ImportTemplateArgument(SubstPack->getArgumentPack());
8167 if (!ArgPack) {
8168 llvm::consumeError(ArgPack.takeError());
8169 return {};
8170 }
Fangrui Song6907ce22018-07-30 19:24:48 +00008171
Davide Italianofaee83d2018-11-28 19:15:23 +00008172 return ToContext.getSubstTemplateTemplateParmPack(Param, *ArgPack);
Douglas Gregor5590be02011-01-15 06:45:20 +00008173 }
Douglas Gregore2e50d332010-12-01 01:36:18 +00008174 }
Fangrui Song6907ce22018-07-30 19:24:48 +00008175
Douglas Gregore2e50d332010-12-01 01:36:18 +00008176 llvm_unreachable("Invalid template name kind");
Douglas Gregore2e50d332010-12-01 01:36:18 +00008177}
8178
Balazs Keri4a3d7582018-11-27 18:36:31 +00008179Expected<SourceLocation> ASTImporter::Import_New(SourceLocation FromLoc) {
Davide Italianofaee83d2018-11-28 19:15:23 +00008180 SourceLocation ToLoc = Import(FromLoc);
8181 if (ToLoc.isInvalid() && !FromLoc.isInvalid())
8182 return llvm::make_error<ImportError>();
8183 return ToLoc;
8184}
8185SourceLocation ASTImporter::Import(SourceLocation FromLoc) {
Douglas Gregor62d311f2010-02-09 19:21:46 +00008186 if (FromLoc.isInvalid())
Davide Italianofaee83d2018-11-28 19:15:23 +00008187 return {};
Douglas Gregor62d311f2010-02-09 19:21:46 +00008188
Douglas Gregor811663e2010-02-10 00:15:17 +00008189 SourceManager &FromSM = FromContext.getSourceManager();
Rafael Stahl29f37fb2018-07-04 13:34:05 +00008190
Douglas Gregor811663e2010-02-10 00:15:17 +00008191 std::pair<FileID, unsigned> Decomposed = FromSM.getDecomposedLoc(FromLoc);
Davide Italianofaee83d2018-11-28 19:15:23 +00008192 FileID ToFileID = Import(Decomposed.first);
8193 if (ToFileID.isInvalid())
8194 return {};
Rafael Stahl29f37fb2018-07-04 13:34:05 +00008195 SourceManager &ToSM = ToContext.getSourceManager();
Davide Italianofaee83d2018-11-28 19:15:23 +00008196 return ToSM.getComposedLoc(ToFileID, Decomposed.second);
Douglas Gregor62d311f2010-02-09 19:21:46 +00008197}
8198
Balazs Keri4a3d7582018-11-27 18:36:31 +00008199Expected<SourceRange> ASTImporter::Import_New(SourceRange FromRange) {
Davide Italianofaee83d2018-11-28 19:15:23 +00008200 SourceRange ToRange = Import(FromRange);
8201 return ToRange;
Balazs Keri4a3d7582018-11-27 18:36:31 +00008202}
Davide Italianofaee83d2018-11-28 19:15:23 +00008203SourceRange ASTImporter::Import(SourceRange FromRange) {
8204 return SourceRange(Import(FromRange.getBegin()), Import(FromRange.getEnd()));
Douglas Gregor62d311f2010-02-09 19:21:46 +00008205}
8206
Balazs Keri4a3d7582018-11-27 18:36:31 +00008207Expected<FileID> ASTImporter::Import_New(FileID FromID) {
Davide Italianofaee83d2018-11-28 19:15:23 +00008208 FileID ToID = Import(FromID);
8209 if (ToID.isInvalid() && FromID.isValid())
8210 return llvm::make_error<ImportError>();
8211 return ToID;
8212}
8213FileID ASTImporter::Import(FileID FromID) {
Rafael Stahl29f37fb2018-07-04 13:34:05 +00008214 llvm::DenseMap<FileID, FileID>::iterator Pos = ImportedFileIDs.find(FromID);
Douglas Gregor811663e2010-02-10 00:15:17 +00008215 if (Pos != ImportedFileIDs.end())
8216 return Pos->second;
Rafael Stahl29f37fb2018-07-04 13:34:05 +00008217
Douglas Gregor811663e2010-02-10 00:15:17 +00008218 SourceManager &FromSM = FromContext.getSourceManager();
8219 SourceManager &ToSM = ToContext.getSourceManager();
8220 const SrcMgr::SLocEntry &FromSLoc = FromSM.getSLocEntry(FromID);
Rafael Stahl29f37fb2018-07-04 13:34:05 +00008221
8222 // Map the FromID to the "to" source manager.
Douglas Gregor811663e2010-02-10 00:15:17 +00008223 FileID ToID;
Rafael Stahl29f37fb2018-07-04 13:34:05 +00008224 if (FromSLoc.isExpansion()) {
8225 const SrcMgr::ExpansionInfo &FromEx = FromSLoc.getExpansion();
Davide Italianofaee83d2018-11-28 19:15:23 +00008226 SourceLocation ToSpLoc = Import(FromEx.getSpellingLoc());
8227 SourceLocation ToExLocS = Import(FromEx.getExpansionLocStart());
Rafael Stahl29f37fb2018-07-04 13:34:05 +00008228 unsigned TokenLen = FromSM.getFileIDSize(FromID);
8229 SourceLocation MLoc;
8230 if (FromEx.isMacroArgExpansion()) {
Davide Italianofaee83d2018-11-28 19:15:23 +00008231 MLoc = ToSM.createMacroArgExpansionLoc(ToSpLoc, ToExLocS, TokenLen);
Rafael Stahl29f37fb2018-07-04 13:34:05 +00008232 } else {
Davide Italianofaee83d2018-11-28 19:15:23 +00008233 SourceLocation ToExLocE = Import(FromEx.getExpansionLocEnd());
8234 MLoc = ToSM.createExpansionLoc(ToSpLoc, ToExLocS, ToExLocE, TokenLen,
8235 FromEx.isExpansionTokenRange());
Rafael Stahl29f37fb2018-07-04 13:34:05 +00008236 }
8237 ToID = ToSM.getFileID(MLoc);
Douglas Gregor811663e2010-02-10 00:15:17 +00008238 } else {
Rafael Stahl29f37fb2018-07-04 13:34:05 +00008239 // Include location of this file.
Davide Italianofaee83d2018-11-28 19:15:23 +00008240 SourceLocation ToIncludeLoc = Import(FromSLoc.getFile().getIncludeLoc());
Rafael Stahl29f37fb2018-07-04 13:34:05 +00008241
8242 const SrcMgr::ContentCache *Cache = FromSLoc.getFile().getContentCache();
8243 if (Cache->OrigEntry && Cache->OrigEntry->getDir()) {
8244 // FIXME: We probably want to use getVirtualFile(), so we don't hit the
8245 // disk again
8246 // FIXME: We definitely want to re-use the existing MemoryBuffer, rather
8247 // than mmap the files several times.
8248 const FileEntry *Entry =
8249 ToFileManager.getFile(Cache->OrigEntry->getName());
8250 if (!Entry)
Davide Italianofaee83d2018-11-28 19:15:23 +00008251 return {};
8252 ToID = ToSM.createFileID(Entry, ToIncludeLoc,
Rafael Stahl29f37fb2018-07-04 13:34:05 +00008253 FromSLoc.getFile().getFileCharacteristic());
8254 } else {
8255 // FIXME: We want to re-use the existing MemoryBuffer!
8256 const llvm::MemoryBuffer *FromBuf =
8257 Cache->getBuffer(FromContext.getDiagnostics(), FromSM);
8258 std::unique_ptr<llvm::MemoryBuffer> ToBuf =
8259 llvm::MemoryBuffer::getMemBufferCopy(FromBuf->getBuffer(),
8260 FromBuf->getBufferIdentifier());
8261 ToID = ToSM.createFileID(std::move(ToBuf),
8262 FromSLoc.getFile().getFileCharacteristic());
8263 }
Douglas Gregor811663e2010-02-10 00:15:17 +00008264 }
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00008265
Sebastian Redl99219f12010-09-30 01:03:06 +00008266 ImportedFileIDs[FromID] = ToID;
Douglas Gregor811663e2010-02-10 00:15:17 +00008267 return ToID;
8268}
8269
Balazs Keri4a3d7582018-11-27 18:36:31 +00008270Expected<CXXCtorInitializer *>
8271ASTImporter::Import_New(CXXCtorInitializer *From) {
Davide Italianofaee83d2018-11-28 19:15:23 +00008272 CXXCtorInitializer *To = Import(From);
8273 if (!To && From)
8274 return llvm::make_error<ImportError>();
8275 return To;
Sean Callanandd2c1742016-05-16 20:48:03 +00008276}
Balazs Kerideaf7ab2018-11-28 13:21:26 +00008277CXXCtorInitializer *ASTImporter::Import(CXXCtorInitializer *From) {
Davide Italianofaee83d2018-11-28 19:15:23 +00008278 Expr *ToExpr = Import(From->getInit());
8279 if (!ToExpr && From->getInit())
8280 return nullptr;
8281
8282 if (From->isBaseInitializer()) {
8283 TypeSourceInfo *ToTInfo = Import(From->getTypeSourceInfo());
8284 if (!ToTInfo && From->getTypeSourceInfo())
8285 return nullptr;
8286
8287 return new (ToContext) CXXCtorInitializer(
8288 ToContext, ToTInfo, From->isBaseVirtual(), Import(From->getLParenLoc()),
8289 ToExpr, Import(From->getRParenLoc()),
8290 From->isPackExpansion() ? Import(From->getEllipsisLoc())
8291 : SourceLocation());
8292 } else if (From->isMemberInitializer()) {
8293 auto *ToField = cast_or_null<FieldDecl>(Import(From->getMember()));
8294 if (!ToField && From->getMember())
8295 return nullptr;
8296
8297 return new (ToContext) CXXCtorInitializer(
8298 ToContext, ToField, Import(From->getMemberLocation()),
8299 Import(From->getLParenLoc()), ToExpr, Import(From->getRParenLoc()));
8300 } else if (From->isIndirectMemberInitializer()) {
8301 auto *ToIField = cast_or_null<IndirectFieldDecl>(
8302 Import(From->getIndirectMember()));
8303 if (!ToIField && From->getIndirectMember())
8304 return nullptr;
8305
8306 return new (ToContext) CXXCtorInitializer(
8307 ToContext, ToIField, Import(From->getMemberLocation()),
8308 Import(From->getLParenLoc()), ToExpr, Import(From->getRParenLoc()));
8309 } else if (From->isDelegatingInitializer()) {
8310 TypeSourceInfo *ToTInfo = Import(From->getTypeSourceInfo());
8311 if (!ToTInfo && From->getTypeSourceInfo())
8312 return nullptr;
8313
8314 return new (ToContext)
8315 CXXCtorInitializer(ToContext, ToTInfo, Import(From->getLParenLoc()),
8316 ToExpr, Import(From->getRParenLoc()));
8317 } else {
8318 return nullptr;
8319 }
Balazs Kerideaf7ab2018-11-28 13:21:26 +00008320}
Sean Callanandd2c1742016-05-16 20:48:03 +00008321
Balazs Keri4a3d7582018-11-27 18:36:31 +00008322Expected<CXXBaseSpecifier *>
Davide Italianofaee83d2018-11-28 19:15:23 +00008323ASTImporter::Import_New(const CXXBaseSpecifier *From) {
8324 CXXBaseSpecifier *To = Import(From);
8325 if (!To && From)
8326 return llvm::make_error<ImportError>();
8327 return To;
8328}
8329CXXBaseSpecifier *ASTImporter::Import(const CXXBaseSpecifier *BaseSpec) {
Aleksei Sidorina693b372016-09-28 10:16:56 +00008330 auto Pos = ImportedCXXBaseSpecifiers.find(BaseSpec);
8331 if (Pos != ImportedCXXBaseSpecifiers.end())
8332 return Pos->second;
8333
8334 CXXBaseSpecifier *Imported = new (ToContext) CXXBaseSpecifier(
Davide Italianofaee83d2018-11-28 19:15:23 +00008335 Import(BaseSpec->getSourceRange()),
8336 BaseSpec->isVirtual(), BaseSpec->isBaseOfClass(),
8337 BaseSpec->getAccessSpecifierAsWritten(),
8338 Import(BaseSpec->getTypeSourceInfo()),
8339 Import(BaseSpec->getEllipsisLoc()));
Aleksei Sidorina693b372016-09-28 10:16:56 +00008340 ImportedCXXBaseSpecifiers[BaseSpec] = Imported;
8341 return Imported;
8342}
8343
Balazs Keri3b30d652018-10-19 13:32:20 +00008344Error ASTImporter::ImportDefinition_New(Decl *From) {
Douglas Gregor0a791672011-01-18 03:11:38 +00008345 Decl *To = Import(From);
8346 if (!To)
Balazs Keri3b30d652018-10-19 13:32:20 +00008347 return llvm::make_error<ImportError>();
Fangrui Song6907ce22018-07-30 19:24:48 +00008348
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00008349 if (auto *FromDC = cast<DeclContext>(From)) {
Douglas Gregor0a791672011-01-18 03:11:38 +00008350 ASTNodeImporter Importer(*this);
Fangrui Song6907ce22018-07-30 19:24:48 +00008351
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00008352 if (auto *ToRecord = dyn_cast<RecordDecl>(To)) {
Sean Callanan53a6bff2011-07-19 22:38:25 +00008353 if (!ToRecord->getDefinition()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00008354 return Importer.ImportDefinition(
8355 cast<RecordDecl>(FromDC), ToRecord,
8356 ASTNodeImporter::IDK_Everything);
Fangrui Song6907ce22018-07-30 19:24:48 +00008357 }
Sean Callanan53a6bff2011-07-19 22:38:25 +00008358 }
Douglas Gregord451ea92011-07-29 23:31:30 +00008359
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00008360 if (auto *ToEnum = dyn_cast<EnumDecl>(To)) {
Douglas Gregord451ea92011-07-29 23:31:30 +00008361 if (!ToEnum->getDefinition()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00008362 return Importer.ImportDefinition(
8363 cast<EnumDecl>(FromDC), ToEnum, ASTNodeImporter::IDK_Everything);
Fangrui Song6907ce22018-07-30 19:24:48 +00008364 }
Douglas Gregord451ea92011-07-29 23:31:30 +00008365 }
Fangrui Song6907ce22018-07-30 19:24:48 +00008366
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00008367 if (auto *ToIFace = dyn_cast<ObjCInterfaceDecl>(To)) {
Douglas Gregor2aa53772012-01-24 17:42:07 +00008368 if (!ToIFace->getDefinition()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00008369 return Importer.ImportDefinition(
8370 cast<ObjCInterfaceDecl>(FromDC), ToIFace,
8371 ASTNodeImporter::IDK_Everything);
Douglas Gregor2aa53772012-01-24 17:42:07 +00008372 }
8373 }
Douglas Gregord451ea92011-07-29 23:31:30 +00008374
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00008375 if (auto *ToProto = dyn_cast<ObjCProtocolDecl>(To)) {
Douglas Gregor2aa53772012-01-24 17:42:07 +00008376 if (!ToProto->getDefinition()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00008377 return Importer.ImportDefinition(
8378 cast<ObjCProtocolDecl>(FromDC), ToProto,
8379 ASTNodeImporter::IDK_Everything);
Douglas Gregor2aa53772012-01-24 17:42:07 +00008380 }
8381 }
Fangrui Song6907ce22018-07-30 19:24:48 +00008382
Balazs Keri3b30d652018-10-19 13:32:20 +00008383 return Importer.ImportDeclContext(FromDC, true);
Douglas Gregor0a791672011-01-18 03:11:38 +00008384 }
Balazs Keri3b30d652018-10-19 13:32:20 +00008385
8386 return Error::success();
8387}
8388
8389void ASTImporter::ImportDefinition(Decl *From) {
8390 Error Err = ImportDefinition_New(From);
8391 llvm::consumeError(std::move(Err));
Douglas Gregor0a791672011-01-18 03:11:38 +00008392}
8393
Balazs Keri4a3d7582018-11-27 18:36:31 +00008394Expected<DeclarationName> ASTImporter::Import_New(DeclarationName FromName) {
Davide Italianofaee83d2018-11-28 19:15:23 +00008395 DeclarationName ToName = Import(FromName);
8396 if (!ToName && FromName)
8397 return llvm::make_error<ImportError>();
8398 return ToName;
8399}
8400DeclarationName ASTImporter::Import(DeclarationName FromName) {
Douglas Gregor96e578d2010-02-05 17:54:41 +00008401 if (!FromName)
Davide Italianofaee83d2018-11-28 19:15:23 +00008402 return {};
Douglas Gregor96e578d2010-02-05 17:54:41 +00008403
8404 switch (FromName.getNameKind()) {
8405 case DeclarationName::Identifier:
Davide Italianofaee83d2018-11-28 19:15:23 +00008406 return Import(FromName.getAsIdentifierInfo());
Douglas Gregor96e578d2010-02-05 17:54:41 +00008407
8408 case DeclarationName::ObjCZeroArgSelector:
8409 case DeclarationName::ObjCOneArgSelector:
8410 case DeclarationName::ObjCMultiArgSelector:
Davide Italianofaee83d2018-11-28 19:15:23 +00008411 return Import(FromName.getObjCSelector());
Douglas Gregor96e578d2010-02-05 17:54:41 +00008412
8413 case DeclarationName::CXXConstructorName: {
Davide Italianofaee83d2018-11-28 19:15:23 +00008414 QualType T = Import(FromName.getCXXNameType());
8415 if (T.isNull())
8416 return {};
8417
8418 return ToContext.DeclarationNames.getCXXConstructorName(
8419 ToContext.getCanonicalType(T));
Douglas Gregor96e578d2010-02-05 17:54:41 +00008420 }
8421
8422 case DeclarationName::CXXDestructorName: {
Davide Italianofaee83d2018-11-28 19:15:23 +00008423 QualType T = Import(FromName.getCXXNameType());
8424 if (T.isNull())
8425 return {};
8426
8427 return ToContext.DeclarationNames.getCXXDestructorName(
8428 ToContext.getCanonicalType(T));
Douglas Gregor96e578d2010-02-05 17:54:41 +00008429 }
8430
Richard Smith35845152017-02-07 01:37:30 +00008431 case DeclarationName::CXXDeductionGuideName: {
Davide Italianofaee83d2018-11-28 19:15:23 +00008432 auto *Template = cast_or_null<TemplateDecl>(
8433 Import(FromName.getCXXDeductionGuideTemplate()));
8434 if (!Template)
8435 return {};
8436 return ToContext.DeclarationNames.getCXXDeductionGuideName(Template);
Richard Smith35845152017-02-07 01:37:30 +00008437 }
8438
Douglas Gregor96e578d2010-02-05 17:54:41 +00008439 case DeclarationName::CXXConversionFunctionName: {
Davide Italianofaee83d2018-11-28 19:15:23 +00008440 QualType T = Import(FromName.getCXXNameType());
8441 if (T.isNull())
8442 return {};
8443
8444 return ToContext.DeclarationNames.getCXXConversionFunctionName(
8445 ToContext.getCanonicalType(T));
Douglas Gregor96e578d2010-02-05 17:54:41 +00008446 }
8447
8448 case DeclarationName::CXXOperatorName:
8449 return ToContext.DeclarationNames.getCXXOperatorName(
8450 FromName.getCXXOverloadedOperator());
8451
8452 case DeclarationName::CXXLiteralOperatorName:
8453 return ToContext.DeclarationNames.getCXXLiteralOperatorName(
Davide Italianofaee83d2018-11-28 19:15:23 +00008454 Import(FromName.getCXXLiteralIdentifier()));
Douglas Gregor96e578d2010-02-05 17:54:41 +00008455
8456 case DeclarationName::CXXUsingDirective:
8457 // FIXME: STATICS!
8458 return DeclarationName::getUsingDirectiveName();
8459 }
8460
David Blaikiee4d798f2012-01-20 21:50:17 +00008461 llvm_unreachable("Invalid DeclarationName Kind!");
Douglas Gregor96e578d2010-02-05 17:54:41 +00008462}
8463
Douglas Gregore2e50d332010-12-01 01:36:18 +00008464IdentifierInfo *ASTImporter::Import(const IdentifierInfo *FromId) {
Douglas Gregor96e578d2010-02-05 17:54:41 +00008465 if (!FromId)
Craig Topper36250ad2014-05-12 05:36:57 +00008466 return nullptr;
Douglas Gregor96e578d2010-02-05 17:54:41 +00008467
Sean Callananf94ef1d2016-05-14 06:11:19 +00008468 IdentifierInfo *ToId = &ToContext.Idents.get(FromId->getName());
8469
8470 if (!ToId->getBuiltinID() && FromId->getBuiltinID())
8471 ToId->setBuiltinID(FromId->getBuiltinID());
8472
8473 return ToId;
Douglas Gregor96e578d2010-02-05 17:54:41 +00008474}
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00008475
Balazs Keri4a3d7582018-11-27 18:36:31 +00008476Expected<Selector> ASTImporter::Import_New(Selector FromSel) {
Davide Italianofaee83d2018-11-28 19:15:23 +00008477 Selector ToSel = Import(FromSel);
8478 if (ToSel.isNull() && !FromSel.isNull())
8479 return llvm::make_error<ImportError>();
8480 return ToSel;
8481}
8482Selector ASTImporter::Import(Selector FromSel) {
Douglas Gregor43f54792010-02-17 02:12:47 +00008483 if (FromSel.isNull())
Davide Italianofaee83d2018-11-28 19:15:23 +00008484 return {};
Douglas Gregor43f54792010-02-17 02:12:47 +00008485
Chris Lattner0e62c1c2011-07-23 10:55:15 +00008486 SmallVector<IdentifierInfo *, 4> Idents;
Douglas Gregor43f54792010-02-17 02:12:47 +00008487 Idents.push_back(Import(FromSel.getIdentifierInfoForSlot(0)));
8488 for (unsigned I = 1, N = FromSel.getNumArgs(); I < N; ++I)
8489 Idents.push_back(Import(FromSel.getIdentifierInfoForSlot(I)));
8490 return ToContext.Selectors.getSelector(FromSel.getNumArgs(), Idents.data());
8491}
8492
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00008493DeclarationName ASTImporter::HandleNameConflict(DeclarationName Name,
8494 DeclContext *DC,
8495 unsigned IDNS,
8496 NamedDecl **Decls,
8497 unsigned NumDecls) {
8498 return Name;
8499}
8500
8501DiagnosticBuilder ASTImporter::ToDiag(SourceLocation Loc, unsigned DiagID) {
Richard Smith5bb4cdf2012-12-20 02:22:15 +00008502 if (LastDiagFromFrom)
8503 ToContext.getDiagnostics().notePriorDiagnosticFrom(
8504 FromContext.getDiagnostics());
8505 LastDiagFromFrom = false;
Argyrios Kyrtzidisd0040642010-11-18 20:06:41 +00008506 return ToContext.getDiagnostics().Report(Loc, DiagID);
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00008507}
8508
8509DiagnosticBuilder ASTImporter::FromDiag(SourceLocation Loc, unsigned DiagID) {
Richard Smith5bb4cdf2012-12-20 02:22:15 +00008510 if (!LastDiagFromFrom)
8511 FromContext.getDiagnostics().notePriorDiagnosticFrom(
8512 ToContext.getDiagnostics());
8513 LastDiagFromFrom = true;
Argyrios Kyrtzidisd0040642010-11-18 20:06:41 +00008514 return FromContext.getDiagnostics().Report(Loc, DiagID);
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00008515}
Douglas Gregor8cdbe642010-02-12 23:44:20 +00008516
Douglas Gregor2e15c842012-02-01 21:00:38 +00008517void ASTImporter::CompleteDecl (Decl *D) {
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00008518 if (auto *ID = dyn_cast<ObjCInterfaceDecl>(D)) {
Douglas Gregor2e15c842012-02-01 21:00:38 +00008519 if (!ID->getDefinition())
8520 ID->startDefinition();
8521 }
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00008522 else if (auto *PD = dyn_cast<ObjCProtocolDecl>(D)) {
Douglas Gregor2e15c842012-02-01 21:00:38 +00008523 if (!PD->getDefinition())
8524 PD->startDefinition();
8525 }
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00008526 else if (auto *TD = dyn_cast<TagDecl>(D)) {
Douglas Gregor2e15c842012-02-01 21:00:38 +00008527 if (!TD->getDefinition() && !TD->isBeingDefined()) {
8528 TD->startDefinition();
8529 TD->setCompleteDefinition(true);
8530 }
8531 }
8532 else {
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00008533 assert(0 && "CompleteDecl called on a Decl that can't be completed");
Douglas Gregor2e15c842012-02-01 21:00:38 +00008534 }
8535}
8536
Gabor Marton26f72a92018-07-12 09:42:05 +00008537Decl *ASTImporter::MapImported(Decl *From, Decl *To) {
8538 llvm::DenseMap<Decl *, Decl *>::iterator Pos = ImportedDecls.find(From);
8539 assert((Pos == ImportedDecls.end() || Pos->second == To) &&
8540 "Try to import an already imported Decl");
8541 if (Pos != ImportedDecls.end())
8542 return Pos->second;
Douglas Gregor8cdbe642010-02-12 23:44:20 +00008543 ImportedDecls[From] = To;
8544 return To;
Daniel Dunbar9ced5422010-02-13 20:24:39 +00008545}
Douglas Gregorb4964f72010-02-15 23:54:17 +00008546
Douglas Gregordd6006f2012-07-17 21:16:27 +00008547bool ASTImporter::IsStructurallyEquivalent(QualType From, QualType To,
8548 bool Complain) {
John McCall424cec92011-01-19 06:33:43 +00008549 llvm::DenseMap<const Type *, const Type *>::iterator Pos
Douglas Gregorb4964f72010-02-15 23:54:17 +00008550 = ImportedTypes.find(From.getTypePtr());
8551 if (Pos != ImportedTypes.end() && ToContext.hasSameType(Import(From), To))
8552 return true;
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00008553
Douglas Gregordd6006f2012-07-17 21:16:27 +00008554 StructuralEquivalenceContext Ctx(FromContext, ToContext, NonEquivalentDecls,
Gabor Marton26f72a92018-07-12 09:42:05 +00008555 getStructuralEquivalenceKind(*this), false,
8556 Complain);
Gabor Marton950fb572018-07-17 12:39:27 +00008557 return Ctx.IsEquivalent(From, To);
Douglas Gregorb4964f72010-02-15 23:54:17 +00008558}