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