blob: 7034f411d733ac58b9aa4979434a2907408ad7f4 [file] [log] [blame]
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00001//===- ASTImporter.cpp - Importing ASTs from other Contexts ---------------===//
Douglas Gregor96e578d2010-02-05 17:54:41 +00002//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Douglas Gregor96e578d2010-02-05 17:54:41 +00006//
7//===----------------------------------------------------------------------===//
8//
9// This file defines the ASTImporter class which imports AST nodes from one
10// context into another context.
11//
12//===----------------------------------------------------------------------===//
Eugene Zelenko9a9c8232018-04-09 21:54:38 +000013
Douglas Gregor96e578d2010-02-05 17:54:41 +000014#include "clang/AST/ASTImporter.h"
Ilya Biryukovabc744d2019-07-18 15:43:26 +000015#include "clang/AST/ASTImporterSharedState.h"
Douglas Gregor96e578d2010-02-05 17:54:41 +000016#include "clang/AST/ASTContext.h"
Douglas Gregor811663e2010-02-10 00:15:17 +000017#include "clang/AST/ASTDiagnostic.h"
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +000018#include "clang/AST/ASTStructuralEquivalence.h"
Eugene Zelenko9a9c8232018-04-09 21:54:38 +000019#include "clang/AST/Attr.h"
20#include "clang/AST/Decl.h"
21#include "clang/AST/DeclAccessPair.h"
22#include "clang/AST/DeclBase.h"
Douglas Gregor5c73e912010-02-11 00:48:18 +000023#include "clang/AST/DeclCXX.h"
Eugene Zelenko9a9c8232018-04-09 21:54:38 +000024#include "clang/AST/DeclFriend.h"
25#include "clang/AST/DeclGroup.h"
Douglas Gregor96e578d2010-02-05 17:54:41 +000026#include "clang/AST/DeclObjC.h"
Eugene Zelenko9a9c8232018-04-09 21:54:38 +000027#include "clang/AST/DeclTemplate.h"
Douglas Gregor3aed6cd2010-02-08 21:09:39 +000028#include "clang/AST/DeclVisitor.h"
Eugene Zelenko9a9c8232018-04-09 21:54:38 +000029#include "clang/AST/DeclarationName.h"
30#include "clang/AST/Expr.h"
31#include "clang/AST/ExprCXX.h"
32#include "clang/AST/ExprObjC.h"
33#include "clang/AST/ExternalASTSource.h"
34#include "clang/AST/LambdaCapture.h"
35#include "clang/AST/NestedNameSpecifier.h"
36#include "clang/AST/OperationKinds.h"
37#include "clang/AST/Stmt.h"
38#include "clang/AST/StmtCXX.h"
39#include "clang/AST/StmtObjC.h"
Douglas Gregor7eeb5972010-02-11 19:21:55 +000040#include "clang/AST/StmtVisitor.h"
Eugene Zelenko9a9c8232018-04-09 21:54:38 +000041#include "clang/AST/TemplateBase.h"
42#include "clang/AST/TemplateName.h"
43#include "clang/AST/Type.h"
44#include "clang/AST/TypeLoc.h"
Douglas Gregor96e578d2010-02-05 17:54:41 +000045#include "clang/AST/TypeVisitor.h"
Eugene Zelenko9a9c8232018-04-09 21:54:38 +000046#include "clang/AST/UnresolvedSet.h"
Raphael Isemannba7bde62019-10-30 14:50:35 +010047#include "clang/Basic/Builtins.h"
Eugene Zelenko9a9c8232018-04-09 21:54:38 +000048#include "clang/Basic/ExceptionSpecificationType.h"
Douglas Gregor811663e2010-02-10 00:15:17 +000049#include "clang/Basic/FileManager.h"
Eugene Zelenko9a9c8232018-04-09 21:54:38 +000050#include "clang/Basic/IdentifierTable.h"
51#include "clang/Basic/LLVM.h"
52#include "clang/Basic/LangOptions.h"
53#include "clang/Basic/SourceLocation.h"
Douglas Gregor811663e2010-02-10 00:15:17 +000054#include "clang/Basic/SourceManager.h"
Eugene Zelenko9a9c8232018-04-09 21:54:38 +000055#include "clang/Basic/Specifiers.h"
56#include "llvm/ADT/APSInt.h"
57#include "llvm/ADT/ArrayRef.h"
58#include "llvm/ADT/DenseMap.h"
59#include "llvm/ADT/None.h"
60#include "llvm/ADT/Optional.h"
Balazs Kerid2c57612019-07-18 15:23:10 +000061#include "llvm/ADT/ScopeExit.h"
Ilya Biryukovabc744d2019-07-18 15:43:26 +000062#include "llvm/ADT/STLExtras.h"
Eugene Zelenko9a9c8232018-04-09 21:54:38 +000063#include "llvm/ADT/SmallVector.h"
64#include "llvm/Support/Casting.h"
65#include "llvm/Support/ErrorHandling.h"
Douglas Gregor811663e2010-02-10 00:15:17 +000066#include "llvm/Support/MemoryBuffer.h"
Eugene Zelenko9a9c8232018-04-09 21:54:38 +000067#include <algorithm>
68#include <cassert>
69#include <cstddef>
70#include <memory>
71#include <type_traits>
72#include <utility>
Douglas Gregor96e578d2010-02-05 17:54:41 +000073
Douglas Gregor3c2404b2011-11-03 18:07:07 +000074namespace clang {
Eugene Zelenko9a9c8232018-04-09 21:54:38 +000075
Balazs Keri3b30d652018-10-19 13:32:20 +000076 using llvm::make_error;
77 using llvm::Error;
78 using llvm::Expected;
79 using ExpectedType = llvm::Expected<QualType>;
80 using ExpectedStmt = llvm::Expected<Stmt *>;
81 using ExpectedExpr = llvm::Expected<Expr *>;
82 using ExpectedDecl = llvm::Expected<Decl *>;
83 using ExpectedSLoc = llvm::Expected<SourceLocation>;
Gabor Martonf035b752019-08-27 11:36:10 +000084 using ExpectedName = llvm::Expected<DeclarationName>;
Balazs Keri2544b4b2018-08-08 09:40:57 +000085
Balazs Keri3b30d652018-10-19 13:32:20 +000086 std::string ImportError::toString() const {
87 // FIXME: Improve error texts.
88 switch (Error) {
89 case NameConflict:
90 return "NameConflict";
91 case UnsupportedConstruct:
92 return "UnsupportedConstruct";
93 case Unknown:
94 return "Unknown error";
Balazs Keri2544b4b2018-08-08 09:40:57 +000095 }
Balazs Keri2a13d662018-10-19 15:16:51 +000096 llvm_unreachable("Invalid error code.");
97 return "Invalid error code.";
Balazs Keri2544b4b2018-08-08 09:40:57 +000098 }
99
Balazs Keri3b30d652018-10-19 13:32:20 +0000100 void ImportError::log(raw_ostream &OS) const {
101 OS << toString();
102 }
103
104 std::error_code ImportError::convertToErrorCode() const {
105 llvm_unreachable("Function not implemented.");
106 }
107
108 char ImportError::ID;
109
Gabor Marton5254e642018-06-27 13:32:50 +0000110 template <class T>
Balazs Keri3b30d652018-10-19 13:32:20 +0000111 SmallVector<Decl *, 2>
Gabor Marton5254e642018-06-27 13:32:50 +0000112 getCanonicalForwardRedeclChain(Redeclarable<T>* D) {
Balazs Keri3b30d652018-10-19 13:32:20 +0000113 SmallVector<Decl *, 2> Redecls;
Gabor Marton5254e642018-06-27 13:32:50 +0000114 for (auto *R : D->getFirstDecl()->redecls()) {
115 if (R != D->getFirstDecl())
116 Redecls.push_back(R);
117 }
118 Redecls.push_back(D->getFirstDecl());
119 std::reverse(Redecls.begin(), Redecls.end());
120 return Redecls;
121 }
122
123 SmallVector<Decl*, 2> getCanonicalForwardRedeclChain(Decl* D) {
Gabor Martonac3a5d62018-09-17 12:04:52 +0000124 if (auto *FD = dyn_cast<FunctionDecl>(D))
125 return getCanonicalForwardRedeclChain<FunctionDecl>(FD);
126 if (auto *VD = dyn_cast<VarDecl>(D))
127 return getCanonicalForwardRedeclChain<VarDecl>(VD);
Gabor Marton7df342a2018-12-17 12:42:12 +0000128 if (auto *TD = dyn_cast<TagDecl>(D))
129 return getCanonicalForwardRedeclChain<TagDecl>(TD);
Gabor Martonac3a5d62018-09-17 12:04:52 +0000130 llvm_unreachable("Bad declaration kind");
Gabor Marton5254e642018-06-27 13:32:50 +0000131 }
132
Gabor Marton26f72a92018-07-12 09:42:05 +0000133 void updateFlags(const Decl *From, Decl *To) {
134 // Check if some flags or attrs are new in 'From' and copy into 'To'.
135 // FIXME: Other flags or attrs?
136 if (From->isUsed(false) && !To->isUsed(false))
137 To->setIsUsed();
138 }
139
Balazs Keri3b30d652018-10-19 13:32:20 +0000140 class ASTNodeImporter : public TypeVisitor<ASTNodeImporter, ExpectedType>,
141 public DeclVisitor<ASTNodeImporter, ExpectedDecl>,
142 public StmtVisitor<ASTNodeImporter, ExpectedStmt> {
Douglas Gregor96e578d2010-02-05 17:54:41 +0000143 ASTImporter &Importer;
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +0000144
Balazs Keri3b30d652018-10-19 13:32:20 +0000145 // Use this instead of Importer.importInto .
146 template <typename ImportT>
147 LLVM_NODISCARD Error importInto(ImportT &To, const ImportT &From) {
148 return Importer.importInto(To, From);
149 }
150
151 // Use this to import pointers of specific type.
152 template <typename ImportT>
153 LLVM_NODISCARD Error importInto(ImportT *&To, ImportT *From) {
Gabor Marton5ac6d492019-05-15 10:29:48 +0000154 auto ToOrErr = Importer.Import(From);
Balazs Keri57949eb2019-03-25 09:16:39 +0000155 if (ToOrErr)
156 To = cast_or_null<ImportT>(*ToOrErr);
157 return ToOrErr.takeError();
Balazs Keri3b30d652018-10-19 13:32:20 +0000158 }
159
160 // Call the import function of ASTImporter for a baseclass of type `T` and
161 // cast the return value to `T`.
162 template <typename T>
163 Expected<T *> import(T *From) {
Gabor Marton5ac6d492019-05-15 10:29:48 +0000164 auto ToOrErr = Importer.Import(From);
Balazs Keri57949eb2019-03-25 09:16:39 +0000165 if (!ToOrErr)
166 return ToOrErr.takeError();
167 return cast_or_null<T>(*ToOrErr);
Balazs Keri3b30d652018-10-19 13:32:20 +0000168 }
169
170 template <typename T>
171 Expected<T *> import(const T *From) {
172 return import(const_cast<T *>(From));
173 }
174
175 // Call the import function of ASTImporter for type `T`.
176 template <typename T>
177 Expected<T> import(const T &From) {
Gabor Marton5ac6d492019-05-15 10:29:48 +0000178 return Importer.Import(From);
Balazs Keri3b30d652018-10-19 13:32:20 +0000179 }
180
Richard Smithb9fb1212019-05-06 03:47:15 +0000181 // Import an Optional<T> by importing the contained T, if any.
182 template<typename T>
183 Expected<Optional<T>> import(Optional<T> From) {
184 if (!From)
185 return Optional<T>();
186 return import(*From);
187 }
188
Balazs Keri3b30d652018-10-19 13:32:20 +0000189 template <class T>
190 Expected<std::tuple<T>>
191 importSeq(const T &From) {
192 Expected<T> ToOrErr = import(From);
193 if (!ToOrErr)
194 return ToOrErr.takeError();
195 return std::make_tuple<T>(std::move(*ToOrErr));
196 }
197
198 // Import multiple objects with a single function call.
199 // This should work for every type for which a variant of `import` exists.
200 // The arguments are processed from left to right and import is stopped on
201 // first error.
202 template <class THead, class... TTail>
203 Expected<std::tuple<THead, TTail...>>
204 importSeq(const THead &FromHead, const TTail &...FromTail) {
205 Expected<std::tuple<THead>> ToHeadOrErr = importSeq(FromHead);
206 if (!ToHeadOrErr)
207 return ToHeadOrErr.takeError();
208 Expected<std::tuple<TTail...>> ToTailOrErr = importSeq(FromTail...);
209 if (!ToTailOrErr)
210 return ToTailOrErr.takeError();
211 return std::tuple_cat(*ToHeadOrErr, *ToTailOrErr);
212 }
213
214// Wrapper for an overload set.
Gabor Marton26f72a92018-07-12 09:42:05 +0000215 template <typename ToDeclT> struct CallOverloadedCreateFun {
216 template <typename... Args>
217 auto operator()(Args &&... args)
218 -> decltype(ToDeclT::Create(std::forward<Args>(args)...)) {
219 return ToDeclT::Create(std::forward<Args>(args)...);
220 }
221 };
222
223 // Always use these functions to create a Decl during import. There are
224 // certain tasks which must be done after the Decl was created, e.g. we
225 // must immediately register that as an imported Decl. The parameter `ToD`
226 // will be set to the newly created Decl or if had been imported before
227 // then to the already imported Decl. Returns a bool value set to true if
228 // the `FromD` had been imported before.
229 template <typename ToDeclT, typename FromDeclT, typename... Args>
230 LLVM_NODISCARD bool GetImportedOrCreateDecl(ToDeclT *&ToD, FromDeclT *FromD,
231 Args &&... args) {
232 // There may be several overloads of ToDeclT::Create. We must make sure
233 // to call the one which would be chosen by the arguments, thus we use a
234 // wrapper for the overload set.
235 CallOverloadedCreateFun<ToDeclT> OC;
236 return GetImportedOrCreateSpecialDecl(ToD, OC, FromD,
237 std::forward<Args>(args)...);
238 }
239 // Use this overload if a special Type is needed to be created. E.g if we
240 // want to create a `TypeAliasDecl` and assign that to a `TypedefNameDecl`
241 // then:
242 // TypedefNameDecl *ToTypedef;
243 // GetImportedOrCreateDecl<TypeAliasDecl>(ToTypedef, FromD, ...);
244 template <typename NewDeclT, typename ToDeclT, typename FromDeclT,
245 typename... Args>
246 LLVM_NODISCARD bool GetImportedOrCreateDecl(ToDeclT *&ToD, FromDeclT *FromD,
247 Args &&... args) {
248 CallOverloadedCreateFun<NewDeclT> OC;
249 return GetImportedOrCreateSpecialDecl(ToD, OC, FromD,
250 std::forward<Args>(args)...);
251 }
252 // Use this version if a special create function must be
253 // used, e.g. CXXRecordDecl::CreateLambda .
254 template <typename ToDeclT, typename CreateFunT, typename FromDeclT,
255 typename... Args>
256 LLVM_NODISCARD bool
257 GetImportedOrCreateSpecialDecl(ToDeclT *&ToD, CreateFunT CreateFun,
258 FromDeclT *FromD, Args &&... args) {
Gabor Marton303c98612019-06-25 08:00:51 +0000259 if (Importer.getImportDeclErrorIfAny(FromD)) {
260 ToD = nullptr;
261 return true; // Already imported but with error.
262 }
Gabor Marton26f72a92018-07-12 09:42:05 +0000263 ToD = cast_or_null<ToDeclT>(Importer.GetAlreadyImportedOrNull(FromD));
264 if (ToD)
265 return true; // Already imported.
266 ToD = CreateFun(std::forward<Args>(args)...);
Gabor Marton54058b52018-12-17 13:53:12 +0000267 // Keep track of imported Decls.
Raphael Isemanne9bc35f2019-04-29 21:02:35 +0000268 Importer.RegisterImportedDecl(FromD, ToD);
Gabor Marton26f72a92018-07-12 09:42:05 +0000269 InitializeImportedDecl(FromD, ToD);
270 return false; // A new Decl is created.
271 }
272
273 void InitializeImportedDecl(Decl *FromD, Decl *ToD) {
Gabor Marton26f72a92018-07-12 09:42:05 +0000274 ToD->IdentifierNamespace = FromD->IdentifierNamespace;
275 if (FromD->hasAttrs())
Balazs Keri57949eb2019-03-25 09:16:39 +0000276 for (const Attr *FromAttr : FromD->getAttrs()) {
277 // FIXME: Return of the error here is not possible until store of
278 // import errors is implemented.
279 auto ToAttrOrErr = import(FromAttr);
280 if (ToAttrOrErr)
281 ToD->addAttr(*ToAttrOrErr);
282 else
283 llvm::consumeError(ToAttrOrErr.takeError());
284 }
Gabor Marton26f72a92018-07-12 09:42:05 +0000285 if (FromD->isUsed())
286 ToD->setIsUsed();
287 if (FromD->isImplicit())
288 ToD->setImplicit();
289 }
290
Gabor Martondd59d272019-03-19 14:04:50 +0000291 // Check if we have found an existing definition. Returns with that
292 // definition if yes, otherwise returns null.
293 Decl *FindAndMapDefinition(FunctionDecl *D, FunctionDecl *FoundFunction) {
294 const FunctionDecl *Definition = nullptr;
295 if (D->doesThisDeclarationHaveABody() &&
296 FoundFunction->hasBody(Definition))
297 return Importer.MapImported(D, const_cast<FunctionDecl *>(Definition));
298 return nullptr;
299 }
300
Douglas Gregor96e578d2010-02-05 17:54:41 +0000301 public:
Eugene Zelenko9a9c8232018-04-09 21:54:38 +0000302 explicit ASTNodeImporter(ASTImporter &Importer) : Importer(Importer) {}
Gabor Marton344b0992018-05-16 11:48:11 +0000303
Balazs Keri3b30d652018-10-19 13:32:20 +0000304 using TypeVisitor<ASTNodeImporter, ExpectedType>::Visit;
305 using DeclVisitor<ASTNodeImporter, ExpectedDecl>::Visit;
306 using StmtVisitor<ASTNodeImporter, ExpectedStmt>::Visit;
Douglas Gregor96e578d2010-02-05 17:54:41 +0000307
308 // Importing types
Balazs Keri3b30d652018-10-19 13:32:20 +0000309 ExpectedType VisitType(const Type *T);
310 ExpectedType VisitAtomicType(const AtomicType *T);
311 ExpectedType VisitBuiltinType(const BuiltinType *T);
312 ExpectedType VisitDecayedType(const DecayedType *T);
313 ExpectedType VisitComplexType(const ComplexType *T);
314 ExpectedType VisitPointerType(const PointerType *T);
315 ExpectedType VisitBlockPointerType(const BlockPointerType *T);
316 ExpectedType VisitLValueReferenceType(const LValueReferenceType *T);
317 ExpectedType VisitRValueReferenceType(const RValueReferenceType *T);
318 ExpectedType VisitMemberPointerType(const MemberPointerType *T);
319 ExpectedType VisitConstantArrayType(const ConstantArrayType *T);
320 ExpectedType VisitIncompleteArrayType(const IncompleteArrayType *T);
321 ExpectedType VisitVariableArrayType(const VariableArrayType *T);
322 ExpectedType VisitDependentSizedArrayType(const DependentSizedArrayType *T);
Douglas Gregor96e578d2010-02-05 17:54:41 +0000323 // FIXME: DependentSizedExtVectorType
Balazs Keri3b30d652018-10-19 13:32:20 +0000324 ExpectedType VisitVectorType(const VectorType *T);
325 ExpectedType VisitExtVectorType(const ExtVectorType *T);
326 ExpectedType VisitFunctionNoProtoType(const FunctionNoProtoType *T);
327 ExpectedType VisitFunctionProtoType(const FunctionProtoType *T);
328 ExpectedType VisitUnresolvedUsingType(const UnresolvedUsingType *T);
329 ExpectedType VisitParenType(const ParenType *T);
330 ExpectedType VisitTypedefType(const TypedefType *T);
331 ExpectedType VisitTypeOfExprType(const TypeOfExprType *T);
Douglas Gregor96e578d2010-02-05 17:54:41 +0000332 // FIXME: DependentTypeOfExprType
Balazs Keri3b30d652018-10-19 13:32:20 +0000333 ExpectedType VisitTypeOfType(const TypeOfType *T);
334 ExpectedType VisitDecltypeType(const DecltypeType *T);
335 ExpectedType VisitUnaryTransformType(const UnaryTransformType *T);
336 ExpectedType VisitAutoType(const AutoType *T);
337 ExpectedType VisitInjectedClassNameType(const InjectedClassNameType *T);
Douglas Gregor96e578d2010-02-05 17:54:41 +0000338 // FIXME: DependentDecltypeType
Balazs Keri3b30d652018-10-19 13:32:20 +0000339 ExpectedType VisitRecordType(const RecordType *T);
340 ExpectedType VisitEnumType(const EnumType *T);
341 ExpectedType VisitAttributedType(const AttributedType *T);
342 ExpectedType VisitTemplateTypeParmType(const TemplateTypeParmType *T);
343 ExpectedType VisitSubstTemplateTypeParmType(
344 const SubstTemplateTypeParmType *T);
345 ExpectedType VisitTemplateSpecializationType(
346 const TemplateSpecializationType *T);
347 ExpectedType VisitElaboratedType(const ElaboratedType *T);
348 ExpectedType VisitDependentNameType(const DependentNameType *T);
349 ExpectedType VisitPackExpansionType(const PackExpansionType *T);
350 ExpectedType VisitDependentTemplateSpecializationType(
Gabor Horvathc78d99a2018-01-27 16:11:45 +0000351 const DependentTemplateSpecializationType *T);
Balazs Keri3b30d652018-10-19 13:32:20 +0000352 ExpectedType VisitObjCInterfaceType(const ObjCInterfaceType *T);
353 ExpectedType VisitObjCObjectType(const ObjCObjectType *T);
354 ExpectedType VisitObjCObjectPointerType(const ObjCObjectPointerType *T);
Rafael Stahldf556202018-05-29 08:12:15 +0000355
356 // Importing declarations
Balazs Keri3b30d652018-10-19 13:32:20 +0000357 Error ImportDeclParts(
358 NamedDecl *D, DeclContext *&DC, DeclContext *&LexicalDC,
359 DeclarationName &Name, NamedDecl *&ToD, SourceLocation &Loc);
360 Error ImportDefinitionIfNeeded(Decl *FromD, Decl *ToD = nullptr);
361 Error ImportDeclarationNameLoc(
362 const DeclarationNameInfo &From, DeclarationNameInfo &To);
363 Error ImportDeclContext(DeclContext *FromDC, bool ForceImport = false);
364 Error ImportDeclContext(
365 Decl *From, DeclContext *&ToDC, DeclContext *&ToLexicalDC);
366 Error ImportImplicitMethods(const CXXRecordDecl *From, CXXRecordDecl *To);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +0000367
Balazs Keri3b30d652018-10-19 13:32:20 +0000368 Expected<CXXCastPath> ImportCastPath(CastExpr *E);
Aleksei Sidorina693b372016-09-28 10:16:56 +0000369
Eugene Zelenko9a9c8232018-04-09 21:54:38 +0000370 using Designator = DesignatedInitExpr::Designator;
371
Adrian Prantl9fc8faf2018-05-09 01:00:01 +0000372 /// What we should import from the definition.
Fangrui Song6907ce22018-07-30 19:24:48 +0000373 enum ImportDefinitionKind {
Adrian Prantl9fc8faf2018-05-09 01:00:01 +0000374 /// Import the default subset of the definition, which might be
Douglas Gregor95d82832012-01-24 18:36:04 +0000375 /// nothing (if minimal import is set) or might be everything (if minimal
376 /// import is not set).
377 IDK_Default,
Adrian Prantl9fc8faf2018-05-09 01:00:01 +0000378 /// Import everything.
Douglas Gregor95d82832012-01-24 18:36:04 +0000379 IDK_Everything,
Adrian Prantl9fc8faf2018-05-09 01:00:01 +0000380 /// Import only the bare bones needed to establish a valid
Douglas Gregor95d82832012-01-24 18:36:04 +0000381 /// DeclContext.
382 IDK_Basic
383 };
384
Douglas Gregor2e15c842012-02-01 21:00:38 +0000385 bool shouldForceImportDeclContext(ImportDefinitionKind IDK) {
386 return IDK == IDK_Everything ||
387 (IDK == IDK_Default && !Importer.isMinimalImport());
388 }
389
Balazs Keri3b30d652018-10-19 13:32:20 +0000390 Error ImportInitializer(VarDecl *From, VarDecl *To);
391 Error ImportDefinition(
392 RecordDecl *From, RecordDecl *To,
393 ImportDefinitionKind Kind = IDK_Default);
394 Error ImportDefinition(
395 EnumDecl *From, EnumDecl *To,
396 ImportDefinitionKind Kind = IDK_Default);
397 Error ImportDefinition(
398 ObjCInterfaceDecl *From, ObjCInterfaceDecl *To,
399 ImportDefinitionKind Kind = IDK_Default);
400 Error ImportDefinition(
401 ObjCProtocolDecl *From, ObjCProtocolDecl *To,
402 ImportDefinitionKind Kind = IDK_Default);
Balazs Keri3b30d652018-10-19 13:32:20 +0000403 Error ImportTemplateArguments(
404 const TemplateArgument *FromArgs, unsigned NumFromArgs,
405 SmallVectorImpl<TemplateArgument> &ToArgs);
406 Expected<TemplateArgument>
407 ImportTemplateArgument(const TemplateArgument &From);
Aleksei Sidorin8fc85102018-01-26 11:36:54 +0000408
Aleksei Sidorin7f758b62017-12-27 17:04:42 +0000409 template <typename InContainerTy>
Balazs Keri3b30d652018-10-19 13:32:20 +0000410 Error ImportTemplateArgumentListInfo(
411 const InContainerTy &Container, TemplateArgumentListInfo &ToTAInfo);
Aleksei Sidorin8fc85102018-01-26 11:36:54 +0000412
413 template<typename InContainerTy>
Balazs Keri3b30d652018-10-19 13:32:20 +0000414 Error ImportTemplateArgumentListInfo(
415 SourceLocation FromLAngleLoc, SourceLocation FromRAngleLoc,
416 const InContainerTy &Container, TemplateArgumentListInfo &Result);
Aleksei Sidorin8fc85102018-01-26 11:36:54 +0000417
Gabor Marton5254e642018-06-27 13:32:50 +0000418 using TemplateArgsTy = SmallVector<TemplateArgument, 8>;
Balazs Keri3b30d652018-10-19 13:32:20 +0000419 using FunctionTemplateAndArgsTy =
420 std::tuple<FunctionTemplateDecl *, TemplateArgsTy>;
421 Expected<FunctionTemplateAndArgsTy>
Gabor Marton5254e642018-06-27 13:32:50 +0000422 ImportFunctionTemplateWithTemplateArgsFromSpecialization(
423 FunctionDecl *FromFD);
Balazs Keri1efc9742019-05-07 10:55:11 +0000424 Error ImportTemplateParameterLists(const DeclaratorDecl *FromD,
425 DeclaratorDecl *ToD);
Gabor Marton5254e642018-06-27 13:32:50 +0000426
Balazs Keri3b30d652018-10-19 13:32:20 +0000427 Error ImportTemplateInformation(FunctionDecl *FromFD, FunctionDecl *ToFD);
Aleksei Sidorin8fc85102018-01-26 11:36:54 +0000428
Shafik Yaghmour96b3d202019-01-28 21:55:33 +0000429 Error ImportFunctionDeclBody(FunctionDecl *FromFD, FunctionDecl *ToFD);
430
Balazs Keric5095942019-08-14 09:41:39 +0000431 Error ImportDefaultArgOfParmVarDecl(const ParmVarDecl *FromParam,
432 ParmVarDecl *ToParam);
433
Gabor Marton458d1452019-02-14 13:07:03 +0000434 template <typename T>
435 bool hasSameVisibilityContext(T *Found, T *From);
436
Gabor Marton950fb572018-07-17 12:39:27 +0000437 bool IsStructuralMatch(Decl *From, Decl *To, bool Complain);
Douglas Gregordd6006f2012-07-17 21:16:27 +0000438 bool IsStructuralMatch(RecordDecl *FromRecord, RecordDecl *ToRecord,
439 bool Complain = true);
Larisse Voufo39a1e502013-08-06 01:03:05 +0000440 bool IsStructuralMatch(VarDecl *FromVar, VarDecl *ToVar,
441 bool Complain = true);
Douglas Gregor3996e242010-02-15 22:01:00 +0000442 bool IsStructuralMatch(EnumDecl *FromEnum, EnumDecl *ToRecord);
Douglas Gregor91155082012-11-14 22:29:20 +0000443 bool IsStructuralMatch(EnumConstantDecl *FromEC, EnumConstantDecl *ToEC);
Aleksei Sidorin7f758b62017-12-27 17:04:42 +0000444 bool IsStructuralMatch(FunctionTemplateDecl *From,
445 FunctionTemplateDecl *To);
Balazs Keric7797c42018-07-11 09:37:24 +0000446 bool IsStructuralMatch(FunctionDecl *From, FunctionDecl *To);
Douglas Gregora082a492010-11-30 19:14:50 +0000447 bool IsStructuralMatch(ClassTemplateDecl *From, ClassTemplateDecl *To);
Larisse Voufo39a1e502013-08-06 01:03:05 +0000448 bool IsStructuralMatch(VarTemplateDecl *From, VarTemplateDecl *To);
Balazs Keri3b30d652018-10-19 13:32:20 +0000449 ExpectedDecl VisitDecl(Decl *D);
450 ExpectedDecl VisitImportDecl(ImportDecl *D);
451 ExpectedDecl VisitEmptyDecl(EmptyDecl *D);
452 ExpectedDecl VisitAccessSpecDecl(AccessSpecDecl *D);
453 ExpectedDecl VisitStaticAssertDecl(StaticAssertDecl *D);
454 ExpectedDecl VisitTranslationUnitDecl(TranslationUnitDecl *D);
455 ExpectedDecl VisitNamespaceDecl(NamespaceDecl *D);
456 ExpectedDecl VisitNamespaceAliasDecl(NamespaceAliasDecl *D);
457 ExpectedDecl VisitTypedefNameDecl(TypedefNameDecl *D, bool IsAlias);
458 ExpectedDecl VisitTypedefDecl(TypedefDecl *D);
459 ExpectedDecl VisitTypeAliasDecl(TypeAliasDecl *D);
460 ExpectedDecl VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D);
461 ExpectedDecl VisitLabelDecl(LabelDecl *D);
462 ExpectedDecl VisitEnumDecl(EnumDecl *D);
463 ExpectedDecl VisitRecordDecl(RecordDecl *D);
464 ExpectedDecl VisitEnumConstantDecl(EnumConstantDecl *D);
465 ExpectedDecl VisitFunctionDecl(FunctionDecl *D);
466 ExpectedDecl VisitCXXMethodDecl(CXXMethodDecl *D);
467 ExpectedDecl VisitCXXConstructorDecl(CXXConstructorDecl *D);
468 ExpectedDecl VisitCXXDestructorDecl(CXXDestructorDecl *D);
469 ExpectedDecl VisitCXXConversionDecl(CXXConversionDecl *D);
470 ExpectedDecl VisitFieldDecl(FieldDecl *D);
471 ExpectedDecl VisitIndirectFieldDecl(IndirectFieldDecl *D);
472 ExpectedDecl VisitFriendDecl(FriendDecl *D);
473 ExpectedDecl VisitObjCIvarDecl(ObjCIvarDecl *D);
474 ExpectedDecl VisitVarDecl(VarDecl *D);
475 ExpectedDecl VisitImplicitParamDecl(ImplicitParamDecl *D);
476 ExpectedDecl VisitParmVarDecl(ParmVarDecl *D);
477 ExpectedDecl VisitObjCMethodDecl(ObjCMethodDecl *D);
478 ExpectedDecl VisitObjCTypeParamDecl(ObjCTypeParamDecl *D);
479 ExpectedDecl VisitObjCCategoryDecl(ObjCCategoryDecl *D);
480 ExpectedDecl VisitObjCProtocolDecl(ObjCProtocolDecl *D);
481 ExpectedDecl VisitLinkageSpecDecl(LinkageSpecDecl *D);
482 ExpectedDecl VisitUsingDecl(UsingDecl *D);
483 ExpectedDecl VisitUsingShadowDecl(UsingShadowDecl *D);
484 ExpectedDecl VisitUsingDirectiveDecl(UsingDirectiveDecl *D);
485 ExpectedDecl VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D);
486 ExpectedDecl VisitUnresolvedUsingTypenameDecl(UnresolvedUsingTypenameDecl *D);
Raphael Isemannba7bde62019-10-30 14:50:35 +0100487 ExpectedDecl VisitBuiltinTemplateDecl(BuiltinTemplateDecl *D);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +0000488
Balazs Keri3b30d652018-10-19 13:32:20 +0000489 Expected<ObjCTypeParamList *>
490 ImportObjCTypeParamList(ObjCTypeParamList *list);
491
492 ExpectedDecl VisitObjCInterfaceDecl(ObjCInterfaceDecl *D);
493 ExpectedDecl VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D);
494 ExpectedDecl VisitObjCImplementationDecl(ObjCImplementationDecl *D);
495 ExpectedDecl VisitObjCPropertyDecl(ObjCPropertyDecl *D);
496 ExpectedDecl VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D);
497 ExpectedDecl VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D);
498 ExpectedDecl VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D);
499 ExpectedDecl VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D);
500 ExpectedDecl VisitClassTemplateDecl(ClassTemplateDecl *D);
501 ExpectedDecl VisitClassTemplateSpecializationDecl(
Douglas Gregore2e50d332010-12-01 01:36:18 +0000502 ClassTemplateSpecializationDecl *D);
Balazs Keri3b30d652018-10-19 13:32:20 +0000503 ExpectedDecl VisitVarTemplateDecl(VarTemplateDecl *D);
504 ExpectedDecl VisitVarTemplateSpecializationDecl(VarTemplateSpecializationDecl *D);
505 ExpectedDecl VisitFunctionTemplateDecl(FunctionTemplateDecl *D);
Larisse Voufo39a1e502013-08-06 01:03:05 +0000506
Douglas Gregor7eeb5972010-02-11 19:21:55 +0000507 // Importing statements
Balazs Keri3b30d652018-10-19 13:32:20 +0000508 ExpectedStmt VisitStmt(Stmt *S);
509 ExpectedStmt VisitGCCAsmStmt(GCCAsmStmt *S);
510 ExpectedStmt VisitDeclStmt(DeclStmt *S);
511 ExpectedStmt VisitNullStmt(NullStmt *S);
512 ExpectedStmt VisitCompoundStmt(CompoundStmt *S);
513 ExpectedStmt VisitCaseStmt(CaseStmt *S);
514 ExpectedStmt VisitDefaultStmt(DefaultStmt *S);
515 ExpectedStmt VisitLabelStmt(LabelStmt *S);
516 ExpectedStmt VisitAttributedStmt(AttributedStmt *S);
517 ExpectedStmt VisitIfStmt(IfStmt *S);
518 ExpectedStmt VisitSwitchStmt(SwitchStmt *S);
519 ExpectedStmt VisitWhileStmt(WhileStmt *S);
520 ExpectedStmt VisitDoStmt(DoStmt *S);
521 ExpectedStmt VisitForStmt(ForStmt *S);
522 ExpectedStmt VisitGotoStmt(GotoStmt *S);
523 ExpectedStmt VisitIndirectGotoStmt(IndirectGotoStmt *S);
524 ExpectedStmt VisitContinueStmt(ContinueStmt *S);
525 ExpectedStmt VisitBreakStmt(BreakStmt *S);
526 ExpectedStmt VisitReturnStmt(ReturnStmt *S);
Sean Callanan59721b32015-04-28 18:41:46 +0000527 // FIXME: MSAsmStmt
528 // FIXME: SEHExceptStmt
529 // FIXME: SEHFinallyStmt
530 // FIXME: SEHTryStmt
531 // FIXME: SEHLeaveStmt
532 // FIXME: CapturedStmt
Balazs Keri3b30d652018-10-19 13:32:20 +0000533 ExpectedStmt VisitCXXCatchStmt(CXXCatchStmt *S);
534 ExpectedStmt VisitCXXTryStmt(CXXTryStmt *S);
535 ExpectedStmt VisitCXXForRangeStmt(CXXForRangeStmt *S);
Sean Callanan59721b32015-04-28 18:41:46 +0000536 // FIXME: MSDependentExistsStmt
Balazs Keri3b30d652018-10-19 13:32:20 +0000537 ExpectedStmt VisitObjCForCollectionStmt(ObjCForCollectionStmt *S);
538 ExpectedStmt VisitObjCAtCatchStmt(ObjCAtCatchStmt *S);
539 ExpectedStmt VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S);
540 ExpectedStmt VisitObjCAtTryStmt(ObjCAtTryStmt *S);
541 ExpectedStmt VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *S);
542 ExpectedStmt VisitObjCAtThrowStmt(ObjCAtThrowStmt *S);
543 ExpectedStmt VisitObjCAutoreleasePoolStmt(ObjCAutoreleasePoolStmt *S);
Douglas Gregor7eeb5972010-02-11 19:21:55 +0000544
545 // Importing expressions
Balazs Keri3b30d652018-10-19 13:32:20 +0000546 ExpectedStmt VisitExpr(Expr *E);
547 ExpectedStmt VisitVAArgExpr(VAArgExpr *E);
Tom Roeder521f0042019-02-26 19:26:41 +0000548 ExpectedStmt VisitChooseExpr(ChooseExpr *E);
Balazs Keri3b30d652018-10-19 13:32:20 +0000549 ExpectedStmt VisitGNUNullExpr(GNUNullExpr *E);
550 ExpectedStmt VisitPredefinedExpr(PredefinedExpr *E);
551 ExpectedStmt VisitDeclRefExpr(DeclRefExpr *E);
552 ExpectedStmt VisitImplicitValueInitExpr(ImplicitValueInitExpr *E);
553 ExpectedStmt VisitDesignatedInitExpr(DesignatedInitExpr *E);
554 ExpectedStmt VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E);
555 ExpectedStmt VisitIntegerLiteral(IntegerLiteral *E);
556 ExpectedStmt VisitFloatingLiteral(FloatingLiteral *E);
557 ExpectedStmt VisitImaginaryLiteral(ImaginaryLiteral *E);
558 ExpectedStmt VisitCharacterLiteral(CharacterLiteral *E);
559 ExpectedStmt VisitStringLiteral(StringLiteral *E);
560 ExpectedStmt VisitCompoundLiteralExpr(CompoundLiteralExpr *E);
561 ExpectedStmt VisitAtomicExpr(AtomicExpr *E);
562 ExpectedStmt VisitAddrLabelExpr(AddrLabelExpr *E);
Bill Wendling8003edc2018-11-09 00:41:36 +0000563 ExpectedStmt VisitConstantExpr(ConstantExpr *E);
Balazs Keri3b30d652018-10-19 13:32:20 +0000564 ExpectedStmt VisitParenExpr(ParenExpr *E);
565 ExpectedStmt VisitParenListExpr(ParenListExpr *E);
566 ExpectedStmt VisitStmtExpr(StmtExpr *E);
567 ExpectedStmt VisitUnaryOperator(UnaryOperator *E);
568 ExpectedStmt VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *E);
569 ExpectedStmt VisitBinaryOperator(BinaryOperator *E);
570 ExpectedStmt VisitConditionalOperator(ConditionalOperator *E);
571 ExpectedStmt VisitBinaryConditionalOperator(BinaryConditionalOperator *E);
572 ExpectedStmt VisitOpaqueValueExpr(OpaqueValueExpr *E);
573 ExpectedStmt VisitArrayTypeTraitExpr(ArrayTypeTraitExpr *E);
574 ExpectedStmt VisitExpressionTraitExpr(ExpressionTraitExpr *E);
575 ExpectedStmt VisitArraySubscriptExpr(ArraySubscriptExpr *E);
576 ExpectedStmt VisitCompoundAssignOperator(CompoundAssignOperator *E);
577 ExpectedStmt VisitImplicitCastExpr(ImplicitCastExpr *E);
578 ExpectedStmt VisitExplicitCastExpr(ExplicitCastExpr *E);
579 ExpectedStmt VisitOffsetOfExpr(OffsetOfExpr *OE);
580 ExpectedStmt VisitCXXThrowExpr(CXXThrowExpr *E);
581 ExpectedStmt VisitCXXNoexceptExpr(CXXNoexceptExpr *E);
582 ExpectedStmt VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E);
583 ExpectedStmt VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E);
584 ExpectedStmt VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E);
585 ExpectedStmt VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E);
586 ExpectedStmt VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *E);
587 ExpectedStmt VisitPackExpansionExpr(PackExpansionExpr *E);
588 ExpectedStmt VisitSizeOfPackExpr(SizeOfPackExpr *E);
589 ExpectedStmt VisitCXXNewExpr(CXXNewExpr *E);
590 ExpectedStmt VisitCXXDeleteExpr(CXXDeleteExpr *E);
591 ExpectedStmt VisitCXXConstructExpr(CXXConstructExpr *E);
592 ExpectedStmt VisitCXXMemberCallExpr(CXXMemberCallExpr *E);
593 ExpectedStmt VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E);
594 ExpectedStmt VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E);
595 ExpectedStmt VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr *E);
596 ExpectedStmt VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E);
597 ExpectedStmt VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E);
598 ExpectedStmt VisitExprWithCleanups(ExprWithCleanups *E);
599 ExpectedStmt VisitCXXThisExpr(CXXThisExpr *E);
600 ExpectedStmt VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E);
601 ExpectedStmt VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E);
602 ExpectedStmt VisitMemberExpr(MemberExpr *E);
603 ExpectedStmt VisitCallExpr(CallExpr *E);
604 ExpectedStmt VisitLambdaExpr(LambdaExpr *LE);
605 ExpectedStmt VisitInitListExpr(InitListExpr *E);
606 ExpectedStmt VisitCXXStdInitializerListExpr(CXXStdInitializerListExpr *E);
607 ExpectedStmt VisitCXXInheritedCtorInitExpr(CXXInheritedCtorInitExpr *E);
608 ExpectedStmt VisitArrayInitLoopExpr(ArrayInitLoopExpr *E);
609 ExpectedStmt VisitArrayInitIndexExpr(ArrayInitIndexExpr *E);
610 ExpectedStmt VisitCXXDefaultInitExpr(CXXDefaultInitExpr *E);
611 ExpectedStmt VisitCXXNamedCastExpr(CXXNamedCastExpr *E);
612 ExpectedStmt VisitSubstNonTypeTemplateParmExpr(SubstNonTypeTemplateParmExpr *E);
613 ExpectedStmt VisitTypeTraitExpr(TypeTraitExpr *E);
614 ExpectedStmt VisitCXXTypeidExpr(CXXTypeidExpr *E);
Aleksei Sidorin855086d2017-01-23 09:30:36 +0000615
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +0000616 template<typename IIter, typename OIter>
Balazs Keri3b30d652018-10-19 13:32:20 +0000617 Error ImportArrayChecked(IIter Ibegin, IIter Iend, OIter Obegin) {
Eugene Zelenko9a9c8232018-04-09 21:54:38 +0000618 using ItemT = typename std::remove_reference<decltype(*Obegin)>::type;
Balazs Keri3b30d652018-10-19 13:32:20 +0000619 for (; Ibegin != Iend; ++Ibegin, ++Obegin) {
620 Expected<ItemT> ToOrErr = import(*Ibegin);
621 if (!ToOrErr)
622 return ToOrErr.takeError();
623 *Obegin = *ToOrErr;
624 }
625 return Error::success();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +0000626 }
627
Balazs Keri3b30d652018-10-19 13:32:20 +0000628 // Import every item from a container structure into an output container.
629 // If error occurs, stops at first error and returns the error.
630 // The output container should have space for all needed elements (it is not
631 // expanded, new items are put into from the beginning).
Aleksei Sidorina693b372016-09-28 10:16:56 +0000632 template<typename InContainerTy, typename OutContainerTy>
Balazs Keri3b30d652018-10-19 13:32:20 +0000633 Error ImportContainerChecked(
634 const InContainerTy &InContainer, OutContainerTy &OutContainer) {
635 return ImportArrayChecked(
636 InContainer.begin(), InContainer.end(), OutContainer.begin());
Aleksei Sidorina693b372016-09-28 10:16:56 +0000637 }
638
639 template<typename InContainerTy, typename OIter>
Balazs Keri3b30d652018-10-19 13:32:20 +0000640 Error ImportArrayChecked(const InContainerTy &InContainer, OIter Obegin) {
Aleksei Sidorina693b372016-09-28 10:16:56 +0000641 return ImportArrayChecked(InContainer.begin(), InContainer.end(), Obegin);
642 }
Lang Hames19e07e12017-06-20 21:06:00 +0000643
Balazs Kerib4fd7d42019-08-30 10:12:14 +0000644 Error ImportOverriddenMethods(CXXMethodDecl *ToMethod,
645 CXXMethodDecl *FromMethod);
Gabor Marton5254e642018-06-27 13:32:50 +0000646
Balazs Keri3b30d652018-10-19 13:32:20 +0000647 Expected<FunctionDecl *> FindFunctionTemplateSpecialization(
648 FunctionDecl *FromFD);
Douglas Gregor96e578d2010-02-05 17:54:41 +0000649 };
Aleksei Sidorin782bfcf2018-02-14 11:39:33 +0000650
Aleksei Sidorin782bfcf2018-02-14 11:39:33 +0000651template <typename InContainerTy>
Balazs Keri3b30d652018-10-19 13:32:20 +0000652Error ASTNodeImporter::ImportTemplateArgumentListInfo(
Aleksei Sidorin782bfcf2018-02-14 11:39:33 +0000653 SourceLocation FromLAngleLoc, SourceLocation FromRAngleLoc,
654 const InContainerTy &Container, TemplateArgumentListInfo &Result) {
Balazs Keri3b30d652018-10-19 13:32:20 +0000655 auto ToLAngleLocOrErr = import(FromLAngleLoc);
656 if (!ToLAngleLocOrErr)
657 return ToLAngleLocOrErr.takeError();
658 auto ToRAngleLocOrErr = import(FromRAngleLoc);
659 if (!ToRAngleLocOrErr)
660 return ToRAngleLocOrErr.takeError();
661
662 TemplateArgumentListInfo ToTAInfo(*ToLAngleLocOrErr, *ToRAngleLocOrErr);
663 if (auto Err = ImportTemplateArgumentListInfo(Container, ToTAInfo))
664 return Err;
Aleksei Sidorin782bfcf2018-02-14 11:39:33 +0000665 Result = ToTAInfo;
Balazs Keri3b30d652018-10-19 13:32:20 +0000666 return Error::success();
Alexander Kornienkoab9db512015-06-22 23:07:51 +0000667}
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +0000668
Aleksei Sidorin782bfcf2018-02-14 11:39:33 +0000669template <>
Balazs Keri3b30d652018-10-19 13:32:20 +0000670Error ASTNodeImporter::ImportTemplateArgumentListInfo<TemplateArgumentListInfo>(
Aleksei Sidorin782bfcf2018-02-14 11:39:33 +0000671 const TemplateArgumentListInfo &From, TemplateArgumentListInfo &Result) {
672 return ImportTemplateArgumentListInfo(
673 From.getLAngleLoc(), From.getRAngleLoc(), From.arguments(), Result);
674}
675
676template <>
Balazs Keri3b30d652018-10-19 13:32:20 +0000677Error ASTNodeImporter::ImportTemplateArgumentListInfo<
678 ASTTemplateArgumentListInfo>(
679 const ASTTemplateArgumentListInfo &From,
680 TemplateArgumentListInfo &Result) {
681 return ImportTemplateArgumentListInfo(
682 From.LAngleLoc, From.RAngleLoc, From.arguments(), Result);
Aleksei Sidorin782bfcf2018-02-14 11:39:33 +0000683}
684
Balazs Keri3b30d652018-10-19 13:32:20 +0000685Expected<ASTNodeImporter::FunctionTemplateAndArgsTy>
Gabor Marton5254e642018-06-27 13:32:50 +0000686ASTNodeImporter::ImportFunctionTemplateWithTemplateArgsFromSpecialization(
687 FunctionDecl *FromFD) {
688 assert(FromFD->getTemplatedKind() ==
Balazs Keri3b30d652018-10-19 13:32:20 +0000689 FunctionDecl::TK_FunctionTemplateSpecialization);
690
691 FunctionTemplateAndArgsTy Result;
692
Gabor Marton5254e642018-06-27 13:32:50 +0000693 auto *FTSInfo = FromFD->getTemplateSpecializationInfo();
Balazs Keri3b30d652018-10-19 13:32:20 +0000694 if (Error Err = importInto(std::get<0>(Result), FTSInfo->getTemplate()))
695 return std::move(Err);
Gabor Marton5254e642018-06-27 13:32:50 +0000696
697 // Import template arguments.
698 auto TemplArgs = FTSInfo->TemplateArguments->asArray();
Balazs Keri3b30d652018-10-19 13:32:20 +0000699 if (Error Err = ImportTemplateArguments(TemplArgs.data(), TemplArgs.size(),
700 std::get<1>(Result)))
701 return std::move(Err);
Gabor Marton5254e642018-06-27 13:32:50 +0000702
Balazs Keri3b30d652018-10-19 13:32:20 +0000703 return Result;
704}
705
706template <>
707Expected<TemplateParameterList *>
708ASTNodeImporter::import(TemplateParameterList *From) {
709 SmallVector<NamedDecl *, 4> To(From->size());
710 if (Error Err = ImportContainerChecked(*From, To))
711 return std::move(Err);
712
713 ExpectedExpr ToRequiresClause = import(From->getRequiresClause());
714 if (!ToRequiresClause)
715 return ToRequiresClause.takeError();
716
717 auto ToTemplateLocOrErr = import(From->getTemplateLoc());
718 if (!ToTemplateLocOrErr)
719 return ToTemplateLocOrErr.takeError();
720 auto ToLAngleLocOrErr = import(From->getLAngleLoc());
721 if (!ToLAngleLocOrErr)
722 return ToLAngleLocOrErr.takeError();
723 auto ToRAngleLocOrErr = import(From->getRAngleLoc());
724 if (!ToRAngleLocOrErr)
725 return ToRAngleLocOrErr.takeError();
726
727 return TemplateParameterList::Create(
728 Importer.getToContext(),
729 *ToTemplateLocOrErr,
730 *ToLAngleLocOrErr,
731 To,
732 *ToRAngleLocOrErr,
733 *ToRequiresClause);
734}
735
736template <>
737Expected<TemplateArgument>
738ASTNodeImporter::import(const TemplateArgument &From) {
739 switch (From.getKind()) {
740 case TemplateArgument::Null:
741 return TemplateArgument();
742
743 case TemplateArgument::Type: {
744 ExpectedType ToTypeOrErr = import(From.getAsType());
745 if (!ToTypeOrErr)
746 return ToTypeOrErr.takeError();
747 return TemplateArgument(*ToTypeOrErr);
748 }
749
750 case TemplateArgument::Integral: {
751 ExpectedType ToTypeOrErr = import(From.getIntegralType());
752 if (!ToTypeOrErr)
753 return ToTypeOrErr.takeError();
754 return TemplateArgument(From, *ToTypeOrErr);
755 }
756
757 case TemplateArgument::Declaration: {
758 Expected<ValueDecl *> ToOrErr = import(From.getAsDecl());
759 if (!ToOrErr)
760 return ToOrErr.takeError();
761 ExpectedType ToTypeOrErr = import(From.getParamTypeForDecl());
762 if (!ToTypeOrErr)
763 return ToTypeOrErr.takeError();
764 return TemplateArgument(*ToOrErr, *ToTypeOrErr);
765 }
766
767 case TemplateArgument::NullPtr: {
768 ExpectedType ToTypeOrErr = import(From.getNullPtrType());
769 if (!ToTypeOrErr)
770 return ToTypeOrErr.takeError();
771 return TemplateArgument(*ToTypeOrErr, /*isNullPtr*/true);
772 }
773
774 case TemplateArgument::Template: {
775 Expected<TemplateName> ToTemplateOrErr = import(From.getAsTemplate());
776 if (!ToTemplateOrErr)
777 return ToTemplateOrErr.takeError();
778
779 return TemplateArgument(*ToTemplateOrErr);
780 }
781
782 case TemplateArgument::TemplateExpansion: {
783 Expected<TemplateName> ToTemplateOrErr =
784 import(From.getAsTemplateOrTemplatePattern());
785 if (!ToTemplateOrErr)
786 return ToTemplateOrErr.takeError();
787
788 return TemplateArgument(
789 *ToTemplateOrErr, From.getNumTemplateExpansions());
790 }
791
792 case TemplateArgument::Expression:
793 if (ExpectedExpr ToExpr = import(From.getAsExpr()))
794 return TemplateArgument(*ToExpr);
795 else
796 return ToExpr.takeError();
797
798 case TemplateArgument::Pack: {
799 SmallVector<TemplateArgument, 2> ToPack;
800 ToPack.reserve(From.pack_size());
801 if (Error Err = ImportTemplateArguments(
802 From.pack_begin(), From.pack_size(), ToPack))
803 return std::move(Err);
804
805 return TemplateArgument(
806 llvm::makeArrayRef(ToPack).copy(Importer.getToContext()));
807 }
808 }
809
810 llvm_unreachable("Invalid template argument kind");
811}
812
813template <>
814Expected<TemplateArgumentLoc>
815ASTNodeImporter::import(const TemplateArgumentLoc &TALoc) {
816 Expected<TemplateArgument> ArgOrErr = import(TALoc.getArgument());
817 if (!ArgOrErr)
818 return ArgOrErr.takeError();
819 TemplateArgument Arg = *ArgOrErr;
820
821 TemplateArgumentLocInfo FromInfo = TALoc.getLocInfo();
822
823 TemplateArgumentLocInfo ToInfo;
824 if (Arg.getKind() == TemplateArgument::Expression) {
825 ExpectedExpr E = import(FromInfo.getAsExpr());
826 if (!E)
827 return E.takeError();
828 ToInfo = TemplateArgumentLocInfo(*E);
829 } else if (Arg.getKind() == TemplateArgument::Type) {
830 if (auto TSIOrErr = import(FromInfo.getAsTypeSourceInfo()))
831 ToInfo = TemplateArgumentLocInfo(*TSIOrErr);
832 else
833 return TSIOrErr.takeError();
834 } else {
835 auto ToTemplateQualifierLocOrErr =
836 import(FromInfo.getTemplateQualifierLoc());
837 if (!ToTemplateQualifierLocOrErr)
838 return ToTemplateQualifierLocOrErr.takeError();
839 auto ToTemplateNameLocOrErr = import(FromInfo.getTemplateNameLoc());
840 if (!ToTemplateNameLocOrErr)
841 return ToTemplateNameLocOrErr.takeError();
842 auto ToTemplateEllipsisLocOrErr =
843 import(FromInfo.getTemplateEllipsisLoc());
844 if (!ToTemplateEllipsisLocOrErr)
845 return ToTemplateEllipsisLocOrErr.takeError();
846
847 ToInfo = TemplateArgumentLocInfo(
848 *ToTemplateQualifierLocOrErr,
849 *ToTemplateNameLocOrErr,
850 *ToTemplateEllipsisLocOrErr);
851 }
852
853 return TemplateArgumentLoc(Arg, ToInfo);
854}
855
856template <>
857Expected<DeclGroupRef> ASTNodeImporter::import(const DeclGroupRef &DG) {
858 if (DG.isNull())
859 return DeclGroupRef::Create(Importer.getToContext(), nullptr, 0);
860 size_t NumDecls = DG.end() - DG.begin();
861 SmallVector<Decl *, 1> ToDecls;
862 ToDecls.reserve(NumDecls);
863 for (Decl *FromD : DG) {
864 if (auto ToDOrErr = import(FromD))
865 ToDecls.push_back(*ToDOrErr);
866 else
867 return ToDOrErr.takeError();
868 }
869 return DeclGroupRef::Create(Importer.getToContext(),
870 ToDecls.begin(),
871 NumDecls);
872}
873
874template <>
875Expected<ASTNodeImporter::Designator>
876ASTNodeImporter::import(const Designator &D) {
877 if (D.isFieldDesignator()) {
878 IdentifierInfo *ToFieldName = Importer.Import(D.getFieldName());
879
880 ExpectedSLoc ToDotLocOrErr = import(D.getDotLoc());
881 if (!ToDotLocOrErr)
882 return ToDotLocOrErr.takeError();
883
884 ExpectedSLoc ToFieldLocOrErr = import(D.getFieldLoc());
885 if (!ToFieldLocOrErr)
886 return ToFieldLocOrErr.takeError();
887
888 return Designator(ToFieldName, *ToDotLocOrErr, *ToFieldLocOrErr);
889 }
890
891 ExpectedSLoc ToLBracketLocOrErr = import(D.getLBracketLoc());
892 if (!ToLBracketLocOrErr)
893 return ToLBracketLocOrErr.takeError();
894
895 ExpectedSLoc ToRBracketLocOrErr = import(D.getRBracketLoc());
896 if (!ToRBracketLocOrErr)
897 return ToRBracketLocOrErr.takeError();
898
899 if (D.isArrayDesignator())
900 return Designator(D.getFirstExprIndex(),
901 *ToLBracketLocOrErr, *ToRBracketLocOrErr);
902
903 ExpectedSLoc ToEllipsisLocOrErr = import(D.getEllipsisLoc());
904 if (!ToEllipsisLocOrErr)
905 return ToEllipsisLocOrErr.takeError();
906
907 assert(D.isArrayRangeDesignator());
908 return Designator(
909 D.getFirstExprIndex(), *ToLBracketLocOrErr, *ToEllipsisLocOrErr,
910 *ToRBracketLocOrErr);
911}
912
913template <>
914Expected<LambdaCapture> ASTNodeImporter::import(const LambdaCapture &From) {
915 VarDecl *Var = nullptr;
916 if (From.capturesVariable()) {
917 if (auto VarOrErr = import(From.getCapturedVar()))
918 Var = *VarOrErr;
919 else
920 return VarOrErr.takeError();
921 }
922
923 auto LocationOrErr = import(From.getLocation());
924 if (!LocationOrErr)
925 return LocationOrErr.takeError();
926
927 SourceLocation EllipsisLoc;
928 if (From.isPackExpansion())
929 if (Error Err = importInto(EllipsisLoc, From.getEllipsisLoc()))
930 return std::move(Err);
931
932 return LambdaCapture(
933 *LocationOrErr, From.isImplicit(), From.getCaptureKind(), Var,
934 EllipsisLoc);
Gabor Marton5254e642018-06-27 13:32:50 +0000935}
936
Balazs Keric86d47b2019-09-04 14:12:18 +0000937template <typename T>
938bool ASTNodeImporter::hasSameVisibilityContext(T *Found, T *From) {
939 if (From->hasExternalFormalLinkage())
940 return Found->hasExternalFormalLinkage();
941 if (Importer.GetFromTU(Found) != From->getTranslationUnitDecl())
942 return false;
943 if (From->isInAnonymousNamespace())
944 return Found->isInAnonymousNamespace();
945 else
946 return !Found->isInAnonymousNamespace() &&
947 !Found->hasExternalFormalLinkage();
948}
949
950template <>
951bool ASTNodeImporter::hasSameVisibilityContext(TypedefNameDecl *Found,
952 TypedefNameDecl *From) {
953 if (From->isInAnonymousNamespace() && Found->isInAnonymousNamespace())
954 return Importer.GetFromTU(Found) == From->getTranslationUnitDecl();
955 return From->isInAnonymousNamespace() == Found->isInAnonymousNamespace();
956}
957
Eugene Zelenko9a9c8232018-04-09 21:54:38 +0000958} // namespace clang
Aleksei Sidorin782bfcf2018-02-14 11:39:33 +0000959
Douglas Gregor3996e242010-02-15 22:01:00 +0000960//----------------------------------------------------------------------------
Douglas Gregor96e578d2010-02-05 17:54:41 +0000961// Import Types
962//----------------------------------------------------------------------------
963
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +0000964using namespace clang;
965
Balazs Keri3b30d652018-10-19 13:32:20 +0000966ExpectedType ASTNodeImporter::VisitType(const Type *T) {
Douglas Gregore4c83e42010-02-09 22:48:33 +0000967 Importer.FromDiag(SourceLocation(), diag::err_unsupported_ast_node)
968 << T->getTypeClassName();
Balazs Keri3b30d652018-10-19 13:32:20 +0000969 return make_error<ImportError>(ImportError::UnsupportedConstruct);
Douglas Gregore4c83e42010-02-09 22:48:33 +0000970}
971
Balazs Keri3b30d652018-10-19 13:32:20 +0000972ExpectedType ASTNodeImporter::VisitAtomicType(const AtomicType *T){
973 ExpectedType UnderlyingTypeOrErr = import(T->getValueType());
974 if (!UnderlyingTypeOrErr)
975 return UnderlyingTypeOrErr.takeError();
Gabor Horvath0866c2f2016-11-23 15:24:23 +0000976
Balazs Keri3b30d652018-10-19 13:32:20 +0000977 return Importer.getToContext().getAtomicType(*UnderlyingTypeOrErr);
Gabor Horvath0866c2f2016-11-23 15:24:23 +0000978}
979
Balazs Keri3b30d652018-10-19 13:32:20 +0000980ExpectedType ASTNodeImporter::VisitBuiltinType(const BuiltinType *T) {
Douglas Gregor96e578d2010-02-05 17:54:41 +0000981 switch (T->getKind()) {
Alexey Bader954ba212016-04-08 13:40:33 +0000982#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
983 case BuiltinType::Id: \
984 return Importer.getToContext().SingletonId;
Alexey Baderb62f1442016-04-13 08:33:41 +0000985#include "clang/Basic/OpenCLImageTypes.def"
Andrew Savonichev3fee3512018-11-08 11:25:41 +0000986#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
987 case BuiltinType::Id: \
988 return Importer.getToContext().Id##Ty;
989#include "clang/Basic/OpenCLExtensionTypes.def"
Richard Sandifordeb485fb2019-08-09 08:52:54 +0000990#define SVE_TYPE(Name, Id, SingletonId) \
991 case BuiltinType::Id: \
992 return Importer.getToContext().SingletonId;
993#include "clang/Basic/AArch64SVEACLETypes.def"
John McCalle314e272011-10-18 21:02:43 +0000994#define SHARED_SINGLETON_TYPE(Expansion)
995#define BUILTIN_TYPE(Id, SingletonId) \
996 case BuiltinType::Id: return Importer.getToContext().SingletonId;
997#include "clang/AST/BuiltinTypes.def"
998
999 // FIXME: for Char16, Char32, and NullPtr, make sure that the "to"
1000 // context supports C++.
1001
1002 // FIXME: for ObjCId, ObjCClass, and ObjCSel, make sure that the "to"
1003 // context supports ObjC.
1004
Douglas Gregor96e578d2010-02-05 17:54:41 +00001005 case BuiltinType::Char_U:
Fangrui Song6907ce22018-07-30 19:24:48 +00001006 // The context we're importing from has an unsigned 'char'. If we're
1007 // importing into a context with a signed 'char', translate to
Douglas Gregor96e578d2010-02-05 17:54:41 +00001008 // 'unsigned char' instead.
David Blaikiebbafb8a2012-03-11 07:00:24 +00001009 if (Importer.getToContext().getLangOpts().CharIsSigned)
Douglas Gregor96e578d2010-02-05 17:54:41 +00001010 return Importer.getToContext().UnsignedCharTy;
Fangrui Song6907ce22018-07-30 19:24:48 +00001011
Douglas Gregor96e578d2010-02-05 17:54:41 +00001012 return Importer.getToContext().CharTy;
1013
Douglas Gregor96e578d2010-02-05 17:54:41 +00001014 case BuiltinType::Char_S:
Fangrui Song6907ce22018-07-30 19:24:48 +00001015 // The context we're importing from has an unsigned 'char'. If we're
1016 // importing into a context with a signed 'char', translate to
Douglas Gregor96e578d2010-02-05 17:54:41 +00001017 // 'unsigned char' instead.
David Blaikiebbafb8a2012-03-11 07:00:24 +00001018 if (!Importer.getToContext().getLangOpts().CharIsSigned)
Douglas Gregor96e578d2010-02-05 17:54:41 +00001019 return Importer.getToContext().SignedCharTy;
Fangrui Song6907ce22018-07-30 19:24:48 +00001020
Douglas Gregor96e578d2010-02-05 17:54:41 +00001021 return Importer.getToContext().CharTy;
1022
Chris Lattnerad3467e2010-12-25 23:25:43 +00001023 case BuiltinType::WChar_S:
1024 case BuiltinType::WChar_U:
Douglas Gregor96e578d2010-02-05 17:54:41 +00001025 // FIXME: If not in C++, shall we translate to the C equivalent of
1026 // wchar_t?
1027 return Importer.getToContext().WCharTy;
Douglas Gregor96e578d2010-02-05 17:54:41 +00001028 }
David Blaikiee4d798f2012-01-20 21:50:17 +00001029
1030 llvm_unreachable("Invalid BuiltinType Kind!");
Douglas Gregor96e578d2010-02-05 17:54:41 +00001031}
1032
Balazs Keri3b30d652018-10-19 13:32:20 +00001033ExpectedType ASTNodeImporter::VisitDecayedType(const DecayedType *T) {
1034 ExpectedType ToOriginalTypeOrErr = import(T->getOriginalType());
1035 if (!ToOriginalTypeOrErr)
1036 return ToOriginalTypeOrErr.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00001037
Balazs Keri3b30d652018-10-19 13:32:20 +00001038 return Importer.getToContext().getDecayedType(*ToOriginalTypeOrErr);
Aleksei Sidorina693b372016-09-28 10:16:56 +00001039}
1040
Balazs Keri3b30d652018-10-19 13:32:20 +00001041ExpectedType ASTNodeImporter::VisitComplexType(const ComplexType *T) {
1042 ExpectedType ToElementTypeOrErr = import(T->getElementType());
1043 if (!ToElementTypeOrErr)
1044 return ToElementTypeOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001045
Balazs Keri3b30d652018-10-19 13:32:20 +00001046 return Importer.getToContext().getComplexType(*ToElementTypeOrErr);
Douglas Gregor96e578d2010-02-05 17:54:41 +00001047}
1048
Balazs Keri3b30d652018-10-19 13:32:20 +00001049ExpectedType ASTNodeImporter::VisitPointerType(const PointerType *T) {
1050 ExpectedType ToPointeeTypeOrErr = import(T->getPointeeType());
1051 if (!ToPointeeTypeOrErr)
1052 return ToPointeeTypeOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001053
Balazs Keri3b30d652018-10-19 13:32:20 +00001054 return Importer.getToContext().getPointerType(*ToPointeeTypeOrErr);
Douglas Gregor96e578d2010-02-05 17:54:41 +00001055}
1056
Balazs Keri3b30d652018-10-19 13:32:20 +00001057ExpectedType ASTNodeImporter::VisitBlockPointerType(const BlockPointerType *T) {
Douglas Gregor96e578d2010-02-05 17:54:41 +00001058 // FIXME: Check for blocks support in "to" context.
Balazs Keri3b30d652018-10-19 13:32:20 +00001059 ExpectedType ToPointeeTypeOrErr = import(T->getPointeeType());
1060 if (!ToPointeeTypeOrErr)
1061 return ToPointeeTypeOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001062
Balazs Keri3b30d652018-10-19 13:32:20 +00001063 return Importer.getToContext().getBlockPointerType(*ToPointeeTypeOrErr);
Douglas Gregor96e578d2010-02-05 17:54:41 +00001064}
1065
Balazs Keri3b30d652018-10-19 13:32:20 +00001066ExpectedType
John McCall424cec92011-01-19 06:33:43 +00001067ASTNodeImporter::VisitLValueReferenceType(const LValueReferenceType *T) {
Douglas Gregor96e578d2010-02-05 17:54:41 +00001068 // FIXME: Check for C++ support in "to" context.
Balazs Keri3b30d652018-10-19 13:32:20 +00001069 ExpectedType ToPointeeTypeOrErr = import(T->getPointeeTypeAsWritten());
1070 if (!ToPointeeTypeOrErr)
1071 return ToPointeeTypeOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001072
Balazs Keri3b30d652018-10-19 13:32:20 +00001073 return Importer.getToContext().getLValueReferenceType(*ToPointeeTypeOrErr);
Douglas Gregor96e578d2010-02-05 17:54:41 +00001074}
1075
Balazs Keri3b30d652018-10-19 13:32:20 +00001076ExpectedType
John McCall424cec92011-01-19 06:33:43 +00001077ASTNodeImporter::VisitRValueReferenceType(const RValueReferenceType *T) {
Douglas Gregor96e578d2010-02-05 17:54:41 +00001078 // FIXME: Check for C++0x support in "to" context.
Balazs Keri3b30d652018-10-19 13:32:20 +00001079 ExpectedType ToPointeeTypeOrErr = import(T->getPointeeTypeAsWritten());
1080 if (!ToPointeeTypeOrErr)
1081 return ToPointeeTypeOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001082
Balazs Keri3b30d652018-10-19 13:32:20 +00001083 return Importer.getToContext().getRValueReferenceType(*ToPointeeTypeOrErr);
Douglas Gregor96e578d2010-02-05 17:54:41 +00001084}
1085
Balazs Keri3b30d652018-10-19 13:32:20 +00001086ExpectedType
1087ASTNodeImporter::VisitMemberPointerType(const MemberPointerType *T) {
Douglas Gregor96e578d2010-02-05 17:54:41 +00001088 // FIXME: Check for C++ support in "to" context.
Balazs Keri3b30d652018-10-19 13:32:20 +00001089 ExpectedType ToPointeeTypeOrErr = import(T->getPointeeType());
1090 if (!ToPointeeTypeOrErr)
1091 return ToPointeeTypeOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001092
Balazs Keri3b30d652018-10-19 13:32:20 +00001093 ExpectedType ClassTypeOrErr = import(QualType(T->getClass(), 0));
1094 if (!ClassTypeOrErr)
1095 return ClassTypeOrErr.takeError();
1096
1097 return Importer.getToContext().getMemberPointerType(
1098 *ToPointeeTypeOrErr, (*ClassTypeOrErr).getTypePtr());
Douglas Gregor96e578d2010-02-05 17:54:41 +00001099}
1100
Balazs Keri3b30d652018-10-19 13:32:20 +00001101ExpectedType
1102ASTNodeImporter::VisitConstantArrayType(const ConstantArrayType *T) {
Richard Smith772e2662019-10-04 01:25:59 +00001103 QualType ToElementType;
1104 const Expr *ToSizeExpr;
1105 if (auto Imp = importSeq(T->getElementType(), T->getSizeExpr()))
1106 std::tie(ToElementType, ToSizeExpr) = *Imp;
1107 else
1108 return Imp.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001109
Richard Smith772e2662019-10-04 01:25:59 +00001110 return Importer.getToContext().getConstantArrayType(
1111 ToElementType, T->getSize(), ToSizeExpr, T->getSizeModifier(),
1112 T->getIndexTypeCVRQualifiers());
Douglas Gregor96e578d2010-02-05 17:54:41 +00001113}
1114
Balazs Keri3b30d652018-10-19 13:32:20 +00001115ExpectedType
John McCall424cec92011-01-19 06:33:43 +00001116ASTNodeImporter::VisitIncompleteArrayType(const IncompleteArrayType *T) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001117 ExpectedType ToElementTypeOrErr = import(T->getElementType());
1118 if (!ToElementTypeOrErr)
1119 return ToElementTypeOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001120
Balazs Keri3b30d652018-10-19 13:32:20 +00001121 return Importer.getToContext().getIncompleteArrayType(*ToElementTypeOrErr,
Douglas Gregor96e578d2010-02-05 17:54:41 +00001122 T->getSizeModifier(),
1123 T->getIndexTypeCVRQualifiers());
1124}
1125
Balazs Keri3b30d652018-10-19 13:32:20 +00001126ExpectedType
1127ASTNodeImporter::VisitVariableArrayType(const VariableArrayType *T) {
1128 QualType ToElementType;
1129 Expr *ToSizeExpr;
1130 SourceRange ToBracketsRange;
1131 if (auto Imp = importSeq(
1132 T->getElementType(), T->getSizeExpr(), T->getBracketsRange()))
1133 std::tie(ToElementType, ToSizeExpr, ToBracketsRange) = *Imp;
1134 else
1135 return Imp.takeError();
Douglas Gregor96e578d2010-02-05 17:54:41 +00001136
Balazs Keri3b30d652018-10-19 13:32:20 +00001137 return Importer.getToContext().getVariableArrayType(
1138 ToElementType, ToSizeExpr, T->getSizeModifier(),
1139 T->getIndexTypeCVRQualifiers(), ToBracketsRange);
Douglas Gregor96e578d2010-02-05 17:54:41 +00001140}
1141
Balazs Keri3b30d652018-10-19 13:32:20 +00001142ExpectedType ASTNodeImporter::VisitDependentSizedArrayType(
Gabor Horvathc78d99a2018-01-27 16:11:45 +00001143 const DependentSizedArrayType *T) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001144 QualType ToElementType;
1145 Expr *ToSizeExpr;
1146 SourceRange ToBracketsRange;
1147 if (auto Imp = importSeq(
1148 T->getElementType(), T->getSizeExpr(), T->getBracketsRange()))
1149 std::tie(ToElementType, ToSizeExpr, ToBracketsRange) = *Imp;
1150 else
1151 return Imp.takeError();
Gabor Horvathc78d99a2018-01-27 16:11:45 +00001152 // SizeExpr may be null if size is not specified directly.
1153 // For example, 'int a[]'.
Gabor Horvathc78d99a2018-01-27 16:11:45 +00001154
Gabor Horvathc78d99a2018-01-27 16:11:45 +00001155 return Importer.getToContext().getDependentSizedArrayType(
Balazs Keri3b30d652018-10-19 13:32:20 +00001156 ToElementType, ToSizeExpr, T->getSizeModifier(),
1157 T->getIndexTypeCVRQualifiers(), ToBracketsRange);
Gabor Horvathc78d99a2018-01-27 16:11:45 +00001158}
1159
Balazs Keri3b30d652018-10-19 13:32:20 +00001160ExpectedType ASTNodeImporter::VisitVectorType(const VectorType *T) {
1161 ExpectedType ToElementTypeOrErr = import(T->getElementType());
1162 if (!ToElementTypeOrErr)
1163 return ToElementTypeOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001164
Balazs Keri3b30d652018-10-19 13:32:20 +00001165 return Importer.getToContext().getVectorType(*ToElementTypeOrErr,
Douglas Gregor96e578d2010-02-05 17:54:41 +00001166 T->getNumElements(),
Bob Wilsonaeb56442010-11-10 21:56:12 +00001167 T->getVectorKind());
Douglas Gregor96e578d2010-02-05 17:54:41 +00001168}
1169
Balazs Keri3b30d652018-10-19 13:32:20 +00001170ExpectedType ASTNodeImporter::VisitExtVectorType(const ExtVectorType *T) {
1171 ExpectedType ToElementTypeOrErr = import(T->getElementType());
1172 if (!ToElementTypeOrErr)
1173 return ToElementTypeOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001174
Balazs Keri3b30d652018-10-19 13:32:20 +00001175 return Importer.getToContext().getExtVectorType(*ToElementTypeOrErr,
Douglas Gregor96e578d2010-02-05 17:54:41 +00001176 T->getNumElements());
1177}
1178
Balazs Keri3b30d652018-10-19 13:32:20 +00001179ExpectedType
John McCall424cec92011-01-19 06:33:43 +00001180ASTNodeImporter::VisitFunctionNoProtoType(const FunctionNoProtoType *T) {
Fangrui Song6907ce22018-07-30 19:24:48 +00001181 // FIXME: What happens if we're importing a function without a prototype
Douglas Gregor96e578d2010-02-05 17:54:41 +00001182 // into C++? Should we make it variadic?
Balazs Keri3b30d652018-10-19 13:32:20 +00001183 ExpectedType ToReturnTypeOrErr = import(T->getReturnType());
1184 if (!ToReturnTypeOrErr)
1185 return ToReturnTypeOrErr.takeError();
Rafael Espindolac50c27c2010-03-30 20:24:48 +00001186
Balazs Keri3b30d652018-10-19 13:32:20 +00001187 return Importer.getToContext().getFunctionNoProtoType(*ToReturnTypeOrErr,
Rafael Espindolac50c27c2010-03-30 20:24:48 +00001188 T->getExtInfo());
Douglas Gregor96e578d2010-02-05 17:54:41 +00001189}
1190
Balazs Keri3b30d652018-10-19 13:32:20 +00001191ExpectedType
1192ASTNodeImporter::VisitFunctionProtoType(const FunctionProtoType *T) {
1193 ExpectedType ToReturnTypeOrErr = import(T->getReturnType());
1194 if (!ToReturnTypeOrErr)
1195 return ToReturnTypeOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001196
Douglas Gregor96e578d2010-02-05 17:54:41 +00001197 // Import argument types
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001198 SmallVector<QualType, 4> ArgTypes;
Aaron Ballman40bd0aa2014-03-17 15:23:01 +00001199 for (const auto &A : T->param_types()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001200 ExpectedType TyOrErr = import(A);
1201 if (!TyOrErr)
1202 return TyOrErr.takeError();
1203 ArgTypes.push_back(*TyOrErr);
Douglas Gregor96e578d2010-02-05 17:54:41 +00001204 }
Fangrui Song6907ce22018-07-30 19:24:48 +00001205
Douglas Gregor96e578d2010-02-05 17:54:41 +00001206 // Import exception types
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001207 SmallVector<QualType, 4> ExceptionTypes;
Aaron Ballmanb088fbe2014-03-17 15:38:09 +00001208 for (const auto &E : T->exceptions()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001209 ExpectedType TyOrErr = import(E);
1210 if (!TyOrErr)
1211 return TyOrErr.takeError();
1212 ExceptionTypes.push_back(*TyOrErr);
Douglas Gregor96e578d2010-02-05 17:54:41 +00001213 }
John McCalldb40c7f2010-12-14 08:05:40 +00001214
Argyrios Kyrtzidisb41791d2012-09-22 01:58:06 +00001215 FunctionProtoType::ExtProtoInfo FromEPI = T->getExtProtoInfo();
1216 FunctionProtoType::ExtProtoInfo ToEPI;
1217
Balazs Keri3b30d652018-10-19 13:32:20 +00001218 auto Imp = importSeq(
1219 FromEPI.ExceptionSpec.NoexceptExpr,
1220 FromEPI.ExceptionSpec.SourceDecl,
1221 FromEPI.ExceptionSpec.SourceTemplate);
1222 if (!Imp)
1223 return Imp.takeError();
1224
Argyrios Kyrtzidisb41791d2012-09-22 01:58:06 +00001225 ToEPI.ExtInfo = FromEPI.ExtInfo;
1226 ToEPI.Variadic = FromEPI.Variadic;
1227 ToEPI.HasTrailingReturn = FromEPI.HasTrailingReturn;
1228 ToEPI.TypeQuals = FromEPI.TypeQuals;
1229 ToEPI.RefQualifier = FromEPI.RefQualifier;
Richard Smith8acb4282014-07-31 21:57:55 +00001230 ToEPI.ExceptionSpec.Type = FromEPI.ExceptionSpec.Type;
1231 ToEPI.ExceptionSpec.Exceptions = ExceptionTypes;
Balazs Keri3b30d652018-10-19 13:32:20 +00001232 std::tie(
1233 ToEPI.ExceptionSpec.NoexceptExpr,
1234 ToEPI.ExceptionSpec.SourceDecl,
1235 ToEPI.ExceptionSpec.SourceTemplate) = *Imp;
Argyrios Kyrtzidisb41791d2012-09-22 01:58:06 +00001236
Balazs Keri3b30d652018-10-19 13:32:20 +00001237 return Importer.getToContext().getFunctionType(
1238 *ToReturnTypeOrErr, ArgTypes, ToEPI);
Argyrios Kyrtzidisb41791d2012-09-22 01:58:06 +00001239}
1240
Balazs Keri3b30d652018-10-19 13:32:20 +00001241ExpectedType ASTNodeImporter::VisitUnresolvedUsingType(
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00001242 const UnresolvedUsingType *T) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001243 UnresolvedUsingTypenameDecl *ToD;
1244 Decl *ToPrevD;
1245 if (auto Imp = importSeq(T->getDecl(), T->getDecl()->getPreviousDecl()))
1246 std::tie(ToD, ToPrevD) = *Imp;
1247 else
1248 return Imp.takeError();
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00001249
Balazs Keri3b30d652018-10-19 13:32:20 +00001250 return Importer.getToContext().getTypeDeclType(
1251 ToD, cast_or_null<TypeDecl>(ToPrevD));
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00001252}
1253
Balazs Keri3b30d652018-10-19 13:32:20 +00001254ExpectedType ASTNodeImporter::VisitParenType(const ParenType *T) {
1255 ExpectedType ToInnerTypeOrErr = import(T->getInnerType());
1256 if (!ToInnerTypeOrErr)
1257 return ToInnerTypeOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001258
Balazs Keri3b30d652018-10-19 13:32:20 +00001259 return Importer.getToContext().getParenType(*ToInnerTypeOrErr);
Sean Callananda6df8a2011-08-11 16:56:07 +00001260}
1261
Balazs Keri3b30d652018-10-19 13:32:20 +00001262ExpectedType ASTNodeImporter::VisitTypedefType(const TypedefType *T) {
1263 Expected<TypedefNameDecl *> ToDeclOrErr = import(T->getDecl());
1264 if (!ToDeclOrErr)
1265 return ToDeclOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001266
Balazs Keri3b30d652018-10-19 13:32:20 +00001267 return Importer.getToContext().getTypeDeclType(*ToDeclOrErr);
Douglas Gregor96e578d2010-02-05 17:54:41 +00001268}
1269
Balazs Keri3b30d652018-10-19 13:32:20 +00001270ExpectedType ASTNodeImporter::VisitTypeOfExprType(const TypeOfExprType *T) {
1271 ExpectedExpr ToExprOrErr = import(T->getUnderlyingExpr());
1272 if (!ToExprOrErr)
1273 return ToExprOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001274
Balazs Keri3b30d652018-10-19 13:32:20 +00001275 return Importer.getToContext().getTypeOfExprType(*ToExprOrErr);
Douglas Gregor96e578d2010-02-05 17:54:41 +00001276}
1277
Balazs Keri3b30d652018-10-19 13:32:20 +00001278ExpectedType ASTNodeImporter::VisitTypeOfType(const TypeOfType *T) {
1279 ExpectedType ToUnderlyingTypeOrErr = import(T->getUnderlyingType());
1280 if (!ToUnderlyingTypeOrErr)
1281 return ToUnderlyingTypeOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001282
Balazs Keri3b30d652018-10-19 13:32:20 +00001283 return Importer.getToContext().getTypeOfType(*ToUnderlyingTypeOrErr);
Douglas Gregor96e578d2010-02-05 17:54:41 +00001284}
1285
Balazs Keri3b30d652018-10-19 13:32:20 +00001286ExpectedType ASTNodeImporter::VisitDecltypeType(const DecltypeType *T) {
Richard Smith30482bc2011-02-20 03:19:35 +00001287 // FIXME: Make sure that the "to" context supports C++0x!
Balazs Keri3b30d652018-10-19 13:32:20 +00001288 ExpectedExpr ToExprOrErr = import(T->getUnderlyingExpr());
1289 if (!ToExprOrErr)
1290 return ToExprOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001291
Balazs Keri3b30d652018-10-19 13:32:20 +00001292 ExpectedType ToUnderlyingTypeOrErr = import(T->getUnderlyingType());
1293 if (!ToUnderlyingTypeOrErr)
1294 return ToUnderlyingTypeOrErr.takeError();
Douglas Gregor81495f32012-02-12 18:42:33 +00001295
Balazs Keri3b30d652018-10-19 13:32:20 +00001296 return Importer.getToContext().getDecltypeType(
1297 *ToExprOrErr, *ToUnderlyingTypeOrErr);
Douglas Gregor96e578d2010-02-05 17:54:41 +00001298}
1299
Balazs Keri3b30d652018-10-19 13:32:20 +00001300ExpectedType
1301ASTNodeImporter::VisitUnaryTransformType(const UnaryTransformType *T) {
1302 ExpectedType ToBaseTypeOrErr = import(T->getBaseType());
1303 if (!ToBaseTypeOrErr)
1304 return ToBaseTypeOrErr.takeError();
Alexis Hunte852b102011-05-24 22:41:36 +00001305
Balazs Keri3b30d652018-10-19 13:32:20 +00001306 ExpectedType ToUnderlyingTypeOrErr = import(T->getUnderlyingType());
1307 if (!ToUnderlyingTypeOrErr)
1308 return ToUnderlyingTypeOrErr.takeError();
1309
1310 return Importer.getToContext().getUnaryTransformType(
1311 *ToBaseTypeOrErr, *ToUnderlyingTypeOrErr, T->getUTTKind());
Alexis Hunte852b102011-05-24 22:41:36 +00001312}
1313
Balazs Keri3b30d652018-10-19 13:32:20 +00001314ExpectedType ASTNodeImporter::VisitAutoType(const AutoType *T) {
Richard Smith74aeef52013-04-26 16:15:35 +00001315 // FIXME: Make sure that the "to" context supports C++11!
Balazs Keri3b30d652018-10-19 13:32:20 +00001316 ExpectedType ToDeducedTypeOrErr = import(T->getDeducedType());
1317 if (!ToDeducedTypeOrErr)
1318 return ToDeducedTypeOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001319
Balazs Keri3b30d652018-10-19 13:32:20 +00001320 return Importer.getToContext().getAutoType(*ToDeducedTypeOrErr,
1321 T->getKeyword(),
Faisal Vali2b391ab2013-09-26 19:54:12 +00001322 /*IsDependent*/false);
Richard Smith30482bc2011-02-20 03:19:35 +00001323}
1324
Balazs Keri3b30d652018-10-19 13:32:20 +00001325ExpectedType ASTNodeImporter::VisitInjectedClassNameType(
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00001326 const InjectedClassNameType *T) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001327 Expected<CXXRecordDecl *> ToDeclOrErr = import(T->getDecl());
1328 if (!ToDeclOrErr)
1329 return ToDeclOrErr.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00001330
Balazs Keri3b30d652018-10-19 13:32:20 +00001331 ExpectedType ToInjTypeOrErr = import(T->getInjectedSpecializationType());
1332 if (!ToInjTypeOrErr)
1333 return ToInjTypeOrErr.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00001334
1335 // FIXME: ASTContext::getInjectedClassNameType is not suitable for AST reading
1336 // See comments in InjectedClassNameType definition for details
1337 // return Importer.getToContext().getInjectedClassNameType(D, InjType);
1338 enum {
1339 TypeAlignmentInBits = 4,
1340 TypeAlignment = 1 << TypeAlignmentInBits
1341 };
1342
1343 return QualType(new (Importer.getToContext(), TypeAlignment)
Balazs Keri3b30d652018-10-19 13:32:20 +00001344 InjectedClassNameType(*ToDeclOrErr, *ToInjTypeOrErr), 0);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00001345}
1346
Balazs Keri3b30d652018-10-19 13:32:20 +00001347ExpectedType ASTNodeImporter::VisitRecordType(const RecordType *T) {
1348 Expected<RecordDecl *> ToDeclOrErr = import(T->getDecl());
1349 if (!ToDeclOrErr)
1350 return ToDeclOrErr.takeError();
Douglas Gregor96e578d2010-02-05 17:54:41 +00001351
Balazs Keri3b30d652018-10-19 13:32:20 +00001352 return Importer.getToContext().getTagDeclType(*ToDeclOrErr);
Douglas Gregor96e578d2010-02-05 17:54:41 +00001353}
1354
Balazs Keri3b30d652018-10-19 13:32:20 +00001355ExpectedType ASTNodeImporter::VisitEnumType(const EnumType *T) {
1356 Expected<EnumDecl *> ToDeclOrErr = import(T->getDecl());
1357 if (!ToDeclOrErr)
1358 return ToDeclOrErr.takeError();
Douglas Gregor96e578d2010-02-05 17:54:41 +00001359
Balazs Keri3b30d652018-10-19 13:32:20 +00001360 return Importer.getToContext().getTagDeclType(*ToDeclOrErr);
Douglas Gregor96e578d2010-02-05 17:54:41 +00001361}
1362
Balazs Keri3b30d652018-10-19 13:32:20 +00001363ExpectedType ASTNodeImporter::VisitAttributedType(const AttributedType *T) {
1364 ExpectedType ToModifiedTypeOrErr = import(T->getModifiedType());
1365 if (!ToModifiedTypeOrErr)
1366 return ToModifiedTypeOrErr.takeError();
1367 ExpectedType ToEquivalentTypeOrErr = import(T->getEquivalentType());
1368 if (!ToEquivalentTypeOrErr)
1369 return ToEquivalentTypeOrErr.takeError();
Sean Callanan72fe0852015-04-02 23:50:08 +00001370
1371 return Importer.getToContext().getAttributedType(T->getAttrKind(),
Balazs Keri3b30d652018-10-19 13:32:20 +00001372 *ToModifiedTypeOrErr, *ToEquivalentTypeOrErr);
Sean Callanan72fe0852015-04-02 23:50:08 +00001373}
1374
Balazs Keri3b30d652018-10-19 13:32:20 +00001375ExpectedType ASTNodeImporter::VisitTemplateTypeParmType(
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00001376 const TemplateTypeParmType *T) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001377 Expected<TemplateTypeParmDecl *> ToDeclOrErr = import(T->getDecl());
1378 if (!ToDeclOrErr)
1379 return ToDeclOrErr.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00001380
1381 return Importer.getToContext().getTemplateTypeParmType(
Balazs Keri3b30d652018-10-19 13:32:20 +00001382 T->getDepth(), T->getIndex(), T->isParameterPack(), *ToDeclOrErr);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00001383}
1384
Balazs Keri3b30d652018-10-19 13:32:20 +00001385ExpectedType ASTNodeImporter::VisitSubstTemplateTypeParmType(
Aleksei Sidorin855086d2017-01-23 09:30:36 +00001386 const SubstTemplateTypeParmType *T) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001387 ExpectedType ReplacedOrErr = import(QualType(T->getReplacedParameter(), 0));
1388 if (!ReplacedOrErr)
1389 return ReplacedOrErr.takeError();
1390 const TemplateTypeParmType *Replaced =
1391 cast<TemplateTypeParmType>((*ReplacedOrErr).getTypePtr());
Aleksei Sidorin855086d2017-01-23 09:30:36 +00001392
Balazs Keri3b30d652018-10-19 13:32:20 +00001393 ExpectedType ToReplacementTypeOrErr = import(T->getReplacementType());
1394 if (!ToReplacementTypeOrErr)
1395 return ToReplacementTypeOrErr.takeError();
Aleksei Sidorin855086d2017-01-23 09:30:36 +00001396
1397 return Importer.getToContext().getSubstTemplateTypeParmType(
Balazs Keri3b30d652018-10-19 13:32:20 +00001398 Replaced, (*ToReplacementTypeOrErr).getCanonicalType());
Aleksei Sidorin855086d2017-01-23 09:30:36 +00001399}
1400
Balazs Keri3b30d652018-10-19 13:32:20 +00001401ExpectedType ASTNodeImporter::VisitTemplateSpecializationType(
John McCall424cec92011-01-19 06:33:43 +00001402 const TemplateSpecializationType *T) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001403 auto ToTemplateOrErr = import(T->getTemplateName());
1404 if (!ToTemplateOrErr)
1405 return ToTemplateOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001406
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001407 SmallVector<TemplateArgument, 2> ToTemplateArgs;
Balazs Keri3b30d652018-10-19 13:32:20 +00001408 if (Error Err = ImportTemplateArguments(
1409 T->getArgs(), T->getNumArgs(), ToTemplateArgs))
1410 return std::move(Err);
Fangrui Song6907ce22018-07-30 19:24:48 +00001411
Douglas Gregore2e50d332010-12-01 01:36:18 +00001412 QualType ToCanonType;
1413 if (!QualType(T, 0).isCanonical()) {
Fangrui Song6907ce22018-07-30 19:24:48 +00001414 QualType FromCanonType
Douglas Gregore2e50d332010-12-01 01:36:18 +00001415 = Importer.getFromContext().getCanonicalType(QualType(T, 0));
Balazs Keri3b30d652018-10-19 13:32:20 +00001416 if (ExpectedType TyOrErr = import(FromCanonType))
1417 ToCanonType = *TyOrErr;
1418 else
1419 return TyOrErr.takeError();
Douglas Gregore2e50d332010-12-01 01:36:18 +00001420 }
Balazs Keri3b30d652018-10-19 13:32:20 +00001421 return Importer.getToContext().getTemplateSpecializationType(*ToTemplateOrErr,
David Majnemer6fbeee32016-07-07 04:43:07 +00001422 ToTemplateArgs,
Douglas Gregore2e50d332010-12-01 01:36:18 +00001423 ToCanonType);
1424}
1425
Balazs Keri3b30d652018-10-19 13:32:20 +00001426ExpectedType ASTNodeImporter::VisitElaboratedType(const ElaboratedType *T) {
Abramo Bagnara6150c882010-05-11 21:36:43 +00001427 // Note: the qualifier in an ElaboratedType is optional.
Balazs Keri3b30d652018-10-19 13:32:20 +00001428 auto ToQualifierOrErr = import(T->getQualifier());
1429 if (!ToQualifierOrErr)
1430 return ToQualifierOrErr.takeError();
Douglas Gregor96e578d2010-02-05 17:54:41 +00001431
Balazs Keri3b30d652018-10-19 13:32:20 +00001432 ExpectedType ToNamedTypeOrErr = import(T->getNamedType());
1433 if (!ToNamedTypeOrErr)
1434 return ToNamedTypeOrErr.takeError();
Douglas Gregor96e578d2010-02-05 17:54:41 +00001435
Balazs Keri3b30d652018-10-19 13:32:20 +00001436 Expected<TagDecl *> ToOwnedTagDeclOrErr = import(T->getOwnedTagDecl());
1437 if (!ToOwnedTagDeclOrErr)
1438 return ToOwnedTagDeclOrErr.takeError();
Joel E. Denny7509a2f2018-05-14 19:36:45 +00001439
Abramo Bagnara6150c882010-05-11 21:36:43 +00001440 return Importer.getToContext().getElaboratedType(T->getKeyword(),
Balazs Keri3b30d652018-10-19 13:32:20 +00001441 *ToQualifierOrErr,
1442 *ToNamedTypeOrErr,
1443 *ToOwnedTagDeclOrErr);
Douglas Gregor96e578d2010-02-05 17:54:41 +00001444}
1445
Balazs Keri3b30d652018-10-19 13:32:20 +00001446ExpectedType
1447ASTNodeImporter::VisitPackExpansionType(const PackExpansionType *T) {
1448 ExpectedType ToPatternOrErr = import(T->getPattern());
1449 if (!ToPatternOrErr)
1450 return ToPatternOrErr.takeError();
Gabor Horvath7a91c082017-11-14 11:30:38 +00001451
Balazs Keri3b30d652018-10-19 13:32:20 +00001452 return Importer.getToContext().getPackExpansionType(*ToPatternOrErr,
Gabor Horvath7a91c082017-11-14 11:30:38 +00001453 T->getNumExpansions());
1454}
1455
Balazs Keri3b30d652018-10-19 13:32:20 +00001456ExpectedType ASTNodeImporter::VisitDependentTemplateSpecializationType(
Gabor Horvathc78d99a2018-01-27 16:11:45 +00001457 const DependentTemplateSpecializationType *T) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001458 auto ToQualifierOrErr = import(T->getQualifier());
1459 if (!ToQualifierOrErr)
1460 return ToQualifierOrErr.takeError();
Gabor Horvathc78d99a2018-01-27 16:11:45 +00001461
Balazs Keri3b30d652018-10-19 13:32:20 +00001462 IdentifierInfo *ToName = Importer.Import(T->getIdentifier());
Gabor Horvathc78d99a2018-01-27 16:11:45 +00001463
1464 SmallVector<TemplateArgument, 2> ToPack;
1465 ToPack.reserve(T->getNumArgs());
Balazs Keri3b30d652018-10-19 13:32:20 +00001466 if (Error Err = ImportTemplateArguments(
1467 T->getArgs(), T->getNumArgs(), ToPack))
1468 return std::move(Err);
Gabor Horvathc78d99a2018-01-27 16:11:45 +00001469
1470 return Importer.getToContext().getDependentTemplateSpecializationType(
Balazs Keri3b30d652018-10-19 13:32:20 +00001471 T->getKeyword(), *ToQualifierOrErr, ToName, ToPack);
Gabor Horvathc78d99a2018-01-27 16:11:45 +00001472}
1473
Balazs Keri3b30d652018-10-19 13:32:20 +00001474ExpectedType
1475ASTNodeImporter::VisitDependentNameType(const DependentNameType *T) {
1476 auto ToQualifierOrErr = import(T->getQualifier());
1477 if (!ToQualifierOrErr)
1478 return ToQualifierOrErr.takeError();
Peter Szecsice7f3182018-05-07 12:08:27 +00001479
1480 IdentifierInfo *Name = Importer.Import(T->getIdentifier());
Peter Szecsice7f3182018-05-07 12:08:27 +00001481
Balazs Keri3b30d652018-10-19 13:32:20 +00001482 QualType Canon;
1483 if (T != T->getCanonicalTypeInternal().getTypePtr()) {
1484 if (ExpectedType TyOrErr = import(T->getCanonicalTypeInternal()))
1485 Canon = (*TyOrErr).getCanonicalType();
1486 else
1487 return TyOrErr.takeError();
1488 }
Peter Szecsice7f3182018-05-07 12:08:27 +00001489
Balazs Keri3b30d652018-10-19 13:32:20 +00001490 return Importer.getToContext().getDependentNameType(T->getKeyword(),
1491 *ToQualifierOrErr,
Peter Szecsice7f3182018-05-07 12:08:27 +00001492 Name, Canon);
1493}
1494
Balazs Keri3b30d652018-10-19 13:32:20 +00001495ExpectedType
1496ASTNodeImporter::VisitObjCInterfaceType(const ObjCInterfaceType *T) {
1497 Expected<ObjCInterfaceDecl *> ToDeclOrErr = import(T->getDecl());
1498 if (!ToDeclOrErr)
1499 return ToDeclOrErr.takeError();
Douglas Gregor96e578d2010-02-05 17:54:41 +00001500
Balazs Keri3b30d652018-10-19 13:32:20 +00001501 return Importer.getToContext().getObjCInterfaceType(*ToDeclOrErr);
John McCall8b07ec22010-05-15 11:32:37 +00001502}
1503
Balazs Keri3b30d652018-10-19 13:32:20 +00001504ExpectedType ASTNodeImporter::VisitObjCObjectType(const ObjCObjectType *T) {
1505 ExpectedType ToBaseTypeOrErr = import(T->getBaseType());
1506 if (!ToBaseTypeOrErr)
1507 return ToBaseTypeOrErr.takeError();
John McCall8b07ec22010-05-15 11:32:37 +00001508
Douglas Gregore9d95f12015-07-07 03:57:35 +00001509 SmallVector<QualType, 4> TypeArgs;
Douglas Gregore83b9562015-07-07 03:57:53 +00001510 for (auto TypeArg : T->getTypeArgsAsWritten()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001511 if (ExpectedType TyOrErr = import(TypeArg))
1512 TypeArgs.push_back(*TyOrErr);
1513 else
1514 return TyOrErr.takeError();
Douglas Gregore9d95f12015-07-07 03:57:35 +00001515 }
1516
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001517 SmallVector<ObjCProtocolDecl *, 4> Protocols;
Aaron Ballman1683f7b2014-03-17 15:55:30 +00001518 for (auto *P : T->quals()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001519 if (Expected<ObjCProtocolDecl *> ProtocolOrErr = import(P))
1520 Protocols.push_back(*ProtocolOrErr);
1521 else
1522 return ProtocolOrErr.takeError();
1523
Douglas Gregor96e578d2010-02-05 17:54:41 +00001524 }
1525
Balazs Keri3b30d652018-10-19 13:32:20 +00001526 return Importer.getToContext().getObjCObjectType(*ToBaseTypeOrErr, TypeArgs,
Douglas Gregorab209d82015-07-07 03:58:42 +00001527 Protocols,
1528 T->isKindOfTypeAsWritten());
Douglas Gregor96e578d2010-02-05 17:54:41 +00001529}
1530
Balazs Keri3b30d652018-10-19 13:32:20 +00001531ExpectedType
John McCall424cec92011-01-19 06:33:43 +00001532ASTNodeImporter::VisitObjCObjectPointerType(const ObjCObjectPointerType *T) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001533 ExpectedType ToPointeeTypeOrErr = import(T->getPointeeType());
1534 if (!ToPointeeTypeOrErr)
1535 return ToPointeeTypeOrErr.takeError();
Douglas Gregor96e578d2010-02-05 17:54:41 +00001536
Balazs Keri3b30d652018-10-19 13:32:20 +00001537 return Importer.getToContext().getObjCObjectPointerType(*ToPointeeTypeOrErr);
Douglas Gregor96e578d2010-02-05 17:54:41 +00001538}
1539
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00001540//----------------------------------------------------------------------------
1541// Import Declarations
1542//----------------------------------------------------------------------------
Balazs Keri3b30d652018-10-19 13:32:20 +00001543Error ASTNodeImporter::ImportDeclParts(
1544 NamedDecl *D, DeclContext *&DC, DeclContext *&LexicalDC,
1545 DeclarationName &Name, NamedDecl *&ToD, SourceLocation &Loc) {
Gabor Marton6e1510c2018-07-12 11:50:21 +00001546 // Check if RecordDecl is in FunctionDecl parameters to avoid infinite loop.
1547 // example: int struct_in_proto(struct data_t{int a;int b;} *d);
1548 DeclContext *OrigDC = D->getDeclContext();
1549 FunctionDecl *FunDecl;
1550 if (isa<RecordDecl>(D) && (FunDecl = dyn_cast<FunctionDecl>(OrigDC)) &&
1551 FunDecl->hasBody()) {
Gabor Martonfe68e292018-08-06 14:38:37 +00001552 auto getLeafPointeeType = [](const Type *T) {
1553 while (T->isPointerType() || T->isArrayType()) {
1554 T = T->getPointeeOrArrayElementType();
1555 }
1556 return T;
1557 };
1558 for (const ParmVarDecl *P : FunDecl->parameters()) {
1559 const Type *LeafT =
1560 getLeafPointeeType(P->getType().getCanonicalType().getTypePtr());
1561 auto *RT = dyn_cast<RecordType>(LeafT);
1562 if (RT && RT->getDecl() == D) {
1563 Importer.FromDiag(D->getLocation(), diag::err_unsupported_ast_node)
1564 << D->getDeclKindName();
Balazs Keri3b30d652018-10-19 13:32:20 +00001565 return make_error<ImportError>(ImportError::UnsupportedConstruct);
Gabor Martonfe68e292018-08-06 14:38:37 +00001566 }
Gabor Marton6e1510c2018-07-12 11:50:21 +00001567 }
1568 }
1569
Douglas Gregorbb7930c2010-02-10 19:54:31 +00001570 // Import the context of this declaration.
Balazs Keri3b30d652018-10-19 13:32:20 +00001571 if (Error Err = ImportDeclContext(D, DC, LexicalDC))
1572 return Err;
Fangrui Song6907ce22018-07-30 19:24:48 +00001573
Douglas Gregorbb7930c2010-02-10 19:54:31 +00001574 // Import the name of this declaration.
Balazs Keri3b30d652018-10-19 13:32:20 +00001575 if (Error Err = importInto(Name, D->getDeclName()))
1576 return Err;
Fangrui Song6907ce22018-07-30 19:24:48 +00001577
Douglas Gregorbb7930c2010-02-10 19:54:31 +00001578 // Import the location of this declaration.
Balazs Keri3b30d652018-10-19 13:32:20 +00001579 if (Error Err = importInto(Loc, D->getLocation()))
1580 return Err;
1581
Sean Callanan59721b32015-04-28 18:41:46 +00001582 ToD = cast_or_null<NamedDecl>(Importer.GetAlreadyImportedOrNull(D));
Gabor Martonbe77a982018-12-12 11:22:55 +00001583 if (ToD)
1584 if (Error Err = ASTNodeImporter(*this).ImportDefinitionIfNeeded(D, ToD))
1585 return Err;
Balazs Keri3b30d652018-10-19 13:32:20 +00001586
1587 return Error::success();
Douglas Gregorbb7930c2010-02-10 19:54:31 +00001588}
1589
Balazs Keri3b30d652018-10-19 13:32:20 +00001590Error ASTNodeImporter::ImportDefinitionIfNeeded(Decl *FromD, Decl *ToD) {
Douglas Gregord451ea92011-07-29 23:31:30 +00001591 if (!FromD)
Balazs Keri3b30d652018-10-19 13:32:20 +00001592 return Error::success();
Fangrui Song6907ce22018-07-30 19:24:48 +00001593
Balazs Keri3b30d652018-10-19 13:32:20 +00001594 if (!ToD)
1595 if (Error Err = importInto(ToD, FromD))
1596 return Err;
Fangrui Song6907ce22018-07-30 19:24:48 +00001597
Balazs Keri3b30d652018-10-19 13:32:20 +00001598 if (RecordDecl *FromRecord = dyn_cast<RecordDecl>(FromD)) {
1599 if (RecordDecl *ToRecord = cast<RecordDecl>(ToD)) {
1600 if (FromRecord->getDefinition() && FromRecord->isCompleteDefinition() &&
1601 !ToRecord->getDefinition()) {
1602 if (Error Err = ImportDefinition(FromRecord, ToRecord))
1603 return Err;
Douglas Gregord451ea92011-07-29 23:31:30 +00001604 }
1605 }
Balazs Keri3b30d652018-10-19 13:32:20 +00001606 return Error::success();
Douglas Gregord451ea92011-07-29 23:31:30 +00001607 }
1608
Balazs Keri3b30d652018-10-19 13:32:20 +00001609 if (EnumDecl *FromEnum = dyn_cast<EnumDecl>(FromD)) {
1610 if (EnumDecl *ToEnum = cast<EnumDecl>(ToD)) {
Douglas Gregord451ea92011-07-29 23:31:30 +00001611 if (FromEnum->getDefinition() && !ToEnum->getDefinition()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001612 if (Error Err = ImportDefinition(FromEnum, ToEnum))
1613 return Err;
Douglas Gregord451ea92011-07-29 23:31:30 +00001614 }
1615 }
Balazs Keri3b30d652018-10-19 13:32:20 +00001616 return Error::success();
Douglas Gregord451ea92011-07-29 23:31:30 +00001617 }
Balazs Keri3b30d652018-10-19 13:32:20 +00001618
1619 return Error::success();
Douglas Gregord451ea92011-07-29 23:31:30 +00001620}
1621
Balazs Keri3b30d652018-10-19 13:32:20 +00001622Error
1623ASTNodeImporter::ImportDeclarationNameLoc(
1624 const DeclarationNameInfo &From, DeclarationNameInfo& To) {
Abramo Bagnarad6d2f182010-08-11 22:01:17 +00001625 // NOTE: To.Name and To.Loc are already imported.
1626 // We only have to import To.LocInfo.
1627 switch (To.getName().getNameKind()) {
1628 case DeclarationName::Identifier:
1629 case DeclarationName::ObjCZeroArgSelector:
1630 case DeclarationName::ObjCOneArgSelector:
1631 case DeclarationName::ObjCMultiArgSelector:
1632 case DeclarationName::CXXUsingDirective:
Richard Smith35845152017-02-07 01:37:30 +00001633 case DeclarationName::CXXDeductionGuideName:
Balazs Keri3b30d652018-10-19 13:32:20 +00001634 return Error::success();
Abramo Bagnarad6d2f182010-08-11 22:01:17 +00001635
1636 case DeclarationName::CXXOperatorName: {
Balazs Keri3b30d652018-10-19 13:32:20 +00001637 if (auto ToRangeOrErr = import(From.getCXXOperatorNameRange()))
1638 To.setCXXOperatorNameRange(*ToRangeOrErr);
1639 else
1640 return ToRangeOrErr.takeError();
1641 return Error::success();
Abramo Bagnarad6d2f182010-08-11 22:01:17 +00001642 }
1643 case DeclarationName::CXXLiteralOperatorName: {
Balazs Keri3b30d652018-10-19 13:32:20 +00001644 if (ExpectedSLoc LocOrErr = import(From.getCXXLiteralOperatorNameLoc()))
1645 To.setCXXLiteralOperatorNameLoc(*LocOrErr);
1646 else
1647 return LocOrErr.takeError();
1648 return Error::success();
Abramo Bagnarad6d2f182010-08-11 22:01:17 +00001649 }
1650 case DeclarationName::CXXConstructorName:
1651 case DeclarationName::CXXDestructorName:
1652 case DeclarationName::CXXConversionFunctionName: {
Balazs Keri3b30d652018-10-19 13:32:20 +00001653 if (auto ToTInfoOrErr = import(From.getNamedTypeInfo()))
1654 To.setNamedTypeInfo(*ToTInfoOrErr);
1655 else
1656 return ToTInfoOrErr.takeError();
1657 return Error::success();
Abramo Bagnarad6d2f182010-08-11 22:01:17 +00001658 }
Abramo Bagnarad6d2f182010-08-11 22:01:17 +00001659 }
Douglas Gregor07216d12011-11-02 20:52:01 +00001660 llvm_unreachable("Unknown name kind.");
Abramo Bagnarad6d2f182010-08-11 22:01:17 +00001661}
1662
Balazs Keri3b30d652018-10-19 13:32:20 +00001663Error
1664ASTNodeImporter::ImportDeclContext(DeclContext *FromDC, bool ForceImport) {
Douglas Gregor0a791672011-01-18 03:11:38 +00001665 if (Importer.isMinimalImport() && !ForceImport) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001666 auto ToDCOrErr = Importer.ImportContext(FromDC);
1667 return ToDCOrErr.takeError();
1668 }
Gabor Marton17c3eaf2019-07-01 12:44:39 +00001669
1670 // We use strict error handling in case of records and enums, but not
1671 // with e.g. namespaces.
1672 //
1673 // FIXME Clients of the ASTImporter should be able to choose an
1674 // appropriate error handling strategy for their needs. For instance,
1675 // they may not want to mark an entire namespace as erroneous merely
1676 // because there is an ODR error with two typedefs. As another example,
1677 // the client may allow EnumConstantDecls with same names but with
1678 // different values in two distinct translation units.
1679 bool AccumulateChildErrors = isa<TagDecl>(FromDC);
1680
1681 Error ChildErrors = Error::success();
Balazs Keri3b30d652018-10-19 13:32:20 +00001682 for (auto *From : FromDC->decls()) {
1683 ExpectedDecl ImportedOrErr = import(From);
Gabor Marton17c3eaf2019-07-01 12:44:39 +00001684 if (!ImportedOrErr) {
1685 if (AccumulateChildErrors)
1686 ChildErrors =
1687 joinErrors(std::move(ChildErrors), ImportedOrErr.takeError());
1688 else
1689 consumeError(ImportedOrErr.takeError());
1690 }
Douglas Gregor0a791672011-01-18 03:11:38 +00001691 }
Fangrui Song6907ce22018-07-30 19:24:48 +00001692
Gabor Marton48b16e12019-07-25 09:07:17 +00001693 // We reorder declarations in RecordDecls because they may have another order
1694 // in the "to" context than they have in the "from" context. This may happen
1695 // e.g when we import a class like this:
1696 // struct declToImport {
1697 // int a = c + b;
1698 // int b = 1;
1699 // int c = 2;
1700 // };
1701 // During the import of `a` we import first the dependencies in sequence,
1702 // thus the order would be `c`, `b`, `a`. We will get the normal order by
1703 // first removing the already imported members and then adding them in the
1704 // order as they apper in the "from" context.
1705 //
1706 // Keeping field order is vital because it determines structure layout.
1707 //
1708 // Here and below, we cannot call field_begin() method and its callers on
1709 // ToDC if it has an external storage. Calling field_begin() will
1710 // automatically load all the fields by calling
1711 // LoadFieldsFromExternalStorage(). LoadFieldsFromExternalStorage() would
1712 // call ASTImporter::Import(). This is because the ExternalASTSource
1713 // interface in LLDB is implemented by the means of the ASTImporter. However,
1714 // calling an import at this point would result in an uncontrolled import, we
1715 // must avoid that.
1716 const auto *FromRD = dyn_cast<RecordDecl>(FromDC);
1717 if (!FromRD)
1718 return ChildErrors;
1719
1720 auto ToDCOrErr = Importer.ImportContext(FromDC);
1721 if (!ToDCOrErr) {
1722 consumeError(std::move(ChildErrors));
1723 return ToDCOrErr.takeError();
1724 }
1725
1726 DeclContext *ToDC = *ToDCOrErr;
1727 // Remove all declarations, which may be in wrong order in the
1728 // lexical DeclContext and then add them in the proper order.
1729 for (auto *D : FromRD->decls()) {
Balazs Keri6e086692019-09-02 07:17:01 +00001730 if (isa<FieldDecl>(D) || isa<IndirectFieldDecl>(D) || isa<FriendDecl>(D)) {
Gabor Marton48b16e12019-07-25 09:07:17 +00001731 assert(D && "DC contains a null decl");
1732 Decl *ToD = Importer.GetAlreadyImportedOrNull(D);
1733 // Remove only the decls which we successfully imported.
1734 if (ToD) {
1735 assert(ToDC == ToD->getLexicalDeclContext() && ToDC->containsDecl(ToD));
1736 // Remove the decl from its wrong place in the linked list.
1737 ToDC->removeDecl(ToD);
1738 // Add the decl to the end of the linked list.
1739 // This time it will be at the proper place because the enclosing for
1740 // loop iterates in the original (good) order of the decls.
1741 ToDC->addDeclInternal(ToD);
1742 }
1743 }
1744 }
1745
Gabor Marton17c3eaf2019-07-01 12:44:39 +00001746 return ChildErrors;
Douglas Gregor968d6332010-02-21 18:24:45 +00001747}
1748
Balazs Keri3b30d652018-10-19 13:32:20 +00001749Error ASTNodeImporter::ImportDeclContext(
1750 Decl *FromD, DeclContext *&ToDC, DeclContext *&ToLexicalDC) {
1751 auto ToDCOrErr = Importer.ImportContext(FromD->getDeclContext());
1752 if (!ToDCOrErr)
1753 return ToDCOrErr.takeError();
1754 ToDC = *ToDCOrErr;
1755
1756 if (FromD->getDeclContext() != FromD->getLexicalDeclContext()) {
1757 auto ToLexicalDCOrErr = Importer.ImportContext(
1758 FromD->getLexicalDeclContext());
1759 if (!ToLexicalDCOrErr)
1760 return ToLexicalDCOrErr.takeError();
1761 ToLexicalDC = *ToLexicalDCOrErr;
1762 } else
1763 ToLexicalDC = ToDC;
1764
1765 return Error::success();
1766}
1767
1768Error ASTNodeImporter::ImportImplicitMethods(
Balazs Keri1d20cc22018-07-16 12:16:39 +00001769 const CXXRecordDecl *From, CXXRecordDecl *To) {
1770 assert(From->isCompleteDefinition() && To->getDefinition() == To &&
1771 "Import implicit methods to or from non-definition");
Fangrui Song6907ce22018-07-30 19:24:48 +00001772
Balazs Keri1d20cc22018-07-16 12:16:39 +00001773 for (CXXMethodDecl *FromM : From->methods())
Balazs Keri3b30d652018-10-19 13:32:20 +00001774 if (FromM->isImplicit()) {
1775 Expected<CXXMethodDecl *> ToMOrErr = import(FromM);
1776 if (!ToMOrErr)
1777 return ToMOrErr.takeError();
1778 }
1779
1780 return Error::success();
Balazs Keri1d20cc22018-07-16 12:16:39 +00001781}
1782
Balazs Keri3b30d652018-10-19 13:32:20 +00001783static Error setTypedefNameForAnonDecl(TagDecl *From, TagDecl *To,
1784 ASTImporter &Importer) {
Aleksei Sidorin04fbffc2018-04-24 10:11:53 +00001785 if (TypedefNameDecl *FromTypedef = From->getTypedefNameForAnonDecl()) {
Gabor Marton5ac6d492019-05-15 10:29:48 +00001786 if (ExpectedDecl ToTypedefOrErr = Importer.Import(FromTypedef))
Balazs Keri57949eb2019-03-25 09:16:39 +00001787 To->setTypedefNameForAnonDecl(cast<TypedefNameDecl>(*ToTypedefOrErr));
1788 else
1789 return ToTypedefOrErr.takeError();
Aleksei Sidorin04fbffc2018-04-24 10:11:53 +00001790 }
Balazs Keri3b30d652018-10-19 13:32:20 +00001791 return Error::success();
Aleksei Sidorin04fbffc2018-04-24 10:11:53 +00001792}
1793
Balazs Keri3b30d652018-10-19 13:32:20 +00001794Error ASTNodeImporter::ImportDefinition(
1795 RecordDecl *From, RecordDecl *To, ImportDefinitionKind Kind) {
Gabor Martonaefcf512019-07-17 13:47:46 +00001796 auto DefinitionCompleter = [To]() {
1797 // There are cases in LLDB when we first import a class without its
1798 // members. The class will have DefinitionData, but no members. Then,
1799 // importDefinition is called from LLDB, which tries to get the members, so
1800 // when we get here, the class already has the DefinitionData set, so we
1801 // must unset the CompleteDefinition here to be able to complete again the
1802 // definition.
1803 To->setCompleteDefinition(false);
1804 To->completeDefinition();
1805 };
1806
Douglas Gregor95d82832012-01-24 18:36:04 +00001807 if (To->getDefinition() || To->isBeingDefined()) {
Gabor Martone73805f2019-07-08 12:49:13 +00001808 if (Kind == IDK_Everything ||
1809 // In case of lambdas, the class already has a definition ptr set, but
1810 // the contained decls are not imported yet. Also, isBeingDefined was
1811 // set in CXXRecordDecl::CreateLambda. We must import the contained
1812 // decls here and finish the definition.
1813 (To->isLambda() && shouldForceImportDeclContext(Kind))) {
1814 Error Result = ImportDeclContext(From, /*ForceImport=*/true);
1815 // Finish the definition of the lambda, set isBeingDefined to false.
1816 if (To->isLambda())
Gabor Martonaefcf512019-07-17 13:47:46 +00001817 DefinitionCompleter();
Gabor Martone73805f2019-07-08 12:49:13 +00001818 return Result;
1819 }
Fangrui Song6907ce22018-07-30 19:24:48 +00001820
Balazs Keri3b30d652018-10-19 13:32:20 +00001821 return Error::success();
Douglas Gregor95d82832012-01-24 18:36:04 +00001822 }
Fangrui Song6907ce22018-07-30 19:24:48 +00001823
Douglas Gregore2e50d332010-12-01 01:36:18 +00001824 To->startDefinition();
Gabor Marton17c3eaf2019-07-01 12:44:39 +00001825 // Complete the definition even if error is returned.
1826 // The RecordDecl may be already part of the AST so it is better to
1827 // have it in complete state even if something is wrong with it.
Gabor Martonaefcf512019-07-17 13:47:46 +00001828 auto DefinitionCompleterScopeExit =
1829 llvm::make_scope_exit(DefinitionCompleter);
Aleksei Sidorin04fbffc2018-04-24 10:11:53 +00001830
Balazs Keri3b30d652018-10-19 13:32:20 +00001831 if (Error Err = setTypedefNameForAnonDecl(From, To, Importer))
1832 return Err;
Fangrui Song6907ce22018-07-30 19:24:48 +00001833
Douglas Gregore2e50d332010-12-01 01:36:18 +00001834 // Add base classes.
Gabor Marton17d39672018-11-26 15:54:08 +00001835 auto *ToCXX = dyn_cast<CXXRecordDecl>(To);
1836 auto *FromCXX = dyn_cast<CXXRecordDecl>(From);
1837 if (ToCXX && FromCXX && ToCXX->dataPtr() && FromCXX->dataPtr()) {
Douglas Gregor3c2404b2011-11-03 18:07:07 +00001838
1839 struct CXXRecordDecl::DefinitionData &ToData = ToCXX->data();
1840 struct CXXRecordDecl::DefinitionData &FromData = FromCXX->data();
Richard Smith91aeacc2019-10-11 00:29:04 +00001841
1842 #define FIELD(Name, Width, Merge) \
1843 ToData.Name = FromData.Name;
1844 #include "clang/AST/CXXRecordDeclDefinitionBits.def"
Richard Smith561fb152012-02-25 07:33:38 +00001845
Shafik Yaghmour16b90732019-04-26 18:51:28 +00001846 // Copy over the data stored in RecordDeclBits
1847 ToCXX->setArgPassingRestrictions(FromCXX->getArgPassingRestrictions());
1848
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001849 SmallVector<CXXBaseSpecifier *, 4> Bases;
Aaron Ballman574705e2014-03-13 15:41:46 +00001850 for (const auto &Base1 : FromCXX->bases()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001851 ExpectedType TyOrErr = import(Base1.getType());
1852 if (!TyOrErr)
1853 return TyOrErr.takeError();
Douglas Gregor752a5952011-01-03 22:36:02 +00001854
1855 SourceLocation EllipsisLoc;
Balazs Keri3b30d652018-10-19 13:32:20 +00001856 if (Base1.isPackExpansion()) {
1857 if (ExpectedSLoc LocOrErr = import(Base1.getEllipsisLoc()))
1858 EllipsisLoc = *LocOrErr;
1859 else
1860 return LocOrErr.takeError();
1861 }
Douglas Gregord451ea92011-07-29 23:31:30 +00001862
1863 // Ensure that we have a definition for the base.
Balazs Keri3b30d652018-10-19 13:32:20 +00001864 if (Error Err =
1865 ImportDefinitionIfNeeded(Base1.getType()->getAsCXXRecordDecl()))
1866 return Err;
1867
1868 auto RangeOrErr = import(Base1.getSourceRange());
1869 if (!RangeOrErr)
1870 return RangeOrErr.takeError();
1871
1872 auto TSIOrErr = import(Base1.getTypeSourceInfo());
1873 if (!TSIOrErr)
1874 return TSIOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001875
Douglas Gregore2e50d332010-12-01 01:36:18 +00001876 Bases.push_back(
Balazs Keri3b30d652018-10-19 13:32:20 +00001877 new (Importer.getToContext()) CXXBaseSpecifier(
1878 *RangeOrErr,
1879 Base1.isVirtual(),
1880 Base1.isBaseOfClass(),
1881 Base1.getAccessSpecifierAsWritten(),
1882 *TSIOrErr,
1883 EllipsisLoc));
Douglas Gregore2e50d332010-12-01 01:36:18 +00001884 }
1885 if (!Bases.empty())
Craig Toppere6337e12015-12-25 00:36:02 +00001886 ToCXX->setBases(Bases.data(), Bases.size());
Douglas Gregore2e50d332010-12-01 01:36:18 +00001887 }
Fangrui Song6907ce22018-07-30 19:24:48 +00001888
Douglas Gregor2e15c842012-02-01 21:00:38 +00001889 if (shouldForceImportDeclContext(Kind))
Balazs Keri3b30d652018-10-19 13:32:20 +00001890 if (Error Err = ImportDeclContext(From, /*ForceImport=*/true))
1891 return Err;
Fangrui Song6907ce22018-07-30 19:24:48 +00001892
Balazs Keri3b30d652018-10-19 13:32:20 +00001893 return Error::success();
Douglas Gregore2e50d332010-12-01 01:36:18 +00001894}
1895
Balazs Keri3b30d652018-10-19 13:32:20 +00001896Error ASTNodeImporter::ImportInitializer(VarDecl *From, VarDecl *To) {
Sean Callanan59721b32015-04-28 18:41:46 +00001897 if (To->getAnyInitializer())
Balazs Keri3b30d652018-10-19 13:32:20 +00001898 return Error::success();
Larisse Voufo39a1e502013-08-06 01:03:05 +00001899
Gabor Martonac3a5d62018-09-17 12:04:52 +00001900 Expr *FromInit = From->getInit();
1901 if (!FromInit)
Balazs Keri3b30d652018-10-19 13:32:20 +00001902 return Error::success();
Gabor Martonac3a5d62018-09-17 12:04:52 +00001903
Balazs Keri3b30d652018-10-19 13:32:20 +00001904 ExpectedExpr ToInitOrErr = import(FromInit);
1905 if (!ToInitOrErr)
1906 return ToInitOrErr.takeError();
Gabor Martonac3a5d62018-09-17 12:04:52 +00001907
Balazs Keri3b30d652018-10-19 13:32:20 +00001908 To->setInit(*ToInitOrErr);
Gabor Martonac3a5d62018-09-17 12:04:52 +00001909 if (From->isInitKnownICE()) {
1910 EvaluatedStmt *Eval = To->ensureEvaluatedStmt();
1911 Eval->CheckedICE = true;
1912 Eval->IsICE = From->isInitICE();
1913 }
Larisse Voufo39a1e502013-08-06 01:03:05 +00001914
1915 // FIXME: Other bits to merge?
Balazs Keri3b30d652018-10-19 13:32:20 +00001916 return Error::success();
Larisse Voufo39a1e502013-08-06 01:03:05 +00001917}
1918
Balazs Keri3b30d652018-10-19 13:32:20 +00001919Error ASTNodeImporter::ImportDefinition(
1920 EnumDecl *From, EnumDecl *To, ImportDefinitionKind Kind) {
Douglas Gregor2e15c842012-02-01 21:00:38 +00001921 if (To->getDefinition() || To->isBeingDefined()) {
1922 if (Kind == IDK_Everything)
Balazs Keri3b30d652018-10-19 13:32:20 +00001923 return ImportDeclContext(From, /*ForceImport=*/true);
1924 return Error::success();
Douglas Gregor2e15c842012-02-01 21:00:38 +00001925 }
Fangrui Song6907ce22018-07-30 19:24:48 +00001926
Douglas Gregord451ea92011-07-29 23:31:30 +00001927 To->startDefinition();
1928
Balazs Keri3b30d652018-10-19 13:32:20 +00001929 if (Error Err = setTypedefNameForAnonDecl(From, To, Importer))
1930 return Err;
Aleksei Sidorin04fbffc2018-04-24 10:11:53 +00001931
Balazs Keri3b30d652018-10-19 13:32:20 +00001932 ExpectedType ToTypeOrErr =
1933 import(Importer.getFromContext().getTypeDeclType(From));
1934 if (!ToTypeOrErr)
1935 return ToTypeOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00001936
Balazs Keri3b30d652018-10-19 13:32:20 +00001937 ExpectedType ToPromotionTypeOrErr = import(From->getPromotionType());
1938 if (!ToPromotionTypeOrErr)
1939 return ToPromotionTypeOrErr.takeError();
Douglas Gregor2e15c842012-02-01 21:00:38 +00001940
1941 if (shouldForceImportDeclContext(Kind))
Balazs Keri3b30d652018-10-19 13:32:20 +00001942 if (Error Err = ImportDeclContext(From, /*ForceImport=*/true))
1943 return Err;
Fangrui Song6907ce22018-07-30 19:24:48 +00001944
Douglas Gregord451ea92011-07-29 23:31:30 +00001945 // FIXME: we might need to merge the number of positive or negative bits
1946 // if the enumerator lists don't match.
Balazs Keri3b30d652018-10-19 13:32:20 +00001947 To->completeDefinition(*ToTypeOrErr, *ToPromotionTypeOrErr,
Douglas Gregord451ea92011-07-29 23:31:30 +00001948 From->getNumPositiveBits(),
1949 From->getNumNegativeBits());
Balazs Keri3b30d652018-10-19 13:32:20 +00001950 return Error::success();
Douglas Gregord451ea92011-07-29 23:31:30 +00001951}
1952
Balazs Keri3b30d652018-10-19 13:32:20 +00001953Error ASTNodeImporter::ImportTemplateArguments(
1954 const TemplateArgument *FromArgs, unsigned NumFromArgs,
1955 SmallVectorImpl<TemplateArgument> &ToArgs) {
Douglas Gregore2e50d332010-12-01 01:36:18 +00001956 for (unsigned I = 0; I != NumFromArgs; ++I) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001957 if (auto ToOrErr = import(FromArgs[I]))
1958 ToArgs.push_back(*ToOrErr);
1959 else
1960 return ToOrErr.takeError();
Douglas Gregore2e50d332010-12-01 01:36:18 +00001961 }
Fangrui Song6907ce22018-07-30 19:24:48 +00001962
Balazs Keri3b30d652018-10-19 13:32:20 +00001963 return Error::success();
Douglas Gregore2e50d332010-12-01 01:36:18 +00001964}
1965
Balazs Keri3b30d652018-10-19 13:32:20 +00001966// FIXME: Do not forget to remove this and use only 'import'.
1967Expected<TemplateArgument>
1968ASTNodeImporter::ImportTemplateArgument(const TemplateArgument &From) {
1969 return import(From);
1970}
1971
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00001972template <typename InContainerTy>
Balazs Keri3b30d652018-10-19 13:32:20 +00001973Error ASTNodeImporter::ImportTemplateArgumentListInfo(
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00001974 const InContainerTy &Container, TemplateArgumentListInfo &ToTAInfo) {
1975 for (const auto &FromLoc : Container) {
Balazs Keri3b30d652018-10-19 13:32:20 +00001976 if (auto ToLocOrErr = import(FromLoc))
1977 ToTAInfo.addArgument(*ToLocOrErr);
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00001978 else
Balazs Keri3b30d652018-10-19 13:32:20 +00001979 return ToLocOrErr.takeError();
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00001980 }
Balazs Keri3b30d652018-10-19 13:32:20 +00001981 return Error::success();
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00001982}
1983
Gabor Marton26f72a92018-07-12 09:42:05 +00001984static StructuralEquivalenceKind
1985getStructuralEquivalenceKind(const ASTImporter &Importer) {
1986 return Importer.isMinimalImport() ? StructuralEquivalenceKind::Minimal
1987 : StructuralEquivalenceKind::Default;
1988}
1989
Gabor Marton950fb572018-07-17 12:39:27 +00001990bool ASTNodeImporter::IsStructuralMatch(Decl *From, Decl *To, bool Complain) {
1991 StructuralEquivalenceContext Ctx(
1992 Importer.getFromContext(), Importer.getToContext(),
1993 Importer.getNonEquivalentDecls(), getStructuralEquivalenceKind(Importer),
1994 false, Complain);
1995 return Ctx.IsEquivalent(From, To);
1996}
1997
1998bool ASTNodeImporter::IsStructuralMatch(RecordDecl *FromRecord,
Douglas Gregordd6006f2012-07-17 21:16:27 +00001999 RecordDecl *ToRecord, bool Complain) {
Sean Callananc665c9e2013-10-09 21:45:11 +00002000 // Eliminate a potential failure point where we attempt to re-import
2001 // something we're trying to import while completing ToRecord.
2002 Decl *ToOrigin = Importer.GetOriginalDecl(ToRecord);
2003 if (ToOrigin) {
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002004 auto *ToOriginRecord = dyn_cast<RecordDecl>(ToOrigin);
Sean Callananc665c9e2013-10-09 21:45:11 +00002005 if (ToOriginRecord)
2006 ToRecord = ToOriginRecord;
2007 }
2008
Benjamin Kramer26d19c52010-02-18 13:02:13 +00002009 StructuralEquivalenceContext Ctx(Importer.getFromContext(),
Sean Callananc665c9e2013-10-09 21:45:11 +00002010 ToRecord->getASTContext(),
Douglas Gregordd6006f2012-07-17 21:16:27 +00002011 Importer.getNonEquivalentDecls(),
Gabor Marton26f72a92018-07-12 09:42:05 +00002012 getStructuralEquivalenceKind(Importer),
Douglas Gregordd6006f2012-07-17 21:16:27 +00002013 false, Complain);
Gabor Marton950fb572018-07-17 12:39:27 +00002014 return Ctx.IsEquivalent(FromRecord, ToRecord);
Douglas Gregor5c73e912010-02-11 00:48:18 +00002015}
2016
Larisse Voufo39a1e502013-08-06 01:03:05 +00002017bool ASTNodeImporter::IsStructuralMatch(VarDecl *FromVar, VarDecl *ToVar,
2018 bool Complain) {
2019 StructuralEquivalenceContext Ctx(
2020 Importer.getFromContext(), Importer.getToContext(),
Gabor Marton26f72a92018-07-12 09:42:05 +00002021 Importer.getNonEquivalentDecls(), getStructuralEquivalenceKind(Importer),
2022 false, Complain);
Gabor Marton950fb572018-07-17 12:39:27 +00002023 return Ctx.IsEquivalent(FromVar, ToVar);
Larisse Voufo39a1e502013-08-06 01:03:05 +00002024}
2025
Douglas Gregor98c10182010-02-12 22:17:39 +00002026bool ASTNodeImporter::IsStructuralMatch(EnumDecl *FromEnum, EnumDecl *ToEnum) {
Shafik Yaghmoure5094d62019-03-27 17:47:36 +00002027 // Eliminate a potential failure point where we attempt to re-import
Raphael Isemannfa26c202019-04-09 14:18:23 +00002028 // something we're trying to import while completing ToEnum.
Shafik Yaghmoure5094d62019-03-27 17:47:36 +00002029 if (Decl *ToOrigin = Importer.GetOriginalDecl(ToEnum))
2030 if (auto *ToOriginEnum = dyn_cast<EnumDecl>(ToOrigin))
2031 ToEnum = ToOriginEnum;
2032
Gabor Marton26f72a92018-07-12 09:42:05 +00002033 StructuralEquivalenceContext Ctx(
2034 Importer.getFromContext(), Importer.getToContext(),
2035 Importer.getNonEquivalentDecls(), getStructuralEquivalenceKind(Importer));
Gabor Marton950fb572018-07-17 12:39:27 +00002036 return Ctx.IsEquivalent(FromEnum, ToEnum);
Douglas Gregor98c10182010-02-12 22:17:39 +00002037}
2038
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00002039bool ASTNodeImporter::IsStructuralMatch(FunctionTemplateDecl *From,
2040 FunctionTemplateDecl *To) {
2041 StructuralEquivalenceContext Ctx(
2042 Importer.getFromContext(), Importer.getToContext(),
Gabor Marton26f72a92018-07-12 09:42:05 +00002043 Importer.getNonEquivalentDecls(), getStructuralEquivalenceKind(Importer),
2044 false, false);
Gabor Marton950fb572018-07-17 12:39:27 +00002045 return Ctx.IsEquivalent(From, To);
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00002046}
2047
Balazs Keric7797c42018-07-11 09:37:24 +00002048bool ASTNodeImporter::IsStructuralMatch(FunctionDecl *From, FunctionDecl *To) {
2049 StructuralEquivalenceContext Ctx(
2050 Importer.getFromContext(), Importer.getToContext(),
Gabor Marton26f72a92018-07-12 09:42:05 +00002051 Importer.getNonEquivalentDecls(), getStructuralEquivalenceKind(Importer),
2052 false, false);
Gabor Marton950fb572018-07-17 12:39:27 +00002053 return Ctx.IsEquivalent(From, To);
Balazs Keric7797c42018-07-11 09:37:24 +00002054}
2055
Douglas Gregor91155082012-11-14 22:29:20 +00002056bool ASTNodeImporter::IsStructuralMatch(EnumConstantDecl *FromEC,
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002057 EnumConstantDecl *ToEC) {
Douglas Gregor91155082012-11-14 22:29:20 +00002058 const llvm::APSInt &FromVal = FromEC->getInitVal();
2059 const llvm::APSInt &ToVal = ToEC->getInitVal();
2060
2061 return FromVal.isSigned() == ToVal.isSigned() &&
2062 FromVal.getBitWidth() == ToVal.getBitWidth() &&
2063 FromVal == ToVal;
2064}
2065
2066bool ASTNodeImporter::IsStructuralMatch(ClassTemplateDecl *From,
Douglas Gregora082a492010-11-30 19:14:50 +00002067 ClassTemplateDecl *To) {
2068 StructuralEquivalenceContext Ctx(Importer.getFromContext(),
2069 Importer.getToContext(),
Gabor Marton26f72a92018-07-12 09:42:05 +00002070 Importer.getNonEquivalentDecls(),
2071 getStructuralEquivalenceKind(Importer));
Gabor Marton950fb572018-07-17 12:39:27 +00002072 return Ctx.IsEquivalent(From, To);
Douglas Gregora082a492010-11-30 19:14:50 +00002073}
2074
Larisse Voufo39a1e502013-08-06 01:03:05 +00002075bool ASTNodeImporter::IsStructuralMatch(VarTemplateDecl *From,
2076 VarTemplateDecl *To) {
2077 StructuralEquivalenceContext Ctx(Importer.getFromContext(),
2078 Importer.getToContext(),
Gabor Marton26f72a92018-07-12 09:42:05 +00002079 Importer.getNonEquivalentDecls(),
2080 getStructuralEquivalenceKind(Importer));
Gabor Marton950fb572018-07-17 12:39:27 +00002081 return Ctx.IsEquivalent(From, To);
Larisse Voufo39a1e502013-08-06 01:03:05 +00002082}
2083
Balazs Keri3b30d652018-10-19 13:32:20 +00002084ExpectedDecl ASTNodeImporter::VisitDecl(Decl *D) {
Douglas Gregor811663e2010-02-10 00:15:17 +00002085 Importer.FromDiag(D->getLocation(), diag::err_unsupported_ast_node)
Douglas Gregore4c83e42010-02-09 22:48:33 +00002086 << D->getDeclKindName();
Balazs Keri3b30d652018-10-19 13:32:20 +00002087 return make_error<ImportError>(ImportError::UnsupportedConstruct);
Douglas Gregore4c83e42010-02-09 22:48:33 +00002088}
2089
Balazs Keri3b30d652018-10-19 13:32:20 +00002090ExpectedDecl ASTNodeImporter::VisitImportDecl(ImportDecl *D) {
2091 Importer.FromDiag(D->getLocation(), diag::err_unsupported_ast_node)
2092 << D->getDeclKindName();
2093 return make_error<ImportError>(ImportError::UnsupportedConstruct);
2094}
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00002095
Balazs Keri3b30d652018-10-19 13:32:20 +00002096ExpectedDecl ASTNodeImporter::VisitEmptyDecl(EmptyDecl *D) {
2097 // Import the context of this declaration.
2098 DeclContext *DC, *LexicalDC;
2099 if (Error Err = ImportDeclContext(D, DC, LexicalDC))
2100 return std::move(Err);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00002101
2102 // Import the location of this declaration.
Balazs Keri3b30d652018-10-19 13:32:20 +00002103 ExpectedSLoc LocOrErr = import(D->getLocation());
2104 if (!LocOrErr)
2105 return LocOrErr.takeError();
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00002106
Gabor Marton26f72a92018-07-12 09:42:05 +00002107 EmptyDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00002108 if (GetImportedOrCreateDecl(ToD, D, Importer.getToContext(), DC, *LocOrErr))
Gabor Marton26f72a92018-07-12 09:42:05 +00002109 return ToD;
2110
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00002111 ToD->setLexicalDeclContext(LexicalDC);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00002112 LexicalDC->addDeclInternal(ToD);
2113 return ToD;
2114}
2115
Balazs Keri3b30d652018-10-19 13:32:20 +00002116ExpectedDecl ASTNodeImporter::VisitTranslationUnitDecl(TranslationUnitDecl *D) {
Fangrui Song6907ce22018-07-30 19:24:48 +00002117 TranslationUnitDecl *ToD =
Sean Callanan65198272011-11-17 23:20:56 +00002118 Importer.getToContext().getTranslationUnitDecl();
Fangrui Song6907ce22018-07-30 19:24:48 +00002119
Gabor Marton26f72a92018-07-12 09:42:05 +00002120 Importer.MapImported(D, ToD);
Fangrui Song6907ce22018-07-30 19:24:48 +00002121
Sean Callanan65198272011-11-17 23:20:56 +00002122 return ToD;
2123}
2124
Balazs Keri3b30d652018-10-19 13:32:20 +00002125ExpectedDecl ASTNodeImporter::VisitAccessSpecDecl(AccessSpecDecl *D) {
2126 ExpectedSLoc LocOrErr = import(D->getLocation());
2127 if (!LocOrErr)
2128 return LocOrErr.takeError();
2129 auto ColonLocOrErr = import(D->getColonLoc());
2130 if (!ColonLocOrErr)
2131 return ColonLocOrErr.takeError();
Argyrios Kyrtzidis544ea712016-02-18 23:08:36 +00002132
2133 // Import the context of this declaration.
Balazs Keri3b30d652018-10-19 13:32:20 +00002134 auto DCOrErr = Importer.ImportContext(D->getDeclContext());
2135 if (!DCOrErr)
2136 return DCOrErr.takeError();
2137 DeclContext *DC = *DCOrErr;
Argyrios Kyrtzidis544ea712016-02-18 23:08:36 +00002138
Gabor Marton26f72a92018-07-12 09:42:05 +00002139 AccessSpecDecl *ToD;
2140 if (GetImportedOrCreateDecl(ToD, D, Importer.getToContext(), D->getAccess(),
Balazs Keri3b30d652018-10-19 13:32:20 +00002141 DC, *LocOrErr, *ColonLocOrErr))
Gabor Marton26f72a92018-07-12 09:42:05 +00002142 return ToD;
Argyrios Kyrtzidis544ea712016-02-18 23:08:36 +00002143
2144 // Lexical DeclContext and Semantic DeclContext
2145 // is always the same for the accessSpec.
Gabor Marton26f72a92018-07-12 09:42:05 +00002146 ToD->setLexicalDeclContext(DC);
2147 DC->addDeclInternal(ToD);
Argyrios Kyrtzidis544ea712016-02-18 23:08:36 +00002148
Gabor Marton26f72a92018-07-12 09:42:05 +00002149 return ToD;
Argyrios Kyrtzidis544ea712016-02-18 23:08:36 +00002150}
2151
Balazs Keri3b30d652018-10-19 13:32:20 +00002152ExpectedDecl ASTNodeImporter::VisitStaticAssertDecl(StaticAssertDecl *D) {
2153 auto DCOrErr = Importer.ImportContext(D->getDeclContext());
2154 if (!DCOrErr)
2155 return DCOrErr.takeError();
2156 DeclContext *DC = *DCOrErr;
Aleksei Sidorina693b372016-09-28 10:16:56 +00002157 DeclContext *LexicalDC = DC;
2158
Balazs Keri3b30d652018-10-19 13:32:20 +00002159 SourceLocation ToLocation, ToRParenLoc;
2160 Expr *ToAssertExpr;
2161 StringLiteral *ToMessage;
2162 if (auto Imp = importSeq(
2163 D->getLocation(), D->getAssertExpr(), D->getMessage(), D->getRParenLoc()))
2164 std::tie(ToLocation, ToAssertExpr, ToMessage, ToRParenLoc) = *Imp;
2165 else
2166 return Imp.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00002167
Gabor Marton26f72a92018-07-12 09:42:05 +00002168 StaticAssertDecl *ToD;
2169 if (GetImportedOrCreateDecl(
Balazs Keri3b30d652018-10-19 13:32:20 +00002170 ToD, D, Importer.getToContext(), DC, ToLocation, ToAssertExpr, ToMessage,
2171 ToRParenLoc, D->isFailed()))
Gabor Marton26f72a92018-07-12 09:42:05 +00002172 return ToD;
Aleksei Sidorina693b372016-09-28 10:16:56 +00002173
2174 ToD->setLexicalDeclContext(LexicalDC);
2175 LexicalDC->addDeclInternal(ToD);
Aleksei Sidorina693b372016-09-28 10:16:56 +00002176 return ToD;
2177}
2178
Balazs Keri3b30d652018-10-19 13:32:20 +00002179ExpectedDecl ASTNodeImporter::VisitNamespaceDecl(NamespaceDecl *D) {
Douglas Gregorf18a2c72010-02-21 18:26:36 +00002180 // Import the major distinguishing characteristics of this namespace.
2181 DeclContext *DC, *LexicalDC;
2182 DeclarationName Name;
2183 SourceLocation Loc;
Sean Callanan59721b32015-04-28 18:41:46 +00002184 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00002185 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
2186 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00002187 if (ToD)
2188 return ToD;
Craig Topper36250ad2014-05-12 05:36:57 +00002189
2190 NamespaceDecl *MergeWithNamespace = nullptr;
Douglas Gregorf18a2c72010-02-21 18:26:36 +00002191 if (!Name) {
2192 // This is an anonymous namespace. Adopt an existing anonymous
2193 // namespace if we can.
2194 // FIXME: Not testable.
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002195 if (auto *TU = dyn_cast<TranslationUnitDecl>(DC))
Douglas Gregorf18a2c72010-02-21 18:26:36 +00002196 MergeWithNamespace = TU->getAnonymousNamespace();
2197 else
2198 MergeWithNamespace = cast<NamespaceDecl>(DC)->getAnonymousNamespace();
2199 } else {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002200 SmallVector<NamedDecl *, 4> ConflictingDecls;
Gabor Marton54058b52018-12-17 13:53:12 +00002201 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002202 for (auto *FoundDecl : FoundDecls) {
2203 if (!FoundDecl->isInIdentifierNamespace(Decl::IDNS_Namespace))
Douglas Gregorf18a2c72010-02-21 18:26:36 +00002204 continue;
Fangrui Song6907ce22018-07-30 19:24:48 +00002205
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002206 if (auto *FoundNS = dyn_cast<NamespaceDecl>(FoundDecl)) {
Douglas Gregorf18a2c72010-02-21 18:26:36 +00002207 MergeWithNamespace = FoundNS;
2208 ConflictingDecls.clear();
2209 break;
2210 }
Fangrui Song6907ce22018-07-30 19:24:48 +00002211
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002212 ConflictingDecls.push_back(FoundDecl);
Douglas Gregorf18a2c72010-02-21 18:26:36 +00002213 }
Fangrui Song6907ce22018-07-30 19:24:48 +00002214
Douglas Gregorf18a2c72010-02-21 18:26:36 +00002215 if (!ConflictingDecls.empty()) {
Gabor Martonf035b752019-08-27 11:36:10 +00002216 ExpectedName NameOrErr = Importer.HandleNameConflict(
2217 Name, DC, Decl::IDNS_Namespace, ConflictingDecls.data(),
2218 ConflictingDecls.size());
2219 if (NameOrErr)
2220 Name = NameOrErr.get();
2221 else
2222 return NameOrErr.takeError();
Douglas Gregorf18a2c72010-02-21 18:26:36 +00002223 }
2224 }
Fangrui Song6907ce22018-07-30 19:24:48 +00002225
Balazs Keri3b30d652018-10-19 13:32:20 +00002226 ExpectedSLoc BeginLocOrErr = import(D->getBeginLoc());
2227 if (!BeginLocOrErr)
2228 return BeginLocOrErr.takeError();
2229
Douglas Gregorf18a2c72010-02-21 18:26:36 +00002230 // Create the "to" namespace, if needed.
2231 NamespaceDecl *ToNamespace = MergeWithNamespace;
2232 if (!ToNamespace) {
Gabor Marton26f72a92018-07-12 09:42:05 +00002233 if (GetImportedOrCreateDecl(
2234 ToNamespace, D, Importer.getToContext(), DC, D->isInline(),
Balazs Keri3b30d652018-10-19 13:32:20 +00002235 *BeginLocOrErr, Loc, Name.getAsIdentifierInfo(),
Gabor Marton26f72a92018-07-12 09:42:05 +00002236 /*PrevDecl=*/nullptr))
2237 return ToNamespace;
Douglas Gregorf18a2c72010-02-21 18:26:36 +00002238 ToNamespace->setLexicalDeclContext(LexicalDC);
Sean Callanan95e74be2011-10-21 02:57:43 +00002239 LexicalDC->addDeclInternal(ToNamespace);
Fangrui Song6907ce22018-07-30 19:24:48 +00002240
Douglas Gregorf18a2c72010-02-21 18:26:36 +00002241 // If this is an anonymous namespace, register it as the anonymous
2242 // namespace within its context.
2243 if (!Name) {
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002244 if (auto *TU = dyn_cast<TranslationUnitDecl>(DC))
Douglas Gregorf18a2c72010-02-21 18:26:36 +00002245 TU->setAnonymousNamespace(ToNamespace);
2246 else
2247 cast<NamespaceDecl>(DC)->setAnonymousNamespace(ToNamespace);
2248 }
2249 }
Gabor Marton26f72a92018-07-12 09:42:05 +00002250 Importer.MapImported(D, ToNamespace);
Fangrui Song6907ce22018-07-30 19:24:48 +00002251
Balazs Keri3b30d652018-10-19 13:32:20 +00002252 if (Error Err = ImportDeclContext(D))
2253 return std::move(Err);
Fangrui Song6907ce22018-07-30 19:24:48 +00002254
Douglas Gregorf18a2c72010-02-21 18:26:36 +00002255 return ToNamespace;
2256}
2257
Balazs Keri3b30d652018-10-19 13:32:20 +00002258ExpectedDecl ASTNodeImporter::VisitNamespaceAliasDecl(NamespaceAliasDecl *D) {
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00002259 // Import the major distinguishing characteristics of this namespace.
2260 DeclContext *DC, *LexicalDC;
2261 DeclarationName Name;
2262 SourceLocation Loc;
2263 NamedDecl *LookupD;
Balazs Keri3b30d652018-10-19 13:32:20 +00002264 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, LookupD, Loc))
2265 return std::move(Err);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00002266 if (LookupD)
2267 return LookupD;
2268
2269 // NOTE: No conflict resolution is done for namespace aliases now.
2270
Balazs Keri3b30d652018-10-19 13:32:20 +00002271 SourceLocation ToNamespaceLoc, ToAliasLoc, ToTargetNameLoc;
2272 NestedNameSpecifierLoc ToQualifierLoc;
2273 NamespaceDecl *ToNamespace;
2274 if (auto Imp = importSeq(
2275 D->getNamespaceLoc(), D->getAliasLoc(), D->getQualifierLoc(),
2276 D->getTargetNameLoc(), D->getNamespace()))
2277 std::tie(
2278 ToNamespaceLoc, ToAliasLoc, ToQualifierLoc, ToTargetNameLoc,
2279 ToNamespace) = *Imp;
2280 else
2281 return Imp.takeError();
2282 IdentifierInfo *ToIdentifier = Importer.Import(D->getIdentifier());
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00002283
Gabor Marton26f72a92018-07-12 09:42:05 +00002284 NamespaceAliasDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00002285 if (GetImportedOrCreateDecl(
2286 ToD, D, Importer.getToContext(), DC, ToNamespaceLoc, ToAliasLoc,
2287 ToIdentifier, ToQualifierLoc, ToTargetNameLoc, ToNamespace))
Gabor Marton26f72a92018-07-12 09:42:05 +00002288 return ToD;
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00002289
2290 ToD->setLexicalDeclContext(LexicalDC);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00002291 LexicalDC->addDeclInternal(ToD);
2292
2293 return ToD;
2294}
2295
Balazs Keri3b30d652018-10-19 13:32:20 +00002296ExpectedDecl
2297ASTNodeImporter::VisitTypedefNameDecl(TypedefNameDecl *D, bool IsAlias) {
Douglas Gregor5fa74c32010-02-10 21:10:29 +00002298 // Import the major distinguishing characteristics of this typedef.
2299 DeclContext *DC, *LexicalDC;
2300 DeclarationName Name;
2301 SourceLocation Loc;
Sean Callanan59721b32015-04-28 18:41:46 +00002302 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00002303 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
2304 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00002305 if (ToD)
2306 return ToD;
Craig Topper36250ad2014-05-12 05:36:57 +00002307
Douglas Gregor5fa74c32010-02-10 21:10:29 +00002308 // If this typedef is not in block scope, determine whether we've
2309 // seen a typedef with the same name (that we can merge with) or any
2310 // other entity by that name (which name lookup could conflict with).
Balazs Keric86d47b2019-09-04 14:12:18 +00002311 // Note: Repeated typedefs are not valid in C99:
2312 // 'typedef int T; typedef int T;' is invalid
2313 // We do not care about this now.
Douglas Gregor5fa74c32010-02-10 21:10:29 +00002314 if (!DC->isFunctionOrMethod()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002315 SmallVector<NamedDecl *, 4> ConflictingDecls;
Douglas Gregor5fa74c32010-02-10 21:10:29 +00002316 unsigned IDNS = Decl::IDNS_Ordinary;
Gabor Marton54058b52018-12-17 13:53:12 +00002317 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002318 for (auto *FoundDecl : FoundDecls) {
2319 if (!FoundDecl->isInIdentifierNamespace(IDNS))
Douglas Gregor5fa74c32010-02-10 21:10:29 +00002320 continue;
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002321 if (auto *FoundTypedef = dyn_cast<TypedefNameDecl>(FoundDecl)) {
Balazs Keric86d47b2019-09-04 14:12:18 +00002322 if (!hasSameVisibilityContext(FoundTypedef, D))
2323 continue;
2324
Gabor Martonb93baf62018-11-27 09:51:36 +00002325 QualType FromUT = D->getUnderlyingType();
2326 QualType FoundUT = FoundTypedef->getUnderlyingType();
2327 if (Importer.IsStructurallyEquivalent(FromUT, FoundUT)) {
2328 // If the "From" context has a complete underlying type but we
2329 // already have a complete underlying type then return with that.
2330 if (!FromUT->isIncompleteType() && !FoundUT->isIncompleteType())
Balazs Keri3b30d652018-10-19 13:32:20 +00002331 return Importer.MapImported(D, FoundTypedef);
Gabor Martonf035b752019-08-27 11:36:10 +00002332 // FIXME Handle redecl chain. When you do that make consistent changes
2333 // in ASTImporterLookupTable too.
2334 } else {
2335 ConflictingDecls.push_back(FoundDecl);
Gabor Martonb93baf62018-11-27 09:51:36 +00002336 }
Douglas Gregor5fa74c32010-02-10 21:10:29 +00002337 }
Douglas Gregor5fa74c32010-02-10 21:10:29 +00002338 }
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00002339
Douglas Gregor5fa74c32010-02-10 21:10:29 +00002340 if (!ConflictingDecls.empty()) {
Gabor Martonf035b752019-08-27 11:36:10 +00002341 ExpectedName NameOrErr = Importer.HandleNameConflict(
2342 Name, DC, IDNS, ConflictingDecls.data(), ConflictingDecls.size());
2343 if (NameOrErr)
2344 Name = NameOrErr.get();
2345 else
2346 return NameOrErr.takeError();
Douglas Gregor5fa74c32010-02-10 21:10:29 +00002347 }
2348 }
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00002349
Balazs Keri3b30d652018-10-19 13:32:20 +00002350 QualType ToUnderlyingType;
2351 TypeSourceInfo *ToTypeSourceInfo;
2352 SourceLocation ToBeginLoc;
2353 if (auto Imp = importSeq(
2354 D->getUnderlyingType(), D->getTypeSourceInfo(), D->getBeginLoc()))
2355 std::tie(ToUnderlyingType, ToTypeSourceInfo, ToBeginLoc) = *Imp;
2356 else
2357 return Imp.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00002358
Douglas Gregor5fa74c32010-02-10 21:10:29 +00002359 // Create the new typedef node.
Balazs Keri3b30d652018-10-19 13:32:20 +00002360 // FIXME: ToUnderlyingType is not used.
Richard Smithdda56e42011-04-15 14:24:37 +00002361 TypedefNameDecl *ToTypedef;
Gabor Marton26f72a92018-07-12 09:42:05 +00002362 if (IsAlias) {
2363 if (GetImportedOrCreateDecl<TypeAliasDecl>(
Balazs Keri3b30d652018-10-19 13:32:20 +00002364 ToTypedef, D, Importer.getToContext(), DC, ToBeginLoc, Loc,
2365 Name.getAsIdentifierInfo(), ToTypeSourceInfo))
Gabor Marton26f72a92018-07-12 09:42:05 +00002366 return ToTypedef;
2367 } else if (GetImportedOrCreateDecl<TypedefDecl>(
Balazs Keri3b30d652018-10-19 13:32:20 +00002368 ToTypedef, D, Importer.getToContext(), DC, ToBeginLoc, Loc,
2369 Name.getAsIdentifierInfo(), ToTypeSourceInfo))
Gabor Marton26f72a92018-07-12 09:42:05 +00002370 return ToTypedef;
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00002371
Douglas Gregordd483172010-02-22 17:42:47 +00002372 ToTypedef->setAccess(D->getAccess());
Douglas Gregor5fa74c32010-02-10 21:10:29 +00002373 ToTypedef->setLexicalDeclContext(LexicalDC);
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00002374
2375 // Templated declarations should not appear in DeclContext.
2376 TypeAliasDecl *FromAlias = IsAlias ? cast<TypeAliasDecl>(D) : nullptr;
2377 if (!FromAlias || !FromAlias->getDescribedAliasTemplate())
2378 LexicalDC->addDeclInternal(ToTypedef);
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00002379
Douglas Gregor5fa74c32010-02-10 21:10:29 +00002380 return ToTypedef;
2381}
2382
Balazs Keri3b30d652018-10-19 13:32:20 +00002383ExpectedDecl ASTNodeImporter::VisitTypedefDecl(TypedefDecl *D) {
Richard Smithdda56e42011-04-15 14:24:37 +00002384 return VisitTypedefNameDecl(D, /*IsAlias=*/false);
2385}
2386
Balazs Keri3b30d652018-10-19 13:32:20 +00002387ExpectedDecl ASTNodeImporter::VisitTypeAliasDecl(TypeAliasDecl *D) {
Richard Smithdda56e42011-04-15 14:24:37 +00002388 return VisitTypedefNameDecl(D, /*IsAlias=*/true);
2389}
2390
Balazs Keri3b30d652018-10-19 13:32:20 +00002391ExpectedDecl
2392ASTNodeImporter::VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D) {
Gabor Horvath7a91c082017-11-14 11:30:38 +00002393 // Import the major distinguishing characteristics of this typedef.
2394 DeclContext *DC, *LexicalDC;
2395 DeclarationName Name;
2396 SourceLocation Loc;
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00002397 NamedDecl *FoundD;
Balazs Keri3b30d652018-10-19 13:32:20 +00002398 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, FoundD, Loc))
2399 return std::move(Err);
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00002400 if (FoundD)
2401 return FoundD;
Gabor Horvath7a91c082017-11-14 11:30:38 +00002402
2403 // If this typedef is not in block scope, determine whether we've
2404 // seen a typedef with the same name (that we can merge with) or any
2405 // other entity by that name (which name lookup could conflict with).
2406 if (!DC->isFunctionOrMethod()) {
2407 SmallVector<NamedDecl *, 4> ConflictingDecls;
2408 unsigned IDNS = Decl::IDNS_Ordinary;
Gabor Marton54058b52018-12-17 13:53:12 +00002409 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002410 for (auto *FoundDecl : FoundDecls) {
2411 if (!FoundDecl->isInIdentifierNamespace(IDNS))
Gabor Horvath7a91c082017-11-14 11:30:38 +00002412 continue;
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002413 if (auto *FoundAlias = dyn_cast<TypeAliasTemplateDecl>(FoundDecl))
Gabor Marton26f72a92018-07-12 09:42:05 +00002414 return Importer.MapImported(D, FoundAlias);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002415 ConflictingDecls.push_back(FoundDecl);
Gabor Horvath7a91c082017-11-14 11:30:38 +00002416 }
2417
2418 if (!ConflictingDecls.empty()) {
Gabor Martonf035b752019-08-27 11:36:10 +00002419 ExpectedName NameOrErr = Importer.HandleNameConflict(
2420 Name, DC, IDNS, ConflictingDecls.data(), ConflictingDecls.size());
2421 if (NameOrErr)
2422 Name = NameOrErr.get();
2423 else
2424 return NameOrErr.takeError();
Gabor Horvath7a91c082017-11-14 11:30:38 +00002425 }
2426 }
2427
Balazs Keri3b30d652018-10-19 13:32:20 +00002428 TemplateParameterList *ToTemplateParameters;
2429 TypeAliasDecl *ToTemplatedDecl;
2430 if (auto Imp = importSeq(D->getTemplateParameters(), D->getTemplatedDecl()))
2431 std::tie(ToTemplateParameters, ToTemplatedDecl) = *Imp;
2432 else
2433 return Imp.takeError();
Gabor Horvath7a91c082017-11-14 11:30:38 +00002434
Gabor Marton26f72a92018-07-12 09:42:05 +00002435 TypeAliasTemplateDecl *ToAlias;
2436 if (GetImportedOrCreateDecl(ToAlias, D, Importer.getToContext(), DC, Loc,
Balazs Keri3b30d652018-10-19 13:32:20 +00002437 Name, ToTemplateParameters, ToTemplatedDecl))
Gabor Marton26f72a92018-07-12 09:42:05 +00002438 return ToAlias;
Gabor Horvath7a91c082017-11-14 11:30:38 +00002439
Balazs Keri3b30d652018-10-19 13:32:20 +00002440 ToTemplatedDecl->setDescribedAliasTemplate(ToAlias);
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00002441
Gabor Horvath7a91c082017-11-14 11:30:38 +00002442 ToAlias->setAccess(D->getAccess());
2443 ToAlias->setLexicalDeclContext(LexicalDC);
Gabor Horvath7a91c082017-11-14 11:30:38 +00002444 LexicalDC->addDeclInternal(ToAlias);
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00002445 return ToAlias;
Gabor Horvath7a91c082017-11-14 11:30:38 +00002446}
2447
Balazs Keri3b30d652018-10-19 13:32:20 +00002448ExpectedDecl ASTNodeImporter::VisitLabelDecl(LabelDecl *D) {
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00002449 // Import the major distinguishing characteristics of this label.
2450 DeclContext *DC, *LexicalDC;
2451 DeclarationName Name;
2452 SourceLocation Loc;
2453 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00002454 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
2455 return std::move(Err);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00002456 if (ToD)
2457 return ToD;
2458
2459 assert(LexicalDC->isFunctionOrMethod());
2460
Gabor Marton26f72a92018-07-12 09:42:05 +00002461 LabelDecl *ToLabel;
Balazs Keri3b30d652018-10-19 13:32:20 +00002462 if (D->isGnuLocal()) {
2463 ExpectedSLoc BeginLocOrErr = import(D->getBeginLoc());
2464 if (!BeginLocOrErr)
2465 return BeginLocOrErr.takeError();
2466 if (GetImportedOrCreateDecl(ToLabel, D, Importer.getToContext(), DC, Loc,
2467 Name.getAsIdentifierInfo(), *BeginLocOrErr))
2468 return ToLabel;
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00002469
Balazs Keri3b30d652018-10-19 13:32:20 +00002470 } else {
2471 if (GetImportedOrCreateDecl(ToLabel, D, Importer.getToContext(), DC, Loc,
2472 Name.getAsIdentifierInfo()))
2473 return ToLabel;
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00002474
Balazs Keri3b30d652018-10-19 13:32:20 +00002475 }
2476
2477 Expected<LabelStmt *> ToStmtOrErr = import(D->getStmt());
2478 if (!ToStmtOrErr)
2479 return ToStmtOrErr.takeError();
2480
2481 ToLabel->setStmt(*ToStmtOrErr);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00002482 ToLabel->setLexicalDeclContext(LexicalDC);
2483 LexicalDC->addDeclInternal(ToLabel);
2484 return ToLabel;
2485}
2486
Balazs Keri3b30d652018-10-19 13:32:20 +00002487ExpectedDecl ASTNodeImporter::VisitEnumDecl(EnumDecl *D) {
Douglas Gregor98c10182010-02-12 22:17:39 +00002488 // Import the major distinguishing characteristics of this enum.
2489 DeclContext *DC, *LexicalDC;
2490 DeclarationName Name;
2491 SourceLocation Loc;
Sean Callanan59721b32015-04-28 18:41:46 +00002492 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00002493 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
2494 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00002495 if (ToD)
2496 return ToD;
Craig Topper36250ad2014-05-12 05:36:57 +00002497
Douglas Gregor98c10182010-02-12 22:17:39 +00002498 // Figure out what enum name we're looking for.
2499 unsigned IDNS = Decl::IDNS_Tag;
2500 DeclarationName SearchName = Name;
Richard Smithdda56e42011-04-15 14:24:37 +00002501 if (!SearchName && D->getTypedefNameForAnonDecl()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00002502 if (Error Err = importInto(
2503 SearchName, D->getTypedefNameForAnonDecl()->getDeclName()))
2504 return std::move(Err);
Douglas Gregor98c10182010-02-12 22:17:39 +00002505 IDNS = Decl::IDNS_Ordinary;
David Blaikiebbafb8a2012-03-11 07:00:24 +00002506 } else if (Importer.getToContext().getLangOpts().CPlusPlus)
Douglas Gregor98c10182010-02-12 22:17:39 +00002507 IDNS |= Decl::IDNS_Ordinary;
Fangrui Song6907ce22018-07-30 19:24:48 +00002508
Douglas Gregor98c10182010-02-12 22:17:39 +00002509 // We may already have an enum of the same name; try to find and match it.
2510 if (!DC->isFunctionOrMethod() && SearchName) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002511 SmallVector<NamedDecl *, 4> ConflictingDecls;
Gabor Marton54058b52018-12-17 13:53:12 +00002512 auto FoundDecls =
2513 Importer.findDeclsInToCtx(DC, SearchName);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002514 for (auto *FoundDecl : FoundDecls) {
2515 if (!FoundDecl->isInIdentifierNamespace(IDNS))
Douglas Gregor98c10182010-02-12 22:17:39 +00002516 continue;
Fangrui Song6907ce22018-07-30 19:24:48 +00002517
Balazs Keri3b30d652018-10-19 13:32:20 +00002518 if (auto *Typedef = dyn_cast<TypedefNameDecl>(FoundDecl)) {
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002519 if (const auto *Tag = Typedef->getUnderlyingType()->getAs<TagType>())
Balazs Keri3b30d652018-10-19 13:32:20 +00002520 FoundDecl = Tag->getDecl();
Douglas Gregor98c10182010-02-12 22:17:39 +00002521 }
Fangrui Song6907ce22018-07-30 19:24:48 +00002522
Balazs Keri3b30d652018-10-19 13:32:20 +00002523 if (auto *FoundEnum = dyn_cast<EnumDecl>(FoundDecl)) {
Balazs Kerieb79b252019-07-09 11:08:18 +00002524 if (!hasSameVisibilityContext(FoundEnum, D))
2525 continue;
Douglas Gregor8cdbe642010-02-12 23:44:20 +00002526 if (IsStructuralMatch(D, FoundEnum))
Gabor Marton26f72a92018-07-12 09:42:05 +00002527 return Importer.MapImported(D, FoundEnum);
Gabor Martonf035b752019-08-27 11:36:10 +00002528 ConflictingDecls.push_back(FoundDecl);
Douglas Gregor98c10182010-02-12 22:17:39 +00002529 }
Douglas Gregor98c10182010-02-12 22:17:39 +00002530 }
Fangrui Song6907ce22018-07-30 19:24:48 +00002531
Douglas Gregor98c10182010-02-12 22:17:39 +00002532 if (!ConflictingDecls.empty()) {
Gabor Martonf035b752019-08-27 11:36:10 +00002533 ExpectedName NameOrErr = Importer.HandleNameConflict(
2534 SearchName, DC, IDNS, ConflictingDecls.data(),
2535 ConflictingDecls.size());
2536 if (NameOrErr)
2537 Name = NameOrErr.get();
2538 else
2539 return NameOrErr.takeError();
Douglas Gregor98c10182010-02-12 22:17:39 +00002540 }
2541 }
Gabor Marton26f72a92018-07-12 09:42:05 +00002542
Balazs Keri3b30d652018-10-19 13:32:20 +00002543 SourceLocation ToBeginLoc;
2544 NestedNameSpecifierLoc ToQualifierLoc;
2545 QualType ToIntegerType;
2546 if (auto Imp = importSeq(
2547 D->getBeginLoc(), D->getQualifierLoc(), D->getIntegerType()))
2548 std::tie(ToBeginLoc, ToQualifierLoc, ToIntegerType) = *Imp;
2549 else
2550 return Imp.takeError();
2551
Douglas Gregor98c10182010-02-12 22:17:39 +00002552 // Create the enum declaration.
Gabor Marton26f72a92018-07-12 09:42:05 +00002553 EnumDecl *D2;
2554 if (GetImportedOrCreateDecl(
Balazs Keri3b30d652018-10-19 13:32:20 +00002555 D2, D, Importer.getToContext(), DC, ToBeginLoc,
Gabor Marton26f72a92018-07-12 09:42:05 +00002556 Loc, Name.getAsIdentifierInfo(), nullptr, D->isScoped(),
2557 D->isScopedUsingClassTag(), D->isFixed()))
2558 return D2;
2559
Balazs Keri3b30d652018-10-19 13:32:20 +00002560 D2->setQualifierInfo(ToQualifierLoc);
2561 D2->setIntegerType(ToIntegerType);
Douglas Gregordd483172010-02-22 17:42:47 +00002562 D2->setAccess(D->getAccess());
Douglas Gregor3996e242010-02-15 22:01:00 +00002563 D2->setLexicalDeclContext(LexicalDC);
Sean Callanan95e74be2011-10-21 02:57:43 +00002564 LexicalDC->addDeclInternal(D2);
Douglas Gregor98c10182010-02-12 22:17:39 +00002565
Douglas Gregor98c10182010-02-12 22:17:39 +00002566 // Import the definition
Balazs Keri3b30d652018-10-19 13:32:20 +00002567 if (D->isCompleteDefinition())
2568 if (Error Err = ImportDefinition(D, D2))
2569 return std::move(Err);
Douglas Gregor98c10182010-02-12 22:17:39 +00002570
Douglas Gregor3996e242010-02-15 22:01:00 +00002571 return D2;
Douglas Gregor98c10182010-02-12 22:17:39 +00002572}
2573
Balazs Keri3b30d652018-10-19 13:32:20 +00002574ExpectedDecl ASTNodeImporter::VisitRecordDecl(RecordDecl *D) {
Balazs Keri0c23dc52018-08-13 13:08:37 +00002575 bool IsFriendTemplate = false;
2576 if (auto *DCXX = dyn_cast<CXXRecordDecl>(D)) {
2577 IsFriendTemplate =
2578 DCXX->getDescribedClassTemplate() &&
2579 DCXX->getDescribedClassTemplate()->getFriendObjectKind() !=
2580 Decl::FOK_None;
2581 }
2582
Douglas Gregor5c73e912010-02-11 00:48:18 +00002583 // Import the major distinguishing characteristics of this record.
Simon Pilgrim4706f3b2019-10-15 10:23:05 +00002584 DeclContext *DC = nullptr, *LexicalDC = nullptr;
Douglas Gregor5c73e912010-02-11 00:48:18 +00002585 DeclarationName Name;
2586 SourceLocation Loc;
Simon Pilgrim4706f3b2019-10-15 10:23:05 +00002587 NamedDecl *ToD = nullptr;
Balazs Keri3b30d652018-10-19 13:32:20 +00002588 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
2589 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00002590 if (ToD)
2591 return ToD;
Craig Topper36250ad2014-05-12 05:36:57 +00002592
Douglas Gregor5c73e912010-02-11 00:48:18 +00002593 // Figure out what structure name we're looking for.
2594 unsigned IDNS = Decl::IDNS_Tag;
2595 DeclarationName SearchName = Name;
Richard Smithdda56e42011-04-15 14:24:37 +00002596 if (!SearchName && D->getTypedefNameForAnonDecl()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00002597 if (Error Err = importInto(
2598 SearchName, D->getTypedefNameForAnonDecl()->getDeclName()))
2599 return std::move(Err);
Douglas Gregor5c73e912010-02-11 00:48:18 +00002600 IDNS = Decl::IDNS_Ordinary;
David Blaikiebbafb8a2012-03-11 07:00:24 +00002601 } else if (Importer.getToContext().getLangOpts().CPlusPlus)
Gabor Marton7df342a2018-12-17 12:42:12 +00002602 IDNS |= Decl::IDNS_Ordinary | Decl::IDNS_TagFriend;
Douglas Gregor5c73e912010-02-11 00:48:18 +00002603
2604 // We may already have a record of the same name; try to find and match it.
Sean Callanan9092d472017-05-13 00:46:33 +00002605 RecordDecl *PrevDecl = nullptr;
Gabor Martone3e83d72019-08-30 10:55:41 +00002606 if (!DC->isFunctionOrMethod() && !D->isLambda()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002607 SmallVector<NamedDecl *, 4> ConflictingDecls;
Gabor Marton54058b52018-12-17 13:53:12 +00002608 auto FoundDecls =
2609 Importer.findDeclsInToCtx(DC, SearchName);
Sean Callanan9092d472017-05-13 00:46:33 +00002610 if (!FoundDecls.empty()) {
Gabor Marton41e38922019-03-05 11:23:24 +00002611 // We're going to have to compare D against potentially conflicting Decls,
2612 // so complete it.
Sean Callanan9092d472017-05-13 00:46:33 +00002613 if (D->hasExternalLexicalStorage() && !D->isCompleteDefinition())
2614 D->getASTContext().getExternalSource()->CompleteType(D);
2615 }
2616
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002617 for (auto *FoundDecl : FoundDecls) {
2618 if (!FoundDecl->isInIdentifierNamespace(IDNS))
Douglas Gregor5c73e912010-02-11 00:48:18 +00002619 continue;
Fangrui Song6907ce22018-07-30 19:24:48 +00002620
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002621 Decl *Found = FoundDecl;
2622 if (auto *Typedef = dyn_cast<TypedefNameDecl>(Found)) {
2623 if (const auto *Tag = Typedef->getUnderlyingType()->getAs<TagType>())
Douglas Gregor5c73e912010-02-11 00:48:18 +00002624 Found = Tag->getDecl();
2625 }
Gabor Martona0df7a92018-05-30 09:19:26 +00002626
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002627 if (auto *FoundRecord = dyn_cast<RecordDecl>(Found)) {
Gabor Marton7df342a2018-12-17 12:42:12 +00002628 // Do not emit false positive diagnostic in case of unnamed
2629 // struct/union and in case of anonymous structs. Would be false
2630 // because there may be several anonymous/unnamed structs in a class.
2631 // E.g. these are both valid:
2632 // struct A { // unnamed structs
2633 // struct { struct A *next; } entry0;
2634 // struct { struct A *next; } entry1;
2635 // };
2636 // struct X { struct { int a; }; struct { int b; }; }; // anon structs
2637 if (!SearchName)
Gabor Marton0bebf952018-07-05 09:51:13 +00002638 if (!IsStructuralMatch(D, FoundRecord, false))
2639 continue;
Douglas Gregorceb32bf2012-10-26 16:45:11 +00002640
Balazs Keric8272192019-05-27 09:36:00 +00002641 if (!hasSameVisibilityContext(FoundRecord, D))
2642 continue;
2643
Gabor Marton7df342a2018-12-17 12:42:12 +00002644 if (IsStructuralMatch(D, FoundRecord)) {
2645 RecordDecl *FoundDef = FoundRecord->getDefinition();
2646 if (D->isThisDeclarationADefinition() && FoundDef) {
Balazs Keri1d20cc22018-07-16 12:16:39 +00002647 // FIXME: Structural equivalence check should check for same
2648 // user-defined methods.
2649 Importer.MapImported(D, FoundDef);
2650 if (const auto *DCXX = dyn_cast<CXXRecordDecl>(D)) {
2651 auto *FoundCXX = dyn_cast<CXXRecordDecl>(FoundDef);
2652 assert(FoundCXX && "Record type mismatch");
2653
Gabor Marton7df342a2018-12-17 12:42:12 +00002654 if (!Importer.isMinimalImport())
Balazs Keri1d20cc22018-07-16 12:16:39 +00002655 // FoundDef may not have every implicit method that D has
2656 // because implicit methods are created only if they are used.
Balazs Keri3b30d652018-10-19 13:32:20 +00002657 if (Error Err = ImportImplicitMethods(DCXX, FoundCXX))
2658 return std::move(Err);
Balazs Keri1d20cc22018-07-16 12:16:39 +00002659 }
Douglas Gregor25791052010-02-12 00:09:27 +00002660 }
Gabor Marton7df342a2018-12-17 12:42:12 +00002661 PrevDecl = FoundRecord->getMostRecentDecl();
2662 break;
Douglas Gregordd6006f2012-07-17 21:16:27 +00002663 }
Gabor Martonf035b752019-08-27 11:36:10 +00002664 ConflictingDecls.push_back(FoundDecl);
2665 } // kind is RecordDecl
Gabor Marton7df342a2018-12-17 12:42:12 +00002666 } // for
Fangrui Song6907ce22018-07-30 19:24:48 +00002667
Douglas Gregordd6006f2012-07-17 21:16:27 +00002668 if (!ConflictingDecls.empty() && SearchName) {
Gabor Martonf035b752019-08-27 11:36:10 +00002669 ExpectedName NameOrErr = Importer.HandleNameConflict(
2670 SearchName, DC, IDNS, ConflictingDecls.data(),
2671 ConflictingDecls.size());
2672 if (NameOrErr)
2673 Name = NameOrErr.get();
2674 else
2675 return NameOrErr.takeError();
Douglas Gregor5c73e912010-02-11 00:48:18 +00002676 }
2677 }
Fangrui Song6907ce22018-07-30 19:24:48 +00002678
Balazs Keri3b30d652018-10-19 13:32:20 +00002679 ExpectedSLoc BeginLocOrErr = import(D->getBeginLoc());
2680 if (!BeginLocOrErr)
2681 return BeginLocOrErr.takeError();
2682
Douglas Gregor5c73e912010-02-11 00:48:18 +00002683 // Create the record declaration.
Gabor Marton7df342a2018-12-17 12:42:12 +00002684 RecordDecl *D2 = nullptr;
2685 CXXRecordDecl *D2CXX = nullptr;
2686 if (auto *DCXX = dyn_cast<CXXRecordDecl>(D)) {
2687 if (DCXX->isLambda()) {
2688 auto TInfoOrErr = import(DCXX->getLambdaTypeInfo());
2689 if (!TInfoOrErr)
2690 return TInfoOrErr.takeError();
2691 if (GetImportedOrCreateSpecialDecl(
2692 D2CXX, CXXRecordDecl::CreateLambda, D, Importer.getToContext(),
2693 DC, *TInfoOrErr, Loc, DCXX->isDependentLambda(),
2694 DCXX->isGenericLambda(), DCXX->getLambdaCaptureDefault()))
2695 return D2CXX;
2696 ExpectedDecl CDeclOrErr = import(DCXX->getLambdaContextDecl());
2697 if (!CDeclOrErr)
2698 return CDeclOrErr.takeError();
Michael Liao243ebfb2019-10-19 00:15:19 +00002699 D2CXX->setLambdaMangling(DCXX->getLambdaManglingNumber(), *CDeclOrErr,
2700 DCXX->hasKnownLambdaInternalLinkage());
Gabor Marton7df342a2018-12-17 12:42:12 +00002701 } else if (DCXX->isInjectedClassName()) {
2702 // We have to be careful to do a similar dance to the one in
2703 // Sema::ActOnStartCXXMemberDeclarations
2704 const bool DelayTypeCreation = true;
2705 if (GetImportedOrCreateDecl(
2706 D2CXX, D, Importer.getToContext(), D->getTagKind(), DC,
2707 *BeginLocOrErr, Loc, Name.getAsIdentifierInfo(),
2708 cast_or_null<CXXRecordDecl>(PrevDecl), DelayTypeCreation))
2709 return D2CXX;
2710 Importer.getToContext().getTypeDeclType(
2711 D2CXX, dyn_cast<CXXRecordDecl>(DC));
2712 } else {
2713 if (GetImportedOrCreateDecl(D2CXX, D, Importer.getToContext(),
2714 D->getTagKind(), DC, *BeginLocOrErr, Loc,
2715 Name.getAsIdentifierInfo(),
2716 cast_or_null<CXXRecordDecl>(PrevDecl)))
2717 return D2CXX;
2718 }
Gabor Marton26f72a92018-07-12 09:42:05 +00002719
Gabor Marton7df342a2018-12-17 12:42:12 +00002720 D2 = D2CXX;
2721 D2->setAccess(D->getAccess());
2722 D2->setLexicalDeclContext(LexicalDC);
2723 if (!DCXX->getDescribedClassTemplate() || DCXX->isImplicit())
2724 LexicalDC->addDeclInternal(D2);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00002725
Gabor Marton7df342a2018-12-17 12:42:12 +00002726 if (LexicalDC != DC && D->isInIdentifierNamespace(Decl::IDNS_TagFriend))
2727 DC->makeDeclVisibleInContext(D2);
2728
2729 if (ClassTemplateDecl *FromDescribed =
2730 DCXX->getDescribedClassTemplate()) {
2731 ClassTemplateDecl *ToDescribed;
2732 if (Error Err = importInto(ToDescribed, FromDescribed))
2733 return std::move(Err);
2734 D2CXX->setDescribedClassTemplate(ToDescribed);
2735 if (!DCXX->isInjectedClassName() && !IsFriendTemplate) {
2736 // In a record describing a template the type should be an
2737 // InjectedClassNameType (see Sema::CheckClassTemplate). Update the
2738 // previously set type to the correct value here (ToDescribed is not
2739 // available at record create).
2740 // FIXME: The previous type is cleared but not removed from
2741 // ASTContext's internal storage.
2742 CXXRecordDecl *Injected = nullptr;
2743 for (NamedDecl *Found : D2CXX->noload_lookup(Name)) {
2744 auto *Record = dyn_cast<CXXRecordDecl>(Found);
2745 if (Record && Record->isInjectedClassName()) {
2746 Injected = Record;
2747 break;
Gabor Marton5915777e2018-06-26 13:44:24 +00002748 }
2749 }
Gabor Marton7df342a2018-12-17 12:42:12 +00002750 // Create an injected type for the whole redecl chain.
2751 SmallVector<Decl *, 2> Redecls =
2752 getCanonicalForwardRedeclChain(D2CXX);
2753 for (auto *R : Redecls) {
2754 auto *RI = cast<CXXRecordDecl>(R);
2755 RI->setTypeForDecl(nullptr);
2756 // Below we create a new injected type and assign that to the
2757 // canonical decl, subsequent declarations in the chain will reuse
2758 // that type.
2759 Importer.getToContext().getInjectedClassNameType(
2760 RI, ToDescribed->getInjectedClassNameSpecialization());
2761 }
2762 // Set the new type for the previous injected decl too.
2763 if (Injected) {
2764 Injected->setTypeForDecl(nullptr);
2765 Importer.getToContext().getTypeDeclType(Injected, D2CXX);
2766 }
2767 }
2768 } else if (MemberSpecializationInfo *MemberInfo =
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00002769 DCXX->getMemberSpecializationInfo()) {
2770 TemplateSpecializationKind SK =
2771 MemberInfo->getTemplateSpecializationKind();
2772 CXXRecordDecl *FromInst = DCXX->getInstantiatedFromMemberClass();
Balazs Keri3b30d652018-10-19 13:32:20 +00002773
2774 if (Expected<CXXRecordDecl *> ToInstOrErr = import(FromInst))
2775 D2CXX->setInstantiationOfMemberClass(*ToInstOrErr, SK);
2776 else
2777 return ToInstOrErr.takeError();
2778
2779 if (ExpectedSLoc POIOrErr =
2780 import(MemberInfo->getPointOfInstantiation()))
2781 D2CXX->getMemberSpecializationInfo()->setPointOfInstantiation(
2782 *POIOrErr);
2783 else
2784 return POIOrErr.takeError();
Douglas Gregor5c73e912010-02-11 00:48:18 +00002785 }
Gabor Marton26f72a92018-07-12 09:42:05 +00002786
Gabor Marton7df342a2018-12-17 12:42:12 +00002787 } else {
2788 if (GetImportedOrCreateDecl(D2, D, Importer.getToContext(),
2789 D->getTagKind(), DC, *BeginLocOrErr, Loc,
2790 Name.getAsIdentifierInfo(), PrevDecl))
2791 return D2;
2792 D2->setLexicalDeclContext(LexicalDC);
2793 LexicalDC->addDeclInternal(D2);
Douglas Gregor5c73e912010-02-11 00:48:18 +00002794 }
Gabor Marton26f72a92018-07-12 09:42:05 +00002795
Gabor Marton7df342a2018-12-17 12:42:12 +00002796 if (auto QualifierLocOrErr = import(D->getQualifierLoc()))
2797 D2->setQualifierInfo(*QualifierLocOrErr);
2798 else
2799 return QualifierLocOrErr.takeError();
2800
2801 if (D->isAnonymousStructOrUnion())
2802 D2->setAnonymousStructOrUnion(true);
Douglas Gregor25791052010-02-12 00:09:27 +00002803
Balazs Keri3b30d652018-10-19 13:32:20 +00002804 if (D->isCompleteDefinition())
2805 if (Error Err = ImportDefinition(D, D2, IDK_Default))
2806 return std::move(Err);
Craig Topper36250ad2014-05-12 05:36:57 +00002807
Douglas Gregor3996e242010-02-15 22:01:00 +00002808 return D2;
Douglas Gregor5c73e912010-02-11 00:48:18 +00002809}
2810
Balazs Keri3b30d652018-10-19 13:32:20 +00002811ExpectedDecl ASTNodeImporter::VisitEnumConstantDecl(EnumConstantDecl *D) {
Douglas Gregor98c10182010-02-12 22:17:39 +00002812 // Import the major distinguishing characteristics of this enumerator.
2813 DeclContext *DC, *LexicalDC;
2814 DeclarationName Name;
2815 SourceLocation Loc;
Sean Callanan59721b32015-04-28 18:41:46 +00002816 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00002817 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
2818 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00002819 if (ToD)
2820 return ToD;
Douglas Gregorb4964f72010-02-15 23:54:17 +00002821
Fangrui Song6907ce22018-07-30 19:24:48 +00002822 // Determine whether there are any other declarations with the same name and
Douglas Gregor98c10182010-02-12 22:17:39 +00002823 // in the same context.
2824 if (!LexicalDC->isFunctionOrMethod()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002825 SmallVector<NamedDecl *, 4> ConflictingDecls;
Douglas Gregor98c10182010-02-12 22:17:39 +00002826 unsigned IDNS = Decl::IDNS_Ordinary;
Gabor Marton54058b52018-12-17 13:53:12 +00002827 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002828 for (auto *FoundDecl : FoundDecls) {
2829 if (!FoundDecl->isInIdentifierNamespace(IDNS))
Douglas Gregor98c10182010-02-12 22:17:39 +00002830 continue;
Douglas Gregor91155082012-11-14 22:29:20 +00002831
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00002832 if (auto *FoundEnumConstant = dyn_cast<EnumConstantDecl>(FoundDecl)) {
Douglas Gregor91155082012-11-14 22:29:20 +00002833 if (IsStructuralMatch(D, FoundEnumConstant))
Gabor Marton26f72a92018-07-12 09:42:05 +00002834 return Importer.MapImported(D, FoundEnumConstant);
Gabor Martonf035b752019-08-27 11:36:10 +00002835 ConflictingDecls.push_back(FoundDecl);
Douglas Gregor91155082012-11-14 22:29:20 +00002836 }
Douglas Gregor98c10182010-02-12 22:17:39 +00002837 }
Fangrui Song6907ce22018-07-30 19:24:48 +00002838
Douglas Gregor98c10182010-02-12 22:17:39 +00002839 if (!ConflictingDecls.empty()) {
Gabor Martonf035b752019-08-27 11:36:10 +00002840 ExpectedName NameOrErr = Importer.HandleNameConflict(
2841 Name, DC, IDNS, ConflictingDecls.data(), ConflictingDecls.size());
2842 if (NameOrErr)
2843 Name = NameOrErr.get();
2844 else
2845 return NameOrErr.takeError();
Douglas Gregor98c10182010-02-12 22:17:39 +00002846 }
2847 }
Fangrui Song6907ce22018-07-30 19:24:48 +00002848
Balazs Keri3b30d652018-10-19 13:32:20 +00002849 ExpectedType TypeOrErr = import(D->getType());
2850 if (!TypeOrErr)
2851 return TypeOrErr.takeError();
2852
2853 ExpectedExpr InitOrErr = import(D->getInitExpr());
2854 if (!InitOrErr)
2855 return InitOrErr.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00002856
Gabor Marton26f72a92018-07-12 09:42:05 +00002857 EnumConstantDecl *ToEnumerator;
2858 if (GetImportedOrCreateDecl(
2859 ToEnumerator, D, Importer.getToContext(), cast<EnumDecl>(DC), Loc,
Balazs Keri3b30d652018-10-19 13:32:20 +00002860 Name.getAsIdentifierInfo(), *TypeOrErr, *InitOrErr, D->getInitVal()))
Gabor Marton26f72a92018-07-12 09:42:05 +00002861 return ToEnumerator;
2862
Douglas Gregordd483172010-02-22 17:42:47 +00002863 ToEnumerator->setAccess(D->getAccess());
Douglas Gregor98c10182010-02-12 22:17:39 +00002864 ToEnumerator->setLexicalDeclContext(LexicalDC);
Sean Callanan95e74be2011-10-21 02:57:43 +00002865 LexicalDC->addDeclInternal(ToEnumerator);
Douglas Gregor98c10182010-02-12 22:17:39 +00002866 return ToEnumerator;
2867}
Douglas Gregor5c73e912010-02-11 00:48:18 +00002868
Balazs Keri1efc9742019-05-07 10:55:11 +00002869Error ASTNodeImporter::ImportTemplateParameterLists(const DeclaratorDecl *FromD,
2870 DeclaratorDecl *ToD) {
2871 unsigned int Num = FromD->getNumTemplateParameterLists();
2872 if (Num == 0)
2873 return Error::success();
2874 SmallVector<TemplateParameterList *, 2> ToTPLists(Num);
2875 for (unsigned int I = 0; I < Num; ++I)
2876 if (Expected<TemplateParameterList *> ToTPListOrErr =
2877 import(FromD->getTemplateParameterList(I)))
2878 ToTPLists[I] = *ToTPListOrErr;
2879 else
2880 return ToTPListOrErr.takeError();
2881 ToD->setTemplateParameterListsInfo(Importer.ToContext, ToTPLists);
2882 return Error::success();
2883}
2884
Balazs Keri3b30d652018-10-19 13:32:20 +00002885Error ASTNodeImporter::ImportTemplateInformation(
2886 FunctionDecl *FromFD, FunctionDecl *ToFD) {
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00002887 switch (FromFD->getTemplatedKind()) {
2888 case FunctionDecl::TK_NonTemplate:
2889 case FunctionDecl::TK_FunctionTemplate:
Balazs Keri3b30d652018-10-19 13:32:20 +00002890 return Error::success();
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00002891
2892 case FunctionDecl::TK_MemberSpecialization: {
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00002893 TemplateSpecializationKind TSK = FromFD->getTemplateSpecializationKind();
Balazs Keri3b30d652018-10-19 13:32:20 +00002894
2895 if (Expected<FunctionDecl *> InstFDOrErr =
2896 import(FromFD->getInstantiatedFromMemberFunction()))
2897 ToFD->setInstantiationOfMemberFunction(*InstFDOrErr, TSK);
2898 else
2899 return InstFDOrErr.takeError();
2900
2901 if (ExpectedSLoc POIOrErr = import(
2902 FromFD->getMemberSpecializationInfo()->getPointOfInstantiation()))
2903 ToFD->getMemberSpecializationInfo()->setPointOfInstantiation(*POIOrErr);
2904 else
2905 return POIOrErr.takeError();
2906
2907 return Error::success();
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00002908 }
2909
2910 case FunctionDecl::TK_FunctionTemplateSpecialization: {
Balazs Keri3b30d652018-10-19 13:32:20 +00002911 auto FunctionAndArgsOrErr =
Gabor Marton5254e642018-06-27 13:32:50 +00002912 ImportFunctionTemplateWithTemplateArgsFromSpecialization(FromFD);
Balazs Keri3b30d652018-10-19 13:32:20 +00002913 if (!FunctionAndArgsOrErr)
2914 return FunctionAndArgsOrErr.takeError();
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00002915
2916 TemplateArgumentList *ToTAList = TemplateArgumentList::CreateCopy(
Balazs Keri3b30d652018-10-19 13:32:20 +00002917 Importer.getToContext(), std::get<1>(*FunctionAndArgsOrErr));
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00002918
Gabor Marton5254e642018-06-27 13:32:50 +00002919 auto *FTSInfo = FromFD->getTemplateSpecializationInfo();
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00002920 TemplateArgumentListInfo ToTAInfo;
2921 const auto *FromTAArgsAsWritten = FTSInfo->TemplateArgumentsAsWritten;
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00002922 if (FromTAArgsAsWritten)
Balazs Keri3b30d652018-10-19 13:32:20 +00002923 if (Error Err = ImportTemplateArgumentListInfo(
2924 *FromTAArgsAsWritten, ToTAInfo))
2925 return Err;
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00002926
Balazs Keri3b30d652018-10-19 13:32:20 +00002927 ExpectedSLoc POIOrErr = import(FTSInfo->getPointOfInstantiation());
2928 if (!POIOrErr)
2929 return POIOrErr.takeError();
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00002930
Balazs Keri1efc9742019-05-07 10:55:11 +00002931 if (Error Err = ImportTemplateParameterLists(FromFD, ToFD))
2932 return Err;
2933
Gabor Marton5254e642018-06-27 13:32:50 +00002934 TemplateSpecializationKind TSK = FTSInfo->getTemplateSpecializationKind();
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00002935 ToFD->setFunctionTemplateSpecialization(
Balazs Keri3b30d652018-10-19 13:32:20 +00002936 std::get<0>(*FunctionAndArgsOrErr), ToTAList, /* InsertPos= */ nullptr,
2937 TSK, FromTAArgsAsWritten ? &ToTAInfo : nullptr, *POIOrErr);
2938 return Error::success();
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00002939 }
2940
2941 case FunctionDecl::TK_DependentFunctionTemplateSpecialization: {
2942 auto *FromInfo = FromFD->getDependentSpecializationInfo();
2943 UnresolvedSet<8> TemplDecls;
2944 unsigned NumTemplates = FromInfo->getNumTemplates();
2945 for (unsigned I = 0; I < NumTemplates; I++) {
Balazs Keri3b30d652018-10-19 13:32:20 +00002946 if (Expected<FunctionTemplateDecl *> ToFTDOrErr =
2947 import(FromInfo->getTemplate(I)))
2948 TemplDecls.addDecl(*ToFTDOrErr);
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00002949 else
Balazs Keri3b30d652018-10-19 13:32:20 +00002950 return ToFTDOrErr.takeError();
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00002951 }
2952
2953 // Import TemplateArgumentListInfo.
2954 TemplateArgumentListInfo ToTAInfo;
Balazs Keri3b30d652018-10-19 13:32:20 +00002955 if (Error Err = ImportTemplateArgumentListInfo(
2956 FromInfo->getLAngleLoc(), FromInfo->getRAngleLoc(),
2957 llvm::makeArrayRef(
2958 FromInfo->getTemplateArgs(), FromInfo->getNumTemplateArgs()),
2959 ToTAInfo))
2960 return Err;
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00002961
2962 ToFD->setDependentTemplateSpecialization(Importer.getToContext(),
2963 TemplDecls, ToTAInfo);
Balazs Keri3b30d652018-10-19 13:32:20 +00002964 return Error::success();
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00002965 }
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00002966 }
Sam McCallfdc32072018-01-26 12:06:44 +00002967 llvm_unreachable("All cases should be covered!");
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00002968}
2969
Balazs Keri3b30d652018-10-19 13:32:20 +00002970Expected<FunctionDecl *>
Gabor Marton5254e642018-06-27 13:32:50 +00002971ASTNodeImporter::FindFunctionTemplateSpecialization(FunctionDecl *FromFD) {
Balazs Keri3b30d652018-10-19 13:32:20 +00002972 auto FunctionAndArgsOrErr =
Gabor Marton5254e642018-06-27 13:32:50 +00002973 ImportFunctionTemplateWithTemplateArgsFromSpecialization(FromFD);
Balazs Keri3b30d652018-10-19 13:32:20 +00002974 if (!FunctionAndArgsOrErr)
2975 return FunctionAndArgsOrErr.takeError();
Gabor Marton5254e642018-06-27 13:32:50 +00002976
Balazs Keri3b30d652018-10-19 13:32:20 +00002977 FunctionTemplateDecl *Template;
2978 TemplateArgsTy ToTemplArgs;
2979 std::tie(Template, ToTemplArgs) = *FunctionAndArgsOrErr;
Gabor Marton5254e642018-06-27 13:32:50 +00002980 void *InsertPos = nullptr;
Balazs Keri3b30d652018-10-19 13:32:20 +00002981 auto *FoundSpec = Template->findSpecialization(ToTemplArgs, InsertPos);
Gabor Marton5254e642018-06-27 13:32:50 +00002982 return FoundSpec;
2983}
2984
Shafik Yaghmour96b3d202019-01-28 21:55:33 +00002985Error ASTNodeImporter::ImportFunctionDeclBody(FunctionDecl *FromFD,
2986 FunctionDecl *ToFD) {
2987 if (Stmt *FromBody = FromFD->getBody()) {
2988 if (ExpectedStmt ToBodyOrErr = import(FromBody))
2989 ToFD->setBody(*ToBodyOrErr);
2990 else
2991 return ToBodyOrErr.takeError();
2992 }
2993 return Error::success();
2994}
2995
Balazs Keri3b30d652018-10-19 13:32:20 +00002996ExpectedDecl ASTNodeImporter::VisitFunctionDecl(FunctionDecl *D) {
Gabor Marton5254e642018-06-27 13:32:50 +00002997
Balazs Keri3b30d652018-10-19 13:32:20 +00002998 SmallVector<Decl *, 2> Redecls = getCanonicalForwardRedeclChain(D);
Gabor Marton5254e642018-06-27 13:32:50 +00002999 auto RedeclIt = Redecls.begin();
3000 // Import the first part of the decl chain. I.e. import all previous
3001 // declarations starting from the canonical decl.
Balazs Keri3b30d652018-10-19 13:32:20 +00003002 for (; RedeclIt != Redecls.end() && *RedeclIt != D; ++RedeclIt) {
3003 ExpectedDecl ToRedeclOrErr = import(*RedeclIt);
3004 if (!ToRedeclOrErr)
3005 return ToRedeclOrErr.takeError();
3006 }
Gabor Marton5254e642018-06-27 13:32:50 +00003007 assert(*RedeclIt == D);
3008
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003009 // Import the major distinguishing characteristics of this function.
3010 DeclContext *DC, *LexicalDC;
3011 DeclarationName Name;
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003012 SourceLocation Loc;
Sean Callanan59721b32015-04-28 18:41:46 +00003013 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00003014 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
3015 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00003016 if (ToD)
3017 return ToD;
Abramo Bagnarad6d2f182010-08-11 22:01:17 +00003018
Shafik Yaghmour96b3d202019-01-28 21:55:33 +00003019 FunctionDecl *FoundByLookup = nullptr;
Balazs Keria35798d2018-07-17 09:52:41 +00003020 FunctionTemplateDecl *FromFT = D->getDescribedFunctionTemplate();
Gabor Horvathe350b0a2017-09-22 11:11:01 +00003021
Gabor Marton5254e642018-06-27 13:32:50 +00003022 // If this is a function template specialization, then try to find the same
Gabor Marton54058b52018-12-17 13:53:12 +00003023 // existing specialization in the "to" context. The lookup below will not
3024 // find any specialization, but would find the primary template; thus, we
3025 // have to skip normal lookup in case of specializations.
Gabor Marton5254e642018-06-27 13:32:50 +00003026 // FIXME handle member function templates (TK_MemberSpecialization) similarly?
3027 if (D->getTemplatedKind() ==
3028 FunctionDecl::TK_FunctionTemplateSpecialization) {
Balazs Keri3b30d652018-10-19 13:32:20 +00003029 auto FoundFunctionOrErr = FindFunctionTemplateSpecialization(D);
3030 if (!FoundFunctionOrErr)
3031 return FoundFunctionOrErr.takeError();
3032 if (FunctionDecl *FoundFunction = *FoundFunctionOrErr) {
Gabor Martondd59d272019-03-19 14:04:50 +00003033 if (Decl *Def = FindAndMapDefinition(D, FoundFunction))
3034 return Def;
Gabor Marton5254e642018-06-27 13:32:50 +00003035 FoundByLookup = FoundFunction;
3036 }
3037 }
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003038 // Try to find a function in our own ("to") context with the same name, same
3039 // type, and in the same context as the function we're importing.
Gabor Marton5254e642018-06-27 13:32:50 +00003040 else if (!LexicalDC->isFunctionOrMethod()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003041 SmallVector<NamedDecl *, 4> ConflictingDecls;
Gabor Marton5254e642018-06-27 13:32:50 +00003042 unsigned IDNS = Decl::IDNS_Ordinary | Decl::IDNS_OrdinaryFriend;
Gabor Marton54058b52018-12-17 13:53:12 +00003043 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00003044 for (auto *FoundDecl : FoundDecls) {
3045 if (!FoundDecl->isInIdentifierNamespace(IDNS))
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003046 continue;
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00003047
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00003048 if (auto *FoundFunction = dyn_cast<FunctionDecl>(FoundDecl)) {
Gabor Marton458d1452019-02-14 13:07:03 +00003049 if (!hasSameVisibilityContext(FoundFunction, D))
3050 continue;
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00003051
Gabor Marton458d1452019-02-14 13:07:03 +00003052 if (IsStructuralMatch(D, FoundFunction)) {
Gabor Martondd59d272019-03-19 14:04:50 +00003053 if (Decl *Def = FindAndMapDefinition(D, FoundFunction))
3054 return Def;
Gabor Marton458d1452019-02-14 13:07:03 +00003055 FoundByLookup = FoundFunction;
3056 break;
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003057 }
Gabor Marton458d1452019-02-14 13:07:03 +00003058 // FIXME: Check for overloading more carefully, e.g., by boosting
3059 // Sema::IsOverload out to the AST library.
3060
3061 // Function overloading is okay in C++.
3062 if (Importer.getToContext().getLangOpts().CPlusPlus)
3063 continue;
3064
3065 // Complain about inconsistent function types.
Gabor Marton410f32c2019-04-01 15:29:55 +00003066 Importer.ToDiag(Loc, diag::warn_odr_function_type_inconsistent)
Gabor Marton458d1452019-02-14 13:07:03 +00003067 << Name << D->getType() << FoundFunction->getType();
3068 Importer.ToDiag(FoundFunction->getLocation(), diag::note_odr_value_here)
3069 << FoundFunction->getType();
Gabor Martonf035b752019-08-27 11:36:10 +00003070 ConflictingDecls.push_back(FoundDecl);
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003071 }
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003072 }
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00003073
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003074 if (!ConflictingDecls.empty()) {
Gabor Martonf035b752019-08-27 11:36:10 +00003075 ExpectedName NameOrErr = Importer.HandleNameConflict(
3076 Name, DC, IDNS, ConflictingDecls.data(), ConflictingDecls.size());
3077 if (NameOrErr)
3078 Name = NameOrErr.get();
3079 else
3080 return NameOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00003081 }
Douglas Gregor62d311f2010-02-09 19:21:46 +00003082 }
Douglas Gregorb4964f72010-02-15 23:54:17 +00003083
Shafik Yaghmour96b3d202019-01-28 21:55:33 +00003084 // We do not allow more than one in-class declaration of a function. This is
3085 // because AST clients like VTableBuilder asserts on this. VTableBuilder
3086 // assumes there is only one in-class declaration. Building a redecl
3087 // chain would result in more than one in-class declaration for
3088 // overrides (even if they are part of the same redecl chain inside the
3089 // derived class.)
3090 if (FoundByLookup) {
Mikael Holmenc1c97aa2019-01-29 06:53:31 +00003091 if (isa<CXXMethodDecl>(FoundByLookup)) {
Shafik Yaghmour96b3d202019-01-28 21:55:33 +00003092 if (D->getLexicalDeclContext() == D->getDeclContext()) {
Balazs Kerie9719f92019-08-07 12:40:17 +00003093 if (!D->doesThisDeclarationHaveABody()) {
3094 if (FunctionTemplateDecl *DescribedD =
3095 D->getDescribedFunctionTemplate()) {
3096 // Handle a "templated" function together with its described
3097 // template. This avoids need for a similar check at import of the
3098 // described template.
3099 assert(FoundByLookup->getDescribedFunctionTemplate() &&
3100 "Templated function mapped to non-templated?");
3101 Importer.MapImported(DescribedD,
3102 FoundByLookup->getDescribedFunctionTemplate());
3103 }
Shafik Yaghmour96b3d202019-01-28 21:55:33 +00003104 return Importer.MapImported(D, FoundByLookup);
Balazs Kerie9719f92019-08-07 12:40:17 +00003105 } else {
Shafik Yaghmour96b3d202019-01-28 21:55:33 +00003106 // Let's continue and build up the redecl chain in this case.
3107 // FIXME Merge the functions into one decl.
3108 }
3109 }
3110 }
3111 }
3112
Abramo Bagnarad6d2f182010-08-11 22:01:17 +00003113 DeclarationNameInfo NameInfo(Name, Loc);
3114 // Import additional name location/type info.
Balazs Keri3b30d652018-10-19 13:32:20 +00003115 if (Error Err = ImportDeclarationNameLoc(D->getNameInfo(), NameInfo))
3116 return std::move(Err);
Abramo Bagnarad6d2f182010-08-11 22:01:17 +00003117
Argyrios Kyrtzidis2f458532012-09-25 19:26:39 +00003118 QualType FromTy = D->getType();
3119 bool usedDifferentExceptionSpec = false;
3120
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00003121 if (const auto *FromFPT = D->getType()->getAs<FunctionProtoType>()) {
Argyrios Kyrtzidis2f458532012-09-25 19:26:39 +00003122 FunctionProtoType::ExtProtoInfo FromEPI = FromFPT->getExtProtoInfo();
3123 // FunctionProtoType::ExtProtoInfo's ExceptionSpecDecl can point to the
3124 // FunctionDecl that we are importing the FunctionProtoType for.
3125 // To avoid an infinite recursion when importing, create the FunctionDecl
3126 // with a simplified function type and update it afterwards.
Richard Smith8acb4282014-07-31 21:57:55 +00003127 if (FromEPI.ExceptionSpec.SourceDecl ||
3128 FromEPI.ExceptionSpec.SourceTemplate ||
3129 FromEPI.ExceptionSpec.NoexceptExpr) {
Argyrios Kyrtzidis2f458532012-09-25 19:26:39 +00003130 FunctionProtoType::ExtProtoInfo DefaultEPI;
3131 FromTy = Importer.getFromContext().getFunctionType(
Alp Toker314cc812014-01-25 16:55:45 +00003132 FromFPT->getReturnType(), FromFPT->getParamTypes(), DefaultEPI);
Argyrios Kyrtzidis2f458532012-09-25 19:26:39 +00003133 usedDifferentExceptionSpec = true;
3134 }
3135 }
3136
Balazs Keri3b30d652018-10-19 13:32:20 +00003137 QualType T;
3138 TypeSourceInfo *TInfo;
3139 SourceLocation ToInnerLocStart, ToEndLoc;
3140 NestedNameSpecifierLoc ToQualifierLoc;
3141 if (auto Imp = importSeq(
3142 FromTy, D->getTypeSourceInfo(), D->getInnerLocStart(),
3143 D->getQualifierLoc(), D->getEndLoc()))
3144 std::tie(T, TInfo, ToInnerLocStart, ToQualifierLoc, ToEndLoc) = *Imp;
3145 else
3146 return Imp.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00003147
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003148 // Import the function parameters.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003149 SmallVector<ParmVarDecl *, 8> Parameters;
David Majnemer59f77922016-06-24 04:05:48 +00003150 for (auto P : D->parameters()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00003151 if (Expected<ParmVarDecl *> ToPOrErr = import(P))
3152 Parameters.push_back(*ToPOrErr);
3153 else
3154 return ToPOrErr.takeError();
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003155 }
Fangrui Song6907ce22018-07-30 19:24:48 +00003156
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00003157 // Create the imported function.
Craig Topper36250ad2014-05-12 05:36:57 +00003158 FunctionDecl *ToFunction = nullptr;
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00003159 if (auto *FromConstructor = dyn_cast<CXXConstructorDecl>(D)) {
Richard Smith76b90272019-05-09 03:59:21 +00003160 Expr *ExplicitExpr = nullptr;
3161 if (FromConstructor->getExplicitSpecifier().getExpr()) {
3162 auto Imp = importSeq(FromConstructor->getExplicitSpecifier().getExpr());
3163 if (!Imp)
3164 return Imp.takeError();
3165 std::tie(ExplicitExpr) = *Imp;
3166 }
Gabor Marton26f72a92018-07-12 09:42:05 +00003167 if (GetImportedOrCreateDecl<CXXConstructorDecl>(
Richard Smith76b90272019-05-09 03:59:21 +00003168 ToFunction, D, Importer.getToContext(), cast<CXXRecordDecl>(DC),
3169 ToInnerLocStart, NameInfo, T, TInfo,
3170 ExplicitSpecifier(
3171 ExplicitExpr,
3172 FromConstructor->getExplicitSpecifier().getKind()),
Gauthier Harnisch796ed032019-06-14 08:56:20 +00003173 D->isInlineSpecified(), D->isImplicit(), D->getConstexprKind()))
Gabor Marton26f72a92018-07-12 09:42:05 +00003174 return ToFunction;
Raphael Isemann1c5d23f2019-01-22 17:59:45 +00003175 } else if (CXXDestructorDecl *FromDtor = dyn_cast<CXXDestructorDecl>(D)) {
3176
3177 auto Imp =
3178 importSeq(const_cast<FunctionDecl *>(FromDtor->getOperatorDelete()),
3179 FromDtor->getOperatorDeleteThisArg());
3180
3181 if (!Imp)
3182 return Imp.takeError();
3183
3184 FunctionDecl *ToOperatorDelete;
3185 Expr *ToThisArg;
3186 std::tie(ToOperatorDelete, ToThisArg) = *Imp;
3187
Gabor Marton26f72a92018-07-12 09:42:05 +00003188 if (GetImportedOrCreateDecl<CXXDestructorDecl>(
Balazs Keri3b30d652018-10-19 13:32:20 +00003189 ToFunction, D, Importer.getToContext(), cast<CXXRecordDecl>(DC),
3190 ToInnerLocStart, NameInfo, T, TInfo, D->isInlineSpecified(),
Richard Smith457226e2019-09-23 03:48:44 +00003191 D->isImplicit(), D->getConstexprKind()))
Gabor Marton26f72a92018-07-12 09:42:05 +00003192 return ToFunction;
Raphael Isemann1c5d23f2019-01-22 17:59:45 +00003193
3194 CXXDestructorDecl *ToDtor = cast<CXXDestructorDecl>(ToFunction);
3195
3196 ToDtor->setOperatorDelete(ToOperatorDelete, ToThisArg);
Gabor Marton26f72a92018-07-12 09:42:05 +00003197 } else if (CXXConversionDecl *FromConversion =
3198 dyn_cast<CXXConversionDecl>(D)) {
Richard Smith76b90272019-05-09 03:59:21 +00003199 Expr *ExplicitExpr = nullptr;
3200 if (FromConversion->getExplicitSpecifier().getExpr()) {
3201 auto Imp = importSeq(FromConversion->getExplicitSpecifier().getExpr());
3202 if (!Imp)
3203 return Imp.takeError();
3204 std::tie(ExplicitExpr) = *Imp;
3205 }
Gabor Marton26f72a92018-07-12 09:42:05 +00003206 if (GetImportedOrCreateDecl<CXXConversionDecl>(
3207 ToFunction, D, Importer.getToContext(), cast<CXXRecordDecl>(DC),
Balazs Keri3b30d652018-10-19 13:32:20 +00003208 ToInnerLocStart, NameInfo, T, TInfo, D->isInlineSpecified(),
Richard Smith76b90272019-05-09 03:59:21 +00003209 ExplicitSpecifier(ExplicitExpr,
3210 FromConversion->getExplicitSpecifier().getKind()),
Gauthier Harnisch796ed032019-06-14 08:56:20 +00003211 D->getConstexprKind(), SourceLocation()))
Gabor Marton26f72a92018-07-12 09:42:05 +00003212 return ToFunction;
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00003213 } else if (auto *Method = dyn_cast<CXXMethodDecl>(D)) {
Gabor Marton26f72a92018-07-12 09:42:05 +00003214 if (GetImportedOrCreateDecl<CXXMethodDecl>(
3215 ToFunction, D, Importer.getToContext(), cast<CXXRecordDecl>(DC),
Balazs Keri3b30d652018-10-19 13:32:20 +00003216 ToInnerLocStart, NameInfo, T, TInfo, Method->getStorageClass(),
Gauthier Harnisch796ed032019-06-14 08:56:20 +00003217 Method->isInlineSpecified(), D->getConstexprKind(),
3218 SourceLocation()))
Gabor Marton26f72a92018-07-12 09:42:05 +00003219 return ToFunction;
Douglas Gregor00eace12010-02-21 18:29:16 +00003220 } else {
Gauthier Harnisch796ed032019-06-14 08:56:20 +00003221 if (GetImportedOrCreateDecl(
3222 ToFunction, D, Importer.getToContext(), DC, ToInnerLocStart,
3223 NameInfo, T, TInfo, D->getStorageClass(), D->isInlineSpecified(),
3224 D->hasWrittenPrototype(), D->getConstexprKind()))
Gabor Marton26f72a92018-07-12 09:42:05 +00003225 return ToFunction;
Douglas Gregor00eace12010-02-21 18:29:16 +00003226 }
John McCall3e11ebe2010-03-15 10:12:16 +00003227
Gabor Martonf5e4f0a2018-11-20 14:19:39 +00003228 // Connect the redecl chain.
3229 if (FoundByLookup) {
3230 auto *Recent = const_cast<FunctionDecl *>(
3231 FoundByLookup->getMostRecentDecl());
3232 ToFunction->setPreviousDecl(Recent);
Gabor Martonce6b7812019-05-08 15:23:48 +00003233 // FIXME Probably we should merge exception specifications. E.g. In the
3234 // "To" context the existing function may have exception specification with
3235 // noexcept-unevaluated, while the newly imported function may have an
3236 // evaluated noexcept. A call to adjustExceptionSpec() on the imported
3237 // decl and its redeclarations may be required.
Gabor Martonf5e4f0a2018-11-20 14:19:39 +00003238 }
3239
Balazs Keri3b30d652018-10-19 13:32:20 +00003240 ToFunction->setQualifierInfo(ToQualifierLoc);
Douglas Gregordd483172010-02-22 17:42:47 +00003241 ToFunction->setAccess(D->getAccess());
Douglas Gregor43f54792010-02-17 02:12:47 +00003242 ToFunction->setLexicalDeclContext(LexicalDC);
John McCall08432c82011-01-27 02:37:01 +00003243 ToFunction->setVirtualAsWritten(D->isVirtualAsWritten());
3244 ToFunction->setTrivial(D->isTrivial());
3245 ToFunction->setPure(D->isPure());
Balazs Kerib427c062019-08-13 08:04:06 +00003246 ToFunction->setDefaulted(D->isDefaulted());
3247 ToFunction->setExplicitlyDefaulted(D->isExplicitlyDefaulted());
3248 ToFunction->setDeletedAsWritten(D->isDeletedAsWritten());
Balazs Keri3b30d652018-10-19 13:32:20 +00003249 ToFunction->setRangeEnd(ToEndLoc);
Douglas Gregor62d311f2010-02-09 19:21:46 +00003250
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003251 // Set the parameters.
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00003252 for (auto *Param : Parameters) {
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00003253 Param->setOwningFunction(ToFunction);
3254 ToFunction->addDeclInternal(Param);
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003255 }
David Blaikie9c70e042011-09-21 18:16:56 +00003256 ToFunction->setParams(Parameters);
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003257
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00003258 // We need to complete creation of FunctionProtoTypeLoc manually with setting
3259 // params it refers to.
3260 if (TInfo) {
3261 if (auto ProtoLoc =
3262 TInfo->getTypeLoc().IgnoreParens().getAs<FunctionProtoTypeLoc>()) {
3263 for (unsigned I = 0, N = Parameters.size(); I != N; ++I)
3264 ProtoLoc.setParam(I, Parameters[I]);
3265 }
3266 }
3267
Argyrios Kyrtzidis2f458532012-09-25 19:26:39 +00003268 if (usedDifferentExceptionSpec) {
3269 // Update FunctionProtoType::ExtProtoInfo.
Balazs Keri3b30d652018-10-19 13:32:20 +00003270 if (ExpectedType TyOrErr = import(D->getType()))
3271 ToFunction->setType(*TyOrErr);
3272 else
3273 return TyOrErr.takeError();
Argyrios Kyrtzidisb41791d2012-09-22 01:58:06 +00003274 }
3275
Balazs Keria35798d2018-07-17 09:52:41 +00003276 // Import the describing template function, if any.
Balazs Keri3b30d652018-10-19 13:32:20 +00003277 if (FromFT) {
3278 auto ToFTOrErr = import(FromFT);
3279 if (!ToFTOrErr)
3280 return ToFTOrErr.takeError();
3281 }
Balazs Keria35798d2018-07-17 09:52:41 +00003282
Balazs Kerie13e8362019-08-16 12:10:03 +00003283 // Import Ctor initializers.
3284 if (auto *FromConstructor = dyn_cast<CXXConstructorDecl>(D)) {
3285 if (unsigned NumInitializers = FromConstructor->getNumCtorInitializers()) {
3286 SmallVector<CXXCtorInitializer *, 4> CtorInitializers(NumInitializers);
3287 // Import first, then allocate memory and copy if there was no error.
3288 if (Error Err = ImportContainerChecked(
3289 FromConstructor->inits(), CtorInitializers))
3290 return std::move(Err);
3291 auto **Memory =
3292 new (Importer.getToContext()) CXXCtorInitializer *[NumInitializers];
3293 std::copy(CtorInitializers.begin(), CtorInitializers.end(), Memory);
3294 auto *ToCtor = cast<CXXConstructorDecl>(ToFunction);
3295 ToCtor->setCtorInitializers(Memory);
3296 ToCtor->setNumCtorInitializers(NumInitializers);
3297 }
3298 }
3299
Gabor Marton5254e642018-06-27 13:32:50 +00003300 if (D->doesThisDeclarationHaveABody()) {
Shafik Yaghmour96b3d202019-01-28 21:55:33 +00003301 Error Err = ImportFunctionDeclBody(D, ToFunction);
3302
3303 if (Err)
3304 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00003305 }
3306
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003307 // FIXME: Other bits to merge?
Douglas Gregor0eaa2bf2010-10-01 23:55:07 +00003308
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00003309 // If it is a template, import all related things.
Balazs Keri3b30d652018-10-19 13:32:20 +00003310 if (Error Err = ImportTemplateInformation(D, ToFunction))
3311 return std::move(Err);
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00003312
Gabor Marton5254e642018-06-27 13:32:50 +00003313 bool IsFriend = D->isInIdentifierNamespace(Decl::IDNS_OrdinaryFriend);
3314
3315 // TODO Can we generalize this approach to other AST nodes as well?
3316 if (D->getDeclContext()->containsDeclAndLoad(D))
3317 DC->addDeclInternal(ToFunction);
3318 if (DC != LexicalDC && D->getLexicalDeclContext()->containsDeclAndLoad(D))
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00003319 LexicalDC->addDeclInternal(ToFunction);
Douglas Gregor0eaa2bf2010-10-01 23:55:07 +00003320
Gabor Marton5254e642018-06-27 13:32:50 +00003321 // Friend declaration's lexical context is the befriending class, but the
3322 // semantic context is the enclosing scope of the befriending class.
3323 // We want the friend functions to be found in the semantic context by lookup.
3324 // FIXME should we handle this generically in VisitFriendDecl?
3325 // In Other cases when LexicalDC != DC we don't want it to be added,
3326 // e.g out-of-class definitions like void B::f() {} .
3327 if (LexicalDC != DC && IsFriend) {
3328 DC->makeDeclVisibleInContext(ToFunction);
3329 }
3330
Gabor Marton7a0841e2018-10-29 10:18:28 +00003331 if (auto *FromCXXMethod = dyn_cast<CXXMethodDecl>(D))
Balazs Kerib4fd7d42019-08-30 10:12:14 +00003332 if (Error Err = ImportOverriddenMethods(cast<CXXMethodDecl>(ToFunction),
3333 FromCXXMethod))
3334 return std::move(Err);
Gabor Marton7a0841e2018-10-29 10:18:28 +00003335
Gabor Marton5254e642018-06-27 13:32:50 +00003336 // Import the rest of the chain. I.e. import all subsequent declarations.
Balazs Keri3b30d652018-10-19 13:32:20 +00003337 for (++RedeclIt; RedeclIt != Redecls.end(); ++RedeclIt) {
3338 ExpectedDecl ToRedeclOrErr = import(*RedeclIt);
3339 if (!ToRedeclOrErr)
3340 return ToRedeclOrErr.takeError();
3341 }
Gabor Marton5254e642018-06-27 13:32:50 +00003342
Douglas Gregor43f54792010-02-17 02:12:47 +00003343 return ToFunction;
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003344}
3345
Balazs Keri3b30d652018-10-19 13:32:20 +00003346ExpectedDecl ASTNodeImporter::VisitCXXMethodDecl(CXXMethodDecl *D) {
Douglas Gregor00eace12010-02-21 18:29:16 +00003347 return VisitFunctionDecl(D);
3348}
3349
Balazs Keri3b30d652018-10-19 13:32:20 +00003350ExpectedDecl ASTNodeImporter::VisitCXXConstructorDecl(CXXConstructorDecl *D) {
Douglas Gregor00eace12010-02-21 18:29:16 +00003351 return VisitCXXMethodDecl(D);
3352}
3353
Balazs Keri3b30d652018-10-19 13:32:20 +00003354ExpectedDecl ASTNodeImporter::VisitCXXDestructorDecl(CXXDestructorDecl *D) {
Douglas Gregor00eace12010-02-21 18:29:16 +00003355 return VisitCXXMethodDecl(D);
3356}
3357
Balazs Keri3b30d652018-10-19 13:32:20 +00003358ExpectedDecl ASTNodeImporter::VisitCXXConversionDecl(CXXConversionDecl *D) {
Douglas Gregor00eace12010-02-21 18:29:16 +00003359 return VisitCXXMethodDecl(D);
3360}
3361
Balazs Keri3b30d652018-10-19 13:32:20 +00003362ExpectedDecl ASTNodeImporter::VisitFieldDecl(FieldDecl *D) {
Douglas Gregor5c73e912010-02-11 00:48:18 +00003363 // Import the major distinguishing characteristics of a variable.
3364 DeclContext *DC, *LexicalDC;
3365 DeclarationName Name;
Douglas Gregor5c73e912010-02-11 00:48:18 +00003366 SourceLocation Loc;
Sean Callanan59721b32015-04-28 18:41:46 +00003367 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00003368 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
3369 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00003370 if (ToD)
3371 return ToD;
Craig Topper36250ad2014-05-12 05:36:57 +00003372
Fangrui Song6907ce22018-07-30 19:24:48 +00003373 // Determine whether we've already imported this field.
Gabor Marton54058b52018-12-17 13:53:12 +00003374 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00003375 for (auto *FoundDecl : FoundDecls) {
Balazs Keri3b30d652018-10-19 13:32:20 +00003376 if (FieldDecl *FoundField = dyn_cast<FieldDecl>(FoundDecl)) {
Douglas Gregorceb32bf2012-10-26 16:45:11 +00003377 // For anonymous fields, match up by index.
Balazs Keri2544b4b2018-08-08 09:40:57 +00003378 if (!Name &&
3379 ASTImporter::getFieldIndex(D) !=
3380 ASTImporter::getFieldIndex(FoundField))
Douglas Gregorceb32bf2012-10-26 16:45:11 +00003381 continue;
3382
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00003383 if (Importer.IsStructurallyEquivalent(D->getType(),
Douglas Gregor03d1ed32011-10-14 21:54:42 +00003384 FoundField->getType())) {
Gabor Marton26f72a92018-07-12 09:42:05 +00003385 Importer.MapImported(D, FoundField);
Gabor Marton42e15de2018-08-22 11:52:14 +00003386 // In case of a FieldDecl of a ClassTemplateSpecializationDecl, the
3387 // initializer of a FieldDecl might not had been instantiated in the
3388 // "To" context. However, the "From" context might instantiated that,
3389 // thus we have to merge that.
3390 if (Expr *FromInitializer = D->getInClassInitializer()) {
3391 // We don't have yet the initializer set.
3392 if (FoundField->hasInClassInitializer() &&
3393 !FoundField->getInClassInitializer()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00003394 if (ExpectedExpr ToInitializerOrErr = import(FromInitializer))
3395 FoundField->setInClassInitializer(*ToInitializerOrErr);
3396 else {
3397 // We can't return error here,
Gabor Marton42e15de2018-08-22 11:52:14 +00003398 // since we already mapped D as imported.
Balazs Keri3b30d652018-10-19 13:32:20 +00003399 // FIXME: warning message?
3400 consumeError(ToInitializerOrErr.takeError());
Gabor Marton42e15de2018-08-22 11:52:14 +00003401 return FoundField;
Balazs Keri3b30d652018-10-19 13:32:20 +00003402 }
Gabor Marton42e15de2018-08-22 11:52:14 +00003403 }
3404 }
Douglas Gregor03d1ed32011-10-14 21:54:42 +00003405 return FoundField;
3406 }
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00003407
Balazs Keri3b30d652018-10-19 13:32:20 +00003408 // FIXME: Why is this case not handled with calling HandleNameConflict?
Gabor Marton410f32c2019-04-01 15:29:55 +00003409 Importer.ToDiag(Loc, diag::warn_odr_field_type_inconsistent)
Douglas Gregor03d1ed32011-10-14 21:54:42 +00003410 << Name << D->getType() << FoundField->getType();
3411 Importer.ToDiag(FoundField->getLocation(), diag::note_odr_value_here)
3412 << FoundField->getType();
Balazs Keri3b30d652018-10-19 13:32:20 +00003413
3414 return make_error<ImportError>(ImportError::NameConflict);
Douglas Gregor03d1ed32011-10-14 21:54:42 +00003415 }
3416 }
3417
Balazs Keri3b30d652018-10-19 13:32:20 +00003418 QualType ToType;
3419 TypeSourceInfo *ToTInfo;
3420 Expr *ToBitWidth;
3421 SourceLocation ToInnerLocStart;
3422 Expr *ToInitializer;
3423 if (auto Imp = importSeq(
3424 D->getType(), D->getTypeSourceInfo(), D->getBitWidth(),
3425 D->getInnerLocStart(), D->getInClassInitializer()))
3426 std::tie(
3427 ToType, ToTInfo, ToBitWidth, ToInnerLocStart, ToInitializer) = *Imp;
3428 else
3429 return Imp.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00003430
Gabor Marton26f72a92018-07-12 09:42:05 +00003431 FieldDecl *ToField;
3432 if (GetImportedOrCreateDecl(ToField, D, Importer.getToContext(), DC,
Balazs Keri3b30d652018-10-19 13:32:20 +00003433 ToInnerLocStart, Loc, Name.getAsIdentifierInfo(),
3434 ToType, ToTInfo, ToBitWidth, D->isMutable(),
3435 D->getInClassInitStyle()))
Gabor Marton26f72a92018-07-12 09:42:05 +00003436 return ToField;
3437
Douglas Gregordd483172010-02-22 17:42:47 +00003438 ToField->setAccess(D->getAccess());
Douglas Gregor5c73e912010-02-11 00:48:18 +00003439 ToField->setLexicalDeclContext(LexicalDC);
Balazs Keri3b30d652018-10-19 13:32:20 +00003440 if (ToInitializer)
3441 ToField->setInClassInitializer(ToInitializer);
Douglas Gregorceb32bf2012-10-26 16:45:11 +00003442 ToField->setImplicit(D->isImplicit());
Sean Callanan95e74be2011-10-21 02:57:43 +00003443 LexicalDC->addDeclInternal(ToField);
Douglas Gregor5c73e912010-02-11 00:48:18 +00003444 return ToField;
3445}
3446
Balazs Keri3b30d652018-10-19 13:32:20 +00003447ExpectedDecl ASTNodeImporter::VisitIndirectFieldDecl(IndirectFieldDecl *D) {
Francois Pichet783dd6e2010-11-21 06:08:52 +00003448 // Import the major distinguishing characteristics of a variable.
3449 DeclContext *DC, *LexicalDC;
3450 DeclarationName Name;
3451 SourceLocation Loc;
Sean Callanan59721b32015-04-28 18:41:46 +00003452 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00003453 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
3454 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00003455 if (ToD)
3456 return ToD;
Francois Pichet783dd6e2010-11-21 06:08:52 +00003457
Fangrui Song6907ce22018-07-30 19:24:48 +00003458 // Determine whether we've already imported this field.
Gabor Marton54058b52018-12-17 13:53:12 +00003459 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
Douglas Gregor9e0a5b32011-10-15 00:10:27 +00003460 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00003461 if (auto *FoundField = dyn_cast<IndirectFieldDecl>(FoundDecls[I])) {
Douglas Gregorceb32bf2012-10-26 16:45:11 +00003462 // For anonymous indirect fields, match up by index.
Balazs Keri2544b4b2018-08-08 09:40:57 +00003463 if (!Name &&
3464 ASTImporter::getFieldIndex(D) !=
3465 ASTImporter::getFieldIndex(FoundField))
Douglas Gregorceb32bf2012-10-26 16:45:11 +00003466 continue;
3467
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00003468 if (Importer.IsStructurallyEquivalent(D->getType(),
Douglas Gregordd6006f2012-07-17 21:16:27 +00003469 FoundField->getType(),
David Blaikie7d170102013-05-15 07:37:26 +00003470 !Name.isEmpty())) {
Gabor Marton26f72a92018-07-12 09:42:05 +00003471 Importer.MapImported(D, FoundField);
Douglas Gregor03d1ed32011-10-14 21:54:42 +00003472 return FoundField;
3473 }
Douglas Gregordd6006f2012-07-17 21:16:27 +00003474
3475 // If there are more anonymous fields to check, continue.
3476 if (!Name && I < N-1)
3477 continue;
3478
Balazs Keri3b30d652018-10-19 13:32:20 +00003479 // FIXME: Why is this case not handled with calling HandleNameConflict?
Gabor Marton410f32c2019-04-01 15:29:55 +00003480 Importer.ToDiag(Loc, diag::warn_odr_field_type_inconsistent)
Douglas Gregor03d1ed32011-10-14 21:54:42 +00003481 << Name << D->getType() << FoundField->getType();
3482 Importer.ToDiag(FoundField->getLocation(), diag::note_odr_value_here)
3483 << FoundField->getType();
Balazs Keri3b30d652018-10-19 13:32:20 +00003484
3485 return make_error<ImportError>(ImportError::NameConflict);
Douglas Gregor03d1ed32011-10-14 21:54:42 +00003486 }
3487 }
3488
Francois Pichet783dd6e2010-11-21 06:08:52 +00003489 // Import the type.
Balazs Keri3b30d652018-10-19 13:32:20 +00003490 auto TypeOrErr = import(D->getType());
3491 if (!TypeOrErr)
3492 return TypeOrErr.takeError();
Francois Pichet783dd6e2010-11-21 06:08:52 +00003493
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00003494 auto **NamedChain =
3495 new (Importer.getToContext()) NamedDecl*[D->getChainingSize()];
Francois Pichet783dd6e2010-11-21 06:08:52 +00003496
3497 unsigned i = 0;
Balazs Keri3b30d652018-10-19 13:32:20 +00003498 for (auto *PI : D->chain())
3499 if (Expected<NamedDecl *> ToD = import(PI))
3500 NamedChain[i++] = *ToD;
3501 else
3502 return ToD.takeError();
Francois Pichet783dd6e2010-11-21 06:08:52 +00003503
Gabor Marton26f72a92018-07-12 09:42:05 +00003504 llvm::MutableArrayRef<NamedDecl *> CH = {NamedChain, D->getChainingSize()};
3505 IndirectFieldDecl *ToIndirectField;
3506 if (GetImportedOrCreateDecl(ToIndirectField, D, Importer.getToContext(), DC,
Balazs Keri3b30d652018-10-19 13:32:20 +00003507 Loc, Name.getAsIdentifierInfo(), *TypeOrErr, CH))
Gabor Marton26f72a92018-07-12 09:42:05 +00003508 // FIXME here we leak `NamedChain` which is allocated before
3509 return ToIndirectField;
Aaron Ballman260995b2014-10-15 16:58:18 +00003510
Francois Pichet783dd6e2010-11-21 06:08:52 +00003511 ToIndirectField->setAccess(D->getAccess());
3512 ToIndirectField->setLexicalDeclContext(LexicalDC);
Sean Callanan95e74be2011-10-21 02:57:43 +00003513 LexicalDC->addDeclInternal(ToIndirectField);
Francois Pichet783dd6e2010-11-21 06:08:52 +00003514 return ToIndirectField;
3515}
3516
Balazs Keri3b30d652018-10-19 13:32:20 +00003517ExpectedDecl ASTNodeImporter::VisitFriendDecl(FriendDecl *D) {
Aleksei Sidorina693b372016-09-28 10:16:56 +00003518 // Import the major distinguishing characteristics of a declaration.
Balazs Keri3b30d652018-10-19 13:32:20 +00003519 DeclContext *DC, *LexicalDC;
3520 if (Error Err = ImportDeclContext(D, DC, LexicalDC))
3521 return std::move(Err);
Aleksei Sidorina693b372016-09-28 10:16:56 +00003522
3523 // Determine whether we've already imported this decl.
Gabor Marton54058b52018-12-17 13:53:12 +00003524 // FriendDecl is not a NamedDecl so we cannot use lookup.
Aleksei Sidorina693b372016-09-28 10:16:56 +00003525 auto *RD = cast<CXXRecordDecl>(DC);
3526 FriendDecl *ImportedFriend = RD->getFirstFriend();
Aleksei Sidorina693b372016-09-28 10:16:56 +00003527
3528 while (ImportedFriend) {
3529 if (D->getFriendDecl() && ImportedFriend->getFriendDecl()) {
Gabor Marton950fb572018-07-17 12:39:27 +00003530 if (IsStructuralMatch(D->getFriendDecl(), ImportedFriend->getFriendDecl(),
3531 /*Complain=*/false))
Gabor Marton26f72a92018-07-12 09:42:05 +00003532 return Importer.MapImported(D, ImportedFriend);
Aleksei Sidorina693b372016-09-28 10:16:56 +00003533
3534 } else if (D->getFriendType() && ImportedFriend->getFriendType()) {
3535 if (Importer.IsStructurallyEquivalent(
3536 D->getFriendType()->getType(),
3537 ImportedFriend->getFriendType()->getType(), true))
Gabor Marton26f72a92018-07-12 09:42:05 +00003538 return Importer.MapImported(D, ImportedFriend);
Aleksei Sidorina693b372016-09-28 10:16:56 +00003539 }
3540 ImportedFriend = ImportedFriend->getNextFriend();
3541 }
3542
3543 // Not found. Create it.
3544 FriendDecl::FriendUnion ToFU;
Peter Szecsib180eeb2018-04-25 17:28:03 +00003545 if (NamedDecl *FriendD = D->getFriendDecl()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00003546 NamedDecl *ToFriendD;
3547 if (Error Err = importInto(ToFriendD, FriendD))
3548 return std::move(Err);
3549
3550 if (FriendD->getFriendObjectKind() != Decl::FOK_None &&
Peter Szecsib180eeb2018-04-25 17:28:03 +00003551 !(FriendD->isInIdentifierNamespace(Decl::IDNS_NonMemberOperator)))
3552 ToFriendD->setObjectOfFriendDecl(false);
3553
3554 ToFU = ToFriendD;
Balazs Keri3b30d652018-10-19 13:32:20 +00003555 } else { // The friend is a type, not a decl.
3556 if (auto TSIOrErr = import(D->getFriendType()))
3557 ToFU = *TSIOrErr;
3558 else
3559 return TSIOrErr.takeError();
3560 }
Aleksei Sidorina693b372016-09-28 10:16:56 +00003561
3562 SmallVector<TemplateParameterList *, 1> ToTPLists(D->NumTPLists);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00003563 auto **FromTPLists = D->getTrailingObjects<TemplateParameterList *>();
Aleksei Sidorina693b372016-09-28 10:16:56 +00003564 for (unsigned I = 0; I < D->NumTPLists; I++) {
Balazs Keridec09162019-03-20 15:42:42 +00003565 if (auto ListOrErr = import(FromTPLists[I]))
Balazs Keri3b30d652018-10-19 13:32:20 +00003566 ToTPLists[I] = *ListOrErr;
3567 else
3568 return ListOrErr.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00003569 }
3570
Balazs Keri3b30d652018-10-19 13:32:20 +00003571 auto LocationOrErr = import(D->getLocation());
3572 if (!LocationOrErr)
3573 return LocationOrErr.takeError();
3574 auto FriendLocOrErr = import(D->getFriendLoc());
3575 if (!FriendLocOrErr)
3576 return FriendLocOrErr.takeError();
3577
Gabor Marton26f72a92018-07-12 09:42:05 +00003578 FriendDecl *FrD;
3579 if (GetImportedOrCreateDecl(FrD, D, Importer.getToContext(), DC,
Balazs Keri3b30d652018-10-19 13:32:20 +00003580 *LocationOrErr, ToFU,
3581 *FriendLocOrErr, ToTPLists))
Gabor Marton26f72a92018-07-12 09:42:05 +00003582 return FrD;
Aleksei Sidorina693b372016-09-28 10:16:56 +00003583
3584 FrD->setAccess(D->getAccess());
3585 FrD->setLexicalDeclContext(LexicalDC);
3586 LexicalDC->addDeclInternal(FrD);
3587 return FrD;
3588}
3589
Balazs Keri3b30d652018-10-19 13:32:20 +00003590ExpectedDecl ASTNodeImporter::VisitObjCIvarDecl(ObjCIvarDecl *D) {
Douglas Gregor7244b0b2010-02-17 00:34:30 +00003591 // Import the major distinguishing characteristics of an ivar.
3592 DeclContext *DC, *LexicalDC;
3593 DeclarationName Name;
3594 SourceLocation Loc;
Sean Callanan59721b32015-04-28 18:41:46 +00003595 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00003596 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
3597 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00003598 if (ToD)
3599 return ToD;
Craig Topper36250ad2014-05-12 05:36:57 +00003600
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00003601 // Determine whether we've already imported this ivar
Gabor Marton54058b52018-12-17 13:53:12 +00003602 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00003603 for (auto *FoundDecl : FoundDecls) {
Balazs Keri3b30d652018-10-19 13:32:20 +00003604 if (ObjCIvarDecl *FoundIvar = dyn_cast<ObjCIvarDecl>(FoundDecl)) {
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00003605 if (Importer.IsStructurallyEquivalent(D->getType(),
Douglas Gregor7244b0b2010-02-17 00:34:30 +00003606 FoundIvar->getType())) {
Gabor Marton26f72a92018-07-12 09:42:05 +00003607 Importer.MapImported(D, FoundIvar);
Douglas Gregor7244b0b2010-02-17 00:34:30 +00003608 return FoundIvar;
3609 }
3610
Gabor Marton410f32c2019-04-01 15:29:55 +00003611 Importer.ToDiag(Loc, diag::warn_odr_ivar_type_inconsistent)
Douglas Gregor7244b0b2010-02-17 00:34:30 +00003612 << Name << D->getType() << FoundIvar->getType();
3613 Importer.ToDiag(FoundIvar->getLocation(), diag::note_odr_value_here)
3614 << FoundIvar->getType();
Balazs Keri3b30d652018-10-19 13:32:20 +00003615
3616 return make_error<ImportError>(ImportError::NameConflict);
Douglas Gregor7244b0b2010-02-17 00:34:30 +00003617 }
3618 }
3619
Balazs Keri3b30d652018-10-19 13:32:20 +00003620 QualType ToType;
3621 TypeSourceInfo *ToTypeSourceInfo;
3622 Expr *ToBitWidth;
3623 SourceLocation ToInnerLocStart;
3624 if (auto Imp = importSeq(
3625 D->getType(), D->getTypeSourceInfo(), D->getBitWidth(), D->getInnerLocStart()))
3626 std::tie(ToType, ToTypeSourceInfo, ToBitWidth, ToInnerLocStart) = *Imp;
3627 else
3628 return Imp.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00003629
Gabor Marton26f72a92018-07-12 09:42:05 +00003630 ObjCIvarDecl *ToIvar;
3631 if (GetImportedOrCreateDecl(
3632 ToIvar, D, Importer.getToContext(), cast<ObjCContainerDecl>(DC),
Balazs Keri3b30d652018-10-19 13:32:20 +00003633 ToInnerLocStart, Loc, Name.getAsIdentifierInfo(),
3634 ToType, ToTypeSourceInfo,
3635 D->getAccessControl(),ToBitWidth, D->getSynthesize()))
Gabor Marton26f72a92018-07-12 09:42:05 +00003636 return ToIvar;
3637
Douglas Gregor7244b0b2010-02-17 00:34:30 +00003638 ToIvar->setLexicalDeclContext(LexicalDC);
Sean Callanan95e74be2011-10-21 02:57:43 +00003639 LexicalDC->addDeclInternal(ToIvar);
Douglas Gregor7244b0b2010-02-17 00:34:30 +00003640 return ToIvar;
Douglas Gregor7244b0b2010-02-17 00:34:30 +00003641}
3642
Balazs Keri3b30d652018-10-19 13:32:20 +00003643ExpectedDecl ASTNodeImporter::VisitVarDecl(VarDecl *D) {
Gabor Martonac3a5d62018-09-17 12:04:52 +00003644
3645 SmallVector<Decl*, 2> Redecls = getCanonicalForwardRedeclChain(D);
3646 auto RedeclIt = Redecls.begin();
3647 // Import the first part of the decl chain. I.e. import all previous
3648 // declarations starting from the canonical decl.
Balazs Keri3b30d652018-10-19 13:32:20 +00003649 for (; RedeclIt != Redecls.end() && *RedeclIt != D; ++RedeclIt) {
3650 ExpectedDecl RedeclOrErr = import(*RedeclIt);
3651 if (!RedeclOrErr)
3652 return RedeclOrErr.takeError();
3653 }
Gabor Martonac3a5d62018-09-17 12:04:52 +00003654 assert(*RedeclIt == D);
3655
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003656 // Import the major distinguishing characteristics of a variable.
3657 DeclContext *DC, *LexicalDC;
3658 DeclarationName Name;
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003659 SourceLocation Loc;
Sean Callanan59721b32015-04-28 18:41:46 +00003660 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00003661 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
3662 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00003663 if (ToD)
3664 return ToD;
Craig Topper36250ad2014-05-12 05:36:57 +00003665
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00003666 // Try to find a variable in our own ("to") context with the same name and
3667 // in the same context as the variable we're importing.
Gabor Martonac3a5d62018-09-17 12:04:52 +00003668 VarDecl *FoundByLookup = nullptr;
Douglas Gregor62d311f2010-02-09 19:21:46 +00003669 if (D->isFileVarDecl()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003670 SmallVector<NamedDecl *, 4> ConflictingDecls;
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00003671 unsigned IDNS = Decl::IDNS_Ordinary;
Gabor Marton54058b52018-12-17 13:53:12 +00003672 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00003673 for (auto *FoundDecl : FoundDecls) {
3674 if (!FoundDecl->isInIdentifierNamespace(IDNS))
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00003675 continue;
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00003676
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00003677 if (auto *FoundVar = dyn_cast<VarDecl>(FoundDecl)) {
Gabor Marton458d1452019-02-14 13:07:03 +00003678 if (!hasSameVisibilityContext(FoundVar, D))
3679 continue;
3680 if (Importer.IsStructurallyEquivalent(D->getType(),
3681 FoundVar->getType())) {
Gabor Martonac3a5d62018-09-17 12:04:52 +00003682
Gabor Marton458d1452019-02-14 13:07:03 +00003683 // The VarDecl in the "From" context has a definition, but in the
3684 // "To" context we already have a definition.
3685 VarDecl *FoundDef = FoundVar->getDefinition();
3686 if (D->isThisDeclarationADefinition() && FoundDef)
3687 // FIXME Check for ODR error if the two definitions have
3688 // different initializers?
3689 return Importer.MapImported(D, FoundDef);
Gabor Martonac3a5d62018-09-17 12:04:52 +00003690
Gabor Marton458d1452019-02-14 13:07:03 +00003691 // The VarDecl in the "From" context has an initializer, but in the
3692 // "To" context we already have an initializer.
3693 const VarDecl *FoundDInit = nullptr;
3694 if (D->getInit() && FoundVar->getAnyInitializer(FoundDInit))
3695 // FIXME Diagnose ODR error if the two initializers are different?
3696 return Importer.MapImported(D, const_cast<VarDecl*>(FoundDInit));
3697
3698 FoundByLookup = FoundVar;
3699 break;
3700 }
3701
3702 const ArrayType *FoundArray
3703 = Importer.getToContext().getAsArrayType(FoundVar->getType());
3704 const ArrayType *TArray
3705 = Importer.getToContext().getAsArrayType(D->getType());
3706 if (FoundArray && TArray) {
3707 if (isa<IncompleteArrayType>(FoundArray) &&
3708 isa<ConstantArrayType>(TArray)) {
3709 // Import the type.
3710 if (auto TyOrErr = import(D->getType()))
3711 FoundVar->setType(*TyOrErr);
3712 else
3713 return TyOrErr.takeError();
Gabor Martonac3a5d62018-09-17 12:04:52 +00003714
3715 FoundByLookup = FoundVar;
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00003716 break;
Gabor Marton458d1452019-02-14 13:07:03 +00003717 } else if (isa<IncompleteArrayType>(TArray) &&
3718 isa<ConstantArrayType>(FoundArray)) {
3719 FoundByLookup = FoundVar;
3720 break;
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00003721 }
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00003722 }
Gabor Marton458d1452019-02-14 13:07:03 +00003723
Gabor Marton410f32c2019-04-01 15:29:55 +00003724 Importer.ToDiag(Loc, diag::warn_odr_variable_type_inconsistent)
Gabor Marton458d1452019-02-14 13:07:03 +00003725 << Name << D->getType() << FoundVar->getType();
3726 Importer.ToDiag(FoundVar->getLocation(), diag::note_odr_value_here)
3727 << FoundVar->getType();
Gabor Martonf035b752019-08-27 11:36:10 +00003728 ConflictingDecls.push_back(FoundDecl);
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00003729 }
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00003730 }
3731
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00003732 if (!ConflictingDecls.empty()) {
Gabor Martonf035b752019-08-27 11:36:10 +00003733 ExpectedName NameOrErr = Importer.HandleNameConflict(
3734 Name, DC, IDNS, ConflictingDecls.data(), ConflictingDecls.size());
3735 if (NameOrErr)
3736 Name = NameOrErr.get();
3737 else
3738 return NameOrErr.takeError();
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00003739 }
3740 }
Fangrui Song6907ce22018-07-30 19:24:48 +00003741
Balazs Keri3b30d652018-10-19 13:32:20 +00003742 QualType ToType;
3743 TypeSourceInfo *ToTypeSourceInfo;
3744 SourceLocation ToInnerLocStart;
3745 NestedNameSpecifierLoc ToQualifierLoc;
3746 if (auto Imp = importSeq(
3747 D->getType(), D->getTypeSourceInfo(), D->getInnerLocStart(),
3748 D->getQualifierLoc()))
3749 std::tie(ToType, ToTypeSourceInfo, ToInnerLocStart, ToQualifierLoc) = *Imp;
3750 else
3751 return Imp.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00003752
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00003753 // Create the imported variable.
Gabor Marton26f72a92018-07-12 09:42:05 +00003754 VarDecl *ToVar;
3755 if (GetImportedOrCreateDecl(ToVar, D, Importer.getToContext(), DC,
Balazs Keri3b30d652018-10-19 13:32:20 +00003756 ToInnerLocStart, Loc,
3757 Name.getAsIdentifierInfo(),
3758 ToType, ToTypeSourceInfo,
Gabor Marton26f72a92018-07-12 09:42:05 +00003759 D->getStorageClass()))
3760 return ToVar;
3761
Balazs Keri3b30d652018-10-19 13:32:20 +00003762 ToVar->setQualifierInfo(ToQualifierLoc);
Douglas Gregordd483172010-02-22 17:42:47 +00003763 ToVar->setAccess(D->getAccess());
Douglas Gregor62d311f2010-02-09 19:21:46 +00003764 ToVar->setLexicalDeclContext(LexicalDC);
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00003765
Gabor Martonac3a5d62018-09-17 12:04:52 +00003766 if (FoundByLookup) {
3767 auto *Recent = const_cast<VarDecl *>(FoundByLookup->getMostRecentDecl());
3768 ToVar->setPreviousDecl(Recent);
3769 }
Douglas Gregor62d311f2010-02-09 19:21:46 +00003770
Balazs Keri3b30d652018-10-19 13:32:20 +00003771 if (Error Err = ImportInitializer(D, ToVar))
3772 return std::move(Err);
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00003773
Aleksei Sidorin855086d2017-01-23 09:30:36 +00003774 if (D->isConstexpr())
3775 ToVar->setConstexpr(true);
3776
Gabor Martonac3a5d62018-09-17 12:04:52 +00003777 if (D->getDeclContext()->containsDeclAndLoad(D))
3778 DC->addDeclInternal(ToVar);
3779 if (DC != LexicalDC && D->getLexicalDeclContext()->containsDeclAndLoad(D))
3780 LexicalDC->addDeclInternal(ToVar);
3781
3782 // Import the rest of the chain. I.e. import all subsequent declarations.
Balazs Keri3b30d652018-10-19 13:32:20 +00003783 for (++RedeclIt; RedeclIt != Redecls.end(); ++RedeclIt) {
3784 ExpectedDecl RedeclOrErr = import(*RedeclIt);
3785 if (!RedeclOrErr)
3786 return RedeclOrErr.takeError();
3787 }
Gabor Martonac3a5d62018-09-17 12:04:52 +00003788
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00003789 return ToVar;
3790}
3791
Balazs Keri3b30d652018-10-19 13:32:20 +00003792ExpectedDecl ASTNodeImporter::VisitImplicitParamDecl(ImplicitParamDecl *D) {
Douglas Gregor8b228d72010-02-17 21:22:52 +00003793 // Parameters are created in the translation unit's context, then moved
3794 // into the function declaration's context afterward.
3795 DeclContext *DC = Importer.getToContext().getTranslationUnitDecl();
Fangrui Song6907ce22018-07-30 19:24:48 +00003796
Balazs Keri3b30d652018-10-19 13:32:20 +00003797 DeclarationName ToDeclName;
3798 SourceLocation ToLocation;
3799 QualType ToType;
3800 if (auto Imp = importSeq(D->getDeclName(), D->getLocation(), D->getType()))
3801 std::tie(ToDeclName, ToLocation, ToType) = *Imp;
3802 else
3803 return Imp.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00003804
Douglas Gregor8b228d72010-02-17 21:22:52 +00003805 // Create the imported parameter.
Gabor Marton26f72a92018-07-12 09:42:05 +00003806 ImplicitParamDecl *ToParm = nullptr;
Balazs Keri3b30d652018-10-19 13:32:20 +00003807 if (GetImportedOrCreateDecl(ToParm, D, Importer.getToContext(), DC,
3808 ToLocation, ToDeclName.getAsIdentifierInfo(),
3809 ToType, D->getParameterKind()))
Gabor Marton26f72a92018-07-12 09:42:05 +00003810 return ToParm;
3811 return ToParm;
Douglas Gregor8b228d72010-02-17 21:22:52 +00003812}
3813
Balazs Keric5095942019-08-14 09:41:39 +00003814Error ASTNodeImporter::ImportDefaultArgOfParmVarDecl(
3815 const ParmVarDecl *FromParam, ParmVarDecl *ToParam) {
3816 ToParam->setHasInheritedDefaultArg(FromParam->hasInheritedDefaultArg());
3817 ToParam->setKNRPromoted(FromParam->isKNRPromoted());
3818
3819 if (FromParam->hasUninstantiatedDefaultArg()) {
3820 if (auto ToDefArgOrErr = import(FromParam->getUninstantiatedDefaultArg()))
3821 ToParam->setUninstantiatedDefaultArg(*ToDefArgOrErr);
3822 else
3823 return ToDefArgOrErr.takeError();
3824 } else if (FromParam->hasUnparsedDefaultArg()) {
3825 ToParam->setUnparsedDefaultArg();
3826 } else if (FromParam->hasDefaultArg()) {
3827 if (auto ToDefArgOrErr = import(FromParam->getDefaultArg()))
3828 ToParam->setDefaultArg(*ToDefArgOrErr);
3829 else
3830 return ToDefArgOrErr.takeError();
3831 }
3832
3833 return Error::success();
3834}
3835
Balazs Keri3b30d652018-10-19 13:32:20 +00003836ExpectedDecl ASTNodeImporter::VisitParmVarDecl(ParmVarDecl *D) {
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003837 // Parameters are created in the translation unit's context, then moved
3838 // into the function declaration's context afterward.
3839 DeclContext *DC = Importer.getToContext().getTranslationUnitDecl();
Fangrui Song6907ce22018-07-30 19:24:48 +00003840
Balazs Keri3b30d652018-10-19 13:32:20 +00003841 DeclarationName ToDeclName;
3842 SourceLocation ToLocation, ToInnerLocStart;
3843 QualType ToType;
3844 TypeSourceInfo *ToTypeSourceInfo;
3845 if (auto Imp = importSeq(
3846 D->getDeclName(), D->getLocation(), D->getType(), D->getInnerLocStart(),
3847 D->getTypeSourceInfo()))
3848 std::tie(
3849 ToDeclName, ToLocation, ToType, ToInnerLocStart,
3850 ToTypeSourceInfo) = *Imp;
3851 else
3852 return Imp.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00003853
Gabor Marton26f72a92018-07-12 09:42:05 +00003854 ParmVarDecl *ToParm;
3855 if (GetImportedOrCreateDecl(ToParm, D, Importer.getToContext(), DC,
Balazs Keri3b30d652018-10-19 13:32:20 +00003856 ToInnerLocStart, ToLocation,
3857 ToDeclName.getAsIdentifierInfo(), ToType,
3858 ToTypeSourceInfo, D->getStorageClass(),
Gabor Marton26f72a92018-07-12 09:42:05 +00003859 /*DefaultArg*/ nullptr))
3860 return ToParm;
Aleksei Sidorin55a63502017-02-20 11:57:12 +00003861
Balazs Keric5095942019-08-14 09:41:39 +00003862 // Set the default argument. It should be no problem if it was already done.
3863 // Do not import the default expression before GetImportedOrCreateDecl call
3864 // to avoid possible infinite import loop because circular dependency.
3865 if (Error Err = ImportDefaultArgOfParmVarDecl(D, ToParm))
3866 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00003867
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00003868 if (D->isObjCMethodParameter()) {
3869 ToParm->setObjCMethodScopeInfo(D->getFunctionScopeIndex());
3870 ToParm->setObjCDeclQualifier(D->getObjCDeclQualifier());
3871 } else {
3872 ToParm->setScopeInfo(D->getFunctionScopeDepth(),
3873 D->getFunctionScopeIndex());
3874 }
3875
Gabor Marton26f72a92018-07-12 09:42:05 +00003876 return ToParm;
Douglas Gregorbb7930c2010-02-10 19:54:31 +00003877}
3878
Balazs Keri3b30d652018-10-19 13:32:20 +00003879ExpectedDecl ASTNodeImporter::VisitObjCMethodDecl(ObjCMethodDecl *D) {
Douglas Gregor43f54792010-02-17 02:12:47 +00003880 // Import the major distinguishing characteristics of a method.
3881 DeclContext *DC, *LexicalDC;
3882 DeclarationName Name;
3883 SourceLocation Loc;
Sean Callanan59721b32015-04-28 18:41:46 +00003884 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00003885 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
3886 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00003887 if (ToD)
3888 return ToD;
Craig Topper36250ad2014-05-12 05:36:57 +00003889
Gabor Marton54058b52018-12-17 13:53:12 +00003890 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00003891 for (auto *FoundDecl : FoundDecls) {
3892 if (auto *FoundMethod = dyn_cast<ObjCMethodDecl>(FoundDecl)) {
Douglas Gregor43f54792010-02-17 02:12:47 +00003893 if (FoundMethod->isInstanceMethod() != D->isInstanceMethod())
3894 continue;
3895
3896 // Check return types.
Alp Toker314cc812014-01-25 16:55:45 +00003897 if (!Importer.IsStructurallyEquivalent(D->getReturnType(),
3898 FoundMethod->getReturnType())) {
Gabor Marton410f32c2019-04-01 15:29:55 +00003899 Importer.ToDiag(Loc, diag::warn_odr_objc_method_result_type_inconsistent)
Alp Toker314cc812014-01-25 16:55:45 +00003900 << D->isInstanceMethod() << Name << D->getReturnType()
3901 << FoundMethod->getReturnType();
Fangrui Song6907ce22018-07-30 19:24:48 +00003902 Importer.ToDiag(FoundMethod->getLocation(),
Douglas Gregor43f54792010-02-17 02:12:47 +00003903 diag::note_odr_objc_method_here)
3904 << D->isInstanceMethod() << Name;
Balazs Keri3b30d652018-10-19 13:32:20 +00003905
3906 return make_error<ImportError>(ImportError::NameConflict);
Douglas Gregor43f54792010-02-17 02:12:47 +00003907 }
3908
3909 // Check the number of parameters.
3910 if (D->param_size() != FoundMethod->param_size()) {
Gabor Marton410f32c2019-04-01 15:29:55 +00003911 Importer.ToDiag(Loc, diag::warn_odr_objc_method_num_params_inconsistent)
Douglas Gregor43f54792010-02-17 02:12:47 +00003912 << D->isInstanceMethod() << Name
3913 << D->param_size() << FoundMethod->param_size();
Fangrui Song6907ce22018-07-30 19:24:48 +00003914 Importer.ToDiag(FoundMethod->getLocation(),
Douglas Gregor43f54792010-02-17 02:12:47 +00003915 diag::note_odr_objc_method_here)
3916 << D->isInstanceMethod() << Name;
Balazs Keri3b30d652018-10-19 13:32:20 +00003917
3918 return make_error<ImportError>(ImportError::NameConflict);
Douglas Gregor43f54792010-02-17 02:12:47 +00003919 }
3920
3921 // Check parameter types.
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00003922 for (ObjCMethodDecl::param_iterator P = D->param_begin(),
Douglas Gregor43f54792010-02-17 02:12:47 +00003923 PEnd = D->param_end(), FoundP = FoundMethod->param_begin();
3924 P != PEnd; ++P, ++FoundP) {
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00003925 if (!Importer.IsStructurallyEquivalent((*P)->getType(),
Douglas Gregor43f54792010-02-17 02:12:47 +00003926 (*FoundP)->getType())) {
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00003927 Importer.FromDiag((*P)->getLocation(),
Gabor Marton410f32c2019-04-01 15:29:55 +00003928 diag::warn_odr_objc_method_param_type_inconsistent)
Douglas Gregor43f54792010-02-17 02:12:47 +00003929 << D->isInstanceMethod() << Name
3930 << (*P)->getType() << (*FoundP)->getType();
3931 Importer.ToDiag((*FoundP)->getLocation(), diag::note_odr_value_here)
3932 << (*FoundP)->getType();
Balazs Keri3b30d652018-10-19 13:32:20 +00003933
3934 return make_error<ImportError>(ImportError::NameConflict);
Douglas Gregor43f54792010-02-17 02:12:47 +00003935 }
3936 }
3937
3938 // Check variadic/non-variadic.
3939 // Check the number of parameters.
3940 if (D->isVariadic() != FoundMethod->isVariadic()) {
Gabor Marton410f32c2019-04-01 15:29:55 +00003941 Importer.ToDiag(Loc, diag::warn_odr_objc_method_variadic_inconsistent)
Douglas Gregor43f54792010-02-17 02:12:47 +00003942 << D->isInstanceMethod() << Name;
Fangrui Song6907ce22018-07-30 19:24:48 +00003943 Importer.ToDiag(FoundMethod->getLocation(),
Douglas Gregor43f54792010-02-17 02:12:47 +00003944 diag::note_odr_objc_method_here)
3945 << D->isInstanceMethod() << Name;
Balazs Keri3b30d652018-10-19 13:32:20 +00003946
3947 return make_error<ImportError>(ImportError::NameConflict);
Douglas Gregor43f54792010-02-17 02:12:47 +00003948 }
3949
3950 // FIXME: Any other bits we need to merge?
Gabor Marton26f72a92018-07-12 09:42:05 +00003951 return Importer.MapImported(D, FoundMethod);
Douglas Gregor43f54792010-02-17 02:12:47 +00003952 }
3953 }
3954
Balazs Keri3b30d652018-10-19 13:32:20 +00003955 SourceLocation ToEndLoc;
3956 QualType ToReturnType;
3957 TypeSourceInfo *ToReturnTypeSourceInfo;
3958 if (auto Imp = importSeq(
3959 D->getEndLoc(), D->getReturnType(), D->getReturnTypeSourceInfo()))
3960 std::tie(ToEndLoc, ToReturnType, ToReturnTypeSourceInfo) = *Imp;
3961 else
3962 return Imp.takeError();
Douglas Gregor12852d92010-03-08 14:59:44 +00003963
Gabor Marton26f72a92018-07-12 09:42:05 +00003964 ObjCMethodDecl *ToMethod;
3965 if (GetImportedOrCreateDecl(
Adrian Prantl2073dd22019-11-04 14:28:14 -08003966 ToMethod, D, Importer.getToContext(), Loc, ToEndLoc,
3967 Name.getObjCSelector(), ToReturnType, ToReturnTypeSourceInfo, DC,
3968 D->isInstanceMethod(), D->isVariadic(), D->isPropertyAccessor(),
3969 D->isSynthesizedAccessorStub(), D->isImplicit(), D->isDefined(),
Gabor Marton26f72a92018-07-12 09:42:05 +00003970 D->getImplementationControl(), D->hasRelatedResultType()))
3971 return ToMethod;
Douglas Gregor43f54792010-02-17 02:12:47 +00003972
3973 // FIXME: When we decide to merge method definitions, we'll need to
3974 // deal with implicit parameters.
3975
3976 // Import the parameters
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003977 SmallVector<ParmVarDecl *, 5> ToParams;
David Majnemer59f77922016-06-24 04:05:48 +00003978 for (auto *FromP : D->parameters()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00003979 if (Expected<ParmVarDecl *> ToPOrErr = import(FromP))
3980 ToParams.push_back(*ToPOrErr);
3981 else
3982 return ToPOrErr.takeError();
Douglas Gregor43f54792010-02-17 02:12:47 +00003983 }
Fangrui Song6907ce22018-07-30 19:24:48 +00003984
Douglas Gregor43f54792010-02-17 02:12:47 +00003985 // Set the parameters.
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00003986 for (auto *ToParam : ToParams) {
3987 ToParam->setOwningFunction(ToMethod);
3988 ToMethod->addDeclInternal(ToParam);
Douglas Gregor43f54792010-02-17 02:12:47 +00003989 }
Aleksei Sidorin47dbaf62018-01-09 14:25:05 +00003990
Balazs Keri3b30d652018-10-19 13:32:20 +00003991 SmallVector<SourceLocation, 12> FromSelLocs;
3992 D->getSelectorLocs(FromSelLocs);
3993 SmallVector<SourceLocation, 12> ToSelLocs(FromSelLocs.size());
3994 if (Error Err = ImportContainerChecked(FromSelLocs, ToSelLocs))
3995 return std::move(Err);
Aleksei Sidorin47dbaf62018-01-09 14:25:05 +00003996
Balazs Keri3b30d652018-10-19 13:32:20 +00003997 ToMethod->setMethodParams(Importer.getToContext(), ToParams, ToSelLocs);
Douglas Gregor43f54792010-02-17 02:12:47 +00003998
3999 ToMethod->setLexicalDeclContext(LexicalDC);
Sean Callanan95e74be2011-10-21 02:57:43 +00004000 LexicalDC->addDeclInternal(ToMethod);
Douglas Gregor43f54792010-02-17 02:12:47 +00004001 return ToMethod;
4002}
4003
Balazs Keri3b30d652018-10-19 13:32:20 +00004004ExpectedDecl ASTNodeImporter::VisitObjCTypeParamDecl(ObjCTypeParamDecl *D) {
Douglas Gregor85f3f952015-07-07 03:57:15 +00004005 // Import the major distinguishing characteristics of a category.
4006 DeclContext *DC, *LexicalDC;
4007 DeclarationName Name;
4008 SourceLocation Loc;
4009 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00004010 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
4011 return std::move(Err);
Douglas Gregor85f3f952015-07-07 03:57:15 +00004012 if (ToD)
4013 return ToD;
4014
Balazs Keri3b30d652018-10-19 13:32:20 +00004015 SourceLocation ToVarianceLoc, ToLocation, ToColonLoc;
4016 TypeSourceInfo *ToTypeSourceInfo;
4017 if (auto Imp = importSeq(
4018 D->getVarianceLoc(), D->getLocation(), D->getColonLoc(),
4019 D->getTypeSourceInfo()))
4020 std::tie(ToVarianceLoc, ToLocation, ToColonLoc, ToTypeSourceInfo) = *Imp;
4021 else
4022 return Imp.takeError();
Douglas Gregor85f3f952015-07-07 03:57:15 +00004023
Gabor Marton26f72a92018-07-12 09:42:05 +00004024 ObjCTypeParamDecl *Result;
4025 if (GetImportedOrCreateDecl(
4026 Result, D, Importer.getToContext(), DC, D->getVariance(),
Balazs Keri3b30d652018-10-19 13:32:20 +00004027 ToVarianceLoc, D->getIndex(),
4028 ToLocation, Name.getAsIdentifierInfo(),
4029 ToColonLoc, ToTypeSourceInfo))
Gabor Marton26f72a92018-07-12 09:42:05 +00004030 return Result;
4031
Douglas Gregor85f3f952015-07-07 03:57:15 +00004032 Result->setLexicalDeclContext(LexicalDC);
4033 return Result;
4034}
4035
Balazs Keri3b30d652018-10-19 13:32:20 +00004036ExpectedDecl ASTNodeImporter::VisitObjCCategoryDecl(ObjCCategoryDecl *D) {
Douglas Gregor84c51c32010-02-18 01:47:50 +00004037 // Import the major distinguishing characteristics of a category.
4038 DeclContext *DC, *LexicalDC;
4039 DeclarationName Name;
4040 SourceLocation Loc;
Sean Callanan59721b32015-04-28 18:41:46 +00004041 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00004042 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
4043 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00004044 if (ToD)
4045 return ToD;
Craig Topper36250ad2014-05-12 05:36:57 +00004046
Balazs Keri3b30d652018-10-19 13:32:20 +00004047 ObjCInterfaceDecl *ToInterface;
4048 if (Error Err = importInto(ToInterface, D->getClassInterface()))
4049 return std::move(Err);
Craig Topper36250ad2014-05-12 05:36:57 +00004050
Douglas Gregor84c51c32010-02-18 01:47:50 +00004051 // Determine if we've already encountered this category.
4052 ObjCCategoryDecl *MergeWithCategory
4053 = ToInterface->FindCategoryDeclaration(Name.getAsIdentifierInfo());
4054 ObjCCategoryDecl *ToCategory = MergeWithCategory;
4055 if (!ToCategory) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004056 SourceLocation ToAtStartLoc, ToCategoryNameLoc;
4057 SourceLocation ToIvarLBraceLoc, ToIvarRBraceLoc;
4058 if (auto Imp = importSeq(
4059 D->getAtStartLoc(), D->getCategoryNameLoc(),
4060 D->getIvarLBraceLoc(), D->getIvarRBraceLoc()))
4061 std::tie(
4062 ToAtStartLoc, ToCategoryNameLoc,
4063 ToIvarLBraceLoc, ToIvarRBraceLoc) = *Imp;
4064 else
4065 return Imp.takeError();
Gabor Marton26f72a92018-07-12 09:42:05 +00004066
4067 if (GetImportedOrCreateDecl(ToCategory, D, Importer.getToContext(), DC,
Balazs Keri3b30d652018-10-19 13:32:20 +00004068 ToAtStartLoc, Loc,
4069 ToCategoryNameLoc,
Gabor Marton26f72a92018-07-12 09:42:05 +00004070 Name.getAsIdentifierInfo(), ToInterface,
4071 /*TypeParamList=*/nullptr,
Balazs Keri3b30d652018-10-19 13:32:20 +00004072 ToIvarLBraceLoc,
4073 ToIvarRBraceLoc))
Gabor Marton26f72a92018-07-12 09:42:05 +00004074 return ToCategory;
4075
Douglas Gregor84c51c32010-02-18 01:47:50 +00004076 ToCategory->setLexicalDeclContext(LexicalDC);
Sean Callanan95e74be2011-10-21 02:57:43 +00004077 LexicalDC->addDeclInternal(ToCategory);
Balazs Keri3b30d652018-10-19 13:32:20 +00004078 // Import the type parameter list after MapImported, to avoid
Douglas Gregorab7f0b32015-07-07 06:20:12 +00004079 // loops when bringing in their DeclContext.
Balazs Keri3b30d652018-10-19 13:32:20 +00004080 if (auto PListOrErr = ImportObjCTypeParamList(D->getTypeParamList()))
4081 ToCategory->setTypeParamList(*PListOrErr);
4082 else
4083 return PListOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00004084
Douglas Gregor84c51c32010-02-18 01:47:50 +00004085 // Import protocols
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004086 SmallVector<ObjCProtocolDecl *, 4> Protocols;
4087 SmallVector<SourceLocation, 4> ProtocolLocs;
Douglas Gregor84c51c32010-02-18 01:47:50 +00004088 ObjCCategoryDecl::protocol_loc_iterator FromProtoLoc
4089 = D->protocol_loc_begin();
4090 for (ObjCCategoryDecl::protocol_iterator FromProto = D->protocol_begin(),
4091 FromProtoEnd = D->protocol_end();
4092 FromProto != FromProtoEnd;
4093 ++FromProto, ++FromProtoLoc) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004094 if (Expected<ObjCProtocolDecl *> ToProtoOrErr = import(*FromProto))
4095 Protocols.push_back(*ToProtoOrErr);
4096 else
4097 return ToProtoOrErr.takeError();
4098
4099 if (ExpectedSLoc ToProtoLocOrErr = import(*FromProtoLoc))
4100 ProtocolLocs.push_back(*ToProtoLocOrErr);
4101 else
4102 return ToProtoLocOrErr.takeError();
Douglas Gregor84c51c32010-02-18 01:47:50 +00004103 }
Fangrui Song6907ce22018-07-30 19:24:48 +00004104
Douglas Gregor84c51c32010-02-18 01:47:50 +00004105 // FIXME: If we're merging, make sure that the protocol list is the same.
4106 ToCategory->setProtocolList(Protocols.data(), Protocols.size(),
4107 ProtocolLocs.data(), Importer.getToContext());
Balazs Keri3b30d652018-10-19 13:32:20 +00004108
Douglas Gregor84c51c32010-02-18 01:47:50 +00004109 } else {
Gabor Marton26f72a92018-07-12 09:42:05 +00004110 Importer.MapImported(D, ToCategory);
Douglas Gregor84c51c32010-02-18 01:47:50 +00004111 }
Fangrui Song6907ce22018-07-30 19:24:48 +00004112
Douglas Gregor84c51c32010-02-18 01:47:50 +00004113 // Import all of the members of this category.
Balazs Keri3b30d652018-10-19 13:32:20 +00004114 if (Error Err = ImportDeclContext(D))
4115 return std::move(Err);
Fangrui Song6907ce22018-07-30 19:24:48 +00004116
Douglas Gregor84c51c32010-02-18 01:47:50 +00004117 // If we have an implementation, import it as well.
4118 if (D->getImplementation()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004119 if (Expected<ObjCCategoryImplDecl *> ToImplOrErr =
4120 import(D->getImplementation()))
4121 ToCategory->setImplementation(*ToImplOrErr);
4122 else
4123 return ToImplOrErr.takeError();
Douglas Gregor84c51c32010-02-18 01:47:50 +00004124 }
Fangrui Song6907ce22018-07-30 19:24:48 +00004125
Douglas Gregor84c51c32010-02-18 01:47:50 +00004126 return ToCategory;
4127}
4128
Balazs Keri3b30d652018-10-19 13:32:20 +00004129Error ASTNodeImporter::ImportDefinition(
4130 ObjCProtocolDecl *From, ObjCProtocolDecl *To, ImportDefinitionKind Kind) {
Douglas Gregor2aa53772012-01-24 17:42:07 +00004131 if (To->getDefinition()) {
Douglas Gregor2e15c842012-02-01 21:00:38 +00004132 if (shouldForceImportDeclContext(Kind))
Balazs Keri3b30d652018-10-19 13:32:20 +00004133 if (Error Err = ImportDeclContext(From))
4134 return Err;
4135 return Error::success();
Douglas Gregor2aa53772012-01-24 17:42:07 +00004136 }
4137
4138 // Start the protocol definition
4139 To->startDefinition();
Fangrui Song6907ce22018-07-30 19:24:48 +00004140
Douglas Gregor2aa53772012-01-24 17:42:07 +00004141 // Import protocols
4142 SmallVector<ObjCProtocolDecl *, 4> Protocols;
4143 SmallVector<SourceLocation, 4> ProtocolLocs;
Balazs Keri3b30d652018-10-19 13:32:20 +00004144 ObjCProtocolDecl::protocol_loc_iterator FromProtoLoc =
4145 From->protocol_loc_begin();
Douglas Gregor2aa53772012-01-24 17:42:07 +00004146 for (ObjCProtocolDecl::protocol_iterator FromProto = From->protocol_begin(),
4147 FromProtoEnd = From->protocol_end();
4148 FromProto != FromProtoEnd;
4149 ++FromProto, ++FromProtoLoc) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004150 if (Expected<ObjCProtocolDecl *> ToProtoOrErr = import(*FromProto))
4151 Protocols.push_back(*ToProtoOrErr);
4152 else
4153 return ToProtoOrErr.takeError();
4154
4155 if (ExpectedSLoc ToProtoLocOrErr = import(*FromProtoLoc))
4156 ProtocolLocs.push_back(*ToProtoLocOrErr);
4157 else
4158 return ToProtoLocOrErr.takeError();
4159
Douglas Gregor2aa53772012-01-24 17:42:07 +00004160 }
Fangrui Song6907ce22018-07-30 19:24:48 +00004161
Douglas Gregor2aa53772012-01-24 17:42:07 +00004162 // FIXME: If we're merging, make sure that the protocol list is the same.
4163 To->setProtocolList(Protocols.data(), Protocols.size(),
4164 ProtocolLocs.data(), Importer.getToContext());
4165
Douglas Gregor2e15c842012-02-01 21:00:38 +00004166 if (shouldForceImportDeclContext(Kind)) {
4167 // Import all of the members of this protocol.
Balazs Keri3b30d652018-10-19 13:32:20 +00004168 if (Error Err = ImportDeclContext(From, /*ForceImport=*/true))
4169 return Err;
Douglas Gregor2e15c842012-02-01 21:00:38 +00004170 }
Balazs Keri3b30d652018-10-19 13:32:20 +00004171 return Error::success();
Douglas Gregor2aa53772012-01-24 17:42:07 +00004172}
4173
Balazs Keri3b30d652018-10-19 13:32:20 +00004174ExpectedDecl ASTNodeImporter::VisitObjCProtocolDecl(ObjCProtocolDecl *D) {
Fangrui Song6907ce22018-07-30 19:24:48 +00004175 // If this protocol has a definition in the translation unit we're coming
Douglas Gregor2aa53772012-01-24 17:42:07 +00004176 // from, but this particular declaration is not that definition, import the
4177 // definition and map to that.
4178 ObjCProtocolDecl *Definition = D->getDefinition();
4179 if (Definition && Definition != D) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004180 if (ExpectedDecl ImportedDefOrErr = import(Definition))
4181 return Importer.MapImported(D, *ImportedDefOrErr);
4182 else
4183 return ImportedDefOrErr.takeError();
Douglas Gregor2aa53772012-01-24 17:42:07 +00004184 }
4185
Douglas Gregor84c51c32010-02-18 01:47:50 +00004186 // Import the major distinguishing characteristics of a protocol.
Douglas Gregor98d156a2010-02-17 16:12:00 +00004187 DeclContext *DC, *LexicalDC;
4188 DeclarationName Name;
4189 SourceLocation Loc;
Sean Callanan59721b32015-04-28 18:41:46 +00004190 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00004191 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
4192 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00004193 if (ToD)
4194 return ToD;
Douglas Gregor98d156a2010-02-17 16:12:00 +00004195
Craig Topper36250ad2014-05-12 05:36:57 +00004196 ObjCProtocolDecl *MergeWithProtocol = nullptr;
Gabor Marton54058b52018-12-17 13:53:12 +00004197 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00004198 for (auto *FoundDecl : FoundDecls) {
4199 if (!FoundDecl->isInIdentifierNamespace(Decl::IDNS_ObjCProtocol))
Douglas Gregor98d156a2010-02-17 16:12:00 +00004200 continue;
Fangrui Song6907ce22018-07-30 19:24:48 +00004201
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00004202 if ((MergeWithProtocol = dyn_cast<ObjCProtocolDecl>(FoundDecl)))
Douglas Gregor98d156a2010-02-17 16:12:00 +00004203 break;
4204 }
Fangrui Song6907ce22018-07-30 19:24:48 +00004205
Douglas Gregor98d156a2010-02-17 16:12:00 +00004206 ObjCProtocolDecl *ToProto = MergeWithProtocol;
Douglas Gregor2aa53772012-01-24 17:42:07 +00004207 if (!ToProto) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004208 auto ToAtBeginLocOrErr = import(D->getAtStartLoc());
4209 if (!ToAtBeginLocOrErr)
4210 return ToAtBeginLocOrErr.takeError();
4211
Gabor Marton26f72a92018-07-12 09:42:05 +00004212 if (GetImportedOrCreateDecl(ToProto, D, Importer.getToContext(), DC,
4213 Name.getAsIdentifierInfo(), Loc,
Balazs Keri3b30d652018-10-19 13:32:20 +00004214 *ToAtBeginLocOrErr,
Gabor Marton26f72a92018-07-12 09:42:05 +00004215 /*PrevDecl=*/nullptr))
4216 return ToProto;
Douglas Gregor2aa53772012-01-24 17:42:07 +00004217 ToProto->setLexicalDeclContext(LexicalDC);
4218 LexicalDC->addDeclInternal(ToProto);
Douglas Gregor98d156a2010-02-17 16:12:00 +00004219 }
Gabor Marton26f72a92018-07-12 09:42:05 +00004220
4221 Importer.MapImported(D, ToProto);
Douglas Gregor98d156a2010-02-17 16:12:00 +00004222
Balazs Keri3b30d652018-10-19 13:32:20 +00004223 if (D->isThisDeclarationADefinition())
4224 if (Error Err = ImportDefinition(D, ToProto))
4225 return std::move(Err);
Craig Topper36250ad2014-05-12 05:36:57 +00004226
Douglas Gregor98d156a2010-02-17 16:12:00 +00004227 return ToProto;
4228}
4229
Balazs Keri3b30d652018-10-19 13:32:20 +00004230ExpectedDecl ASTNodeImporter::VisitLinkageSpecDecl(LinkageSpecDecl *D) {
4231 DeclContext *DC, *LexicalDC;
4232 if (Error Err = ImportDeclContext(D, DC, LexicalDC))
4233 return std::move(Err);
Sean Callanan0aae0412014-12-10 00:00:37 +00004234
Balazs Keri3b30d652018-10-19 13:32:20 +00004235 ExpectedSLoc ExternLocOrErr = import(D->getExternLoc());
4236 if (!ExternLocOrErr)
4237 return ExternLocOrErr.takeError();
4238
4239 ExpectedSLoc LangLocOrErr = import(D->getLocation());
4240 if (!LangLocOrErr)
4241 return LangLocOrErr.takeError();
Sean Callanan0aae0412014-12-10 00:00:37 +00004242
4243 bool HasBraces = D->hasBraces();
Gabor Marton26f72a92018-07-12 09:42:05 +00004244
4245 LinkageSpecDecl *ToLinkageSpec;
4246 if (GetImportedOrCreateDecl(ToLinkageSpec, D, Importer.getToContext(), DC,
Balazs Keri3b30d652018-10-19 13:32:20 +00004247 *ExternLocOrErr, *LangLocOrErr,
4248 D->getLanguage(), HasBraces))
Gabor Marton26f72a92018-07-12 09:42:05 +00004249 return ToLinkageSpec;
Sean Callanan0aae0412014-12-10 00:00:37 +00004250
4251 if (HasBraces) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004252 ExpectedSLoc RBraceLocOrErr = import(D->getRBraceLoc());
4253 if (!RBraceLocOrErr)
4254 return RBraceLocOrErr.takeError();
4255 ToLinkageSpec->setRBraceLoc(*RBraceLocOrErr);
Sean Callanan0aae0412014-12-10 00:00:37 +00004256 }
4257
4258 ToLinkageSpec->setLexicalDeclContext(LexicalDC);
4259 LexicalDC->addDeclInternal(ToLinkageSpec);
4260
Sean Callanan0aae0412014-12-10 00:00:37 +00004261 return ToLinkageSpec;
4262}
4263
Balazs Keri3b30d652018-10-19 13:32:20 +00004264ExpectedDecl ASTNodeImporter::VisitUsingDecl(UsingDecl *D) {
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004265 DeclContext *DC, *LexicalDC;
4266 DeclarationName Name;
4267 SourceLocation Loc;
4268 NamedDecl *ToD = nullptr;
Balazs Keri3b30d652018-10-19 13:32:20 +00004269 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
4270 return std::move(Err);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004271 if (ToD)
4272 return ToD;
4273
Balazs Keri3b30d652018-10-19 13:32:20 +00004274 SourceLocation ToLoc, ToUsingLoc;
4275 NestedNameSpecifierLoc ToQualifierLoc;
4276 if (auto Imp = importSeq(
4277 D->getNameInfo().getLoc(), D->getUsingLoc(), D->getQualifierLoc()))
4278 std::tie(ToLoc, ToUsingLoc, ToQualifierLoc) = *Imp;
4279 else
4280 return Imp.takeError();
4281
4282 DeclarationNameInfo NameInfo(Name, ToLoc);
4283 if (Error Err = ImportDeclarationNameLoc(D->getNameInfo(), NameInfo))
4284 return std::move(Err);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004285
Gabor Marton26f72a92018-07-12 09:42:05 +00004286 UsingDecl *ToUsing;
4287 if (GetImportedOrCreateDecl(ToUsing, D, Importer.getToContext(), DC,
Balazs Keri3b30d652018-10-19 13:32:20 +00004288 ToUsingLoc, ToQualifierLoc, NameInfo,
Gabor Marton26f72a92018-07-12 09:42:05 +00004289 D->hasTypename()))
4290 return ToUsing;
4291
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004292 ToUsing->setLexicalDeclContext(LexicalDC);
4293 LexicalDC->addDeclInternal(ToUsing);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004294
4295 if (NamedDecl *FromPattern =
4296 Importer.getFromContext().getInstantiatedFromUsingDecl(D)) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004297 if (Expected<NamedDecl *> ToPatternOrErr = import(FromPattern))
4298 Importer.getToContext().setInstantiatedFromUsingDecl(
4299 ToUsing, *ToPatternOrErr);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004300 else
Balazs Keri3b30d652018-10-19 13:32:20 +00004301 return ToPatternOrErr.takeError();
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004302 }
4303
Balazs Keri3b30d652018-10-19 13:32:20 +00004304 for (UsingShadowDecl *FromShadow : D->shadows()) {
4305 if (Expected<UsingShadowDecl *> ToShadowOrErr = import(FromShadow))
4306 ToUsing->addShadowDecl(*ToShadowOrErr);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004307 else
Balazs Keri3b30d652018-10-19 13:32:20 +00004308 // FIXME: We return error here but the definition is already created
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004309 // and available with lookups. How to fix this?..
Balazs Keri3b30d652018-10-19 13:32:20 +00004310 return ToShadowOrErr.takeError();
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004311 }
4312 return ToUsing;
4313}
4314
Balazs Keri3b30d652018-10-19 13:32:20 +00004315ExpectedDecl ASTNodeImporter::VisitUsingShadowDecl(UsingShadowDecl *D) {
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004316 DeclContext *DC, *LexicalDC;
4317 DeclarationName Name;
4318 SourceLocation Loc;
4319 NamedDecl *ToD = nullptr;
Balazs Keri3b30d652018-10-19 13:32:20 +00004320 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
4321 return std::move(Err);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004322 if (ToD)
4323 return ToD;
4324
Balazs Keri3b30d652018-10-19 13:32:20 +00004325 Expected<UsingDecl *> ToUsingOrErr = import(D->getUsingDecl());
4326 if (!ToUsingOrErr)
4327 return ToUsingOrErr.takeError();
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004328
Balazs Keri3b30d652018-10-19 13:32:20 +00004329 Expected<NamedDecl *> ToTargetOrErr = import(D->getTargetDecl());
4330 if (!ToTargetOrErr)
4331 return ToTargetOrErr.takeError();
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004332
Gabor Marton26f72a92018-07-12 09:42:05 +00004333 UsingShadowDecl *ToShadow;
4334 if (GetImportedOrCreateDecl(ToShadow, D, Importer.getToContext(), DC, Loc,
Balazs Keri3b30d652018-10-19 13:32:20 +00004335 *ToUsingOrErr, *ToTargetOrErr))
Gabor Marton26f72a92018-07-12 09:42:05 +00004336 return ToShadow;
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004337
4338 ToShadow->setLexicalDeclContext(LexicalDC);
4339 ToShadow->setAccess(D->getAccess());
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004340
4341 if (UsingShadowDecl *FromPattern =
4342 Importer.getFromContext().getInstantiatedFromUsingShadowDecl(D)) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004343 if (Expected<UsingShadowDecl *> ToPatternOrErr = import(FromPattern))
4344 Importer.getToContext().setInstantiatedFromUsingShadowDecl(
4345 ToShadow, *ToPatternOrErr);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004346 else
Balazs Keri3b30d652018-10-19 13:32:20 +00004347 // FIXME: We return error here but the definition is already created
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004348 // and available with lookups. How to fix this?..
Balazs Keri3b30d652018-10-19 13:32:20 +00004349 return ToPatternOrErr.takeError();
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004350 }
4351
4352 LexicalDC->addDeclInternal(ToShadow);
4353
4354 return ToShadow;
4355}
4356
Balazs Keri3b30d652018-10-19 13:32:20 +00004357ExpectedDecl ASTNodeImporter::VisitUsingDirectiveDecl(UsingDirectiveDecl *D) {
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004358 DeclContext *DC, *LexicalDC;
4359 DeclarationName Name;
4360 SourceLocation Loc;
4361 NamedDecl *ToD = nullptr;
Balazs Keri3b30d652018-10-19 13:32:20 +00004362 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
4363 return std::move(Err);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004364 if (ToD)
4365 return ToD;
4366
Balazs Keri3b30d652018-10-19 13:32:20 +00004367 auto ToComAncestorOrErr = Importer.ImportContext(D->getCommonAncestor());
4368 if (!ToComAncestorOrErr)
4369 return ToComAncestorOrErr.takeError();
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004370
Balazs Keri3b30d652018-10-19 13:32:20 +00004371 NamespaceDecl *ToNominatedNamespace;
4372 SourceLocation ToUsingLoc, ToNamespaceKeyLocation, ToIdentLocation;
4373 NestedNameSpecifierLoc ToQualifierLoc;
4374 if (auto Imp = importSeq(
4375 D->getNominatedNamespace(), D->getUsingLoc(),
4376 D->getNamespaceKeyLocation(), D->getQualifierLoc(),
4377 D->getIdentLocation()))
4378 std::tie(
4379 ToNominatedNamespace, ToUsingLoc, ToNamespaceKeyLocation,
4380 ToQualifierLoc, ToIdentLocation) = *Imp;
4381 else
4382 return Imp.takeError();
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004383
Gabor Marton26f72a92018-07-12 09:42:05 +00004384 UsingDirectiveDecl *ToUsingDir;
4385 if (GetImportedOrCreateDecl(ToUsingDir, D, Importer.getToContext(), DC,
Balazs Keri3b30d652018-10-19 13:32:20 +00004386 ToUsingLoc,
4387 ToNamespaceKeyLocation,
4388 ToQualifierLoc,
4389 ToIdentLocation,
4390 ToNominatedNamespace, *ToComAncestorOrErr))
Gabor Marton26f72a92018-07-12 09:42:05 +00004391 return ToUsingDir;
4392
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004393 ToUsingDir->setLexicalDeclContext(LexicalDC);
4394 LexicalDC->addDeclInternal(ToUsingDir);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004395
4396 return ToUsingDir;
4397}
4398
Balazs Keri3b30d652018-10-19 13:32:20 +00004399ExpectedDecl ASTNodeImporter::VisitUnresolvedUsingValueDecl(
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004400 UnresolvedUsingValueDecl *D) {
4401 DeclContext *DC, *LexicalDC;
4402 DeclarationName Name;
4403 SourceLocation Loc;
4404 NamedDecl *ToD = nullptr;
Balazs Keri3b30d652018-10-19 13:32:20 +00004405 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
4406 return std::move(Err);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004407 if (ToD)
4408 return ToD;
4409
Balazs Keri3b30d652018-10-19 13:32:20 +00004410 SourceLocation ToLoc, ToUsingLoc, ToEllipsisLoc;
4411 NestedNameSpecifierLoc ToQualifierLoc;
4412 if (auto Imp = importSeq(
4413 D->getNameInfo().getLoc(), D->getUsingLoc(), D->getQualifierLoc(),
4414 D->getEllipsisLoc()))
4415 std::tie(ToLoc, ToUsingLoc, ToQualifierLoc, ToEllipsisLoc) = *Imp;
4416 else
4417 return Imp.takeError();
4418
4419 DeclarationNameInfo NameInfo(Name, ToLoc);
4420 if (Error Err = ImportDeclarationNameLoc(D->getNameInfo(), NameInfo))
4421 return std::move(Err);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004422
Gabor Marton26f72a92018-07-12 09:42:05 +00004423 UnresolvedUsingValueDecl *ToUsingValue;
4424 if (GetImportedOrCreateDecl(ToUsingValue, D, Importer.getToContext(), DC,
Balazs Keri3b30d652018-10-19 13:32:20 +00004425 ToUsingLoc, ToQualifierLoc, NameInfo,
4426 ToEllipsisLoc))
Gabor Marton26f72a92018-07-12 09:42:05 +00004427 return ToUsingValue;
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004428
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004429 ToUsingValue->setAccess(D->getAccess());
4430 ToUsingValue->setLexicalDeclContext(LexicalDC);
4431 LexicalDC->addDeclInternal(ToUsingValue);
4432
4433 return ToUsingValue;
4434}
4435
Balazs Keri3b30d652018-10-19 13:32:20 +00004436ExpectedDecl ASTNodeImporter::VisitUnresolvedUsingTypenameDecl(
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004437 UnresolvedUsingTypenameDecl *D) {
4438 DeclContext *DC, *LexicalDC;
4439 DeclarationName Name;
4440 SourceLocation Loc;
4441 NamedDecl *ToD = nullptr;
Balazs Keri3b30d652018-10-19 13:32:20 +00004442 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
4443 return std::move(Err);
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004444 if (ToD)
4445 return ToD;
4446
Balazs Keri3b30d652018-10-19 13:32:20 +00004447 SourceLocation ToUsingLoc, ToTypenameLoc, ToEllipsisLoc;
4448 NestedNameSpecifierLoc ToQualifierLoc;
4449 if (auto Imp = importSeq(
4450 D->getUsingLoc(), D->getTypenameLoc(), D->getQualifierLoc(),
4451 D->getEllipsisLoc()))
4452 std::tie(ToUsingLoc, ToTypenameLoc, ToQualifierLoc, ToEllipsisLoc) = *Imp;
4453 else
4454 return Imp.takeError();
4455
Gabor Marton26f72a92018-07-12 09:42:05 +00004456 UnresolvedUsingTypenameDecl *ToUsing;
4457 if (GetImportedOrCreateDecl(ToUsing, D, Importer.getToContext(), DC,
Balazs Keri3b30d652018-10-19 13:32:20 +00004458 ToUsingLoc, ToTypenameLoc,
4459 ToQualifierLoc, Loc, Name, ToEllipsisLoc))
Gabor Marton26f72a92018-07-12 09:42:05 +00004460 return ToUsing;
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004461
Aleksei Sidorin2697f8e2017-11-21 16:08:41 +00004462 ToUsing->setAccess(D->getAccess());
4463 ToUsing->setLexicalDeclContext(LexicalDC);
4464 LexicalDC->addDeclInternal(ToUsing);
4465
4466 return ToUsing;
4467}
4468
Raphael Isemannba7bde62019-10-30 14:50:35 +01004469ExpectedDecl ASTNodeImporter::VisitBuiltinTemplateDecl(BuiltinTemplateDecl *D) {
4470 Decl* ToD = nullptr;
4471 switch (D->getBuiltinTemplateKind()) {
4472 case BuiltinTemplateKind::BTK__make_integer_seq:
4473 ToD = Importer.getToContext().getMakeIntegerSeqDecl();
4474 break;
4475 case BuiltinTemplateKind::BTK__type_pack_element:
4476 ToD = Importer.getToContext().getTypePackElementDecl();
4477 break;
4478 }
4479 assert(ToD && "BuiltinTemplateDecl of unsupported kind!");
4480 Importer.MapImported(D, ToD);
4481 return ToD;
4482}
Balazs Keri3b30d652018-10-19 13:32:20 +00004483
4484Error ASTNodeImporter::ImportDefinition(
4485 ObjCInterfaceDecl *From, ObjCInterfaceDecl *To, ImportDefinitionKind Kind) {
Douglas Gregor2aa53772012-01-24 17:42:07 +00004486 if (To->getDefinition()) {
4487 // Check consistency of superclass.
4488 ObjCInterfaceDecl *FromSuper = From->getSuperClass();
4489 if (FromSuper) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004490 if (auto FromSuperOrErr = import(FromSuper))
4491 FromSuper = *FromSuperOrErr;
4492 else
4493 return FromSuperOrErr.takeError();
Douglas Gregor2aa53772012-01-24 17:42:07 +00004494 }
Fangrui Song6907ce22018-07-30 19:24:48 +00004495
4496 ObjCInterfaceDecl *ToSuper = To->getSuperClass();
Douglas Gregor2aa53772012-01-24 17:42:07 +00004497 if ((bool)FromSuper != (bool)ToSuper ||
4498 (FromSuper && !declaresSameEntity(FromSuper, ToSuper))) {
Fangrui Song6907ce22018-07-30 19:24:48 +00004499 Importer.ToDiag(To->getLocation(),
Gabor Marton410f32c2019-04-01 15:29:55 +00004500 diag::warn_odr_objc_superclass_inconsistent)
Douglas Gregor2aa53772012-01-24 17:42:07 +00004501 << To->getDeclName();
4502 if (ToSuper)
4503 Importer.ToDiag(To->getSuperClassLoc(), diag::note_odr_objc_superclass)
4504 << To->getSuperClass()->getDeclName();
4505 else
Fangrui Song6907ce22018-07-30 19:24:48 +00004506 Importer.ToDiag(To->getLocation(),
Douglas Gregor2aa53772012-01-24 17:42:07 +00004507 diag::note_odr_objc_missing_superclass);
4508 if (From->getSuperClass())
Fangrui Song6907ce22018-07-30 19:24:48 +00004509 Importer.FromDiag(From->getSuperClassLoc(),
Douglas Gregor2aa53772012-01-24 17:42:07 +00004510 diag::note_odr_objc_superclass)
4511 << From->getSuperClass()->getDeclName();
4512 else
Fangrui Song6907ce22018-07-30 19:24:48 +00004513 Importer.FromDiag(From->getLocation(),
4514 diag::note_odr_objc_missing_superclass);
Douglas Gregor2aa53772012-01-24 17:42:07 +00004515 }
Fangrui Song6907ce22018-07-30 19:24:48 +00004516
Douglas Gregor2e15c842012-02-01 21:00:38 +00004517 if (shouldForceImportDeclContext(Kind))
Balazs Keri3b30d652018-10-19 13:32:20 +00004518 if (Error Err = ImportDeclContext(From))
4519 return Err;
4520 return Error::success();
Douglas Gregor2aa53772012-01-24 17:42:07 +00004521 }
Fangrui Song6907ce22018-07-30 19:24:48 +00004522
Douglas Gregor2aa53772012-01-24 17:42:07 +00004523 // Start the definition.
4524 To->startDefinition();
Fangrui Song6907ce22018-07-30 19:24:48 +00004525
Douglas Gregor2aa53772012-01-24 17:42:07 +00004526 // If this class has a superclass, import it.
4527 if (From->getSuperClass()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004528 if (auto SuperTInfoOrErr = import(From->getSuperClassTInfo()))
4529 To->setSuperClass(*SuperTInfoOrErr);
4530 else
4531 return SuperTInfoOrErr.takeError();
Douglas Gregor2aa53772012-01-24 17:42:07 +00004532 }
Fangrui Song6907ce22018-07-30 19:24:48 +00004533
Douglas Gregor2aa53772012-01-24 17:42:07 +00004534 // Import protocols
4535 SmallVector<ObjCProtocolDecl *, 4> Protocols;
4536 SmallVector<SourceLocation, 4> ProtocolLocs;
Balazs Keri3b30d652018-10-19 13:32:20 +00004537 ObjCInterfaceDecl::protocol_loc_iterator FromProtoLoc =
4538 From->protocol_loc_begin();
Fangrui Song6907ce22018-07-30 19:24:48 +00004539
Douglas Gregor2aa53772012-01-24 17:42:07 +00004540 for (ObjCInterfaceDecl::protocol_iterator FromProto = From->protocol_begin(),
4541 FromProtoEnd = From->protocol_end();
4542 FromProto != FromProtoEnd;
4543 ++FromProto, ++FromProtoLoc) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004544 if (Expected<ObjCProtocolDecl *> ToProtoOrErr = import(*FromProto))
4545 Protocols.push_back(*ToProtoOrErr);
4546 else
4547 return ToProtoOrErr.takeError();
4548
4549 if (ExpectedSLoc ToProtoLocOrErr = import(*FromProtoLoc))
4550 ProtocolLocs.push_back(*ToProtoLocOrErr);
4551 else
4552 return ToProtoLocOrErr.takeError();
4553
Douglas Gregor2aa53772012-01-24 17:42:07 +00004554 }
Fangrui Song6907ce22018-07-30 19:24:48 +00004555
Douglas Gregor2aa53772012-01-24 17:42:07 +00004556 // FIXME: If we're merging, make sure that the protocol list is the same.
4557 To->setProtocolList(Protocols.data(), Protocols.size(),
4558 ProtocolLocs.data(), Importer.getToContext());
Fangrui Song6907ce22018-07-30 19:24:48 +00004559
Douglas Gregor2aa53772012-01-24 17:42:07 +00004560 // Import categories. When the categories themselves are imported, they'll
4561 // hook themselves into this interface.
Balazs Keri3b30d652018-10-19 13:32:20 +00004562 for (auto *Cat : From->known_categories()) {
4563 auto ToCatOrErr = import(Cat);
4564 if (!ToCatOrErr)
4565 return ToCatOrErr.takeError();
4566 }
Fangrui Song6907ce22018-07-30 19:24:48 +00004567
Douglas Gregor2aa53772012-01-24 17:42:07 +00004568 // If we have an @implementation, import it as well.
4569 if (From->getImplementation()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004570 if (Expected<ObjCImplementationDecl *> ToImplOrErr =
4571 import(From->getImplementation()))
4572 To->setImplementation(*ToImplOrErr);
4573 else
4574 return ToImplOrErr.takeError();
Douglas Gregor2aa53772012-01-24 17:42:07 +00004575 }
4576
Douglas Gregor2e15c842012-02-01 21:00:38 +00004577 if (shouldForceImportDeclContext(Kind)) {
4578 // Import all of the members of this class.
Balazs Keri3b30d652018-10-19 13:32:20 +00004579 if (Error Err = ImportDeclContext(From, /*ForceImport=*/true))
4580 return Err;
Douglas Gregor2e15c842012-02-01 21:00:38 +00004581 }
Balazs Keri3b30d652018-10-19 13:32:20 +00004582 return Error::success();
Douglas Gregor2aa53772012-01-24 17:42:07 +00004583}
4584
Balazs Keri3b30d652018-10-19 13:32:20 +00004585Expected<ObjCTypeParamList *>
Douglas Gregor85f3f952015-07-07 03:57:15 +00004586ASTNodeImporter::ImportObjCTypeParamList(ObjCTypeParamList *list) {
4587 if (!list)
4588 return nullptr;
4589
4590 SmallVector<ObjCTypeParamDecl *, 4> toTypeParams;
Balazs Keri3b30d652018-10-19 13:32:20 +00004591 for (auto *fromTypeParam : *list) {
4592 if (auto toTypeParamOrErr = import(fromTypeParam))
4593 toTypeParams.push_back(*toTypeParamOrErr);
4594 else
4595 return toTypeParamOrErr.takeError();
Douglas Gregor85f3f952015-07-07 03:57:15 +00004596 }
4597
Balazs Keri3b30d652018-10-19 13:32:20 +00004598 auto LAngleLocOrErr = import(list->getLAngleLoc());
4599 if (!LAngleLocOrErr)
4600 return LAngleLocOrErr.takeError();
4601
4602 auto RAngleLocOrErr = import(list->getRAngleLoc());
4603 if (!RAngleLocOrErr)
4604 return RAngleLocOrErr.takeError();
4605
Douglas Gregor85f3f952015-07-07 03:57:15 +00004606 return ObjCTypeParamList::create(Importer.getToContext(),
Balazs Keri3b30d652018-10-19 13:32:20 +00004607 *LAngleLocOrErr,
Douglas Gregor85f3f952015-07-07 03:57:15 +00004608 toTypeParams,
Balazs Keri3b30d652018-10-19 13:32:20 +00004609 *RAngleLocOrErr);
Douglas Gregor85f3f952015-07-07 03:57:15 +00004610}
4611
Balazs Keri3b30d652018-10-19 13:32:20 +00004612ExpectedDecl ASTNodeImporter::VisitObjCInterfaceDecl(ObjCInterfaceDecl *D) {
Douglas Gregor2aa53772012-01-24 17:42:07 +00004613 // If this class has a definition in the translation unit we're coming from,
4614 // but this particular declaration is not that definition, import the
4615 // definition and map to that.
4616 ObjCInterfaceDecl *Definition = D->getDefinition();
4617 if (Definition && Definition != D) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004618 if (ExpectedDecl ImportedDefOrErr = import(Definition))
4619 return Importer.MapImported(D, *ImportedDefOrErr);
4620 else
4621 return ImportedDefOrErr.takeError();
Douglas Gregor2aa53772012-01-24 17:42:07 +00004622 }
4623
Douglas Gregor45635322010-02-16 01:20:57 +00004624 // Import the major distinguishing characteristics of an @interface.
4625 DeclContext *DC, *LexicalDC;
4626 DeclarationName Name;
4627 SourceLocation Loc;
Sean Callanan59721b32015-04-28 18:41:46 +00004628 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00004629 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
4630 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00004631 if (ToD)
4632 return ToD;
Douglas Gregor45635322010-02-16 01:20:57 +00004633
Douglas Gregor2aa53772012-01-24 17:42:07 +00004634 // Look for an existing interface with the same name.
Craig Topper36250ad2014-05-12 05:36:57 +00004635 ObjCInterfaceDecl *MergeWithIface = nullptr;
Gabor Marton54058b52018-12-17 13:53:12 +00004636 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00004637 for (auto *FoundDecl : FoundDecls) {
4638 if (!FoundDecl->isInIdentifierNamespace(Decl::IDNS_Ordinary))
Douglas Gregor45635322010-02-16 01:20:57 +00004639 continue;
Fangrui Song6907ce22018-07-30 19:24:48 +00004640
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00004641 if ((MergeWithIface = dyn_cast<ObjCInterfaceDecl>(FoundDecl)))
Douglas Gregor45635322010-02-16 01:20:57 +00004642 break;
4643 }
Fangrui Song6907ce22018-07-30 19:24:48 +00004644
Douglas Gregor2aa53772012-01-24 17:42:07 +00004645 // Create an interface declaration, if one does not already exist.
Douglas Gregor45635322010-02-16 01:20:57 +00004646 ObjCInterfaceDecl *ToIface = MergeWithIface;
Douglas Gregor2aa53772012-01-24 17:42:07 +00004647 if (!ToIface) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004648 ExpectedSLoc AtBeginLocOrErr = import(D->getAtStartLoc());
4649 if (!AtBeginLocOrErr)
4650 return AtBeginLocOrErr.takeError();
4651
Gabor Marton26f72a92018-07-12 09:42:05 +00004652 if (GetImportedOrCreateDecl(
4653 ToIface, D, Importer.getToContext(), DC,
Balazs Keri3b30d652018-10-19 13:32:20 +00004654 *AtBeginLocOrErr, Name.getAsIdentifierInfo(),
Gabor Marton26f72a92018-07-12 09:42:05 +00004655 /*TypeParamList=*/nullptr,
4656 /*PrevDecl=*/nullptr, Loc, D->isImplicitInterfaceDecl()))
4657 return ToIface;
Douglas Gregor2aa53772012-01-24 17:42:07 +00004658 ToIface->setLexicalDeclContext(LexicalDC);
4659 LexicalDC->addDeclInternal(ToIface);
Douglas Gregor45635322010-02-16 01:20:57 +00004660 }
Gabor Marton26f72a92018-07-12 09:42:05 +00004661 Importer.MapImported(D, ToIface);
Balazs Keri3b30d652018-10-19 13:32:20 +00004662 // Import the type parameter list after MapImported, to avoid
Douglas Gregorab7f0b32015-07-07 06:20:12 +00004663 // loops when bringing in their DeclContext.
Balazs Keri3b30d652018-10-19 13:32:20 +00004664 if (auto ToPListOrErr =
4665 ImportObjCTypeParamList(D->getTypeParamListAsWritten()))
4666 ToIface->setTypeParamList(*ToPListOrErr);
4667 else
4668 return ToPListOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00004669
Balazs Keri3b30d652018-10-19 13:32:20 +00004670 if (D->isThisDeclarationADefinition())
4671 if (Error Err = ImportDefinition(D, ToIface))
4672 return std::move(Err);
Craig Topper36250ad2014-05-12 05:36:57 +00004673
Douglas Gregor98d156a2010-02-17 16:12:00 +00004674 return ToIface;
Douglas Gregor45635322010-02-16 01:20:57 +00004675}
4676
Balazs Keri3b30d652018-10-19 13:32:20 +00004677ExpectedDecl
4678ASTNodeImporter::VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D) {
4679 ObjCCategoryDecl *Category;
4680 if (Error Err = importInto(Category, D->getCategoryDecl()))
4681 return std::move(Err);
Craig Topper36250ad2014-05-12 05:36:57 +00004682
Douglas Gregor4da9d682010-12-07 15:32:12 +00004683 ObjCCategoryImplDecl *ToImpl = Category->getImplementation();
4684 if (!ToImpl) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004685 DeclContext *DC, *LexicalDC;
4686 if (Error Err = ImportDeclContext(D, DC, LexicalDC))
4687 return std::move(Err);
Craig Topper36250ad2014-05-12 05:36:57 +00004688
Balazs Keri3b30d652018-10-19 13:32:20 +00004689 SourceLocation ToLocation, ToAtStartLoc, ToCategoryNameLoc;
4690 if (auto Imp = importSeq(
4691 D->getLocation(), D->getAtStartLoc(), D->getCategoryNameLoc()))
4692 std::tie(ToLocation, ToAtStartLoc, ToCategoryNameLoc) = *Imp;
4693 else
4694 return Imp.takeError();
4695
Gabor Marton26f72a92018-07-12 09:42:05 +00004696 if (GetImportedOrCreateDecl(
4697 ToImpl, D, Importer.getToContext(), DC,
4698 Importer.Import(D->getIdentifier()), Category->getClassInterface(),
Balazs Keri3b30d652018-10-19 13:32:20 +00004699 ToLocation, ToAtStartLoc, ToCategoryNameLoc))
Gabor Marton26f72a92018-07-12 09:42:05 +00004700 return ToImpl;
4701
Balazs Keri3b30d652018-10-19 13:32:20 +00004702 ToImpl->setLexicalDeclContext(LexicalDC);
Sean Callanan95e74be2011-10-21 02:57:43 +00004703 LexicalDC->addDeclInternal(ToImpl);
Douglas Gregor4da9d682010-12-07 15:32:12 +00004704 Category->setImplementation(ToImpl);
4705 }
Fangrui Song6907ce22018-07-30 19:24:48 +00004706
Gabor Marton26f72a92018-07-12 09:42:05 +00004707 Importer.MapImported(D, ToImpl);
Balazs Keri3b30d652018-10-19 13:32:20 +00004708 if (Error Err = ImportDeclContext(D))
4709 return std::move(Err);
4710
Douglas Gregor4da9d682010-12-07 15:32:12 +00004711 return ToImpl;
4712}
4713
Balazs Keri3b30d652018-10-19 13:32:20 +00004714ExpectedDecl
4715ASTNodeImporter::VisitObjCImplementationDecl(ObjCImplementationDecl *D) {
Douglas Gregorda8025c2010-12-07 01:26:03 +00004716 // Find the corresponding interface.
Balazs Keri3b30d652018-10-19 13:32:20 +00004717 ObjCInterfaceDecl *Iface;
4718 if (Error Err = importInto(Iface, D->getClassInterface()))
4719 return std::move(Err);
Douglas Gregorda8025c2010-12-07 01:26:03 +00004720
4721 // Import the superclass, if any.
Balazs Keri3b30d652018-10-19 13:32:20 +00004722 ObjCInterfaceDecl *Super;
4723 if (Error Err = importInto(Super, D->getSuperClass()))
4724 return std::move(Err);
Douglas Gregorda8025c2010-12-07 01:26:03 +00004725
4726 ObjCImplementationDecl *Impl = Iface->getImplementation();
4727 if (!Impl) {
4728 // We haven't imported an implementation yet. Create a new @implementation
4729 // now.
Balazs Keri3b30d652018-10-19 13:32:20 +00004730 DeclContext *DC, *LexicalDC;
4731 if (Error Err = ImportDeclContext(D, DC, LexicalDC))
4732 return std::move(Err);
4733
4734 SourceLocation ToLocation, ToAtStartLoc, ToSuperClassLoc;
4735 SourceLocation ToIvarLBraceLoc, ToIvarRBraceLoc;
4736 if (auto Imp = importSeq(
4737 D->getLocation(), D->getAtStartLoc(), D->getSuperClassLoc(),
4738 D->getIvarLBraceLoc(), D->getIvarRBraceLoc()))
4739 std::tie(
4740 ToLocation, ToAtStartLoc, ToSuperClassLoc,
4741 ToIvarLBraceLoc, ToIvarRBraceLoc) = *Imp;
4742 else
4743 return Imp.takeError();
4744
Gabor Marton26f72a92018-07-12 09:42:05 +00004745 if (GetImportedOrCreateDecl(Impl, D, Importer.getToContext(),
Balazs Keri3b30d652018-10-19 13:32:20 +00004746 DC, Iface, Super,
4747 ToLocation,
4748 ToAtStartLoc,
4749 ToSuperClassLoc,
4750 ToIvarLBraceLoc,
4751 ToIvarRBraceLoc))
Gabor Marton26f72a92018-07-12 09:42:05 +00004752 return Impl;
4753
Balazs Keri3b30d652018-10-19 13:32:20 +00004754 Impl->setLexicalDeclContext(LexicalDC);
Gabor Marton26f72a92018-07-12 09:42:05 +00004755
Douglas Gregorda8025c2010-12-07 01:26:03 +00004756 // Associate the implementation with the class it implements.
4757 Iface->setImplementation(Impl);
Gabor Marton26f72a92018-07-12 09:42:05 +00004758 Importer.MapImported(D, Iface->getImplementation());
Douglas Gregorda8025c2010-12-07 01:26:03 +00004759 } else {
Gabor Marton26f72a92018-07-12 09:42:05 +00004760 Importer.MapImported(D, Iface->getImplementation());
Douglas Gregorda8025c2010-12-07 01:26:03 +00004761
4762 // Verify that the existing @implementation has the same superclass.
4763 if ((Super && !Impl->getSuperClass()) ||
4764 (!Super && Impl->getSuperClass()) ||
Craig Topperdcfc60f2014-05-07 06:57:44 +00004765 (Super && Impl->getSuperClass() &&
4766 !declaresSameEntity(Super->getCanonicalDecl(),
4767 Impl->getSuperClass()))) {
4768 Importer.ToDiag(Impl->getLocation(),
Gabor Marton410f32c2019-04-01 15:29:55 +00004769 diag::warn_odr_objc_superclass_inconsistent)
Craig Topperdcfc60f2014-05-07 06:57:44 +00004770 << Iface->getDeclName();
4771 // FIXME: It would be nice to have the location of the superclass
4772 // below.
4773 if (Impl->getSuperClass())
4774 Importer.ToDiag(Impl->getLocation(),
4775 diag::note_odr_objc_superclass)
4776 << Impl->getSuperClass()->getDeclName();
4777 else
4778 Importer.ToDiag(Impl->getLocation(),
4779 diag::note_odr_objc_missing_superclass);
4780 if (D->getSuperClass())
4781 Importer.FromDiag(D->getLocation(),
Douglas Gregorda8025c2010-12-07 01:26:03 +00004782 diag::note_odr_objc_superclass)
Craig Topperdcfc60f2014-05-07 06:57:44 +00004783 << D->getSuperClass()->getDeclName();
4784 else
4785 Importer.FromDiag(D->getLocation(),
Douglas Gregorda8025c2010-12-07 01:26:03 +00004786 diag::note_odr_objc_missing_superclass);
Balazs Keri3b30d652018-10-19 13:32:20 +00004787
4788 return make_error<ImportError>(ImportError::NameConflict);
Douglas Gregorda8025c2010-12-07 01:26:03 +00004789 }
4790 }
Fangrui Song6907ce22018-07-30 19:24:48 +00004791
Douglas Gregorda8025c2010-12-07 01:26:03 +00004792 // Import all of the members of this @implementation.
Balazs Keri3b30d652018-10-19 13:32:20 +00004793 if (Error Err = ImportDeclContext(D))
4794 return std::move(Err);
Douglas Gregorda8025c2010-12-07 01:26:03 +00004795
4796 return Impl;
4797}
4798
Balazs Keri3b30d652018-10-19 13:32:20 +00004799ExpectedDecl ASTNodeImporter::VisitObjCPropertyDecl(ObjCPropertyDecl *D) {
Douglas Gregora11c4582010-02-17 18:02:10 +00004800 // Import the major distinguishing characteristics of an @property.
4801 DeclContext *DC, *LexicalDC;
4802 DeclarationName Name;
4803 SourceLocation Loc;
Sean Callanan59721b32015-04-28 18:41:46 +00004804 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00004805 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
4806 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00004807 if (ToD)
4808 return ToD;
Douglas Gregora11c4582010-02-17 18:02:10 +00004809
4810 // Check whether we have already imported this property.
Gabor Marton54058b52018-12-17 13:53:12 +00004811 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00004812 for (auto *FoundDecl : FoundDecls) {
4813 if (auto *FoundProp = dyn_cast<ObjCPropertyDecl>(FoundDecl)) {
Douglas Gregora11c4582010-02-17 18:02:10 +00004814 // Check property types.
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00004815 if (!Importer.IsStructurallyEquivalent(D->getType(),
Douglas Gregora11c4582010-02-17 18:02:10 +00004816 FoundProp->getType())) {
Gabor Marton410f32c2019-04-01 15:29:55 +00004817 Importer.ToDiag(Loc, diag::warn_odr_objc_property_type_inconsistent)
Douglas Gregora11c4582010-02-17 18:02:10 +00004818 << Name << D->getType() << FoundProp->getType();
4819 Importer.ToDiag(FoundProp->getLocation(), diag::note_odr_value_here)
4820 << FoundProp->getType();
Balazs Keri3b30d652018-10-19 13:32:20 +00004821
4822 return make_error<ImportError>(ImportError::NameConflict);
Douglas Gregora11c4582010-02-17 18:02:10 +00004823 }
4824
4825 // FIXME: Check property attributes, getters, setters, etc.?
4826
4827 // Consider these properties to be equivalent.
Gabor Marton26f72a92018-07-12 09:42:05 +00004828 Importer.MapImported(D, FoundProp);
Douglas Gregora11c4582010-02-17 18:02:10 +00004829 return FoundProp;
4830 }
4831 }
4832
Balazs Keri3b30d652018-10-19 13:32:20 +00004833 QualType ToType;
4834 TypeSourceInfo *ToTypeSourceInfo;
4835 SourceLocation ToAtLoc, ToLParenLoc;
4836 if (auto Imp = importSeq(
4837 D->getType(), D->getTypeSourceInfo(), D->getAtLoc(), D->getLParenLoc()))
4838 std::tie(ToType, ToTypeSourceInfo, ToAtLoc, ToLParenLoc) = *Imp;
4839 else
4840 return Imp.takeError();
Douglas Gregora11c4582010-02-17 18:02:10 +00004841
4842 // Create the new property.
Gabor Marton26f72a92018-07-12 09:42:05 +00004843 ObjCPropertyDecl *ToProperty;
4844 if (GetImportedOrCreateDecl(
4845 ToProperty, D, Importer.getToContext(), DC, Loc,
Balazs Keri3b30d652018-10-19 13:32:20 +00004846 Name.getAsIdentifierInfo(), ToAtLoc,
4847 ToLParenLoc, ToType,
4848 ToTypeSourceInfo, D->getPropertyImplementation()))
Gabor Marton26f72a92018-07-12 09:42:05 +00004849 return ToProperty;
4850
Balazs Keri3b30d652018-10-19 13:32:20 +00004851 Selector ToGetterName, ToSetterName;
4852 SourceLocation ToGetterNameLoc, ToSetterNameLoc;
4853 ObjCMethodDecl *ToGetterMethodDecl, *ToSetterMethodDecl;
4854 ObjCIvarDecl *ToPropertyIvarDecl;
4855 if (auto Imp = importSeq(
4856 D->getGetterName(), D->getSetterName(),
4857 D->getGetterNameLoc(), D->getSetterNameLoc(),
4858 D->getGetterMethodDecl(), D->getSetterMethodDecl(),
4859 D->getPropertyIvarDecl()))
4860 std::tie(
4861 ToGetterName, ToSetterName,
4862 ToGetterNameLoc, ToSetterNameLoc,
4863 ToGetterMethodDecl, ToSetterMethodDecl,
4864 ToPropertyIvarDecl) = *Imp;
4865 else
4866 return Imp.takeError();
4867
Douglas Gregora11c4582010-02-17 18:02:10 +00004868 ToProperty->setLexicalDeclContext(LexicalDC);
Sean Callanan95e74be2011-10-21 02:57:43 +00004869 LexicalDC->addDeclInternal(ToProperty);
Douglas Gregora11c4582010-02-17 18:02:10 +00004870
4871 ToProperty->setPropertyAttributes(D->getPropertyAttributes());
Fariborz Jahanian3bf0ded2010-06-22 23:20:40 +00004872 ToProperty->setPropertyAttributesAsWritten(
4873 D->getPropertyAttributesAsWritten());
Balazs Keri3b30d652018-10-19 13:32:20 +00004874 ToProperty->setGetterName(ToGetterName, ToGetterNameLoc);
4875 ToProperty->setSetterName(ToSetterName, ToSetterNameLoc);
4876 ToProperty->setGetterMethodDecl(ToGetterMethodDecl);
4877 ToProperty->setSetterMethodDecl(ToSetterMethodDecl);
4878 ToProperty->setPropertyIvarDecl(ToPropertyIvarDecl);
Douglas Gregora11c4582010-02-17 18:02:10 +00004879 return ToProperty;
4880}
4881
Balazs Keri3b30d652018-10-19 13:32:20 +00004882ExpectedDecl
4883ASTNodeImporter::VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D) {
4884 ObjCPropertyDecl *Property;
4885 if (Error Err = importInto(Property, D->getPropertyDecl()))
4886 return std::move(Err);
Douglas Gregor14a49e22010-12-07 18:32:03 +00004887
Balazs Keri3b30d652018-10-19 13:32:20 +00004888 DeclContext *DC, *LexicalDC;
4889 if (Error Err = ImportDeclContext(D, DC, LexicalDC))
4890 return std::move(Err);
Craig Topper36250ad2014-05-12 05:36:57 +00004891
Balazs Keri3b30d652018-10-19 13:32:20 +00004892 auto *InImpl = cast<ObjCImplDecl>(LexicalDC);
Douglas Gregor14a49e22010-12-07 18:32:03 +00004893
4894 // Import the ivar (for an @synthesize).
Craig Topper36250ad2014-05-12 05:36:57 +00004895 ObjCIvarDecl *Ivar = nullptr;
Balazs Keri3b30d652018-10-19 13:32:20 +00004896 if (Error Err = importInto(Ivar, D->getPropertyIvarDecl()))
4897 return std::move(Err);
Douglas Gregor14a49e22010-12-07 18:32:03 +00004898
4899 ObjCPropertyImplDecl *ToImpl
Manman Ren5b786402016-01-28 18:49:28 +00004900 = InImpl->FindPropertyImplDecl(Property->getIdentifier(),
4901 Property->getQueryKind());
Gabor Marton26f72a92018-07-12 09:42:05 +00004902 if (!ToImpl) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004903 SourceLocation ToBeginLoc, ToLocation, ToPropertyIvarDeclLoc;
4904 if (auto Imp = importSeq(
4905 D->getBeginLoc(), D->getLocation(), D->getPropertyIvarDeclLoc()))
4906 std::tie(ToBeginLoc, ToLocation, ToPropertyIvarDeclLoc) = *Imp;
4907 else
4908 return Imp.takeError();
4909
Gabor Marton26f72a92018-07-12 09:42:05 +00004910 if (GetImportedOrCreateDecl(ToImpl, D, Importer.getToContext(), DC,
Balazs Keri3b30d652018-10-19 13:32:20 +00004911 ToBeginLoc,
4912 ToLocation, Property,
Gabor Marton26f72a92018-07-12 09:42:05 +00004913 D->getPropertyImplementation(), Ivar,
Balazs Keri3b30d652018-10-19 13:32:20 +00004914 ToPropertyIvarDeclLoc))
Gabor Marton26f72a92018-07-12 09:42:05 +00004915 return ToImpl;
4916
Douglas Gregor14a49e22010-12-07 18:32:03 +00004917 ToImpl->setLexicalDeclContext(LexicalDC);
Sean Callanan95e74be2011-10-21 02:57:43 +00004918 LexicalDC->addDeclInternal(ToImpl);
Douglas Gregor14a49e22010-12-07 18:32:03 +00004919 } else {
4920 // Check that we have the same kind of property implementation (@synthesize
4921 // vs. @dynamic).
4922 if (D->getPropertyImplementation() != ToImpl->getPropertyImplementation()) {
Fangrui Song6907ce22018-07-30 19:24:48 +00004923 Importer.ToDiag(ToImpl->getLocation(),
Gabor Marton410f32c2019-04-01 15:29:55 +00004924 diag::warn_odr_objc_property_impl_kind_inconsistent)
Fangrui Song6907ce22018-07-30 19:24:48 +00004925 << Property->getDeclName()
4926 << (ToImpl->getPropertyImplementation()
Douglas Gregor14a49e22010-12-07 18:32:03 +00004927 == ObjCPropertyImplDecl::Dynamic);
4928 Importer.FromDiag(D->getLocation(),
4929 diag::note_odr_objc_property_impl_kind)
4930 << D->getPropertyDecl()->getDeclName()
4931 << (D->getPropertyImplementation() == ObjCPropertyImplDecl::Dynamic);
Balazs Keri3b30d652018-10-19 13:32:20 +00004932
4933 return make_error<ImportError>(ImportError::NameConflict);
Douglas Gregor14a49e22010-12-07 18:32:03 +00004934 }
Fangrui Song6907ce22018-07-30 19:24:48 +00004935
4936 // For @synthesize, check that we have the same
Douglas Gregor14a49e22010-12-07 18:32:03 +00004937 if (D->getPropertyImplementation() == ObjCPropertyImplDecl::Synthesize &&
4938 Ivar != ToImpl->getPropertyIvarDecl()) {
Fangrui Song6907ce22018-07-30 19:24:48 +00004939 Importer.ToDiag(ToImpl->getPropertyIvarDeclLoc(),
Gabor Marton410f32c2019-04-01 15:29:55 +00004940 diag::warn_odr_objc_synthesize_ivar_inconsistent)
Douglas Gregor14a49e22010-12-07 18:32:03 +00004941 << Property->getDeclName()
4942 << ToImpl->getPropertyIvarDecl()->getDeclName()
4943 << Ivar->getDeclName();
Fangrui Song6907ce22018-07-30 19:24:48 +00004944 Importer.FromDiag(D->getPropertyIvarDeclLoc(),
Douglas Gregor14a49e22010-12-07 18:32:03 +00004945 diag::note_odr_objc_synthesize_ivar_here)
4946 << D->getPropertyIvarDecl()->getDeclName();
Balazs Keri3b30d652018-10-19 13:32:20 +00004947
4948 return make_error<ImportError>(ImportError::NameConflict);
Douglas Gregor14a49e22010-12-07 18:32:03 +00004949 }
Fangrui Song6907ce22018-07-30 19:24:48 +00004950
Douglas Gregor14a49e22010-12-07 18:32:03 +00004951 // Merge the existing implementation with the new implementation.
Gabor Marton26f72a92018-07-12 09:42:05 +00004952 Importer.MapImported(D, ToImpl);
Douglas Gregor14a49e22010-12-07 18:32:03 +00004953 }
Fangrui Song6907ce22018-07-30 19:24:48 +00004954
Douglas Gregor14a49e22010-12-07 18:32:03 +00004955 return ToImpl;
4956}
4957
Balazs Keri3b30d652018-10-19 13:32:20 +00004958ExpectedDecl
4959ASTNodeImporter::VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D) {
Douglas Gregora082a492010-11-30 19:14:50 +00004960 // For template arguments, we adopt the translation unit as our declaration
4961 // context. This context will be fixed when the actual template declaration
4962 // is created.
Fangrui Song6907ce22018-07-30 19:24:48 +00004963
Douglas Gregora082a492010-11-30 19:14:50 +00004964 // FIXME: Import default argument.
Balazs Keri3b30d652018-10-19 13:32:20 +00004965
4966 ExpectedSLoc BeginLocOrErr = import(D->getBeginLoc());
4967 if (!BeginLocOrErr)
4968 return BeginLocOrErr.takeError();
4969
4970 ExpectedSLoc LocationOrErr = import(D->getLocation());
4971 if (!LocationOrErr)
4972 return LocationOrErr.takeError();
4973
Gabor Marton26f72a92018-07-12 09:42:05 +00004974 TemplateTypeParmDecl *ToD = nullptr;
4975 (void)GetImportedOrCreateDecl(
4976 ToD, D, Importer.getToContext(),
4977 Importer.getToContext().getTranslationUnitDecl(),
Balazs Keri3b30d652018-10-19 13:32:20 +00004978 *BeginLocOrErr, *LocationOrErr,
Gabor Marton26f72a92018-07-12 09:42:05 +00004979 D->getDepth(), D->getIndex(), Importer.Import(D->getIdentifier()),
4980 D->wasDeclaredWithTypename(), D->isParameterPack());
4981 return ToD;
Douglas Gregora082a492010-11-30 19:14:50 +00004982}
4983
Balazs Keri3b30d652018-10-19 13:32:20 +00004984ExpectedDecl
Douglas Gregora082a492010-11-30 19:14:50 +00004985ASTNodeImporter::VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D) {
Balazs Keri3b30d652018-10-19 13:32:20 +00004986 DeclarationName ToDeclName;
4987 SourceLocation ToLocation, ToInnerLocStart;
4988 QualType ToType;
4989 TypeSourceInfo *ToTypeSourceInfo;
4990 if (auto Imp = importSeq(
4991 D->getDeclName(), D->getLocation(), D->getType(), D->getTypeSourceInfo(),
4992 D->getInnerLocStart()))
4993 std::tie(
4994 ToDeclName, ToLocation, ToType, ToTypeSourceInfo,
4995 ToInnerLocStart) = *Imp;
4996 else
4997 return Imp.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00004998
Douglas Gregora082a492010-11-30 19:14:50 +00004999 // FIXME: Import default argument.
Gabor Marton26f72a92018-07-12 09:42:05 +00005000
5001 NonTypeTemplateParmDecl *ToD = nullptr;
5002 (void)GetImportedOrCreateDecl(
5003 ToD, D, Importer.getToContext(),
5004 Importer.getToContext().getTranslationUnitDecl(),
Balazs Keri3b30d652018-10-19 13:32:20 +00005005 ToInnerLocStart, ToLocation, D->getDepth(),
5006 D->getPosition(), ToDeclName.getAsIdentifierInfo(), ToType,
5007 D->isParameterPack(), ToTypeSourceInfo);
Gabor Marton26f72a92018-07-12 09:42:05 +00005008 return ToD;
Douglas Gregora082a492010-11-30 19:14:50 +00005009}
5010
Balazs Keri3b30d652018-10-19 13:32:20 +00005011ExpectedDecl
Douglas Gregora082a492010-11-30 19:14:50 +00005012ASTNodeImporter::VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D) {
5013 // Import the name of this declaration.
Balazs Keri3b30d652018-10-19 13:32:20 +00005014 auto NameOrErr = import(D->getDeclName());
5015 if (!NameOrErr)
5016 return NameOrErr.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00005017
Douglas Gregora082a492010-11-30 19:14:50 +00005018 // Import the location of this declaration.
Balazs Keri3b30d652018-10-19 13:32:20 +00005019 ExpectedSLoc LocationOrErr = import(D->getLocation());
5020 if (!LocationOrErr)
5021 return LocationOrErr.takeError();
Gabor Marton26f72a92018-07-12 09:42:05 +00005022
Douglas Gregora082a492010-11-30 19:14:50 +00005023 // Import template parameters.
Balazs Keridec09162019-03-20 15:42:42 +00005024 auto TemplateParamsOrErr = import(D->getTemplateParameters());
Balazs Keri3b30d652018-10-19 13:32:20 +00005025 if (!TemplateParamsOrErr)
5026 return TemplateParamsOrErr.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00005027
Douglas Gregora082a492010-11-30 19:14:50 +00005028 // FIXME: Import default argument.
Gabor Marton26f72a92018-07-12 09:42:05 +00005029
5030 TemplateTemplateParmDecl *ToD = nullptr;
5031 (void)GetImportedOrCreateDecl(
5032 ToD, D, Importer.getToContext(),
Balazs Keri3b30d652018-10-19 13:32:20 +00005033 Importer.getToContext().getTranslationUnitDecl(), *LocationOrErr,
5034 D->getDepth(), D->getPosition(), D->isParameterPack(),
5035 (*NameOrErr).getAsIdentifierInfo(),
5036 *TemplateParamsOrErr);
Gabor Marton26f72a92018-07-12 09:42:05 +00005037 return ToD;
Douglas Gregora082a492010-11-30 19:14:50 +00005038}
5039
Gabor Marton16d98c22019-03-07 13:01:51 +00005040// Returns the definition for a (forward) declaration of a TemplateDecl, if
Gabor Marton9581c332018-05-23 13:53:36 +00005041// it has any definition in the redecl chain.
Gabor Marton16d98c22019-03-07 13:01:51 +00005042template <typename T> static auto getTemplateDefinition(T *D) -> T * {
5043 assert(D->getTemplatedDecl() && "Should be called on templates only");
5044 auto *ToTemplatedDef = D->getTemplatedDecl()->getDefinition();
Gabor Marton9581c332018-05-23 13:53:36 +00005045 if (!ToTemplatedDef)
5046 return nullptr;
Gabor Marton16d98c22019-03-07 13:01:51 +00005047 auto *TemplateWithDef = ToTemplatedDef->getDescribedTemplate();
5048 return cast_or_null<T>(TemplateWithDef);
Gabor Marton9581c332018-05-23 13:53:36 +00005049}
5050
Balazs Keri3b30d652018-10-19 13:32:20 +00005051ExpectedDecl ASTNodeImporter::VisitClassTemplateDecl(ClassTemplateDecl *D) {
Balazs Keri0c23dc52018-08-13 13:08:37 +00005052 bool IsFriend = D->getFriendObjectKind() != Decl::FOK_None;
5053
Douglas Gregora082a492010-11-30 19:14:50 +00005054 // Import the major distinguishing characteristics of this class template.
5055 DeclContext *DC, *LexicalDC;
5056 DeclarationName Name;
5057 SourceLocation Loc;
Sean Callanan59721b32015-04-28 18:41:46 +00005058 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00005059 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
5060 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00005061 if (ToD)
5062 return ToD;
Craig Topper36250ad2014-05-12 05:36:57 +00005063
Gabor Marton7df342a2018-12-17 12:42:12 +00005064 ClassTemplateDecl *FoundByLookup = nullptr;
5065
Douglas Gregora082a492010-11-30 19:14:50 +00005066 // We may already have a template of the same name; try to find and match it.
5067 if (!DC->isFunctionOrMethod()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005068 SmallVector<NamedDecl *, 4> ConflictingDecls;
Gabor Marton54058b52018-12-17 13:53:12 +00005069 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00005070 for (auto *FoundDecl : FoundDecls) {
Gabor Marton7df342a2018-12-17 12:42:12 +00005071 if (!FoundDecl->isInIdentifierNamespace(Decl::IDNS_Ordinary |
5072 Decl::IDNS_TagFriend))
Douglas Gregora082a492010-11-30 19:14:50 +00005073 continue;
Gabor Marton9581c332018-05-23 13:53:36 +00005074
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00005075 Decl *Found = FoundDecl;
Gabor Marton7df342a2018-12-17 12:42:12 +00005076 auto *FoundTemplate = dyn_cast<ClassTemplateDecl>(Found);
5077 if (FoundTemplate) {
Balázs Kéric2f6efc2019-11-15 15:05:20 +01005078 if (!hasSameVisibilityContext(FoundTemplate, D))
5079 continue;
Gabor Marton9581c332018-05-23 13:53:36 +00005080
Douglas Gregora082a492010-11-30 19:14:50 +00005081 if (IsStructuralMatch(D, FoundTemplate)) {
Gabor Marton16d98c22019-03-07 13:01:51 +00005082 ClassTemplateDecl *TemplateWithDef =
5083 getTemplateDefinition(FoundTemplate);
Balazs Keri2e160602019-08-12 10:07:38 +00005084 if (D->isThisDeclarationADefinition() && TemplateWithDef)
Gabor Marton7df342a2018-12-17 12:42:12 +00005085 return Importer.MapImported(D, TemplateWithDef);
Balazs Keri2e160602019-08-12 10:07:38 +00005086 if (!FoundByLookup)
5087 FoundByLookup = FoundTemplate;
5088 // Search in all matches because there may be multiple decl chains,
5089 // see ASTTests test ImportExistingFriendClassTemplateDef.
5090 continue;
Gabor Marton9581c332018-05-23 13:53:36 +00005091 }
Gabor Martonf035b752019-08-27 11:36:10 +00005092 ConflictingDecls.push_back(FoundDecl);
Douglas Gregora082a492010-11-30 19:14:50 +00005093 }
Douglas Gregora082a492010-11-30 19:14:50 +00005094 }
Gabor Marton9581c332018-05-23 13:53:36 +00005095
Douglas Gregora082a492010-11-30 19:14:50 +00005096 if (!ConflictingDecls.empty()) {
Gabor Martonf035b752019-08-27 11:36:10 +00005097 ExpectedName NameOrErr = Importer.HandleNameConflict(
5098 Name, DC, Decl::IDNS_Ordinary, ConflictingDecls.data(),
5099 ConflictingDecls.size());
5100 if (NameOrErr)
5101 Name = NameOrErr.get();
5102 else
5103 return NameOrErr.takeError();
Douglas Gregora082a492010-11-30 19:14:50 +00005104 }
Douglas Gregora082a492010-11-30 19:14:50 +00005105 }
5106
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00005107 CXXRecordDecl *FromTemplated = D->getTemplatedDecl();
5108
Douglas Gregora082a492010-11-30 19:14:50 +00005109 // Create the declaration that is being templated.
Balazs Keri3b30d652018-10-19 13:32:20 +00005110 CXXRecordDecl *ToTemplated;
5111 if (Error Err = importInto(ToTemplated, FromTemplated))
5112 return std::move(Err);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00005113
Douglas Gregora082a492010-11-30 19:14:50 +00005114 // Create the class template declaration itself.
Balazs Keridec09162019-03-20 15:42:42 +00005115 auto TemplateParamsOrErr = import(D->getTemplateParameters());
Balazs Keri3b30d652018-10-19 13:32:20 +00005116 if (!TemplateParamsOrErr)
5117 return TemplateParamsOrErr.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00005118
Gabor Marton26f72a92018-07-12 09:42:05 +00005119 ClassTemplateDecl *D2;
5120 if (GetImportedOrCreateDecl(D2, D, Importer.getToContext(), DC, Loc, Name,
Balazs Keri3b30d652018-10-19 13:32:20 +00005121 *TemplateParamsOrErr, ToTemplated))
Gabor Marton26f72a92018-07-12 09:42:05 +00005122 return D2;
5123
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00005124 ToTemplated->setDescribedClassTemplate(D2);
Fangrui Song6907ce22018-07-30 19:24:48 +00005125
Douglas Gregora082a492010-11-30 19:14:50 +00005126 D2->setAccess(D->getAccess());
5127 D2->setLexicalDeclContext(LexicalDC);
Gabor Marton7df342a2018-12-17 12:42:12 +00005128
5129 if (D->getDeclContext()->containsDeclAndLoad(D))
5130 DC->addDeclInternal(D2);
5131 if (DC != LexicalDC && D->getLexicalDeclContext()->containsDeclAndLoad(D))
Balazs Keri0c23dc52018-08-13 13:08:37 +00005132 LexicalDC->addDeclInternal(D2);
Fangrui Song6907ce22018-07-30 19:24:48 +00005133
Gabor Marton7df342a2018-12-17 12:42:12 +00005134 if (FoundByLookup) {
5135 auto *Recent =
5136 const_cast<ClassTemplateDecl *>(FoundByLookup->getMostRecentDecl());
5137
5138 // It is possible that during the import of the class template definition
5139 // we start the import of a fwd friend decl of the very same class template
5140 // and we add the fwd friend decl to the lookup table. But the ToTemplated
5141 // had been created earlier and by that time the lookup could not find
5142 // anything existing, so it has no previous decl. Later, (still during the
5143 // import of the fwd friend decl) we start to import the definition again
5144 // and this time the lookup finds the previous fwd friend class template.
5145 // In this case we must set up the previous decl for the templated decl.
5146 if (!ToTemplated->getPreviousDecl()) {
Gabor Marton16d98c22019-03-07 13:01:51 +00005147 assert(FoundByLookup->getTemplatedDecl() &&
5148 "Found decl must have its templated decl set");
Gabor Marton7df342a2018-12-17 12:42:12 +00005149 CXXRecordDecl *PrevTemplated =
5150 FoundByLookup->getTemplatedDecl()->getMostRecentDecl();
5151 if (ToTemplated != PrevTemplated)
5152 ToTemplated->setPreviousDecl(PrevTemplated);
5153 }
5154
5155 D2->setPreviousDecl(Recent);
5156 }
5157
5158 if (LexicalDC != DC && IsFriend)
5159 DC->makeDeclVisibleInContext(D2);
5160
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00005161 if (FromTemplated->isCompleteDefinition() &&
5162 !ToTemplated->isCompleteDefinition()) {
Douglas Gregora082a492010-11-30 19:14:50 +00005163 // FIXME: Import definition!
5164 }
Fangrui Song6907ce22018-07-30 19:24:48 +00005165
Douglas Gregora082a492010-11-30 19:14:50 +00005166 return D2;
5167}
5168
Balazs Keri3b30d652018-10-19 13:32:20 +00005169ExpectedDecl ASTNodeImporter::VisitClassTemplateSpecializationDecl(
Douglas Gregore2e50d332010-12-01 01:36:18 +00005170 ClassTemplateSpecializationDecl *D) {
Balazs Keri3b30d652018-10-19 13:32:20 +00005171 ClassTemplateDecl *ClassTemplate;
5172 if (Error Err = importInto(ClassTemplate, D->getSpecializedTemplate()))
5173 return std::move(Err);
Craig Topper36250ad2014-05-12 05:36:57 +00005174
Douglas Gregore2e50d332010-12-01 01:36:18 +00005175 // Import the context of this declaration.
Balazs Keri3b30d652018-10-19 13:32:20 +00005176 DeclContext *DC, *LexicalDC;
5177 if (Error Err = ImportDeclContext(D, DC, LexicalDC))
5178 return std::move(Err);
Douglas Gregore2e50d332010-12-01 01:36:18 +00005179
5180 // Import template arguments.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005181 SmallVector<TemplateArgument, 2> TemplateArgs;
Balazs Keri3b30d652018-10-19 13:32:20 +00005182 if (Error Err = ImportTemplateArguments(
5183 D->getTemplateArgs().data(), D->getTemplateArgs().size(), TemplateArgs))
5184 return std::move(Err);
Craig Topper36250ad2014-05-12 05:36:57 +00005185
Douglas Gregore2e50d332010-12-01 01:36:18 +00005186 // Try to find an existing specialization with these template arguments.
Craig Topper36250ad2014-05-12 05:36:57 +00005187 void *InsertPos = nullptr;
Gabor Marton7f8c4002019-03-19 13:34:10 +00005188 ClassTemplateSpecializationDecl *PrevDecl = nullptr;
Gabor Marton42e15de2018-08-22 11:52:14 +00005189 ClassTemplatePartialSpecializationDecl *PartialSpec =
5190 dyn_cast<ClassTemplatePartialSpecializationDecl>(D);
5191 if (PartialSpec)
Gabor Marton7f8c4002019-03-19 13:34:10 +00005192 PrevDecl =
5193 ClassTemplate->findPartialSpecialization(TemplateArgs, InsertPos);
Gabor Marton42e15de2018-08-22 11:52:14 +00005194 else
Gabor Marton7f8c4002019-03-19 13:34:10 +00005195 PrevDecl = ClassTemplate->findSpecialization(TemplateArgs, InsertPos);
Gabor Marton42e15de2018-08-22 11:52:14 +00005196
Gabor Marton7f8c4002019-03-19 13:34:10 +00005197 if (PrevDecl) {
5198 if (IsStructuralMatch(D, PrevDecl)) {
5199 if (D->isThisDeclarationADefinition() && PrevDecl->getDefinition()) {
5200 Importer.MapImported(D, PrevDecl->getDefinition());
5201 // Import those default field initializers which have been
5202 // instantiated in the "From" context, but not in the "To" context.
Gabor Marton5ac6d492019-05-15 10:29:48 +00005203 for (auto *FromField : D->fields()) {
5204 auto ToOrErr = import(FromField);
5205 if (!ToOrErr)
5206 return ToOrErr.takeError();
5207 }
Gabor Marton42e15de2018-08-22 11:52:14 +00005208
Gabor Marton7f8c4002019-03-19 13:34:10 +00005209 // Import those methods which have been instantiated in the
5210 // "From" context, but not in the "To" context.
Gabor Marton5ac6d492019-05-15 10:29:48 +00005211 for (CXXMethodDecl *FromM : D->methods()) {
5212 auto ToOrErr = import(FromM);
5213 if (!ToOrErr)
5214 return ToOrErr.takeError();
5215 }
Gabor Marton42e15de2018-08-22 11:52:14 +00005216
Gabor Marton7f8c4002019-03-19 13:34:10 +00005217 // TODO Import instantiated default arguments.
5218 // TODO Import instantiated exception specifications.
5219 //
5220 // Generally, ASTCommon.h/DeclUpdateKind enum gives a very good hint
5221 // what else could be fused during an AST merge.
5222 return PrevDecl;
Balazs Keri3b30d652018-10-19 13:32:20 +00005223 }
Gabor Marton7f8c4002019-03-19 13:34:10 +00005224 } else { // ODR violation.
5225 // FIXME HandleNameConflict
Gabor Marton303c98612019-06-25 08:00:51 +00005226 return make_error<ImportError>(ImportError::NameConflict);
Gabor Marton42e15de2018-08-22 11:52:14 +00005227 }
Gabor Marton7f8c4002019-03-19 13:34:10 +00005228 }
Balazs Keri3b30d652018-10-19 13:32:20 +00005229
Gabor Marton7f8c4002019-03-19 13:34:10 +00005230 // Import the location of this declaration.
5231 ExpectedSLoc BeginLocOrErr = import(D->getBeginLoc());
5232 if (!BeginLocOrErr)
5233 return BeginLocOrErr.takeError();
5234 ExpectedSLoc IdLocOrErr = import(D->getLocation());
5235 if (!IdLocOrErr)
5236 return IdLocOrErr.takeError();
Balazs Keri3b30d652018-10-19 13:32:20 +00005237
Gabor Marton7f8c4002019-03-19 13:34:10 +00005238 // Create the specialization.
5239 ClassTemplateSpecializationDecl *D2 = nullptr;
5240 if (PartialSpec) {
5241 // Import TemplateArgumentListInfo.
5242 TemplateArgumentListInfo ToTAInfo;
5243 const auto &ASTTemplateArgs = *PartialSpec->getTemplateArgsAsWritten();
5244 if (Error Err = ImportTemplateArgumentListInfo(ASTTemplateArgs, ToTAInfo))
5245 return std::move(Err);
Aleksei Sidorin855086d2017-01-23 09:30:36 +00005246
Gabor Marton7f8c4002019-03-19 13:34:10 +00005247 QualType CanonInjType;
5248 if (Error Err = importInto(
5249 CanonInjType, PartialSpec->getInjectedSpecializationType()))
5250 return std::move(Err);
5251 CanonInjType = CanonInjType.getCanonicalType();
Aleksei Sidorin855086d2017-01-23 09:30:36 +00005252
Balazs Keridec09162019-03-20 15:42:42 +00005253 auto ToTPListOrErr = import(PartialSpec->getTemplateParameters());
Gabor Marton7f8c4002019-03-19 13:34:10 +00005254 if (!ToTPListOrErr)
5255 return ToTPListOrErr.takeError();
Aleksei Sidorin855086d2017-01-23 09:30:36 +00005256
Gabor Marton7f8c4002019-03-19 13:34:10 +00005257 if (GetImportedOrCreateDecl<ClassTemplatePartialSpecializationDecl>(
5258 D2, D, Importer.getToContext(), D->getTagKind(), DC,
5259 *BeginLocOrErr, *IdLocOrErr, *ToTPListOrErr, ClassTemplate,
5260 llvm::makeArrayRef(TemplateArgs.data(), TemplateArgs.size()),
5261 ToTAInfo, CanonInjType,
5262 cast_or_null<ClassTemplatePartialSpecializationDecl>(PrevDecl)))
5263 return D2;
Aleksei Sidorin855086d2017-01-23 09:30:36 +00005264
Gabor Marton7f8c4002019-03-19 13:34:10 +00005265 // Update InsertPos, because preceding import calls may have invalidated
5266 // it by adding new specializations.
5267 if (!ClassTemplate->findPartialSpecialization(TemplateArgs, InsertPos))
5268 // Add this partial specialization to the class template.
5269 ClassTemplate->AddPartialSpecialization(
5270 cast<ClassTemplatePartialSpecializationDecl>(D2), InsertPos);
Gabor Marton42e15de2018-08-22 11:52:14 +00005271
Gabor Marton7f8c4002019-03-19 13:34:10 +00005272 } else { // Not a partial specialization.
5273 if (GetImportedOrCreateDecl(
5274 D2, D, Importer.getToContext(), D->getTagKind(), DC,
5275 *BeginLocOrErr, *IdLocOrErr, ClassTemplate, TemplateArgs,
5276 PrevDecl))
5277 return D2;
Gabor Marton42e15de2018-08-22 11:52:14 +00005278
Gabor Marton7f8c4002019-03-19 13:34:10 +00005279 // Update InsertPos, because preceding import calls may have invalidated
5280 // it by adding new specializations.
5281 if (!ClassTemplate->findSpecialization(TemplateArgs, InsertPos))
5282 // Add this specialization to the class template.
5283 ClassTemplate->AddSpecialization(D2, InsertPos);
5284 }
Aleksei Sidorin855086d2017-01-23 09:30:36 +00005285
Gabor Marton7f8c4002019-03-19 13:34:10 +00005286 D2->setSpecializationKind(D->getSpecializationKind());
Douglas Gregore2e50d332010-12-01 01:36:18 +00005287
Gabor Marton7f8c4002019-03-19 13:34:10 +00005288 // Set the context of this specialization/instantiation.
5289 D2->setLexicalDeclContext(LexicalDC);
5290
5291 // Add to the DC only if it was an explicit specialization/instantiation.
5292 if (D2->isExplicitInstantiationOrSpecialization()) {
5293 LexicalDC->addDeclInternal(D2);
5294 }
5295
5296 // Import the qualifier, if any.
5297 if (auto LocOrErr = import(D->getQualifierLoc()))
5298 D2->setQualifierInfo(*LocOrErr);
5299 else
5300 return LocOrErr.takeError();
5301
5302 if (auto *TSI = D->getTypeAsWritten()) {
5303 if (auto TInfoOrErr = import(TSI))
5304 D2->setTypeAsWritten(*TInfoOrErr);
5305 else
5306 return TInfoOrErr.takeError();
5307
5308 if (auto LocOrErr = import(D->getTemplateKeywordLoc()))
5309 D2->setTemplateKeywordLoc(*LocOrErr);
Balazs Keri3b30d652018-10-19 13:32:20 +00005310 else
5311 return LocOrErr.takeError();
Aleksei Sidorin855086d2017-01-23 09:30:36 +00005312
Gabor Marton7f8c4002019-03-19 13:34:10 +00005313 if (auto LocOrErr = import(D->getExternLoc()))
5314 D2->setExternLoc(*LocOrErr);
5315 else
5316 return LocOrErr.takeError();
Douglas Gregore2e50d332010-12-01 01:36:18 +00005317 }
Gabor Marton7f8c4002019-03-19 13:34:10 +00005318
5319 if (D->getPointOfInstantiation().isValid()) {
5320 if (auto POIOrErr = import(D->getPointOfInstantiation()))
5321 D2->setPointOfInstantiation(*POIOrErr);
5322 else
5323 return POIOrErr.takeError();
5324 }
5325
5326 D2->setTemplateSpecializationKind(D->getTemplateSpecializationKind());
5327
Balazs Keri3b30d652018-10-19 13:32:20 +00005328 if (D->isCompleteDefinition())
5329 if (Error Err = ImportDefinition(D, D2))
5330 return std::move(Err);
Craig Topper36250ad2014-05-12 05:36:57 +00005331
Douglas Gregore2e50d332010-12-01 01:36:18 +00005332 return D2;
5333}
5334
Balazs Keri3b30d652018-10-19 13:32:20 +00005335ExpectedDecl ASTNodeImporter::VisitVarTemplateDecl(VarTemplateDecl *D) {
Larisse Voufo39a1e502013-08-06 01:03:05 +00005336 // If this variable has a definition in the translation unit we're coming
5337 // from,
5338 // but this particular declaration is not that definition, import the
5339 // definition and map to that.
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00005340 auto *Definition =
Larisse Voufo39a1e502013-08-06 01:03:05 +00005341 cast_or_null<VarDecl>(D->getTemplatedDecl()->getDefinition());
5342 if (Definition && Definition != D->getTemplatedDecl()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00005343 if (ExpectedDecl ImportedDefOrErr = import(
5344 Definition->getDescribedVarTemplate()))
5345 return Importer.MapImported(D, *ImportedDefOrErr);
5346 else
5347 return ImportedDefOrErr.takeError();
Larisse Voufo39a1e502013-08-06 01:03:05 +00005348 }
5349
5350 // Import the major distinguishing characteristics of this variable template.
5351 DeclContext *DC, *LexicalDC;
5352 DeclarationName Name;
5353 SourceLocation Loc;
Sean Callanan59721b32015-04-28 18:41:46 +00005354 NamedDecl *ToD;
Balazs Keri3b30d652018-10-19 13:32:20 +00005355 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
5356 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00005357 if (ToD)
5358 return ToD;
Larisse Voufo39a1e502013-08-06 01:03:05 +00005359
5360 // We may already have a template of the same name; try to find and match it.
5361 assert(!DC->isFunctionOrMethod() &&
5362 "Variable templates cannot be declared at function scope");
5363 SmallVector<NamedDecl *, 4> ConflictingDecls;
Gabor Marton54058b52018-12-17 13:53:12 +00005364 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00005365 for (auto *FoundDecl : FoundDecls) {
5366 if (!FoundDecl->isInIdentifierNamespace(Decl::IDNS_Ordinary))
Larisse Voufo39a1e502013-08-06 01:03:05 +00005367 continue;
5368
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00005369 Decl *Found = FoundDecl;
Balazs Keri3b30d652018-10-19 13:32:20 +00005370 if (VarTemplateDecl *FoundTemplate = dyn_cast<VarTemplateDecl>(Found)) {
Larisse Voufo39a1e502013-08-06 01:03:05 +00005371 if (IsStructuralMatch(D, FoundTemplate)) {
5372 // The variable templates structurally match; call it the same template.
Gabor Marton26f72a92018-07-12 09:42:05 +00005373 Importer.MapImported(D->getTemplatedDecl(),
5374 FoundTemplate->getTemplatedDecl());
5375 return Importer.MapImported(D, FoundTemplate);
Larisse Voufo39a1e502013-08-06 01:03:05 +00005376 }
Gabor Martonf035b752019-08-27 11:36:10 +00005377 ConflictingDecls.push_back(FoundDecl);
Larisse Voufo39a1e502013-08-06 01:03:05 +00005378 }
Larisse Voufo39a1e502013-08-06 01:03:05 +00005379 }
5380
5381 if (!ConflictingDecls.empty()) {
Gabor Martonf035b752019-08-27 11:36:10 +00005382 ExpectedName NameOrErr = Importer.HandleNameConflict(
5383 Name, DC, Decl::IDNS_Ordinary, ConflictingDecls.data(),
5384 ConflictingDecls.size());
5385 if (NameOrErr)
5386 Name = NameOrErr.get();
5387 else
5388 return NameOrErr.takeError();
Larisse Voufo39a1e502013-08-06 01:03:05 +00005389 }
5390
Larisse Voufo39a1e502013-08-06 01:03:05 +00005391 VarDecl *DTemplated = D->getTemplatedDecl();
5392
5393 // Import the type.
Balazs Keri3b30d652018-10-19 13:32:20 +00005394 // FIXME: Value not used?
5395 ExpectedType TypeOrErr = import(DTemplated->getType());
5396 if (!TypeOrErr)
5397 return TypeOrErr.takeError();
Larisse Voufo39a1e502013-08-06 01:03:05 +00005398
5399 // Create the declaration that is being templated.
Balazs Keri3b30d652018-10-19 13:32:20 +00005400 VarDecl *ToTemplated;
5401 if (Error Err = importInto(ToTemplated, DTemplated))
5402 return std::move(Err);
Larisse Voufo39a1e502013-08-06 01:03:05 +00005403
5404 // Create the variable template declaration itself.
Balazs Keridec09162019-03-20 15:42:42 +00005405 auto TemplateParamsOrErr = import(D->getTemplateParameters());
Balazs Keri3b30d652018-10-19 13:32:20 +00005406 if (!TemplateParamsOrErr)
5407 return TemplateParamsOrErr.takeError();
Larisse Voufo39a1e502013-08-06 01:03:05 +00005408
Gabor Marton26f72a92018-07-12 09:42:05 +00005409 VarTemplateDecl *ToVarTD;
5410 if (GetImportedOrCreateDecl(ToVarTD, D, Importer.getToContext(), DC, Loc,
Balazs Keri3b30d652018-10-19 13:32:20 +00005411 Name, *TemplateParamsOrErr, ToTemplated))
Gabor Marton26f72a92018-07-12 09:42:05 +00005412 return ToVarTD;
5413
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005414 ToTemplated->setDescribedVarTemplate(ToVarTD);
Larisse Voufo39a1e502013-08-06 01:03:05 +00005415
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005416 ToVarTD->setAccess(D->getAccess());
5417 ToVarTD->setLexicalDeclContext(LexicalDC);
5418 LexicalDC->addDeclInternal(ToVarTD);
Larisse Voufo39a1e502013-08-06 01:03:05 +00005419
Larisse Voufo39a1e502013-08-06 01:03:05 +00005420 if (DTemplated->isThisDeclarationADefinition() &&
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005421 !ToTemplated->isThisDeclarationADefinition()) {
Larisse Voufo39a1e502013-08-06 01:03:05 +00005422 // FIXME: Import definition!
5423 }
5424
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005425 return ToVarTD;
Larisse Voufo39a1e502013-08-06 01:03:05 +00005426}
5427
Balazs Keri3b30d652018-10-19 13:32:20 +00005428ExpectedDecl ASTNodeImporter::VisitVarTemplateSpecializationDecl(
Larisse Voufo39a1e502013-08-06 01:03:05 +00005429 VarTemplateSpecializationDecl *D) {
5430 // If this record has a definition in the translation unit we're coming from,
5431 // but this particular declaration is not that definition, import the
5432 // definition and map to that.
5433 VarDecl *Definition = D->getDefinition();
5434 if (Definition && Definition != D) {
Balazs Keri3b30d652018-10-19 13:32:20 +00005435 if (ExpectedDecl ImportedDefOrErr = import(Definition))
5436 return Importer.MapImported(D, *ImportedDefOrErr);
5437 else
5438 return ImportedDefOrErr.takeError();
Larisse Voufo39a1e502013-08-06 01:03:05 +00005439 }
5440
Simon Pilgrim4c146ab2019-05-18 11:33:27 +00005441 VarTemplateDecl *VarTemplate = nullptr;
Balazs Keri3b30d652018-10-19 13:32:20 +00005442 if (Error Err = importInto(VarTemplate, D->getSpecializedTemplate()))
5443 return std::move(Err);
Larisse Voufo39a1e502013-08-06 01:03:05 +00005444
5445 // Import the context of this declaration.
Balazs Keri3b30d652018-10-19 13:32:20 +00005446 DeclContext *DC, *LexicalDC;
5447 if (Error Err = ImportDeclContext(D, DC, LexicalDC))
5448 return std::move(Err);
Larisse Voufo39a1e502013-08-06 01:03:05 +00005449
5450 // Import the location of this declaration.
Balazs Keri3b30d652018-10-19 13:32:20 +00005451 ExpectedSLoc BeginLocOrErr = import(D->getBeginLoc());
5452 if (!BeginLocOrErr)
5453 return BeginLocOrErr.takeError();
5454
5455 auto IdLocOrErr = import(D->getLocation());
5456 if (!IdLocOrErr)
5457 return IdLocOrErr.takeError();
Larisse Voufo39a1e502013-08-06 01:03:05 +00005458
5459 // Import template arguments.
5460 SmallVector<TemplateArgument, 2> TemplateArgs;
Balazs Keri3b30d652018-10-19 13:32:20 +00005461 if (Error Err = ImportTemplateArguments(
5462 D->getTemplateArgs().data(), D->getTemplateArgs().size(), TemplateArgs))
5463 return std::move(Err);
Larisse Voufo39a1e502013-08-06 01:03:05 +00005464
5465 // Try to find an existing specialization with these template arguments.
Craig Topper36250ad2014-05-12 05:36:57 +00005466 void *InsertPos = nullptr;
Larisse Voufo39a1e502013-08-06 01:03:05 +00005467 VarTemplateSpecializationDecl *D2 = VarTemplate->findSpecialization(
Craig Topper7e0daca2014-06-26 04:58:53 +00005468 TemplateArgs, InsertPos);
Larisse Voufo39a1e502013-08-06 01:03:05 +00005469 if (D2) {
5470 // We already have a variable template specialization with these template
5471 // arguments.
5472
5473 // FIXME: Check for specialization vs. instantiation errors.
5474
5475 if (VarDecl *FoundDef = D2->getDefinition()) {
5476 if (!D->isThisDeclarationADefinition() ||
5477 IsStructuralMatch(D, FoundDef)) {
5478 // The record types structurally match, or the "from" translation
5479 // unit only had a forward declaration anyway; call it the same
5480 // variable.
Gabor Marton26f72a92018-07-12 09:42:05 +00005481 return Importer.MapImported(D, FoundDef);
Larisse Voufo39a1e502013-08-06 01:03:05 +00005482 }
5483 }
5484 } else {
Larisse Voufo39a1e502013-08-06 01:03:05 +00005485 // Import the type.
Balazs Keri3b30d652018-10-19 13:32:20 +00005486 QualType T;
5487 if (Error Err = importInto(T, D->getType()))
5488 return std::move(Err);
Larisse Voufo39a1e502013-08-06 01:03:05 +00005489
Balazs Keri3b30d652018-10-19 13:32:20 +00005490 auto TInfoOrErr = import(D->getTypeSourceInfo());
5491 if (!TInfoOrErr)
5492 return TInfoOrErr.takeError();
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005493
5494 TemplateArgumentListInfo ToTAInfo;
Balazs Keri3b30d652018-10-19 13:32:20 +00005495 if (Error Err = ImportTemplateArgumentListInfo(
5496 D->getTemplateArgsInfo(), ToTAInfo))
5497 return std::move(Err);
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005498
5499 using PartVarSpecDecl = VarTemplatePartialSpecializationDecl;
Larisse Voufo39a1e502013-08-06 01:03:05 +00005500 // Create a new specialization.
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005501 if (auto *FromPartial = dyn_cast<PartVarSpecDecl>(D)) {
5502 // Import TemplateArgumentListInfo
5503 TemplateArgumentListInfo ArgInfos;
5504 const auto *FromTAArgsAsWritten = FromPartial->getTemplateArgsAsWritten();
5505 // NOTE: FromTAArgsAsWritten and template parameter list are non-null.
Balazs Keri3b30d652018-10-19 13:32:20 +00005506 if (Error Err = ImportTemplateArgumentListInfo(
5507 *FromTAArgsAsWritten, ArgInfos))
5508 return std::move(Err);
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005509
Balazs Keridec09162019-03-20 15:42:42 +00005510 auto ToTPListOrErr = import(FromPartial->getTemplateParameters());
Balazs Keri3b30d652018-10-19 13:32:20 +00005511 if (!ToTPListOrErr)
5512 return ToTPListOrErr.takeError();
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005513
Gabor Marton26f72a92018-07-12 09:42:05 +00005514 PartVarSpecDecl *ToPartial;
5515 if (GetImportedOrCreateDecl(ToPartial, D, Importer.getToContext(), DC,
Balazs Keri3b30d652018-10-19 13:32:20 +00005516 *BeginLocOrErr, *IdLocOrErr, *ToTPListOrErr,
5517 VarTemplate, T, *TInfoOrErr,
5518 D->getStorageClass(), TemplateArgs, ArgInfos))
Gabor Marton26f72a92018-07-12 09:42:05 +00005519 return ToPartial;
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005520
Balazs Keri3b30d652018-10-19 13:32:20 +00005521 if (Expected<PartVarSpecDecl *> ToInstOrErr = import(
5522 FromPartial->getInstantiatedFromMember()))
5523 ToPartial->setInstantiatedFromMember(*ToInstOrErr);
5524 else
5525 return ToInstOrErr.takeError();
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005526
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005527 if (FromPartial->isMemberSpecialization())
5528 ToPartial->setMemberSpecialization();
5529
5530 D2 = ToPartial;
Balazs Keri3b30d652018-10-19 13:32:20 +00005531
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005532 } else { // Full specialization
Balazs Keri3b30d652018-10-19 13:32:20 +00005533 if (GetImportedOrCreateDecl(D2, D, Importer.getToContext(), DC,
5534 *BeginLocOrErr, *IdLocOrErr, VarTemplate,
5535 T, *TInfoOrErr,
Gabor Marton26f72a92018-07-12 09:42:05 +00005536 D->getStorageClass(), TemplateArgs))
5537 return D2;
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005538 }
5539
Balazs Keri3b30d652018-10-19 13:32:20 +00005540 if (D->getPointOfInstantiation().isValid()) {
5541 if (ExpectedSLoc POIOrErr = import(D->getPointOfInstantiation()))
5542 D2->setPointOfInstantiation(*POIOrErr);
5543 else
5544 return POIOrErr.takeError();
5545 }
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005546
Larisse Voufo39a1e502013-08-06 01:03:05 +00005547 D2->setSpecializationKind(D->getSpecializationKind());
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005548 D2->setTemplateArgsInfo(ToTAInfo);
Larisse Voufo39a1e502013-08-06 01:03:05 +00005549
5550 // Add this specialization to the class template.
5551 VarTemplate->AddSpecialization(D2, InsertPos);
5552
5553 // Import the qualifier, if any.
Balazs Keri3b30d652018-10-19 13:32:20 +00005554 if (auto LocOrErr = import(D->getQualifierLoc()))
5555 D2->setQualifierInfo(*LocOrErr);
5556 else
5557 return LocOrErr.takeError();
Larisse Voufo39a1e502013-08-06 01:03:05 +00005558
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005559 if (D->isConstexpr())
5560 D2->setConstexpr(true);
5561
Larisse Voufo39a1e502013-08-06 01:03:05 +00005562 // Add the specialization to this context.
5563 D2->setLexicalDeclContext(LexicalDC);
5564 LexicalDC->addDeclInternal(D2);
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005565
5566 D2->setAccess(D->getAccess());
Larisse Voufo39a1e502013-08-06 01:03:05 +00005567 }
Aleksei Sidorin4c05f142018-02-14 11:18:00 +00005568
Balazs Keri3b30d652018-10-19 13:32:20 +00005569 if (Error Err = ImportInitializer(D, D2))
5570 return std::move(Err);
Larisse Voufo39a1e502013-08-06 01:03:05 +00005571
5572 return D2;
5573}
5574
Balazs Keri3b30d652018-10-19 13:32:20 +00005575ExpectedDecl
5576ASTNodeImporter::VisitFunctionTemplateDecl(FunctionTemplateDecl *D) {
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00005577 DeclContext *DC, *LexicalDC;
5578 DeclarationName Name;
5579 SourceLocation Loc;
5580 NamedDecl *ToD;
5581
Balazs Keri3b30d652018-10-19 13:32:20 +00005582 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
5583 return std::move(Err);
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00005584
5585 if (ToD)
5586 return ToD;
5587
Gabor Marton16d98c22019-03-07 13:01:51 +00005588 const FunctionTemplateDecl *FoundByLookup = nullptr;
5589
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00005590 // Try to find a function in our own ("to") context with the same name, same
5591 // type, and in the same context as the function we're importing.
Gabor Marton16d98c22019-03-07 13:01:51 +00005592 // FIXME Split this into a separate function.
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00005593 if (!LexicalDC->isFunctionOrMethod()) {
Gabor Martone331e632019-02-18 13:09:27 +00005594 unsigned IDNS = Decl::IDNS_Ordinary | Decl::IDNS_OrdinaryFriend;
Gabor Marton54058b52018-12-17 13:53:12 +00005595 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00005596 for (auto *FoundDecl : FoundDecls) {
5597 if (!FoundDecl->isInIdentifierNamespace(IDNS))
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00005598 continue;
5599
Gabor Marton16d98c22019-03-07 13:01:51 +00005600 if (auto *FoundTemplate = dyn_cast<FunctionTemplateDecl>(FoundDecl)) {
Balazs Kerif8a89c82019-09-13 08:03:49 +00005601 if (!hasSameVisibilityContext(FoundTemplate, D))
5602 continue;
5603 if (IsStructuralMatch(D, FoundTemplate)) {
5604 FunctionTemplateDecl *TemplateWithDef =
5605 getTemplateDefinition(FoundTemplate);
5606 if (D->isThisDeclarationADefinition() && TemplateWithDef)
5607 return Importer.MapImported(D, TemplateWithDef);
5608
5609 FoundByLookup = FoundTemplate;
5610 break;
Gabor Marton16d98c22019-03-07 13:01:51 +00005611 // TODO: handle conflicting names
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00005612 }
5613 }
5614 }
5615 }
5616
Balazs Keridec09162019-03-20 15:42:42 +00005617 auto ParamsOrErr = import(D->getTemplateParameters());
Balazs Keri3b30d652018-10-19 13:32:20 +00005618 if (!ParamsOrErr)
5619 return ParamsOrErr.takeError();
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00005620
Balazs Keri3b30d652018-10-19 13:32:20 +00005621 FunctionDecl *TemplatedFD;
5622 if (Error Err = importInto(TemplatedFD, D->getTemplatedDecl()))
5623 return std::move(Err);
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00005624
Gabor Marton26f72a92018-07-12 09:42:05 +00005625 FunctionTemplateDecl *ToFunc;
5626 if (GetImportedOrCreateDecl(ToFunc, D, Importer.getToContext(), DC, Loc, Name,
Balazs Keri3b30d652018-10-19 13:32:20 +00005627 *ParamsOrErr, TemplatedFD))
Gabor Marton26f72a92018-07-12 09:42:05 +00005628 return ToFunc;
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00005629
5630 TemplatedFD->setDescribedFunctionTemplate(ToFunc);
Gabor Marton16d98c22019-03-07 13:01:51 +00005631
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00005632 ToFunc->setAccess(D->getAccess());
5633 ToFunc->setLexicalDeclContext(LexicalDC);
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00005634 LexicalDC->addDeclInternal(ToFunc);
Gabor Marton16d98c22019-03-07 13:01:51 +00005635
5636 if (FoundByLookup) {
5637 auto *Recent =
5638 const_cast<FunctionTemplateDecl *>(FoundByLookup->getMostRecentDecl());
5639 if (!TemplatedFD->getPreviousDecl()) {
5640 assert(FoundByLookup->getTemplatedDecl() &&
5641 "Found decl must have its templated decl set");
5642 auto *PrevTemplated =
5643 FoundByLookup->getTemplatedDecl()->getMostRecentDecl();
5644 if (TemplatedFD != PrevTemplated)
5645 TemplatedFD->setPreviousDecl(PrevTemplated);
5646 }
5647 ToFunc->setPreviousDecl(Recent);
5648 }
5649
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00005650 return ToFunc;
5651}
5652
Douglas Gregor7eeb5972010-02-11 19:21:55 +00005653//----------------------------------------------------------------------------
5654// Import Statements
5655//----------------------------------------------------------------------------
5656
Balazs Keri3b30d652018-10-19 13:32:20 +00005657ExpectedStmt ASTNodeImporter::VisitStmt(Stmt *S) {
Stephen Kellyf2ceec42018-08-09 21:08:08 +00005658 Importer.FromDiag(S->getBeginLoc(), diag::err_unsupported_ast_node)
5659 << S->getStmtClassName();
Balazs Keri3b30d652018-10-19 13:32:20 +00005660 return make_error<ImportError>(ImportError::UnsupportedConstruct);
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00005661}
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00005662
Balazs Keri3b30d652018-10-19 13:32:20 +00005663
5664ExpectedStmt ASTNodeImporter::VisitGCCAsmStmt(GCCAsmStmt *S) {
Gabor Marton303c98612019-06-25 08:00:51 +00005665 if (Importer.returnWithErrorInTest())
5666 return make_error<ImportError>(ImportError::UnsupportedConstruct);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00005667 SmallVector<IdentifierInfo *, 4> Names;
5668 for (unsigned I = 0, E = S->getNumOutputs(); I != E; I++) {
5669 IdentifierInfo *ToII = Importer.Import(S->getOutputIdentifier(I));
Gabor Horvath27f5ff62017-03-13 15:32:24 +00005670 // ToII is nullptr when no symbolic name is given for output operand
5671 // see ParseStmtAsm::ParseAsmOperandsOpt
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00005672 Names.push_back(ToII);
5673 }
Balazs Keri3b30d652018-10-19 13:32:20 +00005674
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00005675 for (unsigned I = 0, E = S->getNumInputs(); I != E; I++) {
5676 IdentifierInfo *ToII = Importer.Import(S->getInputIdentifier(I));
Gabor Horvath27f5ff62017-03-13 15:32:24 +00005677 // ToII is nullptr when no symbolic name is given for input operand
5678 // see ParseStmtAsm::ParseAsmOperandsOpt
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00005679 Names.push_back(ToII);
5680 }
5681
5682 SmallVector<StringLiteral *, 4> Clobbers;
5683 for (unsigned I = 0, E = S->getNumClobbers(); I != E; I++) {
Balazs Keri3b30d652018-10-19 13:32:20 +00005684 if (auto ClobberOrErr = import(S->getClobberStringLiteral(I)))
5685 Clobbers.push_back(*ClobberOrErr);
5686 else
5687 return ClobberOrErr.takeError();
5688
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00005689 }
5690
5691 SmallVector<StringLiteral *, 4> Constraints;
5692 for (unsigned I = 0, E = S->getNumOutputs(); I != E; I++) {
Balazs Keri3b30d652018-10-19 13:32:20 +00005693 if (auto OutputOrErr = import(S->getOutputConstraintLiteral(I)))
5694 Constraints.push_back(*OutputOrErr);
5695 else
5696 return OutputOrErr.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00005697 }
5698
5699 for (unsigned I = 0, E = S->getNumInputs(); I != E; I++) {
Balazs Keri3b30d652018-10-19 13:32:20 +00005700 if (auto InputOrErr = import(S->getInputConstraintLiteral(I)))
5701 Constraints.push_back(*InputOrErr);
5702 else
5703 return InputOrErr.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00005704 }
5705
Jennifer Yub8fee672019-06-03 15:57:25 +00005706 SmallVector<Expr *, 4> Exprs(S->getNumOutputs() + S->getNumInputs() +
5707 S->getNumLabels());
Balazs Keri3b30d652018-10-19 13:32:20 +00005708 if (Error Err = ImportContainerChecked(S->outputs(), Exprs))
5709 return std::move(Err);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00005710
Jennifer Yub8fee672019-06-03 15:57:25 +00005711 if (Error Err =
5712 ImportArrayChecked(S->inputs(), Exprs.begin() + S->getNumOutputs()))
5713 return std::move(Err);
5714
Balazs Keri3b30d652018-10-19 13:32:20 +00005715 if (Error Err = ImportArrayChecked(
Jennifer Yub8fee672019-06-03 15:57:25 +00005716 S->labels(), Exprs.begin() + S->getNumOutputs() + S->getNumInputs()))
Balazs Keri3b30d652018-10-19 13:32:20 +00005717 return std::move(Err);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00005718
Balazs Keri3b30d652018-10-19 13:32:20 +00005719 ExpectedSLoc AsmLocOrErr = import(S->getAsmLoc());
5720 if (!AsmLocOrErr)
5721 return AsmLocOrErr.takeError();
5722 auto AsmStrOrErr = import(S->getAsmString());
5723 if (!AsmStrOrErr)
5724 return AsmStrOrErr.takeError();
5725 ExpectedSLoc RParenLocOrErr = import(S->getRParenLoc());
5726 if (!RParenLocOrErr)
5727 return RParenLocOrErr.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00005728
5729 return new (Importer.getToContext()) GCCAsmStmt(
Balazs Keri3b30d652018-10-19 13:32:20 +00005730 Importer.getToContext(),
5731 *AsmLocOrErr,
5732 S->isSimple(),
5733 S->isVolatile(),
5734 S->getNumOutputs(),
5735 S->getNumInputs(),
5736 Names.data(),
5737 Constraints.data(),
5738 Exprs.data(),
5739 *AsmStrOrErr,
5740 S->getNumClobbers(),
5741 Clobbers.data(),
Jennifer Yub8fee672019-06-03 15:57:25 +00005742 S->getNumLabels(),
Balazs Keri3b30d652018-10-19 13:32:20 +00005743 *RParenLocOrErr);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00005744}
5745
Balazs Keri3b30d652018-10-19 13:32:20 +00005746ExpectedStmt ASTNodeImporter::VisitDeclStmt(DeclStmt *S) {
5747 auto Imp = importSeq(S->getDeclGroup(), S->getBeginLoc(), S->getEndLoc());
5748 if (!Imp)
5749 return Imp.takeError();
5750
5751 DeclGroupRef ToDG;
5752 SourceLocation ToBeginLoc, ToEndLoc;
5753 std::tie(ToDG, ToBeginLoc, ToEndLoc) = *Imp;
5754
5755 return new (Importer.getToContext()) DeclStmt(ToDG, ToBeginLoc, ToEndLoc);
Sean Callanan59721b32015-04-28 18:41:46 +00005756}
5757
Balazs Keri3b30d652018-10-19 13:32:20 +00005758ExpectedStmt ASTNodeImporter::VisitNullStmt(NullStmt *S) {
5759 ExpectedSLoc ToSemiLocOrErr = import(S->getSemiLoc());
5760 if (!ToSemiLocOrErr)
5761 return ToSemiLocOrErr.takeError();
5762 return new (Importer.getToContext()) NullStmt(
5763 *ToSemiLocOrErr, S->hasLeadingEmptyMacro());
Sean Callanan59721b32015-04-28 18:41:46 +00005764}
5765
Balazs Keri3b30d652018-10-19 13:32:20 +00005766ExpectedStmt ASTNodeImporter::VisitCompoundStmt(CompoundStmt *S) {
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00005767 SmallVector<Stmt *, 8> ToStmts(S->size());
Aleksei Sidorina693b372016-09-28 10:16:56 +00005768
Balazs Keri3b30d652018-10-19 13:32:20 +00005769 if (Error Err = ImportContainerChecked(S->body(), ToStmts))
5770 return std::move(Err);
Sean Callanan8bca9962016-03-28 21:43:01 +00005771
Balazs Keri3b30d652018-10-19 13:32:20 +00005772 ExpectedSLoc ToLBracLocOrErr = import(S->getLBracLoc());
5773 if (!ToLBracLocOrErr)
5774 return ToLBracLocOrErr.takeError();
5775
5776 ExpectedSLoc ToRBracLocOrErr = import(S->getRBracLoc());
5777 if (!ToRBracLocOrErr)
5778 return ToRBracLocOrErr.takeError();
5779
5780 return CompoundStmt::Create(
5781 Importer.getToContext(), ToStmts,
5782 *ToLBracLocOrErr, *ToRBracLocOrErr);
Sean Callanan59721b32015-04-28 18:41:46 +00005783}
5784
Balazs Keri3b30d652018-10-19 13:32:20 +00005785ExpectedStmt ASTNodeImporter::VisitCaseStmt(CaseStmt *S) {
5786 auto Imp = importSeq(
5787 S->getLHS(), S->getRHS(), S->getSubStmt(), S->getCaseLoc(),
5788 S->getEllipsisLoc(), S->getColonLoc());
5789 if (!Imp)
5790 return Imp.takeError();
5791
5792 Expr *ToLHS, *ToRHS;
5793 Stmt *ToSubStmt;
5794 SourceLocation ToCaseLoc, ToEllipsisLoc, ToColonLoc;
5795 std::tie(ToLHS, ToRHS, ToSubStmt, ToCaseLoc, ToEllipsisLoc, ToColonLoc) =
5796 *Imp;
5797
Bruno Ricci5b30571752018-10-28 12:30:53 +00005798 auto *ToStmt = CaseStmt::Create(Importer.getToContext(), ToLHS, ToRHS,
5799 ToCaseLoc, ToEllipsisLoc, ToColonLoc);
Gabor Horvath480892b2017-10-18 09:25:18 +00005800 ToStmt->setSubStmt(ToSubStmt);
Balazs Keri3b30d652018-10-19 13:32:20 +00005801
Gabor Horvath480892b2017-10-18 09:25:18 +00005802 return ToStmt;
Sean Callanan59721b32015-04-28 18:41:46 +00005803}
5804
Balazs Keri3b30d652018-10-19 13:32:20 +00005805ExpectedStmt ASTNodeImporter::VisitDefaultStmt(DefaultStmt *S) {
5806 auto Imp = importSeq(S->getDefaultLoc(), S->getColonLoc(), S->getSubStmt());
5807 if (!Imp)
5808 return Imp.takeError();
5809
5810 SourceLocation ToDefaultLoc, ToColonLoc;
5811 Stmt *ToSubStmt;
5812 std::tie(ToDefaultLoc, ToColonLoc, ToSubStmt) = *Imp;
5813
5814 return new (Importer.getToContext()) DefaultStmt(
5815 ToDefaultLoc, ToColonLoc, ToSubStmt);
Sean Callanan59721b32015-04-28 18:41:46 +00005816}
5817
Balazs Keri3b30d652018-10-19 13:32:20 +00005818ExpectedStmt ASTNodeImporter::VisitLabelStmt(LabelStmt *S) {
5819 auto Imp = importSeq(S->getIdentLoc(), S->getDecl(), S->getSubStmt());
5820 if (!Imp)
5821 return Imp.takeError();
5822
5823 SourceLocation ToIdentLoc;
5824 LabelDecl *ToLabelDecl;
5825 Stmt *ToSubStmt;
5826 std::tie(ToIdentLoc, ToLabelDecl, ToSubStmt) = *Imp;
5827
5828 return new (Importer.getToContext()) LabelStmt(
5829 ToIdentLoc, ToLabelDecl, ToSubStmt);
Sean Callanan59721b32015-04-28 18:41:46 +00005830}
5831
Balazs Keri3b30d652018-10-19 13:32:20 +00005832ExpectedStmt ASTNodeImporter::VisitAttributedStmt(AttributedStmt *S) {
5833 ExpectedSLoc ToAttrLocOrErr = import(S->getAttrLoc());
5834 if (!ToAttrLocOrErr)
5835 return ToAttrLocOrErr.takeError();
Sean Callanan59721b32015-04-28 18:41:46 +00005836 ArrayRef<const Attr*> FromAttrs(S->getAttrs());
5837 SmallVector<const Attr *, 1> ToAttrs(FromAttrs.size());
Balazs Keri3b30d652018-10-19 13:32:20 +00005838 if (Error Err = ImportContainerChecked(FromAttrs, ToAttrs))
5839 return std::move(Err);
5840 ExpectedStmt ToSubStmtOrErr = import(S->getSubStmt());
5841 if (!ToSubStmtOrErr)
5842 return ToSubStmtOrErr.takeError();
5843
5844 return AttributedStmt::Create(
5845 Importer.getToContext(), *ToAttrLocOrErr, ToAttrs, *ToSubStmtOrErr);
Sean Callanan59721b32015-04-28 18:41:46 +00005846}
5847
Balazs Keri3b30d652018-10-19 13:32:20 +00005848ExpectedStmt ASTNodeImporter::VisitIfStmt(IfStmt *S) {
5849 auto Imp = importSeq(
5850 S->getIfLoc(), S->getInit(), S->getConditionVariable(), S->getCond(),
5851 S->getThen(), S->getElseLoc(), S->getElse());
5852 if (!Imp)
5853 return Imp.takeError();
5854
5855 SourceLocation ToIfLoc, ToElseLoc;
5856 Stmt *ToInit, *ToThen, *ToElse;
5857 VarDecl *ToConditionVariable;
5858 Expr *ToCond;
5859 std::tie(
5860 ToIfLoc, ToInit, ToConditionVariable, ToCond, ToThen, ToElseLoc, ToElse) =
5861 *Imp;
5862
Bruno Riccib1cc94b2018-10-27 21:12:20 +00005863 return IfStmt::Create(Importer.getToContext(), ToIfLoc, S->isConstexpr(),
5864 ToInit, ToConditionVariable, ToCond, ToThen, ToElseLoc,
5865 ToElse);
Sean Callanan59721b32015-04-28 18:41:46 +00005866}
5867
Balazs Keri3b30d652018-10-19 13:32:20 +00005868ExpectedStmt ASTNodeImporter::VisitSwitchStmt(SwitchStmt *S) {
5869 auto Imp = importSeq(
5870 S->getInit(), S->getConditionVariable(), S->getCond(),
5871 S->getBody(), S->getSwitchLoc());
5872 if (!Imp)
5873 return Imp.takeError();
5874
5875 Stmt *ToInit, *ToBody;
5876 VarDecl *ToConditionVariable;
5877 Expr *ToCond;
5878 SourceLocation ToSwitchLoc;
5879 std::tie(ToInit, ToConditionVariable, ToCond, ToBody, ToSwitchLoc) = *Imp;
5880
Bruno Riccie2806f82018-10-29 16:12:37 +00005881 auto *ToStmt = SwitchStmt::Create(Importer.getToContext(), ToInit,
5882 ToConditionVariable, ToCond);
Sean Callanan59721b32015-04-28 18:41:46 +00005883 ToStmt->setBody(ToBody);
Balazs Keri3b30d652018-10-19 13:32:20 +00005884 ToStmt->setSwitchLoc(ToSwitchLoc);
5885
Sean Callanan59721b32015-04-28 18:41:46 +00005886 // Now we have to re-chain the cases.
5887 SwitchCase *LastChainedSwitchCase = nullptr;
5888 for (SwitchCase *SC = S->getSwitchCaseList(); SC != nullptr;
5889 SC = SC->getNextSwitchCase()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00005890 Expected<SwitchCase *> ToSCOrErr = import(SC);
5891 if (!ToSCOrErr)
5892 return ToSCOrErr.takeError();
Sean Callanan59721b32015-04-28 18:41:46 +00005893 if (LastChainedSwitchCase)
Balazs Keri3b30d652018-10-19 13:32:20 +00005894 LastChainedSwitchCase->setNextSwitchCase(*ToSCOrErr);
Sean Callanan59721b32015-04-28 18:41:46 +00005895 else
Balazs Keri3b30d652018-10-19 13:32:20 +00005896 ToStmt->setSwitchCaseList(*ToSCOrErr);
5897 LastChainedSwitchCase = *ToSCOrErr;
Sean Callanan59721b32015-04-28 18:41:46 +00005898 }
Balazs Keri3b30d652018-10-19 13:32:20 +00005899
Sean Callanan59721b32015-04-28 18:41:46 +00005900 return ToStmt;
5901}
5902
Balazs Keri3b30d652018-10-19 13:32:20 +00005903ExpectedStmt ASTNodeImporter::VisitWhileStmt(WhileStmt *S) {
5904 auto Imp = importSeq(
5905 S->getConditionVariable(), S->getCond(), S->getBody(), S->getWhileLoc());
5906 if (!Imp)
5907 return Imp.takeError();
5908
5909 VarDecl *ToConditionVariable;
5910 Expr *ToCond;
5911 Stmt *ToBody;
5912 SourceLocation ToWhileLoc;
5913 std::tie(ToConditionVariable, ToCond, ToBody, ToWhileLoc) = *Imp;
5914
Bruno Riccibacf7512018-10-30 13:42:41 +00005915 return WhileStmt::Create(Importer.getToContext(), ToConditionVariable, ToCond,
5916 ToBody, ToWhileLoc);
Sean Callanan59721b32015-04-28 18:41:46 +00005917}
5918
Balazs Keri3b30d652018-10-19 13:32:20 +00005919ExpectedStmt ASTNodeImporter::VisitDoStmt(DoStmt *S) {
5920 auto Imp = importSeq(
5921 S->getBody(), S->getCond(), S->getDoLoc(), S->getWhileLoc(),
5922 S->getRParenLoc());
5923 if (!Imp)
5924 return Imp.takeError();
5925
5926 Stmt *ToBody;
5927 Expr *ToCond;
5928 SourceLocation ToDoLoc, ToWhileLoc, ToRParenLoc;
5929 std::tie(ToBody, ToCond, ToDoLoc, ToWhileLoc, ToRParenLoc) = *Imp;
5930
5931 return new (Importer.getToContext()) DoStmt(
5932 ToBody, ToCond, ToDoLoc, ToWhileLoc, ToRParenLoc);
Sean Callanan59721b32015-04-28 18:41:46 +00005933}
5934
Balazs Keri3b30d652018-10-19 13:32:20 +00005935ExpectedStmt ASTNodeImporter::VisitForStmt(ForStmt *S) {
5936 auto Imp = importSeq(
5937 S->getInit(), S->getCond(), S->getConditionVariable(), S->getInc(),
5938 S->getBody(), S->getForLoc(), S->getLParenLoc(), S->getRParenLoc());
5939 if (!Imp)
5940 return Imp.takeError();
5941
5942 Stmt *ToInit;
5943 Expr *ToCond, *ToInc;
5944 VarDecl *ToConditionVariable;
5945 Stmt *ToBody;
5946 SourceLocation ToForLoc, ToLParenLoc, ToRParenLoc;
5947 std::tie(
5948 ToInit, ToCond, ToConditionVariable, ToInc, ToBody, ToForLoc,
5949 ToLParenLoc, ToRParenLoc) = *Imp;
5950
5951 return new (Importer.getToContext()) ForStmt(
5952 Importer.getToContext(),
5953 ToInit, ToCond, ToConditionVariable, ToInc, ToBody, ToForLoc, ToLParenLoc,
5954 ToRParenLoc);
Sean Callanan59721b32015-04-28 18:41:46 +00005955}
5956
Balazs Keri3b30d652018-10-19 13:32:20 +00005957ExpectedStmt ASTNodeImporter::VisitGotoStmt(GotoStmt *S) {
5958 auto Imp = importSeq(S->getLabel(), S->getGotoLoc(), S->getLabelLoc());
5959 if (!Imp)
5960 return Imp.takeError();
5961
5962 LabelDecl *ToLabel;
5963 SourceLocation ToGotoLoc, ToLabelLoc;
5964 std::tie(ToLabel, ToGotoLoc, ToLabelLoc) = *Imp;
5965
5966 return new (Importer.getToContext()) GotoStmt(
5967 ToLabel, ToGotoLoc, ToLabelLoc);
Sean Callanan59721b32015-04-28 18:41:46 +00005968}
5969
Balazs Keri3b30d652018-10-19 13:32:20 +00005970ExpectedStmt ASTNodeImporter::VisitIndirectGotoStmt(IndirectGotoStmt *S) {
5971 auto Imp = importSeq(S->getGotoLoc(), S->getStarLoc(), S->getTarget());
5972 if (!Imp)
5973 return Imp.takeError();
5974
5975 SourceLocation ToGotoLoc, ToStarLoc;
5976 Expr *ToTarget;
5977 std::tie(ToGotoLoc, ToStarLoc, ToTarget) = *Imp;
5978
5979 return new (Importer.getToContext()) IndirectGotoStmt(
5980 ToGotoLoc, ToStarLoc, ToTarget);
Sean Callanan59721b32015-04-28 18:41:46 +00005981}
5982
Balazs Keri3b30d652018-10-19 13:32:20 +00005983ExpectedStmt ASTNodeImporter::VisitContinueStmt(ContinueStmt *S) {
5984 ExpectedSLoc ToContinueLocOrErr = import(S->getContinueLoc());
5985 if (!ToContinueLocOrErr)
5986 return ToContinueLocOrErr.takeError();
5987 return new (Importer.getToContext()) ContinueStmt(*ToContinueLocOrErr);
Sean Callanan59721b32015-04-28 18:41:46 +00005988}
5989
Balazs Keri3b30d652018-10-19 13:32:20 +00005990ExpectedStmt ASTNodeImporter::VisitBreakStmt(BreakStmt *S) {
5991 auto ToBreakLocOrErr = import(S->getBreakLoc());
5992 if (!ToBreakLocOrErr)
5993 return ToBreakLocOrErr.takeError();
5994 return new (Importer.getToContext()) BreakStmt(*ToBreakLocOrErr);
Sean Callanan59721b32015-04-28 18:41:46 +00005995}
5996
Balazs Keri3b30d652018-10-19 13:32:20 +00005997ExpectedStmt ASTNodeImporter::VisitReturnStmt(ReturnStmt *S) {
5998 auto Imp = importSeq(
5999 S->getReturnLoc(), S->getRetValue(), S->getNRVOCandidate());
6000 if (!Imp)
6001 return Imp.takeError();
6002
6003 SourceLocation ToReturnLoc;
6004 Expr *ToRetValue;
6005 const VarDecl *ToNRVOCandidate;
6006 std::tie(ToReturnLoc, ToRetValue, ToNRVOCandidate) = *Imp;
6007
Bruno Ricci023b1d12018-10-30 14:40:49 +00006008 return ReturnStmt::Create(Importer.getToContext(), ToReturnLoc, ToRetValue,
6009 ToNRVOCandidate);
Sean Callanan59721b32015-04-28 18:41:46 +00006010}
6011
Balazs Keri3b30d652018-10-19 13:32:20 +00006012ExpectedStmt ASTNodeImporter::VisitCXXCatchStmt(CXXCatchStmt *S) {
6013 auto Imp = importSeq(
6014 S->getCatchLoc(), S->getExceptionDecl(), S->getHandlerBlock());
6015 if (!Imp)
6016 return Imp.takeError();
6017
6018 SourceLocation ToCatchLoc;
6019 VarDecl *ToExceptionDecl;
6020 Stmt *ToHandlerBlock;
6021 std::tie(ToCatchLoc, ToExceptionDecl, ToHandlerBlock) = *Imp;
6022
6023 return new (Importer.getToContext()) CXXCatchStmt (
6024 ToCatchLoc, ToExceptionDecl, ToHandlerBlock);
Sean Callanan59721b32015-04-28 18:41:46 +00006025}
6026
Balazs Keri3b30d652018-10-19 13:32:20 +00006027ExpectedStmt ASTNodeImporter::VisitCXXTryStmt(CXXTryStmt *S) {
6028 ExpectedSLoc ToTryLocOrErr = import(S->getTryLoc());
6029 if (!ToTryLocOrErr)
6030 return ToTryLocOrErr.takeError();
6031
6032 ExpectedStmt ToTryBlockOrErr = import(S->getTryBlock());
6033 if (!ToTryBlockOrErr)
6034 return ToTryBlockOrErr.takeError();
6035
Sean Callanan59721b32015-04-28 18:41:46 +00006036 SmallVector<Stmt *, 1> ToHandlers(S->getNumHandlers());
6037 for (unsigned HI = 0, HE = S->getNumHandlers(); HI != HE; ++HI) {
6038 CXXCatchStmt *FromHandler = S->getHandler(HI);
Balazs Keri3b30d652018-10-19 13:32:20 +00006039 if (auto ToHandlerOrErr = import(FromHandler))
6040 ToHandlers[HI] = *ToHandlerOrErr;
Sean Callanan59721b32015-04-28 18:41:46 +00006041 else
Balazs Keri3b30d652018-10-19 13:32:20 +00006042 return ToHandlerOrErr.takeError();
Sean Callanan59721b32015-04-28 18:41:46 +00006043 }
Balazs Keri3b30d652018-10-19 13:32:20 +00006044
6045 return CXXTryStmt::Create(
6046 Importer.getToContext(), *ToTryLocOrErr,*ToTryBlockOrErr, ToHandlers);
Sean Callanan59721b32015-04-28 18:41:46 +00006047}
6048
Balazs Keri3b30d652018-10-19 13:32:20 +00006049ExpectedStmt ASTNodeImporter::VisitCXXForRangeStmt(CXXForRangeStmt *S) {
6050 auto Imp1 = importSeq(
6051 S->getInit(), S->getRangeStmt(), S->getBeginStmt(), S->getEndStmt(),
6052 S->getCond(), S->getInc(), S->getLoopVarStmt(), S->getBody());
6053 if (!Imp1)
6054 return Imp1.takeError();
6055 auto Imp2 = importSeq(
6056 S->getForLoc(), S->getCoawaitLoc(), S->getColonLoc(), S->getRParenLoc());
6057 if (!Imp2)
6058 return Imp2.takeError();
6059
6060 DeclStmt *ToRangeStmt, *ToBeginStmt, *ToEndStmt, *ToLoopVarStmt;
6061 Expr *ToCond, *ToInc;
6062 Stmt *ToInit, *ToBody;
6063 std::tie(
6064 ToInit, ToRangeStmt, ToBeginStmt, ToEndStmt, ToCond, ToInc, ToLoopVarStmt,
6065 ToBody) = *Imp1;
6066 SourceLocation ToForLoc, ToCoawaitLoc, ToColonLoc, ToRParenLoc;
6067 std::tie(ToForLoc, ToCoawaitLoc, ToColonLoc, ToRParenLoc) = *Imp2;
6068
6069 return new (Importer.getToContext()) CXXForRangeStmt(
6070 ToInit, ToRangeStmt, ToBeginStmt, ToEndStmt, ToCond, ToInc, ToLoopVarStmt,
6071 ToBody, ToForLoc, ToCoawaitLoc, ToColonLoc, ToRParenLoc);
Sean Callanan59721b32015-04-28 18:41:46 +00006072}
6073
Balazs Keri3b30d652018-10-19 13:32:20 +00006074ExpectedStmt
6075ASTNodeImporter::VisitObjCForCollectionStmt(ObjCForCollectionStmt *S) {
6076 auto Imp = importSeq(
6077 S->getElement(), S->getCollection(), S->getBody(),
6078 S->getForLoc(), S->getRParenLoc());
6079 if (!Imp)
6080 return Imp.takeError();
6081
6082 Stmt *ToElement, *ToBody;
6083 Expr *ToCollection;
6084 SourceLocation ToForLoc, ToRParenLoc;
6085 std::tie(ToElement, ToCollection, ToBody, ToForLoc, ToRParenLoc) = *Imp;
6086
6087 return new (Importer.getToContext()) ObjCForCollectionStmt(ToElement,
6088 ToCollection,
6089 ToBody,
6090 ToForLoc,
Sean Callanan59721b32015-04-28 18:41:46 +00006091 ToRParenLoc);
6092}
6093
Balazs Keri3b30d652018-10-19 13:32:20 +00006094ExpectedStmt ASTNodeImporter::VisitObjCAtCatchStmt(ObjCAtCatchStmt *S) {
6095 auto Imp = importSeq(
6096 S->getAtCatchLoc(), S->getRParenLoc(), S->getCatchParamDecl(),
6097 S->getCatchBody());
6098 if (!Imp)
6099 return Imp.takeError();
6100
6101 SourceLocation ToAtCatchLoc, ToRParenLoc;
6102 VarDecl *ToCatchParamDecl;
6103 Stmt *ToCatchBody;
6104 std::tie(ToAtCatchLoc, ToRParenLoc, ToCatchParamDecl, ToCatchBody) = *Imp;
6105
6106 return new (Importer.getToContext()) ObjCAtCatchStmt (
6107 ToAtCatchLoc, ToRParenLoc, ToCatchParamDecl, ToCatchBody);
Sean Callanan59721b32015-04-28 18:41:46 +00006108}
6109
Balazs Keri3b30d652018-10-19 13:32:20 +00006110ExpectedStmt ASTNodeImporter::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
6111 ExpectedSLoc ToAtFinallyLocOrErr = import(S->getAtFinallyLoc());
6112 if (!ToAtFinallyLocOrErr)
6113 return ToAtFinallyLocOrErr.takeError();
6114 ExpectedStmt ToAtFinallyStmtOrErr = import(S->getFinallyBody());
6115 if (!ToAtFinallyStmtOrErr)
6116 return ToAtFinallyStmtOrErr.takeError();
6117 return new (Importer.getToContext()) ObjCAtFinallyStmt(*ToAtFinallyLocOrErr,
6118 *ToAtFinallyStmtOrErr);
Sean Callanan59721b32015-04-28 18:41:46 +00006119}
6120
Balazs Keri3b30d652018-10-19 13:32:20 +00006121ExpectedStmt ASTNodeImporter::VisitObjCAtTryStmt(ObjCAtTryStmt *S) {
6122 auto Imp = importSeq(
6123 S->getAtTryLoc(), S->getTryBody(), S->getFinallyStmt());
6124 if (!Imp)
6125 return Imp.takeError();
6126
6127 SourceLocation ToAtTryLoc;
6128 Stmt *ToTryBody, *ToFinallyStmt;
6129 std::tie(ToAtTryLoc, ToTryBody, ToFinallyStmt) = *Imp;
6130
Sean Callanan59721b32015-04-28 18:41:46 +00006131 SmallVector<Stmt *, 1> ToCatchStmts(S->getNumCatchStmts());
6132 for (unsigned CI = 0, CE = S->getNumCatchStmts(); CI != CE; ++CI) {
6133 ObjCAtCatchStmt *FromCatchStmt = S->getCatchStmt(CI);
Balazs Keri3b30d652018-10-19 13:32:20 +00006134 if (ExpectedStmt ToCatchStmtOrErr = import(FromCatchStmt))
6135 ToCatchStmts[CI] = *ToCatchStmtOrErr;
Sean Callanan59721b32015-04-28 18:41:46 +00006136 else
Balazs Keri3b30d652018-10-19 13:32:20 +00006137 return ToCatchStmtOrErr.takeError();
Sean Callanan59721b32015-04-28 18:41:46 +00006138 }
Balazs Keri3b30d652018-10-19 13:32:20 +00006139
Sean Callanan59721b32015-04-28 18:41:46 +00006140 return ObjCAtTryStmt::Create(Importer.getToContext(),
Balazs Keri3b30d652018-10-19 13:32:20 +00006141 ToAtTryLoc, ToTryBody,
Sean Callanan59721b32015-04-28 18:41:46 +00006142 ToCatchStmts.begin(), ToCatchStmts.size(),
Balazs Keri3b30d652018-10-19 13:32:20 +00006143 ToFinallyStmt);
Sean Callanan59721b32015-04-28 18:41:46 +00006144}
6145
Balazs Keri3b30d652018-10-19 13:32:20 +00006146ExpectedStmt ASTNodeImporter::VisitObjCAtSynchronizedStmt
Sean Callanan59721b32015-04-28 18:41:46 +00006147 (ObjCAtSynchronizedStmt *S) {
Balazs Keri3b30d652018-10-19 13:32:20 +00006148 auto Imp = importSeq(
6149 S->getAtSynchronizedLoc(), S->getSynchExpr(), S->getSynchBody());
6150 if (!Imp)
6151 return Imp.takeError();
6152
6153 SourceLocation ToAtSynchronizedLoc;
6154 Expr *ToSynchExpr;
6155 Stmt *ToSynchBody;
6156 std::tie(ToAtSynchronizedLoc, ToSynchExpr, ToSynchBody) = *Imp;
6157
Sean Callanan59721b32015-04-28 18:41:46 +00006158 return new (Importer.getToContext()) ObjCAtSynchronizedStmt(
6159 ToAtSynchronizedLoc, ToSynchExpr, ToSynchBody);
6160}
6161
Balazs Keri3b30d652018-10-19 13:32:20 +00006162ExpectedStmt ASTNodeImporter::VisitObjCAtThrowStmt(ObjCAtThrowStmt *S) {
6163 ExpectedSLoc ToThrowLocOrErr = import(S->getThrowLoc());
6164 if (!ToThrowLocOrErr)
6165 return ToThrowLocOrErr.takeError();
6166 ExpectedExpr ToThrowExprOrErr = import(S->getThrowExpr());
6167 if (!ToThrowExprOrErr)
6168 return ToThrowExprOrErr.takeError();
6169 return new (Importer.getToContext()) ObjCAtThrowStmt(
6170 *ToThrowLocOrErr, *ToThrowExprOrErr);
Sean Callanan59721b32015-04-28 18:41:46 +00006171}
6172
Balazs Keri3b30d652018-10-19 13:32:20 +00006173ExpectedStmt ASTNodeImporter::VisitObjCAutoreleasePoolStmt(
6174 ObjCAutoreleasePoolStmt *S) {
6175 ExpectedSLoc ToAtLocOrErr = import(S->getAtLoc());
6176 if (!ToAtLocOrErr)
6177 return ToAtLocOrErr.takeError();
6178 ExpectedStmt ToSubStmtOrErr = import(S->getSubStmt());
6179 if (!ToSubStmtOrErr)
6180 return ToSubStmtOrErr.takeError();
6181 return new (Importer.getToContext()) ObjCAutoreleasePoolStmt(*ToAtLocOrErr,
6182 *ToSubStmtOrErr);
Douglas Gregor7eeb5972010-02-11 19:21:55 +00006183}
6184
6185//----------------------------------------------------------------------------
6186// Import Expressions
6187//----------------------------------------------------------------------------
Balazs Keri3b30d652018-10-19 13:32:20 +00006188ExpectedStmt ASTNodeImporter::VisitExpr(Expr *E) {
Stephen Kellyf2ceec42018-08-09 21:08:08 +00006189 Importer.FromDiag(E->getBeginLoc(), diag::err_unsupported_ast_node)
6190 << E->getStmtClassName();
Balazs Keri3b30d652018-10-19 13:32:20 +00006191 return make_error<ImportError>(ImportError::UnsupportedConstruct);
Douglas Gregor7eeb5972010-02-11 19:21:55 +00006192}
6193
Balazs Keri3b30d652018-10-19 13:32:20 +00006194ExpectedStmt ASTNodeImporter::VisitVAArgExpr(VAArgExpr *E) {
6195 auto Imp = importSeq(
6196 E->getBuiltinLoc(), E->getSubExpr(), E->getWrittenTypeInfo(),
6197 E->getRParenLoc(), E->getType());
6198 if (!Imp)
6199 return Imp.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006200
Balazs Keri3b30d652018-10-19 13:32:20 +00006201 SourceLocation ToBuiltinLoc, ToRParenLoc;
6202 Expr *ToSubExpr;
6203 TypeSourceInfo *ToWrittenTypeInfo;
6204 QualType ToType;
6205 std::tie(ToBuiltinLoc, ToSubExpr, ToWrittenTypeInfo, ToRParenLoc, ToType) =
6206 *Imp;
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006207
6208 return new (Importer.getToContext()) VAArgExpr(
Balazs Keri3b30d652018-10-19 13:32:20 +00006209 ToBuiltinLoc, ToSubExpr, ToWrittenTypeInfo, ToRParenLoc, ToType,
6210 E->isMicrosoftABI());
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006211}
6212
Tom Roeder521f0042019-02-26 19:26:41 +00006213ExpectedStmt ASTNodeImporter::VisitChooseExpr(ChooseExpr *E) {
6214 auto Imp = importSeq(E->getCond(), E->getLHS(), E->getRHS(),
6215 E->getBuiltinLoc(), E->getRParenLoc(), E->getType());
6216 if (!Imp)
6217 return Imp.takeError();
6218
6219 Expr *ToCond;
6220 Expr *ToLHS;
6221 Expr *ToRHS;
6222 SourceLocation ToBuiltinLoc, ToRParenLoc;
6223 QualType ToType;
6224 std::tie(ToCond, ToLHS, ToRHS, ToBuiltinLoc, ToRParenLoc, ToType) = *Imp;
6225
6226 ExprValueKind VK = E->getValueKind();
6227 ExprObjectKind OK = E->getObjectKind();
6228
6229 bool TypeDependent = ToCond->isTypeDependent();
6230 bool ValueDependent = ToCond->isValueDependent();
6231
6232 // The value of CondIsTrue only matters if the value is not
6233 // condition-dependent.
6234 bool CondIsTrue = !E->isConditionDependent() && E->isConditionTrue();
6235
6236 return new (Importer.getToContext())
6237 ChooseExpr(ToBuiltinLoc, ToCond, ToLHS, ToRHS, ToType, VK, OK,
6238 ToRParenLoc, CondIsTrue, TypeDependent, ValueDependent);
6239}
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006240
Balazs Keri3b30d652018-10-19 13:32:20 +00006241ExpectedStmt ASTNodeImporter::VisitGNUNullExpr(GNUNullExpr *E) {
6242 ExpectedType TypeOrErr = import(E->getType());
6243 if (!TypeOrErr)
6244 return TypeOrErr.takeError();
6245
6246 ExpectedSLoc BeginLocOrErr = import(E->getBeginLoc());
6247 if (!BeginLocOrErr)
6248 return BeginLocOrErr.takeError();
6249
6250 return new (Importer.getToContext()) GNUNullExpr(*TypeOrErr, *BeginLocOrErr);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006251}
6252
Balazs Keri3b30d652018-10-19 13:32:20 +00006253ExpectedStmt ASTNodeImporter::VisitPredefinedExpr(PredefinedExpr *E) {
6254 auto Imp = importSeq(
6255 E->getBeginLoc(), E->getType(), E->getFunctionName());
6256 if (!Imp)
6257 return Imp.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006258
Balazs Keri3b30d652018-10-19 13:32:20 +00006259 SourceLocation ToBeginLoc;
6260 QualType ToType;
6261 StringLiteral *ToFunctionName;
6262 std::tie(ToBeginLoc, ToType, ToFunctionName) = *Imp;
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006263
Bruno Ricci17ff0262018-10-27 19:21:19 +00006264 return PredefinedExpr::Create(Importer.getToContext(), ToBeginLoc, ToType,
6265 E->getIdentKind(), ToFunctionName);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006266}
6267
Balazs Keri3b30d652018-10-19 13:32:20 +00006268ExpectedStmt ASTNodeImporter::VisitDeclRefExpr(DeclRefExpr *E) {
6269 auto Imp = importSeq(
6270 E->getQualifierLoc(), E->getTemplateKeywordLoc(), E->getDecl(),
6271 E->getLocation(), E->getType());
6272 if (!Imp)
6273 return Imp.takeError();
Chandler Carruth8d26bb02011-05-01 23:48:14 +00006274
Balazs Keri3b30d652018-10-19 13:32:20 +00006275 NestedNameSpecifierLoc ToQualifierLoc;
6276 SourceLocation ToTemplateKeywordLoc, ToLocation;
6277 ValueDecl *ToDecl;
6278 QualType ToType;
6279 std::tie(ToQualifierLoc, ToTemplateKeywordLoc, ToDecl, ToLocation, ToType) =
6280 *Imp;
6281
6282 NamedDecl *ToFoundD = nullptr;
Chandler Carruth8d26bb02011-05-01 23:48:14 +00006283 if (E->getDecl() != E->getFoundDecl()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00006284 auto FoundDOrErr = import(E->getFoundDecl());
6285 if (!FoundDOrErr)
6286 return FoundDOrErr.takeError();
6287 ToFoundD = *FoundDOrErr;
Chandler Carruth8d26bb02011-05-01 23:48:14 +00006288 }
Fangrui Song6907ce22018-07-30 19:24:48 +00006289
Aleksei Sidorina693b372016-09-28 10:16:56 +00006290 TemplateArgumentListInfo ToTAInfo;
Balazs Keri3b30d652018-10-19 13:32:20 +00006291 TemplateArgumentListInfo *ToResInfo = nullptr;
Aleksei Sidorina693b372016-09-28 10:16:56 +00006292 if (E->hasExplicitTemplateArgs()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00006293 if (Error Err =
6294 ImportTemplateArgumentListInfo(E->template_arguments(), ToTAInfo))
6295 return std::move(Err);
6296 ToResInfo = &ToTAInfo;
Aleksei Sidorina693b372016-09-28 10:16:56 +00006297 }
6298
Balazs Keri3b30d652018-10-19 13:32:20 +00006299 auto *ToE = DeclRefExpr::Create(
6300 Importer.getToContext(), ToQualifierLoc, ToTemplateKeywordLoc, ToDecl,
6301 E->refersToEnclosingVariableOrCapture(), ToLocation, ToType,
Richard Smith715f7a12019-06-11 17:50:32 +00006302 E->getValueKind(), ToFoundD, ToResInfo, E->isNonOdrUse());
Abramo Bagnara635ed24e2011-10-05 07:56:41 +00006303 if (E->hadMultipleCandidates())
Balazs Keri3b30d652018-10-19 13:32:20 +00006304 ToE->setHadMultipleCandidates(true);
6305 return ToE;
Douglas Gregor52f820e2010-02-19 01:17:02 +00006306}
6307
Balazs Keri3b30d652018-10-19 13:32:20 +00006308ExpectedStmt ASTNodeImporter::VisitImplicitValueInitExpr(ImplicitValueInitExpr *E) {
6309 ExpectedType TypeOrErr = import(E->getType());
6310 if (!TypeOrErr)
6311 return TypeOrErr.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006312
Balazs Keri3b30d652018-10-19 13:32:20 +00006313 return new (Importer.getToContext()) ImplicitValueInitExpr(*TypeOrErr);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006314}
6315
Balazs Keri3b30d652018-10-19 13:32:20 +00006316ExpectedStmt ASTNodeImporter::VisitDesignatedInitExpr(DesignatedInitExpr *E) {
6317 ExpectedExpr ToInitOrErr = import(E->getInit());
6318 if (!ToInitOrErr)
6319 return ToInitOrErr.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006320
Balazs Keri3b30d652018-10-19 13:32:20 +00006321 ExpectedSLoc ToEqualOrColonLocOrErr = import(E->getEqualOrColonLoc());
6322 if (!ToEqualOrColonLocOrErr)
6323 return ToEqualOrColonLocOrErr.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006324
Balazs Keri3b30d652018-10-19 13:32:20 +00006325 SmallVector<Expr *, 4> ToIndexExprs(E->getNumSubExprs() - 1);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006326 // List elements from the second, the first is Init itself
Balazs Keri3b30d652018-10-19 13:32:20 +00006327 for (unsigned I = 1, N = E->getNumSubExprs(); I < N; I++) {
6328 if (ExpectedExpr ToArgOrErr = import(E->getSubExpr(I)))
6329 ToIndexExprs[I - 1] = *ToArgOrErr;
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006330 else
Balazs Keri3b30d652018-10-19 13:32:20 +00006331 return ToArgOrErr.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006332 }
6333
Balazs Keri3b30d652018-10-19 13:32:20 +00006334 SmallVector<Designator, 4> ToDesignators(E->size());
6335 if (Error Err = ImportContainerChecked(E->designators(), ToDesignators))
6336 return std::move(Err);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006337
6338 return DesignatedInitExpr::Create(
Balazs Keri3b30d652018-10-19 13:32:20 +00006339 Importer.getToContext(), ToDesignators,
6340 ToIndexExprs, *ToEqualOrColonLocOrErr,
6341 E->usesGNUSyntax(), *ToInitOrErr);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006342}
6343
Balazs Keri3b30d652018-10-19 13:32:20 +00006344ExpectedStmt
6345ASTNodeImporter::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E) {
6346 ExpectedType ToTypeOrErr = import(E->getType());
6347 if (!ToTypeOrErr)
6348 return ToTypeOrErr.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006349
Balazs Keri3b30d652018-10-19 13:32:20 +00006350 ExpectedSLoc ToLocationOrErr = import(E->getLocation());
6351 if (!ToLocationOrErr)
6352 return ToLocationOrErr.takeError();
6353
6354 return new (Importer.getToContext()) CXXNullPtrLiteralExpr(
6355 *ToTypeOrErr, *ToLocationOrErr);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006356}
6357
Balazs Keri3b30d652018-10-19 13:32:20 +00006358ExpectedStmt ASTNodeImporter::VisitIntegerLiteral(IntegerLiteral *E) {
6359 ExpectedType ToTypeOrErr = import(E->getType());
6360 if (!ToTypeOrErr)
6361 return ToTypeOrErr.takeError();
Douglas Gregor7eeb5972010-02-11 19:21:55 +00006362
Balazs Keri3b30d652018-10-19 13:32:20 +00006363 ExpectedSLoc ToLocationOrErr = import(E->getLocation());
6364 if (!ToLocationOrErr)
6365 return ToLocationOrErr.takeError();
6366
6367 return IntegerLiteral::Create(
6368 Importer.getToContext(), E->getValue(), *ToTypeOrErr, *ToLocationOrErr);
Douglas Gregor7eeb5972010-02-11 19:21:55 +00006369}
6370
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006371
Balazs Keri3b30d652018-10-19 13:32:20 +00006372ExpectedStmt ASTNodeImporter::VisitFloatingLiteral(FloatingLiteral *E) {
6373 ExpectedType ToTypeOrErr = import(E->getType());
6374 if (!ToTypeOrErr)
6375 return ToTypeOrErr.takeError();
6376
6377 ExpectedSLoc ToLocationOrErr = import(E->getLocation());
6378 if (!ToLocationOrErr)
6379 return ToLocationOrErr.takeError();
6380
6381 return FloatingLiteral::Create(
6382 Importer.getToContext(), E->getValue(), E->isExact(),
6383 *ToTypeOrErr, *ToLocationOrErr);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006384}
6385
Balazs Keri3b30d652018-10-19 13:32:20 +00006386ExpectedStmt ASTNodeImporter::VisitImaginaryLiteral(ImaginaryLiteral *E) {
6387 auto ToTypeOrErr = import(E->getType());
6388 if (!ToTypeOrErr)
6389 return ToTypeOrErr.takeError();
Gabor Martonbf7f18b2018-08-09 12:18:07 +00006390
Balazs Keri3b30d652018-10-19 13:32:20 +00006391 ExpectedExpr ToSubExprOrErr = import(E->getSubExpr());
6392 if (!ToSubExprOrErr)
6393 return ToSubExprOrErr.takeError();
Gabor Martonbf7f18b2018-08-09 12:18:07 +00006394
Balazs Keri3b30d652018-10-19 13:32:20 +00006395 return new (Importer.getToContext()) ImaginaryLiteral(
6396 *ToSubExprOrErr, *ToTypeOrErr);
Gabor Martonbf7f18b2018-08-09 12:18:07 +00006397}
6398
Balazs Keri3b30d652018-10-19 13:32:20 +00006399ExpectedStmt ASTNodeImporter::VisitCharacterLiteral(CharacterLiteral *E) {
6400 ExpectedType ToTypeOrErr = import(E->getType());
6401 if (!ToTypeOrErr)
6402 return ToTypeOrErr.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00006403
Balazs Keri3b30d652018-10-19 13:32:20 +00006404 ExpectedSLoc ToLocationOrErr = import(E->getLocation());
6405 if (!ToLocationOrErr)
6406 return ToLocationOrErr.takeError();
6407
6408 return new (Importer.getToContext()) CharacterLiteral(
6409 E->getValue(), E->getKind(), *ToTypeOrErr, *ToLocationOrErr);
Douglas Gregor623421d2010-02-18 02:21:22 +00006410}
6411
Balazs Keri3b30d652018-10-19 13:32:20 +00006412ExpectedStmt ASTNodeImporter::VisitStringLiteral(StringLiteral *E) {
6413 ExpectedType ToTypeOrErr = import(E->getType());
6414 if (!ToTypeOrErr)
6415 return ToTypeOrErr.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006416
Balazs Keri3b30d652018-10-19 13:32:20 +00006417 SmallVector<SourceLocation, 4> ToLocations(E->getNumConcatenated());
6418 if (Error Err = ImportArrayChecked(
6419 E->tokloc_begin(), E->tokloc_end(), ToLocations.begin()))
6420 return std::move(Err);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006421
Balazs Keri3b30d652018-10-19 13:32:20 +00006422 return StringLiteral::Create(
6423 Importer.getToContext(), E->getBytes(), E->getKind(), E->isPascal(),
6424 *ToTypeOrErr, ToLocations.data(), ToLocations.size());
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006425}
6426
Balazs Keri3b30d652018-10-19 13:32:20 +00006427ExpectedStmt ASTNodeImporter::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {
6428 auto Imp = importSeq(
6429 E->getLParenLoc(), E->getTypeSourceInfo(), E->getType(),
6430 E->getInitializer());
6431 if (!Imp)
6432 return Imp.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006433
Balazs Keri3b30d652018-10-19 13:32:20 +00006434 SourceLocation ToLParenLoc;
6435 TypeSourceInfo *ToTypeSourceInfo;
6436 QualType ToType;
6437 Expr *ToInitializer;
6438 std::tie(ToLParenLoc, ToTypeSourceInfo, ToType, ToInitializer) = *Imp;
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006439
6440 return new (Importer.getToContext()) CompoundLiteralExpr(
Balazs Keri3b30d652018-10-19 13:32:20 +00006441 ToLParenLoc, ToTypeSourceInfo, ToType, E->getValueKind(),
6442 ToInitializer, E->isFileScope());
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006443}
6444
Balazs Keri3b30d652018-10-19 13:32:20 +00006445ExpectedStmt ASTNodeImporter::VisitAtomicExpr(AtomicExpr *E) {
6446 auto Imp = importSeq(
6447 E->getBuiltinLoc(), E->getType(), E->getRParenLoc());
6448 if (!Imp)
6449 return Imp.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006450
Balazs Keri3b30d652018-10-19 13:32:20 +00006451 SourceLocation ToBuiltinLoc, ToRParenLoc;
6452 QualType ToType;
6453 std::tie(ToBuiltinLoc, ToType, ToRParenLoc) = *Imp;
6454
6455 SmallVector<Expr *, 6> ToExprs(E->getNumSubExprs());
6456 if (Error Err = ImportArrayChecked(
6457 E->getSubExprs(), E->getSubExprs() + E->getNumSubExprs(),
6458 ToExprs.begin()))
6459 return std::move(Err);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006460
6461 return new (Importer.getToContext()) AtomicExpr(
Balazs Keri3b30d652018-10-19 13:32:20 +00006462 ToBuiltinLoc, ToExprs, ToType, E->getOp(), ToRParenLoc);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006463}
6464
Balazs Keri3b30d652018-10-19 13:32:20 +00006465ExpectedStmt ASTNodeImporter::VisitAddrLabelExpr(AddrLabelExpr *E) {
6466 auto Imp = importSeq(
6467 E->getAmpAmpLoc(), E->getLabelLoc(), E->getLabel(), E->getType());
6468 if (!Imp)
6469 return Imp.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006470
Balazs Keri3b30d652018-10-19 13:32:20 +00006471 SourceLocation ToAmpAmpLoc, ToLabelLoc;
6472 LabelDecl *ToLabel;
6473 QualType ToType;
6474 std::tie(ToAmpAmpLoc, ToLabelLoc, ToLabel, ToType) = *Imp;
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006475
6476 return new (Importer.getToContext()) AddrLabelExpr(
Balazs Keri3b30d652018-10-19 13:32:20 +00006477 ToAmpAmpLoc, ToLabelLoc, ToLabel, ToType);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006478}
6479
Bill Wendling8003edc2018-11-09 00:41:36 +00006480ExpectedStmt ASTNodeImporter::VisitConstantExpr(ConstantExpr *E) {
6481 auto Imp = importSeq(E->getSubExpr());
6482 if (!Imp)
6483 return Imp.takeError();
6484
6485 Expr *ToSubExpr;
6486 std::tie(ToSubExpr) = *Imp;
6487
Gauthier Harnisch83c7b612019-06-15 10:24:47 +00006488 // TODO : Handle APValue::ValueKind that require importing.
6489 APValue::ValueKind Kind = E->getResultAPValueKind();
6490 if (Kind == APValue::Int || Kind == APValue::Float ||
6491 Kind == APValue::FixedPoint || Kind == APValue::ComplexFloat ||
6492 Kind == APValue::ComplexInt)
6493 return ConstantExpr::Create(Importer.getToContext(), ToSubExpr,
6494 E->getAPValueResult());
Fangrui Song407659a2018-11-30 23:41:18 +00006495 return ConstantExpr::Create(Importer.getToContext(), ToSubExpr);
Bill Wendling8003edc2018-11-09 00:41:36 +00006496}
6497
Balazs Keri3b30d652018-10-19 13:32:20 +00006498ExpectedStmt ASTNodeImporter::VisitParenExpr(ParenExpr *E) {
6499 auto Imp = importSeq(E->getLParen(), E->getRParen(), E->getSubExpr());
6500 if (!Imp)
6501 return Imp.takeError();
6502
6503 SourceLocation ToLParen, ToRParen;
6504 Expr *ToSubExpr;
6505 std::tie(ToLParen, ToRParen, ToSubExpr) = *Imp;
Craig Topper36250ad2014-05-12 05:36:57 +00006506
Fangrui Song6907ce22018-07-30 19:24:48 +00006507 return new (Importer.getToContext())
Balazs Keri3b30d652018-10-19 13:32:20 +00006508 ParenExpr(ToLParen, ToRParen, ToSubExpr);
Douglas Gregorc74247e2010-02-19 01:07:06 +00006509}
6510
Balazs Keri3b30d652018-10-19 13:32:20 +00006511ExpectedStmt ASTNodeImporter::VisitParenListExpr(ParenListExpr *E) {
6512 SmallVector<Expr *, 4> ToExprs(E->getNumExprs());
6513 if (Error Err = ImportContainerChecked(E->exprs(), ToExprs))
6514 return std::move(Err);
6515
6516 ExpectedSLoc ToLParenLocOrErr = import(E->getLParenLoc());
6517 if (!ToLParenLocOrErr)
6518 return ToLParenLocOrErr.takeError();
6519
6520 ExpectedSLoc ToRParenLocOrErr = import(E->getRParenLoc());
6521 if (!ToRParenLocOrErr)
6522 return ToRParenLocOrErr.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006523
Bruno Riccif49e1ca2018-11-20 16:20:40 +00006524 return ParenListExpr::Create(Importer.getToContext(), *ToLParenLocOrErr,
6525 ToExprs, *ToRParenLocOrErr);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006526}
6527
Balazs Keri3b30d652018-10-19 13:32:20 +00006528ExpectedStmt ASTNodeImporter::VisitStmtExpr(StmtExpr *E) {
6529 auto Imp = importSeq(
6530 E->getSubStmt(), E->getType(), E->getLParenLoc(), E->getRParenLoc());
6531 if (!Imp)
6532 return Imp.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006533
Balazs Keri3b30d652018-10-19 13:32:20 +00006534 CompoundStmt *ToSubStmt;
6535 QualType ToType;
6536 SourceLocation ToLParenLoc, ToRParenLoc;
6537 std::tie(ToSubStmt, ToType, ToLParenLoc, ToRParenLoc) = *Imp;
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006538
Balazs Keri3b30d652018-10-19 13:32:20 +00006539 return new (Importer.getToContext()) StmtExpr(
6540 ToSubStmt, ToType, ToLParenLoc, ToRParenLoc);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006541}
6542
Balazs Keri3b30d652018-10-19 13:32:20 +00006543ExpectedStmt ASTNodeImporter::VisitUnaryOperator(UnaryOperator *E) {
6544 auto Imp = importSeq(
6545 E->getSubExpr(), E->getType(), E->getOperatorLoc());
6546 if (!Imp)
6547 return Imp.takeError();
Douglas Gregorc74247e2010-02-19 01:07:06 +00006548
Balazs Keri3b30d652018-10-19 13:32:20 +00006549 Expr *ToSubExpr;
6550 QualType ToType;
6551 SourceLocation ToOperatorLoc;
6552 std::tie(ToSubExpr, ToType, ToOperatorLoc) = *Imp;
Craig Topper36250ad2014-05-12 05:36:57 +00006553
Aaron Ballmana5038552018-01-09 13:07:03 +00006554 return new (Importer.getToContext()) UnaryOperator(
Balazs Keri3b30d652018-10-19 13:32:20 +00006555 ToSubExpr, E->getOpcode(), ToType, E->getValueKind(), E->getObjectKind(),
6556 ToOperatorLoc, E->canOverflow());
Douglas Gregorc74247e2010-02-19 01:07:06 +00006557}
6558
Balazs Keri3b30d652018-10-19 13:32:20 +00006559ExpectedStmt
Aaron Ballmana5038552018-01-09 13:07:03 +00006560ASTNodeImporter::VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *E) {
Balazs Keri3b30d652018-10-19 13:32:20 +00006561 auto Imp = importSeq(E->getType(), E->getOperatorLoc(), E->getRParenLoc());
6562 if (!Imp)
6563 return Imp.takeError();
6564
6565 QualType ToType;
6566 SourceLocation ToOperatorLoc, ToRParenLoc;
6567 std::tie(ToType, ToOperatorLoc, ToRParenLoc) = *Imp;
Fangrui Song6907ce22018-07-30 19:24:48 +00006568
Douglas Gregord8552cd2010-02-19 01:24:23 +00006569 if (E->isArgumentType()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00006570 Expected<TypeSourceInfo *> ToArgumentTypeInfoOrErr =
6571 import(E->getArgumentTypeInfo());
6572 if (!ToArgumentTypeInfoOrErr)
6573 return ToArgumentTypeInfoOrErr.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00006574
Balazs Keri3b30d652018-10-19 13:32:20 +00006575 return new (Importer.getToContext()) UnaryExprOrTypeTraitExpr(
6576 E->getKind(), *ToArgumentTypeInfoOrErr, ToType, ToOperatorLoc,
6577 ToRParenLoc);
Douglas Gregord8552cd2010-02-19 01:24:23 +00006578 }
Fangrui Song6907ce22018-07-30 19:24:48 +00006579
Balazs Keri3b30d652018-10-19 13:32:20 +00006580 ExpectedExpr ToArgumentExprOrErr = import(E->getArgumentExpr());
6581 if (!ToArgumentExprOrErr)
6582 return ToArgumentExprOrErr.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00006583
Balazs Keri3b30d652018-10-19 13:32:20 +00006584 return new (Importer.getToContext()) UnaryExprOrTypeTraitExpr(
6585 E->getKind(), *ToArgumentExprOrErr, ToType, ToOperatorLoc, ToRParenLoc);
Douglas Gregord8552cd2010-02-19 01:24:23 +00006586}
6587
Balazs Keri3b30d652018-10-19 13:32:20 +00006588ExpectedStmt ASTNodeImporter::VisitBinaryOperator(BinaryOperator *E) {
6589 auto Imp = importSeq(
6590 E->getLHS(), E->getRHS(), E->getType(), E->getOperatorLoc());
6591 if (!Imp)
6592 return Imp.takeError();
Douglas Gregorc74247e2010-02-19 01:07:06 +00006593
Balazs Keri3b30d652018-10-19 13:32:20 +00006594 Expr *ToLHS, *ToRHS;
6595 QualType ToType;
6596 SourceLocation ToOperatorLoc;
6597 std::tie(ToLHS, ToRHS, ToType, ToOperatorLoc) = *Imp;
Craig Topper36250ad2014-05-12 05:36:57 +00006598
Balazs Keri3b30d652018-10-19 13:32:20 +00006599 return new (Importer.getToContext()) BinaryOperator(
6600 ToLHS, ToRHS, E->getOpcode(), ToType, E->getValueKind(),
6601 E->getObjectKind(), ToOperatorLoc, E->getFPFeatures());
Douglas Gregorc74247e2010-02-19 01:07:06 +00006602}
6603
Balazs Keri3b30d652018-10-19 13:32:20 +00006604ExpectedStmt ASTNodeImporter::VisitConditionalOperator(ConditionalOperator *E) {
6605 auto Imp = importSeq(
6606 E->getCond(), E->getQuestionLoc(), E->getLHS(), E->getColonLoc(),
6607 E->getRHS(), E->getType());
6608 if (!Imp)
6609 return Imp.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006610
Balazs Keri3b30d652018-10-19 13:32:20 +00006611 Expr *ToCond, *ToLHS, *ToRHS;
6612 SourceLocation ToQuestionLoc, ToColonLoc;
6613 QualType ToType;
6614 std::tie(ToCond, ToQuestionLoc, ToLHS, ToColonLoc, ToRHS, ToType) = *Imp;
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006615
6616 return new (Importer.getToContext()) ConditionalOperator(
Balazs Keri3b30d652018-10-19 13:32:20 +00006617 ToCond, ToQuestionLoc, ToLHS, ToColonLoc, ToRHS, ToType,
6618 E->getValueKind(), E->getObjectKind());
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006619}
6620
Balazs Keri3b30d652018-10-19 13:32:20 +00006621ExpectedStmt ASTNodeImporter::VisitBinaryConditionalOperator(
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006622 BinaryConditionalOperator *E) {
Balazs Keri3b30d652018-10-19 13:32:20 +00006623 auto Imp = importSeq(
6624 E->getCommon(), E->getOpaqueValue(), E->getCond(), E->getTrueExpr(),
6625 E->getFalseExpr(), E->getQuestionLoc(), E->getColonLoc(), E->getType());
6626 if (!Imp)
6627 return Imp.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006628
Balazs Keri3b30d652018-10-19 13:32:20 +00006629 Expr *ToCommon, *ToCond, *ToTrueExpr, *ToFalseExpr;
6630 OpaqueValueExpr *ToOpaqueValue;
6631 SourceLocation ToQuestionLoc, ToColonLoc;
6632 QualType ToType;
6633 std::tie(
6634 ToCommon, ToOpaqueValue, ToCond, ToTrueExpr, ToFalseExpr, ToQuestionLoc,
6635 ToColonLoc, ToType) = *Imp;
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006636
6637 return new (Importer.getToContext()) BinaryConditionalOperator(
Balazs Keri3b30d652018-10-19 13:32:20 +00006638 ToCommon, ToOpaqueValue, ToCond, ToTrueExpr, ToFalseExpr,
6639 ToQuestionLoc, ToColonLoc, ToType, E->getValueKind(),
6640 E->getObjectKind());
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006641}
6642
Balazs Keri3b30d652018-10-19 13:32:20 +00006643ExpectedStmt ASTNodeImporter::VisitArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
6644 auto Imp = importSeq(
6645 E->getBeginLoc(), E->getQueriedTypeSourceInfo(),
6646 E->getDimensionExpression(), E->getEndLoc(), E->getType());
6647 if (!Imp)
6648 return Imp.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00006649
Balazs Keri3b30d652018-10-19 13:32:20 +00006650 SourceLocation ToBeginLoc, ToEndLoc;
6651 TypeSourceInfo *ToQueriedTypeSourceInfo;
6652 Expr *ToDimensionExpression;
6653 QualType ToType;
6654 std::tie(
6655 ToBeginLoc, ToQueriedTypeSourceInfo, ToDimensionExpression, ToEndLoc,
6656 ToType) = *Imp;
Aleksei Sidorina693b372016-09-28 10:16:56 +00006657
6658 return new (Importer.getToContext()) ArrayTypeTraitExpr(
Balazs Keri3b30d652018-10-19 13:32:20 +00006659 ToBeginLoc, E->getTrait(), ToQueriedTypeSourceInfo, E->getValue(),
6660 ToDimensionExpression, ToEndLoc, ToType);
Aleksei Sidorina693b372016-09-28 10:16:56 +00006661}
6662
Balazs Keri3b30d652018-10-19 13:32:20 +00006663ExpectedStmt ASTNodeImporter::VisitExpressionTraitExpr(ExpressionTraitExpr *E) {
6664 auto Imp = importSeq(
6665 E->getBeginLoc(), E->getQueriedExpression(), E->getEndLoc(), E->getType());
6666 if (!Imp)
6667 return Imp.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00006668
Balazs Keri3b30d652018-10-19 13:32:20 +00006669 SourceLocation ToBeginLoc, ToEndLoc;
6670 Expr *ToQueriedExpression;
6671 QualType ToType;
6672 std::tie(ToBeginLoc, ToQueriedExpression, ToEndLoc, ToType) = *Imp;
Aleksei Sidorina693b372016-09-28 10:16:56 +00006673
6674 return new (Importer.getToContext()) ExpressionTraitExpr(
Balazs Keri3b30d652018-10-19 13:32:20 +00006675 ToBeginLoc, E->getTrait(), ToQueriedExpression, E->getValue(),
6676 ToEndLoc, ToType);
Aleksei Sidorina693b372016-09-28 10:16:56 +00006677}
6678
Balazs Keri3b30d652018-10-19 13:32:20 +00006679ExpectedStmt ASTNodeImporter::VisitOpaqueValueExpr(OpaqueValueExpr *E) {
6680 auto Imp = importSeq(
6681 E->getLocation(), E->getType(), E->getSourceExpr());
6682 if (!Imp)
6683 return Imp.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006684
Balazs Keri3b30d652018-10-19 13:32:20 +00006685 SourceLocation ToLocation;
6686 QualType ToType;
6687 Expr *ToSourceExpr;
6688 std::tie(ToLocation, ToType, ToSourceExpr) = *Imp;
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006689
6690 return new (Importer.getToContext()) OpaqueValueExpr(
Balazs Keri3b30d652018-10-19 13:32:20 +00006691 ToLocation, ToType, E->getValueKind(), E->getObjectKind(), ToSourceExpr);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00006692}
6693
Balazs Keri3b30d652018-10-19 13:32:20 +00006694ExpectedStmt ASTNodeImporter::VisitArraySubscriptExpr(ArraySubscriptExpr *E) {
6695 auto Imp = importSeq(
6696 E->getLHS(), E->getRHS(), E->getType(), E->getRBracketLoc());
6697 if (!Imp)
6698 return Imp.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00006699
Balazs Keri3b30d652018-10-19 13:32:20 +00006700 Expr *ToLHS, *ToRHS;
6701 SourceLocation ToRBracketLoc;
6702 QualType ToType;
6703 std::tie(ToLHS, ToRHS, ToType, ToRBracketLoc) = *Imp;
Aleksei Sidorina693b372016-09-28 10:16:56 +00006704
6705 return new (Importer.getToContext()) ArraySubscriptExpr(
Balazs Keri3b30d652018-10-19 13:32:20 +00006706 ToLHS, ToRHS, ToType, E->getValueKind(), E->getObjectKind(),
6707 ToRBracketLoc);
Aleksei Sidorina693b372016-09-28 10:16:56 +00006708}
6709
Balazs Keri3b30d652018-10-19 13:32:20 +00006710ExpectedStmt
6711ASTNodeImporter::VisitCompoundAssignOperator(CompoundAssignOperator *E) {
6712 auto Imp = importSeq(
6713 E->getLHS(), E->getRHS(), E->getType(), E->getComputationLHSType(),
6714 E->getComputationResultType(), E->getOperatorLoc());
6715 if (!Imp)
6716 return Imp.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00006717
Balazs Keri3b30d652018-10-19 13:32:20 +00006718 Expr *ToLHS, *ToRHS;
6719 QualType ToType, ToComputationLHSType, ToComputationResultType;
6720 SourceLocation ToOperatorLoc;
6721 std::tie(ToLHS, ToRHS, ToType, ToComputationLHSType, ToComputationResultType,
6722 ToOperatorLoc) = *Imp;
Craig Topper36250ad2014-05-12 05:36:57 +00006723
Balazs Keri3b30d652018-10-19 13:32:20 +00006724 return new (Importer.getToContext()) CompoundAssignOperator(
6725 ToLHS, ToRHS, E->getOpcode(), ToType, E->getValueKind(),
6726 E->getObjectKind(), ToComputationLHSType, ToComputationResultType,
6727 ToOperatorLoc, E->getFPFeatures());
Douglas Gregorc74247e2010-02-19 01:07:06 +00006728}
6729
Balazs Keri3b30d652018-10-19 13:32:20 +00006730Expected<CXXCastPath>
6731ASTNodeImporter::ImportCastPath(CastExpr *CE) {
6732 CXXCastPath Path;
Aleksei Sidorina693b372016-09-28 10:16:56 +00006733 for (auto I = CE->path_begin(), E = CE->path_end(); I != E; ++I) {
Balazs Keri3b30d652018-10-19 13:32:20 +00006734 if (auto SpecOrErr = import(*I))
6735 Path.push_back(*SpecOrErr);
Aleksei Sidorina693b372016-09-28 10:16:56 +00006736 else
Balazs Keri3b30d652018-10-19 13:32:20 +00006737 return SpecOrErr.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00006738 }
Balazs Keri3b30d652018-10-19 13:32:20 +00006739 return Path;
John McCallcf142162010-08-07 06:22:56 +00006740}
6741
Balazs Keri3b30d652018-10-19 13:32:20 +00006742ExpectedStmt ASTNodeImporter::VisitImplicitCastExpr(ImplicitCastExpr *E) {
6743 ExpectedType ToTypeOrErr = import(E->getType());
6744 if (!ToTypeOrErr)
6745 return ToTypeOrErr.takeError();
Douglas Gregor98c10182010-02-12 22:17:39 +00006746
Balazs Keri3b30d652018-10-19 13:32:20 +00006747 ExpectedExpr ToSubExprOrErr = import(E->getSubExpr());
6748 if (!ToSubExprOrErr)
6749 return ToSubExprOrErr.takeError();
John McCallcf142162010-08-07 06:22:56 +00006750
Balazs Keri3b30d652018-10-19 13:32:20 +00006751 Expected<CXXCastPath> ToBasePathOrErr = ImportCastPath(E);
6752 if (!ToBasePathOrErr)
6753 return ToBasePathOrErr.takeError();
John McCallcf142162010-08-07 06:22:56 +00006754
Balazs Keri3b30d652018-10-19 13:32:20 +00006755 return ImplicitCastExpr::Create(
6756 Importer.getToContext(), *ToTypeOrErr, E->getCastKind(), *ToSubExprOrErr,
6757 &(*ToBasePathOrErr), E->getValueKind());
Douglas Gregor98c10182010-02-12 22:17:39 +00006758}
6759
Balazs Keri3b30d652018-10-19 13:32:20 +00006760ExpectedStmt ASTNodeImporter::VisitExplicitCastExpr(ExplicitCastExpr *E) {
6761 auto Imp1 = importSeq(
6762 E->getType(), E->getSubExpr(), E->getTypeInfoAsWritten());
6763 if (!Imp1)
6764 return Imp1.takeError();
Craig Topper36250ad2014-05-12 05:36:57 +00006765
Balazs Keri3b30d652018-10-19 13:32:20 +00006766 QualType ToType;
6767 Expr *ToSubExpr;
6768 TypeSourceInfo *ToTypeInfoAsWritten;
6769 std::tie(ToType, ToSubExpr, ToTypeInfoAsWritten) = *Imp1;
Douglas Gregor5481d322010-02-19 01:32:14 +00006770
Balazs Keri3b30d652018-10-19 13:32:20 +00006771 Expected<CXXCastPath> ToBasePathOrErr = ImportCastPath(E);
6772 if (!ToBasePathOrErr)
6773 return ToBasePathOrErr.takeError();
6774 CXXCastPath *ToBasePath = &(*ToBasePathOrErr);
John McCallcf142162010-08-07 06:22:56 +00006775
Aleksei Sidorina693b372016-09-28 10:16:56 +00006776 switch (E->getStmtClass()) {
6777 case Stmt::CStyleCastExprClass: {
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00006778 auto *CCE = cast<CStyleCastExpr>(E);
Balazs Keri3b30d652018-10-19 13:32:20 +00006779 ExpectedSLoc ToLParenLocOrErr = import(CCE->getLParenLoc());
6780 if (!ToLParenLocOrErr)
6781 return ToLParenLocOrErr.takeError();
6782 ExpectedSLoc ToRParenLocOrErr = import(CCE->getRParenLoc());
6783 if (!ToRParenLocOrErr)
6784 return ToRParenLocOrErr.takeError();
6785 return CStyleCastExpr::Create(
6786 Importer.getToContext(), ToType, E->getValueKind(), E->getCastKind(),
6787 ToSubExpr, ToBasePath, ToTypeInfoAsWritten, *ToLParenLocOrErr,
6788 *ToRParenLocOrErr);
Aleksei Sidorina693b372016-09-28 10:16:56 +00006789 }
6790
6791 case Stmt::CXXFunctionalCastExprClass: {
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00006792 auto *FCE = cast<CXXFunctionalCastExpr>(E);
Balazs Keri3b30d652018-10-19 13:32:20 +00006793 ExpectedSLoc ToLParenLocOrErr = import(FCE->getLParenLoc());
6794 if (!ToLParenLocOrErr)
6795 return ToLParenLocOrErr.takeError();
6796 ExpectedSLoc ToRParenLocOrErr = import(FCE->getRParenLoc());
6797 if (!ToRParenLocOrErr)
6798 return ToRParenLocOrErr.takeError();
6799 return CXXFunctionalCastExpr::Create(
6800 Importer.getToContext(), ToType, E->getValueKind(), ToTypeInfoAsWritten,
6801 E->getCastKind(), ToSubExpr, ToBasePath, *ToLParenLocOrErr,
6802 *ToRParenLocOrErr);
Aleksei Sidorina693b372016-09-28 10:16:56 +00006803 }
6804
6805 case Stmt::ObjCBridgedCastExprClass: {
Balazs Keri3b30d652018-10-19 13:32:20 +00006806 auto *OCE = cast<ObjCBridgedCastExpr>(E);
6807 ExpectedSLoc ToLParenLocOrErr = import(OCE->getLParenLoc());
6808 if (!ToLParenLocOrErr)
6809 return ToLParenLocOrErr.takeError();
6810 ExpectedSLoc ToBridgeKeywordLocOrErr = import(OCE->getBridgeKeywordLoc());
6811 if (!ToBridgeKeywordLocOrErr)
6812 return ToBridgeKeywordLocOrErr.takeError();
6813 return new (Importer.getToContext()) ObjCBridgedCastExpr(
6814 *ToLParenLocOrErr, OCE->getBridgeKind(), E->getCastKind(),
6815 *ToBridgeKeywordLocOrErr, ToTypeInfoAsWritten, ToSubExpr);
Aleksei Sidorina693b372016-09-28 10:16:56 +00006816 }
6817 default:
Aleksei Sidorina693b372016-09-28 10:16:56 +00006818 llvm_unreachable("Cast expression of unsupported type!");
Balazs Keri3b30d652018-10-19 13:32:20 +00006819 return make_error<ImportError>(ImportError::UnsupportedConstruct);
Aleksei Sidorina693b372016-09-28 10:16:56 +00006820 }
6821}
6822
Balazs Keri3b30d652018-10-19 13:32:20 +00006823ExpectedStmt ASTNodeImporter::VisitOffsetOfExpr(OffsetOfExpr *E) {
6824 SmallVector<OffsetOfNode, 4> ToNodes;
6825 for (int I = 0, N = E->getNumComponents(); I < N; ++I) {
6826 const OffsetOfNode &FromNode = E->getComponent(I);
Aleksei Sidorina693b372016-09-28 10:16:56 +00006827
Balazs Keri3b30d652018-10-19 13:32:20 +00006828 SourceLocation ToBeginLoc, ToEndLoc;
6829 if (FromNode.getKind() != OffsetOfNode::Base) {
6830 auto Imp = importSeq(FromNode.getBeginLoc(), FromNode.getEndLoc());
6831 if (!Imp)
6832 return Imp.takeError();
6833 std::tie(ToBeginLoc, ToEndLoc) = *Imp;
6834 }
Aleksei Sidorina693b372016-09-28 10:16:56 +00006835
Balazs Keri3b30d652018-10-19 13:32:20 +00006836 switch (FromNode.getKind()) {
Aleksei Sidorina693b372016-09-28 10:16:56 +00006837 case OffsetOfNode::Array:
Balazs Keri3b30d652018-10-19 13:32:20 +00006838 ToNodes.push_back(
6839 OffsetOfNode(ToBeginLoc, FromNode.getArrayExprIndex(), ToEndLoc));
Aleksei Sidorina693b372016-09-28 10:16:56 +00006840 break;
Aleksei Sidorina693b372016-09-28 10:16:56 +00006841 case OffsetOfNode::Base: {
Balazs Keri3b30d652018-10-19 13:32:20 +00006842 auto ToBSOrErr = import(FromNode.getBase());
6843 if (!ToBSOrErr)
6844 return ToBSOrErr.takeError();
6845 ToNodes.push_back(OffsetOfNode(*ToBSOrErr));
Aleksei Sidorina693b372016-09-28 10:16:56 +00006846 break;
6847 }
6848 case OffsetOfNode::Field: {
Balazs Keri3b30d652018-10-19 13:32:20 +00006849 auto ToFieldOrErr = import(FromNode.getField());
6850 if (!ToFieldOrErr)
6851 return ToFieldOrErr.takeError();
6852 ToNodes.push_back(OffsetOfNode(ToBeginLoc, *ToFieldOrErr, ToEndLoc));
Aleksei Sidorina693b372016-09-28 10:16:56 +00006853 break;
6854 }
6855 case OffsetOfNode::Identifier: {
Balazs Keri3b30d652018-10-19 13:32:20 +00006856 IdentifierInfo *ToII = Importer.Import(FromNode.getFieldName());
6857 ToNodes.push_back(OffsetOfNode(ToBeginLoc, ToII, ToEndLoc));
Aleksei Sidorina693b372016-09-28 10:16:56 +00006858 break;
6859 }
6860 }
6861 }
6862
Balazs Keri3b30d652018-10-19 13:32:20 +00006863 SmallVector<Expr *, 4> ToExprs(E->getNumExpressions());
6864 for (int I = 0, N = E->getNumExpressions(); I < N; ++I) {
6865 ExpectedExpr ToIndexExprOrErr = import(E->getIndexExpr(I));
6866 if (!ToIndexExprOrErr)
6867 return ToIndexExprOrErr.takeError();
6868 ToExprs[I] = *ToIndexExprOrErr;
Aleksei Sidorina693b372016-09-28 10:16:56 +00006869 }
6870
Balazs Keri3b30d652018-10-19 13:32:20 +00006871 auto Imp = importSeq(
6872 E->getType(), E->getTypeSourceInfo(), E->getOperatorLoc(),
6873 E->getRParenLoc());
6874 if (!Imp)
6875 return Imp.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00006876
Balazs Keri3b30d652018-10-19 13:32:20 +00006877 QualType ToType;
6878 TypeSourceInfo *ToTypeSourceInfo;
6879 SourceLocation ToOperatorLoc, ToRParenLoc;
6880 std::tie(ToType, ToTypeSourceInfo, ToOperatorLoc, ToRParenLoc) = *Imp;
6881
6882 return OffsetOfExpr::Create(
6883 Importer.getToContext(), ToType, ToOperatorLoc, ToTypeSourceInfo, ToNodes,
6884 ToExprs, ToRParenLoc);
Aleksei Sidorina693b372016-09-28 10:16:56 +00006885}
6886
Balazs Keri3b30d652018-10-19 13:32:20 +00006887ExpectedStmt ASTNodeImporter::VisitCXXNoexceptExpr(CXXNoexceptExpr *E) {
6888 auto Imp = importSeq(
6889 E->getType(), E->getOperand(), E->getBeginLoc(), E->getEndLoc());
6890 if (!Imp)
6891 return Imp.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00006892
Balazs Keri3b30d652018-10-19 13:32:20 +00006893 QualType ToType;
6894 Expr *ToOperand;
6895 SourceLocation ToBeginLoc, ToEndLoc;
6896 std::tie(ToType, ToOperand, ToBeginLoc, ToEndLoc) = *Imp;
Aleksei Sidorina693b372016-09-28 10:16:56 +00006897
Balazs Keri3b30d652018-10-19 13:32:20 +00006898 CanThrowResult ToCanThrow;
Aleksei Sidorina693b372016-09-28 10:16:56 +00006899 if (E->isValueDependent())
Balazs Keri3b30d652018-10-19 13:32:20 +00006900 ToCanThrow = CT_Dependent;
Aleksei Sidorina693b372016-09-28 10:16:56 +00006901 else
Balazs Keri3b30d652018-10-19 13:32:20 +00006902 ToCanThrow = E->getValue() ? CT_Can : CT_Cannot;
Aleksei Sidorina693b372016-09-28 10:16:56 +00006903
Balazs Keri3b30d652018-10-19 13:32:20 +00006904 return new (Importer.getToContext()) CXXNoexceptExpr(
6905 ToType, ToOperand, ToCanThrow, ToBeginLoc, ToEndLoc);
Aleksei Sidorina693b372016-09-28 10:16:56 +00006906}
6907
Balazs Keri3b30d652018-10-19 13:32:20 +00006908ExpectedStmt ASTNodeImporter::VisitCXXThrowExpr(CXXThrowExpr *E) {
6909 auto Imp = importSeq(E->getSubExpr(), E->getType(), E->getThrowLoc());
6910 if (!Imp)
6911 return Imp.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00006912
Balazs Keri3b30d652018-10-19 13:32:20 +00006913 Expr *ToSubExpr;
6914 QualType ToType;
6915 SourceLocation ToThrowLoc;
6916 std::tie(ToSubExpr, ToType, ToThrowLoc) = *Imp;
Aleksei Sidorina693b372016-09-28 10:16:56 +00006917
6918 return new (Importer.getToContext()) CXXThrowExpr(
Balazs Keri3b30d652018-10-19 13:32:20 +00006919 ToSubExpr, ToType, ToThrowLoc, E->isThrownVariableInScope());
Aleksei Sidorina693b372016-09-28 10:16:56 +00006920}
6921
Balazs Keri3b30d652018-10-19 13:32:20 +00006922ExpectedStmt ASTNodeImporter::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
6923 ExpectedSLoc ToUsedLocOrErr = import(E->getUsedLocation());
6924 if (!ToUsedLocOrErr)
6925 return ToUsedLocOrErr.takeError();
6926
6927 auto ToParamOrErr = import(E->getParam());
6928 if (!ToParamOrErr)
6929 return ToParamOrErr.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00006930
Eric Fiselier708afb52019-05-16 21:04:15 +00006931 auto UsedContextOrErr = Importer.ImportContext(E->getUsedContext());
6932 if (!UsedContextOrErr)
6933 return UsedContextOrErr.takeError();
6934
Balazs Keric5095942019-08-14 09:41:39 +00006935 // Import the default arg if it was not imported yet.
6936 // This is needed because it can happen that during the import of the
6937 // default expression (from VisitParmVarDecl) the same ParmVarDecl is
6938 // encountered here. The default argument for a ParmVarDecl is set in the
6939 // ParmVarDecl only after it is imported (set in VisitParmVarDecl if not here,
6940 // see VisitParmVarDecl).
6941 ParmVarDecl *ToParam = *ToParamOrErr;
6942 if (!ToParam->getDefaultArg()) {
6943 Optional<ParmVarDecl *> FromParam = Importer.getImportedFromDecl(ToParam);
6944 assert(FromParam && "ParmVarDecl was not imported?");
6945
6946 if (Error Err = ImportDefaultArgOfParmVarDecl(*FromParam, ToParam))
6947 return std::move(Err);
6948 }
6949
6950 return CXXDefaultArgExpr::Create(Importer.getToContext(), *ToUsedLocOrErr,
6951 *ToParamOrErr, *UsedContextOrErr);
Aleksei Sidorina693b372016-09-28 10:16:56 +00006952}
6953
Balazs Keri3b30d652018-10-19 13:32:20 +00006954ExpectedStmt
6955ASTNodeImporter::VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E) {
6956 auto Imp = importSeq(
6957 E->getType(), E->getTypeSourceInfo(), E->getRParenLoc());
6958 if (!Imp)
6959 return Imp.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00006960
Balazs Keri3b30d652018-10-19 13:32:20 +00006961 QualType ToType;
6962 TypeSourceInfo *ToTypeSourceInfo;
6963 SourceLocation ToRParenLoc;
6964 std::tie(ToType, ToTypeSourceInfo, ToRParenLoc) = *Imp;
Aleksei Sidorina693b372016-09-28 10:16:56 +00006965
6966 return new (Importer.getToContext()) CXXScalarValueInitExpr(
Balazs Keri3b30d652018-10-19 13:32:20 +00006967 ToType, ToTypeSourceInfo, ToRParenLoc);
Aleksei Sidorina693b372016-09-28 10:16:56 +00006968}
6969
Balazs Keri3b30d652018-10-19 13:32:20 +00006970ExpectedStmt
6971ASTNodeImporter::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
6972 ExpectedExpr ToSubExprOrErr = import(E->getSubExpr());
6973 if (!ToSubExprOrErr)
6974 return ToSubExprOrErr.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00006975
Balazs Keri3b30d652018-10-19 13:32:20 +00006976 auto ToDtorOrErr = import(E->getTemporary()->getDestructor());
6977 if (!ToDtorOrErr)
6978 return ToDtorOrErr.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00006979
6980 ASTContext &ToCtx = Importer.getToContext();
Balazs Keri3b30d652018-10-19 13:32:20 +00006981 CXXTemporary *Temp = CXXTemporary::Create(ToCtx, *ToDtorOrErr);
6982 return CXXBindTemporaryExpr::Create(ToCtx, Temp, *ToSubExprOrErr);
Aleksei Sidorina693b372016-09-28 10:16:56 +00006983}
6984
Balazs Keri3b30d652018-10-19 13:32:20 +00006985ExpectedStmt
6986ASTNodeImporter::VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E) {
6987 auto Imp = importSeq(
6988 E->getConstructor(), E->getType(), E->getTypeSourceInfo(),
6989 E->getParenOrBraceRange());
6990 if (!Imp)
6991 return Imp.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00006992
Balazs Keri3b30d652018-10-19 13:32:20 +00006993 CXXConstructorDecl *ToConstructor;
6994 QualType ToType;
6995 TypeSourceInfo *ToTypeSourceInfo;
6996 SourceRange ToParenOrBraceRange;
6997 std::tie(ToConstructor, ToType, ToTypeSourceInfo, ToParenOrBraceRange) = *Imp;
Gabor Horvathc78d99a2018-01-27 16:11:45 +00006998
Balazs Keri3b30d652018-10-19 13:32:20 +00006999 SmallVector<Expr *, 8> ToArgs(E->getNumArgs());
7000 if (Error Err = ImportContainerChecked(E->arguments(), ToArgs))
7001 return std::move(Err);
Aleksei Sidorina693b372016-09-28 10:16:56 +00007002
Bruno Ricciddb8f6b2018-12-22 14:39:30 +00007003 return CXXTemporaryObjectExpr::Create(
Balazs Keri3b30d652018-10-19 13:32:20 +00007004 Importer.getToContext(), ToConstructor, ToType, ToTypeSourceInfo, ToArgs,
7005 ToParenOrBraceRange, E->hadMultipleCandidates(),
7006 E->isListInitialization(), E->isStdInitListInitialization(),
7007 E->requiresZeroInitialization());
Aleksei Sidorina693b372016-09-28 10:16:56 +00007008}
7009
Balazs Keri3b30d652018-10-19 13:32:20 +00007010ExpectedStmt
Aleksei Sidorina693b372016-09-28 10:16:56 +00007011ASTNodeImporter::VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *E) {
Balazs Keri3b30d652018-10-19 13:32:20 +00007012 auto Imp = importSeq(
7013 E->getType(), E->GetTemporaryExpr(), E->getExtendingDecl());
7014 if (!Imp)
7015 return Imp.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00007016
Balazs Keri3b30d652018-10-19 13:32:20 +00007017 QualType ToType;
7018 Expr *ToTemporaryExpr;
7019 const ValueDecl *ToExtendingDecl;
7020 std::tie(ToType, ToTemporaryExpr, ToExtendingDecl) = *Imp;
Aleksei Sidorina693b372016-09-28 10:16:56 +00007021
7022 auto *ToMTE = new (Importer.getToContext()) MaterializeTemporaryExpr(
Balazs Keri3b30d652018-10-19 13:32:20 +00007023 ToType, ToTemporaryExpr, E->isBoundToLvalueReference());
Aleksei Sidorina693b372016-09-28 10:16:56 +00007024
7025 // FIXME: Should ManglingNumber get numbers associated with 'to' context?
Balazs Keri3b30d652018-10-19 13:32:20 +00007026 ToMTE->setExtendingDecl(ToExtendingDecl, E->getManglingNumber());
Aleksei Sidorina693b372016-09-28 10:16:56 +00007027 return ToMTE;
7028}
7029
Balazs Keri3b30d652018-10-19 13:32:20 +00007030ExpectedStmt ASTNodeImporter::VisitPackExpansionExpr(PackExpansionExpr *E) {
7031 auto Imp = importSeq(
7032 E->getType(), E->getPattern(), E->getEllipsisLoc());
7033 if (!Imp)
7034 return Imp.takeError();
Gabor Horvath7a91c082017-11-14 11:30:38 +00007035
Balazs Keri3b30d652018-10-19 13:32:20 +00007036 QualType ToType;
7037 Expr *ToPattern;
7038 SourceLocation ToEllipsisLoc;
7039 std::tie(ToType, ToPattern, ToEllipsisLoc) = *Imp;
Gabor Horvath7a91c082017-11-14 11:30:38 +00007040
7041 return new (Importer.getToContext()) PackExpansionExpr(
Balazs Keri3b30d652018-10-19 13:32:20 +00007042 ToType, ToPattern, ToEllipsisLoc, E->getNumExpansions());
Gabor Horvath7a91c082017-11-14 11:30:38 +00007043}
7044
Balazs Keri3b30d652018-10-19 13:32:20 +00007045ExpectedStmt ASTNodeImporter::VisitSizeOfPackExpr(SizeOfPackExpr *E) {
7046 auto Imp = importSeq(
7047 E->getOperatorLoc(), E->getPack(), E->getPackLoc(), E->getRParenLoc());
7048 if (!Imp)
7049 return Imp.takeError();
7050
7051 SourceLocation ToOperatorLoc, ToPackLoc, ToRParenLoc;
7052 NamedDecl *ToPack;
7053 std::tie(ToOperatorLoc, ToPack, ToPackLoc, ToRParenLoc) = *Imp;
Gabor Horvathc78d99a2018-01-27 16:11:45 +00007054
7055 Optional<unsigned> Length;
Gabor Horvathc78d99a2018-01-27 16:11:45 +00007056 if (!E->isValueDependent())
7057 Length = E->getPackLength();
7058
Balazs Keri3b30d652018-10-19 13:32:20 +00007059 SmallVector<TemplateArgument, 8> ToPartialArguments;
Gabor Horvathc78d99a2018-01-27 16:11:45 +00007060 if (E->isPartiallySubstituted()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00007061 if (Error Err = ImportTemplateArguments(
7062 E->getPartialArguments().data(),
7063 E->getPartialArguments().size(),
7064 ToPartialArguments))
7065 return std::move(Err);
Gabor Horvathc78d99a2018-01-27 16:11:45 +00007066 }
7067
7068 return SizeOfPackExpr::Create(
Balazs Keri3b30d652018-10-19 13:32:20 +00007069 Importer.getToContext(), ToOperatorLoc, ToPack, ToPackLoc, ToRParenLoc,
7070 Length, ToPartialArguments);
Gabor Horvathc78d99a2018-01-27 16:11:45 +00007071}
7072
Aleksei Sidorina693b372016-09-28 10:16:56 +00007073
Balazs Keri3b30d652018-10-19 13:32:20 +00007074ExpectedStmt ASTNodeImporter::VisitCXXNewExpr(CXXNewExpr *E) {
7075 auto Imp = importSeq(
7076 E->getOperatorNew(), E->getOperatorDelete(), E->getTypeIdParens(),
7077 E->getArraySize(), E->getInitializer(), E->getType(),
7078 E->getAllocatedTypeSourceInfo(), E->getSourceRange(),
7079 E->getDirectInitRange());
7080 if (!Imp)
7081 return Imp.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00007082
Balazs Keri3b30d652018-10-19 13:32:20 +00007083 FunctionDecl *ToOperatorNew, *ToOperatorDelete;
7084 SourceRange ToTypeIdParens, ToSourceRange, ToDirectInitRange;
Richard Smithb9fb1212019-05-06 03:47:15 +00007085 Optional<Expr *> ToArraySize;
7086 Expr *ToInitializer;
Balazs Keri3b30d652018-10-19 13:32:20 +00007087 QualType ToType;
7088 TypeSourceInfo *ToAllocatedTypeSourceInfo;
7089 std::tie(
7090 ToOperatorNew, ToOperatorDelete, ToTypeIdParens, ToArraySize, ToInitializer,
7091 ToType, ToAllocatedTypeSourceInfo, ToSourceRange, ToDirectInitRange) = *Imp;
Aleksei Sidorina693b372016-09-28 10:16:56 +00007092
Balazs Keri3b30d652018-10-19 13:32:20 +00007093 SmallVector<Expr *, 4> ToPlacementArgs(E->getNumPlacementArgs());
7094 if (Error Err =
7095 ImportContainerChecked(E->placement_arguments(), ToPlacementArgs))
7096 return std::move(Err);
Aleksei Sidorina693b372016-09-28 10:16:56 +00007097
Bruno Ricci9b6dfac2019-01-07 15:04:45 +00007098 return CXXNewExpr::Create(
Balazs Keri3b30d652018-10-19 13:32:20 +00007099 Importer.getToContext(), E->isGlobalNew(), ToOperatorNew,
7100 ToOperatorDelete, E->passAlignment(), E->doesUsualArrayDeleteWantSize(),
7101 ToPlacementArgs, ToTypeIdParens, ToArraySize, E->getInitializationStyle(),
7102 ToInitializer, ToType, ToAllocatedTypeSourceInfo, ToSourceRange,
7103 ToDirectInitRange);
Aleksei Sidorina693b372016-09-28 10:16:56 +00007104}
7105
Balazs Keri3b30d652018-10-19 13:32:20 +00007106ExpectedStmt ASTNodeImporter::VisitCXXDeleteExpr(CXXDeleteExpr *E) {
7107 auto Imp = importSeq(
7108 E->getType(), E->getOperatorDelete(), E->getArgument(), E->getBeginLoc());
7109 if (!Imp)
7110 return Imp.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00007111
Balazs Keri3b30d652018-10-19 13:32:20 +00007112 QualType ToType;
7113 FunctionDecl *ToOperatorDelete;
7114 Expr *ToArgument;
7115 SourceLocation ToBeginLoc;
7116 std::tie(ToType, ToOperatorDelete, ToArgument, ToBeginLoc) = *Imp;
Aleksei Sidorina693b372016-09-28 10:16:56 +00007117
7118 return new (Importer.getToContext()) CXXDeleteExpr(
Balazs Keri3b30d652018-10-19 13:32:20 +00007119 ToType, E->isGlobalDelete(), E->isArrayForm(), E->isArrayFormAsWritten(),
7120 E->doesUsualArrayDeleteWantSize(), ToOperatorDelete, ToArgument,
7121 ToBeginLoc);
Douglas Gregor5481d322010-02-19 01:32:14 +00007122}
7123
Balazs Keri3b30d652018-10-19 13:32:20 +00007124ExpectedStmt ASTNodeImporter::VisitCXXConstructExpr(CXXConstructExpr *E) {
7125 auto Imp = importSeq(
7126 E->getType(), E->getLocation(), E->getConstructor(),
7127 E->getParenOrBraceRange());
7128 if (!Imp)
7129 return Imp.takeError();
Sean Callanan59721b32015-04-28 18:41:46 +00007130
Balazs Keri3b30d652018-10-19 13:32:20 +00007131 QualType ToType;
7132 SourceLocation ToLocation;
7133 CXXConstructorDecl *ToConstructor;
7134 SourceRange ToParenOrBraceRange;
7135 std::tie(ToType, ToLocation, ToConstructor, ToParenOrBraceRange) = *Imp;
Sean Callanan59721b32015-04-28 18:41:46 +00007136
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00007137 SmallVector<Expr *, 6> ToArgs(E->getNumArgs());
Balazs Keri3b30d652018-10-19 13:32:20 +00007138 if (Error Err = ImportContainerChecked(E->arguments(), ToArgs))
7139 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00007140
Balazs Keri3b30d652018-10-19 13:32:20 +00007141 return CXXConstructExpr::Create(
7142 Importer.getToContext(), ToType, ToLocation, ToConstructor,
7143 E->isElidable(), ToArgs, E->hadMultipleCandidates(),
7144 E->isListInitialization(), E->isStdInitListInitialization(),
7145 E->requiresZeroInitialization(), E->getConstructionKind(),
7146 ToParenOrBraceRange);
Sean Callanan59721b32015-04-28 18:41:46 +00007147}
7148
Balazs Keri3b30d652018-10-19 13:32:20 +00007149ExpectedStmt ASTNodeImporter::VisitExprWithCleanups(ExprWithCleanups *E) {
7150 ExpectedExpr ToSubExprOrErr = import(E->getSubExpr());
7151 if (!ToSubExprOrErr)
7152 return ToSubExprOrErr.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00007153
Balazs Keri3b30d652018-10-19 13:32:20 +00007154 SmallVector<ExprWithCleanups::CleanupObject, 8> ToObjects(E->getNumObjects());
7155 if (Error Err = ImportContainerChecked(E->getObjects(), ToObjects))
7156 return std::move(Err);
Aleksei Sidorina693b372016-09-28 10:16:56 +00007157
Balazs Keri3b30d652018-10-19 13:32:20 +00007158 return ExprWithCleanups::Create(
7159 Importer.getToContext(), *ToSubExprOrErr, E->cleanupsHaveSideEffects(),
7160 ToObjects);
Aleksei Sidorina693b372016-09-28 10:16:56 +00007161}
7162
Balazs Keri3b30d652018-10-19 13:32:20 +00007163ExpectedStmt ASTNodeImporter::VisitCXXMemberCallExpr(CXXMemberCallExpr *E) {
7164 auto Imp = importSeq(
7165 E->getCallee(), E->getType(), E->getRParenLoc());
7166 if (!Imp)
7167 return Imp.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00007168
Balazs Keri3b30d652018-10-19 13:32:20 +00007169 Expr *ToCallee;
7170 QualType ToType;
7171 SourceLocation ToRParenLoc;
7172 std::tie(ToCallee, ToType, ToRParenLoc) = *Imp;
Fangrui Song6907ce22018-07-30 19:24:48 +00007173
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00007174 SmallVector<Expr *, 4> ToArgs(E->getNumArgs());
Balazs Keri3b30d652018-10-19 13:32:20 +00007175 if (Error Err = ImportContainerChecked(E->arguments(), ToArgs))
7176 return std::move(Err);
Sean Callanan8bca9962016-03-28 21:43:01 +00007177
Bruno Riccic5885cf2018-12-21 15:20:32 +00007178 return CXXMemberCallExpr::Create(Importer.getToContext(), ToCallee, ToArgs,
7179 ToType, E->getValueKind(), ToRParenLoc);
Sean Callanan8bca9962016-03-28 21:43:01 +00007180}
7181
Balazs Keri3b30d652018-10-19 13:32:20 +00007182ExpectedStmt ASTNodeImporter::VisitCXXThisExpr(CXXThisExpr *E) {
7183 ExpectedType ToTypeOrErr = import(E->getType());
7184 if (!ToTypeOrErr)
7185 return ToTypeOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00007186
Balazs Keri3b30d652018-10-19 13:32:20 +00007187 ExpectedSLoc ToLocationOrErr = import(E->getLocation());
7188 if (!ToLocationOrErr)
7189 return ToLocationOrErr.takeError();
7190
7191 return new (Importer.getToContext()) CXXThisExpr(
7192 *ToLocationOrErr, *ToTypeOrErr, E->isImplicit());
Sean Callanan8bca9962016-03-28 21:43:01 +00007193}
7194
Balazs Keri3b30d652018-10-19 13:32:20 +00007195ExpectedStmt ASTNodeImporter::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
7196 ExpectedType ToTypeOrErr = import(E->getType());
7197 if (!ToTypeOrErr)
7198 return ToTypeOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00007199
Balazs Keri3b30d652018-10-19 13:32:20 +00007200 ExpectedSLoc ToLocationOrErr = import(E->getLocation());
7201 if (!ToLocationOrErr)
7202 return ToLocationOrErr.takeError();
7203
7204 return new (Importer.getToContext()) CXXBoolLiteralExpr(
7205 E->getValue(), *ToTypeOrErr, *ToLocationOrErr);
Sean Callanan8bca9962016-03-28 21:43:01 +00007206}
7207
Balazs Keri3b30d652018-10-19 13:32:20 +00007208ExpectedStmt ASTNodeImporter::VisitMemberExpr(MemberExpr *E) {
7209 auto Imp1 = importSeq(
7210 E->getBase(), E->getOperatorLoc(), E->getQualifierLoc(),
7211 E->getTemplateKeywordLoc(), E->getMemberDecl(), E->getType());
7212 if (!Imp1)
7213 return Imp1.takeError();
Sean Callanan8bca9962016-03-28 21:43:01 +00007214
Balazs Keri3b30d652018-10-19 13:32:20 +00007215 Expr *ToBase;
7216 SourceLocation ToOperatorLoc, ToTemplateKeywordLoc;
7217 NestedNameSpecifierLoc ToQualifierLoc;
7218 ValueDecl *ToMemberDecl;
7219 QualType ToType;
7220 std::tie(
7221 ToBase, ToOperatorLoc, ToQualifierLoc, ToTemplateKeywordLoc, ToMemberDecl,
7222 ToType) = *Imp1;
Sean Callanan59721b32015-04-28 18:41:46 +00007223
Balazs Keri3b30d652018-10-19 13:32:20 +00007224 auto Imp2 = importSeq(
7225 E->getFoundDecl().getDecl(), E->getMemberNameInfo().getName(),
7226 E->getMemberNameInfo().getLoc(), E->getLAngleLoc(), E->getRAngleLoc());
7227 if (!Imp2)
7228 return Imp2.takeError();
7229 NamedDecl *ToDecl;
7230 DeclarationName ToName;
7231 SourceLocation ToLoc, ToLAngleLoc, ToRAngleLoc;
7232 std::tie(ToDecl, ToName, ToLoc, ToLAngleLoc, ToRAngleLoc) = *Imp2;
Peter Szecsief972522018-05-02 11:52:54 +00007233
7234 DeclAccessPair ToFoundDecl =
7235 DeclAccessPair::make(ToDecl, E->getFoundDecl().getAccess());
Sean Callanan59721b32015-04-28 18:41:46 +00007236
Balazs Keri3b30d652018-10-19 13:32:20 +00007237 DeclarationNameInfo ToMemberNameInfo(ToName, ToLoc);
Sean Callanan59721b32015-04-28 18:41:46 +00007238
Gabor Marton5caba302019-03-07 13:38:20 +00007239 TemplateArgumentListInfo ToTAInfo, *ResInfo = nullptr;
Sean Callanan59721b32015-04-28 18:41:46 +00007240 if (E->hasExplicitTemplateArgs()) {
Gabor Marton5caba302019-03-07 13:38:20 +00007241 if (Error Err =
7242 ImportTemplateArgumentListInfo(E->getLAngleLoc(), E->getRAngleLoc(),
7243 E->template_arguments(), ToTAInfo))
7244 return std::move(Err);
7245 ResInfo = &ToTAInfo;
Sean Callanan59721b32015-04-28 18:41:46 +00007246 }
7247
Richard Smith1bbad592019-06-11 17:50:36 +00007248 return MemberExpr::Create(Importer.getToContext(), ToBase, E->isArrow(),
7249 ToOperatorLoc, ToQualifierLoc, ToTemplateKeywordLoc,
7250 ToMemberDecl, ToFoundDecl, ToMemberNameInfo,
7251 ResInfo, ToType, E->getValueKind(),
7252 E->getObjectKind(), E->isNonOdrUse());
Sean Callanan59721b32015-04-28 18:41:46 +00007253}
7254
Balazs Keri3b30d652018-10-19 13:32:20 +00007255ExpectedStmt
7256ASTNodeImporter::VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E) {
7257 auto Imp = importSeq(
7258 E->getBase(), E->getOperatorLoc(), E->getQualifierLoc(),
7259 E->getScopeTypeInfo(), E->getColonColonLoc(), E->getTildeLoc());
7260 if (!Imp)
7261 return Imp.takeError();
Aleksei Sidorin60ccb7d2017-11-27 10:30:00 +00007262
Balazs Keri3b30d652018-10-19 13:32:20 +00007263 Expr *ToBase;
7264 SourceLocation ToOperatorLoc, ToColonColonLoc, ToTildeLoc;
7265 NestedNameSpecifierLoc ToQualifierLoc;
7266 TypeSourceInfo *ToScopeTypeInfo;
7267 std::tie(
7268 ToBase, ToOperatorLoc, ToQualifierLoc, ToScopeTypeInfo, ToColonColonLoc,
7269 ToTildeLoc) = *Imp;
Aleksei Sidorin60ccb7d2017-11-27 10:30:00 +00007270
7271 PseudoDestructorTypeStorage Storage;
7272 if (IdentifierInfo *FromII = E->getDestroyedTypeIdentifier()) {
7273 IdentifierInfo *ToII = Importer.Import(FromII);
Balazs Keri3b30d652018-10-19 13:32:20 +00007274 ExpectedSLoc ToDestroyedTypeLocOrErr = import(E->getDestroyedTypeLoc());
7275 if (!ToDestroyedTypeLocOrErr)
7276 return ToDestroyedTypeLocOrErr.takeError();
7277 Storage = PseudoDestructorTypeStorage(ToII, *ToDestroyedTypeLocOrErr);
Aleksei Sidorin60ccb7d2017-11-27 10:30:00 +00007278 } else {
Balazs Keri3b30d652018-10-19 13:32:20 +00007279 if (auto ToTIOrErr = import(E->getDestroyedTypeInfo()))
7280 Storage = PseudoDestructorTypeStorage(*ToTIOrErr);
7281 else
7282 return ToTIOrErr.takeError();
Aleksei Sidorin60ccb7d2017-11-27 10:30:00 +00007283 }
7284
7285 return new (Importer.getToContext()) CXXPseudoDestructorExpr(
Balazs Keri3b30d652018-10-19 13:32:20 +00007286 Importer.getToContext(), ToBase, E->isArrow(), ToOperatorLoc,
7287 ToQualifierLoc, ToScopeTypeInfo, ToColonColonLoc, ToTildeLoc, Storage);
Aleksei Sidorin60ccb7d2017-11-27 10:30:00 +00007288}
7289
Balazs Keri3b30d652018-10-19 13:32:20 +00007290ExpectedStmt ASTNodeImporter::VisitCXXDependentScopeMemberExpr(
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00007291 CXXDependentScopeMemberExpr *E) {
Balazs Keri3b30d652018-10-19 13:32:20 +00007292 auto Imp = importSeq(
7293 E->getType(), E->getOperatorLoc(), E->getQualifierLoc(),
7294 E->getTemplateKeywordLoc(), E->getFirstQualifierFoundInScope());
7295 if (!Imp)
7296 return Imp.takeError();
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00007297
Balazs Keri3b30d652018-10-19 13:32:20 +00007298 QualType ToType;
7299 SourceLocation ToOperatorLoc, ToTemplateKeywordLoc;
7300 NestedNameSpecifierLoc ToQualifierLoc;
7301 NamedDecl *ToFirstQualifierFoundInScope;
7302 std::tie(
7303 ToType, ToOperatorLoc, ToQualifierLoc, ToTemplateKeywordLoc,
7304 ToFirstQualifierFoundInScope) = *Imp;
7305
7306 Expr *ToBase = nullptr;
7307 if (!E->isImplicitAccess()) {
7308 if (ExpectedExpr ToBaseOrErr = import(E->getBase()))
7309 ToBase = *ToBaseOrErr;
7310 else
7311 return ToBaseOrErr.takeError();
7312 }
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00007313
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00007314 TemplateArgumentListInfo ToTAInfo, *ResInfo = nullptr;
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00007315 if (E->hasExplicitTemplateArgs()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00007316 if (Error Err = ImportTemplateArgumentListInfo(
7317 E->getLAngleLoc(), E->getRAngleLoc(), E->template_arguments(),
7318 ToTAInfo))
7319 return std::move(Err);
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00007320 ResInfo = &ToTAInfo;
7321 }
7322
Balazs Keri3b30d652018-10-19 13:32:20 +00007323 auto ToMemberNameInfoOrErr = importSeq(E->getMember(), E->getMemberLoc());
7324 if (!ToMemberNameInfoOrErr)
7325 return ToMemberNameInfoOrErr.takeError();
7326 DeclarationNameInfo ToMemberNameInfo(
7327 std::get<0>(*ToMemberNameInfoOrErr), std::get<1>(*ToMemberNameInfoOrErr));
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00007328 // Import additional name location/type info.
Balazs Keri3b30d652018-10-19 13:32:20 +00007329 if (Error Err = ImportDeclarationNameLoc(
7330 E->getMemberNameInfo(), ToMemberNameInfo))
7331 return std::move(Err);
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00007332
7333 return CXXDependentScopeMemberExpr::Create(
Balazs Keri3b30d652018-10-19 13:32:20 +00007334 Importer.getToContext(), ToBase, ToType, E->isArrow(), ToOperatorLoc,
7335 ToQualifierLoc, ToTemplateKeywordLoc, ToFirstQualifierFoundInScope,
7336 ToMemberNameInfo, ResInfo);
Aleksei Sidorin7f758b62017-12-27 17:04:42 +00007337}
7338
Balazs Keri3b30d652018-10-19 13:32:20 +00007339ExpectedStmt
Peter Szecsice7f3182018-05-07 12:08:27 +00007340ASTNodeImporter::VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E) {
Balazs Keri3b30d652018-10-19 13:32:20 +00007341 auto Imp = importSeq(
7342 E->getQualifierLoc(), E->getTemplateKeywordLoc(), E->getDeclName(),
7343 E->getExprLoc(), E->getLAngleLoc(), E->getRAngleLoc());
7344 if (!Imp)
7345 return Imp.takeError();
Peter Szecsice7f3182018-05-07 12:08:27 +00007346
Balazs Keri3b30d652018-10-19 13:32:20 +00007347 NestedNameSpecifierLoc ToQualifierLoc;
7348 SourceLocation ToTemplateKeywordLoc, ToExprLoc, ToLAngleLoc, ToRAngleLoc;
7349 DeclarationName ToDeclName;
7350 std::tie(
7351 ToQualifierLoc, ToTemplateKeywordLoc, ToDeclName, ToExprLoc,
7352 ToLAngleLoc, ToRAngleLoc) = *Imp;
Peter Szecsice7f3182018-05-07 12:08:27 +00007353
Balazs Keri3b30d652018-10-19 13:32:20 +00007354 DeclarationNameInfo ToNameInfo(ToDeclName, ToExprLoc);
7355 if (Error Err = ImportDeclarationNameLoc(E->getNameInfo(), ToNameInfo))
7356 return std::move(Err);
7357
7358 TemplateArgumentListInfo ToTAInfo(ToLAngleLoc, ToRAngleLoc);
Peter Szecsice7f3182018-05-07 12:08:27 +00007359 TemplateArgumentListInfo *ResInfo = nullptr;
7360 if (E->hasExplicitTemplateArgs()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00007361 if (Error Err =
7362 ImportTemplateArgumentListInfo(E->template_arguments(), ToTAInfo))
7363 return std::move(Err);
Peter Szecsice7f3182018-05-07 12:08:27 +00007364 ResInfo = &ToTAInfo;
7365 }
7366
7367 return DependentScopeDeclRefExpr::Create(
Balazs Keri3b30d652018-10-19 13:32:20 +00007368 Importer.getToContext(), ToQualifierLoc, ToTemplateKeywordLoc,
7369 ToNameInfo, ResInfo);
Peter Szecsice7f3182018-05-07 12:08:27 +00007370}
7371
Balazs Keri3b30d652018-10-19 13:32:20 +00007372ExpectedStmt ASTNodeImporter::VisitCXXUnresolvedConstructExpr(
7373 CXXUnresolvedConstructExpr *E) {
7374 auto Imp = importSeq(
7375 E->getLParenLoc(), E->getRParenLoc(), E->getTypeSourceInfo());
7376 if (!Imp)
7377 return Imp.takeError();
Aleksei Sidorine267a0f2018-01-09 16:40:40 +00007378
Balazs Keri3b30d652018-10-19 13:32:20 +00007379 SourceLocation ToLParenLoc, ToRParenLoc;
7380 TypeSourceInfo *ToTypeSourceInfo;
7381 std::tie(ToLParenLoc, ToRParenLoc, ToTypeSourceInfo) = *Imp;
7382
7383 SmallVector<Expr *, 8> ToArgs(E->arg_size());
7384 if (Error Err =
7385 ImportArrayChecked(E->arg_begin(), E->arg_end(), ToArgs.begin()))
7386 return std::move(Err);
Aleksei Sidorine267a0f2018-01-09 16:40:40 +00007387
7388 return CXXUnresolvedConstructExpr::Create(
Balazs Keri3b30d652018-10-19 13:32:20 +00007389 Importer.getToContext(), ToTypeSourceInfo, ToLParenLoc,
7390 llvm::makeArrayRef(ToArgs), ToRParenLoc);
Aleksei Sidorine267a0f2018-01-09 16:40:40 +00007391}
7392
Balazs Keri3b30d652018-10-19 13:32:20 +00007393ExpectedStmt
7394ASTNodeImporter::VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E) {
7395 Expected<CXXRecordDecl *> ToNamingClassOrErr = import(E->getNamingClass());
7396 if (!ToNamingClassOrErr)
7397 return ToNamingClassOrErr.takeError();
Aleksei Sidorine267a0f2018-01-09 16:40:40 +00007398
Balazs Keri3b30d652018-10-19 13:32:20 +00007399 auto ToQualifierLocOrErr = import(E->getQualifierLoc());
7400 if (!ToQualifierLocOrErr)
7401 return ToQualifierLocOrErr.takeError();
Aleksei Sidorine267a0f2018-01-09 16:40:40 +00007402
Balazs Keri3b30d652018-10-19 13:32:20 +00007403 auto ToNameInfoOrErr = importSeq(E->getName(), E->getNameLoc());
7404 if (!ToNameInfoOrErr)
7405 return ToNameInfoOrErr.takeError();
7406 DeclarationNameInfo ToNameInfo(
7407 std::get<0>(*ToNameInfoOrErr), std::get<1>(*ToNameInfoOrErr));
Aleksei Sidorine267a0f2018-01-09 16:40:40 +00007408 // Import additional name location/type info.
Balazs Keri3b30d652018-10-19 13:32:20 +00007409 if (Error Err = ImportDeclarationNameLoc(E->getNameInfo(), ToNameInfo))
7410 return std::move(Err);
Aleksei Sidorine267a0f2018-01-09 16:40:40 +00007411
7412 UnresolvedSet<8> ToDecls;
Balazs Keri3b30d652018-10-19 13:32:20 +00007413 for (auto *D : E->decls())
7414 if (auto ToDOrErr = import(D))
7415 ToDecls.addDecl(cast<NamedDecl>(*ToDOrErr));
Aleksei Sidorine267a0f2018-01-09 16:40:40 +00007416 else
Balazs Keri3b30d652018-10-19 13:32:20 +00007417 return ToDOrErr.takeError();
Aleksei Sidorine267a0f2018-01-09 16:40:40 +00007418
Balazs Keri3b30d652018-10-19 13:32:20 +00007419 if (E->hasExplicitTemplateArgs() && E->getTemplateKeywordLoc().isValid()) {
7420 TemplateArgumentListInfo ToTAInfo;
7421 if (Error Err = ImportTemplateArgumentListInfo(
7422 E->getLAngleLoc(), E->getRAngleLoc(), E->template_arguments(),
7423 ToTAInfo))
7424 return std::move(Err);
Aleksei Sidorine267a0f2018-01-09 16:40:40 +00007425
Balazs Keri3b30d652018-10-19 13:32:20 +00007426 ExpectedSLoc ToTemplateKeywordLocOrErr = import(E->getTemplateKeywordLoc());
7427 if (!ToTemplateKeywordLocOrErr)
7428 return ToTemplateKeywordLocOrErr.takeError();
7429
Aleksei Sidorine267a0f2018-01-09 16:40:40 +00007430 return UnresolvedLookupExpr::Create(
Balazs Keri3b30d652018-10-19 13:32:20 +00007431 Importer.getToContext(), *ToNamingClassOrErr, *ToQualifierLocOrErr,
7432 *ToTemplateKeywordLocOrErr, ToNameInfo, E->requiresADL(), &ToTAInfo,
7433 ToDecls.begin(), ToDecls.end());
7434 }
Aleksei Sidorine267a0f2018-01-09 16:40:40 +00007435
7436 return UnresolvedLookupExpr::Create(
Balazs Keri3b30d652018-10-19 13:32:20 +00007437 Importer.getToContext(), *ToNamingClassOrErr, *ToQualifierLocOrErr,
7438 ToNameInfo, E->requiresADL(), E->isOverloaded(), ToDecls.begin(),
7439 ToDecls.end());
Aleksei Sidorine267a0f2018-01-09 16:40:40 +00007440}
7441
Balazs Keri3b30d652018-10-19 13:32:20 +00007442ExpectedStmt
7443ASTNodeImporter::VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E) {
7444 auto Imp1 = importSeq(
7445 E->getType(), E->getOperatorLoc(), E->getQualifierLoc(),
7446 E->getTemplateKeywordLoc());
7447 if (!Imp1)
7448 return Imp1.takeError();
Peter Szecsice7f3182018-05-07 12:08:27 +00007449
Balazs Keri3b30d652018-10-19 13:32:20 +00007450 QualType ToType;
7451 SourceLocation ToOperatorLoc, ToTemplateKeywordLoc;
7452 NestedNameSpecifierLoc ToQualifierLoc;
7453 std::tie(ToType, ToOperatorLoc, ToQualifierLoc, ToTemplateKeywordLoc) = *Imp1;
7454
7455 auto Imp2 = importSeq(E->getName(), E->getNameLoc());
7456 if (!Imp2)
7457 return Imp2.takeError();
7458 DeclarationNameInfo ToNameInfo(std::get<0>(*Imp2), std::get<1>(*Imp2));
7459 // Import additional name location/type info.
7460 if (Error Err = ImportDeclarationNameLoc(E->getNameInfo(), ToNameInfo))
7461 return std::move(Err);
Peter Szecsice7f3182018-05-07 12:08:27 +00007462
7463 UnresolvedSet<8> ToDecls;
Balazs Keri3b30d652018-10-19 13:32:20 +00007464 for (Decl *D : E->decls())
7465 if (auto ToDOrErr = import(D))
7466 ToDecls.addDecl(cast<NamedDecl>(*ToDOrErr));
Peter Szecsice7f3182018-05-07 12:08:27 +00007467 else
Balazs Keri3b30d652018-10-19 13:32:20 +00007468 return ToDOrErr.takeError();
Peter Szecsice7f3182018-05-07 12:08:27 +00007469
7470 TemplateArgumentListInfo ToTAInfo;
7471 TemplateArgumentListInfo *ResInfo = nullptr;
7472 if (E->hasExplicitTemplateArgs()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00007473 if (Error Err =
7474 ImportTemplateArgumentListInfo(E->template_arguments(), ToTAInfo))
7475 return std::move(Err);
Peter Szecsice7f3182018-05-07 12:08:27 +00007476 ResInfo = &ToTAInfo;
7477 }
7478
Balazs Keri3b30d652018-10-19 13:32:20 +00007479 Expr *ToBase = nullptr;
7480 if (!E->isImplicitAccess()) {
7481 if (ExpectedExpr ToBaseOrErr = import(E->getBase()))
7482 ToBase = *ToBaseOrErr;
7483 else
7484 return ToBaseOrErr.takeError();
Peter Szecsice7f3182018-05-07 12:08:27 +00007485 }
7486
7487 return UnresolvedMemberExpr::Create(
Balazs Keri3b30d652018-10-19 13:32:20 +00007488 Importer.getToContext(), E->hasUnresolvedUsing(), ToBase, ToType,
7489 E->isArrow(), ToOperatorLoc, ToQualifierLoc, ToTemplateKeywordLoc,
7490 ToNameInfo, ResInfo, ToDecls.begin(), ToDecls.end());
Peter Szecsice7f3182018-05-07 12:08:27 +00007491}
7492
Balazs Keri3b30d652018-10-19 13:32:20 +00007493ExpectedStmt ASTNodeImporter::VisitCallExpr(CallExpr *E) {
7494 auto Imp = importSeq(E->getCallee(), E->getType(), E->getRParenLoc());
7495 if (!Imp)
7496 return Imp.takeError();
Sean Callanan59721b32015-04-28 18:41:46 +00007497
Balazs Keri3b30d652018-10-19 13:32:20 +00007498 Expr *ToCallee;
7499 QualType ToType;
7500 SourceLocation ToRParenLoc;
7501 std::tie(ToCallee, ToType, ToRParenLoc) = *Imp;
Sean Callanan59721b32015-04-28 18:41:46 +00007502
7503 unsigned NumArgs = E->getNumArgs();
Balazs Keri3b30d652018-10-19 13:32:20 +00007504 llvm::SmallVector<Expr *, 2> ToArgs(NumArgs);
7505 if (Error Err = ImportContainerChecked(E->arguments(), ToArgs))
7506 return std::move(Err);
Sean Callanan59721b32015-04-28 18:41:46 +00007507
Gabor Horvathc78d99a2018-01-27 16:11:45 +00007508 if (const auto *OCE = dyn_cast<CXXOperatorCallExpr>(E)) {
Bruno Riccic5885cf2018-12-21 15:20:32 +00007509 return CXXOperatorCallExpr::Create(
Balazs Keri3b30d652018-10-19 13:32:20 +00007510 Importer.getToContext(), OCE->getOperator(), ToCallee, ToArgs, ToType,
Eric Fiselier5cdc2cd2018-12-12 21:50:55 +00007511 OCE->getValueKind(), ToRParenLoc, OCE->getFPFeatures(),
7512 OCE->getADLCallKind());
Gabor Horvathc78d99a2018-01-27 16:11:45 +00007513 }
7514
Bruno Riccic5885cf2018-12-21 15:20:32 +00007515 return CallExpr::Create(Importer.getToContext(), ToCallee, ToArgs, ToType,
7516 E->getValueKind(), ToRParenLoc, /*MinNumArgs=*/0,
7517 E->getADLCallKind());
Sean Callanan59721b32015-04-28 18:41:46 +00007518}
7519
Balazs Keri3b30d652018-10-19 13:32:20 +00007520ExpectedStmt ASTNodeImporter::VisitLambdaExpr(LambdaExpr *E) {
7521 CXXRecordDecl *FromClass = E->getLambdaClass();
7522 auto ToClassOrErr = import(FromClass);
7523 if (!ToClassOrErr)
7524 return ToClassOrErr.takeError();
7525 CXXRecordDecl *ToClass = *ToClassOrErr;
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00007526
Balazs Keri3b30d652018-10-19 13:32:20 +00007527 auto ToCallOpOrErr = import(E->getCallOperator());
7528 if (!ToCallOpOrErr)
7529 return ToCallOpOrErr.takeError();
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00007530
Balazs Keri3b30d652018-10-19 13:32:20 +00007531 SmallVector<LambdaCapture, 8> ToCaptures;
7532 ToCaptures.reserve(E->capture_size());
7533 for (const auto &FromCapture : E->captures()) {
7534 if (auto ToCaptureOrErr = import(FromCapture))
7535 ToCaptures.push_back(*ToCaptureOrErr);
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00007536 else
Balazs Keri3b30d652018-10-19 13:32:20 +00007537 return ToCaptureOrErr.takeError();
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00007538 }
7539
Balazs Keri3b30d652018-10-19 13:32:20 +00007540 SmallVector<Expr *, 8> ToCaptureInits(E->capture_size());
7541 if (Error Err = ImportContainerChecked(E->capture_inits(), ToCaptureInits))
7542 return std::move(Err);
7543
7544 auto Imp = importSeq(
7545 E->getIntroducerRange(), E->getCaptureDefaultLoc(), E->getEndLoc());
7546 if (!Imp)
7547 return Imp.takeError();
7548
7549 SourceRange ToIntroducerRange;
7550 SourceLocation ToCaptureDefaultLoc, ToEndLoc;
7551 std::tie(ToIntroducerRange, ToCaptureDefaultLoc, ToEndLoc) = *Imp;
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00007552
Stephen Kelly1c301dc2018-08-09 21:09:38 +00007553 return LambdaExpr::Create(
Balazs Keri3b30d652018-10-19 13:32:20 +00007554 Importer.getToContext(), ToClass, ToIntroducerRange,
7555 E->getCaptureDefault(), ToCaptureDefaultLoc, ToCaptures,
7556 E->hasExplicitParameters(), E->hasExplicitResultType(), ToCaptureInits,
7557 ToEndLoc, E->containsUnexpandedParameterPack());
Aleksei Sidorin8fc85102018-01-26 11:36:54 +00007558}
7559
Sean Callanan8bca9962016-03-28 21:43:01 +00007560
Balazs Keri3b30d652018-10-19 13:32:20 +00007561ExpectedStmt ASTNodeImporter::VisitInitListExpr(InitListExpr *E) {
7562 auto Imp = importSeq(E->getLBraceLoc(), E->getRBraceLoc(), E->getType());
7563 if (!Imp)
7564 return Imp.takeError();
7565
7566 SourceLocation ToLBraceLoc, ToRBraceLoc;
7567 QualType ToType;
7568 std::tie(ToLBraceLoc, ToRBraceLoc, ToType) = *Imp;
7569
7570 SmallVector<Expr *, 4> ToExprs(E->getNumInits());
7571 if (Error Err = ImportContainerChecked(E->inits(), ToExprs))
7572 return std::move(Err);
Sean Callanan8bca9962016-03-28 21:43:01 +00007573
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00007574 ASTContext &ToCtx = Importer.getToContext();
7575 InitListExpr *To = new (ToCtx) InitListExpr(
Balazs Keri3b30d652018-10-19 13:32:20 +00007576 ToCtx, ToLBraceLoc, ToExprs, ToRBraceLoc);
7577 To->setType(ToType);
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00007578
Balazs Keri3b30d652018-10-19 13:32:20 +00007579 if (E->hasArrayFiller()) {
7580 if (ExpectedExpr ToFillerOrErr = import(E->getArrayFiller()))
7581 To->setArrayFiller(*ToFillerOrErr);
7582 else
7583 return ToFillerOrErr.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00007584 }
7585
Balazs Keri3b30d652018-10-19 13:32:20 +00007586 if (FieldDecl *FromFD = E->getInitializedFieldInUnion()) {
7587 if (auto ToFDOrErr = import(FromFD))
7588 To->setInitializedFieldInUnion(*ToFDOrErr);
7589 else
7590 return ToFDOrErr.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00007591 }
7592
Balazs Keri3b30d652018-10-19 13:32:20 +00007593 if (InitListExpr *SyntForm = E->getSyntacticForm()) {
7594 if (auto ToSyntFormOrErr = import(SyntForm))
7595 To->setSyntacticForm(*ToSyntFormOrErr);
7596 else
7597 return ToSyntFormOrErr.takeError();
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00007598 }
7599
Gabor Martona20ce602018-09-03 13:10:53 +00007600 // Copy InitListExprBitfields, which are not handled in the ctor of
7601 // InitListExpr.
Balazs Keri3b30d652018-10-19 13:32:20 +00007602 To->sawArrayRangeDesignator(E->hadArrayRangeDesignator());
Artem Dergachev4e7c6fd2016-04-14 11:51:27 +00007603
7604 return To;
Sean Callanan8bca9962016-03-28 21:43:01 +00007605}
7606
Balazs Keri3b30d652018-10-19 13:32:20 +00007607ExpectedStmt ASTNodeImporter::VisitCXXStdInitializerListExpr(
Gabor Marton07b01ff2018-06-29 12:17:34 +00007608 CXXStdInitializerListExpr *E) {
Balazs Keri3b30d652018-10-19 13:32:20 +00007609 ExpectedType ToTypeOrErr = import(E->getType());
7610 if (!ToTypeOrErr)
7611 return ToTypeOrErr.takeError();
Gabor Marton07b01ff2018-06-29 12:17:34 +00007612
Balazs Keri3b30d652018-10-19 13:32:20 +00007613 ExpectedExpr ToSubExprOrErr = import(E->getSubExpr());
7614 if (!ToSubExprOrErr)
7615 return ToSubExprOrErr.takeError();
Gabor Marton07b01ff2018-06-29 12:17:34 +00007616
Balazs Keri3b30d652018-10-19 13:32:20 +00007617 return new (Importer.getToContext()) CXXStdInitializerListExpr(
7618 *ToTypeOrErr, *ToSubExprOrErr);
Gabor Marton07b01ff2018-06-29 12:17:34 +00007619}
7620
Balazs Keri3b30d652018-10-19 13:32:20 +00007621ExpectedStmt ASTNodeImporter::VisitCXXInheritedCtorInitExpr(
Balazs Keri95baa842018-07-25 10:21:06 +00007622 CXXInheritedCtorInitExpr *E) {
Balazs Keri3b30d652018-10-19 13:32:20 +00007623 auto Imp = importSeq(E->getLocation(), E->getType(), E->getConstructor());
7624 if (!Imp)
7625 return Imp.takeError();
Balazs Keri95baa842018-07-25 10:21:06 +00007626
Balazs Keri3b30d652018-10-19 13:32:20 +00007627 SourceLocation ToLocation;
7628 QualType ToType;
7629 CXXConstructorDecl *ToConstructor;
7630 std::tie(ToLocation, ToType, ToConstructor) = *Imp;
Balazs Keri95baa842018-07-25 10:21:06 +00007631
7632 return new (Importer.getToContext()) CXXInheritedCtorInitExpr(
Balazs Keri3b30d652018-10-19 13:32:20 +00007633 ToLocation, ToType, ToConstructor, E->constructsVBase(),
7634 E->inheritedFromVBase());
Balazs Keri95baa842018-07-25 10:21:06 +00007635}
7636
Balazs Keri3b30d652018-10-19 13:32:20 +00007637ExpectedStmt ASTNodeImporter::VisitArrayInitLoopExpr(ArrayInitLoopExpr *E) {
7638 auto Imp = importSeq(E->getType(), E->getCommonExpr(), E->getSubExpr());
7639 if (!Imp)
7640 return Imp.takeError();
Richard Smith30e304e2016-12-14 00:03:17 +00007641
Balazs Keri3b30d652018-10-19 13:32:20 +00007642 QualType ToType;
7643 Expr *ToCommonExpr, *ToSubExpr;
7644 std::tie(ToType, ToCommonExpr, ToSubExpr) = *Imp;
Richard Smith30e304e2016-12-14 00:03:17 +00007645
Balazs Keri3b30d652018-10-19 13:32:20 +00007646 return new (Importer.getToContext()) ArrayInitLoopExpr(
7647 ToType, ToCommonExpr, ToSubExpr);
Richard Smith30e304e2016-12-14 00:03:17 +00007648}
7649
Balazs Keri3b30d652018-10-19 13:32:20 +00007650ExpectedStmt ASTNodeImporter::VisitArrayInitIndexExpr(ArrayInitIndexExpr *E) {
7651 ExpectedType ToTypeOrErr = import(E->getType());
7652 if (!ToTypeOrErr)
7653 return ToTypeOrErr.takeError();
7654 return new (Importer.getToContext()) ArrayInitIndexExpr(*ToTypeOrErr);
Richard Smith30e304e2016-12-14 00:03:17 +00007655}
7656
Balazs Keri3b30d652018-10-19 13:32:20 +00007657ExpectedStmt ASTNodeImporter::VisitCXXDefaultInitExpr(CXXDefaultInitExpr *E) {
7658 ExpectedSLoc ToBeginLocOrErr = import(E->getBeginLoc());
7659 if (!ToBeginLocOrErr)
7660 return ToBeginLocOrErr.takeError();
7661
7662 auto ToFieldOrErr = import(E->getField());
7663 if (!ToFieldOrErr)
7664 return ToFieldOrErr.takeError();
Sean Callanandd2c1742016-05-16 20:48:03 +00007665
Eric Fiselier708afb52019-05-16 21:04:15 +00007666 auto UsedContextOrErr = Importer.ImportContext(E->getUsedContext());
7667 if (!UsedContextOrErr)
7668 return UsedContextOrErr.takeError();
7669
Sean Callanandd2c1742016-05-16 20:48:03 +00007670 return CXXDefaultInitExpr::Create(
Eric Fiselier708afb52019-05-16 21:04:15 +00007671 Importer.getToContext(), *ToBeginLocOrErr, *ToFieldOrErr, *UsedContextOrErr);
Sean Callanandd2c1742016-05-16 20:48:03 +00007672}
7673
Balazs Keri3b30d652018-10-19 13:32:20 +00007674ExpectedStmt ASTNodeImporter::VisitCXXNamedCastExpr(CXXNamedCastExpr *E) {
7675 auto Imp = importSeq(
7676 E->getType(), E->getSubExpr(), E->getTypeInfoAsWritten(),
7677 E->getOperatorLoc(), E->getRParenLoc(), E->getAngleBrackets());
7678 if (!Imp)
7679 return Imp.takeError();
7680
7681 QualType ToType;
7682 Expr *ToSubExpr;
7683 TypeSourceInfo *ToTypeInfoAsWritten;
7684 SourceLocation ToOperatorLoc, ToRParenLoc;
7685 SourceRange ToAngleBrackets;
7686 std::tie(
7687 ToType, ToSubExpr, ToTypeInfoAsWritten, ToOperatorLoc, ToRParenLoc,
7688 ToAngleBrackets) = *Imp;
7689
Sean Callanandd2c1742016-05-16 20:48:03 +00007690 ExprValueKind VK = E->getValueKind();
7691 CastKind CK = E->getCastKind();
Balazs Keri3b30d652018-10-19 13:32:20 +00007692 auto ToBasePathOrErr = ImportCastPath(E);
7693 if (!ToBasePathOrErr)
7694 return ToBasePathOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00007695
Sean Callanandd2c1742016-05-16 20:48:03 +00007696 if (isa<CXXStaticCastExpr>(E)) {
7697 return CXXStaticCastExpr::Create(
Balazs Keri3b30d652018-10-19 13:32:20 +00007698 Importer.getToContext(), ToType, VK, CK, ToSubExpr, &(*ToBasePathOrErr),
7699 ToTypeInfoAsWritten, ToOperatorLoc, ToRParenLoc, ToAngleBrackets);
Sean Callanandd2c1742016-05-16 20:48:03 +00007700 } else if (isa<CXXDynamicCastExpr>(E)) {
7701 return CXXDynamicCastExpr::Create(
Balazs Keri3b30d652018-10-19 13:32:20 +00007702 Importer.getToContext(), ToType, VK, CK, ToSubExpr, &(*ToBasePathOrErr),
7703 ToTypeInfoAsWritten, ToOperatorLoc, ToRParenLoc, ToAngleBrackets);
Sean Callanandd2c1742016-05-16 20:48:03 +00007704 } else if (isa<CXXReinterpretCastExpr>(E)) {
7705 return CXXReinterpretCastExpr::Create(
Balazs Keri3b30d652018-10-19 13:32:20 +00007706 Importer.getToContext(), ToType, VK, CK, ToSubExpr, &(*ToBasePathOrErr),
7707 ToTypeInfoAsWritten, ToOperatorLoc, ToRParenLoc, ToAngleBrackets);
Raphael Isemannc705bb82018-08-20 16:20:01 +00007708 } else if (isa<CXXConstCastExpr>(E)) {
Balazs Keri3b30d652018-10-19 13:32:20 +00007709 return CXXConstCastExpr::Create(
7710 Importer.getToContext(), ToType, VK, ToSubExpr, ToTypeInfoAsWritten,
7711 ToOperatorLoc, ToRParenLoc, ToAngleBrackets);
Sean Callanandd2c1742016-05-16 20:48:03 +00007712 } else {
Balazs Keri3b30d652018-10-19 13:32:20 +00007713 llvm_unreachable("Unknown cast type");
7714 return make_error<ImportError>();
Sean Callanandd2c1742016-05-16 20:48:03 +00007715 }
7716}
7717
Balazs Keri3b30d652018-10-19 13:32:20 +00007718ExpectedStmt ASTNodeImporter::VisitSubstNonTypeTemplateParmExpr(
Aleksei Sidorin855086d2017-01-23 09:30:36 +00007719 SubstNonTypeTemplateParmExpr *E) {
Balazs Keri3b30d652018-10-19 13:32:20 +00007720 auto Imp = importSeq(
7721 E->getType(), E->getExprLoc(), E->getParameter(), E->getReplacement());
7722 if (!Imp)
7723 return Imp.takeError();
Aleksei Sidorin855086d2017-01-23 09:30:36 +00007724
Balazs Keri3b30d652018-10-19 13:32:20 +00007725 QualType ToType;
7726 SourceLocation ToExprLoc;
7727 NonTypeTemplateParmDecl *ToParameter;
7728 Expr *ToReplacement;
7729 std::tie(ToType, ToExprLoc, ToParameter, ToReplacement) = *Imp;
Aleksei Sidorin855086d2017-01-23 09:30:36 +00007730
7731 return new (Importer.getToContext()) SubstNonTypeTemplateParmExpr(
Balazs Keri3b30d652018-10-19 13:32:20 +00007732 ToType, E->getValueKind(), ToExprLoc, ToParameter, ToReplacement);
Aleksei Sidorin855086d2017-01-23 09:30:36 +00007733}
7734
Balazs Keri3b30d652018-10-19 13:32:20 +00007735ExpectedStmt ASTNodeImporter::VisitTypeTraitExpr(TypeTraitExpr *E) {
7736 auto Imp = importSeq(
7737 E->getType(), E->getBeginLoc(), E->getEndLoc());
7738 if (!Imp)
7739 return Imp.takeError();
7740
7741 QualType ToType;
7742 SourceLocation ToBeginLoc, ToEndLoc;
7743 std::tie(ToType, ToBeginLoc, ToEndLoc) = *Imp;
Aleksei Sidorinb05f37a2017-11-26 17:04:06 +00007744
7745 SmallVector<TypeSourceInfo *, 4> ToArgs(E->getNumArgs());
Balazs Keri3b30d652018-10-19 13:32:20 +00007746 if (Error Err = ImportContainerChecked(E->getArgs(), ToArgs))
7747 return std::move(Err);
Aleksei Sidorinb05f37a2017-11-26 17:04:06 +00007748
7749 // According to Sema::BuildTypeTrait(), if E is value-dependent,
7750 // Value is always false.
Balazs Keri3b30d652018-10-19 13:32:20 +00007751 bool ToValue = (E->isValueDependent() ? false : E->getValue());
Aleksei Sidorinb05f37a2017-11-26 17:04:06 +00007752
7753 return TypeTraitExpr::Create(
Balazs Keri3b30d652018-10-19 13:32:20 +00007754 Importer.getToContext(), ToType, ToBeginLoc, E->getTrait(), ToArgs,
7755 ToEndLoc, ToValue);
Aleksei Sidorinb05f37a2017-11-26 17:04:06 +00007756}
7757
Balazs Keri3b30d652018-10-19 13:32:20 +00007758ExpectedStmt ASTNodeImporter::VisitCXXTypeidExpr(CXXTypeidExpr *E) {
7759 ExpectedType ToTypeOrErr = import(E->getType());
7760 if (!ToTypeOrErr)
7761 return ToTypeOrErr.takeError();
7762
7763 auto ToSourceRangeOrErr = import(E->getSourceRange());
7764 if (!ToSourceRangeOrErr)
7765 return ToSourceRangeOrErr.takeError();
Gabor Horvathc78d99a2018-01-27 16:11:45 +00007766
7767 if (E->isTypeOperand()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00007768 if (auto ToTSIOrErr = import(E->getTypeOperandSourceInfo()))
7769 return new (Importer.getToContext()) CXXTypeidExpr(
7770 *ToTypeOrErr, *ToTSIOrErr, *ToSourceRangeOrErr);
7771 else
7772 return ToTSIOrErr.takeError();
Gabor Horvathc78d99a2018-01-27 16:11:45 +00007773 }
7774
Balazs Keri3b30d652018-10-19 13:32:20 +00007775 ExpectedExpr ToExprOperandOrErr = import(E->getExprOperand());
7776 if (!ToExprOperandOrErr)
7777 return ToExprOperandOrErr.takeError();
Gabor Horvathc78d99a2018-01-27 16:11:45 +00007778
Balazs Keri3b30d652018-10-19 13:32:20 +00007779 return new (Importer.getToContext()) CXXTypeidExpr(
7780 *ToTypeOrErr, *ToExprOperandOrErr, *ToSourceRangeOrErr);
Gabor Horvathc78d99a2018-01-27 16:11:45 +00007781}
7782
Balazs Kerib4fd7d42019-08-30 10:12:14 +00007783Error ASTNodeImporter::ImportOverriddenMethods(CXXMethodDecl *ToMethod,
7784 CXXMethodDecl *FromMethod) {
7785 Error ImportErrors = Error::success();
Balazs Keri3b30d652018-10-19 13:32:20 +00007786 for (auto *FromOverriddenMethod : FromMethod->overridden_methods()) {
7787 if (auto ImportedOrErr = import(FromOverriddenMethod))
7788 ToMethod->getCanonicalDecl()->addOverriddenMethod(cast<CXXMethodDecl>(
7789 (*ImportedOrErr)->getCanonicalDecl()));
7790 else
Balazs Kerib4fd7d42019-08-30 10:12:14 +00007791 ImportErrors =
7792 joinErrors(std::move(ImportErrors), ImportedOrErr.takeError());
Balazs Keri3b30d652018-10-19 13:32:20 +00007793 }
Balazs Kerib4fd7d42019-08-30 10:12:14 +00007794 return ImportErrors;
Lang Hames19e07e12017-06-20 21:06:00 +00007795}
7796
Argyrios Kyrtzidisd0040642010-11-18 20:06:41 +00007797ASTImporter::ASTImporter(ASTContext &ToContext, FileManager &ToFileManager,
Douglas Gregor0a791672011-01-18 03:11:38 +00007798 ASTContext &FromContext, FileManager &FromFileManager,
Gabor Marton54058b52018-12-17 13:53:12 +00007799 bool MinimalImport,
Gabor Marton2afbfb62019-07-01 15:37:07 +00007800 std::shared_ptr<ASTImporterSharedState> SharedState)
7801 : SharedState(SharedState), ToContext(ToContext), FromContext(FromContext),
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00007802 ToFileManager(ToFileManager), FromFileManager(FromFileManager),
Gabor Martonf035b752019-08-27 11:36:10 +00007803 Minimal(MinimalImport), ODRHandling(ODRHandlingType::Conservative) {
Gabor Marton54058b52018-12-17 13:53:12 +00007804
Gabor Marton2afbfb62019-07-01 15:37:07 +00007805 // Create a default state without the lookup table: LLDB case.
7806 if (!SharedState) {
7807 this->SharedState = std::make_shared<ASTImporterSharedState>();
7808 }
7809
Gabor Marton54058b52018-12-17 13:53:12 +00007810 ImportedDecls[FromContext.getTranslationUnitDecl()] =
7811 ToContext.getTranslationUnitDecl();
Douglas Gregor62d311f2010-02-09 19:21:46 +00007812}
7813
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00007814ASTImporter::~ASTImporter() = default;
Douglas Gregor96e578d2010-02-05 17:54:41 +00007815
Gabor Marton54058b52018-12-17 13:53:12 +00007816Optional<unsigned> ASTImporter::getFieldIndex(Decl *F) {
7817 assert(F && (isa<FieldDecl>(*F) || isa<IndirectFieldDecl>(*F)) &&
7818 "Try to get field index for non-field.");
7819
7820 auto *Owner = dyn_cast<RecordDecl>(F->getDeclContext());
7821 if (!Owner)
7822 return None;
7823
7824 unsigned Index = 0;
7825 for (const auto *D : Owner->decls()) {
7826 if (D == F)
7827 return Index;
7828
7829 if (isa<FieldDecl>(*D) || isa<IndirectFieldDecl>(*D))
7830 ++Index;
7831 }
7832
7833 llvm_unreachable("Field was not found in its parent context.");
7834
7835 return None;
7836}
7837
7838ASTImporter::FoundDeclsTy
7839ASTImporter::findDeclsInToCtx(DeclContext *DC, DeclarationName Name) {
7840 // We search in the redecl context because of transparent contexts.
7841 // E.g. a simple C language enum is a transparent context:
7842 // enum E { A, B };
7843 // Now if we had a global variable in the TU
7844 // int A;
7845 // then the enum constant 'A' and the variable 'A' violates ODR.
7846 // We can diagnose this only if we search in the redecl context.
7847 DeclContext *ReDC = DC->getRedeclContext();
Gabor Marton2afbfb62019-07-01 15:37:07 +00007848 if (SharedState->getLookupTable()) {
Gabor Marton54058b52018-12-17 13:53:12 +00007849 ASTImporterLookupTable::LookupResult LookupResult =
Gabor Marton2afbfb62019-07-01 15:37:07 +00007850 SharedState->getLookupTable()->lookup(ReDC, Name);
Gabor Marton54058b52018-12-17 13:53:12 +00007851 return FoundDeclsTy(LookupResult.begin(), LookupResult.end());
7852 } else {
Gabor Martonaefcf512019-07-17 13:47:46 +00007853 DeclContext::lookup_result NoloadLookupResult = ReDC->noload_lookup(Name);
7854 FoundDeclsTy Result(NoloadLookupResult.begin(), NoloadLookupResult.end());
7855 // We must search by the slow case of localUncachedLookup because that is
7856 // working even if there is no LookupPtr for the DC. We could use
7857 // DC::buildLookup() to create the LookupPtr, but that would load external
7858 // decls again, we must avoid that case.
7859 // Also, even if we had the LookupPtr, we must find Decls which are not
7860 // in the LookupPtr, so we need the slow case.
7861 // These cases are handled in ASTImporterLookupTable, but we cannot use
7862 // that with LLDB since that traverses through the AST which initiates the
7863 // load of external decls again via DC::decls(). And again, we must avoid
7864 // loading external decls during the import.
7865 if (Result.empty())
7866 ReDC->localUncachedLookup(Name, Result);
Gabor Marton54058b52018-12-17 13:53:12 +00007867 return Result;
7868 }
7869}
7870
7871void ASTImporter::AddToLookupTable(Decl *ToD) {
Gabor Marton2afbfb62019-07-01 15:37:07 +00007872 SharedState->addDeclToLookup(ToD);
Gabor Marton54058b52018-12-17 13:53:12 +00007873}
7874
Raphael Isemanne9bc35f2019-04-29 21:02:35 +00007875Expected<Decl *> ASTImporter::ImportImpl(Decl *FromD) {
7876 // Import the decl using ASTNodeImporter.
7877 ASTNodeImporter Importer(*this);
7878 return Importer.Visit(FromD);
7879}
7880
7881void ASTImporter::RegisterImportedDecl(Decl *FromD, Decl *ToD) {
7882 MapImported(FromD, ToD);
Raphael Isemanne9bc35f2019-04-29 21:02:35 +00007883}
7884
Gabor Marton5ac6d492019-05-15 10:29:48 +00007885Expected<QualType> ASTImporter::Import(QualType FromT) {
Douglas Gregor96e578d2010-02-05 17:54:41 +00007886 if (FromT.isNull())
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00007887 return QualType{};
John McCall424cec92011-01-19 06:33:43 +00007888
Balazs Keri3b30d652018-10-19 13:32:20 +00007889 const Type *FromTy = FromT.getTypePtr();
Fangrui Song6907ce22018-07-30 19:24:48 +00007890
7891 // Check whether we've already imported this type.
John McCall424cec92011-01-19 06:33:43 +00007892 llvm::DenseMap<const Type *, const Type *>::iterator Pos
Balazs Keri3b30d652018-10-19 13:32:20 +00007893 = ImportedTypes.find(FromTy);
Douglas Gregorf65bbb32010-02-08 15:18:58 +00007894 if (Pos != ImportedTypes.end())
John McCall424cec92011-01-19 06:33:43 +00007895 return ToContext.getQualifiedType(Pos->second, FromT.getLocalQualifiers());
Fangrui Song6907ce22018-07-30 19:24:48 +00007896
Douglas Gregorf65bbb32010-02-08 15:18:58 +00007897 // Import the type
Douglas Gregor96e578d2010-02-05 17:54:41 +00007898 ASTNodeImporter Importer(*this);
Balazs Keri3b30d652018-10-19 13:32:20 +00007899 ExpectedType ToTOrErr = Importer.Visit(FromTy);
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00007900 if (!ToTOrErr)
7901 return ToTOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00007902
Douglas Gregorf65bbb32010-02-08 15:18:58 +00007903 // Record the imported type.
Balazs Keri3b30d652018-10-19 13:32:20 +00007904 ImportedTypes[FromTy] = (*ToTOrErr).getTypePtr();
Fangrui Song6907ce22018-07-30 19:24:48 +00007905
Balazs Keri3b30d652018-10-19 13:32:20 +00007906 return ToContext.getQualifiedType(*ToTOrErr, FromT.getLocalQualifiers());
Douglas Gregor96e578d2010-02-05 17:54:41 +00007907}
7908
Gabor Marton5ac6d492019-05-15 10:29:48 +00007909Expected<TypeSourceInfo *> ASTImporter::Import(TypeSourceInfo *FromTSI) {
Douglas Gregorfa7a0e52010-02-10 17:47:19 +00007910 if (!FromTSI)
7911 return FromTSI;
7912
7913 // FIXME: For now we just create a "trivial" type source info based
Nick Lewycky19b9f952010-07-26 16:56:01 +00007914 // on the type and a single location. Implement a real version of this.
Gabor Marton5ac6d492019-05-15 10:29:48 +00007915 ExpectedType TOrErr = Import(FromTSI->getType());
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00007916 if (!TOrErr)
7917 return TOrErr.takeError();
Gabor Marton5ac6d492019-05-15 10:29:48 +00007918 ExpectedSLoc BeginLocOrErr = Import(FromTSI->getTypeLoc().getBeginLoc());
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00007919 if (!BeginLocOrErr)
7920 return BeginLocOrErr.takeError();
Douglas Gregorfa7a0e52010-02-10 17:47:19 +00007921
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00007922 return ToContext.getTrivialTypeSourceInfo(*TOrErr, *BeginLocOrErr);
7923}
Douglas Gregor62d311f2010-02-09 19:21:46 +00007924
Gabor Marton5ac6d492019-05-15 10:29:48 +00007925Expected<Attr *> ASTImporter::Import(const Attr *FromAttr) {
Davide Italianofaee83d2018-11-28 19:15:23 +00007926 Attr *ToAttr = FromAttr->clone(ToContext);
Gabor Marton5ac6d492019-05-15 10:29:48 +00007927 if (auto ToRangeOrErr = Import(FromAttr->getRange()))
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00007928 ToAttr->setRange(*ToRangeOrErr);
7929 else
7930 return ToRangeOrErr.takeError();
7931
Davide Italianofaee83d2018-11-28 19:15:23 +00007932 return ToAttr;
Balazs Kerideaf7ab2018-11-28 13:21:26 +00007933}
Aleksei Sidorin8f266db2018-05-08 12:45:21 +00007934
Gabor Martonbe77a982018-12-12 11:22:55 +00007935Decl *ASTImporter::GetAlreadyImportedOrNull(const Decl *FromD) const {
7936 auto Pos = ImportedDecls.find(FromD);
7937 if (Pos != ImportedDecls.end())
7938 return Pos->second;
7939 else
Sean Callanan59721b32015-04-28 18:41:46 +00007940 return nullptr;
Sean Callanan59721b32015-04-28 18:41:46 +00007941}
7942
Gabor Marton458d1452019-02-14 13:07:03 +00007943TranslationUnitDecl *ASTImporter::GetFromTU(Decl *ToD) {
7944 auto FromDPos = ImportedFromDecls.find(ToD);
7945 if (FromDPos == ImportedFromDecls.end())
7946 return nullptr;
7947 return FromDPos->second->getTranslationUnitDecl();
7948}
7949
Gabor Marton5ac6d492019-05-15 10:29:48 +00007950Expected<Decl *> ASTImporter::Import(Decl *FromD) {
Douglas Gregor62d311f2010-02-09 19:21:46 +00007951 if (!FromD)
Craig Topper36250ad2014-05-12 05:36:57 +00007952 return nullptr;
Douglas Gregor62d311f2010-02-09 19:21:46 +00007953
Gabor Marton1ad4b992019-07-01 14:19:53 +00007954 // Push FromD to the stack, and remove that when we return.
7955 ImportPath.push(FromD);
7956 auto ImportPathBuilder =
7957 llvm::make_scope_exit([this]() { ImportPath.pop(); });
Douglas Gregord451ea92011-07-29 23:31:30 +00007958
Gabor Marton303c98612019-06-25 08:00:51 +00007959 // Check whether there was a previous failed import.
7960 // If yes return the existing error.
7961 if (auto Error = getImportDeclErrorIfAny(FromD))
7962 return make_error<ImportError>(*Error);
7963
Gabor Marton26f72a92018-07-12 09:42:05 +00007964 // Check whether we've already imported this declaration.
7965 Decl *ToD = GetAlreadyImportedOrNull(FromD);
7966 if (ToD) {
Gabor Marton2afbfb62019-07-01 15:37:07 +00007967 // Already imported (possibly from another TU) and with an error.
7968 if (auto Error = SharedState->getImportDeclErrorIfAny(ToD)) {
7969 setImportDeclError(FromD, *Error);
7970 return make_error<ImportError>(*Error);
7971 }
7972
Gabor Marton26f72a92018-07-12 09:42:05 +00007973 // If FromD has some updated flags after last import, apply it
7974 updateFlags(FromD, ToD);
Gabor Marton1ad4b992019-07-01 14:19:53 +00007975 // If we encounter a cycle during an import then we save the relevant part
7976 // of the import path associated to the Decl.
7977 if (ImportPath.hasCycleAtBack())
7978 SavedImportPaths[FromD].push_back(ImportPath.copyCycleAtBack());
Douglas Gregord451ea92011-07-29 23:31:30 +00007979 return ToD;
7980 }
Gabor Marton26f72a92018-07-12 09:42:05 +00007981
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00007982 // Import the declaration.
Raphael Isemanne9bc35f2019-04-29 21:02:35 +00007983 ExpectedDecl ToDOrErr = ImportImpl(FromD);
Gabor Marton303c98612019-06-25 08:00:51 +00007984 if (!ToDOrErr) {
7985 // Failed to import.
7986
7987 auto Pos = ImportedDecls.find(FromD);
7988 if (Pos != ImportedDecls.end()) {
7989 // Import failed after the object was created.
7990 // Remove all references to it.
7991 auto *ToD = Pos->second;
7992 ImportedDecls.erase(Pos);
7993
7994 // ImportedDecls and ImportedFromDecls are not symmetric. It may happen
7995 // (e.g. with namespaces) that several decls from the 'from' context are
7996 // mapped to the same decl in the 'to' context. If we removed entries
7997 // from the LookupTable here then we may end up removing them multiple
7998 // times.
7999
8000 // The Lookuptable contains decls only which are in the 'to' context.
8001 // Remove from the Lookuptable only if it is *imported* into the 'to'
8002 // context (and do not remove it if it was added during the initial
8003 // traverse of the 'to' context).
8004 auto PosF = ImportedFromDecls.find(ToD);
8005 if (PosF != ImportedFromDecls.end()) {
Gabor Marton2afbfb62019-07-01 15:37:07 +00008006 SharedState->removeDeclFromLookup(ToD);
Gabor Marton303c98612019-06-25 08:00:51 +00008007 ImportedFromDecls.erase(PosF);
8008 }
8009
8010 // FIXME: AST may contain remaining references to the failed object.
Gabor Marton2afbfb62019-07-01 15:37:07 +00008011 // However, the ImportDeclErrors in the shared state contains all the
8012 // failed objects together with their error.
Gabor Marton303c98612019-06-25 08:00:51 +00008013 }
8014
Gabor Marton2afbfb62019-07-01 15:37:07 +00008015 // Error encountered for the first time.
8016 // After takeError the error is not usable any more in ToDOrErr.
Gabor Marton303c98612019-06-25 08:00:51 +00008017 // Get a copy of the error object (any more simple solution for this?).
8018 ImportError ErrOut;
8019 handleAllErrors(ToDOrErr.takeError(),
8020 [&ErrOut](const ImportError &E) { ErrOut = E; });
8021 setImportDeclError(FromD, ErrOut);
Gabor Marton2afbfb62019-07-01 15:37:07 +00008022 // Set the error for the mapped to Decl, which is in the "to" context.
8023 if (Pos != ImportedDecls.end())
8024 SharedState->setImportDeclError(Pos->second, ErrOut);
Gabor Marton1ad4b992019-07-01 14:19:53 +00008025
8026 // Set the error for all nodes which have been created before we
8027 // recognized the error.
8028 for (const auto &Path : SavedImportPaths[FromD])
Gabor Marton2afbfb62019-07-01 15:37:07 +00008029 for (Decl *FromDi : Path) {
8030 setImportDeclError(FromDi, ErrOut);
8031 //FIXME Should we remove these Decls from ImportedDecls?
8032 // Set the error for the mapped to Decl, which is in the "to" context.
8033 auto Ii = ImportedDecls.find(FromDi);
8034 if (Ii != ImportedDecls.end())
8035 SharedState->setImportDeclError(Ii->second, ErrOut);
8036 // FIXME Should we remove these Decls from the LookupTable,
8037 // and from ImportedFromDecls?
8038 }
Gabor Marton1ad4b992019-07-01 14:19:53 +00008039 SavedImportPaths[FromD].clear();
8040
Gabor Marton303c98612019-06-25 08:00:51 +00008041 // Do not return ToDOrErr, error was taken out of it.
8042 return make_error<ImportError>(ErrOut);
8043 }
8044
Balazs Keri3b30d652018-10-19 13:32:20 +00008045 ToD = *ToDOrErr;
Craig Topper36250ad2014-05-12 05:36:57 +00008046
Gabor Marton303c98612019-06-25 08:00:51 +00008047 // FIXME: Handle the "already imported with error" case. We can get here
8048 // nullptr only if GetImportedOrCreateDecl returned nullptr (after a
8049 // previously failed create was requested).
8050 // Later GetImportedOrCreateDecl can be updated to return the error.
Gabor Marton7f8c4002019-03-19 13:34:10 +00008051 if (!ToD) {
Gabor Marton303c98612019-06-25 08:00:51 +00008052 auto Err = getImportDeclErrorIfAny(FromD);
8053 assert(Err);
8054 return make_error<ImportError>(*Err);
Gabor Marton7f8c4002019-03-19 13:34:10 +00008055 }
8056
Gabor Marton2afbfb62019-07-01 15:37:07 +00008057 // We could import from the current TU without error. But previously we
8058 // already had imported a Decl as `ToD` from another TU (with another
8059 // ASTImporter object) and with an error.
8060 if (auto Error = SharedState->getImportDeclErrorIfAny(ToD)) {
8061 setImportDeclError(FromD, *Error);
8062 return make_error<ImportError>(*Error);
8063 }
8064
Raphael Isemanne9bc35f2019-04-29 21:02:35 +00008065 // Make sure that ImportImpl registered the imported decl.
8066 assert(ImportedDecls.count(FromD) != 0 && "Missing call to MapImported?");
Gabor Marton2afbfb62019-07-01 15:37:07 +00008067
Gabor Marton26f72a92018-07-12 09:42:05 +00008068 // Notify subclasses.
8069 Imported(FromD, ToD);
8070
Gabor Martonac3a5d62018-09-17 12:04:52 +00008071 updateFlags(FromD, ToD);
Gabor Marton1ad4b992019-07-01 14:19:53 +00008072 SavedImportPaths[FromD].clear();
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008073 return ToDOrErr;
8074}
Douglas Gregor62d311f2010-02-09 19:21:46 +00008075
Balazs Keri3b30d652018-10-19 13:32:20 +00008076Expected<DeclContext *> ASTImporter::ImportContext(DeclContext *FromDC) {
Douglas Gregor62d311f2010-02-09 19:21:46 +00008077 if (!FromDC)
8078 return FromDC;
8079
Gabor Marton5ac6d492019-05-15 10:29:48 +00008080 ExpectedDecl ToDCOrErr = Import(cast<Decl>(FromDC));
Balazs Keria1f6b102019-04-08 13:59:15 +00008081 if (!ToDCOrErr)
8082 return ToDCOrErr.takeError();
8083 auto *ToDC = cast<DeclContext>(*ToDCOrErr);
Craig Topper36250ad2014-05-12 05:36:57 +00008084
Fangrui Song6907ce22018-07-30 19:24:48 +00008085 // When we're using a record/enum/Objective-C class/protocol as a context, we
Douglas Gregor2e15c842012-02-01 21:00:38 +00008086 // need it to have a definition.
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00008087 if (auto *ToRecord = dyn_cast<RecordDecl>(ToDC)) {
8088 auto *FromRecord = cast<RecordDecl>(FromDC);
Douglas Gregor2e15c842012-02-01 21:00:38 +00008089 if (ToRecord->isCompleteDefinition()) {
8090 // Do nothing.
8091 } else if (FromRecord->isCompleteDefinition()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00008092 if (Error Err = ASTNodeImporter(*this).ImportDefinition(
8093 FromRecord, ToRecord, ASTNodeImporter::IDK_Basic))
8094 return std::move(Err);
Douglas Gregor2e15c842012-02-01 21:00:38 +00008095 } else {
8096 CompleteDecl(ToRecord);
8097 }
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00008098 } else if (auto *ToEnum = dyn_cast<EnumDecl>(ToDC)) {
8099 auto *FromEnum = cast<EnumDecl>(FromDC);
Douglas Gregor2e15c842012-02-01 21:00:38 +00008100 if (ToEnum->isCompleteDefinition()) {
8101 // Do nothing.
8102 } else if (FromEnum->isCompleteDefinition()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00008103 if (Error Err = ASTNodeImporter(*this).ImportDefinition(
8104 FromEnum, ToEnum, ASTNodeImporter::IDK_Basic))
8105 return std::move(Err);
Douglas Gregor2e15c842012-02-01 21:00:38 +00008106 } else {
8107 CompleteDecl(ToEnum);
Fangrui Song6907ce22018-07-30 19:24:48 +00008108 }
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00008109 } else if (auto *ToClass = dyn_cast<ObjCInterfaceDecl>(ToDC)) {
8110 auto *FromClass = cast<ObjCInterfaceDecl>(FromDC);
Douglas Gregor2e15c842012-02-01 21:00:38 +00008111 if (ToClass->getDefinition()) {
8112 // Do nothing.
8113 } else if (ObjCInterfaceDecl *FromDef = FromClass->getDefinition()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00008114 if (Error Err = ASTNodeImporter(*this).ImportDefinition(
8115 FromDef, ToClass, ASTNodeImporter::IDK_Basic))
8116 return std::move(Err);
Douglas Gregor2e15c842012-02-01 21:00:38 +00008117 } else {
8118 CompleteDecl(ToClass);
8119 }
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00008120 } else if (auto *ToProto = dyn_cast<ObjCProtocolDecl>(ToDC)) {
8121 auto *FromProto = cast<ObjCProtocolDecl>(FromDC);
Douglas Gregor2e15c842012-02-01 21:00:38 +00008122 if (ToProto->getDefinition()) {
8123 // Do nothing.
8124 } else if (ObjCProtocolDecl *FromDef = FromProto->getDefinition()) {
Balazs Keri3b30d652018-10-19 13:32:20 +00008125 if (Error Err = ASTNodeImporter(*this).ImportDefinition(
8126 FromDef, ToProto, ASTNodeImporter::IDK_Basic))
8127 return std::move(Err);
Douglas Gregor2e15c842012-02-01 21:00:38 +00008128 } else {
8129 CompleteDecl(ToProto);
Fangrui Song6907ce22018-07-30 19:24:48 +00008130 }
Douglas Gregor95d82832012-01-24 18:36:04 +00008131 }
Fangrui Song6907ce22018-07-30 19:24:48 +00008132
Douglas Gregor95d82832012-01-24 18:36:04 +00008133 return ToDC;
Douglas Gregor62d311f2010-02-09 19:21:46 +00008134}
8135
Gabor Marton5ac6d492019-05-15 10:29:48 +00008136Expected<Expr *> ASTImporter::Import(Expr *FromE) {
8137 if (ExpectedStmt ToSOrErr = Import(cast_or_null<Stmt>(FromE)))
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008138 return cast_or_null<Expr>(*ToSOrErr);
8139 else
8140 return ToSOrErr.takeError();
Balazs Keri4a3d7582018-11-27 18:36:31 +00008141}
Douglas Gregor62d311f2010-02-09 19:21:46 +00008142
Gabor Marton5ac6d492019-05-15 10:29:48 +00008143Expected<Stmt *> ASTImporter::Import(Stmt *FromS) {
Douglas Gregor62d311f2010-02-09 19:21:46 +00008144 if (!FromS)
Craig Topper36250ad2014-05-12 05:36:57 +00008145 return nullptr;
Douglas Gregor62d311f2010-02-09 19:21:46 +00008146
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008147 // Check whether we've already imported this statement.
Douglas Gregor7eeb5972010-02-11 19:21:55 +00008148 llvm::DenseMap<Stmt *, Stmt *>::iterator Pos = ImportedStmts.find(FromS);
8149 if (Pos != ImportedStmts.end())
8150 return Pos->second;
Fangrui Song6907ce22018-07-30 19:24:48 +00008151
Balazs Keri3b30d652018-10-19 13:32:20 +00008152 // Import the statement.
Douglas Gregor7eeb5972010-02-11 19:21:55 +00008153 ASTNodeImporter Importer(*this);
Balazs Keri3b30d652018-10-19 13:32:20 +00008154 ExpectedStmt ToSOrErr = Importer.Visit(FromS);
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008155 if (!ToSOrErr)
8156 return ToSOrErr;
Craig Topper36250ad2014-05-12 05:36:57 +00008157
Balazs Keri3b30d652018-10-19 13:32:20 +00008158 if (auto *ToE = dyn_cast<Expr>(*ToSOrErr)) {
Gabor Martona20ce602018-09-03 13:10:53 +00008159 auto *FromE = cast<Expr>(FromS);
8160 // Copy ExprBitfields, which may not be handled in Expr subclasses
8161 // constructors.
8162 ToE->setValueKind(FromE->getValueKind());
8163 ToE->setObjectKind(FromE->getObjectKind());
8164 ToE->setTypeDependent(FromE->isTypeDependent());
8165 ToE->setValueDependent(FromE->isValueDependent());
8166 ToE->setInstantiationDependent(FromE->isInstantiationDependent());
8167 ToE->setContainsUnexpandedParameterPack(
8168 FromE->containsUnexpandedParameterPack());
8169 }
8170
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008171 // Record the imported statement object.
Balazs Keri3b30d652018-10-19 13:32:20 +00008172 ImportedStmts[FromS] = *ToSOrErr;
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008173 return ToSOrErr;
8174}
Douglas Gregor62d311f2010-02-09 19:21:46 +00008175
Balazs Keri4a3d7582018-11-27 18:36:31 +00008176Expected<NestedNameSpecifier *>
Gabor Marton5ac6d492019-05-15 10:29:48 +00008177ASTImporter::Import(NestedNameSpecifier *FromNNS) {
Douglas Gregor62d311f2010-02-09 19:21:46 +00008178 if (!FromNNS)
Craig Topper36250ad2014-05-12 05:36:57 +00008179 return nullptr;
Douglas Gregor62d311f2010-02-09 19:21:46 +00008180
Simon Pilgrim130df2c2019-07-15 13:00:43 +00008181 NestedNameSpecifier *Prefix = nullptr;
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008182 if (Error Err = importInto(Prefix, FromNNS->getPrefix()))
8183 return std::move(Err);
Douglas Gregor90ebf252011-04-27 16:48:40 +00008184
8185 switch (FromNNS->getKind()) {
8186 case NestedNameSpecifier::Identifier:
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008187 assert(FromNNS->getAsIdentifier() && "NNS should contain identifier.");
8188 return NestedNameSpecifier::Create(ToContext, Prefix,
8189 Import(FromNNS->getAsIdentifier()));
Douglas Gregor90ebf252011-04-27 16:48:40 +00008190
8191 case NestedNameSpecifier::Namespace:
Gabor Marton5ac6d492019-05-15 10:29:48 +00008192 if (ExpectedDecl NSOrErr = Import(FromNNS->getAsNamespace())) {
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008193 return NestedNameSpecifier::Create(ToContext, Prefix,
8194 cast<NamespaceDecl>(*NSOrErr));
8195 } else
8196 return NSOrErr.takeError();
Douglas Gregor90ebf252011-04-27 16:48:40 +00008197
8198 case NestedNameSpecifier::NamespaceAlias:
Gabor Marton5ac6d492019-05-15 10:29:48 +00008199 if (ExpectedDecl NSADOrErr = Import(FromNNS->getAsNamespaceAlias()))
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008200 return NestedNameSpecifier::Create(ToContext, Prefix,
8201 cast<NamespaceAliasDecl>(*NSADOrErr));
8202 else
8203 return NSADOrErr.takeError();
Douglas Gregor90ebf252011-04-27 16:48:40 +00008204
8205 case NestedNameSpecifier::Global:
8206 return NestedNameSpecifier::GlobalSpecifier(ToContext);
8207
Nikola Smiljanic67860242014-09-26 00:28:20 +00008208 case NestedNameSpecifier::Super:
Gabor Marton5ac6d492019-05-15 10:29:48 +00008209 if (ExpectedDecl RDOrErr = Import(FromNNS->getAsRecordDecl()))
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008210 return NestedNameSpecifier::SuperSpecifier(ToContext,
8211 cast<CXXRecordDecl>(*RDOrErr));
8212 else
8213 return RDOrErr.takeError();
Nikola Smiljanic67860242014-09-26 00:28:20 +00008214
Douglas Gregor90ebf252011-04-27 16:48:40 +00008215 case NestedNameSpecifier::TypeSpec:
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008216 case NestedNameSpecifier::TypeSpecWithTemplate:
8217 if (Expected<QualType> TyOrErr =
Gabor Marton5ac6d492019-05-15 10:29:48 +00008218 Import(QualType(FromNNS->getAsType(), 0u))) {
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008219 bool TSTemplate =
8220 FromNNS->getKind() == NestedNameSpecifier::TypeSpecWithTemplate;
8221 return NestedNameSpecifier::Create(ToContext, Prefix, TSTemplate,
8222 TyOrErr->getTypePtr());
8223 } else {
8224 return TyOrErr.takeError();
Douglas Gregor90ebf252011-04-27 16:48:40 +00008225 }
Douglas Gregor90ebf252011-04-27 16:48:40 +00008226 }
8227
8228 llvm_unreachable("Invalid nested name specifier kind");
Douglas Gregor62d311f2010-02-09 19:21:46 +00008229}
8230
Balazs Keri4a3d7582018-11-27 18:36:31 +00008231Expected<NestedNameSpecifierLoc>
Gabor Marton5ac6d492019-05-15 10:29:48 +00008232ASTImporter::Import(NestedNameSpecifierLoc FromNNS) {
Aleksei Sidorin855086d2017-01-23 09:30:36 +00008233 // Copied from NestedNameSpecifier mostly.
8234 SmallVector<NestedNameSpecifierLoc , 8> NestedNames;
8235 NestedNameSpecifierLoc NNS = FromNNS;
8236
8237 // Push each of the nested-name-specifiers's onto a stack for
8238 // serialization in reverse order.
8239 while (NNS) {
8240 NestedNames.push_back(NNS);
8241 NNS = NNS.getPrefix();
8242 }
8243
8244 NestedNameSpecifierLocBuilder Builder;
8245
8246 while (!NestedNames.empty()) {
8247 NNS = NestedNames.pop_back_val();
Simon Pilgrim4c146ab2019-05-18 11:33:27 +00008248 NestedNameSpecifier *Spec = nullptr;
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008249 if (Error Err = importInto(Spec, NNS.getNestedNameSpecifier()))
8250 return std::move(Err);
Aleksei Sidorin855086d2017-01-23 09:30:36 +00008251
8252 NestedNameSpecifier::SpecifierKind Kind = Spec->getKind();
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008253
8254 SourceLocation ToLocalBeginLoc, ToLocalEndLoc;
8255 if (Kind != NestedNameSpecifier::Super) {
8256 if (Error Err = importInto(ToLocalBeginLoc, NNS.getLocalBeginLoc()))
8257 return std::move(Err);
8258
8259 if (Kind != NestedNameSpecifier::Global)
8260 if (Error Err = importInto(ToLocalEndLoc, NNS.getLocalEndLoc()))
8261 return std::move(Err);
8262 }
8263
Aleksei Sidorin855086d2017-01-23 09:30:36 +00008264 switch (Kind) {
8265 case NestedNameSpecifier::Identifier:
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008266 Builder.Extend(getToContext(), Spec->getAsIdentifier(), ToLocalBeginLoc,
8267 ToLocalEndLoc);
Aleksei Sidorin855086d2017-01-23 09:30:36 +00008268 break;
8269
8270 case NestedNameSpecifier::Namespace:
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008271 Builder.Extend(getToContext(), Spec->getAsNamespace(), ToLocalBeginLoc,
8272 ToLocalEndLoc);
Aleksei Sidorin855086d2017-01-23 09:30:36 +00008273 break;
8274
8275 case NestedNameSpecifier::NamespaceAlias:
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008276 Builder.Extend(getToContext(), Spec->getAsNamespaceAlias(),
8277 ToLocalBeginLoc, ToLocalEndLoc);
Aleksei Sidorin855086d2017-01-23 09:30:36 +00008278 break;
8279
8280 case NestedNameSpecifier::TypeSpec:
8281 case NestedNameSpecifier::TypeSpecWithTemplate: {
Balazs Keri5f4fd8b2019-03-14 14:20:23 +00008282 SourceLocation ToTLoc;
8283 if (Error Err = importInto(ToTLoc, NNS.getTypeLoc().getBeginLoc()))
8284 return std::move(Err);
Aleksei Sidorin855086d2017-01-23 09:30:36 +00008285 TypeSourceInfo *TSI = getToContext().getTrivialTypeSourceInfo(
Balazs Keri5f4fd8b2019-03-14 14:20:23 +00008286 QualType(Spec->getAsType(), 0), ToTLoc);
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008287 Builder.Extend(getToContext(), ToLocalBeginLoc, TSI->getTypeLoc(),
8288 ToLocalEndLoc);
Aleksei Sidorin855086d2017-01-23 09:30:36 +00008289 break;
8290 }
8291
8292 case NestedNameSpecifier::Global:
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008293 Builder.MakeGlobal(getToContext(), ToLocalBeginLoc);
Aleksei Sidorin855086d2017-01-23 09:30:36 +00008294 break;
8295
8296 case NestedNameSpecifier::Super: {
Gabor Marton5ac6d492019-05-15 10:29:48 +00008297 auto ToSourceRangeOrErr = Import(NNS.getSourceRange());
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008298 if (!ToSourceRangeOrErr)
8299 return ToSourceRangeOrErr.takeError();
8300
8301 Builder.MakeSuper(getToContext(), Spec->getAsRecordDecl(),
8302 ToSourceRangeOrErr->getBegin(),
8303 ToSourceRangeOrErr->getEnd());
Aleksei Sidorin855086d2017-01-23 09:30:36 +00008304 }
8305 }
8306 }
8307
8308 return Builder.getWithLocInContext(getToContext());
Douglas Gregor14454802011-02-25 02:25:35 +00008309}
8310
Gabor Marton5ac6d492019-05-15 10:29:48 +00008311Expected<TemplateName> ASTImporter::Import(TemplateName From) {
Douglas Gregore2e50d332010-12-01 01:36:18 +00008312 switch (From.getKind()) {
8313 case TemplateName::Template:
Gabor Marton5ac6d492019-05-15 10:29:48 +00008314 if (ExpectedDecl ToTemplateOrErr = Import(From.getAsTemplateDecl()))
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008315 return TemplateName(cast<TemplateDecl>(*ToTemplateOrErr));
8316 else
8317 return ToTemplateOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00008318
Douglas Gregore2e50d332010-12-01 01:36:18 +00008319 case TemplateName::OverloadedTemplate: {
8320 OverloadedTemplateStorage *FromStorage = From.getAsOverloadedTemplate();
8321 UnresolvedSet<2> ToTemplates;
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00008322 for (auto *I : *FromStorage) {
Gabor Marton5ac6d492019-05-15 10:29:48 +00008323 if (auto ToOrErr = Import(I))
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008324 ToTemplates.addDecl(cast<NamedDecl>(*ToOrErr));
Douglas Gregore2e50d332010-12-01 01:36:18 +00008325 else
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008326 return ToOrErr.takeError();
Douglas Gregore2e50d332010-12-01 01:36:18 +00008327 }
Fangrui Song6907ce22018-07-30 19:24:48 +00008328 return ToContext.getOverloadedTemplateName(ToTemplates.begin(),
Douglas Gregore2e50d332010-12-01 01:36:18 +00008329 ToTemplates.end());
8330 }
Fangrui Song6907ce22018-07-30 19:24:48 +00008331
Richard Smithb23c5e82019-05-09 03:31:27 +00008332 case TemplateName::AssumedTemplate: {
8333 AssumedTemplateStorage *FromStorage = From.getAsAssumedTemplateName();
Gabor Marton5ac6d492019-05-15 10:29:48 +00008334 auto DeclNameOrErr = Import(FromStorage->getDeclName());
Richard Smithb23c5e82019-05-09 03:31:27 +00008335 if (!DeclNameOrErr)
8336 return DeclNameOrErr.takeError();
8337 return ToContext.getAssumedTemplateName(*DeclNameOrErr);
8338 }
8339
Douglas Gregore2e50d332010-12-01 01:36:18 +00008340 case TemplateName::QualifiedTemplate: {
8341 QualifiedTemplateName *QTN = From.getAsQualifiedTemplateName();
Gabor Marton5ac6d492019-05-15 10:29:48 +00008342 auto QualifierOrErr = Import(QTN->getQualifier());
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008343 if (!QualifierOrErr)
8344 return QualifierOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00008345
Gabor Marton5ac6d492019-05-15 10:29:48 +00008346 if (ExpectedDecl ToTemplateOrErr = Import(From.getAsTemplateDecl()))
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008347 return ToContext.getQualifiedTemplateName(
8348 *QualifierOrErr, QTN->hasTemplateKeyword(),
8349 cast<TemplateDecl>(*ToTemplateOrErr));
8350 else
8351 return ToTemplateOrErr.takeError();
Douglas Gregore2e50d332010-12-01 01:36:18 +00008352 }
Fangrui Song6907ce22018-07-30 19:24:48 +00008353
Douglas Gregore2e50d332010-12-01 01:36:18 +00008354 case TemplateName::DependentTemplate: {
8355 DependentTemplateName *DTN = From.getAsDependentTemplateName();
Gabor Marton5ac6d492019-05-15 10:29:48 +00008356 auto QualifierOrErr = Import(DTN->getQualifier());
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008357 if (!QualifierOrErr)
8358 return QualifierOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00008359
Douglas Gregore2e50d332010-12-01 01:36:18 +00008360 if (DTN->isIdentifier()) {
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008361 return ToContext.getDependentTemplateName(*QualifierOrErr,
Douglas Gregore2e50d332010-12-01 01:36:18 +00008362 Import(DTN->getIdentifier()));
8363 }
Fangrui Song6907ce22018-07-30 19:24:48 +00008364
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008365 return ToContext.getDependentTemplateName(*QualifierOrErr,
8366 DTN->getOperator());
Douglas Gregore2e50d332010-12-01 01:36:18 +00008367 }
John McCalld9dfe3a2011-06-30 08:33:18 +00008368
8369 case TemplateName::SubstTemplateTemplateParm: {
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008370 SubstTemplateTemplateParmStorage *Subst =
8371 From.getAsSubstTemplateTemplateParm();
Gabor Marton5ac6d492019-05-15 10:29:48 +00008372 ExpectedDecl ParamOrErr = Import(Subst->getParameter());
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008373 if (!ParamOrErr)
8374 return ParamOrErr.takeError();
John McCalld9dfe3a2011-06-30 08:33:18 +00008375
Gabor Marton5ac6d492019-05-15 10:29:48 +00008376 auto ReplacementOrErr = Import(Subst->getReplacement());
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008377 if (!ReplacementOrErr)
8378 return ReplacementOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00008379
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008380 return ToContext.getSubstTemplateTemplateParm(
8381 cast<TemplateTemplateParmDecl>(*ParamOrErr), *ReplacementOrErr);
John McCalld9dfe3a2011-06-30 08:33:18 +00008382 }
Fangrui Song6907ce22018-07-30 19:24:48 +00008383
Douglas Gregor5590be02011-01-15 06:45:20 +00008384 case TemplateName::SubstTemplateTemplateParmPack: {
8385 SubstTemplateTemplateParmPackStorage *SubstPack
8386 = From.getAsSubstTemplateTemplateParmPack();
Gabor Marton5ac6d492019-05-15 10:29:48 +00008387 ExpectedDecl ParamOrErr = Import(SubstPack->getParameterPack());
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008388 if (!ParamOrErr)
8389 return ParamOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00008390
Douglas Gregor5590be02011-01-15 06:45:20 +00008391 ASTNodeImporter Importer(*this);
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008392 auto ArgPackOrErr =
8393 Importer.ImportTemplateArgument(SubstPack->getArgumentPack());
8394 if (!ArgPackOrErr)
8395 return ArgPackOrErr.takeError();
Fangrui Song6907ce22018-07-30 19:24:48 +00008396
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008397 return ToContext.getSubstTemplateTemplateParmPack(
8398 cast<TemplateTemplateParmDecl>(*ParamOrErr), *ArgPackOrErr);
Douglas Gregor5590be02011-01-15 06:45:20 +00008399 }
Douglas Gregore2e50d332010-12-01 01:36:18 +00008400 }
Fangrui Song6907ce22018-07-30 19:24:48 +00008401
Douglas Gregore2e50d332010-12-01 01:36:18 +00008402 llvm_unreachable("Invalid template name kind");
Douglas Gregore2e50d332010-12-01 01:36:18 +00008403}
8404
Gabor Marton5ac6d492019-05-15 10:29:48 +00008405Expected<SourceLocation> ASTImporter::Import(SourceLocation FromLoc) {
Douglas Gregor62d311f2010-02-09 19:21:46 +00008406 if (FromLoc.isInvalid())
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008407 return SourceLocation{};
Douglas Gregor62d311f2010-02-09 19:21:46 +00008408
Douglas Gregor811663e2010-02-10 00:15:17 +00008409 SourceManager &FromSM = FromContext.getSourceManager();
Shafik Yaghmour9adbbcb2019-03-04 20:25:54 +00008410 bool IsBuiltin = FromSM.isWrittenInBuiltinFile(FromLoc);
Rafael Stahl29f37fb2018-07-04 13:34:05 +00008411
Douglas Gregor811663e2010-02-10 00:15:17 +00008412 std::pair<FileID, unsigned> Decomposed = FromSM.getDecomposedLoc(FromLoc);
Gabor Marton5ac6d492019-05-15 10:29:48 +00008413 Expected<FileID> ToFileIDOrErr = Import(Decomposed.first, IsBuiltin);
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008414 if (!ToFileIDOrErr)
8415 return ToFileIDOrErr.takeError();
Rafael Stahl29f37fb2018-07-04 13:34:05 +00008416 SourceManager &ToSM = ToContext.getSourceManager();
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008417 return ToSM.getComposedLoc(*ToFileIDOrErr, Decomposed.second);
8418}
Douglas Gregor62d311f2010-02-09 19:21:46 +00008419
Gabor Marton5ac6d492019-05-15 10:29:48 +00008420Expected<SourceRange> ASTImporter::Import(SourceRange FromRange) {
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008421 SourceLocation ToBegin, ToEnd;
8422 if (Error Err = importInto(ToBegin, FromRange.getBegin()))
8423 return std::move(Err);
8424 if (Error Err = importInto(ToEnd, FromRange.getEnd()))
8425 return std::move(Err);
8426
8427 return SourceRange(ToBegin, ToEnd);
Balazs Keri4a3d7582018-11-27 18:36:31 +00008428}
Douglas Gregor62d311f2010-02-09 19:21:46 +00008429
Gabor Marton5ac6d492019-05-15 10:29:48 +00008430Expected<FileID> ASTImporter::Import(FileID FromID, bool IsBuiltin) {
Rafael Stahl29f37fb2018-07-04 13:34:05 +00008431 llvm::DenseMap<FileID, FileID>::iterator Pos = ImportedFileIDs.find(FromID);
Douglas Gregor811663e2010-02-10 00:15:17 +00008432 if (Pos != ImportedFileIDs.end())
8433 return Pos->second;
Rafael Stahl29f37fb2018-07-04 13:34:05 +00008434
Douglas Gregor811663e2010-02-10 00:15:17 +00008435 SourceManager &FromSM = FromContext.getSourceManager();
8436 SourceManager &ToSM = ToContext.getSourceManager();
8437 const SrcMgr::SLocEntry &FromSLoc = FromSM.getSLocEntry(FromID);
Rafael Stahl29f37fb2018-07-04 13:34:05 +00008438
8439 // Map the FromID to the "to" source manager.
Douglas Gregor811663e2010-02-10 00:15:17 +00008440 FileID ToID;
Rafael Stahl29f37fb2018-07-04 13:34:05 +00008441 if (FromSLoc.isExpansion()) {
8442 const SrcMgr::ExpansionInfo &FromEx = FromSLoc.getExpansion();
Gabor Marton5ac6d492019-05-15 10:29:48 +00008443 ExpectedSLoc ToSpLoc = Import(FromEx.getSpellingLoc());
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008444 if (!ToSpLoc)
8445 return ToSpLoc.takeError();
Gabor Marton5ac6d492019-05-15 10:29:48 +00008446 ExpectedSLoc ToExLocS = Import(FromEx.getExpansionLocStart());
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008447 if (!ToExLocS)
8448 return ToExLocS.takeError();
Rafael Stahl29f37fb2018-07-04 13:34:05 +00008449 unsigned TokenLen = FromSM.getFileIDSize(FromID);
8450 SourceLocation MLoc;
8451 if (FromEx.isMacroArgExpansion()) {
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008452 MLoc = ToSM.createMacroArgExpansionLoc(*ToSpLoc, *ToExLocS, TokenLen);
Rafael Stahl29f37fb2018-07-04 13:34:05 +00008453 } else {
Gabor Marton5ac6d492019-05-15 10:29:48 +00008454 if (ExpectedSLoc ToExLocE = Import(FromEx.getExpansionLocEnd()))
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008455 MLoc = ToSM.createExpansionLoc(*ToSpLoc, *ToExLocS, *ToExLocE, TokenLen,
8456 FromEx.isExpansionTokenRange());
8457 else
8458 return ToExLocE.takeError();
Rafael Stahl29f37fb2018-07-04 13:34:05 +00008459 }
8460 ToID = ToSM.getFileID(MLoc);
Douglas Gregor811663e2010-02-10 00:15:17 +00008461 } else {
Rafael Stahl29f37fb2018-07-04 13:34:05 +00008462 const SrcMgr::ContentCache *Cache = FromSLoc.getFile().getContentCache();
Shafik Yaghmour9adbbcb2019-03-04 20:25:54 +00008463
8464 if (!IsBuiltin) {
8465 // Include location of this file.
Gabor Marton5ac6d492019-05-15 10:29:48 +00008466 ExpectedSLoc ToIncludeLoc = Import(FromSLoc.getFile().getIncludeLoc());
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008467 if (!ToIncludeLoc)
8468 return ToIncludeLoc.takeError();
Shafik Yaghmour9adbbcb2019-03-04 20:25:54 +00008469
8470 if (Cache->OrigEntry && Cache->OrigEntry->getDir()) {
8471 // FIXME: We probably want to use getVirtualFile(), so we don't hit the
8472 // disk again
8473 // FIXME: We definitely want to re-use the existing MemoryBuffer, rather
8474 // than mmap the files several times.
Harlan Haskins8d323d12019-08-01 21:31:56 +00008475 auto Entry =
Shafik Yaghmour9adbbcb2019-03-04 20:25:54 +00008476 ToFileManager.getFile(Cache->OrigEntry->getName());
8477 // FIXME: The filename may be a virtual name that does probably not
8478 // point to a valid file and we get no Entry here. In this case try with
8479 // the memory buffer below.
8480 if (Entry)
Harlan Haskins8d323d12019-08-01 21:31:56 +00008481 ToID = ToSM.createFileID(*Entry, *ToIncludeLoc,
Shafik Yaghmour9adbbcb2019-03-04 20:25:54 +00008482 FromSLoc.getFile().getFileCharacteristic());
8483 }
Balazs Keri9cf39df2019-02-27 16:31:48 +00008484 }
Shafik Yaghmour9adbbcb2019-03-04 20:25:54 +00008485
8486 if (ToID.isInvalid() || IsBuiltin) {
Rafael Stahl29f37fb2018-07-04 13:34:05 +00008487 // FIXME: We want to re-use the existing MemoryBuffer!
Balazs Keri9cf39df2019-02-27 16:31:48 +00008488 bool Invalid = true;
Duncan P. N. Exon Smithf5848192019-08-26 20:32:05 +00008489 const llvm::MemoryBuffer *FromBuf =
8490 Cache->getBuffer(FromContext.getDiagnostics(),
8491 FromSM.getFileManager(), SourceLocation{}, &Invalid);
Balazs Keri9cf39df2019-02-27 16:31:48 +00008492 if (!FromBuf || Invalid)
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008493 // FIXME: Use a new error kind?
8494 return llvm::make_error<ImportError>(ImportError::Unknown);
Balazs Keri9cf39df2019-02-27 16:31:48 +00008495
Rafael Stahl29f37fb2018-07-04 13:34:05 +00008496 std::unique_ptr<llvm::MemoryBuffer> ToBuf =
8497 llvm::MemoryBuffer::getMemBufferCopy(FromBuf->getBuffer(),
8498 FromBuf->getBufferIdentifier());
8499 ToID = ToSM.createFileID(std::move(ToBuf),
8500 FromSLoc.getFile().getFileCharacteristic());
8501 }
Douglas Gregor811663e2010-02-10 00:15:17 +00008502 }
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00008503
Balazs Keri9cf39df2019-02-27 16:31:48 +00008504 assert(ToID.isValid() && "Unexpected invalid fileID was created.");
8505
Sebastian Redl99219f12010-09-30 01:03:06 +00008506 ImportedFileIDs[FromID] = ToID;
Balazs Kerid22f8772019-07-24 10:16:37 +00008507
8508 if (FileIDImportHandler)
8509 FileIDImportHandler(ToID, FromID);
8510
Douglas Gregor811663e2010-02-10 00:15:17 +00008511 return ToID;
8512}
8513
Gabor Marton5ac6d492019-05-15 10:29:48 +00008514Expected<CXXCtorInitializer *> ASTImporter::Import(CXXCtorInitializer *From) {
8515 ExpectedExpr ToExprOrErr = Import(From->getInit());
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008516 if (!ToExprOrErr)
8517 return ToExprOrErr.takeError();
8518
Gabor Marton5ac6d492019-05-15 10:29:48 +00008519 auto LParenLocOrErr = Import(From->getLParenLoc());
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008520 if (!LParenLocOrErr)
8521 return LParenLocOrErr.takeError();
8522
Gabor Marton5ac6d492019-05-15 10:29:48 +00008523 auto RParenLocOrErr = Import(From->getRParenLoc());
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008524 if (!RParenLocOrErr)
8525 return RParenLocOrErr.takeError();
Davide Italianofaee83d2018-11-28 19:15:23 +00008526
8527 if (From->isBaseInitializer()) {
Gabor Marton5ac6d492019-05-15 10:29:48 +00008528 auto ToTInfoOrErr = Import(From->getTypeSourceInfo());
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008529 if (!ToTInfoOrErr)
8530 return ToTInfoOrErr.takeError();
8531
8532 SourceLocation EllipsisLoc;
8533 if (From->isPackExpansion())
8534 if (Error Err = importInto(EllipsisLoc, From->getEllipsisLoc()))
8535 return std::move(Err);
Davide Italianofaee83d2018-11-28 19:15:23 +00008536
8537 return new (ToContext) CXXCtorInitializer(
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008538 ToContext, *ToTInfoOrErr, From->isBaseVirtual(), *LParenLocOrErr,
8539 *ToExprOrErr, *RParenLocOrErr, EllipsisLoc);
Davide Italianofaee83d2018-11-28 19:15:23 +00008540 } else if (From->isMemberInitializer()) {
Gabor Marton5ac6d492019-05-15 10:29:48 +00008541 ExpectedDecl ToFieldOrErr = Import(From->getMember());
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008542 if (!ToFieldOrErr)
8543 return ToFieldOrErr.takeError();
8544
Gabor Marton5ac6d492019-05-15 10:29:48 +00008545 auto MemberLocOrErr = Import(From->getMemberLocation());
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008546 if (!MemberLocOrErr)
8547 return MemberLocOrErr.takeError();
Davide Italianofaee83d2018-11-28 19:15:23 +00008548
8549 return new (ToContext) CXXCtorInitializer(
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008550 ToContext, cast_or_null<FieldDecl>(*ToFieldOrErr), *MemberLocOrErr,
8551 *LParenLocOrErr, *ToExprOrErr, *RParenLocOrErr);
Davide Italianofaee83d2018-11-28 19:15:23 +00008552 } else if (From->isIndirectMemberInitializer()) {
Gabor Marton5ac6d492019-05-15 10:29:48 +00008553 ExpectedDecl ToIFieldOrErr = Import(From->getIndirectMember());
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008554 if (!ToIFieldOrErr)
8555 return ToIFieldOrErr.takeError();
8556
Gabor Marton5ac6d492019-05-15 10:29:48 +00008557 auto MemberLocOrErr = Import(From->getMemberLocation());
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008558 if (!MemberLocOrErr)
8559 return MemberLocOrErr.takeError();
Davide Italianofaee83d2018-11-28 19:15:23 +00008560
8561 return new (ToContext) CXXCtorInitializer(
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008562 ToContext, cast_or_null<IndirectFieldDecl>(*ToIFieldOrErr),
8563 *MemberLocOrErr, *LParenLocOrErr, *ToExprOrErr, *RParenLocOrErr);
Davide Italianofaee83d2018-11-28 19:15:23 +00008564 } else if (From->isDelegatingInitializer()) {
Gabor Marton5ac6d492019-05-15 10:29:48 +00008565 auto ToTInfoOrErr = Import(From->getTypeSourceInfo());
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008566 if (!ToTInfoOrErr)
8567 return ToTInfoOrErr.takeError();
Davide Italianofaee83d2018-11-28 19:15:23 +00008568
8569 return new (ToContext)
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008570 CXXCtorInitializer(ToContext, *ToTInfoOrErr, *LParenLocOrErr,
8571 *ToExprOrErr, *RParenLocOrErr);
Davide Italianofaee83d2018-11-28 19:15:23 +00008572 } else {
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008573 // FIXME: assert?
8574 return make_error<ImportError>();
Davide Italianofaee83d2018-11-28 19:15:23 +00008575 }
Balazs Kerideaf7ab2018-11-28 13:21:26 +00008576}
Sean Callanandd2c1742016-05-16 20:48:03 +00008577
Balazs Keri4a3d7582018-11-27 18:36:31 +00008578Expected<CXXBaseSpecifier *>
Gabor Marton5ac6d492019-05-15 10:29:48 +00008579ASTImporter::Import(const CXXBaseSpecifier *BaseSpec) {
Aleksei Sidorina693b372016-09-28 10:16:56 +00008580 auto Pos = ImportedCXXBaseSpecifiers.find(BaseSpec);
8581 if (Pos != ImportedCXXBaseSpecifiers.end())
8582 return Pos->second;
8583
Gabor Marton5ac6d492019-05-15 10:29:48 +00008584 Expected<SourceRange> ToSourceRange = Import(BaseSpec->getSourceRange());
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008585 if (!ToSourceRange)
8586 return ToSourceRange.takeError();
Gabor Marton5ac6d492019-05-15 10:29:48 +00008587 Expected<TypeSourceInfo *> ToTSI = Import(BaseSpec->getTypeSourceInfo());
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008588 if (!ToTSI)
8589 return ToTSI.takeError();
Gabor Marton5ac6d492019-05-15 10:29:48 +00008590 ExpectedSLoc ToEllipsisLoc = Import(BaseSpec->getEllipsisLoc());
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008591 if (!ToEllipsisLoc)
8592 return ToEllipsisLoc.takeError();
Aleksei Sidorina693b372016-09-28 10:16:56 +00008593 CXXBaseSpecifier *Imported = new (ToContext) CXXBaseSpecifier(
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008594 *ToSourceRange, BaseSpec->isVirtual(), BaseSpec->isBaseOfClass(),
8595 BaseSpec->getAccessSpecifierAsWritten(), *ToTSI, *ToEllipsisLoc);
Aleksei Sidorina693b372016-09-28 10:16:56 +00008596 ImportedCXXBaseSpecifiers[BaseSpec] = Imported;
8597 return Imported;
8598}
8599
Gabor Marton5ac6d492019-05-15 10:29:48 +00008600Error ASTImporter::ImportDefinition(Decl *From) {
8601 ExpectedDecl ToOrErr = Import(From);
8602 if (!ToOrErr)
8603 return ToOrErr.takeError();
8604 Decl *To = *ToOrErr;
Fangrui Song6907ce22018-07-30 19:24:48 +00008605
Don Hintonf170dff2019-03-19 06:14:14 +00008606 auto *FromDC = cast<DeclContext>(From);
8607 ASTNodeImporter Importer(*this);
Fangrui Song6907ce22018-07-30 19:24:48 +00008608
Don Hintonf170dff2019-03-19 06:14:14 +00008609 if (auto *ToRecord = dyn_cast<RecordDecl>(To)) {
8610 if (!ToRecord->getDefinition()) {
8611 return Importer.ImportDefinition(
8612 cast<RecordDecl>(FromDC), ToRecord,
8613 ASTNodeImporter::IDK_Everything);
Sean Callanan53a6bff2011-07-19 22:38:25 +00008614 }
Douglas Gregor0a791672011-01-18 03:11:38 +00008615 }
Balazs Keri3b30d652018-10-19 13:32:20 +00008616
Don Hintonf170dff2019-03-19 06:14:14 +00008617 if (auto *ToEnum = dyn_cast<EnumDecl>(To)) {
8618 if (!ToEnum->getDefinition()) {
8619 return Importer.ImportDefinition(
8620 cast<EnumDecl>(FromDC), ToEnum, ASTNodeImporter::IDK_Everything);
8621 }
8622 }
8623
8624 if (auto *ToIFace = dyn_cast<ObjCInterfaceDecl>(To)) {
8625 if (!ToIFace->getDefinition()) {
8626 return Importer.ImportDefinition(
8627 cast<ObjCInterfaceDecl>(FromDC), ToIFace,
8628 ASTNodeImporter::IDK_Everything);
8629 }
8630 }
8631
8632 if (auto *ToProto = dyn_cast<ObjCProtocolDecl>(To)) {
8633 if (!ToProto->getDefinition()) {
8634 return Importer.ImportDefinition(
8635 cast<ObjCProtocolDecl>(FromDC), ToProto,
8636 ASTNodeImporter::IDK_Everything);
8637 }
8638 }
8639
8640 return Importer.ImportDeclContext(FromDC, true);
Balazs Keri3b30d652018-10-19 13:32:20 +00008641}
8642
Gabor Marton5ac6d492019-05-15 10:29:48 +00008643Expected<DeclarationName> ASTImporter::Import(DeclarationName FromName) {
Douglas Gregor96e578d2010-02-05 17:54:41 +00008644 if (!FromName)
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008645 return DeclarationName{};
Douglas Gregor96e578d2010-02-05 17:54:41 +00008646
8647 switch (FromName.getNameKind()) {
8648 case DeclarationName::Identifier:
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008649 return DeclarationName(Import(FromName.getAsIdentifierInfo()));
Douglas Gregor96e578d2010-02-05 17:54:41 +00008650
8651 case DeclarationName::ObjCZeroArgSelector:
8652 case DeclarationName::ObjCOneArgSelector:
8653 case DeclarationName::ObjCMultiArgSelector:
Gabor Marton5ac6d492019-05-15 10:29:48 +00008654 if (auto ToSelOrErr = Import(FromName.getObjCSelector()))
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008655 return DeclarationName(*ToSelOrErr);
8656 else
8657 return ToSelOrErr.takeError();
Douglas Gregor96e578d2010-02-05 17:54:41 +00008658
8659 case DeclarationName::CXXConstructorName: {
Gabor Marton5ac6d492019-05-15 10:29:48 +00008660 if (auto ToTyOrErr = Import(FromName.getCXXNameType()))
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008661 return ToContext.DeclarationNames.getCXXConstructorName(
8662 ToContext.getCanonicalType(*ToTyOrErr));
8663 else
8664 return ToTyOrErr.takeError();
Douglas Gregor96e578d2010-02-05 17:54:41 +00008665 }
8666
8667 case DeclarationName::CXXDestructorName: {
Gabor Marton5ac6d492019-05-15 10:29:48 +00008668 if (auto ToTyOrErr = Import(FromName.getCXXNameType()))
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008669 return ToContext.DeclarationNames.getCXXDestructorName(
8670 ToContext.getCanonicalType(*ToTyOrErr));
8671 else
8672 return ToTyOrErr.takeError();
Douglas Gregor96e578d2010-02-05 17:54:41 +00008673 }
8674
Richard Smith35845152017-02-07 01:37:30 +00008675 case DeclarationName::CXXDeductionGuideName: {
Gabor Marton5ac6d492019-05-15 10:29:48 +00008676 if (auto ToTemplateOrErr = Import(FromName.getCXXDeductionGuideTemplate()))
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008677 return ToContext.DeclarationNames.getCXXDeductionGuideName(
8678 cast<TemplateDecl>(*ToTemplateOrErr));
8679 else
8680 return ToTemplateOrErr.takeError();
Richard Smith35845152017-02-07 01:37:30 +00008681 }
8682
Douglas Gregor96e578d2010-02-05 17:54:41 +00008683 case DeclarationName::CXXConversionFunctionName: {
Gabor Marton5ac6d492019-05-15 10:29:48 +00008684 if (auto ToTyOrErr = Import(FromName.getCXXNameType()))
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008685 return ToContext.DeclarationNames.getCXXConversionFunctionName(
8686 ToContext.getCanonicalType(*ToTyOrErr));
8687 else
8688 return ToTyOrErr.takeError();
Douglas Gregor96e578d2010-02-05 17:54:41 +00008689 }
8690
8691 case DeclarationName::CXXOperatorName:
8692 return ToContext.DeclarationNames.getCXXOperatorName(
8693 FromName.getCXXOverloadedOperator());
8694
8695 case DeclarationName::CXXLiteralOperatorName:
8696 return ToContext.DeclarationNames.getCXXLiteralOperatorName(
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008697 Import(FromName.getCXXLiteralIdentifier()));
Douglas Gregor96e578d2010-02-05 17:54:41 +00008698
8699 case DeclarationName::CXXUsingDirective:
8700 // FIXME: STATICS!
8701 return DeclarationName::getUsingDirectiveName();
8702 }
8703
David Blaikiee4d798f2012-01-20 21:50:17 +00008704 llvm_unreachable("Invalid DeclarationName Kind!");
Douglas Gregor96e578d2010-02-05 17:54:41 +00008705}
8706
Douglas Gregore2e50d332010-12-01 01:36:18 +00008707IdentifierInfo *ASTImporter::Import(const IdentifierInfo *FromId) {
Douglas Gregor96e578d2010-02-05 17:54:41 +00008708 if (!FromId)
Craig Topper36250ad2014-05-12 05:36:57 +00008709 return nullptr;
Douglas Gregor96e578d2010-02-05 17:54:41 +00008710
Sean Callananf94ef1d2016-05-14 06:11:19 +00008711 IdentifierInfo *ToId = &ToContext.Idents.get(FromId->getName());
8712
8713 if (!ToId->getBuiltinID() && FromId->getBuiltinID())
8714 ToId->setBuiltinID(FromId->getBuiltinID());
8715
8716 return ToId;
Douglas Gregor96e578d2010-02-05 17:54:41 +00008717}
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00008718
Gabor Marton5ac6d492019-05-15 10:29:48 +00008719Expected<Selector> ASTImporter::Import(Selector FromSel) {
Douglas Gregor43f54792010-02-17 02:12:47 +00008720 if (FromSel.isNull())
Balazs Kerie2ddb2a2019-03-07 14:09:18 +00008721 return Selector{};
Douglas Gregor43f54792010-02-17 02:12:47 +00008722
Chris Lattner0e62c1c2011-07-23 10:55:15 +00008723 SmallVector<IdentifierInfo *, 4> Idents;
Douglas Gregor43f54792010-02-17 02:12:47 +00008724 Idents.push_back(Import(FromSel.getIdentifierInfoForSlot(0)));
8725 for (unsigned I = 1, N = FromSel.getNumArgs(); I < N; ++I)
8726 Idents.push_back(Import(FromSel.getIdentifierInfoForSlot(I)));
8727 return ToContext.Selectors.getSelector(FromSel.getNumArgs(), Idents.data());
8728}
8729
Gabor Martonf035b752019-08-27 11:36:10 +00008730Expected<DeclarationName> ASTImporter::HandleNameConflict(DeclarationName Name,
8731 DeclContext *DC,
8732 unsigned IDNS,
8733 NamedDecl **Decls,
8734 unsigned NumDecls) {
8735 if (ODRHandling == ODRHandlingType::Conservative)
8736 // Report error at any name conflict.
8737 return make_error<ImportError>(ImportError::NameConflict);
8738 else
8739 // Allow to create the new Decl with the same name.
8740 return Name;
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00008741}
8742
8743DiagnosticBuilder ASTImporter::ToDiag(SourceLocation Loc, unsigned DiagID) {
Richard Smith5bb4cdf2012-12-20 02:22:15 +00008744 if (LastDiagFromFrom)
8745 ToContext.getDiagnostics().notePriorDiagnosticFrom(
8746 FromContext.getDiagnostics());
8747 LastDiagFromFrom = false;
Argyrios Kyrtzidisd0040642010-11-18 20:06:41 +00008748 return ToContext.getDiagnostics().Report(Loc, DiagID);
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00008749}
8750
8751DiagnosticBuilder ASTImporter::FromDiag(SourceLocation Loc, unsigned DiagID) {
Richard Smith5bb4cdf2012-12-20 02:22:15 +00008752 if (!LastDiagFromFrom)
8753 FromContext.getDiagnostics().notePriorDiagnosticFrom(
8754 ToContext.getDiagnostics());
8755 LastDiagFromFrom = true;
Argyrios Kyrtzidisd0040642010-11-18 20:06:41 +00008756 return FromContext.getDiagnostics().Report(Loc, DiagID);
Douglas Gregor3aed6cd2010-02-08 21:09:39 +00008757}
Douglas Gregor8cdbe642010-02-12 23:44:20 +00008758
Douglas Gregor2e15c842012-02-01 21:00:38 +00008759void ASTImporter::CompleteDecl (Decl *D) {
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00008760 if (auto *ID = dyn_cast<ObjCInterfaceDecl>(D)) {
Douglas Gregor2e15c842012-02-01 21:00:38 +00008761 if (!ID->getDefinition())
8762 ID->startDefinition();
8763 }
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00008764 else if (auto *PD = dyn_cast<ObjCProtocolDecl>(D)) {
Douglas Gregor2e15c842012-02-01 21:00:38 +00008765 if (!PD->getDefinition())
8766 PD->startDefinition();
8767 }
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00008768 else if (auto *TD = dyn_cast<TagDecl>(D)) {
Douglas Gregor2e15c842012-02-01 21:00:38 +00008769 if (!TD->getDefinition() && !TD->isBeingDefined()) {
8770 TD->startDefinition();
8771 TD->setCompleteDefinition(true);
8772 }
8773 }
8774 else {
Eugene Zelenko9a9c8232018-04-09 21:54:38 +00008775 assert(0 && "CompleteDecl called on a Decl that can't be completed");
Douglas Gregor2e15c842012-02-01 21:00:38 +00008776 }
8777}
8778
Gabor Marton26f72a92018-07-12 09:42:05 +00008779Decl *ASTImporter::MapImported(Decl *From, Decl *To) {
8780 llvm::DenseMap<Decl *, Decl *>::iterator Pos = ImportedDecls.find(From);
8781 assert((Pos == ImportedDecls.end() || Pos->second == To) &&
8782 "Try to import an already imported Decl");
8783 if (Pos != ImportedDecls.end())
8784 return Pos->second;
Douglas Gregor8cdbe642010-02-12 23:44:20 +00008785 ImportedDecls[From] = To;
Gabor Marton458d1452019-02-14 13:07:03 +00008786 // This mapping should be maintained only in this function. Therefore do not
8787 // check for additional consistency.
8788 ImportedFromDecls[To] = From;
Gabor Marton303c98612019-06-25 08:00:51 +00008789 AddToLookupTable(To);
Douglas Gregor8cdbe642010-02-12 23:44:20 +00008790 return To;
Daniel Dunbar9ced5422010-02-13 20:24:39 +00008791}
Douglas Gregorb4964f72010-02-15 23:54:17 +00008792
Gabor Marton303c98612019-06-25 08:00:51 +00008793llvm::Optional<ImportError>
8794ASTImporter::getImportDeclErrorIfAny(Decl *FromD) const {
8795 auto Pos = ImportDeclErrors.find(FromD);
8796 if (Pos != ImportDeclErrors.end())
8797 return Pos->second;
8798 else
8799 return Optional<ImportError>();
8800}
8801
8802void ASTImporter::setImportDeclError(Decl *From, ImportError Error) {
Gabor Marton1ad4b992019-07-01 14:19:53 +00008803 auto InsertRes = ImportDeclErrors.insert({From, Error});
Benjamin Kramer4f769362019-07-01 14:33:26 +00008804 (void)InsertRes;
Gabor Marton1ad4b992019-07-01 14:19:53 +00008805 // Either we set the error for the first time, or we already had set one and
8806 // now we want to set the same error.
8807 assert(InsertRes.second || InsertRes.first->second.Error == Error.Error);
Gabor Marton303c98612019-06-25 08:00:51 +00008808}
8809
Douglas Gregordd6006f2012-07-17 21:16:27 +00008810bool ASTImporter::IsStructurallyEquivalent(QualType From, QualType To,
8811 bool Complain) {
Balazs Keria1f6b102019-04-08 13:59:15 +00008812 llvm::DenseMap<const Type *, const Type *>::iterator Pos =
8813 ImportedTypes.find(From.getTypePtr());
8814 if (Pos != ImportedTypes.end()) {
Gabor Marton5ac6d492019-05-15 10:29:48 +00008815 if (ExpectedType ToFromOrErr = Import(From)) {
Balazs Keria1f6b102019-04-08 13:59:15 +00008816 if (ToContext.hasSameType(*ToFromOrErr, To))
8817 return true;
8818 } else {
8819 llvm::consumeError(ToFromOrErr.takeError());
8820 }
8821 }
Bruno Cardoso Lopes95ff11b2017-04-28 00:31:30 +00008822
Douglas Gregordd6006f2012-07-17 21:16:27 +00008823 StructuralEquivalenceContext Ctx(FromContext, ToContext, NonEquivalentDecls,
Gabor Marton26f72a92018-07-12 09:42:05 +00008824 getStructuralEquivalenceKind(*this), false,
8825 Complain);
Gabor Marton950fb572018-07-17 12:39:27 +00008826 return Ctx.IsEquivalent(From, To);
Douglas Gregorb4964f72010-02-15 23:54:17 +00008827}