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