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