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 1840 #define FIELD(Name, Width, Merge) \ 1841 ToData.Name = FromData.Name; 1842 #include "clang/AST/CXXRecordDeclDefinitionBits.def" 1843 1844 // Copy over the data stored in RecordDeclBits 1845 ToCXX->setArgPassingRestrictions(FromCXX->getArgPassingRestrictions()); 1846 1847 SmallVector<CXXBaseSpecifier *, 4> Bases; 1848 for (const auto &Base1 : FromCXX->bases()) { 1849 ExpectedType TyOrErr = import(Base1.getType()); 1850 if (!TyOrErr) 1851 return TyOrErr.takeError(); 1852 1853 SourceLocation EllipsisLoc; 1854 if (Base1.isPackExpansion()) { 1855 if (ExpectedSLoc LocOrErr = import(Base1.getEllipsisLoc())) 1856 EllipsisLoc = *LocOrErr; 1857 else 1858 return LocOrErr.takeError(); 1859 } 1860 1861 // Ensure that we have a definition for the base. 1862 if (Error Err = 1863 ImportDefinitionIfNeeded(Base1.getType()->getAsCXXRecordDecl())) 1864 return Err; 1865 1866 auto RangeOrErr = import(Base1.getSourceRange()); 1867 if (!RangeOrErr) 1868 return RangeOrErr.takeError(); 1869 1870 auto TSIOrErr = import(Base1.getTypeSourceInfo()); 1871 if (!TSIOrErr) 1872 return TSIOrErr.takeError(); 1873 1874 Bases.push_back( 1875 new (Importer.getToContext()) CXXBaseSpecifier( 1876 *RangeOrErr, 1877 Base1.isVirtual(), 1878 Base1.isBaseOfClass(), 1879 Base1.getAccessSpecifierAsWritten(), 1880 *TSIOrErr, 1881 EllipsisLoc)); 1882 } 1883 if (!Bases.empty()) 1884 ToCXX->setBases(Bases.data(), Bases.size()); 1885 } 1886 1887 if (shouldForceImportDeclContext(Kind)) 1888 if (Error Err = ImportDeclContext(From, /*ForceImport=*/true)) 1889 return Err; 1890 1891 return Error::success(); 1892 } 1893 1894 Error ASTNodeImporter::ImportInitializer(VarDecl *From, VarDecl *To) { 1895 if (To->getAnyInitializer()) 1896 return Error::success(); 1897 1898 Expr *FromInit = From->getInit(); 1899 if (!FromInit) 1900 return Error::success(); 1901 1902 ExpectedExpr ToInitOrErr = import(FromInit); 1903 if (!ToInitOrErr) 1904 return ToInitOrErr.takeError(); 1905 1906 To->setInit(*ToInitOrErr); 1907 if (From->isInitKnownICE()) { 1908 EvaluatedStmt *Eval = To->ensureEvaluatedStmt(); 1909 Eval->CheckedICE = true; 1910 Eval->IsICE = From->isInitICE(); 1911 } 1912 1913 // FIXME: Other bits to merge? 1914 return Error::success(); 1915 } 1916 1917 Error ASTNodeImporter::ImportDefinition( 1918 EnumDecl *From, EnumDecl *To, ImportDefinitionKind Kind) { 1919 if (To->getDefinition() || To->isBeingDefined()) { 1920 if (Kind == IDK_Everything) 1921 return ImportDeclContext(From, /*ForceImport=*/true); 1922 return Error::success(); 1923 } 1924 1925 To->startDefinition(); 1926 1927 if (Error Err = setTypedefNameForAnonDecl(From, To, Importer)) 1928 return Err; 1929 1930 ExpectedType ToTypeOrErr = 1931 import(Importer.getFromContext().getTypeDeclType(From)); 1932 if (!ToTypeOrErr) 1933 return ToTypeOrErr.takeError(); 1934 1935 ExpectedType ToPromotionTypeOrErr = import(From->getPromotionType()); 1936 if (!ToPromotionTypeOrErr) 1937 return ToPromotionTypeOrErr.takeError(); 1938 1939 if (shouldForceImportDeclContext(Kind)) 1940 if (Error Err = ImportDeclContext(From, /*ForceImport=*/true)) 1941 return Err; 1942 1943 // FIXME: we might need to merge the number of positive or negative bits 1944 // if the enumerator lists don't match. 1945 To->completeDefinition(*ToTypeOrErr, *ToPromotionTypeOrErr, 1946 From->getNumPositiveBits(), 1947 From->getNumNegativeBits()); 1948 return Error::success(); 1949 } 1950 1951 Error ASTNodeImporter::ImportTemplateArguments( 1952 const TemplateArgument *FromArgs, unsigned NumFromArgs, 1953 SmallVectorImpl<TemplateArgument> &ToArgs) { 1954 for (unsigned I = 0; I != NumFromArgs; ++I) { 1955 if (auto ToOrErr = import(FromArgs[I])) 1956 ToArgs.push_back(*ToOrErr); 1957 else 1958 return ToOrErr.takeError(); 1959 } 1960 1961 return Error::success(); 1962 } 1963 1964 // FIXME: Do not forget to remove this and use only 'import'. 1965 Expected<TemplateArgument> 1966 ASTNodeImporter::ImportTemplateArgument(const TemplateArgument &From) { 1967 return import(From); 1968 } 1969 1970 template <typename InContainerTy> 1971 Error ASTNodeImporter::ImportTemplateArgumentListInfo( 1972 const InContainerTy &Container, TemplateArgumentListInfo &ToTAInfo) { 1973 for (const auto &FromLoc : Container) { 1974 if (auto ToLocOrErr = import(FromLoc)) 1975 ToTAInfo.addArgument(*ToLocOrErr); 1976 else 1977 return ToLocOrErr.takeError(); 1978 } 1979 return Error::success(); 1980 } 1981 1982 static StructuralEquivalenceKind 1983 getStructuralEquivalenceKind(const ASTImporter &Importer) { 1984 return Importer.isMinimalImport() ? StructuralEquivalenceKind::Minimal 1985 : StructuralEquivalenceKind::Default; 1986 } 1987 1988 bool ASTNodeImporter::IsStructuralMatch(Decl *From, Decl *To, bool Complain) { 1989 StructuralEquivalenceContext Ctx( 1990 Importer.getFromContext(), Importer.getToContext(), 1991 Importer.getNonEquivalentDecls(), getStructuralEquivalenceKind(Importer), 1992 false, Complain); 1993 return Ctx.IsEquivalent(From, To); 1994 } 1995 1996 bool ASTNodeImporter::IsStructuralMatch(RecordDecl *FromRecord, 1997 RecordDecl *ToRecord, bool Complain) { 1998 // Eliminate a potential failure point where we attempt to re-import 1999 // something we're trying to import while completing ToRecord. 2000 Decl *ToOrigin = Importer.GetOriginalDecl(ToRecord); 2001 if (ToOrigin) { 2002 auto *ToOriginRecord = dyn_cast<RecordDecl>(ToOrigin); 2003 if (ToOriginRecord) 2004 ToRecord = ToOriginRecord; 2005 } 2006 2007 StructuralEquivalenceContext Ctx(Importer.getFromContext(), 2008 ToRecord->getASTContext(), 2009 Importer.getNonEquivalentDecls(), 2010 getStructuralEquivalenceKind(Importer), 2011 false, Complain); 2012 return Ctx.IsEquivalent(FromRecord, ToRecord); 2013 } 2014 2015 bool ASTNodeImporter::IsStructuralMatch(VarDecl *FromVar, VarDecl *ToVar, 2016 bool Complain) { 2017 StructuralEquivalenceContext Ctx( 2018 Importer.getFromContext(), Importer.getToContext(), 2019 Importer.getNonEquivalentDecls(), getStructuralEquivalenceKind(Importer), 2020 false, Complain); 2021 return Ctx.IsEquivalent(FromVar, ToVar); 2022 } 2023 2024 bool ASTNodeImporter::IsStructuralMatch(EnumDecl *FromEnum, EnumDecl *ToEnum) { 2025 // Eliminate a potential failure point where we attempt to re-import 2026 // something we're trying to import while completing ToEnum. 2027 if (Decl *ToOrigin = Importer.GetOriginalDecl(ToEnum)) 2028 if (auto *ToOriginEnum = dyn_cast<EnumDecl>(ToOrigin)) 2029 ToEnum = ToOriginEnum; 2030 2031 StructuralEquivalenceContext Ctx( 2032 Importer.getFromContext(), Importer.getToContext(), 2033 Importer.getNonEquivalentDecls(), getStructuralEquivalenceKind(Importer)); 2034 return Ctx.IsEquivalent(FromEnum, ToEnum); 2035 } 2036 2037 bool ASTNodeImporter::IsStructuralMatch(FunctionTemplateDecl *From, 2038 FunctionTemplateDecl *To) { 2039 StructuralEquivalenceContext Ctx( 2040 Importer.getFromContext(), Importer.getToContext(), 2041 Importer.getNonEquivalentDecls(), getStructuralEquivalenceKind(Importer), 2042 false, false); 2043 return Ctx.IsEquivalent(From, To); 2044 } 2045 2046 bool ASTNodeImporter::IsStructuralMatch(FunctionDecl *From, FunctionDecl *To) { 2047 StructuralEquivalenceContext Ctx( 2048 Importer.getFromContext(), Importer.getToContext(), 2049 Importer.getNonEquivalentDecls(), getStructuralEquivalenceKind(Importer), 2050 false, false); 2051 return Ctx.IsEquivalent(From, To); 2052 } 2053 2054 bool ASTNodeImporter::IsStructuralMatch(EnumConstantDecl *FromEC, 2055 EnumConstantDecl *ToEC) { 2056 const llvm::APSInt &FromVal = FromEC->getInitVal(); 2057 const llvm::APSInt &ToVal = ToEC->getInitVal(); 2058 2059 return FromVal.isSigned() == ToVal.isSigned() && 2060 FromVal.getBitWidth() == ToVal.getBitWidth() && 2061 FromVal == ToVal; 2062 } 2063 2064 bool ASTNodeImporter::IsStructuralMatch(ClassTemplateDecl *From, 2065 ClassTemplateDecl *To) { 2066 StructuralEquivalenceContext Ctx(Importer.getFromContext(), 2067 Importer.getToContext(), 2068 Importer.getNonEquivalentDecls(), 2069 getStructuralEquivalenceKind(Importer)); 2070 return Ctx.IsEquivalent(From, To); 2071 } 2072 2073 bool ASTNodeImporter::IsStructuralMatch(VarTemplateDecl *From, 2074 VarTemplateDecl *To) { 2075 StructuralEquivalenceContext Ctx(Importer.getFromContext(), 2076 Importer.getToContext(), 2077 Importer.getNonEquivalentDecls(), 2078 getStructuralEquivalenceKind(Importer)); 2079 return Ctx.IsEquivalent(From, To); 2080 } 2081 2082 ExpectedDecl ASTNodeImporter::VisitDecl(Decl *D) { 2083 Importer.FromDiag(D->getLocation(), diag::err_unsupported_ast_node) 2084 << D->getDeclKindName(); 2085 return make_error<ImportError>(ImportError::UnsupportedConstruct); 2086 } 2087 2088 ExpectedDecl ASTNodeImporter::VisitImportDecl(ImportDecl *D) { 2089 Importer.FromDiag(D->getLocation(), diag::err_unsupported_ast_node) 2090 << D->getDeclKindName(); 2091 return make_error<ImportError>(ImportError::UnsupportedConstruct); 2092 } 2093 2094 ExpectedDecl ASTNodeImporter::VisitEmptyDecl(EmptyDecl *D) { 2095 // Import the context of this declaration. 2096 DeclContext *DC, *LexicalDC; 2097 if (Error Err = ImportDeclContext(D, DC, LexicalDC)) 2098 return std::move(Err); 2099 2100 // Import the location of this declaration. 2101 ExpectedSLoc LocOrErr = import(D->getLocation()); 2102 if (!LocOrErr) 2103 return LocOrErr.takeError(); 2104 2105 EmptyDecl *ToD; 2106 if (GetImportedOrCreateDecl(ToD, D, Importer.getToContext(), DC, *LocOrErr)) 2107 return ToD; 2108 2109 ToD->setLexicalDeclContext(LexicalDC); 2110 LexicalDC->addDeclInternal(ToD); 2111 return ToD; 2112 } 2113 2114 ExpectedDecl ASTNodeImporter::VisitTranslationUnitDecl(TranslationUnitDecl *D) { 2115 TranslationUnitDecl *ToD = 2116 Importer.getToContext().getTranslationUnitDecl(); 2117 2118 Importer.MapImported(D, ToD); 2119 2120 return ToD; 2121 } 2122 2123 ExpectedDecl ASTNodeImporter::VisitAccessSpecDecl(AccessSpecDecl *D) { 2124 ExpectedSLoc LocOrErr = import(D->getLocation()); 2125 if (!LocOrErr) 2126 return LocOrErr.takeError(); 2127 auto ColonLocOrErr = import(D->getColonLoc()); 2128 if (!ColonLocOrErr) 2129 return ColonLocOrErr.takeError(); 2130 2131 // Import the context of this declaration. 2132 auto DCOrErr = Importer.ImportContext(D->getDeclContext()); 2133 if (!DCOrErr) 2134 return DCOrErr.takeError(); 2135 DeclContext *DC = *DCOrErr; 2136 2137 AccessSpecDecl *ToD; 2138 if (GetImportedOrCreateDecl(ToD, D, Importer.getToContext(), D->getAccess(), 2139 DC, *LocOrErr, *ColonLocOrErr)) 2140 return ToD; 2141 2142 // Lexical DeclContext and Semantic DeclContext 2143 // is always the same for the accessSpec. 2144 ToD->setLexicalDeclContext(DC); 2145 DC->addDeclInternal(ToD); 2146 2147 return ToD; 2148 } 2149 2150 ExpectedDecl ASTNodeImporter::VisitStaticAssertDecl(StaticAssertDecl *D) { 2151 auto DCOrErr = Importer.ImportContext(D->getDeclContext()); 2152 if (!DCOrErr) 2153 return DCOrErr.takeError(); 2154 DeclContext *DC = *DCOrErr; 2155 DeclContext *LexicalDC = DC; 2156 2157 SourceLocation ToLocation, ToRParenLoc; 2158 Expr *ToAssertExpr; 2159 StringLiteral *ToMessage; 2160 if (auto Imp = importSeq( 2161 D->getLocation(), D->getAssertExpr(), D->getMessage(), D->getRParenLoc())) 2162 std::tie(ToLocation, ToAssertExpr, ToMessage, ToRParenLoc) = *Imp; 2163 else 2164 return Imp.takeError(); 2165 2166 StaticAssertDecl *ToD; 2167 if (GetImportedOrCreateDecl( 2168 ToD, D, Importer.getToContext(), DC, ToLocation, ToAssertExpr, ToMessage, 2169 ToRParenLoc, D->isFailed())) 2170 return ToD; 2171 2172 ToD->setLexicalDeclContext(LexicalDC); 2173 LexicalDC->addDeclInternal(ToD); 2174 return ToD; 2175 } 2176 2177 ExpectedDecl ASTNodeImporter::VisitNamespaceDecl(NamespaceDecl *D) { 2178 // Import the major distinguishing characteristics of this namespace. 2179 DeclContext *DC, *LexicalDC; 2180 DeclarationName Name; 2181 SourceLocation Loc; 2182 NamedDecl *ToD; 2183 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 2184 return std::move(Err); 2185 if (ToD) 2186 return ToD; 2187 2188 NamespaceDecl *MergeWithNamespace = nullptr; 2189 if (!Name) { 2190 // This is an anonymous namespace. Adopt an existing anonymous 2191 // namespace if we can. 2192 // FIXME: Not testable. 2193 if (auto *TU = dyn_cast<TranslationUnitDecl>(DC)) 2194 MergeWithNamespace = TU->getAnonymousNamespace(); 2195 else 2196 MergeWithNamespace = cast<NamespaceDecl>(DC)->getAnonymousNamespace(); 2197 } else { 2198 SmallVector<NamedDecl *, 4> ConflictingDecls; 2199 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name); 2200 for (auto *FoundDecl : FoundDecls) { 2201 if (!FoundDecl->isInIdentifierNamespace(Decl::IDNS_Namespace)) 2202 continue; 2203 2204 if (auto *FoundNS = dyn_cast<NamespaceDecl>(FoundDecl)) { 2205 MergeWithNamespace = FoundNS; 2206 ConflictingDecls.clear(); 2207 break; 2208 } 2209 2210 ConflictingDecls.push_back(FoundDecl); 2211 } 2212 2213 if (!ConflictingDecls.empty()) { 2214 ExpectedName NameOrErr = Importer.HandleNameConflict( 2215 Name, DC, Decl::IDNS_Namespace, ConflictingDecls.data(), 2216 ConflictingDecls.size()); 2217 if (NameOrErr) 2218 Name = NameOrErr.get(); 2219 else 2220 return NameOrErr.takeError(); 2221 } 2222 } 2223 2224 ExpectedSLoc BeginLocOrErr = import(D->getBeginLoc()); 2225 if (!BeginLocOrErr) 2226 return BeginLocOrErr.takeError(); 2227 2228 // Create the "to" namespace, if needed. 2229 NamespaceDecl *ToNamespace = MergeWithNamespace; 2230 if (!ToNamespace) { 2231 if (GetImportedOrCreateDecl( 2232 ToNamespace, D, Importer.getToContext(), DC, D->isInline(), 2233 *BeginLocOrErr, Loc, Name.getAsIdentifierInfo(), 2234 /*PrevDecl=*/nullptr)) 2235 return ToNamespace; 2236 ToNamespace->setLexicalDeclContext(LexicalDC); 2237 LexicalDC->addDeclInternal(ToNamespace); 2238 2239 // If this is an anonymous namespace, register it as the anonymous 2240 // namespace within its context. 2241 if (!Name) { 2242 if (auto *TU = dyn_cast<TranslationUnitDecl>(DC)) 2243 TU->setAnonymousNamespace(ToNamespace); 2244 else 2245 cast<NamespaceDecl>(DC)->setAnonymousNamespace(ToNamespace); 2246 } 2247 } 2248 Importer.MapImported(D, ToNamespace); 2249 2250 if (Error Err = ImportDeclContext(D)) 2251 return std::move(Err); 2252 2253 return ToNamespace; 2254 } 2255 2256 ExpectedDecl ASTNodeImporter::VisitNamespaceAliasDecl(NamespaceAliasDecl *D) { 2257 // Import the major distinguishing characteristics of this namespace. 2258 DeclContext *DC, *LexicalDC; 2259 DeclarationName Name; 2260 SourceLocation Loc; 2261 NamedDecl *LookupD; 2262 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, LookupD, Loc)) 2263 return std::move(Err); 2264 if (LookupD) 2265 return LookupD; 2266 2267 // NOTE: No conflict resolution is done for namespace aliases now. 2268 2269 SourceLocation ToNamespaceLoc, ToAliasLoc, ToTargetNameLoc; 2270 NestedNameSpecifierLoc ToQualifierLoc; 2271 NamespaceDecl *ToNamespace; 2272 if (auto Imp = importSeq( 2273 D->getNamespaceLoc(), D->getAliasLoc(), D->getQualifierLoc(), 2274 D->getTargetNameLoc(), D->getNamespace())) 2275 std::tie( 2276 ToNamespaceLoc, ToAliasLoc, ToQualifierLoc, ToTargetNameLoc, 2277 ToNamespace) = *Imp; 2278 else 2279 return Imp.takeError(); 2280 IdentifierInfo *ToIdentifier = Importer.Import(D->getIdentifier()); 2281 2282 NamespaceAliasDecl *ToD; 2283 if (GetImportedOrCreateDecl( 2284 ToD, D, Importer.getToContext(), DC, ToNamespaceLoc, ToAliasLoc, 2285 ToIdentifier, ToQualifierLoc, ToTargetNameLoc, ToNamespace)) 2286 return ToD; 2287 2288 ToD->setLexicalDeclContext(LexicalDC); 2289 LexicalDC->addDeclInternal(ToD); 2290 2291 return ToD; 2292 } 2293 2294 ExpectedDecl 2295 ASTNodeImporter::VisitTypedefNameDecl(TypedefNameDecl *D, bool IsAlias) { 2296 // Import the major distinguishing characteristics of this typedef. 2297 DeclContext *DC, *LexicalDC; 2298 DeclarationName Name; 2299 SourceLocation Loc; 2300 NamedDecl *ToD; 2301 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 2302 return std::move(Err); 2303 if (ToD) 2304 return ToD; 2305 2306 // If this typedef is not in block scope, determine whether we've 2307 // seen a typedef with the same name (that we can merge with) or any 2308 // other entity by that name (which name lookup could conflict with). 2309 // Note: Repeated typedefs are not valid in C99: 2310 // 'typedef int T; typedef int T;' is invalid 2311 // We do not care about this now. 2312 if (!DC->isFunctionOrMethod()) { 2313 SmallVector<NamedDecl *, 4> ConflictingDecls; 2314 unsigned IDNS = Decl::IDNS_Ordinary; 2315 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name); 2316 for (auto *FoundDecl : FoundDecls) { 2317 if (!FoundDecl->isInIdentifierNamespace(IDNS)) 2318 continue; 2319 if (auto *FoundTypedef = dyn_cast<TypedefNameDecl>(FoundDecl)) { 2320 if (!hasSameVisibilityContext(FoundTypedef, D)) 2321 continue; 2322 2323 QualType FromUT = D->getUnderlyingType(); 2324 QualType FoundUT = FoundTypedef->getUnderlyingType(); 2325 if (Importer.IsStructurallyEquivalent(FromUT, FoundUT)) { 2326 // If the "From" context has a complete underlying type but we 2327 // already have a complete underlying type then return with that. 2328 if (!FromUT->isIncompleteType() && !FoundUT->isIncompleteType()) 2329 return Importer.MapImported(D, FoundTypedef); 2330 // FIXME Handle redecl chain. When you do that make consistent changes 2331 // in ASTImporterLookupTable too. 2332 } else { 2333 ConflictingDecls.push_back(FoundDecl); 2334 } 2335 } 2336 } 2337 2338 if (!ConflictingDecls.empty()) { 2339 ExpectedName NameOrErr = Importer.HandleNameConflict( 2340 Name, DC, IDNS, ConflictingDecls.data(), ConflictingDecls.size()); 2341 if (NameOrErr) 2342 Name = NameOrErr.get(); 2343 else 2344 return NameOrErr.takeError(); 2345 } 2346 } 2347 2348 QualType ToUnderlyingType; 2349 TypeSourceInfo *ToTypeSourceInfo; 2350 SourceLocation ToBeginLoc; 2351 if (auto Imp = importSeq( 2352 D->getUnderlyingType(), D->getTypeSourceInfo(), D->getBeginLoc())) 2353 std::tie(ToUnderlyingType, ToTypeSourceInfo, ToBeginLoc) = *Imp; 2354 else 2355 return Imp.takeError(); 2356 2357 // Create the new typedef node. 2358 // FIXME: ToUnderlyingType is not used. 2359 TypedefNameDecl *ToTypedef; 2360 if (IsAlias) { 2361 if (GetImportedOrCreateDecl<TypeAliasDecl>( 2362 ToTypedef, D, Importer.getToContext(), DC, ToBeginLoc, Loc, 2363 Name.getAsIdentifierInfo(), ToTypeSourceInfo)) 2364 return ToTypedef; 2365 } else if (GetImportedOrCreateDecl<TypedefDecl>( 2366 ToTypedef, D, Importer.getToContext(), DC, ToBeginLoc, Loc, 2367 Name.getAsIdentifierInfo(), ToTypeSourceInfo)) 2368 return ToTypedef; 2369 2370 ToTypedef->setAccess(D->getAccess()); 2371 ToTypedef->setLexicalDeclContext(LexicalDC); 2372 2373 // Templated declarations should not appear in DeclContext. 2374 TypeAliasDecl *FromAlias = IsAlias ? cast<TypeAliasDecl>(D) : nullptr; 2375 if (!FromAlias || !FromAlias->getDescribedAliasTemplate()) 2376 LexicalDC->addDeclInternal(ToTypedef); 2377 2378 return ToTypedef; 2379 } 2380 2381 ExpectedDecl ASTNodeImporter::VisitTypedefDecl(TypedefDecl *D) { 2382 return VisitTypedefNameDecl(D, /*IsAlias=*/false); 2383 } 2384 2385 ExpectedDecl ASTNodeImporter::VisitTypeAliasDecl(TypeAliasDecl *D) { 2386 return VisitTypedefNameDecl(D, /*IsAlias=*/true); 2387 } 2388 2389 ExpectedDecl 2390 ASTNodeImporter::VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D) { 2391 // Import the major distinguishing characteristics of this typedef. 2392 DeclContext *DC, *LexicalDC; 2393 DeclarationName Name; 2394 SourceLocation Loc; 2395 NamedDecl *FoundD; 2396 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, FoundD, Loc)) 2397 return std::move(Err); 2398 if (FoundD) 2399 return FoundD; 2400 2401 // If this typedef is not in block scope, determine whether we've 2402 // seen a typedef with the same name (that we can merge with) or any 2403 // other entity by that name (which name lookup could conflict with). 2404 if (!DC->isFunctionOrMethod()) { 2405 SmallVector<NamedDecl *, 4> ConflictingDecls; 2406 unsigned IDNS = Decl::IDNS_Ordinary; 2407 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name); 2408 for (auto *FoundDecl : FoundDecls) { 2409 if (!FoundDecl->isInIdentifierNamespace(IDNS)) 2410 continue; 2411 if (auto *FoundAlias = dyn_cast<TypeAliasTemplateDecl>(FoundDecl)) 2412 return Importer.MapImported(D, FoundAlias); 2413 ConflictingDecls.push_back(FoundDecl); 2414 } 2415 2416 if (!ConflictingDecls.empty()) { 2417 ExpectedName NameOrErr = Importer.HandleNameConflict( 2418 Name, DC, IDNS, ConflictingDecls.data(), ConflictingDecls.size()); 2419 if (NameOrErr) 2420 Name = NameOrErr.get(); 2421 else 2422 return NameOrErr.takeError(); 2423 } 2424 } 2425 2426 TemplateParameterList *ToTemplateParameters; 2427 TypeAliasDecl *ToTemplatedDecl; 2428 if (auto Imp = importSeq(D->getTemplateParameters(), D->getTemplatedDecl())) 2429 std::tie(ToTemplateParameters, ToTemplatedDecl) = *Imp; 2430 else 2431 return Imp.takeError(); 2432 2433 TypeAliasTemplateDecl *ToAlias; 2434 if (GetImportedOrCreateDecl(ToAlias, D, Importer.getToContext(), DC, Loc, 2435 Name, ToTemplateParameters, ToTemplatedDecl)) 2436 return ToAlias; 2437 2438 ToTemplatedDecl->setDescribedAliasTemplate(ToAlias); 2439 2440 ToAlias->setAccess(D->getAccess()); 2441 ToAlias->setLexicalDeclContext(LexicalDC); 2442 LexicalDC->addDeclInternal(ToAlias); 2443 return ToAlias; 2444 } 2445 2446 ExpectedDecl ASTNodeImporter::VisitLabelDecl(LabelDecl *D) { 2447 // Import the major distinguishing characteristics of this label. 2448 DeclContext *DC, *LexicalDC; 2449 DeclarationName Name; 2450 SourceLocation Loc; 2451 NamedDecl *ToD; 2452 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 2453 return std::move(Err); 2454 if (ToD) 2455 return ToD; 2456 2457 assert(LexicalDC->isFunctionOrMethod()); 2458 2459 LabelDecl *ToLabel; 2460 if (D->isGnuLocal()) { 2461 ExpectedSLoc BeginLocOrErr = import(D->getBeginLoc()); 2462 if (!BeginLocOrErr) 2463 return BeginLocOrErr.takeError(); 2464 if (GetImportedOrCreateDecl(ToLabel, D, Importer.getToContext(), DC, Loc, 2465 Name.getAsIdentifierInfo(), *BeginLocOrErr)) 2466 return ToLabel; 2467 2468 } else { 2469 if (GetImportedOrCreateDecl(ToLabel, D, Importer.getToContext(), DC, Loc, 2470 Name.getAsIdentifierInfo())) 2471 return ToLabel; 2472 2473 } 2474 2475 Expected<LabelStmt *> ToStmtOrErr = import(D->getStmt()); 2476 if (!ToStmtOrErr) 2477 return ToStmtOrErr.takeError(); 2478 2479 ToLabel->setStmt(*ToStmtOrErr); 2480 ToLabel->setLexicalDeclContext(LexicalDC); 2481 LexicalDC->addDeclInternal(ToLabel); 2482 return ToLabel; 2483 } 2484 2485 ExpectedDecl ASTNodeImporter::VisitEnumDecl(EnumDecl *D) { 2486 // Import the major distinguishing characteristics of this enum. 2487 DeclContext *DC, *LexicalDC; 2488 DeclarationName Name; 2489 SourceLocation Loc; 2490 NamedDecl *ToD; 2491 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 2492 return std::move(Err); 2493 if (ToD) 2494 return ToD; 2495 2496 // Figure out what enum name we're looking for. 2497 unsigned IDNS = Decl::IDNS_Tag; 2498 DeclarationName SearchName = Name; 2499 if (!SearchName && D->getTypedefNameForAnonDecl()) { 2500 if (Error Err = importInto( 2501 SearchName, D->getTypedefNameForAnonDecl()->getDeclName())) 2502 return std::move(Err); 2503 IDNS = Decl::IDNS_Ordinary; 2504 } else if (Importer.getToContext().getLangOpts().CPlusPlus) 2505 IDNS |= Decl::IDNS_Ordinary; 2506 2507 // We may already have an enum of the same name; try to find and match it. 2508 if (!DC->isFunctionOrMethod() && SearchName) { 2509 SmallVector<NamedDecl *, 4> ConflictingDecls; 2510 auto FoundDecls = 2511 Importer.findDeclsInToCtx(DC, SearchName); 2512 for (auto *FoundDecl : FoundDecls) { 2513 if (!FoundDecl->isInIdentifierNamespace(IDNS)) 2514 continue; 2515 2516 if (auto *Typedef = dyn_cast<TypedefNameDecl>(FoundDecl)) { 2517 if (const auto *Tag = Typedef->getUnderlyingType()->getAs<TagType>()) 2518 FoundDecl = Tag->getDecl(); 2519 } 2520 2521 if (auto *FoundEnum = dyn_cast<EnumDecl>(FoundDecl)) { 2522 if (!hasSameVisibilityContext(FoundEnum, D)) 2523 continue; 2524 if (IsStructuralMatch(D, FoundEnum)) 2525 return Importer.MapImported(D, FoundEnum); 2526 ConflictingDecls.push_back(FoundDecl); 2527 } 2528 } 2529 2530 if (!ConflictingDecls.empty()) { 2531 ExpectedName NameOrErr = Importer.HandleNameConflict( 2532 SearchName, DC, IDNS, ConflictingDecls.data(), 2533 ConflictingDecls.size()); 2534 if (NameOrErr) 2535 Name = NameOrErr.get(); 2536 else 2537 return NameOrErr.takeError(); 2538 } 2539 } 2540 2541 SourceLocation ToBeginLoc; 2542 NestedNameSpecifierLoc ToQualifierLoc; 2543 QualType ToIntegerType; 2544 if (auto Imp = importSeq( 2545 D->getBeginLoc(), D->getQualifierLoc(), D->getIntegerType())) 2546 std::tie(ToBeginLoc, ToQualifierLoc, ToIntegerType) = *Imp; 2547 else 2548 return Imp.takeError(); 2549 2550 // Create the enum declaration. 2551 EnumDecl *D2; 2552 if (GetImportedOrCreateDecl( 2553 D2, D, Importer.getToContext(), DC, ToBeginLoc, 2554 Loc, Name.getAsIdentifierInfo(), nullptr, D->isScoped(), 2555 D->isScopedUsingClassTag(), D->isFixed())) 2556 return D2; 2557 2558 D2->setQualifierInfo(ToQualifierLoc); 2559 D2->setIntegerType(ToIntegerType); 2560 D2->setAccess(D->getAccess()); 2561 D2->setLexicalDeclContext(LexicalDC); 2562 LexicalDC->addDeclInternal(D2); 2563 2564 // Import the definition 2565 if (D->isCompleteDefinition()) 2566 if (Error Err = ImportDefinition(D, D2)) 2567 return std::move(Err); 2568 2569 return D2; 2570 } 2571 2572 ExpectedDecl ASTNodeImporter::VisitRecordDecl(RecordDecl *D) { 2573 bool IsFriendTemplate = false; 2574 if (auto *DCXX = dyn_cast<CXXRecordDecl>(D)) { 2575 IsFriendTemplate = 2576 DCXX->getDescribedClassTemplate() && 2577 DCXX->getDescribedClassTemplate()->getFriendObjectKind() != 2578 Decl::FOK_None; 2579 } 2580 2581 // Import the major distinguishing characteristics of this record. 2582 DeclContext *DC = nullptr, *LexicalDC = nullptr; 2583 DeclarationName Name; 2584 SourceLocation Loc; 2585 NamedDecl *ToD = nullptr; 2586 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 2587 return std::move(Err); 2588 if (ToD) 2589 return ToD; 2590 2591 // Figure out what structure name we're looking for. 2592 unsigned IDNS = Decl::IDNS_Tag; 2593 DeclarationName SearchName = Name; 2594 if (!SearchName && D->getTypedefNameForAnonDecl()) { 2595 if (Error Err = importInto( 2596 SearchName, D->getTypedefNameForAnonDecl()->getDeclName())) 2597 return std::move(Err); 2598 IDNS = Decl::IDNS_Ordinary; 2599 } else if (Importer.getToContext().getLangOpts().CPlusPlus) 2600 IDNS |= Decl::IDNS_Ordinary | Decl::IDNS_TagFriend; 2601 2602 // We may already have a record of the same name; try to find and match it. 2603 RecordDecl *PrevDecl = nullptr; 2604 if (!DC->isFunctionOrMethod() && !D->isLambda()) { 2605 SmallVector<NamedDecl *, 4> ConflictingDecls; 2606 auto FoundDecls = 2607 Importer.findDeclsInToCtx(DC, SearchName); 2608 if (!FoundDecls.empty()) { 2609 // We're going to have to compare D against potentially conflicting Decls, 2610 // so complete it. 2611 if (D->hasExternalLexicalStorage() && !D->isCompleteDefinition()) 2612 D->getASTContext().getExternalSource()->CompleteType(D); 2613 } 2614 2615 for (auto *FoundDecl : FoundDecls) { 2616 if (!FoundDecl->isInIdentifierNamespace(IDNS)) 2617 continue; 2618 2619 Decl *Found = FoundDecl; 2620 if (auto *Typedef = dyn_cast<TypedefNameDecl>(Found)) { 2621 if (const auto *Tag = Typedef->getUnderlyingType()->getAs<TagType>()) 2622 Found = Tag->getDecl(); 2623 } 2624 2625 if (auto *FoundRecord = dyn_cast<RecordDecl>(Found)) { 2626 // Do not emit false positive diagnostic in case of unnamed 2627 // struct/union and in case of anonymous structs. Would be false 2628 // because there may be several anonymous/unnamed structs in a class. 2629 // E.g. these are both valid: 2630 // struct A { // unnamed structs 2631 // struct { struct A *next; } entry0; 2632 // struct { struct A *next; } entry1; 2633 // }; 2634 // struct X { struct { int a; }; struct { int b; }; }; // anon structs 2635 if (!SearchName) 2636 if (!IsStructuralMatch(D, FoundRecord, false)) 2637 continue; 2638 2639 if (!hasSameVisibilityContext(FoundRecord, D)) 2640 continue; 2641 2642 if (IsStructuralMatch(D, FoundRecord)) { 2643 RecordDecl *FoundDef = FoundRecord->getDefinition(); 2644 if (D->isThisDeclarationADefinition() && FoundDef) { 2645 // FIXME: Structural equivalence check should check for same 2646 // user-defined methods. 2647 Importer.MapImported(D, FoundDef); 2648 if (const auto *DCXX = dyn_cast<CXXRecordDecl>(D)) { 2649 auto *FoundCXX = dyn_cast<CXXRecordDecl>(FoundDef); 2650 assert(FoundCXX && "Record type mismatch"); 2651 2652 if (!Importer.isMinimalImport()) 2653 // FoundDef may not have every implicit method that D has 2654 // because implicit methods are created only if they are used. 2655 if (Error Err = ImportImplicitMethods(DCXX, FoundCXX)) 2656 return std::move(Err); 2657 } 2658 } 2659 PrevDecl = FoundRecord->getMostRecentDecl(); 2660 break; 2661 } 2662 ConflictingDecls.push_back(FoundDecl); 2663 } // kind is RecordDecl 2664 } // for 2665 2666 if (!ConflictingDecls.empty() && SearchName) { 2667 ExpectedName NameOrErr = Importer.HandleNameConflict( 2668 SearchName, DC, IDNS, ConflictingDecls.data(), 2669 ConflictingDecls.size()); 2670 if (NameOrErr) 2671 Name = NameOrErr.get(); 2672 else 2673 return NameOrErr.takeError(); 2674 } 2675 } 2676 2677 ExpectedSLoc BeginLocOrErr = import(D->getBeginLoc()); 2678 if (!BeginLocOrErr) 2679 return BeginLocOrErr.takeError(); 2680 2681 // Create the record declaration. 2682 RecordDecl *D2 = nullptr; 2683 CXXRecordDecl *D2CXX = nullptr; 2684 if (auto *DCXX = dyn_cast<CXXRecordDecl>(D)) { 2685 if (DCXX->isLambda()) { 2686 auto TInfoOrErr = import(DCXX->getLambdaTypeInfo()); 2687 if (!TInfoOrErr) 2688 return TInfoOrErr.takeError(); 2689 if (GetImportedOrCreateSpecialDecl( 2690 D2CXX, CXXRecordDecl::CreateLambda, D, Importer.getToContext(), 2691 DC, *TInfoOrErr, Loc, DCXX->isDependentLambda(), 2692 DCXX->isGenericLambda(), DCXX->getLambdaCaptureDefault())) 2693 return D2CXX; 2694 ExpectedDecl CDeclOrErr = import(DCXX->getLambdaContextDecl()); 2695 if (!CDeclOrErr) 2696 return CDeclOrErr.takeError(); 2697 D2CXX->setLambdaMangling(DCXX->getLambdaManglingNumber(), *CDeclOrErr, 2698 DCXX->hasKnownLambdaInternalLinkage()); 2699 } else if (DCXX->isInjectedClassName()) { 2700 // We have to be careful to do a similar dance to the one in 2701 // Sema::ActOnStartCXXMemberDeclarations 2702 const bool DelayTypeCreation = true; 2703 if (GetImportedOrCreateDecl( 2704 D2CXX, D, Importer.getToContext(), D->getTagKind(), DC, 2705 *BeginLocOrErr, Loc, Name.getAsIdentifierInfo(), 2706 cast_or_null<CXXRecordDecl>(PrevDecl), DelayTypeCreation)) 2707 return D2CXX; 2708 Importer.getToContext().getTypeDeclType( 2709 D2CXX, dyn_cast<CXXRecordDecl>(DC)); 2710 } else { 2711 if (GetImportedOrCreateDecl(D2CXX, D, Importer.getToContext(), 2712 D->getTagKind(), DC, *BeginLocOrErr, Loc, 2713 Name.getAsIdentifierInfo(), 2714 cast_or_null<CXXRecordDecl>(PrevDecl))) 2715 return D2CXX; 2716 } 2717 2718 D2 = D2CXX; 2719 D2->setAccess(D->getAccess()); 2720 D2->setLexicalDeclContext(LexicalDC); 2721 if (!DCXX->getDescribedClassTemplate() || DCXX->isImplicit()) 2722 LexicalDC->addDeclInternal(D2); 2723 2724 if (LexicalDC != DC && D->isInIdentifierNamespace(Decl::IDNS_TagFriend)) 2725 DC->makeDeclVisibleInContext(D2); 2726 2727 if (ClassTemplateDecl *FromDescribed = 2728 DCXX->getDescribedClassTemplate()) { 2729 ClassTemplateDecl *ToDescribed; 2730 if (Error Err = importInto(ToDescribed, FromDescribed)) 2731 return std::move(Err); 2732 D2CXX->setDescribedClassTemplate(ToDescribed); 2733 if (!DCXX->isInjectedClassName() && !IsFriendTemplate) { 2734 // In a record describing a template the type should be an 2735 // InjectedClassNameType (see Sema::CheckClassTemplate). Update the 2736 // previously set type to the correct value here (ToDescribed is not 2737 // available at record create). 2738 // FIXME: The previous type is cleared but not removed from 2739 // ASTContext's internal storage. 2740 CXXRecordDecl *Injected = nullptr; 2741 for (NamedDecl *Found : D2CXX->noload_lookup(Name)) { 2742 auto *Record = dyn_cast<CXXRecordDecl>(Found); 2743 if (Record && Record->isInjectedClassName()) { 2744 Injected = Record; 2745 break; 2746 } 2747 } 2748 // Create an injected type for the whole redecl chain. 2749 SmallVector<Decl *, 2> Redecls = 2750 getCanonicalForwardRedeclChain(D2CXX); 2751 for (auto *R : Redecls) { 2752 auto *RI = cast<CXXRecordDecl>(R); 2753 RI->setTypeForDecl(nullptr); 2754 // Below we create a new injected type and assign that to the 2755 // canonical decl, subsequent declarations in the chain will reuse 2756 // that type. 2757 Importer.getToContext().getInjectedClassNameType( 2758 RI, ToDescribed->getInjectedClassNameSpecialization()); 2759 } 2760 // Set the new type for the previous injected decl too. 2761 if (Injected) { 2762 Injected->setTypeForDecl(nullptr); 2763 Importer.getToContext().getTypeDeclType(Injected, D2CXX); 2764 } 2765 } 2766 } else if (MemberSpecializationInfo *MemberInfo = 2767 DCXX->getMemberSpecializationInfo()) { 2768 TemplateSpecializationKind SK = 2769 MemberInfo->getTemplateSpecializationKind(); 2770 CXXRecordDecl *FromInst = DCXX->getInstantiatedFromMemberClass(); 2771 2772 if (Expected<CXXRecordDecl *> ToInstOrErr = import(FromInst)) 2773 D2CXX->setInstantiationOfMemberClass(*ToInstOrErr, SK); 2774 else 2775 return ToInstOrErr.takeError(); 2776 2777 if (ExpectedSLoc POIOrErr = 2778 import(MemberInfo->getPointOfInstantiation())) 2779 D2CXX->getMemberSpecializationInfo()->setPointOfInstantiation( 2780 *POIOrErr); 2781 else 2782 return POIOrErr.takeError(); 2783 } 2784 2785 } else { 2786 if (GetImportedOrCreateDecl(D2, D, Importer.getToContext(), 2787 D->getTagKind(), DC, *BeginLocOrErr, Loc, 2788 Name.getAsIdentifierInfo(), PrevDecl)) 2789 return D2; 2790 D2->setLexicalDeclContext(LexicalDC); 2791 LexicalDC->addDeclInternal(D2); 2792 } 2793 2794 if (auto QualifierLocOrErr = import(D->getQualifierLoc())) 2795 D2->setQualifierInfo(*QualifierLocOrErr); 2796 else 2797 return QualifierLocOrErr.takeError(); 2798 2799 if (D->isAnonymousStructOrUnion()) 2800 D2->setAnonymousStructOrUnion(true); 2801 2802 if (D->isCompleteDefinition()) 2803 if (Error Err = ImportDefinition(D, D2, IDK_Default)) 2804 return std::move(Err); 2805 2806 return D2; 2807 } 2808 2809 ExpectedDecl ASTNodeImporter::VisitEnumConstantDecl(EnumConstantDecl *D) { 2810 // Import the major distinguishing characteristics of this enumerator. 2811 DeclContext *DC, *LexicalDC; 2812 DeclarationName Name; 2813 SourceLocation Loc; 2814 NamedDecl *ToD; 2815 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 2816 return std::move(Err); 2817 if (ToD) 2818 return ToD; 2819 2820 // Determine whether there are any other declarations with the same name and 2821 // in the same context. 2822 if (!LexicalDC->isFunctionOrMethod()) { 2823 SmallVector<NamedDecl *, 4> ConflictingDecls; 2824 unsigned IDNS = Decl::IDNS_Ordinary; 2825 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name); 2826 for (auto *FoundDecl : FoundDecls) { 2827 if (!FoundDecl->isInIdentifierNamespace(IDNS)) 2828 continue; 2829 2830 if (auto *FoundEnumConstant = dyn_cast<EnumConstantDecl>(FoundDecl)) { 2831 if (IsStructuralMatch(D, FoundEnumConstant)) 2832 return Importer.MapImported(D, FoundEnumConstant); 2833 ConflictingDecls.push_back(FoundDecl); 2834 } 2835 } 2836 2837 if (!ConflictingDecls.empty()) { 2838 ExpectedName NameOrErr = Importer.HandleNameConflict( 2839 Name, DC, IDNS, ConflictingDecls.data(), ConflictingDecls.size()); 2840 if (NameOrErr) 2841 Name = NameOrErr.get(); 2842 else 2843 return NameOrErr.takeError(); 2844 } 2845 } 2846 2847 ExpectedType TypeOrErr = import(D->getType()); 2848 if (!TypeOrErr) 2849 return TypeOrErr.takeError(); 2850 2851 ExpectedExpr InitOrErr = import(D->getInitExpr()); 2852 if (!InitOrErr) 2853 return InitOrErr.takeError(); 2854 2855 EnumConstantDecl *ToEnumerator; 2856 if (GetImportedOrCreateDecl( 2857 ToEnumerator, D, Importer.getToContext(), cast<EnumDecl>(DC), Loc, 2858 Name.getAsIdentifierInfo(), *TypeOrErr, *InitOrErr, D->getInitVal())) 2859 return ToEnumerator; 2860 2861 ToEnumerator->setAccess(D->getAccess()); 2862 ToEnumerator->setLexicalDeclContext(LexicalDC); 2863 LexicalDC->addDeclInternal(ToEnumerator); 2864 return ToEnumerator; 2865 } 2866 2867 Error ASTNodeImporter::ImportTemplateParameterLists(const DeclaratorDecl *FromD, 2868 DeclaratorDecl *ToD) { 2869 unsigned int Num = FromD->getNumTemplateParameterLists(); 2870 if (Num == 0) 2871 return Error::success(); 2872 SmallVector<TemplateParameterList *, 2> ToTPLists(Num); 2873 for (unsigned int I = 0; I < Num; ++I) 2874 if (Expected<TemplateParameterList *> ToTPListOrErr = 2875 import(FromD->getTemplateParameterList(I))) 2876 ToTPLists[I] = *ToTPListOrErr; 2877 else 2878 return ToTPListOrErr.takeError(); 2879 ToD->setTemplateParameterListsInfo(Importer.ToContext, ToTPLists); 2880 return Error::success(); 2881 } 2882 2883 Error ASTNodeImporter::ImportTemplateInformation( 2884 FunctionDecl *FromFD, FunctionDecl *ToFD) { 2885 switch (FromFD->getTemplatedKind()) { 2886 case FunctionDecl::TK_NonTemplate: 2887 case FunctionDecl::TK_FunctionTemplate: 2888 return Error::success(); 2889 2890 case FunctionDecl::TK_MemberSpecialization: { 2891 TemplateSpecializationKind TSK = FromFD->getTemplateSpecializationKind(); 2892 2893 if (Expected<FunctionDecl *> InstFDOrErr = 2894 import(FromFD->getInstantiatedFromMemberFunction())) 2895 ToFD->setInstantiationOfMemberFunction(*InstFDOrErr, TSK); 2896 else 2897 return InstFDOrErr.takeError(); 2898 2899 if (ExpectedSLoc POIOrErr = import( 2900 FromFD->getMemberSpecializationInfo()->getPointOfInstantiation())) 2901 ToFD->getMemberSpecializationInfo()->setPointOfInstantiation(*POIOrErr); 2902 else 2903 return POIOrErr.takeError(); 2904 2905 return Error::success(); 2906 } 2907 2908 case FunctionDecl::TK_FunctionTemplateSpecialization: { 2909 auto FunctionAndArgsOrErr = 2910 ImportFunctionTemplateWithTemplateArgsFromSpecialization(FromFD); 2911 if (!FunctionAndArgsOrErr) 2912 return FunctionAndArgsOrErr.takeError(); 2913 2914 TemplateArgumentList *ToTAList = TemplateArgumentList::CreateCopy( 2915 Importer.getToContext(), std::get<1>(*FunctionAndArgsOrErr)); 2916 2917 auto *FTSInfo = FromFD->getTemplateSpecializationInfo(); 2918 TemplateArgumentListInfo ToTAInfo; 2919 const auto *FromTAArgsAsWritten = FTSInfo->TemplateArgumentsAsWritten; 2920 if (FromTAArgsAsWritten) 2921 if (Error Err = ImportTemplateArgumentListInfo( 2922 *FromTAArgsAsWritten, ToTAInfo)) 2923 return Err; 2924 2925 ExpectedSLoc POIOrErr = import(FTSInfo->getPointOfInstantiation()); 2926 if (!POIOrErr) 2927 return POIOrErr.takeError(); 2928 2929 if (Error Err = ImportTemplateParameterLists(FromFD, ToFD)) 2930 return Err; 2931 2932 TemplateSpecializationKind TSK = FTSInfo->getTemplateSpecializationKind(); 2933 ToFD->setFunctionTemplateSpecialization( 2934 std::get<0>(*FunctionAndArgsOrErr), ToTAList, /* InsertPos= */ nullptr, 2935 TSK, FromTAArgsAsWritten ? &ToTAInfo : nullptr, *POIOrErr); 2936 return Error::success(); 2937 } 2938 2939 case FunctionDecl::TK_DependentFunctionTemplateSpecialization: { 2940 auto *FromInfo = FromFD->getDependentSpecializationInfo(); 2941 UnresolvedSet<8> TemplDecls; 2942 unsigned NumTemplates = FromInfo->getNumTemplates(); 2943 for (unsigned I = 0; I < NumTemplates; I++) { 2944 if (Expected<FunctionTemplateDecl *> ToFTDOrErr = 2945 import(FromInfo->getTemplate(I))) 2946 TemplDecls.addDecl(*ToFTDOrErr); 2947 else 2948 return ToFTDOrErr.takeError(); 2949 } 2950 2951 // Import TemplateArgumentListInfo. 2952 TemplateArgumentListInfo ToTAInfo; 2953 if (Error Err = ImportTemplateArgumentListInfo( 2954 FromInfo->getLAngleLoc(), FromInfo->getRAngleLoc(), 2955 llvm::makeArrayRef( 2956 FromInfo->getTemplateArgs(), FromInfo->getNumTemplateArgs()), 2957 ToTAInfo)) 2958 return Err; 2959 2960 ToFD->setDependentTemplateSpecialization(Importer.getToContext(), 2961 TemplDecls, ToTAInfo); 2962 return Error::success(); 2963 } 2964 } 2965 llvm_unreachable("All cases should be covered!"); 2966 } 2967 2968 Expected<FunctionDecl *> 2969 ASTNodeImporter::FindFunctionTemplateSpecialization(FunctionDecl *FromFD) { 2970 auto FunctionAndArgsOrErr = 2971 ImportFunctionTemplateWithTemplateArgsFromSpecialization(FromFD); 2972 if (!FunctionAndArgsOrErr) 2973 return FunctionAndArgsOrErr.takeError(); 2974 2975 FunctionTemplateDecl *Template; 2976 TemplateArgsTy ToTemplArgs; 2977 std::tie(Template, ToTemplArgs) = *FunctionAndArgsOrErr; 2978 void *InsertPos = nullptr; 2979 auto *FoundSpec = Template->findSpecialization(ToTemplArgs, InsertPos); 2980 return FoundSpec; 2981 } 2982 2983 Error ASTNodeImporter::ImportFunctionDeclBody(FunctionDecl *FromFD, 2984 FunctionDecl *ToFD) { 2985 if (Stmt *FromBody = FromFD->getBody()) { 2986 if (ExpectedStmt ToBodyOrErr = import(FromBody)) 2987 ToFD->setBody(*ToBodyOrErr); 2988 else 2989 return ToBodyOrErr.takeError(); 2990 } 2991 return Error::success(); 2992 } 2993 2994 ExpectedDecl ASTNodeImporter::VisitFunctionDecl(FunctionDecl *D) { 2995 2996 SmallVector<Decl *, 2> Redecls = getCanonicalForwardRedeclChain(D); 2997 auto RedeclIt = Redecls.begin(); 2998 // Import the first part of the decl chain. I.e. import all previous 2999 // declarations starting from the canonical decl. 3000 for (; RedeclIt != Redecls.end() && *RedeclIt != D; ++RedeclIt) { 3001 ExpectedDecl ToRedeclOrErr = import(*RedeclIt); 3002 if (!ToRedeclOrErr) 3003 return ToRedeclOrErr.takeError(); 3004 } 3005 assert(*RedeclIt == D); 3006 3007 // Import the major distinguishing characteristics of this function. 3008 DeclContext *DC, *LexicalDC; 3009 DeclarationName Name; 3010 SourceLocation Loc; 3011 NamedDecl *ToD; 3012 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 3013 return std::move(Err); 3014 if (ToD) 3015 return ToD; 3016 3017 FunctionDecl *FoundByLookup = nullptr; 3018 FunctionTemplateDecl *FromFT = D->getDescribedFunctionTemplate(); 3019 3020 // If this is a function template specialization, then try to find the same 3021 // existing specialization in the "to" context. The lookup below will not 3022 // find any specialization, but would find the primary template; thus, we 3023 // have to skip normal lookup in case of specializations. 3024 // FIXME handle member function templates (TK_MemberSpecialization) similarly? 3025 if (D->getTemplatedKind() == 3026 FunctionDecl::TK_FunctionTemplateSpecialization) { 3027 auto FoundFunctionOrErr = FindFunctionTemplateSpecialization(D); 3028 if (!FoundFunctionOrErr) 3029 return FoundFunctionOrErr.takeError(); 3030 if (FunctionDecl *FoundFunction = *FoundFunctionOrErr) { 3031 if (Decl *Def = FindAndMapDefinition(D, FoundFunction)) 3032 return Def; 3033 FoundByLookup = FoundFunction; 3034 } 3035 } 3036 // Try to find a function in our own ("to") context with the same name, same 3037 // type, and in the same context as the function we're importing. 3038 else if (!LexicalDC->isFunctionOrMethod()) { 3039 SmallVector<NamedDecl *, 4> ConflictingDecls; 3040 unsigned IDNS = Decl::IDNS_Ordinary | Decl::IDNS_OrdinaryFriend; 3041 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name); 3042 for (auto *FoundDecl : FoundDecls) { 3043 if (!FoundDecl->isInIdentifierNamespace(IDNS)) 3044 continue; 3045 3046 if (auto *FoundFunction = dyn_cast<FunctionDecl>(FoundDecl)) { 3047 if (!hasSameVisibilityContext(FoundFunction, D)) 3048 continue; 3049 3050 if (IsStructuralMatch(D, FoundFunction)) { 3051 if (Decl *Def = FindAndMapDefinition(D, FoundFunction)) 3052 return Def; 3053 FoundByLookup = FoundFunction; 3054 break; 3055 } 3056 // FIXME: Check for overloading more carefully, e.g., by boosting 3057 // Sema::IsOverload out to the AST library. 3058 3059 // Function overloading is okay in C++. 3060 if (Importer.getToContext().getLangOpts().CPlusPlus) 3061 continue; 3062 3063 // Complain about inconsistent function types. 3064 Importer.ToDiag(Loc, diag::warn_odr_function_type_inconsistent) 3065 << Name << D->getType() << FoundFunction->getType(); 3066 Importer.ToDiag(FoundFunction->getLocation(), diag::note_odr_value_here) 3067 << FoundFunction->getType(); 3068 ConflictingDecls.push_back(FoundDecl); 3069 } 3070 } 3071 3072 if (!ConflictingDecls.empty()) { 3073 ExpectedName NameOrErr = Importer.HandleNameConflict( 3074 Name, DC, IDNS, ConflictingDecls.data(), ConflictingDecls.size()); 3075 if (NameOrErr) 3076 Name = NameOrErr.get(); 3077 else 3078 return NameOrErr.takeError(); 3079 } 3080 } 3081 3082 // We do not allow more than one in-class declaration of a function. This is 3083 // because AST clients like VTableBuilder asserts on this. VTableBuilder 3084 // assumes there is only one in-class declaration. Building a redecl 3085 // chain would result in more than one in-class declaration for 3086 // overrides (even if they are part of the same redecl chain inside the 3087 // derived class.) 3088 if (FoundByLookup) { 3089 if (isa<CXXMethodDecl>(FoundByLookup)) { 3090 if (D->getLexicalDeclContext() == D->getDeclContext()) { 3091 if (!D->doesThisDeclarationHaveABody()) { 3092 if (FunctionTemplateDecl *DescribedD = 3093 D->getDescribedFunctionTemplate()) { 3094 // Handle a "templated" function together with its described 3095 // template. This avoids need for a similar check at import of the 3096 // described template. 3097 assert(FoundByLookup->getDescribedFunctionTemplate() && 3098 "Templated function mapped to non-templated?"); 3099 Importer.MapImported(DescribedD, 3100 FoundByLookup->getDescribedFunctionTemplate()); 3101 } 3102 return Importer.MapImported(D, FoundByLookup); 3103 } else { 3104 // Let's continue and build up the redecl chain in this case. 3105 // FIXME Merge the functions into one decl. 3106 } 3107 } 3108 } 3109 } 3110 3111 DeclarationNameInfo NameInfo(Name, Loc); 3112 // Import additional name location/type info. 3113 if (Error Err = ImportDeclarationNameLoc(D->getNameInfo(), NameInfo)) 3114 return std::move(Err); 3115 3116 QualType FromTy = D->getType(); 3117 bool usedDifferentExceptionSpec = false; 3118 3119 if (const auto *FromFPT = D->getType()->getAs<FunctionProtoType>()) { 3120 FunctionProtoType::ExtProtoInfo FromEPI = FromFPT->getExtProtoInfo(); 3121 // FunctionProtoType::ExtProtoInfo's ExceptionSpecDecl can point to the 3122 // FunctionDecl that we are importing the FunctionProtoType for. 3123 // To avoid an infinite recursion when importing, create the FunctionDecl 3124 // with a simplified function type and update it afterwards. 3125 if (FromEPI.ExceptionSpec.SourceDecl || 3126 FromEPI.ExceptionSpec.SourceTemplate || 3127 FromEPI.ExceptionSpec.NoexceptExpr) { 3128 FunctionProtoType::ExtProtoInfo DefaultEPI; 3129 FromTy = Importer.getFromContext().getFunctionType( 3130 FromFPT->getReturnType(), FromFPT->getParamTypes(), DefaultEPI); 3131 usedDifferentExceptionSpec = true; 3132 } 3133 } 3134 3135 QualType T; 3136 TypeSourceInfo *TInfo; 3137 SourceLocation ToInnerLocStart, ToEndLoc; 3138 NestedNameSpecifierLoc ToQualifierLoc; 3139 if (auto Imp = importSeq( 3140 FromTy, D->getTypeSourceInfo(), D->getInnerLocStart(), 3141 D->getQualifierLoc(), D->getEndLoc())) 3142 std::tie(T, TInfo, ToInnerLocStart, ToQualifierLoc, ToEndLoc) = *Imp; 3143 else 3144 return Imp.takeError(); 3145 3146 // Import the function parameters. 3147 SmallVector<ParmVarDecl *, 8> Parameters; 3148 for (auto P : D->parameters()) { 3149 if (Expected<ParmVarDecl *> ToPOrErr = import(P)) 3150 Parameters.push_back(*ToPOrErr); 3151 else 3152 return ToPOrErr.takeError(); 3153 } 3154 3155 // Create the imported function. 3156 FunctionDecl *ToFunction = nullptr; 3157 if (auto *FromConstructor = dyn_cast<CXXConstructorDecl>(D)) { 3158 Expr *ExplicitExpr = nullptr; 3159 if (FromConstructor->getExplicitSpecifier().getExpr()) { 3160 auto Imp = importSeq(FromConstructor->getExplicitSpecifier().getExpr()); 3161 if (!Imp) 3162 return Imp.takeError(); 3163 std::tie(ExplicitExpr) = *Imp; 3164 } 3165 if (GetImportedOrCreateDecl<CXXConstructorDecl>( 3166 ToFunction, D, Importer.getToContext(), cast<CXXRecordDecl>(DC), 3167 ToInnerLocStart, NameInfo, T, TInfo, 3168 ExplicitSpecifier( 3169 ExplicitExpr, 3170 FromConstructor->getExplicitSpecifier().getKind()), 3171 D->isInlineSpecified(), D->isImplicit(), D->getConstexprKind())) 3172 return ToFunction; 3173 } else if (CXXDestructorDecl *FromDtor = dyn_cast<CXXDestructorDecl>(D)) { 3174 3175 auto Imp = 3176 importSeq(const_cast<FunctionDecl *>(FromDtor->getOperatorDelete()), 3177 FromDtor->getOperatorDeleteThisArg()); 3178 3179 if (!Imp) 3180 return Imp.takeError(); 3181 3182 FunctionDecl *ToOperatorDelete; 3183 Expr *ToThisArg; 3184 std::tie(ToOperatorDelete, ToThisArg) = *Imp; 3185 3186 if (GetImportedOrCreateDecl<CXXDestructorDecl>( 3187 ToFunction, D, Importer.getToContext(), cast<CXXRecordDecl>(DC), 3188 ToInnerLocStart, NameInfo, T, TInfo, D->isInlineSpecified(), 3189 D->isImplicit(), D->getConstexprKind())) 3190 return ToFunction; 3191 3192 CXXDestructorDecl *ToDtor = cast<CXXDestructorDecl>(ToFunction); 3193 3194 ToDtor->setOperatorDelete(ToOperatorDelete, ToThisArg); 3195 } else if (CXXConversionDecl *FromConversion = 3196 dyn_cast<CXXConversionDecl>(D)) { 3197 Expr *ExplicitExpr = nullptr; 3198 if (FromConversion->getExplicitSpecifier().getExpr()) { 3199 auto Imp = importSeq(FromConversion->getExplicitSpecifier().getExpr()); 3200 if (!Imp) 3201 return Imp.takeError(); 3202 std::tie(ExplicitExpr) = *Imp; 3203 } 3204 if (GetImportedOrCreateDecl<CXXConversionDecl>( 3205 ToFunction, D, Importer.getToContext(), cast<CXXRecordDecl>(DC), 3206 ToInnerLocStart, NameInfo, T, TInfo, D->isInlineSpecified(), 3207 ExplicitSpecifier(ExplicitExpr, 3208 FromConversion->getExplicitSpecifier().getKind()), 3209 D->getConstexprKind(), SourceLocation())) 3210 return ToFunction; 3211 } else if (auto *Method = dyn_cast<CXXMethodDecl>(D)) { 3212 if (GetImportedOrCreateDecl<CXXMethodDecl>( 3213 ToFunction, D, Importer.getToContext(), cast<CXXRecordDecl>(DC), 3214 ToInnerLocStart, NameInfo, T, TInfo, Method->getStorageClass(), 3215 Method->isInlineSpecified(), D->getConstexprKind(), 3216 SourceLocation())) 3217 return ToFunction; 3218 } else { 3219 if (GetImportedOrCreateDecl( 3220 ToFunction, D, Importer.getToContext(), DC, ToInnerLocStart, 3221 NameInfo, T, TInfo, D->getStorageClass(), D->isInlineSpecified(), 3222 D->hasWrittenPrototype(), D->getConstexprKind())) 3223 return ToFunction; 3224 } 3225 3226 // Connect the redecl chain. 3227 if (FoundByLookup) { 3228 auto *Recent = const_cast<FunctionDecl *>( 3229 FoundByLookup->getMostRecentDecl()); 3230 ToFunction->setPreviousDecl(Recent); 3231 // FIXME Probably we should merge exception specifications. E.g. In the 3232 // "To" context the existing function may have exception specification with 3233 // noexcept-unevaluated, while the newly imported function may have an 3234 // evaluated noexcept. A call to adjustExceptionSpec() on the imported 3235 // decl and its redeclarations may be required. 3236 } 3237 3238 ToFunction->setQualifierInfo(ToQualifierLoc); 3239 ToFunction->setAccess(D->getAccess()); 3240 ToFunction->setLexicalDeclContext(LexicalDC); 3241 ToFunction->setVirtualAsWritten(D->isVirtualAsWritten()); 3242 ToFunction->setTrivial(D->isTrivial()); 3243 ToFunction->setPure(D->isPure()); 3244 ToFunction->setDefaulted(D->isDefaulted()); 3245 ToFunction->setExplicitlyDefaulted(D->isExplicitlyDefaulted()); 3246 ToFunction->setDeletedAsWritten(D->isDeletedAsWritten()); 3247 ToFunction->setRangeEnd(ToEndLoc); 3248 3249 // Set the parameters. 3250 for (auto *Param : Parameters) { 3251 Param->setOwningFunction(ToFunction); 3252 ToFunction->addDeclInternal(Param); 3253 } 3254 ToFunction->setParams(Parameters); 3255 3256 // We need to complete creation of FunctionProtoTypeLoc manually with setting 3257 // params it refers to. 3258 if (TInfo) { 3259 if (auto ProtoLoc = 3260 TInfo->getTypeLoc().IgnoreParens().getAs<FunctionProtoTypeLoc>()) { 3261 for (unsigned I = 0, N = Parameters.size(); I != N; ++I) 3262 ProtoLoc.setParam(I, Parameters[I]); 3263 } 3264 } 3265 3266 if (usedDifferentExceptionSpec) { 3267 // Update FunctionProtoType::ExtProtoInfo. 3268 if (ExpectedType TyOrErr = import(D->getType())) 3269 ToFunction->setType(*TyOrErr); 3270 else 3271 return TyOrErr.takeError(); 3272 } 3273 3274 // Import the describing template function, if any. 3275 if (FromFT) { 3276 auto ToFTOrErr = import(FromFT); 3277 if (!ToFTOrErr) 3278 return ToFTOrErr.takeError(); 3279 } 3280 3281 // Import Ctor initializers. 3282 if (auto *FromConstructor = dyn_cast<CXXConstructorDecl>(D)) { 3283 if (unsigned NumInitializers = FromConstructor->getNumCtorInitializers()) { 3284 SmallVector<CXXCtorInitializer *, 4> CtorInitializers(NumInitializers); 3285 // Import first, then allocate memory and copy if there was no error. 3286 if (Error Err = ImportContainerChecked( 3287 FromConstructor->inits(), CtorInitializers)) 3288 return std::move(Err); 3289 auto **Memory = 3290 new (Importer.getToContext()) CXXCtorInitializer *[NumInitializers]; 3291 std::copy(CtorInitializers.begin(), CtorInitializers.end(), Memory); 3292 auto *ToCtor = cast<CXXConstructorDecl>(ToFunction); 3293 ToCtor->setCtorInitializers(Memory); 3294 ToCtor->setNumCtorInitializers(NumInitializers); 3295 } 3296 } 3297 3298 if (D->doesThisDeclarationHaveABody()) { 3299 Error Err = ImportFunctionDeclBody(D, ToFunction); 3300 3301 if (Err) 3302 return std::move(Err); 3303 } 3304 3305 // FIXME: Other bits to merge? 3306 3307 // If it is a template, import all related things. 3308 if (Error Err = ImportTemplateInformation(D, ToFunction)) 3309 return std::move(Err); 3310 3311 bool IsFriend = D->isInIdentifierNamespace(Decl::IDNS_OrdinaryFriend); 3312 3313 // TODO Can we generalize this approach to other AST nodes as well? 3314 if (D->getDeclContext()->containsDeclAndLoad(D)) 3315 DC->addDeclInternal(ToFunction); 3316 if (DC != LexicalDC && D->getLexicalDeclContext()->containsDeclAndLoad(D)) 3317 LexicalDC->addDeclInternal(ToFunction); 3318 3319 // Friend declaration's lexical context is the befriending class, but the 3320 // semantic context is the enclosing scope of the befriending class. 3321 // We want the friend functions to be found in the semantic context by lookup. 3322 // FIXME should we handle this generically in VisitFriendDecl? 3323 // In Other cases when LexicalDC != DC we don't want it to be added, 3324 // e.g out-of-class definitions like void B::f() {} . 3325 if (LexicalDC != DC && IsFriend) { 3326 DC->makeDeclVisibleInContext(ToFunction); 3327 } 3328 3329 if (auto *FromCXXMethod = dyn_cast<CXXMethodDecl>(D)) 3330 if (Error Err = ImportOverriddenMethods(cast<CXXMethodDecl>(ToFunction), 3331 FromCXXMethod)) 3332 return std::move(Err); 3333 3334 // Import the rest of the chain. I.e. import all subsequent declarations. 3335 for (++RedeclIt; RedeclIt != Redecls.end(); ++RedeclIt) { 3336 ExpectedDecl ToRedeclOrErr = import(*RedeclIt); 3337 if (!ToRedeclOrErr) 3338 return ToRedeclOrErr.takeError(); 3339 } 3340 3341 return ToFunction; 3342 } 3343 3344 ExpectedDecl ASTNodeImporter::VisitCXXMethodDecl(CXXMethodDecl *D) { 3345 return VisitFunctionDecl(D); 3346 } 3347 3348 ExpectedDecl ASTNodeImporter::VisitCXXConstructorDecl(CXXConstructorDecl *D) { 3349 return VisitCXXMethodDecl(D); 3350 } 3351 3352 ExpectedDecl ASTNodeImporter::VisitCXXDestructorDecl(CXXDestructorDecl *D) { 3353 return VisitCXXMethodDecl(D); 3354 } 3355 3356 ExpectedDecl ASTNodeImporter::VisitCXXConversionDecl(CXXConversionDecl *D) { 3357 return VisitCXXMethodDecl(D); 3358 } 3359 3360 ExpectedDecl ASTNodeImporter::VisitFieldDecl(FieldDecl *D) { 3361 // Import the major distinguishing characteristics of a variable. 3362 DeclContext *DC, *LexicalDC; 3363 DeclarationName Name; 3364 SourceLocation Loc; 3365 NamedDecl *ToD; 3366 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 3367 return std::move(Err); 3368 if (ToD) 3369 return ToD; 3370 3371 // Determine whether we've already imported this field. 3372 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name); 3373 for (auto *FoundDecl : FoundDecls) { 3374 if (FieldDecl *FoundField = dyn_cast<FieldDecl>(FoundDecl)) { 3375 // For anonymous fields, match up by index. 3376 if (!Name && 3377 ASTImporter::getFieldIndex(D) != 3378 ASTImporter::getFieldIndex(FoundField)) 3379 continue; 3380 3381 if (Importer.IsStructurallyEquivalent(D->getType(), 3382 FoundField->getType())) { 3383 Importer.MapImported(D, FoundField); 3384 // In case of a FieldDecl of a ClassTemplateSpecializationDecl, the 3385 // initializer of a FieldDecl might not had been instantiated in the 3386 // "To" context. However, the "From" context might instantiated that, 3387 // thus we have to merge that. 3388 if (Expr *FromInitializer = D->getInClassInitializer()) { 3389 // We don't have yet the initializer set. 3390 if (FoundField->hasInClassInitializer() && 3391 !FoundField->getInClassInitializer()) { 3392 if (ExpectedExpr ToInitializerOrErr = import(FromInitializer)) 3393 FoundField->setInClassInitializer(*ToInitializerOrErr); 3394 else { 3395 // We can't return error here, 3396 // since we already mapped D as imported. 3397 // FIXME: warning message? 3398 consumeError(ToInitializerOrErr.takeError()); 3399 return FoundField; 3400 } 3401 } 3402 } 3403 return FoundField; 3404 } 3405 3406 // FIXME: Why is this case not handled with calling HandleNameConflict? 3407 Importer.ToDiag(Loc, diag::warn_odr_field_type_inconsistent) 3408 << Name << D->getType() << FoundField->getType(); 3409 Importer.ToDiag(FoundField->getLocation(), diag::note_odr_value_here) 3410 << FoundField->getType(); 3411 3412 return make_error<ImportError>(ImportError::NameConflict); 3413 } 3414 } 3415 3416 QualType ToType; 3417 TypeSourceInfo *ToTInfo; 3418 Expr *ToBitWidth; 3419 SourceLocation ToInnerLocStart; 3420 Expr *ToInitializer; 3421 if (auto Imp = importSeq( 3422 D->getType(), D->getTypeSourceInfo(), D->getBitWidth(), 3423 D->getInnerLocStart(), D->getInClassInitializer())) 3424 std::tie( 3425 ToType, ToTInfo, ToBitWidth, ToInnerLocStart, ToInitializer) = *Imp; 3426 else 3427 return Imp.takeError(); 3428 3429 FieldDecl *ToField; 3430 if (GetImportedOrCreateDecl(ToField, D, Importer.getToContext(), DC, 3431 ToInnerLocStart, Loc, Name.getAsIdentifierInfo(), 3432 ToType, ToTInfo, ToBitWidth, D->isMutable(), 3433 D->getInClassInitStyle())) 3434 return ToField; 3435 3436 ToField->setAccess(D->getAccess()); 3437 ToField->setLexicalDeclContext(LexicalDC); 3438 if (ToInitializer) 3439 ToField->setInClassInitializer(ToInitializer); 3440 ToField->setImplicit(D->isImplicit()); 3441 LexicalDC->addDeclInternal(ToField); 3442 return ToField; 3443 } 3444 3445 ExpectedDecl ASTNodeImporter::VisitIndirectFieldDecl(IndirectFieldDecl *D) { 3446 // Import the major distinguishing characteristics of a variable. 3447 DeclContext *DC, *LexicalDC; 3448 DeclarationName Name; 3449 SourceLocation Loc; 3450 NamedDecl *ToD; 3451 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 3452 return std::move(Err); 3453 if (ToD) 3454 return ToD; 3455 3456 // Determine whether we've already imported this field. 3457 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name); 3458 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 3459 if (auto *FoundField = dyn_cast<IndirectFieldDecl>(FoundDecls[I])) { 3460 // For anonymous indirect fields, match up by index. 3461 if (!Name && 3462 ASTImporter::getFieldIndex(D) != 3463 ASTImporter::getFieldIndex(FoundField)) 3464 continue; 3465 3466 if (Importer.IsStructurallyEquivalent(D->getType(), 3467 FoundField->getType(), 3468 !Name.isEmpty())) { 3469 Importer.MapImported(D, FoundField); 3470 return FoundField; 3471 } 3472 3473 // If there are more anonymous fields to check, continue. 3474 if (!Name && I < N-1) 3475 continue; 3476 3477 // FIXME: Why is this case not handled with calling HandleNameConflict? 3478 Importer.ToDiag(Loc, diag::warn_odr_field_type_inconsistent) 3479 << Name << D->getType() << FoundField->getType(); 3480 Importer.ToDiag(FoundField->getLocation(), diag::note_odr_value_here) 3481 << FoundField->getType(); 3482 3483 return make_error<ImportError>(ImportError::NameConflict); 3484 } 3485 } 3486 3487 // Import the type. 3488 auto TypeOrErr = import(D->getType()); 3489 if (!TypeOrErr) 3490 return TypeOrErr.takeError(); 3491 3492 auto **NamedChain = 3493 new (Importer.getToContext()) NamedDecl*[D->getChainingSize()]; 3494 3495 unsigned i = 0; 3496 for (auto *PI : D->chain()) 3497 if (Expected<NamedDecl *> ToD = import(PI)) 3498 NamedChain[i++] = *ToD; 3499 else 3500 return ToD.takeError(); 3501 3502 llvm::MutableArrayRef<NamedDecl *> CH = {NamedChain, D->getChainingSize()}; 3503 IndirectFieldDecl *ToIndirectField; 3504 if (GetImportedOrCreateDecl(ToIndirectField, D, Importer.getToContext(), DC, 3505 Loc, Name.getAsIdentifierInfo(), *TypeOrErr, CH)) 3506 // FIXME here we leak `NamedChain` which is allocated before 3507 return ToIndirectField; 3508 3509 ToIndirectField->setAccess(D->getAccess()); 3510 ToIndirectField->setLexicalDeclContext(LexicalDC); 3511 LexicalDC->addDeclInternal(ToIndirectField); 3512 return ToIndirectField; 3513 } 3514 3515 ExpectedDecl ASTNodeImporter::VisitFriendDecl(FriendDecl *D) { 3516 // Import the major distinguishing characteristics of a declaration. 3517 DeclContext *DC, *LexicalDC; 3518 if (Error Err = ImportDeclContext(D, DC, LexicalDC)) 3519 return std::move(Err); 3520 3521 // Determine whether we've already imported this decl. 3522 // FriendDecl is not a NamedDecl so we cannot use lookup. 3523 auto *RD = cast<CXXRecordDecl>(DC); 3524 FriendDecl *ImportedFriend = RD->getFirstFriend(); 3525 3526 while (ImportedFriend) { 3527 if (D->getFriendDecl() && ImportedFriend->getFriendDecl()) { 3528 if (IsStructuralMatch(D->getFriendDecl(), ImportedFriend->getFriendDecl(), 3529 /*Complain=*/false)) 3530 return Importer.MapImported(D, ImportedFriend); 3531 3532 } else if (D->getFriendType() && ImportedFriend->getFriendType()) { 3533 if (Importer.IsStructurallyEquivalent( 3534 D->getFriendType()->getType(), 3535 ImportedFriend->getFriendType()->getType(), true)) 3536 return Importer.MapImported(D, ImportedFriend); 3537 } 3538 ImportedFriend = ImportedFriend->getNextFriend(); 3539 } 3540 3541 // Not found. Create it. 3542 FriendDecl::FriendUnion ToFU; 3543 if (NamedDecl *FriendD = D->getFriendDecl()) { 3544 NamedDecl *ToFriendD; 3545 if (Error Err = importInto(ToFriendD, FriendD)) 3546 return std::move(Err); 3547 3548 if (FriendD->getFriendObjectKind() != Decl::FOK_None && 3549 !(FriendD->isInIdentifierNamespace(Decl::IDNS_NonMemberOperator))) 3550 ToFriendD->setObjectOfFriendDecl(false); 3551 3552 ToFU = ToFriendD; 3553 } else { // The friend is a type, not a decl. 3554 if (auto TSIOrErr = import(D->getFriendType())) 3555 ToFU = *TSIOrErr; 3556 else 3557 return TSIOrErr.takeError(); 3558 } 3559 3560 SmallVector<TemplateParameterList *, 1> ToTPLists(D->NumTPLists); 3561 auto **FromTPLists = D->getTrailingObjects<TemplateParameterList *>(); 3562 for (unsigned I = 0; I < D->NumTPLists; I++) { 3563 if (auto ListOrErr = import(FromTPLists[I])) 3564 ToTPLists[I] = *ListOrErr; 3565 else 3566 return ListOrErr.takeError(); 3567 } 3568 3569 auto LocationOrErr = import(D->getLocation()); 3570 if (!LocationOrErr) 3571 return LocationOrErr.takeError(); 3572 auto FriendLocOrErr = import(D->getFriendLoc()); 3573 if (!FriendLocOrErr) 3574 return FriendLocOrErr.takeError(); 3575 3576 FriendDecl *FrD; 3577 if (GetImportedOrCreateDecl(FrD, D, Importer.getToContext(), DC, 3578 *LocationOrErr, ToFU, 3579 *FriendLocOrErr, ToTPLists)) 3580 return FrD; 3581 3582 FrD->setAccess(D->getAccess()); 3583 FrD->setLexicalDeclContext(LexicalDC); 3584 LexicalDC->addDeclInternal(FrD); 3585 return FrD; 3586 } 3587 3588 ExpectedDecl ASTNodeImporter::VisitObjCIvarDecl(ObjCIvarDecl *D) { 3589 // Import the major distinguishing characteristics of an ivar. 3590 DeclContext *DC, *LexicalDC; 3591 DeclarationName Name; 3592 SourceLocation Loc; 3593 NamedDecl *ToD; 3594 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 3595 return std::move(Err); 3596 if (ToD) 3597 return ToD; 3598 3599 // Determine whether we've already imported this ivar 3600 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name); 3601 for (auto *FoundDecl : FoundDecls) { 3602 if (ObjCIvarDecl *FoundIvar = dyn_cast<ObjCIvarDecl>(FoundDecl)) { 3603 if (Importer.IsStructurallyEquivalent(D->getType(), 3604 FoundIvar->getType())) { 3605 Importer.MapImported(D, FoundIvar); 3606 return FoundIvar; 3607 } 3608 3609 Importer.ToDiag(Loc, diag::warn_odr_ivar_type_inconsistent) 3610 << Name << D->getType() << FoundIvar->getType(); 3611 Importer.ToDiag(FoundIvar->getLocation(), diag::note_odr_value_here) 3612 << FoundIvar->getType(); 3613 3614 return make_error<ImportError>(ImportError::NameConflict); 3615 } 3616 } 3617 3618 QualType ToType; 3619 TypeSourceInfo *ToTypeSourceInfo; 3620 Expr *ToBitWidth; 3621 SourceLocation ToInnerLocStart; 3622 if (auto Imp = importSeq( 3623 D->getType(), D->getTypeSourceInfo(), D->getBitWidth(), D->getInnerLocStart())) 3624 std::tie(ToType, ToTypeSourceInfo, ToBitWidth, ToInnerLocStart) = *Imp; 3625 else 3626 return Imp.takeError(); 3627 3628 ObjCIvarDecl *ToIvar; 3629 if (GetImportedOrCreateDecl( 3630 ToIvar, D, Importer.getToContext(), cast<ObjCContainerDecl>(DC), 3631 ToInnerLocStart, Loc, Name.getAsIdentifierInfo(), 3632 ToType, ToTypeSourceInfo, 3633 D->getAccessControl(),ToBitWidth, D->getSynthesize())) 3634 return ToIvar; 3635 3636 ToIvar->setLexicalDeclContext(LexicalDC); 3637 LexicalDC->addDeclInternal(ToIvar); 3638 return ToIvar; 3639 } 3640 3641 ExpectedDecl ASTNodeImporter::VisitVarDecl(VarDecl *D) { 3642 3643 SmallVector<Decl*, 2> Redecls = getCanonicalForwardRedeclChain(D); 3644 auto RedeclIt = Redecls.begin(); 3645 // Import the first part of the decl chain. I.e. import all previous 3646 // declarations starting from the canonical decl. 3647 for (; RedeclIt != Redecls.end() && *RedeclIt != D; ++RedeclIt) { 3648 ExpectedDecl RedeclOrErr = import(*RedeclIt); 3649 if (!RedeclOrErr) 3650 return RedeclOrErr.takeError(); 3651 } 3652 assert(*RedeclIt == D); 3653 3654 // Import the major distinguishing characteristics of a variable. 3655 DeclContext *DC, *LexicalDC; 3656 DeclarationName Name; 3657 SourceLocation Loc; 3658 NamedDecl *ToD; 3659 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 3660 return std::move(Err); 3661 if (ToD) 3662 return ToD; 3663 3664 // Try to find a variable in our own ("to") context with the same name and 3665 // in the same context as the variable we're importing. 3666 VarDecl *FoundByLookup = nullptr; 3667 if (D->isFileVarDecl()) { 3668 SmallVector<NamedDecl *, 4> ConflictingDecls; 3669 unsigned IDNS = Decl::IDNS_Ordinary; 3670 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name); 3671 for (auto *FoundDecl : FoundDecls) { 3672 if (!FoundDecl->isInIdentifierNamespace(IDNS)) 3673 continue; 3674 3675 if (auto *FoundVar = dyn_cast<VarDecl>(FoundDecl)) { 3676 if (!hasSameVisibilityContext(FoundVar, D)) 3677 continue; 3678 if (Importer.IsStructurallyEquivalent(D->getType(), 3679 FoundVar->getType())) { 3680 3681 // The VarDecl in the "From" context has a definition, but in the 3682 // "To" context we already have a definition. 3683 VarDecl *FoundDef = FoundVar->getDefinition(); 3684 if (D->isThisDeclarationADefinition() && FoundDef) 3685 // FIXME Check for ODR error if the two definitions have 3686 // different initializers? 3687 return Importer.MapImported(D, FoundDef); 3688 3689 // The VarDecl in the "From" context has an initializer, but in the 3690 // "To" context we already have an initializer. 3691 const VarDecl *FoundDInit = nullptr; 3692 if (D->getInit() && FoundVar->getAnyInitializer(FoundDInit)) 3693 // FIXME Diagnose ODR error if the two initializers are different? 3694 return Importer.MapImported(D, const_cast<VarDecl*>(FoundDInit)); 3695 3696 FoundByLookup = FoundVar; 3697 break; 3698 } 3699 3700 const ArrayType *FoundArray 3701 = Importer.getToContext().getAsArrayType(FoundVar->getType()); 3702 const ArrayType *TArray 3703 = Importer.getToContext().getAsArrayType(D->getType()); 3704 if (FoundArray && TArray) { 3705 if (isa<IncompleteArrayType>(FoundArray) && 3706 isa<ConstantArrayType>(TArray)) { 3707 // Import the type. 3708 if (auto TyOrErr = import(D->getType())) 3709 FoundVar->setType(*TyOrErr); 3710 else 3711 return TyOrErr.takeError(); 3712 3713 FoundByLookup = FoundVar; 3714 break; 3715 } else if (isa<IncompleteArrayType>(TArray) && 3716 isa<ConstantArrayType>(FoundArray)) { 3717 FoundByLookup = FoundVar; 3718 break; 3719 } 3720 } 3721 3722 Importer.ToDiag(Loc, diag::warn_odr_variable_type_inconsistent) 3723 << Name << D->getType() << FoundVar->getType(); 3724 Importer.ToDiag(FoundVar->getLocation(), diag::note_odr_value_here) 3725 << FoundVar->getType(); 3726 ConflictingDecls.push_back(FoundDecl); 3727 } 3728 } 3729 3730 if (!ConflictingDecls.empty()) { 3731 ExpectedName NameOrErr = Importer.HandleNameConflict( 3732 Name, DC, IDNS, ConflictingDecls.data(), ConflictingDecls.size()); 3733 if (NameOrErr) 3734 Name = NameOrErr.get(); 3735 else 3736 return NameOrErr.takeError(); 3737 } 3738 } 3739 3740 QualType ToType; 3741 TypeSourceInfo *ToTypeSourceInfo; 3742 SourceLocation ToInnerLocStart; 3743 NestedNameSpecifierLoc ToQualifierLoc; 3744 if (auto Imp = importSeq( 3745 D->getType(), D->getTypeSourceInfo(), D->getInnerLocStart(), 3746 D->getQualifierLoc())) 3747 std::tie(ToType, ToTypeSourceInfo, ToInnerLocStart, ToQualifierLoc) = *Imp; 3748 else 3749 return Imp.takeError(); 3750 3751 // Create the imported variable. 3752 VarDecl *ToVar; 3753 if (GetImportedOrCreateDecl(ToVar, D, Importer.getToContext(), DC, 3754 ToInnerLocStart, Loc, 3755 Name.getAsIdentifierInfo(), 3756 ToType, ToTypeSourceInfo, 3757 D->getStorageClass())) 3758 return ToVar; 3759 3760 ToVar->setQualifierInfo(ToQualifierLoc); 3761 ToVar->setAccess(D->getAccess()); 3762 ToVar->setLexicalDeclContext(LexicalDC); 3763 3764 if (FoundByLookup) { 3765 auto *Recent = const_cast<VarDecl *>(FoundByLookup->getMostRecentDecl()); 3766 ToVar->setPreviousDecl(Recent); 3767 } 3768 3769 if (Error Err = ImportInitializer(D, ToVar)) 3770 return std::move(Err); 3771 3772 if (D->isConstexpr()) 3773 ToVar->setConstexpr(true); 3774 3775 if (D->getDeclContext()->containsDeclAndLoad(D)) 3776 DC->addDeclInternal(ToVar); 3777 if (DC != LexicalDC && D->getLexicalDeclContext()->containsDeclAndLoad(D)) 3778 LexicalDC->addDeclInternal(ToVar); 3779 3780 // Import the rest of the chain. I.e. import all subsequent declarations. 3781 for (++RedeclIt; RedeclIt != Redecls.end(); ++RedeclIt) { 3782 ExpectedDecl RedeclOrErr = import(*RedeclIt); 3783 if (!RedeclOrErr) 3784 return RedeclOrErr.takeError(); 3785 } 3786 3787 return ToVar; 3788 } 3789 3790 ExpectedDecl ASTNodeImporter::VisitImplicitParamDecl(ImplicitParamDecl *D) { 3791 // Parameters are created in the translation unit's context, then moved 3792 // into the function declaration's context afterward. 3793 DeclContext *DC = Importer.getToContext().getTranslationUnitDecl(); 3794 3795 DeclarationName ToDeclName; 3796 SourceLocation ToLocation; 3797 QualType ToType; 3798 if (auto Imp = importSeq(D->getDeclName(), D->getLocation(), D->getType())) 3799 std::tie(ToDeclName, ToLocation, ToType) = *Imp; 3800 else 3801 return Imp.takeError(); 3802 3803 // Create the imported parameter. 3804 ImplicitParamDecl *ToParm = nullptr; 3805 if (GetImportedOrCreateDecl(ToParm, D, Importer.getToContext(), DC, 3806 ToLocation, ToDeclName.getAsIdentifierInfo(), 3807 ToType, D->getParameterKind())) 3808 return ToParm; 3809 return ToParm; 3810 } 3811 3812 Error ASTNodeImporter::ImportDefaultArgOfParmVarDecl( 3813 const ParmVarDecl *FromParam, ParmVarDecl *ToParam) { 3814 ToParam->setHasInheritedDefaultArg(FromParam->hasInheritedDefaultArg()); 3815 ToParam->setKNRPromoted(FromParam->isKNRPromoted()); 3816 3817 if (FromParam->hasUninstantiatedDefaultArg()) { 3818 if (auto ToDefArgOrErr = import(FromParam->getUninstantiatedDefaultArg())) 3819 ToParam->setUninstantiatedDefaultArg(*ToDefArgOrErr); 3820 else 3821 return ToDefArgOrErr.takeError(); 3822 } else if (FromParam->hasUnparsedDefaultArg()) { 3823 ToParam->setUnparsedDefaultArg(); 3824 } else if (FromParam->hasDefaultArg()) { 3825 if (auto ToDefArgOrErr = import(FromParam->getDefaultArg())) 3826 ToParam->setDefaultArg(*ToDefArgOrErr); 3827 else 3828 return ToDefArgOrErr.takeError(); 3829 } 3830 3831 return Error::success(); 3832 } 3833 3834 ExpectedDecl ASTNodeImporter::VisitParmVarDecl(ParmVarDecl *D) { 3835 // Parameters are created in the translation unit's context, then moved 3836 // into the function declaration's context afterward. 3837 DeclContext *DC = Importer.getToContext().getTranslationUnitDecl(); 3838 3839 DeclarationName ToDeclName; 3840 SourceLocation ToLocation, ToInnerLocStart; 3841 QualType ToType; 3842 TypeSourceInfo *ToTypeSourceInfo; 3843 if (auto Imp = importSeq( 3844 D->getDeclName(), D->getLocation(), D->getType(), D->getInnerLocStart(), 3845 D->getTypeSourceInfo())) 3846 std::tie( 3847 ToDeclName, ToLocation, ToType, ToInnerLocStart, 3848 ToTypeSourceInfo) = *Imp; 3849 else 3850 return Imp.takeError(); 3851 3852 ParmVarDecl *ToParm; 3853 if (GetImportedOrCreateDecl(ToParm, D, Importer.getToContext(), DC, 3854 ToInnerLocStart, ToLocation, 3855 ToDeclName.getAsIdentifierInfo(), ToType, 3856 ToTypeSourceInfo, D->getStorageClass(), 3857 /*DefaultArg*/ nullptr)) 3858 return ToParm; 3859 3860 // Set the default argument. It should be no problem if it was already done. 3861 // Do not import the default expression before GetImportedOrCreateDecl call 3862 // to avoid possible infinite import loop because circular dependency. 3863 if (Error Err = ImportDefaultArgOfParmVarDecl(D, ToParm)) 3864 return std::move(Err); 3865 3866 if (D->isObjCMethodParameter()) { 3867 ToParm->setObjCMethodScopeInfo(D->getFunctionScopeIndex()); 3868 ToParm->setObjCDeclQualifier(D->getObjCDeclQualifier()); 3869 } else { 3870 ToParm->setScopeInfo(D->getFunctionScopeDepth(), 3871 D->getFunctionScopeIndex()); 3872 } 3873 3874 return ToParm; 3875 } 3876 3877 ExpectedDecl ASTNodeImporter::VisitObjCMethodDecl(ObjCMethodDecl *D) { 3878 // Import the major distinguishing characteristics of a method. 3879 DeclContext *DC, *LexicalDC; 3880 DeclarationName Name; 3881 SourceLocation Loc; 3882 NamedDecl *ToD; 3883 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 3884 return std::move(Err); 3885 if (ToD) 3886 return ToD; 3887 3888 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name); 3889 for (auto *FoundDecl : FoundDecls) { 3890 if (auto *FoundMethod = dyn_cast<ObjCMethodDecl>(FoundDecl)) { 3891 if (FoundMethod->isInstanceMethod() != D->isInstanceMethod()) 3892 continue; 3893 3894 // Check return types. 3895 if (!Importer.IsStructurallyEquivalent(D->getReturnType(), 3896 FoundMethod->getReturnType())) { 3897 Importer.ToDiag(Loc, diag::warn_odr_objc_method_result_type_inconsistent) 3898 << D->isInstanceMethod() << Name << D->getReturnType() 3899 << FoundMethod->getReturnType(); 3900 Importer.ToDiag(FoundMethod->getLocation(), 3901 diag::note_odr_objc_method_here) 3902 << D->isInstanceMethod() << Name; 3903 3904 return make_error<ImportError>(ImportError::NameConflict); 3905 } 3906 3907 // Check the number of parameters. 3908 if (D->param_size() != FoundMethod->param_size()) { 3909 Importer.ToDiag(Loc, diag::warn_odr_objc_method_num_params_inconsistent) 3910 << D->isInstanceMethod() << Name 3911 << D->param_size() << FoundMethod->param_size(); 3912 Importer.ToDiag(FoundMethod->getLocation(), 3913 diag::note_odr_objc_method_here) 3914 << D->isInstanceMethod() << Name; 3915 3916 return make_error<ImportError>(ImportError::NameConflict); 3917 } 3918 3919 // Check parameter types. 3920 for (ObjCMethodDecl::param_iterator P = D->param_begin(), 3921 PEnd = D->param_end(), FoundP = FoundMethod->param_begin(); 3922 P != PEnd; ++P, ++FoundP) { 3923 if (!Importer.IsStructurallyEquivalent((*P)->getType(), 3924 (*FoundP)->getType())) { 3925 Importer.FromDiag((*P)->getLocation(), 3926 diag::warn_odr_objc_method_param_type_inconsistent) 3927 << D->isInstanceMethod() << Name 3928 << (*P)->getType() << (*FoundP)->getType(); 3929 Importer.ToDiag((*FoundP)->getLocation(), diag::note_odr_value_here) 3930 << (*FoundP)->getType(); 3931 3932 return make_error<ImportError>(ImportError::NameConflict); 3933 } 3934 } 3935 3936 // Check variadic/non-variadic. 3937 // Check the number of parameters. 3938 if (D->isVariadic() != FoundMethod->isVariadic()) { 3939 Importer.ToDiag(Loc, diag::warn_odr_objc_method_variadic_inconsistent) 3940 << D->isInstanceMethod() << Name; 3941 Importer.ToDiag(FoundMethod->getLocation(), 3942 diag::note_odr_objc_method_here) 3943 << D->isInstanceMethod() << Name; 3944 3945 return make_error<ImportError>(ImportError::NameConflict); 3946 } 3947 3948 // FIXME: Any other bits we need to merge? 3949 return Importer.MapImported(D, FoundMethod); 3950 } 3951 } 3952 3953 SourceLocation ToEndLoc; 3954 QualType ToReturnType; 3955 TypeSourceInfo *ToReturnTypeSourceInfo; 3956 if (auto Imp = importSeq( 3957 D->getEndLoc(), D->getReturnType(), D->getReturnTypeSourceInfo())) 3958 std::tie(ToEndLoc, ToReturnType, ToReturnTypeSourceInfo) = *Imp; 3959 else 3960 return Imp.takeError(); 3961 3962 ObjCMethodDecl *ToMethod; 3963 if (GetImportedOrCreateDecl( 3964 ToMethod, D, Importer.getToContext(), Loc, 3965 ToEndLoc, Name.getObjCSelector(), ToReturnType, 3966 ToReturnTypeSourceInfo, DC, D->isInstanceMethod(), D->isVariadic(), 3967 D->isPropertyAccessor(), D->isImplicit(), D->isDefined(), 3968 D->getImplementationControl(), D->hasRelatedResultType())) 3969 return ToMethod; 3970 3971 // FIXME: When we decide to merge method definitions, we'll need to 3972 // deal with implicit parameters. 3973 3974 // Import the parameters 3975 SmallVector<ParmVarDecl *, 5> ToParams; 3976 for (auto *FromP : D->parameters()) { 3977 if (Expected<ParmVarDecl *> ToPOrErr = import(FromP)) 3978 ToParams.push_back(*ToPOrErr); 3979 else 3980 return ToPOrErr.takeError(); 3981 } 3982 3983 // Set the parameters. 3984 for (auto *ToParam : ToParams) { 3985 ToParam->setOwningFunction(ToMethod); 3986 ToMethod->addDeclInternal(ToParam); 3987 } 3988 3989 SmallVector<SourceLocation, 12> FromSelLocs; 3990 D->getSelectorLocs(FromSelLocs); 3991 SmallVector<SourceLocation, 12> ToSelLocs(FromSelLocs.size()); 3992 if (Error Err = ImportContainerChecked(FromSelLocs, ToSelLocs)) 3993 return std::move(Err); 3994 3995 ToMethod->setMethodParams(Importer.getToContext(), ToParams, ToSelLocs); 3996 3997 ToMethod->setLexicalDeclContext(LexicalDC); 3998 LexicalDC->addDeclInternal(ToMethod); 3999 return ToMethod; 4000 } 4001 4002 ExpectedDecl ASTNodeImporter::VisitObjCTypeParamDecl(ObjCTypeParamDecl *D) { 4003 // Import the major distinguishing characteristics of a category. 4004 DeclContext *DC, *LexicalDC; 4005 DeclarationName Name; 4006 SourceLocation Loc; 4007 NamedDecl *ToD; 4008 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 4009 return std::move(Err); 4010 if (ToD) 4011 return ToD; 4012 4013 SourceLocation ToVarianceLoc, ToLocation, ToColonLoc; 4014 TypeSourceInfo *ToTypeSourceInfo; 4015 if (auto Imp = importSeq( 4016 D->getVarianceLoc(), D->getLocation(), D->getColonLoc(), 4017 D->getTypeSourceInfo())) 4018 std::tie(ToVarianceLoc, ToLocation, ToColonLoc, ToTypeSourceInfo) = *Imp; 4019 else 4020 return Imp.takeError(); 4021 4022 ObjCTypeParamDecl *Result; 4023 if (GetImportedOrCreateDecl( 4024 Result, D, Importer.getToContext(), DC, D->getVariance(), 4025 ToVarianceLoc, D->getIndex(), 4026 ToLocation, Name.getAsIdentifierInfo(), 4027 ToColonLoc, ToTypeSourceInfo)) 4028 return Result; 4029 4030 Result->setLexicalDeclContext(LexicalDC); 4031 return Result; 4032 } 4033 4034 ExpectedDecl ASTNodeImporter::VisitObjCCategoryDecl(ObjCCategoryDecl *D) { 4035 // Import the major distinguishing characteristics of a category. 4036 DeclContext *DC, *LexicalDC; 4037 DeclarationName Name; 4038 SourceLocation Loc; 4039 NamedDecl *ToD; 4040 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 4041 return std::move(Err); 4042 if (ToD) 4043 return ToD; 4044 4045 ObjCInterfaceDecl *ToInterface; 4046 if (Error Err = importInto(ToInterface, D->getClassInterface())) 4047 return std::move(Err); 4048 4049 // Determine if we've already encountered this category. 4050 ObjCCategoryDecl *MergeWithCategory 4051 = ToInterface->FindCategoryDeclaration(Name.getAsIdentifierInfo()); 4052 ObjCCategoryDecl *ToCategory = MergeWithCategory; 4053 if (!ToCategory) { 4054 SourceLocation ToAtStartLoc, ToCategoryNameLoc; 4055 SourceLocation ToIvarLBraceLoc, ToIvarRBraceLoc; 4056 if (auto Imp = importSeq( 4057 D->getAtStartLoc(), D->getCategoryNameLoc(), 4058 D->getIvarLBraceLoc(), D->getIvarRBraceLoc())) 4059 std::tie( 4060 ToAtStartLoc, ToCategoryNameLoc, 4061 ToIvarLBraceLoc, ToIvarRBraceLoc) = *Imp; 4062 else 4063 return Imp.takeError(); 4064 4065 if (GetImportedOrCreateDecl(ToCategory, D, Importer.getToContext(), DC, 4066 ToAtStartLoc, Loc, 4067 ToCategoryNameLoc, 4068 Name.getAsIdentifierInfo(), ToInterface, 4069 /*TypeParamList=*/nullptr, 4070 ToIvarLBraceLoc, 4071 ToIvarRBraceLoc)) 4072 return ToCategory; 4073 4074 ToCategory->setLexicalDeclContext(LexicalDC); 4075 LexicalDC->addDeclInternal(ToCategory); 4076 // Import the type parameter list after MapImported, to avoid 4077 // loops when bringing in their DeclContext. 4078 if (auto PListOrErr = ImportObjCTypeParamList(D->getTypeParamList())) 4079 ToCategory->setTypeParamList(*PListOrErr); 4080 else 4081 return PListOrErr.takeError(); 4082 4083 // Import protocols 4084 SmallVector<ObjCProtocolDecl *, 4> Protocols; 4085 SmallVector<SourceLocation, 4> ProtocolLocs; 4086 ObjCCategoryDecl::protocol_loc_iterator FromProtoLoc 4087 = D->protocol_loc_begin(); 4088 for (ObjCCategoryDecl::protocol_iterator FromProto = D->protocol_begin(), 4089 FromProtoEnd = D->protocol_end(); 4090 FromProto != FromProtoEnd; 4091 ++FromProto, ++FromProtoLoc) { 4092 if (Expected<ObjCProtocolDecl *> ToProtoOrErr = import(*FromProto)) 4093 Protocols.push_back(*ToProtoOrErr); 4094 else 4095 return ToProtoOrErr.takeError(); 4096 4097 if (ExpectedSLoc ToProtoLocOrErr = import(*FromProtoLoc)) 4098 ProtocolLocs.push_back(*ToProtoLocOrErr); 4099 else 4100 return ToProtoLocOrErr.takeError(); 4101 } 4102 4103 // FIXME: If we're merging, make sure that the protocol list is the same. 4104 ToCategory->setProtocolList(Protocols.data(), Protocols.size(), 4105 ProtocolLocs.data(), Importer.getToContext()); 4106 4107 } else { 4108 Importer.MapImported(D, ToCategory); 4109 } 4110 4111 // Import all of the members of this category. 4112 if (Error Err = ImportDeclContext(D)) 4113 return std::move(Err); 4114 4115 // If we have an implementation, import it as well. 4116 if (D->getImplementation()) { 4117 if (Expected<ObjCCategoryImplDecl *> ToImplOrErr = 4118 import(D->getImplementation())) 4119 ToCategory->setImplementation(*ToImplOrErr); 4120 else 4121 return ToImplOrErr.takeError(); 4122 } 4123 4124 return ToCategory; 4125 } 4126 4127 Error ASTNodeImporter::ImportDefinition( 4128 ObjCProtocolDecl *From, ObjCProtocolDecl *To, ImportDefinitionKind Kind) { 4129 if (To->getDefinition()) { 4130 if (shouldForceImportDeclContext(Kind)) 4131 if (Error Err = ImportDeclContext(From)) 4132 return Err; 4133 return Error::success(); 4134 } 4135 4136 // Start the protocol definition 4137 To->startDefinition(); 4138 4139 // Import protocols 4140 SmallVector<ObjCProtocolDecl *, 4> Protocols; 4141 SmallVector<SourceLocation, 4> ProtocolLocs; 4142 ObjCProtocolDecl::protocol_loc_iterator FromProtoLoc = 4143 From->protocol_loc_begin(); 4144 for (ObjCProtocolDecl::protocol_iterator FromProto = From->protocol_begin(), 4145 FromProtoEnd = From->protocol_end(); 4146 FromProto != FromProtoEnd; 4147 ++FromProto, ++FromProtoLoc) { 4148 if (Expected<ObjCProtocolDecl *> ToProtoOrErr = import(*FromProto)) 4149 Protocols.push_back(*ToProtoOrErr); 4150 else 4151 return ToProtoOrErr.takeError(); 4152 4153 if (ExpectedSLoc ToProtoLocOrErr = import(*FromProtoLoc)) 4154 ProtocolLocs.push_back(*ToProtoLocOrErr); 4155 else 4156 return ToProtoLocOrErr.takeError(); 4157 4158 } 4159 4160 // FIXME: If we're merging, make sure that the protocol list is the same. 4161 To->setProtocolList(Protocols.data(), Protocols.size(), 4162 ProtocolLocs.data(), Importer.getToContext()); 4163 4164 if (shouldForceImportDeclContext(Kind)) { 4165 // Import all of the members of this protocol. 4166 if (Error Err = ImportDeclContext(From, /*ForceImport=*/true)) 4167 return Err; 4168 } 4169 return Error::success(); 4170 } 4171 4172 ExpectedDecl ASTNodeImporter::VisitObjCProtocolDecl(ObjCProtocolDecl *D) { 4173 // If this protocol has a definition in the translation unit we're coming 4174 // from, but this particular declaration is not that definition, import the 4175 // definition and map to that. 4176 ObjCProtocolDecl *Definition = D->getDefinition(); 4177 if (Definition && Definition != D) { 4178 if (ExpectedDecl ImportedDefOrErr = import(Definition)) 4179 return Importer.MapImported(D, *ImportedDefOrErr); 4180 else 4181 return ImportedDefOrErr.takeError(); 4182 } 4183 4184 // Import the major distinguishing characteristics of a protocol. 4185 DeclContext *DC, *LexicalDC; 4186 DeclarationName Name; 4187 SourceLocation Loc; 4188 NamedDecl *ToD; 4189 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 4190 return std::move(Err); 4191 if (ToD) 4192 return ToD; 4193 4194 ObjCProtocolDecl *MergeWithProtocol = nullptr; 4195 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name); 4196 for (auto *FoundDecl : FoundDecls) { 4197 if (!FoundDecl->isInIdentifierNamespace(Decl::IDNS_ObjCProtocol)) 4198 continue; 4199 4200 if ((MergeWithProtocol = dyn_cast<ObjCProtocolDecl>(FoundDecl))) 4201 break; 4202 } 4203 4204 ObjCProtocolDecl *ToProto = MergeWithProtocol; 4205 if (!ToProto) { 4206 auto ToAtBeginLocOrErr = import(D->getAtStartLoc()); 4207 if (!ToAtBeginLocOrErr) 4208 return ToAtBeginLocOrErr.takeError(); 4209 4210 if (GetImportedOrCreateDecl(ToProto, D, Importer.getToContext(), DC, 4211 Name.getAsIdentifierInfo(), Loc, 4212 *ToAtBeginLocOrErr, 4213 /*PrevDecl=*/nullptr)) 4214 return ToProto; 4215 ToProto->setLexicalDeclContext(LexicalDC); 4216 LexicalDC->addDeclInternal(ToProto); 4217 } 4218 4219 Importer.MapImported(D, ToProto); 4220 4221 if (D->isThisDeclarationADefinition()) 4222 if (Error Err = ImportDefinition(D, ToProto)) 4223 return std::move(Err); 4224 4225 return ToProto; 4226 } 4227 4228 ExpectedDecl ASTNodeImporter::VisitLinkageSpecDecl(LinkageSpecDecl *D) { 4229 DeclContext *DC, *LexicalDC; 4230 if (Error Err = ImportDeclContext(D, DC, LexicalDC)) 4231 return std::move(Err); 4232 4233 ExpectedSLoc ExternLocOrErr = import(D->getExternLoc()); 4234 if (!ExternLocOrErr) 4235 return ExternLocOrErr.takeError(); 4236 4237 ExpectedSLoc LangLocOrErr = import(D->getLocation()); 4238 if (!LangLocOrErr) 4239 return LangLocOrErr.takeError(); 4240 4241 bool HasBraces = D->hasBraces(); 4242 4243 LinkageSpecDecl *ToLinkageSpec; 4244 if (GetImportedOrCreateDecl(ToLinkageSpec, D, Importer.getToContext(), DC, 4245 *ExternLocOrErr, *LangLocOrErr, 4246 D->getLanguage(), HasBraces)) 4247 return ToLinkageSpec; 4248 4249 if (HasBraces) { 4250 ExpectedSLoc RBraceLocOrErr = import(D->getRBraceLoc()); 4251 if (!RBraceLocOrErr) 4252 return RBraceLocOrErr.takeError(); 4253 ToLinkageSpec->setRBraceLoc(*RBraceLocOrErr); 4254 } 4255 4256 ToLinkageSpec->setLexicalDeclContext(LexicalDC); 4257 LexicalDC->addDeclInternal(ToLinkageSpec); 4258 4259 return ToLinkageSpec; 4260 } 4261 4262 ExpectedDecl ASTNodeImporter::VisitUsingDecl(UsingDecl *D) { 4263 DeclContext *DC, *LexicalDC; 4264 DeclarationName Name; 4265 SourceLocation Loc; 4266 NamedDecl *ToD = nullptr; 4267 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 4268 return std::move(Err); 4269 if (ToD) 4270 return ToD; 4271 4272 SourceLocation ToLoc, ToUsingLoc; 4273 NestedNameSpecifierLoc ToQualifierLoc; 4274 if (auto Imp = importSeq( 4275 D->getNameInfo().getLoc(), D->getUsingLoc(), D->getQualifierLoc())) 4276 std::tie(ToLoc, ToUsingLoc, ToQualifierLoc) = *Imp; 4277 else 4278 return Imp.takeError(); 4279 4280 DeclarationNameInfo NameInfo(Name, ToLoc); 4281 if (Error Err = ImportDeclarationNameLoc(D->getNameInfo(), NameInfo)) 4282 return std::move(Err); 4283 4284 UsingDecl *ToUsing; 4285 if (GetImportedOrCreateDecl(ToUsing, D, Importer.getToContext(), DC, 4286 ToUsingLoc, ToQualifierLoc, NameInfo, 4287 D->hasTypename())) 4288 return ToUsing; 4289 4290 ToUsing->setLexicalDeclContext(LexicalDC); 4291 LexicalDC->addDeclInternal(ToUsing); 4292 4293 if (NamedDecl *FromPattern = 4294 Importer.getFromContext().getInstantiatedFromUsingDecl(D)) { 4295 if (Expected<NamedDecl *> ToPatternOrErr = import(FromPattern)) 4296 Importer.getToContext().setInstantiatedFromUsingDecl( 4297 ToUsing, *ToPatternOrErr); 4298 else 4299 return ToPatternOrErr.takeError(); 4300 } 4301 4302 for (UsingShadowDecl *FromShadow : D->shadows()) { 4303 if (Expected<UsingShadowDecl *> ToShadowOrErr = import(FromShadow)) 4304 ToUsing->addShadowDecl(*ToShadowOrErr); 4305 else 4306 // FIXME: We return error here but the definition is already created 4307 // and available with lookups. How to fix this?.. 4308 return ToShadowOrErr.takeError(); 4309 } 4310 return ToUsing; 4311 } 4312 4313 ExpectedDecl ASTNodeImporter::VisitUsingShadowDecl(UsingShadowDecl *D) { 4314 DeclContext *DC, *LexicalDC; 4315 DeclarationName Name; 4316 SourceLocation Loc; 4317 NamedDecl *ToD = nullptr; 4318 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 4319 return std::move(Err); 4320 if (ToD) 4321 return ToD; 4322 4323 Expected<UsingDecl *> ToUsingOrErr = import(D->getUsingDecl()); 4324 if (!ToUsingOrErr) 4325 return ToUsingOrErr.takeError(); 4326 4327 Expected<NamedDecl *> ToTargetOrErr = import(D->getTargetDecl()); 4328 if (!ToTargetOrErr) 4329 return ToTargetOrErr.takeError(); 4330 4331 UsingShadowDecl *ToShadow; 4332 if (GetImportedOrCreateDecl(ToShadow, D, Importer.getToContext(), DC, Loc, 4333 *ToUsingOrErr, *ToTargetOrErr)) 4334 return ToShadow; 4335 4336 ToShadow->setLexicalDeclContext(LexicalDC); 4337 ToShadow->setAccess(D->getAccess()); 4338 4339 if (UsingShadowDecl *FromPattern = 4340 Importer.getFromContext().getInstantiatedFromUsingShadowDecl(D)) { 4341 if (Expected<UsingShadowDecl *> ToPatternOrErr = import(FromPattern)) 4342 Importer.getToContext().setInstantiatedFromUsingShadowDecl( 4343 ToShadow, *ToPatternOrErr); 4344 else 4345 // FIXME: We return error here but the definition is already created 4346 // and available with lookups. How to fix this?.. 4347 return ToPatternOrErr.takeError(); 4348 } 4349 4350 LexicalDC->addDeclInternal(ToShadow); 4351 4352 return ToShadow; 4353 } 4354 4355 ExpectedDecl ASTNodeImporter::VisitUsingDirectiveDecl(UsingDirectiveDecl *D) { 4356 DeclContext *DC, *LexicalDC; 4357 DeclarationName Name; 4358 SourceLocation Loc; 4359 NamedDecl *ToD = nullptr; 4360 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 4361 return std::move(Err); 4362 if (ToD) 4363 return ToD; 4364 4365 auto ToComAncestorOrErr = Importer.ImportContext(D->getCommonAncestor()); 4366 if (!ToComAncestorOrErr) 4367 return ToComAncestorOrErr.takeError(); 4368 4369 NamespaceDecl *ToNominatedNamespace; 4370 SourceLocation ToUsingLoc, ToNamespaceKeyLocation, ToIdentLocation; 4371 NestedNameSpecifierLoc ToQualifierLoc; 4372 if (auto Imp = importSeq( 4373 D->getNominatedNamespace(), D->getUsingLoc(), 4374 D->getNamespaceKeyLocation(), D->getQualifierLoc(), 4375 D->getIdentLocation())) 4376 std::tie( 4377 ToNominatedNamespace, ToUsingLoc, ToNamespaceKeyLocation, 4378 ToQualifierLoc, ToIdentLocation) = *Imp; 4379 else 4380 return Imp.takeError(); 4381 4382 UsingDirectiveDecl *ToUsingDir; 4383 if (GetImportedOrCreateDecl(ToUsingDir, D, Importer.getToContext(), DC, 4384 ToUsingLoc, 4385 ToNamespaceKeyLocation, 4386 ToQualifierLoc, 4387 ToIdentLocation, 4388 ToNominatedNamespace, *ToComAncestorOrErr)) 4389 return ToUsingDir; 4390 4391 ToUsingDir->setLexicalDeclContext(LexicalDC); 4392 LexicalDC->addDeclInternal(ToUsingDir); 4393 4394 return ToUsingDir; 4395 } 4396 4397 ExpectedDecl ASTNodeImporter::VisitUnresolvedUsingValueDecl( 4398 UnresolvedUsingValueDecl *D) { 4399 DeclContext *DC, *LexicalDC; 4400 DeclarationName Name; 4401 SourceLocation Loc; 4402 NamedDecl *ToD = nullptr; 4403 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 4404 return std::move(Err); 4405 if (ToD) 4406 return ToD; 4407 4408 SourceLocation ToLoc, ToUsingLoc, ToEllipsisLoc; 4409 NestedNameSpecifierLoc ToQualifierLoc; 4410 if (auto Imp = importSeq( 4411 D->getNameInfo().getLoc(), D->getUsingLoc(), D->getQualifierLoc(), 4412 D->getEllipsisLoc())) 4413 std::tie(ToLoc, ToUsingLoc, ToQualifierLoc, ToEllipsisLoc) = *Imp; 4414 else 4415 return Imp.takeError(); 4416 4417 DeclarationNameInfo NameInfo(Name, ToLoc); 4418 if (Error Err = ImportDeclarationNameLoc(D->getNameInfo(), NameInfo)) 4419 return std::move(Err); 4420 4421 UnresolvedUsingValueDecl *ToUsingValue; 4422 if (GetImportedOrCreateDecl(ToUsingValue, D, Importer.getToContext(), DC, 4423 ToUsingLoc, ToQualifierLoc, NameInfo, 4424 ToEllipsisLoc)) 4425 return ToUsingValue; 4426 4427 ToUsingValue->setAccess(D->getAccess()); 4428 ToUsingValue->setLexicalDeclContext(LexicalDC); 4429 LexicalDC->addDeclInternal(ToUsingValue); 4430 4431 return ToUsingValue; 4432 } 4433 4434 ExpectedDecl ASTNodeImporter::VisitUnresolvedUsingTypenameDecl( 4435 UnresolvedUsingTypenameDecl *D) { 4436 DeclContext *DC, *LexicalDC; 4437 DeclarationName Name; 4438 SourceLocation Loc; 4439 NamedDecl *ToD = nullptr; 4440 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 4441 return std::move(Err); 4442 if (ToD) 4443 return ToD; 4444 4445 SourceLocation ToUsingLoc, ToTypenameLoc, ToEllipsisLoc; 4446 NestedNameSpecifierLoc ToQualifierLoc; 4447 if (auto Imp = importSeq( 4448 D->getUsingLoc(), D->getTypenameLoc(), D->getQualifierLoc(), 4449 D->getEllipsisLoc())) 4450 std::tie(ToUsingLoc, ToTypenameLoc, ToQualifierLoc, ToEllipsisLoc) = *Imp; 4451 else 4452 return Imp.takeError(); 4453 4454 UnresolvedUsingTypenameDecl *ToUsing; 4455 if (GetImportedOrCreateDecl(ToUsing, D, Importer.getToContext(), DC, 4456 ToUsingLoc, ToTypenameLoc, 4457 ToQualifierLoc, Loc, Name, ToEllipsisLoc)) 4458 return ToUsing; 4459 4460 ToUsing->setAccess(D->getAccess()); 4461 ToUsing->setLexicalDeclContext(LexicalDC); 4462 LexicalDC->addDeclInternal(ToUsing); 4463 4464 return ToUsing; 4465 } 4466 4467 4468 Error ASTNodeImporter::ImportDefinition( 4469 ObjCInterfaceDecl *From, ObjCInterfaceDecl *To, ImportDefinitionKind Kind) { 4470 if (To->getDefinition()) { 4471 // Check consistency of superclass. 4472 ObjCInterfaceDecl *FromSuper = From->getSuperClass(); 4473 if (FromSuper) { 4474 if (auto FromSuperOrErr = import(FromSuper)) 4475 FromSuper = *FromSuperOrErr; 4476 else 4477 return FromSuperOrErr.takeError(); 4478 } 4479 4480 ObjCInterfaceDecl *ToSuper = To->getSuperClass(); 4481 if ((bool)FromSuper != (bool)ToSuper || 4482 (FromSuper && !declaresSameEntity(FromSuper, ToSuper))) { 4483 Importer.ToDiag(To->getLocation(), 4484 diag::warn_odr_objc_superclass_inconsistent) 4485 << To->getDeclName(); 4486 if (ToSuper) 4487 Importer.ToDiag(To->getSuperClassLoc(), diag::note_odr_objc_superclass) 4488 << To->getSuperClass()->getDeclName(); 4489 else 4490 Importer.ToDiag(To->getLocation(), 4491 diag::note_odr_objc_missing_superclass); 4492 if (From->getSuperClass()) 4493 Importer.FromDiag(From->getSuperClassLoc(), 4494 diag::note_odr_objc_superclass) 4495 << From->getSuperClass()->getDeclName(); 4496 else 4497 Importer.FromDiag(From->getLocation(), 4498 diag::note_odr_objc_missing_superclass); 4499 } 4500 4501 if (shouldForceImportDeclContext(Kind)) 4502 if (Error Err = ImportDeclContext(From)) 4503 return Err; 4504 return Error::success(); 4505 } 4506 4507 // Start the definition. 4508 To->startDefinition(); 4509 4510 // If this class has a superclass, import it. 4511 if (From->getSuperClass()) { 4512 if (auto SuperTInfoOrErr = import(From->getSuperClassTInfo())) 4513 To->setSuperClass(*SuperTInfoOrErr); 4514 else 4515 return SuperTInfoOrErr.takeError(); 4516 } 4517 4518 // Import protocols 4519 SmallVector<ObjCProtocolDecl *, 4> Protocols; 4520 SmallVector<SourceLocation, 4> ProtocolLocs; 4521 ObjCInterfaceDecl::protocol_loc_iterator FromProtoLoc = 4522 From->protocol_loc_begin(); 4523 4524 for (ObjCInterfaceDecl::protocol_iterator FromProto = From->protocol_begin(), 4525 FromProtoEnd = From->protocol_end(); 4526 FromProto != FromProtoEnd; 4527 ++FromProto, ++FromProtoLoc) { 4528 if (Expected<ObjCProtocolDecl *> ToProtoOrErr = import(*FromProto)) 4529 Protocols.push_back(*ToProtoOrErr); 4530 else 4531 return ToProtoOrErr.takeError(); 4532 4533 if (ExpectedSLoc ToProtoLocOrErr = import(*FromProtoLoc)) 4534 ProtocolLocs.push_back(*ToProtoLocOrErr); 4535 else 4536 return ToProtoLocOrErr.takeError(); 4537 4538 } 4539 4540 // FIXME: If we're merging, make sure that the protocol list is the same. 4541 To->setProtocolList(Protocols.data(), Protocols.size(), 4542 ProtocolLocs.data(), Importer.getToContext()); 4543 4544 // Import categories. When the categories themselves are imported, they'll 4545 // hook themselves into this interface. 4546 for (auto *Cat : From->known_categories()) { 4547 auto ToCatOrErr = import(Cat); 4548 if (!ToCatOrErr) 4549 return ToCatOrErr.takeError(); 4550 } 4551 4552 // If we have an @implementation, import it as well. 4553 if (From->getImplementation()) { 4554 if (Expected<ObjCImplementationDecl *> ToImplOrErr = 4555 import(From->getImplementation())) 4556 To->setImplementation(*ToImplOrErr); 4557 else 4558 return ToImplOrErr.takeError(); 4559 } 4560 4561 if (shouldForceImportDeclContext(Kind)) { 4562 // Import all of the members of this class. 4563 if (Error Err = ImportDeclContext(From, /*ForceImport=*/true)) 4564 return Err; 4565 } 4566 return Error::success(); 4567 } 4568 4569 Expected<ObjCTypeParamList *> 4570 ASTNodeImporter::ImportObjCTypeParamList(ObjCTypeParamList *list) { 4571 if (!list) 4572 return nullptr; 4573 4574 SmallVector<ObjCTypeParamDecl *, 4> toTypeParams; 4575 for (auto *fromTypeParam : *list) { 4576 if (auto toTypeParamOrErr = import(fromTypeParam)) 4577 toTypeParams.push_back(*toTypeParamOrErr); 4578 else 4579 return toTypeParamOrErr.takeError(); 4580 } 4581 4582 auto LAngleLocOrErr = import(list->getLAngleLoc()); 4583 if (!LAngleLocOrErr) 4584 return LAngleLocOrErr.takeError(); 4585 4586 auto RAngleLocOrErr = import(list->getRAngleLoc()); 4587 if (!RAngleLocOrErr) 4588 return RAngleLocOrErr.takeError(); 4589 4590 return ObjCTypeParamList::create(Importer.getToContext(), 4591 *LAngleLocOrErr, 4592 toTypeParams, 4593 *RAngleLocOrErr); 4594 } 4595 4596 ExpectedDecl ASTNodeImporter::VisitObjCInterfaceDecl(ObjCInterfaceDecl *D) { 4597 // If this class has a definition in the translation unit we're coming from, 4598 // but this particular declaration is not that definition, import the 4599 // definition and map to that. 4600 ObjCInterfaceDecl *Definition = D->getDefinition(); 4601 if (Definition && Definition != D) { 4602 if (ExpectedDecl ImportedDefOrErr = import(Definition)) 4603 return Importer.MapImported(D, *ImportedDefOrErr); 4604 else 4605 return ImportedDefOrErr.takeError(); 4606 } 4607 4608 // Import the major distinguishing characteristics of an @interface. 4609 DeclContext *DC, *LexicalDC; 4610 DeclarationName Name; 4611 SourceLocation Loc; 4612 NamedDecl *ToD; 4613 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 4614 return std::move(Err); 4615 if (ToD) 4616 return ToD; 4617 4618 // Look for an existing interface with the same name. 4619 ObjCInterfaceDecl *MergeWithIface = nullptr; 4620 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name); 4621 for (auto *FoundDecl : FoundDecls) { 4622 if (!FoundDecl->isInIdentifierNamespace(Decl::IDNS_Ordinary)) 4623 continue; 4624 4625 if ((MergeWithIface = dyn_cast<ObjCInterfaceDecl>(FoundDecl))) 4626 break; 4627 } 4628 4629 // Create an interface declaration, if one does not already exist. 4630 ObjCInterfaceDecl *ToIface = MergeWithIface; 4631 if (!ToIface) { 4632 ExpectedSLoc AtBeginLocOrErr = import(D->getAtStartLoc()); 4633 if (!AtBeginLocOrErr) 4634 return AtBeginLocOrErr.takeError(); 4635 4636 if (GetImportedOrCreateDecl( 4637 ToIface, D, Importer.getToContext(), DC, 4638 *AtBeginLocOrErr, Name.getAsIdentifierInfo(), 4639 /*TypeParamList=*/nullptr, 4640 /*PrevDecl=*/nullptr, Loc, D->isImplicitInterfaceDecl())) 4641 return ToIface; 4642 ToIface->setLexicalDeclContext(LexicalDC); 4643 LexicalDC->addDeclInternal(ToIface); 4644 } 4645 Importer.MapImported(D, ToIface); 4646 // Import the type parameter list after MapImported, to avoid 4647 // loops when bringing in their DeclContext. 4648 if (auto ToPListOrErr = 4649 ImportObjCTypeParamList(D->getTypeParamListAsWritten())) 4650 ToIface->setTypeParamList(*ToPListOrErr); 4651 else 4652 return ToPListOrErr.takeError(); 4653 4654 if (D->isThisDeclarationADefinition()) 4655 if (Error Err = ImportDefinition(D, ToIface)) 4656 return std::move(Err); 4657 4658 return ToIface; 4659 } 4660 4661 ExpectedDecl 4662 ASTNodeImporter::VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D) { 4663 ObjCCategoryDecl *Category; 4664 if (Error Err = importInto(Category, D->getCategoryDecl())) 4665 return std::move(Err); 4666 4667 ObjCCategoryImplDecl *ToImpl = Category->getImplementation(); 4668 if (!ToImpl) { 4669 DeclContext *DC, *LexicalDC; 4670 if (Error Err = ImportDeclContext(D, DC, LexicalDC)) 4671 return std::move(Err); 4672 4673 SourceLocation ToLocation, ToAtStartLoc, ToCategoryNameLoc; 4674 if (auto Imp = importSeq( 4675 D->getLocation(), D->getAtStartLoc(), D->getCategoryNameLoc())) 4676 std::tie(ToLocation, ToAtStartLoc, ToCategoryNameLoc) = *Imp; 4677 else 4678 return Imp.takeError(); 4679 4680 if (GetImportedOrCreateDecl( 4681 ToImpl, D, Importer.getToContext(), DC, 4682 Importer.Import(D->getIdentifier()), Category->getClassInterface(), 4683 ToLocation, ToAtStartLoc, ToCategoryNameLoc)) 4684 return ToImpl; 4685 4686 ToImpl->setLexicalDeclContext(LexicalDC); 4687 LexicalDC->addDeclInternal(ToImpl); 4688 Category->setImplementation(ToImpl); 4689 } 4690 4691 Importer.MapImported(D, ToImpl); 4692 if (Error Err = ImportDeclContext(D)) 4693 return std::move(Err); 4694 4695 return ToImpl; 4696 } 4697 4698 ExpectedDecl 4699 ASTNodeImporter::VisitObjCImplementationDecl(ObjCImplementationDecl *D) { 4700 // Find the corresponding interface. 4701 ObjCInterfaceDecl *Iface; 4702 if (Error Err = importInto(Iface, D->getClassInterface())) 4703 return std::move(Err); 4704 4705 // Import the superclass, if any. 4706 ObjCInterfaceDecl *Super; 4707 if (Error Err = importInto(Super, D->getSuperClass())) 4708 return std::move(Err); 4709 4710 ObjCImplementationDecl *Impl = Iface->getImplementation(); 4711 if (!Impl) { 4712 // We haven't imported an implementation yet. Create a new @implementation 4713 // now. 4714 DeclContext *DC, *LexicalDC; 4715 if (Error Err = ImportDeclContext(D, DC, LexicalDC)) 4716 return std::move(Err); 4717 4718 SourceLocation ToLocation, ToAtStartLoc, ToSuperClassLoc; 4719 SourceLocation ToIvarLBraceLoc, ToIvarRBraceLoc; 4720 if (auto Imp = importSeq( 4721 D->getLocation(), D->getAtStartLoc(), D->getSuperClassLoc(), 4722 D->getIvarLBraceLoc(), D->getIvarRBraceLoc())) 4723 std::tie( 4724 ToLocation, ToAtStartLoc, ToSuperClassLoc, 4725 ToIvarLBraceLoc, ToIvarRBraceLoc) = *Imp; 4726 else 4727 return Imp.takeError(); 4728 4729 if (GetImportedOrCreateDecl(Impl, D, Importer.getToContext(), 4730 DC, Iface, Super, 4731 ToLocation, 4732 ToAtStartLoc, 4733 ToSuperClassLoc, 4734 ToIvarLBraceLoc, 4735 ToIvarRBraceLoc)) 4736 return Impl; 4737 4738 Impl->setLexicalDeclContext(LexicalDC); 4739 4740 // Associate the implementation with the class it implements. 4741 Iface->setImplementation(Impl); 4742 Importer.MapImported(D, Iface->getImplementation()); 4743 } else { 4744 Importer.MapImported(D, Iface->getImplementation()); 4745 4746 // Verify that the existing @implementation has the same superclass. 4747 if ((Super && !Impl->getSuperClass()) || 4748 (!Super && Impl->getSuperClass()) || 4749 (Super && Impl->getSuperClass() && 4750 !declaresSameEntity(Super->getCanonicalDecl(), 4751 Impl->getSuperClass()))) { 4752 Importer.ToDiag(Impl->getLocation(), 4753 diag::warn_odr_objc_superclass_inconsistent) 4754 << Iface->getDeclName(); 4755 // FIXME: It would be nice to have the location of the superclass 4756 // below. 4757 if (Impl->getSuperClass()) 4758 Importer.ToDiag(Impl->getLocation(), 4759 diag::note_odr_objc_superclass) 4760 << Impl->getSuperClass()->getDeclName(); 4761 else 4762 Importer.ToDiag(Impl->getLocation(), 4763 diag::note_odr_objc_missing_superclass); 4764 if (D->getSuperClass()) 4765 Importer.FromDiag(D->getLocation(), 4766 diag::note_odr_objc_superclass) 4767 << D->getSuperClass()->getDeclName(); 4768 else 4769 Importer.FromDiag(D->getLocation(), 4770 diag::note_odr_objc_missing_superclass); 4771 4772 return make_error<ImportError>(ImportError::NameConflict); 4773 } 4774 } 4775 4776 // Import all of the members of this @implementation. 4777 if (Error Err = ImportDeclContext(D)) 4778 return std::move(Err); 4779 4780 return Impl; 4781 } 4782 4783 ExpectedDecl ASTNodeImporter::VisitObjCPropertyDecl(ObjCPropertyDecl *D) { 4784 // Import the major distinguishing characteristics of an @property. 4785 DeclContext *DC, *LexicalDC; 4786 DeclarationName Name; 4787 SourceLocation Loc; 4788 NamedDecl *ToD; 4789 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 4790 return std::move(Err); 4791 if (ToD) 4792 return ToD; 4793 4794 // Check whether we have already imported this property. 4795 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name); 4796 for (auto *FoundDecl : FoundDecls) { 4797 if (auto *FoundProp = dyn_cast<ObjCPropertyDecl>(FoundDecl)) { 4798 // Check property types. 4799 if (!Importer.IsStructurallyEquivalent(D->getType(), 4800 FoundProp->getType())) { 4801 Importer.ToDiag(Loc, diag::warn_odr_objc_property_type_inconsistent) 4802 << Name << D->getType() << FoundProp->getType(); 4803 Importer.ToDiag(FoundProp->getLocation(), diag::note_odr_value_here) 4804 << FoundProp->getType(); 4805 4806 return make_error<ImportError>(ImportError::NameConflict); 4807 } 4808 4809 // FIXME: Check property attributes, getters, setters, etc.? 4810 4811 // Consider these properties to be equivalent. 4812 Importer.MapImported(D, FoundProp); 4813 return FoundProp; 4814 } 4815 } 4816 4817 QualType ToType; 4818 TypeSourceInfo *ToTypeSourceInfo; 4819 SourceLocation ToAtLoc, ToLParenLoc; 4820 if (auto Imp = importSeq( 4821 D->getType(), D->getTypeSourceInfo(), D->getAtLoc(), D->getLParenLoc())) 4822 std::tie(ToType, ToTypeSourceInfo, ToAtLoc, ToLParenLoc) = *Imp; 4823 else 4824 return Imp.takeError(); 4825 4826 // Create the new property. 4827 ObjCPropertyDecl *ToProperty; 4828 if (GetImportedOrCreateDecl( 4829 ToProperty, D, Importer.getToContext(), DC, Loc, 4830 Name.getAsIdentifierInfo(), ToAtLoc, 4831 ToLParenLoc, ToType, 4832 ToTypeSourceInfo, D->getPropertyImplementation())) 4833 return ToProperty; 4834 4835 Selector ToGetterName, ToSetterName; 4836 SourceLocation ToGetterNameLoc, ToSetterNameLoc; 4837 ObjCMethodDecl *ToGetterMethodDecl, *ToSetterMethodDecl; 4838 ObjCIvarDecl *ToPropertyIvarDecl; 4839 if (auto Imp = importSeq( 4840 D->getGetterName(), D->getSetterName(), 4841 D->getGetterNameLoc(), D->getSetterNameLoc(), 4842 D->getGetterMethodDecl(), D->getSetterMethodDecl(), 4843 D->getPropertyIvarDecl())) 4844 std::tie( 4845 ToGetterName, ToSetterName, 4846 ToGetterNameLoc, ToSetterNameLoc, 4847 ToGetterMethodDecl, ToSetterMethodDecl, 4848 ToPropertyIvarDecl) = *Imp; 4849 else 4850 return Imp.takeError(); 4851 4852 ToProperty->setLexicalDeclContext(LexicalDC); 4853 LexicalDC->addDeclInternal(ToProperty); 4854 4855 ToProperty->setPropertyAttributes(D->getPropertyAttributes()); 4856 ToProperty->setPropertyAttributesAsWritten( 4857 D->getPropertyAttributesAsWritten()); 4858 ToProperty->setGetterName(ToGetterName, ToGetterNameLoc); 4859 ToProperty->setSetterName(ToSetterName, ToSetterNameLoc); 4860 ToProperty->setGetterMethodDecl(ToGetterMethodDecl); 4861 ToProperty->setSetterMethodDecl(ToSetterMethodDecl); 4862 ToProperty->setPropertyIvarDecl(ToPropertyIvarDecl); 4863 return ToProperty; 4864 } 4865 4866 ExpectedDecl 4867 ASTNodeImporter::VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D) { 4868 ObjCPropertyDecl *Property; 4869 if (Error Err = importInto(Property, D->getPropertyDecl())) 4870 return std::move(Err); 4871 4872 DeclContext *DC, *LexicalDC; 4873 if (Error Err = ImportDeclContext(D, DC, LexicalDC)) 4874 return std::move(Err); 4875 4876 auto *InImpl = cast<ObjCImplDecl>(LexicalDC); 4877 4878 // Import the ivar (for an @synthesize). 4879 ObjCIvarDecl *Ivar = nullptr; 4880 if (Error Err = importInto(Ivar, D->getPropertyIvarDecl())) 4881 return std::move(Err); 4882 4883 ObjCPropertyImplDecl *ToImpl 4884 = InImpl->FindPropertyImplDecl(Property->getIdentifier(), 4885 Property->getQueryKind()); 4886 if (!ToImpl) { 4887 SourceLocation ToBeginLoc, ToLocation, ToPropertyIvarDeclLoc; 4888 if (auto Imp = importSeq( 4889 D->getBeginLoc(), D->getLocation(), D->getPropertyIvarDeclLoc())) 4890 std::tie(ToBeginLoc, ToLocation, ToPropertyIvarDeclLoc) = *Imp; 4891 else 4892 return Imp.takeError(); 4893 4894 if (GetImportedOrCreateDecl(ToImpl, D, Importer.getToContext(), DC, 4895 ToBeginLoc, 4896 ToLocation, Property, 4897 D->getPropertyImplementation(), Ivar, 4898 ToPropertyIvarDeclLoc)) 4899 return ToImpl; 4900 4901 ToImpl->setLexicalDeclContext(LexicalDC); 4902 LexicalDC->addDeclInternal(ToImpl); 4903 } else { 4904 // Check that we have the same kind of property implementation (@synthesize 4905 // vs. @dynamic). 4906 if (D->getPropertyImplementation() != ToImpl->getPropertyImplementation()) { 4907 Importer.ToDiag(ToImpl->getLocation(), 4908 diag::warn_odr_objc_property_impl_kind_inconsistent) 4909 << Property->getDeclName() 4910 << (ToImpl->getPropertyImplementation() 4911 == ObjCPropertyImplDecl::Dynamic); 4912 Importer.FromDiag(D->getLocation(), 4913 diag::note_odr_objc_property_impl_kind) 4914 << D->getPropertyDecl()->getDeclName() 4915 << (D->getPropertyImplementation() == ObjCPropertyImplDecl::Dynamic); 4916 4917 return make_error<ImportError>(ImportError::NameConflict); 4918 } 4919 4920 // For @synthesize, check that we have the same 4921 if (D->getPropertyImplementation() == ObjCPropertyImplDecl::Synthesize && 4922 Ivar != ToImpl->getPropertyIvarDecl()) { 4923 Importer.ToDiag(ToImpl->getPropertyIvarDeclLoc(), 4924 diag::warn_odr_objc_synthesize_ivar_inconsistent) 4925 << Property->getDeclName() 4926 << ToImpl->getPropertyIvarDecl()->getDeclName() 4927 << Ivar->getDeclName(); 4928 Importer.FromDiag(D->getPropertyIvarDeclLoc(), 4929 diag::note_odr_objc_synthesize_ivar_here) 4930 << D->getPropertyIvarDecl()->getDeclName(); 4931 4932 return make_error<ImportError>(ImportError::NameConflict); 4933 } 4934 4935 // Merge the existing implementation with the new implementation. 4936 Importer.MapImported(D, ToImpl); 4937 } 4938 4939 return ToImpl; 4940 } 4941 4942 ExpectedDecl 4943 ASTNodeImporter::VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D) { 4944 // For template arguments, we adopt the translation unit as our declaration 4945 // context. This context will be fixed when the actual template declaration 4946 // is created. 4947 4948 // FIXME: Import default argument. 4949 4950 ExpectedSLoc BeginLocOrErr = import(D->getBeginLoc()); 4951 if (!BeginLocOrErr) 4952 return BeginLocOrErr.takeError(); 4953 4954 ExpectedSLoc LocationOrErr = import(D->getLocation()); 4955 if (!LocationOrErr) 4956 return LocationOrErr.takeError(); 4957 4958 TemplateTypeParmDecl *ToD = nullptr; 4959 (void)GetImportedOrCreateDecl( 4960 ToD, D, Importer.getToContext(), 4961 Importer.getToContext().getTranslationUnitDecl(), 4962 *BeginLocOrErr, *LocationOrErr, 4963 D->getDepth(), D->getIndex(), Importer.Import(D->getIdentifier()), 4964 D->wasDeclaredWithTypename(), D->isParameterPack()); 4965 return ToD; 4966 } 4967 4968 ExpectedDecl 4969 ASTNodeImporter::VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D) { 4970 DeclarationName ToDeclName; 4971 SourceLocation ToLocation, ToInnerLocStart; 4972 QualType ToType; 4973 TypeSourceInfo *ToTypeSourceInfo; 4974 if (auto Imp = importSeq( 4975 D->getDeclName(), D->getLocation(), D->getType(), D->getTypeSourceInfo(), 4976 D->getInnerLocStart())) 4977 std::tie( 4978 ToDeclName, ToLocation, ToType, ToTypeSourceInfo, 4979 ToInnerLocStart) = *Imp; 4980 else 4981 return Imp.takeError(); 4982 4983 // FIXME: Import default argument. 4984 4985 NonTypeTemplateParmDecl *ToD = nullptr; 4986 (void)GetImportedOrCreateDecl( 4987 ToD, D, Importer.getToContext(), 4988 Importer.getToContext().getTranslationUnitDecl(), 4989 ToInnerLocStart, ToLocation, D->getDepth(), 4990 D->getPosition(), ToDeclName.getAsIdentifierInfo(), ToType, 4991 D->isParameterPack(), ToTypeSourceInfo); 4992 return ToD; 4993 } 4994 4995 ExpectedDecl 4996 ASTNodeImporter::VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D) { 4997 // Import the name of this declaration. 4998 auto NameOrErr = import(D->getDeclName()); 4999 if (!NameOrErr) 5000 return NameOrErr.takeError(); 5001 5002 // Import the location of this declaration. 5003 ExpectedSLoc LocationOrErr = import(D->getLocation()); 5004 if (!LocationOrErr) 5005 return LocationOrErr.takeError(); 5006 5007 // Import template parameters. 5008 auto TemplateParamsOrErr = import(D->getTemplateParameters()); 5009 if (!TemplateParamsOrErr) 5010 return TemplateParamsOrErr.takeError(); 5011 5012 // FIXME: Import default argument. 5013 5014 TemplateTemplateParmDecl *ToD = nullptr; 5015 (void)GetImportedOrCreateDecl( 5016 ToD, D, Importer.getToContext(), 5017 Importer.getToContext().getTranslationUnitDecl(), *LocationOrErr, 5018 D->getDepth(), D->getPosition(), D->isParameterPack(), 5019 (*NameOrErr).getAsIdentifierInfo(), 5020 *TemplateParamsOrErr); 5021 return ToD; 5022 } 5023 5024 // Returns the definition for a (forward) declaration of a TemplateDecl, if 5025 // it has any definition in the redecl chain. 5026 template <typename T> static auto getTemplateDefinition(T *D) -> T * { 5027 assert(D->getTemplatedDecl() && "Should be called on templates only"); 5028 auto *ToTemplatedDef = D->getTemplatedDecl()->getDefinition(); 5029 if (!ToTemplatedDef) 5030 return nullptr; 5031 auto *TemplateWithDef = ToTemplatedDef->getDescribedTemplate(); 5032 return cast_or_null<T>(TemplateWithDef); 5033 } 5034 5035 ExpectedDecl ASTNodeImporter::VisitClassTemplateDecl(ClassTemplateDecl *D) { 5036 bool IsFriend = D->getFriendObjectKind() != Decl::FOK_None; 5037 5038 // Import the major distinguishing characteristics of this class template. 5039 DeclContext *DC, *LexicalDC; 5040 DeclarationName Name; 5041 SourceLocation Loc; 5042 NamedDecl *ToD; 5043 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 5044 return std::move(Err); 5045 if (ToD) 5046 return ToD; 5047 5048 ClassTemplateDecl *FoundByLookup = nullptr; 5049 5050 // We may already have a template of the same name; try to find and match it. 5051 if (!DC->isFunctionOrMethod()) { 5052 SmallVector<NamedDecl *, 4> ConflictingDecls; 5053 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name); 5054 for (auto *FoundDecl : FoundDecls) { 5055 if (!FoundDecl->isInIdentifierNamespace(Decl::IDNS_Ordinary | 5056 Decl::IDNS_TagFriend)) 5057 continue; 5058 5059 Decl *Found = FoundDecl; 5060 auto *FoundTemplate = dyn_cast<ClassTemplateDecl>(Found); 5061 if (FoundTemplate) { 5062 5063 if (IsStructuralMatch(D, FoundTemplate)) { 5064 ClassTemplateDecl *TemplateWithDef = 5065 getTemplateDefinition(FoundTemplate); 5066 if (D->isThisDeclarationADefinition() && TemplateWithDef) 5067 return Importer.MapImported(D, TemplateWithDef); 5068 if (!FoundByLookup) 5069 FoundByLookup = FoundTemplate; 5070 // Search in all matches because there may be multiple decl chains, 5071 // see ASTTests test ImportExistingFriendClassTemplateDef. 5072 continue; 5073 } 5074 ConflictingDecls.push_back(FoundDecl); 5075 } 5076 } 5077 5078 if (!ConflictingDecls.empty()) { 5079 ExpectedName NameOrErr = Importer.HandleNameConflict( 5080 Name, DC, Decl::IDNS_Ordinary, ConflictingDecls.data(), 5081 ConflictingDecls.size()); 5082 if (NameOrErr) 5083 Name = NameOrErr.get(); 5084 else 5085 return NameOrErr.takeError(); 5086 } 5087 } 5088 5089 CXXRecordDecl *FromTemplated = D->getTemplatedDecl(); 5090 5091 // Create the declaration that is being templated. 5092 CXXRecordDecl *ToTemplated; 5093 if (Error Err = importInto(ToTemplated, FromTemplated)) 5094 return std::move(Err); 5095 5096 // Create the class template declaration itself. 5097 auto TemplateParamsOrErr = import(D->getTemplateParameters()); 5098 if (!TemplateParamsOrErr) 5099 return TemplateParamsOrErr.takeError(); 5100 5101 ClassTemplateDecl *D2; 5102 if (GetImportedOrCreateDecl(D2, D, Importer.getToContext(), DC, Loc, Name, 5103 *TemplateParamsOrErr, ToTemplated)) 5104 return D2; 5105 5106 ToTemplated->setDescribedClassTemplate(D2); 5107 5108 D2->setAccess(D->getAccess()); 5109 D2->setLexicalDeclContext(LexicalDC); 5110 5111 if (D->getDeclContext()->containsDeclAndLoad(D)) 5112 DC->addDeclInternal(D2); 5113 if (DC != LexicalDC && D->getLexicalDeclContext()->containsDeclAndLoad(D)) 5114 LexicalDC->addDeclInternal(D2); 5115 5116 if (FoundByLookup) { 5117 auto *Recent = 5118 const_cast<ClassTemplateDecl *>(FoundByLookup->getMostRecentDecl()); 5119 5120 // It is possible that during the import of the class template definition 5121 // we start the import of a fwd friend decl of the very same class template 5122 // and we add the fwd friend decl to the lookup table. But the ToTemplated 5123 // had been created earlier and by that time the lookup could not find 5124 // anything existing, so it has no previous decl. Later, (still during the 5125 // import of the fwd friend decl) we start to import the definition again 5126 // and this time the lookup finds the previous fwd friend class template. 5127 // In this case we must set up the previous decl for the templated decl. 5128 if (!ToTemplated->getPreviousDecl()) { 5129 assert(FoundByLookup->getTemplatedDecl() && 5130 "Found decl must have its templated decl set"); 5131 CXXRecordDecl *PrevTemplated = 5132 FoundByLookup->getTemplatedDecl()->getMostRecentDecl(); 5133 if (ToTemplated != PrevTemplated) 5134 ToTemplated->setPreviousDecl(PrevTemplated); 5135 } 5136 5137 D2->setPreviousDecl(Recent); 5138 } 5139 5140 if (LexicalDC != DC && IsFriend) 5141 DC->makeDeclVisibleInContext(D2); 5142 5143 if (FromTemplated->isCompleteDefinition() && 5144 !ToTemplated->isCompleteDefinition()) { 5145 // FIXME: Import definition! 5146 } 5147 5148 return D2; 5149 } 5150 5151 ExpectedDecl ASTNodeImporter::VisitClassTemplateSpecializationDecl( 5152 ClassTemplateSpecializationDecl *D) { 5153 ClassTemplateDecl *ClassTemplate; 5154 if (Error Err = importInto(ClassTemplate, D->getSpecializedTemplate())) 5155 return std::move(Err); 5156 5157 // Import the context of this declaration. 5158 DeclContext *DC, *LexicalDC; 5159 if (Error Err = ImportDeclContext(D, DC, LexicalDC)) 5160 return std::move(Err); 5161 5162 // Import template arguments. 5163 SmallVector<TemplateArgument, 2> TemplateArgs; 5164 if (Error Err = ImportTemplateArguments( 5165 D->getTemplateArgs().data(), D->getTemplateArgs().size(), TemplateArgs)) 5166 return std::move(Err); 5167 5168 // Try to find an existing specialization with these template arguments. 5169 void *InsertPos = nullptr; 5170 ClassTemplateSpecializationDecl *PrevDecl = nullptr; 5171 ClassTemplatePartialSpecializationDecl *PartialSpec = 5172 dyn_cast<ClassTemplatePartialSpecializationDecl>(D); 5173 if (PartialSpec) 5174 PrevDecl = 5175 ClassTemplate->findPartialSpecialization(TemplateArgs, InsertPos); 5176 else 5177 PrevDecl = ClassTemplate->findSpecialization(TemplateArgs, InsertPos); 5178 5179 if (PrevDecl) { 5180 if (IsStructuralMatch(D, PrevDecl)) { 5181 if (D->isThisDeclarationADefinition() && PrevDecl->getDefinition()) { 5182 Importer.MapImported(D, PrevDecl->getDefinition()); 5183 // Import those default field initializers which have been 5184 // instantiated in the "From" context, but not in the "To" context. 5185 for (auto *FromField : D->fields()) { 5186 auto ToOrErr = import(FromField); 5187 if (!ToOrErr) 5188 return ToOrErr.takeError(); 5189 } 5190 5191 // Import those methods which have been instantiated in the 5192 // "From" context, but not in the "To" context. 5193 for (CXXMethodDecl *FromM : D->methods()) { 5194 auto ToOrErr = import(FromM); 5195 if (!ToOrErr) 5196 return ToOrErr.takeError(); 5197 } 5198 5199 // TODO Import instantiated default arguments. 5200 // TODO Import instantiated exception specifications. 5201 // 5202 // Generally, ASTCommon.h/DeclUpdateKind enum gives a very good hint 5203 // what else could be fused during an AST merge. 5204 return PrevDecl; 5205 } 5206 } else { // ODR violation. 5207 // FIXME HandleNameConflict 5208 return make_error<ImportError>(ImportError::NameConflict); 5209 } 5210 } 5211 5212 // Import the location of this declaration. 5213 ExpectedSLoc BeginLocOrErr = import(D->getBeginLoc()); 5214 if (!BeginLocOrErr) 5215 return BeginLocOrErr.takeError(); 5216 ExpectedSLoc IdLocOrErr = import(D->getLocation()); 5217 if (!IdLocOrErr) 5218 return IdLocOrErr.takeError(); 5219 5220 // Create the specialization. 5221 ClassTemplateSpecializationDecl *D2 = nullptr; 5222 if (PartialSpec) { 5223 // Import TemplateArgumentListInfo. 5224 TemplateArgumentListInfo ToTAInfo; 5225 const auto &ASTTemplateArgs = *PartialSpec->getTemplateArgsAsWritten(); 5226 if (Error Err = ImportTemplateArgumentListInfo(ASTTemplateArgs, ToTAInfo)) 5227 return std::move(Err); 5228 5229 QualType CanonInjType; 5230 if (Error Err = importInto( 5231 CanonInjType, PartialSpec->getInjectedSpecializationType())) 5232 return std::move(Err); 5233 CanonInjType = CanonInjType.getCanonicalType(); 5234 5235 auto ToTPListOrErr = import(PartialSpec->getTemplateParameters()); 5236 if (!ToTPListOrErr) 5237 return ToTPListOrErr.takeError(); 5238 5239 if (GetImportedOrCreateDecl<ClassTemplatePartialSpecializationDecl>( 5240 D2, D, Importer.getToContext(), D->getTagKind(), DC, 5241 *BeginLocOrErr, *IdLocOrErr, *ToTPListOrErr, ClassTemplate, 5242 llvm::makeArrayRef(TemplateArgs.data(), TemplateArgs.size()), 5243 ToTAInfo, CanonInjType, 5244 cast_or_null<ClassTemplatePartialSpecializationDecl>(PrevDecl))) 5245 return D2; 5246 5247 // Update InsertPos, because preceding import calls may have invalidated 5248 // it by adding new specializations. 5249 if (!ClassTemplate->findPartialSpecialization(TemplateArgs, InsertPos)) 5250 // Add this partial specialization to the class template. 5251 ClassTemplate->AddPartialSpecialization( 5252 cast<ClassTemplatePartialSpecializationDecl>(D2), InsertPos); 5253 5254 } else { // Not a partial specialization. 5255 if (GetImportedOrCreateDecl( 5256 D2, D, Importer.getToContext(), D->getTagKind(), DC, 5257 *BeginLocOrErr, *IdLocOrErr, ClassTemplate, TemplateArgs, 5258 PrevDecl)) 5259 return D2; 5260 5261 // Update InsertPos, because preceding import calls may have invalidated 5262 // it by adding new specializations. 5263 if (!ClassTemplate->findSpecialization(TemplateArgs, InsertPos)) 5264 // Add this specialization to the class template. 5265 ClassTemplate->AddSpecialization(D2, InsertPos); 5266 } 5267 5268 D2->setSpecializationKind(D->getSpecializationKind()); 5269 5270 // Set the context of this specialization/instantiation. 5271 D2->setLexicalDeclContext(LexicalDC); 5272 5273 // Add to the DC only if it was an explicit specialization/instantiation. 5274 if (D2->isExplicitInstantiationOrSpecialization()) { 5275 LexicalDC->addDeclInternal(D2); 5276 } 5277 5278 // Import the qualifier, if any. 5279 if (auto LocOrErr = import(D->getQualifierLoc())) 5280 D2->setQualifierInfo(*LocOrErr); 5281 else 5282 return LocOrErr.takeError(); 5283 5284 if (auto *TSI = D->getTypeAsWritten()) { 5285 if (auto TInfoOrErr = import(TSI)) 5286 D2->setTypeAsWritten(*TInfoOrErr); 5287 else 5288 return TInfoOrErr.takeError(); 5289 5290 if (auto LocOrErr = import(D->getTemplateKeywordLoc())) 5291 D2->setTemplateKeywordLoc(*LocOrErr); 5292 else 5293 return LocOrErr.takeError(); 5294 5295 if (auto LocOrErr = import(D->getExternLoc())) 5296 D2->setExternLoc(*LocOrErr); 5297 else 5298 return LocOrErr.takeError(); 5299 } 5300 5301 if (D->getPointOfInstantiation().isValid()) { 5302 if (auto POIOrErr = import(D->getPointOfInstantiation())) 5303 D2->setPointOfInstantiation(*POIOrErr); 5304 else 5305 return POIOrErr.takeError(); 5306 } 5307 5308 D2->setTemplateSpecializationKind(D->getTemplateSpecializationKind()); 5309 5310 if (D->isCompleteDefinition()) 5311 if (Error Err = ImportDefinition(D, D2)) 5312 return std::move(Err); 5313 5314 return D2; 5315 } 5316 5317 ExpectedDecl ASTNodeImporter::VisitVarTemplateDecl(VarTemplateDecl *D) { 5318 // If this variable has a definition in the translation unit we're coming 5319 // from, 5320 // but this particular declaration is not that definition, import the 5321 // definition and map to that. 5322 auto *Definition = 5323 cast_or_null<VarDecl>(D->getTemplatedDecl()->getDefinition()); 5324 if (Definition && Definition != D->getTemplatedDecl()) { 5325 if (ExpectedDecl ImportedDefOrErr = import( 5326 Definition->getDescribedVarTemplate())) 5327 return Importer.MapImported(D, *ImportedDefOrErr); 5328 else 5329 return ImportedDefOrErr.takeError(); 5330 } 5331 5332 // Import the major distinguishing characteristics of this variable template. 5333 DeclContext *DC, *LexicalDC; 5334 DeclarationName Name; 5335 SourceLocation Loc; 5336 NamedDecl *ToD; 5337 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 5338 return std::move(Err); 5339 if (ToD) 5340 return ToD; 5341 5342 // We may already have a template of the same name; try to find and match it. 5343 assert(!DC->isFunctionOrMethod() && 5344 "Variable templates cannot be declared at function scope"); 5345 SmallVector<NamedDecl *, 4> ConflictingDecls; 5346 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name); 5347 for (auto *FoundDecl : FoundDecls) { 5348 if (!FoundDecl->isInIdentifierNamespace(Decl::IDNS_Ordinary)) 5349 continue; 5350 5351 Decl *Found = FoundDecl; 5352 if (VarTemplateDecl *FoundTemplate = dyn_cast<VarTemplateDecl>(Found)) { 5353 if (IsStructuralMatch(D, FoundTemplate)) { 5354 // The variable templates structurally match; call it the same template. 5355 Importer.MapImported(D->getTemplatedDecl(), 5356 FoundTemplate->getTemplatedDecl()); 5357 return Importer.MapImported(D, FoundTemplate); 5358 } 5359 ConflictingDecls.push_back(FoundDecl); 5360 } 5361 } 5362 5363 if (!ConflictingDecls.empty()) { 5364 ExpectedName NameOrErr = Importer.HandleNameConflict( 5365 Name, DC, Decl::IDNS_Ordinary, ConflictingDecls.data(), 5366 ConflictingDecls.size()); 5367 if (NameOrErr) 5368 Name = NameOrErr.get(); 5369 else 5370 return NameOrErr.takeError(); 5371 } 5372 5373 VarDecl *DTemplated = D->getTemplatedDecl(); 5374 5375 // Import the type. 5376 // FIXME: Value not used? 5377 ExpectedType TypeOrErr = import(DTemplated->getType()); 5378 if (!TypeOrErr) 5379 return TypeOrErr.takeError(); 5380 5381 // Create the declaration that is being templated. 5382 VarDecl *ToTemplated; 5383 if (Error Err = importInto(ToTemplated, DTemplated)) 5384 return std::move(Err); 5385 5386 // Create the variable template declaration itself. 5387 auto TemplateParamsOrErr = import(D->getTemplateParameters()); 5388 if (!TemplateParamsOrErr) 5389 return TemplateParamsOrErr.takeError(); 5390 5391 VarTemplateDecl *ToVarTD; 5392 if (GetImportedOrCreateDecl(ToVarTD, D, Importer.getToContext(), DC, Loc, 5393 Name, *TemplateParamsOrErr, ToTemplated)) 5394 return ToVarTD; 5395 5396 ToTemplated->setDescribedVarTemplate(ToVarTD); 5397 5398 ToVarTD->setAccess(D->getAccess()); 5399 ToVarTD->setLexicalDeclContext(LexicalDC); 5400 LexicalDC->addDeclInternal(ToVarTD); 5401 5402 if (DTemplated->isThisDeclarationADefinition() && 5403 !ToTemplated->isThisDeclarationADefinition()) { 5404 // FIXME: Import definition! 5405 } 5406 5407 return ToVarTD; 5408 } 5409 5410 ExpectedDecl ASTNodeImporter::VisitVarTemplateSpecializationDecl( 5411 VarTemplateSpecializationDecl *D) { 5412 // If this record has a definition in the translation unit we're coming from, 5413 // but this particular declaration is not that definition, import the 5414 // definition and map to that. 5415 VarDecl *Definition = D->getDefinition(); 5416 if (Definition && Definition != D) { 5417 if (ExpectedDecl ImportedDefOrErr = import(Definition)) 5418 return Importer.MapImported(D, *ImportedDefOrErr); 5419 else 5420 return ImportedDefOrErr.takeError(); 5421 } 5422 5423 VarTemplateDecl *VarTemplate = nullptr; 5424 if (Error Err = importInto(VarTemplate, D->getSpecializedTemplate())) 5425 return std::move(Err); 5426 5427 // Import the context of this declaration. 5428 DeclContext *DC, *LexicalDC; 5429 if (Error Err = ImportDeclContext(D, DC, LexicalDC)) 5430 return std::move(Err); 5431 5432 // Import the location of this declaration. 5433 ExpectedSLoc BeginLocOrErr = import(D->getBeginLoc()); 5434 if (!BeginLocOrErr) 5435 return BeginLocOrErr.takeError(); 5436 5437 auto IdLocOrErr = import(D->getLocation()); 5438 if (!IdLocOrErr) 5439 return IdLocOrErr.takeError(); 5440 5441 // Import template arguments. 5442 SmallVector<TemplateArgument, 2> TemplateArgs; 5443 if (Error Err = ImportTemplateArguments( 5444 D->getTemplateArgs().data(), D->getTemplateArgs().size(), TemplateArgs)) 5445 return std::move(Err); 5446 5447 // Try to find an existing specialization with these template arguments. 5448 void *InsertPos = nullptr; 5449 VarTemplateSpecializationDecl *D2 = VarTemplate->findSpecialization( 5450 TemplateArgs, InsertPos); 5451 if (D2) { 5452 // We already have a variable template specialization with these template 5453 // arguments. 5454 5455 // FIXME: Check for specialization vs. instantiation errors. 5456 5457 if (VarDecl *FoundDef = D2->getDefinition()) { 5458 if (!D->isThisDeclarationADefinition() || 5459 IsStructuralMatch(D, FoundDef)) { 5460 // The record types structurally match, or the "from" translation 5461 // unit only had a forward declaration anyway; call it the same 5462 // variable. 5463 return Importer.MapImported(D, FoundDef); 5464 } 5465 } 5466 } else { 5467 // Import the type. 5468 QualType T; 5469 if (Error Err = importInto(T, D->getType())) 5470 return std::move(Err); 5471 5472 auto TInfoOrErr = import(D->getTypeSourceInfo()); 5473 if (!TInfoOrErr) 5474 return TInfoOrErr.takeError(); 5475 5476 TemplateArgumentListInfo ToTAInfo; 5477 if (Error Err = ImportTemplateArgumentListInfo( 5478 D->getTemplateArgsInfo(), ToTAInfo)) 5479 return std::move(Err); 5480 5481 using PartVarSpecDecl = VarTemplatePartialSpecializationDecl; 5482 // Create a new specialization. 5483 if (auto *FromPartial = dyn_cast<PartVarSpecDecl>(D)) { 5484 // Import TemplateArgumentListInfo 5485 TemplateArgumentListInfo ArgInfos; 5486 const auto *FromTAArgsAsWritten = FromPartial->getTemplateArgsAsWritten(); 5487 // NOTE: FromTAArgsAsWritten and template parameter list are non-null. 5488 if (Error Err = ImportTemplateArgumentListInfo( 5489 *FromTAArgsAsWritten, ArgInfos)) 5490 return std::move(Err); 5491 5492 auto ToTPListOrErr = import(FromPartial->getTemplateParameters()); 5493 if (!ToTPListOrErr) 5494 return ToTPListOrErr.takeError(); 5495 5496 PartVarSpecDecl *ToPartial; 5497 if (GetImportedOrCreateDecl(ToPartial, D, Importer.getToContext(), DC, 5498 *BeginLocOrErr, *IdLocOrErr, *ToTPListOrErr, 5499 VarTemplate, T, *TInfoOrErr, 5500 D->getStorageClass(), TemplateArgs, ArgInfos)) 5501 return ToPartial; 5502 5503 if (Expected<PartVarSpecDecl *> ToInstOrErr = import( 5504 FromPartial->getInstantiatedFromMember())) 5505 ToPartial->setInstantiatedFromMember(*ToInstOrErr); 5506 else 5507 return ToInstOrErr.takeError(); 5508 5509 if (FromPartial->isMemberSpecialization()) 5510 ToPartial->setMemberSpecialization(); 5511 5512 D2 = ToPartial; 5513 5514 } else { // Full specialization 5515 if (GetImportedOrCreateDecl(D2, D, Importer.getToContext(), DC, 5516 *BeginLocOrErr, *IdLocOrErr, VarTemplate, 5517 T, *TInfoOrErr, 5518 D->getStorageClass(), TemplateArgs)) 5519 return D2; 5520 } 5521 5522 if (D->getPointOfInstantiation().isValid()) { 5523 if (ExpectedSLoc POIOrErr = import(D->getPointOfInstantiation())) 5524 D2->setPointOfInstantiation(*POIOrErr); 5525 else 5526 return POIOrErr.takeError(); 5527 } 5528 5529 D2->setSpecializationKind(D->getSpecializationKind()); 5530 D2->setTemplateArgsInfo(ToTAInfo); 5531 5532 // Add this specialization to the class template. 5533 VarTemplate->AddSpecialization(D2, InsertPos); 5534 5535 // Import the qualifier, if any. 5536 if (auto LocOrErr = import(D->getQualifierLoc())) 5537 D2->setQualifierInfo(*LocOrErr); 5538 else 5539 return LocOrErr.takeError(); 5540 5541 if (D->isConstexpr()) 5542 D2->setConstexpr(true); 5543 5544 // Add the specialization to this context. 5545 D2->setLexicalDeclContext(LexicalDC); 5546 LexicalDC->addDeclInternal(D2); 5547 5548 D2->setAccess(D->getAccess()); 5549 } 5550 5551 if (Error Err = ImportInitializer(D, D2)) 5552 return std::move(Err); 5553 5554 return D2; 5555 } 5556 5557 ExpectedDecl 5558 ASTNodeImporter::VisitFunctionTemplateDecl(FunctionTemplateDecl *D) { 5559 DeclContext *DC, *LexicalDC; 5560 DeclarationName Name; 5561 SourceLocation Loc; 5562 NamedDecl *ToD; 5563 5564 if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 5565 return std::move(Err); 5566 5567 if (ToD) 5568 return ToD; 5569 5570 const FunctionTemplateDecl *FoundByLookup = nullptr; 5571 5572 // Try to find a function in our own ("to") context with the same name, same 5573 // type, and in the same context as the function we're importing. 5574 // FIXME Split this into a separate function. 5575 if (!LexicalDC->isFunctionOrMethod()) { 5576 unsigned IDNS = Decl::IDNS_Ordinary | Decl::IDNS_OrdinaryFriend; 5577 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name); 5578 for (auto *FoundDecl : FoundDecls) { 5579 if (!FoundDecl->isInIdentifierNamespace(IDNS)) 5580 continue; 5581 5582 if (auto *FoundTemplate = dyn_cast<FunctionTemplateDecl>(FoundDecl)) { 5583 if (!hasSameVisibilityContext(FoundTemplate, D)) 5584 continue; 5585 if (IsStructuralMatch(D, FoundTemplate)) { 5586 FunctionTemplateDecl *TemplateWithDef = 5587 getTemplateDefinition(FoundTemplate); 5588 if (D->isThisDeclarationADefinition() && TemplateWithDef) 5589 return Importer.MapImported(D, TemplateWithDef); 5590 5591 FoundByLookup = FoundTemplate; 5592 break; 5593 // TODO: handle conflicting names 5594 } 5595 } 5596 } 5597 } 5598 5599 auto ParamsOrErr = import(D->getTemplateParameters()); 5600 if (!ParamsOrErr) 5601 return ParamsOrErr.takeError(); 5602 5603 FunctionDecl *TemplatedFD; 5604 if (Error Err = importInto(TemplatedFD, D->getTemplatedDecl())) 5605 return std::move(Err); 5606 5607 FunctionTemplateDecl *ToFunc; 5608 if (GetImportedOrCreateDecl(ToFunc, D, Importer.getToContext(), DC, Loc, Name, 5609 *ParamsOrErr, TemplatedFD)) 5610 return ToFunc; 5611 5612 TemplatedFD->setDescribedFunctionTemplate(ToFunc); 5613 5614 ToFunc->setAccess(D->getAccess()); 5615 ToFunc->setLexicalDeclContext(LexicalDC); 5616 LexicalDC->addDeclInternal(ToFunc); 5617 5618 if (FoundByLookup) { 5619 auto *Recent = 5620 const_cast<FunctionTemplateDecl *>(FoundByLookup->getMostRecentDecl()); 5621 if (!TemplatedFD->getPreviousDecl()) { 5622 assert(FoundByLookup->getTemplatedDecl() && 5623 "Found decl must have its templated decl set"); 5624 auto *PrevTemplated = 5625 FoundByLookup->getTemplatedDecl()->getMostRecentDecl(); 5626 if (TemplatedFD != PrevTemplated) 5627 TemplatedFD->setPreviousDecl(PrevTemplated); 5628 } 5629 ToFunc->setPreviousDecl(Recent); 5630 } 5631 5632 return ToFunc; 5633 } 5634 5635 //---------------------------------------------------------------------------- 5636 // Import Statements 5637 //---------------------------------------------------------------------------- 5638 5639 ExpectedStmt ASTNodeImporter::VisitStmt(Stmt *S) { 5640 Importer.FromDiag(S->getBeginLoc(), diag::err_unsupported_ast_node) 5641 << S->getStmtClassName(); 5642 return make_error<ImportError>(ImportError::UnsupportedConstruct); 5643 } 5644 5645 5646 ExpectedStmt ASTNodeImporter::VisitGCCAsmStmt(GCCAsmStmt *S) { 5647 if (Importer.returnWithErrorInTest()) 5648 return make_error<ImportError>(ImportError::UnsupportedConstruct); 5649 SmallVector<IdentifierInfo *, 4> Names; 5650 for (unsigned I = 0, E = S->getNumOutputs(); I != E; I++) { 5651 IdentifierInfo *ToII = Importer.Import(S->getOutputIdentifier(I)); 5652 // ToII is nullptr when no symbolic name is given for output operand 5653 // see ParseStmtAsm::ParseAsmOperandsOpt 5654 Names.push_back(ToII); 5655 } 5656 5657 for (unsigned I = 0, E = S->getNumInputs(); I != E; I++) { 5658 IdentifierInfo *ToII = Importer.Import(S->getInputIdentifier(I)); 5659 // ToII is nullptr when no symbolic name is given for input operand 5660 // see ParseStmtAsm::ParseAsmOperandsOpt 5661 Names.push_back(ToII); 5662 } 5663 5664 SmallVector<StringLiteral *, 4> Clobbers; 5665 for (unsigned I = 0, E = S->getNumClobbers(); I != E; I++) { 5666 if (auto ClobberOrErr = import(S->getClobberStringLiteral(I))) 5667 Clobbers.push_back(*ClobberOrErr); 5668 else 5669 return ClobberOrErr.takeError(); 5670 5671 } 5672 5673 SmallVector<StringLiteral *, 4> Constraints; 5674 for (unsigned I = 0, E = S->getNumOutputs(); I != E; I++) { 5675 if (auto OutputOrErr = import(S->getOutputConstraintLiteral(I))) 5676 Constraints.push_back(*OutputOrErr); 5677 else 5678 return OutputOrErr.takeError(); 5679 } 5680 5681 for (unsigned I = 0, E = S->getNumInputs(); I != E; I++) { 5682 if (auto InputOrErr = import(S->getInputConstraintLiteral(I))) 5683 Constraints.push_back(*InputOrErr); 5684 else 5685 return InputOrErr.takeError(); 5686 } 5687 5688 SmallVector<Expr *, 4> Exprs(S->getNumOutputs() + S->getNumInputs() + 5689 S->getNumLabels()); 5690 if (Error Err = ImportContainerChecked(S->outputs(), Exprs)) 5691 return std::move(Err); 5692 5693 if (Error Err = 5694 ImportArrayChecked(S->inputs(), Exprs.begin() + S->getNumOutputs())) 5695 return std::move(Err); 5696 5697 if (Error Err = ImportArrayChecked( 5698 S->labels(), Exprs.begin() + S->getNumOutputs() + S->getNumInputs())) 5699 return std::move(Err); 5700 5701 ExpectedSLoc AsmLocOrErr = import(S->getAsmLoc()); 5702 if (!AsmLocOrErr) 5703 return AsmLocOrErr.takeError(); 5704 auto AsmStrOrErr = import(S->getAsmString()); 5705 if (!AsmStrOrErr) 5706 return AsmStrOrErr.takeError(); 5707 ExpectedSLoc RParenLocOrErr = import(S->getRParenLoc()); 5708 if (!RParenLocOrErr) 5709 return RParenLocOrErr.takeError(); 5710 5711 return new (Importer.getToContext()) GCCAsmStmt( 5712 Importer.getToContext(), 5713 *AsmLocOrErr, 5714 S->isSimple(), 5715 S->isVolatile(), 5716 S->getNumOutputs(), 5717 S->getNumInputs(), 5718 Names.data(), 5719 Constraints.data(), 5720 Exprs.data(), 5721 *AsmStrOrErr, 5722 S->getNumClobbers(), 5723 Clobbers.data(), 5724 S->getNumLabels(), 5725 *RParenLocOrErr); 5726 } 5727 5728 ExpectedStmt ASTNodeImporter::VisitDeclStmt(DeclStmt *S) { 5729 auto Imp = importSeq(S->getDeclGroup(), S->getBeginLoc(), S->getEndLoc()); 5730 if (!Imp) 5731 return Imp.takeError(); 5732 5733 DeclGroupRef ToDG; 5734 SourceLocation ToBeginLoc, ToEndLoc; 5735 std::tie(ToDG, ToBeginLoc, ToEndLoc) = *Imp; 5736 5737 return new (Importer.getToContext()) DeclStmt(ToDG, ToBeginLoc, ToEndLoc); 5738 } 5739 5740 ExpectedStmt ASTNodeImporter::VisitNullStmt(NullStmt *S) { 5741 ExpectedSLoc ToSemiLocOrErr = import(S->getSemiLoc()); 5742 if (!ToSemiLocOrErr) 5743 return ToSemiLocOrErr.takeError(); 5744 return new (Importer.getToContext()) NullStmt( 5745 *ToSemiLocOrErr, S->hasLeadingEmptyMacro()); 5746 } 5747 5748 ExpectedStmt ASTNodeImporter::VisitCompoundStmt(CompoundStmt *S) { 5749 SmallVector<Stmt *, 8> ToStmts(S->size()); 5750 5751 if (Error Err = ImportContainerChecked(S->body(), ToStmts)) 5752 return std::move(Err); 5753 5754 ExpectedSLoc ToLBracLocOrErr = import(S->getLBracLoc()); 5755 if (!ToLBracLocOrErr) 5756 return ToLBracLocOrErr.takeError(); 5757 5758 ExpectedSLoc ToRBracLocOrErr = import(S->getRBracLoc()); 5759 if (!ToRBracLocOrErr) 5760 return ToRBracLocOrErr.takeError(); 5761 5762 return CompoundStmt::Create( 5763 Importer.getToContext(), ToStmts, 5764 *ToLBracLocOrErr, *ToRBracLocOrErr); 5765 } 5766 5767 ExpectedStmt ASTNodeImporter::VisitCaseStmt(CaseStmt *S) { 5768 auto Imp = importSeq( 5769 S->getLHS(), S->getRHS(), S->getSubStmt(), S->getCaseLoc(), 5770 S->getEllipsisLoc(), S->getColonLoc()); 5771 if (!Imp) 5772 return Imp.takeError(); 5773 5774 Expr *ToLHS, *ToRHS; 5775 Stmt *ToSubStmt; 5776 SourceLocation ToCaseLoc, ToEllipsisLoc, ToColonLoc; 5777 std::tie(ToLHS, ToRHS, ToSubStmt, ToCaseLoc, ToEllipsisLoc, ToColonLoc) = 5778 *Imp; 5779 5780 auto *ToStmt = CaseStmt::Create(Importer.getToContext(), ToLHS, ToRHS, 5781 ToCaseLoc, ToEllipsisLoc, ToColonLoc); 5782 ToStmt->setSubStmt(ToSubStmt); 5783 5784 return ToStmt; 5785 } 5786 5787 ExpectedStmt ASTNodeImporter::VisitDefaultStmt(DefaultStmt *S) { 5788 auto Imp = importSeq(S->getDefaultLoc(), S->getColonLoc(), S->getSubStmt()); 5789 if (!Imp) 5790 return Imp.takeError(); 5791 5792 SourceLocation ToDefaultLoc, ToColonLoc; 5793 Stmt *ToSubStmt; 5794 std::tie(ToDefaultLoc, ToColonLoc, ToSubStmt) = *Imp; 5795 5796 return new (Importer.getToContext()) DefaultStmt( 5797 ToDefaultLoc, ToColonLoc, ToSubStmt); 5798 } 5799 5800 ExpectedStmt ASTNodeImporter::VisitLabelStmt(LabelStmt *S) { 5801 auto Imp = importSeq(S->getIdentLoc(), S->getDecl(), S->getSubStmt()); 5802 if (!Imp) 5803 return Imp.takeError(); 5804 5805 SourceLocation ToIdentLoc; 5806 LabelDecl *ToLabelDecl; 5807 Stmt *ToSubStmt; 5808 std::tie(ToIdentLoc, ToLabelDecl, ToSubStmt) = *Imp; 5809 5810 return new (Importer.getToContext()) LabelStmt( 5811 ToIdentLoc, ToLabelDecl, ToSubStmt); 5812 } 5813 5814 ExpectedStmt ASTNodeImporter::VisitAttributedStmt(AttributedStmt *S) { 5815 ExpectedSLoc ToAttrLocOrErr = import(S->getAttrLoc()); 5816 if (!ToAttrLocOrErr) 5817 return ToAttrLocOrErr.takeError(); 5818 ArrayRef<const Attr*> FromAttrs(S->getAttrs()); 5819 SmallVector<const Attr *, 1> ToAttrs(FromAttrs.size()); 5820 if (Error Err = ImportContainerChecked(FromAttrs, ToAttrs)) 5821 return std::move(Err); 5822 ExpectedStmt ToSubStmtOrErr = import(S->getSubStmt()); 5823 if (!ToSubStmtOrErr) 5824 return ToSubStmtOrErr.takeError(); 5825 5826 return AttributedStmt::Create( 5827 Importer.getToContext(), *ToAttrLocOrErr, ToAttrs, *ToSubStmtOrErr); 5828 } 5829 5830 ExpectedStmt ASTNodeImporter::VisitIfStmt(IfStmt *S) { 5831 auto Imp = importSeq( 5832 S->getIfLoc(), S->getInit(), S->getConditionVariable(), S->getCond(), 5833 S->getThen(), S->getElseLoc(), S->getElse()); 5834 if (!Imp) 5835 return Imp.takeError(); 5836 5837 SourceLocation ToIfLoc, ToElseLoc; 5838 Stmt *ToInit, *ToThen, *ToElse; 5839 VarDecl *ToConditionVariable; 5840 Expr *ToCond; 5841 std::tie( 5842 ToIfLoc, ToInit, ToConditionVariable, ToCond, ToThen, ToElseLoc, ToElse) = 5843 *Imp; 5844 5845 return IfStmt::Create(Importer.getToContext(), ToIfLoc, S->isConstexpr(), 5846 ToInit, ToConditionVariable, ToCond, ToThen, ToElseLoc, 5847 ToElse); 5848 } 5849 5850 ExpectedStmt ASTNodeImporter::VisitSwitchStmt(SwitchStmt *S) { 5851 auto Imp = importSeq( 5852 S->getInit(), S->getConditionVariable(), S->getCond(), 5853 S->getBody(), S->getSwitchLoc()); 5854 if (!Imp) 5855 return Imp.takeError(); 5856 5857 Stmt *ToInit, *ToBody; 5858 VarDecl *ToConditionVariable; 5859 Expr *ToCond; 5860 SourceLocation ToSwitchLoc; 5861 std::tie(ToInit, ToConditionVariable, ToCond, ToBody, ToSwitchLoc) = *Imp; 5862 5863 auto *ToStmt = SwitchStmt::Create(Importer.getToContext(), ToInit, 5864 ToConditionVariable, ToCond); 5865 ToStmt->setBody(ToBody); 5866 ToStmt->setSwitchLoc(ToSwitchLoc); 5867 5868 // Now we have to re-chain the cases. 5869 SwitchCase *LastChainedSwitchCase = nullptr; 5870 for (SwitchCase *SC = S->getSwitchCaseList(); SC != nullptr; 5871 SC = SC->getNextSwitchCase()) { 5872 Expected<SwitchCase *> ToSCOrErr = import(SC); 5873 if (!ToSCOrErr) 5874 return ToSCOrErr.takeError(); 5875 if (LastChainedSwitchCase) 5876 LastChainedSwitchCase->setNextSwitchCase(*ToSCOrErr); 5877 else 5878 ToStmt->setSwitchCaseList(*ToSCOrErr); 5879 LastChainedSwitchCase = *ToSCOrErr; 5880 } 5881 5882 return ToStmt; 5883 } 5884 5885 ExpectedStmt ASTNodeImporter::VisitWhileStmt(WhileStmt *S) { 5886 auto Imp = importSeq( 5887 S->getConditionVariable(), S->getCond(), S->getBody(), S->getWhileLoc()); 5888 if (!Imp) 5889 return Imp.takeError(); 5890 5891 VarDecl *ToConditionVariable; 5892 Expr *ToCond; 5893 Stmt *ToBody; 5894 SourceLocation ToWhileLoc; 5895 std::tie(ToConditionVariable, ToCond, ToBody, ToWhileLoc) = *Imp; 5896 5897 return WhileStmt::Create(Importer.getToContext(), ToConditionVariable, ToCond, 5898 ToBody, ToWhileLoc); 5899 } 5900 5901 ExpectedStmt ASTNodeImporter::VisitDoStmt(DoStmt *S) { 5902 auto Imp = importSeq( 5903 S->getBody(), S->getCond(), S->getDoLoc(), S->getWhileLoc(), 5904 S->getRParenLoc()); 5905 if (!Imp) 5906 return Imp.takeError(); 5907 5908 Stmt *ToBody; 5909 Expr *ToCond; 5910 SourceLocation ToDoLoc, ToWhileLoc, ToRParenLoc; 5911 std::tie(ToBody, ToCond, ToDoLoc, ToWhileLoc, ToRParenLoc) = *Imp; 5912 5913 return new (Importer.getToContext()) DoStmt( 5914 ToBody, ToCond, ToDoLoc, ToWhileLoc, ToRParenLoc); 5915 } 5916 5917 ExpectedStmt ASTNodeImporter::VisitForStmt(ForStmt *S) { 5918 auto Imp = importSeq( 5919 S->getInit(), S->getCond(), S->getConditionVariable(), S->getInc(), 5920 S->getBody(), S->getForLoc(), S->getLParenLoc(), S->getRParenLoc()); 5921 if (!Imp) 5922 return Imp.takeError(); 5923 5924 Stmt *ToInit; 5925 Expr *ToCond, *ToInc; 5926 VarDecl *ToConditionVariable; 5927 Stmt *ToBody; 5928 SourceLocation ToForLoc, ToLParenLoc, ToRParenLoc; 5929 std::tie( 5930 ToInit, ToCond, ToConditionVariable, ToInc, ToBody, ToForLoc, 5931 ToLParenLoc, ToRParenLoc) = *Imp; 5932 5933 return new (Importer.getToContext()) ForStmt( 5934 Importer.getToContext(), 5935 ToInit, ToCond, ToConditionVariable, ToInc, ToBody, ToForLoc, ToLParenLoc, 5936 ToRParenLoc); 5937 } 5938 5939 ExpectedStmt ASTNodeImporter::VisitGotoStmt(GotoStmt *S) { 5940 auto Imp = importSeq(S->getLabel(), S->getGotoLoc(), S->getLabelLoc()); 5941 if (!Imp) 5942 return Imp.takeError(); 5943 5944 LabelDecl *ToLabel; 5945 SourceLocation ToGotoLoc, ToLabelLoc; 5946 std::tie(ToLabel, ToGotoLoc, ToLabelLoc) = *Imp; 5947 5948 return new (Importer.getToContext()) GotoStmt( 5949 ToLabel, ToGotoLoc, ToLabelLoc); 5950 } 5951 5952 ExpectedStmt ASTNodeImporter::VisitIndirectGotoStmt(IndirectGotoStmt *S) { 5953 auto Imp = importSeq(S->getGotoLoc(), S->getStarLoc(), S->getTarget()); 5954 if (!Imp) 5955 return Imp.takeError(); 5956 5957 SourceLocation ToGotoLoc, ToStarLoc; 5958 Expr *ToTarget; 5959 std::tie(ToGotoLoc, ToStarLoc, ToTarget) = *Imp; 5960 5961 return new (Importer.getToContext()) IndirectGotoStmt( 5962 ToGotoLoc, ToStarLoc, ToTarget); 5963 } 5964 5965 ExpectedStmt ASTNodeImporter::VisitContinueStmt(ContinueStmt *S) { 5966 ExpectedSLoc ToContinueLocOrErr = import(S->getContinueLoc()); 5967 if (!ToContinueLocOrErr) 5968 return ToContinueLocOrErr.takeError(); 5969 return new (Importer.getToContext()) ContinueStmt(*ToContinueLocOrErr); 5970 } 5971 5972 ExpectedStmt ASTNodeImporter::VisitBreakStmt(BreakStmt *S) { 5973 auto ToBreakLocOrErr = import(S->getBreakLoc()); 5974 if (!ToBreakLocOrErr) 5975 return ToBreakLocOrErr.takeError(); 5976 return new (Importer.getToContext()) BreakStmt(*ToBreakLocOrErr); 5977 } 5978 5979 ExpectedStmt ASTNodeImporter::VisitReturnStmt(ReturnStmt *S) { 5980 auto Imp = importSeq( 5981 S->getReturnLoc(), S->getRetValue(), S->getNRVOCandidate()); 5982 if (!Imp) 5983 return Imp.takeError(); 5984 5985 SourceLocation ToReturnLoc; 5986 Expr *ToRetValue; 5987 const VarDecl *ToNRVOCandidate; 5988 std::tie(ToReturnLoc, ToRetValue, ToNRVOCandidate) = *Imp; 5989 5990 return ReturnStmt::Create(Importer.getToContext(), ToReturnLoc, ToRetValue, 5991 ToNRVOCandidate); 5992 } 5993 5994 ExpectedStmt ASTNodeImporter::VisitCXXCatchStmt(CXXCatchStmt *S) { 5995 auto Imp = importSeq( 5996 S->getCatchLoc(), S->getExceptionDecl(), S->getHandlerBlock()); 5997 if (!Imp) 5998 return Imp.takeError(); 5999 6000 SourceLocation ToCatchLoc; 6001 VarDecl *ToExceptionDecl; 6002 Stmt *ToHandlerBlock; 6003 std::tie(ToCatchLoc, ToExceptionDecl, ToHandlerBlock) = *Imp; 6004 6005 return new (Importer.getToContext()) CXXCatchStmt ( 6006 ToCatchLoc, ToExceptionDecl, ToHandlerBlock); 6007 } 6008 6009 ExpectedStmt ASTNodeImporter::VisitCXXTryStmt(CXXTryStmt *S) { 6010 ExpectedSLoc ToTryLocOrErr = import(S->getTryLoc()); 6011 if (!ToTryLocOrErr) 6012 return ToTryLocOrErr.takeError(); 6013 6014 ExpectedStmt ToTryBlockOrErr = import(S->getTryBlock()); 6015 if (!ToTryBlockOrErr) 6016 return ToTryBlockOrErr.takeError(); 6017 6018 SmallVector<Stmt *, 1> ToHandlers(S->getNumHandlers()); 6019 for (unsigned HI = 0, HE = S->getNumHandlers(); HI != HE; ++HI) { 6020 CXXCatchStmt *FromHandler = S->getHandler(HI); 6021 if (auto ToHandlerOrErr = import(FromHandler)) 6022 ToHandlers[HI] = *ToHandlerOrErr; 6023 else 6024 return ToHandlerOrErr.takeError(); 6025 } 6026 6027 return CXXTryStmt::Create( 6028 Importer.getToContext(), *ToTryLocOrErr,*ToTryBlockOrErr, ToHandlers); 6029 } 6030 6031 ExpectedStmt ASTNodeImporter::VisitCXXForRangeStmt(CXXForRangeStmt *S) { 6032 auto Imp1 = importSeq( 6033 S->getInit(), S->getRangeStmt(), S->getBeginStmt(), S->getEndStmt(), 6034 S->getCond(), S->getInc(), S->getLoopVarStmt(), S->getBody()); 6035 if (!Imp1) 6036 return Imp1.takeError(); 6037 auto Imp2 = importSeq( 6038 S->getForLoc(), S->getCoawaitLoc(), S->getColonLoc(), S->getRParenLoc()); 6039 if (!Imp2) 6040 return Imp2.takeError(); 6041 6042 DeclStmt *ToRangeStmt, *ToBeginStmt, *ToEndStmt, *ToLoopVarStmt; 6043 Expr *ToCond, *ToInc; 6044 Stmt *ToInit, *ToBody; 6045 std::tie( 6046 ToInit, ToRangeStmt, ToBeginStmt, ToEndStmt, ToCond, ToInc, ToLoopVarStmt, 6047 ToBody) = *Imp1; 6048 SourceLocation ToForLoc, ToCoawaitLoc, ToColonLoc, ToRParenLoc; 6049 std::tie(ToForLoc, ToCoawaitLoc, ToColonLoc, ToRParenLoc) = *Imp2; 6050 6051 return new (Importer.getToContext()) CXXForRangeStmt( 6052 ToInit, ToRangeStmt, ToBeginStmt, ToEndStmt, ToCond, ToInc, ToLoopVarStmt, 6053 ToBody, ToForLoc, ToCoawaitLoc, ToColonLoc, ToRParenLoc); 6054 } 6055 6056 ExpectedStmt 6057 ASTNodeImporter::VisitObjCForCollectionStmt(ObjCForCollectionStmt *S) { 6058 auto Imp = importSeq( 6059 S->getElement(), S->getCollection(), S->getBody(), 6060 S->getForLoc(), S->getRParenLoc()); 6061 if (!Imp) 6062 return Imp.takeError(); 6063 6064 Stmt *ToElement, *ToBody; 6065 Expr *ToCollection; 6066 SourceLocation ToForLoc, ToRParenLoc; 6067 std::tie(ToElement, ToCollection, ToBody, ToForLoc, ToRParenLoc) = *Imp; 6068 6069 return new (Importer.getToContext()) ObjCForCollectionStmt(ToElement, 6070 ToCollection, 6071 ToBody, 6072 ToForLoc, 6073 ToRParenLoc); 6074 } 6075 6076 ExpectedStmt ASTNodeImporter::VisitObjCAtCatchStmt(ObjCAtCatchStmt *S) { 6077 auto Imp = importSeq( 6078 S->getAtCatchLoc(), S->getRParenLoc(), S->getCatchParamDecl(), 6079 S->getCatchBody()); 6080 if (!Imp) 6081 return Imp.takeError(); 6082 6083 SourceLocation ToAtCatchLoc, ToRParenLoc; 6084 VarDecl *ToCatchParamDecl; 6085 Stmt *ToCatchBody; 6086 std::tie(ToAtCatchLoc, ToRParenLoc, ToCatchParamDecl, ToCatchBody) = *Imp; 6087 6088 return new (Importer.getToContext()) ObjCAtCatchStmt ( 6089 ToAtCatchLoc, ToRParenLoc, ToCatchParamDecl, ToCatchBody); 6090 } 6091 6092 ExpectedStmt ASTNodeImporter::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S) { 6093 ExpectedSLoc ToAtFinallyLocOrErr = import(S->getAtFinallyLoc()); 6094 if (!ToAtFinallyLocOrErr) 6095 return ToAtFinallyLocOrErr.takeError(); 6096 ExpectedStmt ToAtFinallyStmtOrErr = import(S->getFinallyBody()); 6097 if (!ToAtFinallyStmtOrErr) 6098 return ToAtFinallyStmtOrErr.takeError(); 6099 return new (Importer.getToContext()) ObjCAtFinallyStmt(*ToAtFinallyLocOrErr, 6100 *ToAtFinallyStmtOrErr); 6101 } 6102 6103 ExpectedStmt ASTNodeImporter::VisitObjCAtTryStmt(ObjCAtTryStmt *S) { 6104 auto Imp = importSeq( 6105 S->getAtTryLoc(), S->getTryBody(), S->getFinallyStmt()); 6106 if (!Imp) 6107 return Imp.takeError(); 6108 6109 SourceLocation ToAtTryLoc; 6110 Stmt *ToTryBody, *ToFinallyStmt; 6111 std::tie(ToAtTryLoc, ToTryBody, ToFinallyStmt) = *Imp; 6112 6113 SmallVector<Stmt *, 1> ToCatchStmts(S->getNumCatchStmts()); 6114 for (unsigned CI = 0, CE = S->getNumCatchStmts(); CI != CE; ++CI) { 6115 ObjCAtCatchStmt *FromCatchStmt = S->getCatchStmt(CI); 6116 if (ExpectedStmt ToCatchStmtOrErr = import(FromCatchStmt)) 6117 ToCatchStmts[CI] = *ToCatchStmtOrErr; 6118 else 6119 return ToCatchStmtOrErr.takeError(); 6120 } 6121 6122 return ObjCAtTryStmt::Create(Importer.getToContext(), 6123 ToAtTryLoc, ToTryBody, 6124 ToCatchStmts.begin(), ToCatchStmts.size(), 6125 ToFinallyStmt); 6126 } 6127 6128 ExpectedStmt ASTNodeImporter::VisitObjCAtSynchronizedStmt 6129 (ObjCAtSynchronizedStmt *S) { 6130 auto Imp = importSeq( 6131 S->getAtSynchronizedLoc(), S->getSynchExpr(), S->getSynchBody()); 6132 if (!Imp) 6133 return Imp.takeError(); 6134 6135 SourceLocation ToAtSynchronizedLoc; 6136 Expr *ToSynchExpr; 6137 Stmt *ToSynchBody; 6138 std::tie(ToAtSynchronizedLoc, ToSynchExpr, ToSynchBody) = *Imp; 6139 6140 return new (Importer.getToContext()) ObjCAtSynchronizedStmt( 6141 ToAtSynchronizedLoc, ToSynchExpr, ToSynchBody); 6142 } 6143 6144 ExpectedStmt ASTNodeImporter::VisitObjCAtThrowStmt(ObjCAtThrowStmt *S) { 6145 ExpectedSLoc ToThrowLocOrErr = import(S->getThrowLoc()); 6146 if (!ToThrowLocOrErr) 6147 return ToThrowLocOrErr.takeError(); 6148 ExpectedExpr ToThrowExprOrErr = import(S->getThrowExpr()); 6149 if (!ToThrowExprOrErr) 6150 return ToThrowExprOrErr.takeError(); 6151 return new (Importer.getToContext()) ObjCAtThrowStmt( 6152 *ToThrowLocOrErr, *ToThrowExprOrErr); 6153 } 6154 6155 ExpectedStmt ASTNodeImporter::VisitObjCAutoreleasePoolStmt( 6156 ObjCAutoreleasePoolStmt *S) { 6157 ExpectedSLoc ToAtLocOrErr = import(S->getAtLoc()); 6158 if (!ToAtLocOrErr) 6159 return ToAtLocOrErr.takeError(); 6160 ExpectedStmt ToSubStmtOrErr = import(S->getSubStmt()); 6161 if (!ToSubStmtOrErr) 6162 return ToSubStmtOrErr.takeError(); 6163 return new (Importer.getToContext()) ObjCAutoreleasePoolStmt(*ToAtLocOrErr, 6164 *ToSubStmtOrErr); 6165 } 6166 6167 //---------------------------------------------------------------------------- 6168 // Import Expressions 6169 //---------------------------------------------------------------------------- 6170 ExpectedStmt ASTNodeImporter::VisitExpr(Expr *E) { 6171 Importer.FromDiag(E->getBeginLoc(), diag::err_unsupported_ast_node) 6172 << E->getStmtClassName(); 6173 return make_error<ImportError>(ImportError::UnsupportedConstruct); 6174 } 6175 6176 ExpectedStmt ASTNodeImporter::VisitVAArgExpr(VAArgExpr *E) { 6177 auto Imp = importSeq( 6178 E->getBuiltinLoc(), E->getSubExpr(), E->getWrittenTypeInfo(), 6179 E->getRParenLoc(), E->getType()); 6180 if (!Imp) 6181 return Imp.takeError(); 6182 6183 SourceLocation ToBuiltinLoc, ToRParenLoc; 6184 Expr *ToSubExpr; 6185 TypeSourceInfo *ToWrittenTypeInfo; 6186 QualType ToType; 6187 std::tie(ToBuiltinLoc, ToSubExpr, ToWrittenTypeInfo, ToRParenLoc, ToType) = 6188 *Imp; 6189 6190 return new (Importer.getToContext()) VAArgExpr( 6191 ToBuiltinLoc, ToSubExpr, ToWrittenTypeInfo, ToRParenLoc, ToType, 6192 E->isMicrosoftABI()); 6193 } 6194 6195 ExpectedStmt ASTNodeImporter::VisitChooseExpr(ChooseExpr *E) { 6196 auto Imp = importSeq(E->getCond(), E->getLHS(), E->getRHS(), 6197 E->getBuiltinLoc(), E->getRParenLoc(), E->getType()); 6198 if (!Imp) 6199 return Imp.takeError(); 6200 6201 Expr *ToCond; 6202 Expr *ToLHS; 6203 Expr *ToRHS; 6204 SourceLocation ToBuiltinLoc, ToRParenLoc; 6205 QualType ToType; 6206 std::tie(ToCond, ToLHS, ToRHS, ToBuiltinLoc, ToRParenLoc, ToType) = *Imp; 6207 6208 ExprValueKind VK = E->getValueKind(); 6209 ExprObjectKind OK = E->getObjectKind(); 6210 6211 bool TypeDependent = ToCond->isTypeDependent(); 6212 bool ValueDependent = ToCond->isValueDependent(); 6213 6214 // The value of CondIsTrue only matters if the value is not 6215 // condition-dependent. 6216 bool CondIsTrue = !E->isConditionDependent() && E->isConditionTrue(); 6217 6218 return new (Importer.getToContext()) 6219 ChooseExpr(ToBuiltinLoc, ToCond, ToLHS, ToRHS, ToType, VK, OK, 6220 ToRParenLoc, CondIsTrue, TypeDependent, ValueDependent); 6221 } 6222 6223 ExpectedStmt ASTNodeImporter::VisitGNUNullExpr(GNUNullExpr *E) { 6224 ExpectedType TypeOrErr = import(E->getType()); 6225 if (!TypeOrErr) 6226 return TypeOrErr.takeError(); 6227 6228 ExpectedSLoc BeginLocOrErr = import(E->getBeginLoc()); 6229 if (!BeginLocOrErr) 6230 return BeginLocOrErr.takeError(); 6231 6232 return new (Importer.getToContext()) GNUNullExpr(*TypeOrErr, *BeginLocOrErr); 6233 } 6234 6235 ExpectedStmt ASTNodeImporter::VisitPredefinedExpr(PredefinedExpr *E) { 6236 auto Imp = importSeq( 6237 E->getBeginLoc(), E->getType(), E->getFunctionName()); 6238 if (!Imp) 6239 return Imp.takeError(); 6240 6241 SourceLocation ToBeginLoc; 6242 QualType ToType; 6243 StringLiteral *ToFunctionName; 6244 std::tie(ToBeginLoc, ToType, ToFunctionName) = *Imp; 6245 6246 return PredefinedExpr::Create(Importer.getToContext(), ToBeginLoc, ToType, 6247 E->getIdentKind(), ToFunctionName); 6248 } 6249 6250 ExpectedStmt ASTNodeImporter::VisitDeclRefExpr(DeclRefExpr *E) { 6251 auto Imp = importSeq( 6252 E->getQualifierLoc(), E->getTemplateKeywordLoc(), E->getDecl(), 6253 E->getLocation(), E->getType()); 6254 if (!Imp) 6255 return Imp.takeError(); 6256 6257 NestedNameSpecifierLoc ToQualifierLoc; 6258 SourceLocation ToTemplateKeywordLoc, ToLocation; 6259 ValueDecl *ToDecl; 6260 QualType ToType; 6261 std::tie(ToQualifierLoc, ToTemplateKeywordLoc, ToDecl, ToLocation, ToType) = 6262 *Imp; 6263 6264 NamedDecl *ToFoundD = nullptr; 6265 if (E->getDecl() != E->getFoundDecl()) { 6266 auto FoundDOrErr = import(E->getFoundDecl()); 6267 if (!FoundDOrErr) 6268 return FoundDOrErr.takeError(); 6269 ToFoundD = *FoundDOrErr; 6270 } 6271 6272 TemplateArgumentListInfo ToTAInfo; 6273 TemplateArgumentListInfo *ToResInfo = nullptr; 6274 if (E->hasExplicitTemplateArgs()) { 6275 if (Error Err = 6276 ImportTemplateArgumentListInfo(E->template_arguments(), ToTAInfo)) 6277 return std::move(Err); 6278 ToResInfo = &ToTAInfo; 6279 } 6280 6281 auto *ToE = DeclRefExpr::Create( 6282 Importer.getToContext(), ToQualifierLoc, ToTemplateKeywordLoc, ToDecl, 6283 E->refersToEnclosingVariableOrCapture(), ToLocation, ToType, 6284 E->getValueKind(), ToFoundD, ToResInfo, E->isNonOdrUse()); 6285 if (E->hadMultipleCandidates()) 6286 ToE->setHadMultipleCandidates(true); 6287 return ToE; 6288 } 6289 6290 ExpectedStmt ASTNodeImporter::VisitImplicitValueInitExpr(ImplicitValueInitExpr *E) { 6291 ExpectedType TypeOrErr = import(E->getType()); 6292 if (!TypeOrErr) 6293 return TypeOrErr.takeError(); 6294 6295 return new (Importer.getToContext()) ImplicitValueInitExpr(*TypeOrErr); 6296 } 6297 6298 ExpectedStmt ASTNodeImporter::VisitDesignatedInitExpr(DesignatedInitExpr *E) { 6299 ExpectedExpr ToInitOrErr = import(E->getInit()); 6300 if (!ToInitOrErr) 6301 return ToInitOrErr.takeError(); 6302 6303 ExpectedSLoc ToEqualOrColonLocOrErr = import(E->getEqualOrColonLoc()); 6304 if (!ToEqualOrColonLocOrErr) 6305 return ToEqualOrColonLocOrErr.takeError(); 6306 6307 SmallVector<Expr *, 4> ToIndexExprs(E->getNumSubExprs() - 1); 6308 // List elements from the second, the first is Init itself 6309 for (unsigned I = 1, N = E->getNumSubExprs(); I < N; I++) { 6310 if (ExpectedExpr ToArgOrErr = import(E->getSubExpr(I))) 6311 ToIndexExprs[I - 1] = *ToArgOrErr; 6312 else 6313 return ToArgOrErr.takeError(); 6314 } 6315 6316 SmallVector<Designator, 4> ToDesignators(E->size()); 6317 if (Error Err = ImportContainerChecked(E->designators(), ToDesignators)) 6318 return std::move(Err); 6319 6320 return DesignatedInitExpr::Create( 6321 Importer.getToContext(), ToDesignators, 6322 ToIndexExprs, *ToEqualOrColonLocOrErr, 6323 E->usesGNUSyntax(), *ToInitOrErr); 6324 } 6325 6326 ExpectedStmt 6327 ASTNodeImporter::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E) { 6328 ExpectedType ToTypeOrErr = import(E->getType()); 6329 if (!ToTypeOrErr) 6330 return ToTypeOrErr.takeError(); 6331 6332 ExpectedSLoc ToLocationOrErr = import(E->getLocation()); 6333 if (!ToLocationOrErr) 6334 return ToLocationOrErr.takeError(); 6335 6336 return new (Importer.getToContext()) CXXNullPtrLiteralExpr( 6337 *ToTypeOrErr, *ToLocationOrErr); 6338 } 6339 6340 ExpectedStmt ASTNodeImporter::VisitIntegerLiteral(IntegerLiteral *E) { 6341 ExpectedType ToTypeOrErr = import(E->getType()); 6342 if (!ToTypeOrErr) 6343 return ToTypeOrErr.takeError(); 6344 6345 ExpectedSLoc ToLocationOrErr = import(E->getLocation()); 6346 if (!ToLocationOrErr) 6347 return ToLocationOrErr.takeError(); 6348 6349 return IntegerLiteral::Create( 6350 Importer.getToContext(), E->getValue(), *ToTypeOrErr, *ToLocationOrErr); 6351 } 6352 6353 6354 ExpectedStmt ASTNodeImporter::VisitFloatingLiteral(FloatingLiteral *E) { 6355 ExpectedType ToTypeOrErr = import(E->getType()); 6356 if (!ToTypeOrErr) 6357 return ToTypeOrErr.takeError(); 6358 6359 ExpectedSLoc ToLocationOrErr = import(E->getLocation()); 6360 if (!ToLocationOrErr) 6361 return ToLocationOrErr.takeError(); 6362 6363 return FloatingLiteral::Create( 6364 Importer.getToContext(), E->getValue(), E->isExact(), 6365 *ToTypeOrErr, *ToLocationOrErr); 6366 } 6367 6368 ExpectedStmt ASTNodeImporter::VisitImaginaryLiteral(ImaginaryLiteral *E) { 6369 auto ToTypeOrErr = import(E->getType()); 6370 if (!ToTypeOrErr) 6371 return ToTypeOrErr.takeError(); 6372 6373 ExpectedExpr ToSubExprOrErr = import(E->getSubExpr()); 6374 if (!ToSubExprOrErr) 6375 return ToSubExprOrErr.takeError(); 6376 6377 return new (Importer.getToContext()) ImaginaryLiteral( 6378 *ToSubExprOrErr, *ToTypeOrErr); 6379 } 6380 6381 ExpectedStmt ASTNodeImporter::VisitCharacterLiteral(CharacterLiteral *E) { 6382 ExpectedType ToTypeOrErr = import(E->getType()); 6383 if (!ToTypeOrErr) 6384 return ToTypeOrErr.takeError(); 6385 6386 ExpectedSLoc ToLocationOrErr = import(E->getLocation()); 6387 if (!ToLocationOrErr) 6388 return ToLocationOrErr.takeError(); 6389 6390 return new (Importer.getToContext()) CharacterLiteral( 6391 E->getValue(), E->getKind(), *ToTypeOrErr, *ToLocationOrErr); 6392 } 6393 6394 ExpectedStmt ASTNodeImporter::VisitStringLiteral(StringLiteral *E) { 6395 ExpectedType ToTypeOrErr = import(E->getType()); 6396 if (!ToTypeOrErr) 6397 return ToTypeOrErr.takeError(); 6398 6399 SmallVector<SourceLocation, 4> ToLocations(E->getNumConcatenated()); 6400 if (Error Err = ImportArrayChecked( 6401 E->tokloc_begin(), E->tokloc_end(), ToLocations.begin())) 6402 return std::move(Err); 6403 6404 return StringLiteral::Create( 6405 Importer.getToContext(), E->getBytes(), E->getKind(), E->isPascal(), 6406 *ToTypeOrErr, ToLocations.data(), ToLocations.size()); 6407 } 6408 6409 ExpectedStmt ASTNodeImporter::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) { 6410 auto Imp = importSeq( 6411 E->getLParenLoc(), E->getTypeSourceInfo(), E->getType(), 6412 E->getInitializer()); 6413 if (!Imp) 6414 return Imp.takeError(); 6415 6416 SourceLocation ToLParenLoc; 6417 TypeSourceInfo *ToTypeSourceInfo; 6418 QualType ToType; 6419 Expr *ToInitializer; 6420 std::tie(ToLParenLoc, ToTypeSourceInfo, ToType, ToInitializer) = *Imp; 6421 6422 return new (Importer.getToContext()) CompoundLiteralExpr( 6423 ToLParenLoc, ToTypeSourceInfo, ToType, E->getValueKind(), 6424 ToInitializer, E->isFileScope()); 6425 } 6426 6427 ExpectedStmt ASTNodeImporter::VisitAtomicExpr(AtomicExpr *E) { 6428 auto Imp = importSeq( 6429 E->getBuiltinLoc(), E->getType(), E->getRParenLoc()); 6430 if (!Imp) 6431 return Imp.takeError(); 6432 6433 SourceLocation ToBuiltinLoc, ToRParenLoc; 6434 QualType ToType; 6435 std::tie(ToBuiltinLoc, ToType, ToRParenLoc) = *Imp; 6436 6437 SmallVector<Expr *, 6> ToExprs(E->getNumSubExprs()); 6438 if (Error Err = ImportArrayChecked( 6439 E->getSubExprs(), E->getSubExprs() + E->getNumSubExprs(), 6440 ToExprs.begin())) 6441 return std::move(Err); 6442 6443 return new (Importer.getToContext()) AtomicExpr( 6444 ToBuiltinLoc, ToExprs, ToType, E->getOp(), ToRParenLoc); 6445 } 6446 6447 ExpectedStmt ASTNodeImporter::VisitAddrLabelExpr(AddrLabelExpr *E) { 6448 auto Imp = importSeq( 6449 E->getAmpAmpLoc(), E->getLabelLoc(), E->getLabel(), E->getType()); 6450 if (!Imp) 6451 return Imp.takeError(); 6452 6453 SourceLocation ToAmpAmpLoc, ToLabelLoc; 6454 LabelDecl *ToLabel; 6455 QualType ToType; 6456 std::tie(ToAmpAmpLoc, ToLabelLoc, ToLabel, ToType) = *Imp; 6457 6458 return new (Importer.getToContext()) AddrLabelExpr( 6459 ToAmpAmpLoc, ToLabelLoc, ToLabel, ToType); 6460 } 6461 6462 ExpectedStmt ASTNodeImporter::VisitConstantExpr(ConstantExpr *E) { 6463 auto Imp = importSeq(E->getSubExpr()); 6464 if (!Imp) 6465 return Imp.takeError(); 6466 6467 Expr *ToSubExpr; 6468 std::tie(ToSubExpr) = *Imp; 6469 6470 // TODO : Handle APValue::ValueKind that require importing. 6471 APValue::ValueKind Kind = E->getResultAPValueKind(); 6472 if (Kind == APValue::Int || Kind == APValue::Float || 6473 Kind == APValue::FixedPoint || Kind == APValue::ComplexFloat || 6474 Kind == APValue::ComplexInt) 6475 return ConstantExpr::Create(Importer.getToContext(), ToSubExpr, 6476 E->getAPValueResult()); 6477 return ConstantExpr::Create(Importer.getToContext(), ToSubExpr); 6478 } 6479 6480 ExpectedStmt ASTNodeImporter::VisitParenExpr(ParenExpr *E) { 6481 auto Imp = importSeq(E->getLParen(), E->getRParen(), E->getSubExpr()); 6482 if (!Imp) 6483 return Imp.takeError(); 6484 6485 SourceLocation ToLParen, ToRParen; 6486 Expr *ToSubExpr; 6487 std::tie(ToLParen, ToRParen, ToSubExpr) = *Imp; 6488 6489 return new (Importer.getToContext()) 6490 ParenExpr(ToLParen, ToRParen, ToSubExpr); 6491 } 6492 6493 ExpectedStmt ASTNodeImporter::VisitParenListExpr(ParenListExpr *E) { 6494 SmallVector<Expr *, 4> ToExprs(E->getNumExprs()); 6495 if (Error Err = ImportContainerChecked(E->exprs(), ToExprs)) 6496 return std::move(Err); 6497 6498 ExpectedSLoc ToLParenLocOrErr = import(E->getLParenLoc()); 6499 if (!ToLParenLocOrErr) 6500 return ToLParenLocOrErr.takeError(); 6501 6502 ExpectedSLoc ToRParenLocOrErr = import(E->getRParenLoc()); 6503 if (!ToRParenLocOrErr) 6504 return ToRParenLocOrErr.takeError(); 6505 6506 return ParenListExpr::Create(Importer.getToContext(), *ToLParenLocOrErr, 6507 ToExprs, *ToRParenLocOrErr); 6508 } 6509 6510 ExpectedStmt ASTNodeImporter::VisitStmtExpr(StmtExpr *E) { 6511 auto Imp = importSeq( 6512 E->getSubStmt(), E->getType(), E->getLParenLoc(), E->getRParenLoc()); 6513 if (!Imp) 6514 return Imp.takeError(); 6515 6516 CompoundStmt *ToSubStmt; 6517 QualType ToType; 6518 SourceLocation ToLParenLoc, ToRParenLoc; 6519 std::tie(ToSubStmt, ToType, ToLParenLoc, ToRParenLoc) = *Imp; 6520 6521 return new (Importer.getToContext()) StmtExpr( 6522 ToSubStmt, ToType, ToLParenLoc, ToRParenLoc); 6523 } 6524 6525 ExpectedStmt ASTNodeImporter::VisitUnaryOperator(UnaryOperator *E) { 6526 auto Imp = importSeq( 6527 E->getSubExpr(), E->getType(), E->getOperatorLoc()); 6528 if (!Imp) 6529 return Imp.takeError(); 6530 6531 Expr *ToSubExpr; 6532 QualType ToType; 6533 SourceLocation ToOperatorLoc; 6534 std::tie(ToSubExpr, ToType, ToOperatorLoc) = *Imp; 6535 6536 return new (Importer.getToContext()) UnaryOperator( 6537 ToSubExpr, E->getOpcode(), ToType, E->getValueKind(), E->getObjectKind(), 6538 ToOperatorLoc, E->canOverflow()); 6539 } 6540 6541 ExpectedStmt 6542 ASTNodeImporter::VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *E) { 6543 auto Imp = importSeq(E->getType(), E->getOperatorLoc(), E->getRParenLoc()); 6544 if (!Imp) 6545 return Imp.takeError(); 6546 6547 QualType ToType; 6548 SourceLocation ToOperatorLoc, ToRParenLoc; 6549 std::tie(ToType, ToOperatorLoc, ToRParenLoc) = *Imp; 6550 6551 if (E->isArgumentType()) { 6552 Expected<TypeSourceInfo *> ToArgumentTypeInfoOrErr = 6553 import(E->getArgumentTypeInfo()); 6554 if (!ToArgumentTypeInfoOrErr) 6555 return ToArgumentTypeInfoOrErr.takeError(); 6556 6557 return new (Importer.getToContext()) UnaryExprOrTypeTraitExpr( 6558 E->getKind(), *ToArgumentTypeInfoOrErr, ToType, ToOperatorLoc, 6559 ToRParenLoc); 6560 } 6561 6562 ExpectedExpr ToArgumentExprOrErr = import(E->getArgumentExpr()); 6563 if (!ToArgumentExprOrErr) 6564 return ToArgumentExprOrErr.takeError(); 6565 6566 return new (Importer.getToContext()) UnaryExprOrTypeTraitExpr( 6567 E->getKind(), *ToArgumentExprOrErr, ToType, ToOperatorLoc, ToRParenLoc); 6568 } 6569 6570 ExpectedStmt ASTNodeImporter::VisitBinaryOperator(BinaryOperator *E) { 6571 auto Imp = importSeq( 6572 E->getLHS(), E->getRHS(), E->getType(), E->getOperatorLoc()); 6573 if (!Imp) 6574 return Imp.takeError(); 6575 6576 Expr *ToLHS, *ToRHS; 6577 QualType ToType; 6578 SourceLocation ToOperatorLoc; 6579 std::tie(ToLHS, ToRHS, ToType, ToOperatorLoc) = *Imp; 6580 6581 return new (Importer.getToContext()) BinaryOperator( 6582 ToLHS, ToRHS, E->getOpcode(), ToType, E->getValueKind(), 6583 E->getObjectKind(), ToOperatorLoc, E->getFPFeatures()); 6584 } 6585 6586 ExpectedStmt ASTNodeImporter::VisitConditionalOperator(ConditionalOperator *E) { 6587 auto Imp = importSeq( 6588 E->getCond(), E->getQuestionLoc(), E->getLHS(), E->getColonLoc(), 6589 E->getRHS(), E->getType()); 6590 if (!Imp) 6591 return Imp.takeError(); 6592 6593 Expr *ToCond, *ToLHS, *ToRHS; 6594 SourceLocation ToQuestionLoc, ToColonLoc; 6595 QualType ToType; 6596 std::tie(ToCond, ToQuestionLoc, ToLHS, ToColonLoc, ToRHS, ToType) = *Imp; 6597 6598 return new (Importer.getToContext()) ConditionalOperator( 6599 ToCond, ToQuestionLoc, ToLHS, ToColonLoc, ToRHS, ToType, 6600 E->getValueKind(), E->getObjectKind()); 6601 } 6602 6603 ExpectedStmt ASTNodeImporter::VisitBinaryConditionalOperator( 6604 BinaryConditionalOperator *E) { 6605 auto Imp = importSeq( 6606 E->getCommon(), E->getOpaqueValue(), E->getCond(), E->getTrueExpr(), 6607 E->getFalseExpr(), E->getQuestionLoc(), E->getColonLoc(), E->getType()); 6608 if (!Imp) 6609 return Imp.takeError(); 6610 6611 Expr *ToCommon, *ToCond, *ToTrueExpr, *ToFalseExpr; 6612 OpaqueValueExpr *ToOpaqueValue; 6613 SourceLocation ToQuestionLoc, ToColonLoc; 6614 QualType ToType; 6615 std::tie( 6616 ToCommon, ToOpaqueValue, ToCond, ToTrueExpr, ToFalseExpr, ToQuestionLoc, 6617 ToColonLoc, ToType) = *Imp; 6618 6619 return new (Importer.getToContext()) BinaryConditionalOperator( 6620 ToCommon, ToOpaqueValue, ToCond, ToTrueExpr, ToFalseExpr, 6621 ToQuestionLoc, ToColonLoc, ToType, E->getValueKind(), 6622 E->getObjectKind()); 6623 } 6624 6625 ExpectedStmt ASTNodeImporter::VisitArrayTypeTraitExpr(ArrayTypeTraitExpr *E) { 6626 auto Imp = importSeq( 6627 E->getBeginLoc(), E->getQueriedTypeSourceInfo(), 6628 E->getDimensionExpression(), E->getEndLoc(), E->getType()); 6629 if (!Imp) 6630 return Imp.takeError(); 6631 6632 SourceLocation ToBeginLoc, ToEndLoc; 6633 TypeSourceInfo *ToQueriedTypeSourceInfo; 6634 Expr *ToDimensionExpression; 6635 QualType ToType; 6636 std::tie( 6637 ToBeginLoc, ToQueriedTypeSourceInfo, ToDimensionExpression, ToEndLoc, 6638 ToType) = *Imp; 6639 6640 return new (Importer.getToContext()) ArrayTypeTraitExpr( 6641 ToBeginLoc, E->getTrait(), ToQueriedTypeSourceInfo, E->getValue(), 6642 ToDimensionExpression, ToEndLoc, ToType); 6643 } 6644 6645 ExpectedStmt ASTNodeImporter::VisitExpressionTraitExpr(ExpressionTraitExpr *E) { 6646 auto Imp = importSeq( 6647 E->getBeginLoc(), E->getQueriedExpression(), E->getEndLoc(), E->getType()); 6648 if (!Imp) 6649 return Imp.takeError(); 6650 6651 SourceLocation ToBeginLoc, ToEndLoc; 6652 Expr *ToQueriedExpression; 6653 QualType ToType; 6654 std::tie(ToBeginLoc, ToQueriedExpression, ToEndLoc, ToType) = *Imp; 6655 6656 return new (Importer.getToContext()) ExpressionTraitExpr( 6657 ToBeginLoc, E->getTrait(), ToQueriedExpression, E->getValue(), 6658 ToEndLoc, ToType); 6659 } 6660 6661 ExpectedStmt ASTNodeImporter::VisitOpaqueValueExpr(OpaqueValueExpr *E) { 6662 auto Imp = importSeq( 6663 E->getLocation(), E->getType(), E->getSourceExpr()); 6664 if (!Imp) 6665 return Imp.takeError(); 6666 6667 SourceLocation ToLocation; 6668 QualType ToType; 6669 Expr *ToSourceExpr; 6670 std::tie(ToLocation, ToType, ToSourceExpr) = *Imp; 6671 6672 return new (Importer.getToContext()) OpaqueValueExpr( 6673 ToLocation, ToType, E->getValueKind(), E->getObjectKind(), ToSourceExpr); 6674 } 6675 6676 ExpectedStmt ASTNodeImporter::VisitArraySubscriptExpr(ArraySubscriptExpr *E) { 6677 auto Imp = importSeq( 6678 E->getLHS(), E->getRHS(), E->getType(), E->getRBracketLoc()); 6679 if (!Imp) 6680 return Imp.takeError(); 6681 6682 Expr *ToLHS, *ToRHS; 6683 SourceLocation ToRBracketLoc; 6684 QualType ToType; 6685 std::tie(ToLHS, ToRHS, ToType, ToRBracketLoc) = *Imp; 6686 6687 return new (Importer.getToContext()) ArraySubscriptExpr( 6688 ToLHS, ToRHS, ToType, E->getValueKind(), E->getObjectKind(), 6689 ToRBracketLoc); 6690 } 6691 6692 ExpectedStmt 6693 ASTNodeImporter::VisitCompoundAssignOperator(CompoundAssignOperator *E) { 6694 auto Imp = importSeq( 6695 E->getLHS(), E->getRHS(), E->getType(), E->getComputationLHSType(), 6696 E->getComputationResultType(), E->getOperatorLoc()); 6697 if (!Imp) 6698 return Imp.takeError(); 6699 6700 Expr *ToLHS, *ToRHS; 6701 QualType ToType, ToComputationLHSType, ToComputationResultType; 6702 SourceLocation ToOperatorLoc; 6703 std::tie(ToLHS, ToRHS, ToType, ToComputationLHSType, ToComputationResultType, 6704 ToOperatorLoc) = *Imp; 6705 6706 return new (Importer.getToContext()) CompoundAssignOperator( 6707 ToLHS, ToRHS, E->getOpcode(), ToType, E->getValueKind(), 6708 E->getObjectKind(), ToComputationLHSType, ToComputationResultType, 6709 ToOperatorLoc, E->getFPFeatures()); 6710 } 6711 6712 Expected<CXXCastPath> 6713 ASTNodeImporter::ImportCastPath(CastExpr *CE) { 6714 CXXCastPath Path; 6715 for (auto I = CE->path_begin(), E = CE->path_end(); I != E; ++I) { 6716 if (auto SpecOrErr = import(*I)) 6717 Path.push_back(*SpecOrErr); 6718 else 6719 return SpecOrErr.takeError(); 6720 } 6721 return Path; 6722 } 6723 6724 ExpectedStmt ASTNodeImporter::VisitImplicitCastExpr(ImplicitCastExpr *E) { 6725 ExpectedType ToTypeOrErr = import(E->getType()); 6726 if (!ToTypeOrErr) 6727 return ToTypeOrErr.takeError(); 6728 6729 ExpectedExpr ToSubExprOrErr = import(E->getSubExpr()); 6730 if (!ToSubExprOrErr) 6731 return ToSubExprOrErr.takeError(); 6732 6733 Expected<CXXCastPath> ToBasePathOrErr = ImportCastPath(E); 6734 if (!ToBasePathOrErr) 6735 return ToBasePathOrErr.takeError(); 6736 6737 return ImplicitCastExpr::Create( 6738 Importer.getToContext(), *ToTypeOrErr, E->getCastKind(), *ToSubExprOrErr, 6739 &(*ToBasePathOrErr), E->getValueKind()); 6740 } 6741 6742 ExpectedStmt ASTNodeImporter::VisitExplicitCastExpr(ExplicitCastExpr *E) { 6743 auto Imp1 = importSeq( 6744 E->getType(), E->getSubExpr(), E->getTypeInfoAsWritten()); 6745 if (!Imp1) 6746 return Imp1.takeError(); 6747 6748 QualType ToType; 6749 Expr *ToSubExpr; 6750 TypeSourceInfo *ToTypeInfoAsWritten; 6751 std::tie(ToType, ToSubExpr, ToTypeInfoAsWritten) = *Imp1; 6752 6753 Expected<CXXCastPath> ToBasePathOrErr = ImportCastPath(E); 6754 if (!ToBasePathOrErr) 6755 return ToBasePathOrErr.takeError(); 6756 CXXCastPath *ToBasePath = &(*ToBasePathOrErr); 6757 6758 switch (E->getStmtClass()) { 6759 case Stmt::CStyleCastExprClass: { 6760 auto *CCE = cast<CStyleCastExpr>(E); 6761 ExpectedSLoc ToLParenLocOrErr = import(CCE->getLParenLoc()); 6762 if (!ToLParenLocOrErr) 6763 return ToLParenLocOrErr.takeError(); 6764 ExpectedSLoc ToRParenLocOrErr = import(CCE->getRParenLoc()); 6765 if (!ToRParenLocOrErr) 6766 return ToRParenLocOrErr.takeError(); 6767 return CStyleCastExpr::Create( 6768 Importer.getToContext(), ToType, E->getValueKind(), E->getCastKind(), 6769 ToSubExpr, ToBasePath, ToTypeInfoAsWritten, *ToLParenLocOrErr, 6770 *ToRParenLocOrErr); 6771 } 6772 6773 case Stmt::CXXFunctionalCastExprClass: { 6774 auto *FCE = cast<CXXFunctionalCastExpr>(E); 6775 ExpectedSLoc ToLParenLocOrErr = import(FCE->getLParenLoc()); 6776 if (!ToLParenLocOrErr) 6777 return ToLParenLocOrErr.takeError(); 6778 ExpectedSLoc ToRParenLocOrErr = import(FCE->getRParenLoc()); 6779 if (!ToRParenLocOrErr) 6780 return ToRParenLocOrErr.takeError(); 6781 return CXXFunctionalCastExpr::Create( 6782 Importer.getToContext(), ToType, E->getValueKind(), ToTypeInfoAsWritten, 6783 E->getCastKind(), ToSubExpr, ToBasePath, *ToLParenLocOrErr, 6784 *ToRParenLocOrErr); 6785 } 6786 6787 case Stmt::ObjCBridgedCastExprClass: { 6788 auto *OCE = cast<ObjCBridgedCastExpr>(E); 6789 ExpectedSLoc ToLParenLocOrErr = import(OCE->getLParenLoc()); 6790 if (!ToLParenLocOrErr) 6791 return ToLParenLocOrErr.takeError(); 6792 ExpectedSLoc ToBridgeKeywordLocOrErr = import(OCE->getBridgeKeywordLoc()); 6793 if (!ToBridgeKeywordLocOrErr) 6794 return ToBridgeKeywordLocOrErr.takeError(); 6795 return new (Importer.getToContext()) ObjCBridgedCastExpr( 6796 *ToLParenLocOrErr, OCE->getBridgeKind(), E->getCastKind(), 6797 *ToBridgeKeywordLocOrErr, ToTypeInfoAsWritten, ToSubExpr); 6798 } 6799 default: 6800 llvm_unreachable("Cast expression of unsupported type!"); 6801 return make_error<ImportError>(ImportError::UnsupportedConstruct); 6802 } 6803 } 6804 6805 ExpectedStmt ASTNodeImporter::VisitOffsetOfExpr(OffsetOfExpr *E) { 6806 SmallVector<OffsetOfNode, 4> ToNodes; 6807 for (int I = 0, N = E->getNumComponents(); I < N; ++I) { 6808 const OffsetOfNode &FromNode = E->getComponent(I); 6809 6810 SourceLocation ToBeginLoc, ToEndLoc; 6811 if (FromNode.getKind() != OffsetOfNode::Base) { 6812 auto Imp = importSeq(FromNode.getBeginLoc(), FromNode.getEndLoc()); 6813 if (!Imp) 6814 return Imp.takeError(); 6815 std::tie(ToBeginLoc, ToEndLoc) = *Imp; 6816 } 6817 6818 switch (FromNode.getKind()) { 6819 case OffsetOfNode::Array: 6820 ToNodes.push_back( 6821 OffsetOfNode(ToBeginLoc, FromNode.getArrayExprIndex(), ToEndLoc)); 6822 break; 6823 case OffsetOfNode::Base: { 6824 auto ToBSOrErr = import(FromNode.getBase()); 6825 if (!ToBSOrErr) 6826 return ToBSOrErr.takeError(); 6827 ToNodes.push_back(OffsetOfNode(*ToBSOrErr)); 6828 break; 6829 } 6830 case OffsetOfNode::Field: { 6831 auto ToFieldOrErr = import(FromNode.getField()); 6832 if (!ToFieldOrErr) 6833 return ToFieldOrErr.takeError(); 6834 ToNodes.push_back(OffsetOfNode(ToBeginLoc, *ToFieldOrErr, ToEndLoc)); 6835 break; 6836 } 6837 case OffsetOfNode::Identifier: { 6838 IdentifierInfo *ToII = Importer.Import(FromNode.getFieldName()); 6839 ToNodes.push_back(OffsetOfNode(ToBeginLoc, ToII, ToEndLoc)); 6840 break; 6841 } 6842 } 6843 } 6844 6845 SmallVector<Expr *, 4> ToExprs(E->getNumExpressions()); 6846 for (int I = 0, N = E->getNumExpressions(); I < N; ++I) { 6847 ExpectedExpr ToIndexExprOrErr = import(E->getIndexExpr(I)); 6848 if (!ToIndexExprOrErr) 6849 return ToIndexExprOrErr.takeError(); 6850 ToExprs[I] = *ToIndexExprOrErr; 6851 } 6852 6853 auto Imp = importSeq( 6854 E->getType(), E->getTypeSourceInfo(), E->getOperatorLoc(), 6855 E->getRParenLoc()); 6856 if (!Imp) 6857 return Imp.takeError(); 6858 6859 QualType ToType; 6860 TypeSourceInfo *ToTypeSourceInfo; 6861 SourceLocation ToOperatorLoc, ToRParenLoc; 6862 std::tie(ToType, ToTypeSourceInfo, ToOperatorLoc, ToRParenLoc) = *Imp; 6863 6864 return OffsetOfExpr::Create( 6865 Importer.getToContext(), ToType, ToOperatorLoc, ToTypeSourceInfo, ToNodes, 6866 ToExprs, ToRParenLoc); 6867 } 6868 6869 ExpectedStmt ASTNodeImporter::VisitCXXNoexceptExpr(CXXNoexceptExpr *E) { 6870 auto Imp = importSeq( 6871 E->getType(), E->getOperand(), E->getBeginLoc(), E->getEndLoc()); 6872 if (!Imp) 6873 return Imp.takeError(); 6874 6875 QualType ToType; 6876 Expr *ToOperand; 6877 SourceLocation ToBeginLoc, ToEndLoc; 6878 std::tie(ToType, ToOperand, ToBeginLoc, ToEndLoc) = *Imp; 6879 6880 CanThrowResult ToCanThrow; 6881 if (E->isValueDependent()) 6882 ToCanThrow = CT_Dependent; 6883 else 6884 ToCanThrow = E->getValue() ? CT_Can : CT_Cannot; 6885 6886 return new (Importer.getToContext()) CXXNoexceptExpr( 6887 ToType, ToOperand, ToCanThrow, ToBeginLoc, ToEndLoc); 6888 } 6889 6890 ExpectedStmt ASTNodeImporter::VisitCXXThrowExpr(CXXThrowExpr *E) { 6891 auto Imp = importSeq(E->getSubExpr(), E->getType(), E->getThrowLoc()); 6892 if (!Imp) 6893 return Imp.takeError(); 6894 6895 Expr *ToSubExpr; 6896 QualType ToType; 6897 SourceLocation ToThrowLoc; 6898 std::tie(ToSubExpr, ToType, ToThrowLoc) = *Imp; 6899 6900 return new (Importer.getToContext()) CXXThrowExpr( 6901 ToSubExpr, ToType, ToThrowLoc, E->isThrownVariableInScope()); 6902 } 6903 6904 ExpectedStmt ASTNodeImporter::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E) { 6905 ExpectedSLoc ToUsedLocOrErr = import(E->getUsedLocation()); 6906 if (!ToUsedLocOrErr) 6907 return ToUsedLocOrErr.takeError(); 6908 6909 auto ToParamOrErr = import(E->getParam()); 6910 if (!ToParamOrErr) 6911 return ToParamOrErr.takeError(); 6912 6913 auto UsedContextOrErr = Importer.ImportContext(E->getUsedContext()); 6914 if (!UsedContextOrErr) 6915 return UsedContextOrErr.takeError(); 6916 6917 // Import the default arg if it was not imported yet. 6918 // This is needed because it can happen that during the import of the 6919 // default expression (from VisitParmVarDecl) the same ParmVarDecl is 6920 // encountered here. The default argument for a ParmVarDecl is set in the 6921 // ParmVarDecl only after it is imported (set in VisitParmVarDecl if not here, 6922 // see VisitParmVarDecl). 6923 ParmVarDecl *ToParam = *ToParamOrErr; 6924 if (!ToParam->getDefaultArg()) { 6925 Optional<ParmVarDecl *> FromParam = Importer.getImportedFromDecl(ToParam); 6926 assert(FromParam && "ParmVarDecl was not imported?"); 6927 6928 if (Error Err = ImportDefaultArgOfParmVarDecl(*FromParam, ToParam)) 6929 return std::move(Err); 6930 } 6931 6932 return CXXDefaultArgExpr::Create(Importer.getToContext(), *ToUsedLocOrErr, 6933 *ToParamOrErr, *UsedContextOrErr); 6934 } 6935 6936 ExpectedStmt 6937 ASTNodeImporter::VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E) { 6938 auto Imp = importSeq( 6939 E->getType(), E->getTypeSourceInfo(), E->getRParenLoc()); 6940 if (!Imp) 6941 return Imp.takeError(); 6942 6943 QualType ToType; 6944 TypeSourceInfo *ToTypeSourceInfo; 6945 SourceLocation ToRParenLoc; 6946 std::tie(ToType, ToTypeSourceInfo, ToRParenLoc) = *Imp; 6947 6948 return new (Importer.getToContext()) CXXScalarValueInitExpr( 6949 ToType, ToTypeSourceInfo, ToRParenLoc); 6950 } 6951 6952 ExpectedStmt 6953 ASTNodeImporter::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { 6954 ExpectedExpr ToSubExprOrErr = import(E->getSubExpr()); 6955 if (!ToSubExprOrErr) 6956 return ToSubExprOrErr.takeError(); 6957 6958 auto ToDtorOrErr = import(E->getTemporary()->getDestructor()); 6959 if (!ToDtorOrErr) 6960 return ToDtorOrErr.takeError(); 6961 6962 ASTContext &ToCtx = Importer.getToContext(); 6963 CXXTemporary *Temp = CXXTemporary::Create(ToCtx, *ToDtorOrErr); 6964 return CXXBindTemporaryExpr::Create(ToCtx, Temp, *ToSubExprOrErr); 6965 } 6966 6967 ExpectedStmt 6968 ASTNodeImporter::VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E) { 6969 auto Imp = importSeq( 6970 E->getConstructor(), E->getType(), E->getTypeSourceInfo(), 6971 E->getParenOrBraceRange()); 6972 if (!Imp) 6973 return Imp.takeError(); 6974 6975 CXXConstructorDecl *ToConstructor; 6976 QualType ToType; 6977 TypeSourceInfo *ToTypeSourceInfo; 6978 SourceRange ToParenOrBraceRange; 6979 std::tie(ToConstructor, ToType, ToTypeSourceInfo, ToParenOrBraceRange) = *Imp; 6980 6981 SmallVector<Expr *, 8> ToArgs(E->getNumArgs()); 6982 if (Error Err = ImportContainerChecked(E->arguments(), ToArgs)) 6983 return std::move(Err); 6984 6985 return CXXTemporaryObjectExpr::Create( 6986 Importer.getToContext(), ToConstructor, ToType, ToTypeSourceInfo, ToArgs, 6987 ToParenOrBraceRange, E->hadMultipleCandidates(), 6988 E->isListInitialization(), E->isStdInitListInitialization(), 6989 E->requiresZeroInitialization()); 6990 } 6991 6992 ExpectedStmt 6993 ASTNodeImporter::VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *E) { 6994 auto Imp = importSeq( 6995 E->getType(), E->GetTemporaryExpr(), E->getExtendingDecl()); 6996 if (!Imp) 6997 return Imp.takeError(); 6998 6999 QualType ToType; 7000 Expr *ToTemporaryExpr; 7001 const ValueDecl *ToExtendingDecl; 7002 std::tie(ToType, ToTemporaryExpr, ToExtendingDecl) = *Imp; 7003 7004 auto *ToMTE = new (Importer.getToContext()) MaterializeTemporaryExpr( 7005 ToType, ToTemporaryExpr, E->isBoundToLvalueReference()); 7006 7007 // FIXME: Should ManglingNumber get numbers associated with 'to' context? 7008 ToMTE->setExtendingDecl(ToExtendingDecl, E->getManglingNumber()); 7009 return ToMTE; 7010 } 7011 7012 ExpectedStmt ASTNodeImporter::VisitPackExpansionExpr(PackExpansionExpr *E) { 7013 auto Imp = importSeq( 7014 E->getType(), E->getPattern(), E->getEllipsisLoc()); 7015 if (!Imp) 7016 return Imp.takeError(); 7017 7018 QualType ToType; 7019 Expr *ToPattern; 7020 SourceLocation ToEllipsisLoc; 7021 std::tie(ToType, ToPattern, ToEllipsisLoc) = *Imp; 7022 7023 return new (Importer.getToContext()) PackExpansionExpr( 7024 ToType, ToPattern, ToEllipsisLoc, E->getNumExpansions()); 7025 } 7026 7027 ExpectedStmt ASTNodeImporter::VisitSizeOfPackExpr(SizeOfPackExpr *E) { 7028 auto Imp = importSeq( 7029 E->getOperatorLoc(), E->getPack(), E->getPackLoc(), E->getRParenLoc()); 7030 if (!Imp) 7031 return Imp.takeError(); 7032 7033 SourceLocation ToOperatorLoc, ToPackLoc, ToRParenLoc; 7034 NamedDecl *ToPack; 7035 std::tie(ToOperatorLoc, ToPack, ToPackLoc, ToRParenLoc) = *Imp; 7036 7037 Optional<unsigned> Length; 7038 if (!E->isValueDependent()) 7039 Length = E->getPackLength(); 7040 7041 SmallVector<TemplateArgument, 8> ToPartialArguments; 7042 if (E->isPartiallySubstituted()) { 7043 if (Error Err = ImportTemplateArguments( 7044 E->getPartialArguments().data(), 7045 E->getPartialArguments().size(), 7046 ToPartialArguments)) 7047 return std::move(Err); 7048 } 7049 7050 return SizeOfPackExpr::Create( 7051 Importer.getToContext(), ToOperatorLoc, ToPack, ToPackLoc, ToRParenLoc, 7052 Length, ToPartialArguments); 7053 } 7054 7055 7056 ExpectedStmt ASTNodeImporter::VisitCXXNewExpr(CXXNewExpr *E) { 7057 auto Imp = importSeq( 7058 E->getOperatorNew(), E->getOperatorDelete(), E->getTypeIdParens(), 7059 E->getArraySize(), E->getInitializer(), E->getType(), 7060 E->getAllocatedTypeSourceInfo(), E->getSourceRange(), 7061 E->getDirectInitRange()); 7062 if (!Imp) 7063 return Imp.takeError(); 7064 7065 FunctionDecl *ToOperatorNew, *ToOperatorDelete; 7066 SourceRange ToTypeIdParens, ToSourceRange, ToDirectInitRange; 7067 Optional<Expr *> ToArraySize; 7068 Expr *ToInitializer; 7069 QualType ToType; 7070 TypeSourceInfo *ToAllocatedTypeSourceInfo; 7071 std::tie( 7072 ToOperatorNew, ToOperatorDelete, ToTypeIdParens, ToArraySize, ToInitializer, 7073 ToType, ToAllocatedTypeSourceInfo, ToSourceRange, ToDirectInitRange) = *Imp; 7074 7075 SmallVector<Expr *, 4> ToPlacementArgs(E->getNumPlacementArgs()); 7076 if (Error Err = 7077 ImportContainerChecked(E->placement_arguments(), ToPlacementArgs)) 7078 return std::move(Err); 7079 7080 return CXXNewExpr::Create( 7081 Importer.getToContext(), E->isGlobalNew(), ToOperatorNew, 7082 ToOperatorDelete, E->passAlignment(), E->doesUsualArrayDeleteWantSize(), 7083 ToPlacementArgs, ToTypeIdParens, ToArraySize, E->getInitializationStyle(), 7084 ToInitializer, ToType, ToAllocatedTypeSourceInfo, ToSourceRange, 7085 ToDirectInitRange); 7086 } 7087 7088 ExpectedStmt ASTNodeImporter::VisitCXXDeleteExpr(CXXDeleteExpr *E) { 7089 auto Imp = importSeq( 7090 E->getType(), E->getOperatorDelete(), E->getArgument(), E->getBeginLoc()); 7091 if (!Imp) 7092 return Imp.takeError(); 7093 7094 QualType ToType; 7095 FunctionDecl *ToOperatorDelete; 7096 Expr *ToArgument; 7097 SourceLocation ToBeginLoc; 7098 std::tie(ToType, ToOperatorDelete, ToArgument, ToBeginLoc) = *Imp; 7099 7100 return new (Importer.getToContext()) CXXDeleteExpr( 7101 ToType, E->isGlobalDelete(), E->isArrayForm(), E->isArrayFormAsWritten(), 7102 E->doesUsualArrayDeleteWantSize(), ToOperatorDelete, ToArgument, 7103 ToBeginLoc); 7104 } 7105 7106 ExpectedStmt ASTNodeImporter::VisitCXXConstructExpr(CXXConstructExpr *E) { 7107 auto Imp = importSeq( 7108 E->getType(), E->getLocation(), E->getConstructor(), 7109 E->getParenOrBraceRange()); 7110 if (!Imp) 7111 return Imp.takeError(); 7112 7113 QualType ToType; 7114 SourceLocation ToLocation; 7115 CXXConstructorDecl *ToConstructor; 7116 SourceRange ToParenOrBraceRange; 7117 std::tie(ToType, ToLocation, ToConstructor, ToParenOrBraceRange) = *Imp; 7118 7119 SmallVector<Expr *, 6> ToArgs(E->getNumArgs()); 7120 if (Error Err = ImportContainerChecked(E->arguments(), ToArgs)) 7121 return std::move(Err); 7122 7123 return CXXConstructExpr::Create( 7124 Importer.getToContext(), ToType, ToLocation, ToConstructor, 7125 E->isElidable(), ToArgs, E->hadMultipleCandidates(), 7126 E->isListInitialization(), E->isStdInitListInitialization(), 7127 E->requiresZeroInitialization(), E->getConstructionKind(), 7128 ToParenOrBraceRange); 7129 } 7130 7131 ExpectedStmt ASTNodeImporter::VisitExprWithCleanups(ExprWithCleanups *E) { 7132 ExpectedExpr ToSubExprOrErr = import(E->getSubExpr()); 7133 if (!ToSubExprOrErr) 7134 return ToSubExprOrErr.takeError(); 7135 7136 SmallVector<ExprWithCleanups::CleanupObject, 8> ToObjects(E->getNumObjects()); 7137 if (Error Err = ImportContainerChecked(E->getObjects(), ToObjects)) 7138 return std::move(Err); 7139 7140 return ExprWithCleanups::Create( 7141 Importer.getToContext(), *ToSubExprOrErr, E->cleanupsHaveSideEffects(), 7142 ToObjects); 7143 } 7144 7145 ExpectedStmt ASTNodeImporter::VisitCXXMemberCallExpr(CXXMemberCallExpr *E) { 7146 auto Imp = importSeq( 7147 E->getCallee(), E->getType(), E->getRParenLoc()); 7148 if (!Imp) 7149 return Imp.takeError(); 7150 7151 Expr *ToCallee; 7152 QualType ToType; 7153 SourceLocation ToRParenLoc; 7154 std::tie(ToCallee, ToType, ToRParenLoc) = *Imp; 7155 7156 SmallVector<Expr *, 4> ToArgs(E->getNumArgs()); 7157 if (Error Err = ImportContainerChecked(E->arguments(), ToArgs)) 7158 return std::move(Err); 7159 7160 return CXXMemberCallExpr::Create(Importer.getToContext(), ToCallee, ToArgs, 7161 ToType, E->getValueKind(), ToRParenLoc); 7162 } 7163 7164 ExpectedStmt ASTNodeImporter::VisitCXXThisExpr(CXXThisExpr *E) { 7165 ExpectedType ToTypeOrErr = import(E->getType()); 7166 if (!ToTypeOrErr) 7167 return ToTypeOrErr.takeError(); 7168 7169 ExpectedSLoc ToLocationOrErr = import(E->getLocation()); 7170 if (!ToLocationOrErr) 7171 return ToLocationOrErr.takeError(); 7172 7173 return new (Importer.getToContext()) CXXThisExpr( 7174 *ToLocationOrErr, *ToTypeOrErr, E->isImplicit()); 7175 } 7176 7177 ExpectedStmt ASTNodeImporter::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { 7178 ExpectedType ToTypeOrErr = import(E->getType()); 7179 if (!ToTypeOrErr) 7180 return ToTypeOrErr.takeError(); 7181 7182 ExpectedSLoc ToLocationOrErr = import(E->getLocation()); 7183 if (!ToLocationOrErr) 7184 return ToLocationOrErr.takeError(); 7185 7186 return new (Importer.getToContext()) CXXBoolLiteralExpr( 7187 E->getValue(), *ToTypeOrErr, *ToLocationOrErr); 7188 } 7189 7190 ExpectedStmt ASTNodeImporter::VisitMemberExpr(MemberExpr *E) { 7191 auto Imp1 = importSeq( 7192 E->getBase(), E->getOperatorLoc(), E->getQualifierLoc(), 7193 E->getTemplateKeywordLoc(), E->getMemberDecl(), E->getType()); 7194 if (!Imp1) 7195 return Imp1.takeError(); 7196 7197 Expr *ToBase; 7198 SourceLocation ToOperatorLoc, ToTemplateKeywordLoc; 7199 NestedNameSpecifierLoc ToQualifierLoc; 7200 ValueDecl *ToMemberDecl; 7201 QualType ToType; 7202 std::tie( 7203 ToBase, ToOperatorLoc, ToQualifierLoc, ToTemplateKeywordLoc, ToMemberDecl, 7204 ToType) = *Imp1; 7205 7206 auto Imp2 = importSeq( 7207 E->getFoundDecl().getDecl(), E->getMemberNameInfo().getName(), 7208 E->getMemberNameInfo().getLoc(), E->getLAngleLoc(), E->getRAngleLoc()); 7209 if (!Imp2) 7210 return Imp2.takeError(); 7211 NamedDecl *ToDecl; 7212 DeclarationName ToName; 7213 SourceLocation ToLoc, ToLAngleLoc, ToRAngleLoc; 7214 std::tie(ToDecl, ToName, ToLoc, ToLAngleLoc, ToRAngleLoc) = *Imp2; 7215 7216 DeclAccessPair ToFoundDecl = 7217 DeclAccessPair::make(ToDecl, E->getFoundDecl().getAccess()); 7218 7219 DeclarationNameInfo ToMemberNameInfo(ToName, ToLoc); 7220 7221 TemplateArgumentListInfo ToTAInfo, *ResInfo = nullptr; 7222 if (E->hasExplicitTemplateArgs()) { 7223 if (Error Err = 7224 ImportTemplateArgumentListInfo(E->getLAngleLoc(), E->getRAngleLoc(), 7225 E->template_arguments(), ToTAInfo)) 7226 return std::move(Err); 7227 ResInfo = &ToTAInfo; 7228 } 7229 7230 return MemberExpr::Create(Importer.getToContext(), ToBase, E->isArrow(), 7231 ToOperatorLoc, ToQualifierLoc, ToTemplateKeywordLoc, 7232 ToMemberDecl, ToFoundDecl, ToMemberNameInfo, 7233 ResInfo, ToType, E->getValueKind(), 7234 E->getObjectKind(), E->isNonOdrUse()); 7235 } 7236 7237 ExpectedStmt 7238 ASTNodeImporter::VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E) { 7239 auto Imp = importSeq( 7240 E->getBase(), E->getOperatorLoc(), E->getQualifierLoc(), 7241 E->getScopeTypeInfo(), E->getColonColonLoc(), E->getTildeLoc()); 7242 if (!Imp) 7243 return Imp.takeError(); 7244 7245 Expr *ToBase; 7246 SourceLocation ToOperatorLoc, ToColonColonLoc, ToTildeLoc; 7247 NestedNameSpecifierLoc ToQualifierLoc; 7248 TypeSourceInfo *ToScopeTypeInfo; 7249 std::tie( 7250 ToBase, ToOperatorLoc, ToQualifierLoc, ToScopeTypeInfo, ToColonColonLoc, 7251 ToTildeLoc) = *Imp; 7252 7253 PseudoDestructorTypeStorage Storage; 7254 if (IdentifierInfo *FromII = E->getDestroyedTypeIdentifier()) { 7255 IdentifierInfo *ToII = Importer.Import(FromII); 7256 ExpectedSLoc ToDestroyedTypeLocOrErr = import(E->getDestroyedTypeLoc()); 7257 if (!ToDestroyedTypeLocOrErr) 7258 return ToDestroyedTypeLocOrErr.takeError(); 7259 Storage = PseudoDestructorTypeStorage(ToII, *ToDestroyedTypeLocOrErr); 7260 } else { 7261 if (auto ToTIOrErr = import(E->getDestroyedTypeInfo())) 7262 Storage = PseudoDestructorTypeStorage(*ToTIOrErr); 7263 else 7264 return ToTIOrErr.takeError(); 7265 } 7266 7267 return new (Importer.getToContext()) CXXPseudoDestructorExpr( 7268 Importer.getToContext(), ToBase, E->isArrow(), ToOperatorLoc, 7269 ToQualifierLoc, ToScopeTypeInfo, ToColonColonLoc, ToTildeLoc, Storage); 7270 } 7271 7272 ExpectedStmt ASTNodeImporter::VisitCXXDependentScopeMemberExpr( 7273 CXXDependentScopeMemberExpr *E) { 7274 auto Imp = importSeq( 7275 E->getType(), E->getOperatorLoc(), E->getQualifierLoc(), 7276 E->getTemplateKeywordLoc(), E->getFirstQualifierFoundInScope()); 7277 if (!Imp) 7278 return Imp.takeError(); 7279 7280 QualType ToType; 7281 SourceLocation ToOperatorLoc, ToTemplateKeywordLoc; 7282 NestedNameSpecifierLoc ToQualifierLoc; 7283 NamedDecl *ToFirstQualifierFoundInScope; 7284 std::tie( 7285 ToType, ToOperatorLoc, ToQualifierLoc, ToTemplateKeywordLoc, 7286 ToFirstQualifierFoundInScope) = *Imp; 7287 7288 Expr *ToBase = nullptr; 7289 if (!E->isImplicitAccess()) { 7290 if (ExpectedExpr ToBaseOrErr = import(E->getBase())) 7291 ToBase = *ToBaseOrErr; 7292 else 7293 return ToBaseOrErr.takeError(); 7294 } 7295 7296 TemplateArgumentListInfo ToTAInfo, *ResInfo = nullptr; 7297 if (E->hasExplicitTemplateArgs()) { 7298 if (Error Err = ImportTemplateArgumentListInfo( 7299 E->getLAngleLoc(), E->getRAngleLoc(), E->template_arguments(), 7300 ToTAInfo)) 7301 return std::move(Err); 7302 ResInfo = &ToTAInfo; 7303 } 7304 7305 auto ToMemberNameInfoOrErr = importSeq(E->getMember(), E->getMemberLoc()); 7306 if (!ToMemberNameInfoOrErr) 7307 return ToMemberNameInfoOrErr.takeError(); 7308 DeclarationNameInfo ToMemberNameInfo( 7309 std::get<0>(*ToMemberNameInfoOrErr), std::get<1>(*ToMemberNameInfoOrErr)); 7310 // Import additional name location/type info. 7311 if (Error Err = ImportDeclarationNameLoc( 7312 E->getMemberNameInfo(), ToMemberNameInfo)) 7313 return std::move(Err); 7314 7315 return CXXDependentScopeMemberExpr::Create( 7316 Importer.getToContext(), ToBase, ToType, E->isArrow(), ToOperatorLoc, 7317 ToQualifierLoc, ToTemplateKeywordLoc, ToFirstQualifierFoundInScope, 7318 ToMemberNameInfo, ResInfo); 7319 } 7320 7321 ExpectedStmt 7322 ASTNodeImporter::VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E) { 7323 auto Imp = importSeq( 7324 E->getQualifierLoc(), E->getTemplateKeywordLoc(), E->getDeclName(), 7325 E->getExprLoc(), E->getLAngleLoc(), E->getRAngleLoc()); 7326 if (!Imp) 7327 return Imp.takeError(); 7328 7329 NestedNameSpecifierLoc ToQualifierLoc; 7330 SourceLocation ToTemplateKeywordLoc, ToExprLoc, ToLAngleLoc, ToRAngleLoc; 7331 DeclarationName ToDeclName; 7332 std::tie( 7333 ToQualifierLoc, ToTemplateKeywordLoc, ToDeclName, ToExprLoc, 7334 ToLAngleLoc, ToRAngleLoc) = *Imp; 7335 7336 DeclarationNameInfo ToNameInfo(ToDeclName, ToExprLoc); 7337 if (Error Err = ImportDeclarationNameLoc(E->getNameInfo(), ToNameInfo)) 7338 return std::move(Err); 7339 7340 TemplateArgumentListInfo ToTAInfo(ToLAngleLoc, ToRAngleLoc); 7341 TemplateArgumentListInfo *ResInfo = nullptr; 7342 if (E->hasExplicitTemplateArgs()) { 7343 if (Error Err = 7344 ImportTemplateArgumentListInfo(E->template_arguments(), ToTAInfo)) 7345 return std::move(Err); 7346 ResInfo = &ToTAInfo; 7347 } 7348 7349 return DependentScopeDeclRefExpr::Create( 7350 Importer.getToContext(), ToQualifierLoc, ToTemplateKeywordLoc, 7351 ToNameInfo, ResInfo); 7352 } 7353 7354 ExpectedStmt ASTNodeImporter::VisitCXXUnresolvedConstructExpr( 7355 CXXUnresolvedConstructExpr *E) { 7356 auto Imp = importSeq( 7357 E->getLParenLoc(), E->getRParenLoc(), E->getTypeSourceInfo()); 7358 if (!Imp) 7359 return Imp.takeError(); 7360 7361 SourceLocation ToLParenLoc, ToRParenLoc; 7362 TypeSourceInfo *ToTypeSourceInfo; 7363 std::tie(ToLParenLoc, ToRParenLoc, ToTypeSourceInfo) = *Imp; 7364 7365 SmallVector<Expr *, 8> ToArgs(E->arg_size()); 7366 if (Error Err = 7367 ImportArrayChecked(E->arg_begin(), E->arg_end(), ToArgs.begin())) 7368 return std::move(Err); 7369 7370 return CXXUnresolvedConstructExpr::Create( 7371 Importer.getToContext(), ToTypeSourceInfo, ToLParenLoc, 7372 llvm::makeArrayRef(ToArgs), ToRParenLoc); 7373 } 7374 7375 ExpectedStmt 7376 ASTNodeImporter::VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E) { 7377 Expected<CXXRecordDecl *> ToNamingClassOrErr = import(E->getNamingClass()); 7378 if (!ToNamingClassOrErr) 7379 return ToNamingClassOrErr.takeError(); 7380 7381 auto ToQualifierLocOrErr = import(E->getQualifierLoc()); 7382 if (!ToQualifierLocOrErr) 7383 return ToQualifierLocOrErr.takeError(); 7384 7385 auto ToNameInfoOrErr = importSeq(E->getName(), E->getNameLoc()); 7386 if (!ToNameInfoOrErr) 7387 return ToNameInfoOrErr.takeError(); 7388 DeclarationNameInfo ToNameInfo( 7389 std::get<0>(*ToNameInfoOrErr), std::get<1>(*ToNameInfoOrErr)); 7390 // Import additional name location/type info. 7391 if (Error Err = ImportDeclarationNameLoc(E->getNameInfo(), ToNameInfo)) 7392 return std::move(Err); 7393 7394 UnresolvedSet<8> ToDecls; 7395 for (auto *D : E->decls()) 7396 if (auto ToDOrErr = import(D)) 7397 ToDecls.addDecl(cast<NamedDecl>(*ToDOrErr)); 7398 else 7399 return ToDOrErr.takeError(); 7400 7401 if (E->hasExplicitTemplateArgs() && E->getTemplateKeywordLoc().isValid()) { 7402 TemplateArgumentListInfo ToTAInfo; 7403 if (Error Err = ImportTemplateArgumentListInfo( 7404 E->getLAngleLoc(), E->getRAngleLoc(), E->template_arguments(), 7405 ToTAInfo)) 7406 return std::move(Err); 7407 7408 ExpectedSLoc ToTemplateKeywordLocOrErr = import(E->getTemplateKeywordLoc()); 7409 if (!ToTemplateKeywordLocOrErr) 7410 return ToTemplateKeywordLocOrErr.takeError(); 7411 7412 return UnresolvedLookupExpr::Create( 7413 Importer.getToContext(), *ToNamingClassOrErr, *ToQualifierLocOrErr, 7414 *ToTemplateKeywordLocOrErr, ToNameInfo, E->requiresADL(), &ToTAInfo, 7415 ToDecls.begin(), ToDecls.end()); 7416 } 7417 7418 return UnresolvedLookupExpr::Create( 7419 Importer.getToContext(), *ToNamingClassOrErr, *ToQualifierLocOrErr, 7420 ToNameInfo, E->requiresADL(), E->isOverloaded(), ToDecls.begin(), 7421 ToDecls.end()); 7422 } 7423 7424 ExpectedStmt 7425 ASTNodeImporter::VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E) { 7426 auto Imp1 = importSeq( 7427 E->getType(), E->getOperatorLoc(), E->getQualifierLoc(), 7428 E->getTemplateKeywordLoc()); 7429 if (!Imp1) 7430 return Imp1.takeError(); 7431 7432 QualType ToType; 7433 SourceLocation ToOperatorLoc, ToTemplateKeywordLoc; 7434 NestedNameSpecifierLoc ToQualifierLoc; 7435 std::tie(ToType, ToOperatorLoc, ToQualifierLoc, ToTemplateKeywordLoc) = *Imp1; 7436 7437 auto Imp2 = importSeq(E->getName(), E->getNameLoc()); 7438 if (!Imp2) 7439 return Imp2.takeError(); 7440 DeclarationNameInfo ToNameInfo(std::get<0>(*Imp2), std::get<1>(*Imp2)); 7441 // Import additional name location/type info. 7442 if (Error Err = ImportDeclarationNameLoc(E->getNameInfo(), ToNameInfo)) 7443 return std::move(Err); 7444 7445 UnresolvedSet<8> ToDecls; 7446 for (Decl *D : E->decls()) 7447 if (auto ToDOrErr = import(D)) 7448 ToDecls.addDecl(cast<NamedDecl>(*ToDOrErr)); 7449 else 7450 return ToDOrErr.takeError(); 7451 7452 TemplateArgumentListInfo ToTAInfo; 7453 TemplateArgumentListInfo *ResInfo = nullptr; 7454 if (E->hasExplicitTemplateArgs()) { 7455 if (Error Err = 7456 ImportTemplateArgumentListInfo(E->template_arguments(), ToTAInfo)) 7457 return std::move(Err); 7458 ResInfo = &ToTAInfo; 7459 } 7460 7461 Expr *ToBase = nullptr; 7462 if (!E->isImplicitAccess()) { 7463 if (ExpectedExpr ToBaseOrErr = import(E->getBase())) 7464 ToBase = *ToBaseOrErr; 7465 else 7466 return ToBaseOrErr.takeError(); 7467 } 7468 7469 return UnresolvedMemberExpr::Create( 7470 Importer.getToContext(), E->hasUnresolvedUsing(), ToBase, ToType, 7471 E->isArrow(), ToOperatorLoc, ToQualifierLoc, ToTemplateKeywordLoc, 7472 ToNameInfo, ResInfo, ToDecls.begin(), ToDecls.end()); 7473 } 7474 7475 ExpectedStmt ASTNodeImporter::VisitCallExpr(CallExpr *E) { 7476 auto Imp = importSeq(E->getCallee(), E->getType(), E->getRParenLoc()); 7477 if (!Imp) 7478 return Imp.takeError(); 7479 7480 Expr *ToCallee; 7481 QualType ToType; 7482 SourceLocation ToRParenLoc; 7483 std::tie(ToCallee, ToType, ToRParenLoc) = *Imp; 7484 7485 unsigned NumArgs = E->getNumArgs(); 7486 llvm::SmallVector<Expr *, 2> ToArgs(NumArgs); 7487 if (Error Err = ImportContainerChecked(E->arguments(), ToArgs)) 7488 return std::move(Err); 7489 7490 if (const auto *OCE = dyn_cast<CXXOperatorCallExpr>(E)) { 7491 return CXXOperatorCallExpr::Create( 7492 Importer.getToContext(), OCE->getOperator(), ToCallee, ToArgs, ToType, 7493 OCE->getValueKind(), ToRParenLoc, OCE->getFPFeatures(), 7494 OCE->getADLCallKind()); 7495 } 7496 7497 return CallExpr::Create(Importer.getToContext(), ToCallee, ToArgs, ToType, 7498 E->getValueKind(), ToRParenLoc, /*MinNumArgs=*/0, 7499 E->getADLCallKind()); 7500 } 7501 7502 ExpectedStmt ASTNodeImporter::VisitLambdaExpr(LambdaExpr *E) { 7503 CXXRecordDecl *FromClass = E->getLambdaClass(); 7504 auto ToClassOrErr = import(FromClass); 7505 if (!ToClassOrErr) 7506 return ToClassOrErr.takeError(); 7507 CXXRecordDecl *ToClass = *ToClassOrErr; 7508 7509 auto ToCallOpOrErr = import(E->getCallOperator()); 7510 if (!ToCallOpOrErr) 7511 return ToCallOpOrErr.takeError(); 7512 7513 SmallVector<LambdaCapture, 8> ToCaptures; 7514 ToCaptures.reserve(E->capture_size()); 7515 for (const auto &FromCapture : E->captures()) { 7516 if (auto ToCaptureOrErr = import(FromCapture)) 7517 ToCaptures.push_back(*ToCaptureOrErr); 7518 else 7519 return ToCaptureOrErr.takeError(); 7520 } 7521 7522 SmallVector<Expr *, 8> ToCaptureInits(E->capture_size()); 7523 if (Error Err = ImportContainerChecked(E->capture_inits(), ToCaptureInits)) 7524 return std::move(Err); 7525 7526 auto Imp = importSeq( 7527 E->getIntroducerRange(), E->getCaptureDefaultLoc(), E->getEndLoc()); 7528 if (!Imp) 7529 return Imp.takeError(); 7530 7531 SourceRange ToIntroducerRange; 7532 SourceLocation ToCaptureDefaultLoc, ToEndLoc; 7533 std::tie(ToIntroducerRange, ToCaptureDefaultLoc, ToEndLoc) = *Imp; 7534 7535 return LambdaExpr::Create( 7536 Importer.getToContext(), ToClass, ToIntroducerRange, 7537 E->getCaptureDefault(), ToCaptureDefaultLoc, ToCaptures, 7538 E->hasExplicitParameters(), E->hasExplicitResultType(), ToCaptureInits, 7539 ToEndLoc, E->containsUnexpandedParameterPack()); 7540 } 7541 7542 7543 ExpectedStmt ASTNodeImporter::VisitInitListExpr(InitListExpr *E) { 7544 auto Imp = importSeq(E->getLBraceLoc(), E->getRBraceLoc(), E->getType()); 7545 if (!Imp) 7546 return Imp.takeError(); 7547 7548 SourceLocation ToLBraceLoc, ToRBraceLoc; 7549 QualType ToType; 7550 std::tie(ToLBraceLoc, ToRBraceLoc, ToType) = *Imp; 7551 7552 SmallVector<Expr *, 4> ToExprs(E->getNumInits()); 7553 if (Error Err = ImportContainerChecked(E->inits(), ToExprs)) 7554 return std::move(Err); 7555 7556 ASTContext &ToCtx = Importer.getToContext(); 7557 InitListExpr *To = new (ToCtx) InitListExpr( 7558 ToCtx, ToLBraceLoc, ToExprs, ToRBraceLoc); 7559 To->setType(ToType); 7560 7561 if (E->hasArrayFiller()) { 7562 if (ExpectedExpr ToFillerOrErr = import(E->getArrayFiller())) 7563 To->setArrayFiller(*ToFillerOrErr); 7564 else 7565 return ToFillerOrErr.takeError(); 7566 } 7567 7568 if (FieldDecl *FromFD = E->getInitializedFieldInUnion()) { 7569 if (auto ToFDOrErr = import(FromFD)) 7570 To->setInitializedFieldInUnion(*ToFDOrErr); 7571 else 7572 return ToFDOrErr.takeError(); 7573 } 7574 7575 if (InitListExpr *SyntForm = E->getSyntacticForm()) { 7576 if (auto ToSyntFormOrErr = import(SyntForm)) 7577 To->setSyntacticForm(*ToSyntFormOrErr); 7578 else 7579 return ToSyntFormOrErr.takeError(); 7580 } 7581 7582 // Copy InitListExprBitfields, which are not handled in the ctor of 7583 // InitListExpr. 7584 To->sawArrayRangeDesignator(E->hadArrayRangeDesignator()); 7585 7586 return To; 7587 } 7588 7589 ExpectedStmt ASTNodeImporter::VisitCXXStdInitializerListExpr( 7590 CXXStdInitializerListExpr *E) { 7591 ExpectedType ToTypeOrErr = import(E->getType()); 7592 if (!ToTypeOrErr) 7593 return ToTypeOrErr.takeError(); 7594 7595 ExpectedExpr ToSubExprOrErr = import(E->getSubExpr()); 7596 if (!ToSubExprOrErr) 7597 return ToSubExprOrErr.takeError(); 7598 7599 return new (Importer.getToContext()) CXXStdInitializerListExpr( 7600 *ToTypeOrErr, *ToSubExprOrErr); 7601 } 7602 7603 ExpectedStmt ASTNodeImporter::VisitCXXInheritedCtorInitExpr( 7604 CXXInheritedCtorInitExpr *E) { 7605 auto Imp = importSeq(E->getLocation(), E->getType(), E->getConstructor()); 7606 if (!Imp) 7607 return Imp.takeError(); 7608 7609 SourceLocation ToLocation; 7610 QualType ToType; 7611 CXXConstructorDecl *ToConstructor; 7612 std::tie(ToLocation, ToType, ToConstructor) = *Imp; 7613 7614 return new (Importer.getToContext()) CXXInheritedCtorInitExpr( 7615 ToLocation, ToType, ToConstructor, E->constructsVBase(), 7616 E->inheritedFromVBase()); 7617 } 7618 7619 ExpectedStmt ASTNodeImporter::VisitArrayInitLoopExpr(ArrayInitLoopExpr *E) { 7620 auto Imp = importSeq(E->getType(), E->getCommonExpr(), E->getSubExpr()); 7621 if (!Imp) 7622 return Imp.takeError(); 7623 7624 QualType ToType; 7625 Expr *ToCommonExpr, *ToSubExpr; 7626 std::tie(ToType, ToCommonExpr, ToSubExpr) = *Imp; 7627 7628 return new (Importer.getToContext()) ArrayInitLoopExpr( 7629 ToType, ToCommonExpr, ToSubExpr); 7630 } 7631 7632 ExpectedStmt ASTNodeImporter::VisitArrayInitIndexExpr(ArrayInitIndexExpr *E) { 7633 ExpectedType ToTypeOrErr = import(E->getType()); 7634 if (!ToTypeOrErr) 7635 return ToTypeOrErr.takeError(); 7636 return new (Importer.getToContext()) ArrayInitIndexExpr(*ToTypeOrErr); 7637 } 7638 7639 ExpectedStmt ASTNodeImporter::VisitCXXDefaultInitExpr(CXXDefaultInitExpr *E) { 7640 ExpectedSLoc ToBeginLocOrErr = import(E->getBeginLoc()); 7641 if (!ToBeginLocOrErr) 7642 return ToBeginLocOrErr.takeError(); 7643 7644 auto ToFieldOrErr = import(E->getField()); 7645 if (!ToFieldOrErr) 7646 return ToFieldOrErr.takeError(); 7647 7648 auto UsedContextOrErr = Importer.ImportContext(E->getUsedContext()); 7649 if (!UsedContextOrErr) 7650 return UsedContextOrErr.takeError(); 7651 7652 return CXXDefaultInitExpr::Create( 7653 Importer.getToContext(), *ToBeginLocOrErr, *ToFieldOrErr, *UsedContextOrErr); 7654 } 7655 7656 ExpectedStmt ASTNodeImporter::VisitCXXNamedCastExpr(CXXNamedCastExpr *E) { 7657 auto Imp = importSeq( 7658 E->getType(), E->getSubExpr(), E->getTypeInfoAsWritten(), 7659 E->getOperatorLoc(), E->getRParenLoc(), E->getAngleBrackets()); 7660 if (!Imp) 7661 return Imp.takeError(); 7662 7663 QualType ToType; 7664 Expr *ToSubExpr; 7665 TypeSourceInfo *ToTypeInfoAsWritten; 7666 SourceLocation ToOperatorLoc, ToRParenLoc; 7667 SourceRange ToAngleBrackets; 7668 std::tie( 7669 ToType, ToSubExpr, ToTypeInfoAsWritten, ToOperatorLoc, ToRParenLoc, 7670 ToAngleBrackets) = *Imp; 7671 7672 ExprValueKind VK = E->getValueKind(); 7673 CastKind CK = E->getCastKind(); 7674 auto ToBasePathOrErr = ImportCastPath(E); 7675 if (!ToBasePathOrErr) 7676 return ToBasePathOrErr.takeError(); 7677 7678 if (isa<CXXStaticCastExpr>(E)) { 7679 return CXXStaticCastExpr::Create( 7680 Importer.getToContext(), ToType, VK, CK, ToSubExpr, &(*ToBasePathOrErr), 7681 ToTypeInfoAsWritten, ToOperatorLoc, ToRParenLoc, ToAngleBrackets); 7682 } else if (isa<CXXDynamicCastExpr>(E)) { 7683 return CXXDynamicCastExpr::Create( 7684 Importer.getToContext(), ToType, VK, CK, ToSubExpr, &(*ToBasePathOrErr), 7685 ToTypeInfoAsWritten, ToOperatorLoc, ToRParenLoc, ToAngleBrackets); 7686 } else if (isa<CXXReinterpretCastExpr>(E)) { 7687 return CXXReinterpretCastExpr::Create( 7688 Importer.getToContext(), ToType, VK, CK, ToSubExpr, &(*ToBasePathOrErr), 7689 ToTypeInfoAsWritten, ToOperatorLoc, ToRParenLoc, ToAngleBrackets); 7690 } else if (isa<CXXConstCastExpr>(E)) { 7691 return CXXConstCastExpr::Create( 7692 Importer.getToContext(), ToType, VK, ToSubExpr, ToTypeInfoAsWritten, 7693 ToOperatorLoc, ToRParenLoc, ToAngleBrackets); 7694 } else { 7695 llvm_unreachable("Unknown cast type"); 7696 return make_error<ImportError>(); 7697 } 7698 } 7699 7700 ExpectedStmt ASTNodeImporter::VisitSubstNonTypeTemplateParmExpr( 7701 SubstNonTypeTemplateParmExpr *E) { 7702 auto Imp = importSeq( 7703 E->getType(), E->getExprLoc(), E->getParameter(), E->getReplacement()); 7704 if (!Imp) 7705 return Imp.takeError(); 7706 7707 QualType ToType; 7708 SourceLocation ToExprLoc; 7709 NonTypeTemplateParmDecl *ToParameter; 7710 Expr *ToReplacement; 7711 std::tie(ToType, ToExprLoc, ToParameter, ToReplacement) = *Imp; 7712 7713 return new (Importer.getToContext()) SubstNonTypeTemplateParmExpr( 7714 ToType, E->getValueKind(), ToExprLoc, ToParameter, ToReplacement); 7715 } 7716 7717 ExpectedStmt ASTNodeImporter::VisitTypeTraitExpr(TypeTraitExpr *E) { 7718 auto Imp = importSeq( 7719 E->getType(), E->getBeginLoc(), E->getEndLoc()); 7720 if (!Imp) 7721 return Imp.takeError(); 7722 7723 QualType ToType; 7724 SourceLocation ToBeginLoc, ToEndLoc; 7725 std::tie(ToType, ToBeginLoc, ToEndLoc) = *Imp; 7726 7727 SmallVector<TypeSourceInfo *, 4> ToArgs(E->getNumArgs()); 7728 if (Error Err = ImportContainerChecked(E->getArgs(), ToArgs)) 7729 return std::move(Err); 7730 7731 // According to Sema::BuildTypeTrait(), if E is value-dependent, 7732 // Value is always false. 7733 bool ToValue = (E->isValueDependent() ? false : E->getValue()); 7734 7735 return TypeTraitExpr::Create( 7736 Importer.getToContext(), ToType, ToBeginLoc, E->getTrait(), ToArgs, 7737 ToEndLoc, ToValue); 7738 } 7739 7740 ExpectedStmt ASTNodeImporter::VisitCXXTypeidExpr(CXXTypeidExpr *E) { 7741 ExpectedType ToTypeOrErr = import(E->getType()); 7742 if (!ToTypeOrErr) 7743 return ToTypeOrErr.takeError(); 7744 7745 auto ToSourceRangeOrErr = import(E->getSourceRange()); 7746 if (!ToSourceRangeOrErr) 7747 return ToSourceRangeOrErr.takeError(); 7748 7749 if (E->isTypeOperand()) { 7750 if (auto ToTSIOrErr = import(E->getTypeOperandSourceInfo())) 7751 return new (Importer.getToContext()) CXXTypeidExpr( 7752 *ToTypeOrErr, *ToTSIOrErr, *ToSourceRangeOrErr); 7753 else 7754 return ToTSIOrErr.takeError(); 7755 } 7756 7757 ExpectedExpr ToExprOperandOrErr = import(E->getExprOperand()); 7758 if (!ToExprOperandOrErr) 7759 return ToExprOperandOrErr.takeError(); 7760 7761 return new (Importer.getToContext()) CXXTypeidExpr( 7762 *ToTypeOrErr, *ToExprOperandOrErr, *ToSourceRangeOrErr); 7763 } 7764 7765 Error ASTNodeImporter::ImportOverriddenMethods(CXXMethodDecl *ToMethod, 7766 CXXMethodDecl *FromMethod) { 7767 Error ImportErrors = Error::success(); 7768 for (auto *FromOverriddenMethod : FromMethod->overridden_methods()) { 7769 if (auto ImportedOrErr = import(FromOverriddenMethod)) 7770 ToMethod->getCanonicalDecl()->addOverriddenMethod(cast<CXXMethodDecl>( 7771 (*ImportedOrErr)->getCanonicalDecl())); 7772 else 7773 ImportErrors = 7774 joinErrors(std::move(ImportErrors), ImportedOrErr.takeError()); 7775 } 7776 return ImportErrors; 7777 } 7778 7779 ASTImporter::ASTImporter(ASTContext &ToContext, FileManager &ToFileManager, 7780 ASTContext &FromContext, FileManager &FromFileManager, 7781 bool MinimalImport, 7782 std::shared_ptr<ASTImporterSharedState> SharedState) 7783 : SharedState(SharedState), ToContext(ToContext), FromContext(FromContext), 7784 ToFileManager(ToFileManager), FromFileManager(FromFileManager), 7785 Minimal(MinimalImport), ODRHandling(ODRHandlingType::Conservative) { 7786 7787 // Create a default state without the lookup table: LLDB case. 7788 if (!SharedState) { 7789 this->SharedState = std::make_shared<ASTImporterSharedState>(); 7790 } 7791 7792 ImportedDecls[FromContext.getTranslationUnitDecl()] = 7793 ToContext.getTranslationUnitDecl(); 7794 } 7795 7796 ASTImporter::~ASTImporter() = default; 7797 7798 Optional<unsigned> ASTImporter::getFieldIndex(Decl *F) { 7799 assert(F && (isa<FieldDecl>(*F) || isa<IndirectFieldDecl>(*F)) && 7800 "Try to get field index for non-field."); 7801 7802 auto *Owner = dyn_cast<RecordDecl>(F->getDeclContext()); 7803 if (!Owner) 7804 return None; 7805 7806 unsigned Index = 0; 7807 for (const auto *D : Owner->decls()) { 7808 if (D == F) 7809 return Index; 7810 7811 if (isa<FieldDecl>(*D) || isa<IndirectFieldDecl>(*D)) 7812 ++Index; 7813 } 7814 7815 llvm_unreachable("Field was not found in its parent context."); 7816 7817 return None; 7818 } 7819 7820 ASTImporter::FoundDeclsTy 7821 ASTImporter::findDeclsInToCtx(DeclContext *DC, DeclarationName Name) { 7822 // We search in the redecl context because of transparent contexts. 7823 // E.g. a simple C language enum is a transparent context: 7824 // enum E { A, B }; 7825 // Now if we had a global variable in the TU 7826 // int A; 7827 // then the enum constant 'A' and the variable 'A' violates ODR. 7828 // We can diagnose this only if we search in the redecl context. 7829 DeclContext *ReDC = DC->getRedeclContext(); 7830 if (SharedState->getLookupTable()) { 7831 ASTImporterLookupTable::LookupResult LookupResult = 7832 SharedState->getLookupTable()->lookup(ReDC, Name); 7833 return FoundDeclsTy(LookupResult.begin(), LookupResult.end()); 7834 } else { 7835 DeclContext::lookup_result NoloadLookupResult = ReDC->noload_lookup(Name); 7836 FoundDeclsTy Result(NoloadLookupResult.begin(), NoloadLookupResult.end()); 7837 // We must search by the slow case of localUncachedLookup because that is 7838 // working even if there is no LookupPtr for the DC. We could use 7839 // DC::buildLookup() to create the LookupPtr, but that would load external 7840 // decls again, we must avoid that case. 7841 // Also, even if we had the LookupPtr, we must find Decls which are not 7842 // in the LookupPtr, so we need the slow case. 7843 // These cases are handled in ASTImporterLookupTable, but we cannot use 7844 // that with LLDB since that traverses through the AST which initiates the 7845 // load of external decls again via DC::decls(). And again, we must avoid 7846 // loading external decls during the import. 7847 if (Result.empty()) 7848 ReDC->localUncachedLookup(Name, Result); 7849 return Result; 7850 } 7851 } 7852 7853 void ASTImporter::AddToLookupTable(Decl *ToD) { 7854 SharedState->addDeclToLookup(ToD); 7855 } 7856 7857 Expected<Decl *> ASTImporter::ImportImpl(Decl *FromD) { 7858 // Import the decl using ASTNodeImporter. 7859 ASTNodeImporter Importer(*this); 7860 return Importer.Visit(FromD); 7861 } 7862 7863 void ASTImporter::RegisterImportedDecl(Decl *FromD, Decl *ToD) { 7864 MapImported(FromD, ToD); 7865 } 7866 7867 Expected<QualType> ASTImporter::Import(QualType FromT) { 7868 if (FromT.isNull()) 7869 return QualType{}; 7870 7871 const Type *FromTy = FromT.getTypePtr(); 7872 7873 // Check whether we've already imported this type. 7874 llvm::DenseMap<const Type *, const Type *>::iterator Pos 7875 = ImportedTypes.find(FromTy); 7876 if (Pos != ImportedTypes.end()) 7877 return ToContext.getQualifiedType(Pos->second, FromT.getLocalQualifiers()); 7878 7879 // Import the type 7880 ASTNodeImporter Importer(*this); 7881 ExpectedType ToTOrErr = Importer.Visit(FromTy); 7882 if (!ToTOrErr) 7883 return ToTOrErr.takeError(); 7884 7885 // Record the imported type. 7886 ImportedTypes[FromTy] = (*ToTOrErr).getTypePtr(); 7887 7888 return ToContext.getQualifiedType(*ToTOrErr, FromT.getLocalQualifiers()); 7889 } 7890 7891 Expected<TypeSourceInfo *> ASTImporter::Import(TypeSourceInfo *FromTSI) { 7892 if (!FromTSI) 7893 return FromTSI; 7894 7895 // FIXME: For now we just create a "trivial" type source info based 7896 // on the type and a single location. Implement a real version of this. 7897 ExpectedType TOrErr = Import(FromTSI->getType()); 7898 if (!TOrErr) 7899 return TOrErr.takeError(); 7900 ExpectedSLoc BeginLocOrErr = Import(FromTSI->getTypeLoc().getBeginLoc()); 7901 if (!BeginLocOrErr) 7902 return BeginLocOrErr.takeError(); 7903 7904 return ToContext.getTrivialTypeSourceInfo(*TOrErr, *BeginLocOrErr); 7905 } 7906 7907 Expected<Attr *> ASTImporter::Import(const Attr *FromAttr) { 7908 Attr *ToAttr = FromAttr->clone(ToContext); 7909 if (auto ToRangeOrErr = Import(FromAttr->getRange())) 7910 ToAttr->setRange(*ToRangeOrErr); 7911 else 7912 return ToRangeOrErr.takeError(); 7913 7914 return ToAttr; 7915 } 7916 7917 Decl *ASTImporter::GetAlreadyImportedOrNull(const Decl *FromD) const { 7918 auto Pos = ImportedDecls.find(FromD); 7919 if (Pos != ImportedDecls.end()) 7920 return Pos->second; 7921 else 7922 return nullptr; 7923 } 7924 7925 TranslationUnitDecl *ASTImporter::GetFromTU(Decl *ToD) { 7926 auto FromDPos = ImportedFromDecls.find(ToD); 7927 if (FromDPos == ImportedFromDecls.end()) 7928 return nullptr; 7929 return FromDPos->second->getTranslationUnitDecl(); 7930 } 7931 7932 Expected<Decl *> ASTImporter::Import(Decl *FromD) { 7933 if (!FromD) 7934 return nullptr; 7935 7936 // Push FromD to the stack, and remove that when we return. 7937 ImportPath.push(FromD); 7938 auto ImportPathBuilder = 7939 llvm::make_scope_exit([this]() { ImportPath.pop(); }); 7940 7941 // Check whether there was a previous failed import. 7942 // If yes return the existing error. 7943 if (auto Error = getImportDeclErrorIfAny(FromD)) 7944 return make_error<ImportError>(*Error); 7945 7946 // Check whether we've already imported this declaration. 7947 Decl *ToD = GetAlreadyImportedOrNull(FromD); 7948 if (ToD) { 7949 // Already imported (possibly from another TU) and with an error. 7950 if (auto Error = SharedState->getImportDeclErrorIfAny(ToD)) { 7951 setImportDeclError(FromD, *Error); 7952 return make_error<ImportError>(*Error); 7953 } 7954 7955 // If FromD has some updated flags after last import, apply it 7956 updateFlags(FromD, ToD); 7957 // If we encounter a cycle during an import then we save the relevant part 7958 // of the import path associated to the Decl. 7959 if (ImportPath.hasCycleAtBack()) 7960 SavedImportPaths[FromD].push_back(ImportPath.copyCycleAtBack()); 7961 return ToD; 7962 } 7963 7964 // Import the declaration. 7965 ExpectedDecl ToDOrErr = ImportImpl(FromD); 7966 if (!ToDOrErr) { 7967 // Failed to import. 7968 7969 auto Pos = ImportedDecls.find(FromD); 7970 if (Pos != ImportedDecls.end()) { 7971 // Import failed after the object was created. 7972 // Remove all references to it. 7973 auto *ToD = Pos->second; 7974 ImportedDecls.erase(Pos); 7975 7976 // ImportedDecls and ImportedFromDecls are not symmetric. It may happen 7977 // (e.g. with namespaces) that several decls from the 'from' context are 7978 // mapped to the same decl in the 'to' context. If we removed entries 7979 // from the LookupTable here then we may end up removing them multiple 7980 // times. 7981 7982 // The Lookuptable contains decls only which are in the 'to' context. 7983 // Remove from the Lookuptable only if it is *imported* into the 'to' 7984 // context (and do not remove it if it was added during the initial 7985 // traverse of the 'to' context). 7986 auto PosF = ImportedFromDecls.find(ToD); 7987 if (PosF != ImportedFromDecls.end()) { 7988 SharedState->removeDeclFromLookup(ToD); 7989 ImportedFromDecls.erase(PosF); 7990 } 7991 7992 // FIXME: AST may contain remaining references to the failed object. 7993 // However, the ImportDeclErrors in the shared state contains all the 7994 // failed objects together with their error. 7995 } 7996 7997 // Error encountered for the first time. 7998 // After takeError the error is not usable any more in ToDOrErr. 7999 // Get a copy of the error object (any more simple solution for this?). 8000 ImportError ErrOut; 8001 handleAllErrors(ToDOrErr.takeError(), 8002 [&ErrOut](const ImportError &E) { ErrOut = E; }); 8003 setImportDeclError(FromD, ErrOut); 8004 // Set the error for the mapped to Decl, which is in the "to" context. 8005 if (Pos != ImportedDecls.end()) 8006 SharedState->setImportDeclError(Pos->second, ErrOut); 8007 8008 // Set the error for all nodes which have been created before we 8009 // recognized the error. 8010 for (const auto &Path : SavedImportPaths[FromD]) 8011 for (Decl *FromDi : Path) { 8012 setImportDeclError(FromDi, ErrOut); 8013 //FIXME Should we remove these Decls from ImportedDecls? 8014 // Set the error for the mapped to Decl, which is in the "to" context. 8015 auto Ii = ImportedDecls.find(FromDi); 8016 if (Ii != ImportedDecls.end()) 8017 SharedState->setImportDeclError(Ii->second, ErrOut); 8018 // FIXME Should we remove these Decls from the LookupTable, 8019 // and from ImportedFromDecls? 8020 } 8021 SavedImportPaths[FromD].clear(); 8022 8023 // Do not return ToDOrErr, error was taken out of it. 8024 return make_error<ImportError>(ErrOut); 8025 } 8026 8027 ToD = *ToDOrErr; 8028 8029 // FIXME: Handle the "already imported with error" case. We can get here 8030 // nullptr only if GetImportedOrCreateDecl returned nullptr (after a 8031 // previously failed create was requested). 8032 // Later GetImportedOrCreateDecl can be updated to return the error. 8033 if (!ToD) { 8034 auto Err = getImportDeclErrorIfAny(FromD); 8035 assert(Err); 8036 return make_error<ImportError>(*Err); 8037 } 8038 8039 // We could import from the current TU without error. But previously we 8040 // already had imported a Decl as `ToD` from another TU (with another 8041 // ASTImporter object) and with an error. 8042 if (auto Error = SharedState->getImportDeclErrorIfAny(ToD)) { 8043 setImportDeclError(FromD, *Error); 8044 return make_error<ImportError>(*Error); 8045 } 8046 8047 // Make sure that ImportImpl registered the imported decl. 8048 assert(ImportedDecls.count(FromD) != 0 && "Missing call to MapImported?"); 8049 8050 // Notify subclasses. 8051 Imported(FromD, ToD); 8052 8053 updateFlags(FromD, ToD); 8054 SavedImportPaths[FromD].clear(); 8055 return ToDOrErr; 8056 } 8057 8058 Expected<DeclContext *> ASTImporter::ImportContext(DeclContext *FromDC) { 8059 if (!FromDC) 8060 return FromDC; 8061 8062 ExpectedDecl ToDCOrErr = Import(cast<Decl>(FromDC)); 8063 if (!ToDCOrErr) 8064 return ToDCOrErr.takeError(); 8065 auto *ToDC = cast<DeclContext>(*ToDCOrErr); 8066 8067 // When we're using a record/enum/Objective-C class/protocol as a context, we 8068 // need it to have a definition. 8069 if (auto *ToRecord = dyn_cast<RecordDecl>(ToDC)) { 8070 auto *FromRecord = cast<RecordDecl>(FromDC); 8071 if (ToRecord->isCompleteDefinition()) { 8072 // Do nothing. 8073 } else if (FromRecord->isCompleteDefinition()) { 8074 if (Error Err = ASTNodeImporter(*this).ImportDefinition( 8075 FromRecord, ToRecord, ASTNodeImporter::IDK_Basic)) 8076 return std::move(Err); 8077 } else { 8078 CompleteDecl(ToRecord); 8079 } 8080 } else if (auto *ToEnum = dyn_cast<EnumDecl>(ToDC)) { 8081 auto *FromEnum = cast<EnumDecl>(FromDC); 8082 if (ToEnum->isCompleteDefinition()) { 8083 // Do nothing. 8084 } else if (FromEnum->isCompleteDefinition()) { 8085 if (Error Err = ASTNodeImporter(*this).ImportDefinition( 8086 FromEnum, ToEnum, ASTNodeImporter::IDK_Basic)) 8087 return std::move(Err); 8088 } else { 8089 CompleteDecl(ToEnum); 8090 } 8091 } else if (auto *ToClass = dyn_cast<ObjCInterfaceDecl>(ToDC)) { 8092 auto *FromClass = cast<ObjCInterfaceDecl>(FromDC); 8093 if (ToClass->getDefinition()) { 8094 // Do nothing. 8095 } else if (ObjCInterfaceDecl *FromDef = FromClass->getDefinition()) { 8096 if (Error Err = ASTNodeImporter(*this).ImportDefinition( 8097 FromDef, ToClass, ASTNodeImporter::IDK_Basic)) 8098 return std::move(Err); 8099 } else { 8100 CompleteDecl(ToClass); 8101 } 8102 } else if (auto *ToProto = dyn_cast<ObjCProtocolDecl>(ToDC)) { 8103 auto *FromProto = cast<ObjCProtocolDecl>(FromDC); 8104 if (ToProto->getDefinition()) { 8105 // Do nothing. 8106 } else if (ObjCProtocolDecl *FromDef = FromProto->getDefinition()) { 8107 if (Error Err = ASTNodeImporter(*this).ImportDefinition( 8108 FromDef, ToProto, ASTNodeImporter::IDK_Basic)) 8109 return std::move(Err); 8110 } else { 8111 CompleteDecl(ToProto); 8112 } 8113 } 8114 8115 return ToDC; 8116 } 8117 8118 Expected<Expr *> ASTImporter::Import(Expr *FromE) { 8119 if (ExpectedStmt ToSOrErr = Import(cast_or_null<Stmt>(FromE))) 8120 return cast_or_null<Expr>(*ToSOrErr); 8121 else 8122 return ToSOrErr.takeError(); 8123 } 8124 8125 Expected<Stmt *> ASTImporter::Import(Stmt *FromS) { 8126 if (!FromS) 8127 return nullptr; 8128 8129 // Check whether we've already imported this statement. 8130 llvm::DenseMap<Stmt *, Stmt *>::iterator Pos = ImportedStmts.find(FromS); 8131 if (Pos != ImportedStmts.end()) 8132 return Pos->second; 8133 8134 // Import the statement. 8135 ASTNodeImporter Importer(*this); 8136 ExpectedStmt ToSOrErr = Importer.Visit(FromS); 8137 if (!ToSOrErr) 8138 return ToSOrErr; 8139 8140 if (auto *ToE = dyn_cast<Expr>(*ToSOrErr)) { 8141 auto *FromE = cast<Expr>(FromS); 8142 // Copy ExprBitfields, which may not be handled in Expr subclasses 8143 // constructors. 8144 ToE->setValueKind(FromE->getValueKind()); 8145 ToE->setObjectKind(FromE->getObjectKind()); 8146 ToE->setTypeDependent(FromE->isTypeDependent()); 8147 ToE->setValueDependent(FromE->isValueDependent()); 8148 ToE->setInstantiationDependent(FromE->isInstantiationDependent()); 8149 ToE->setContainsUnexpandedParameterPack( 8150 FromE->containsUnexpandedParameterPack()); 8151 } 8152 8153 // Record the imported statement object. 8154 ImportedStmts[FromS] = *ToSOrErr; 8155 return ToSOrErr; 8156 } 8157 8158 Expected<NestedNameSpecifier *> 8159 ASTImporter::Import(NestedNameSpecifier *FromNNS) { 8160 if (!FromNNS) 8161 return nullptr; 8162 8163 NestedNameSpecifier *Prefix = nullptr; 8164 if (Error Err = importInto(Prefix, FromNNS->getPrefix())) 8165 return std::move(Err); 8166 8167 switch (FromNNS->getKind()) { 8168 case NestedNameSpecifier::Identifier: 8169 assert(FromNNS->getAsIdentifier() && "NNS should contain identifier."); 8170 return NestedNameSpecifier::Create(ToContext, Prefix, 8171 Import(FromNNS->getAsIdentifier())); 8172 8173 case NestedNameSpecifier::Namespace: 8174 if (ExpectedDecl NSOrErr = Import(FromNNS->getAsNamespace())) { 8175 return NestedNameSpecifier::Create(ToContext, Prefix, 8176 cast<NamespaceDecl>(*NSOrErr)); 8177 } else 8178 return NSOrErr.takeError(); 8179 8180 case NestedNameSpecifier::NamespaceAlias: 8181 if (ExpectedDecl NSADOrErr = Import(FromNNS->getAsNamespaceAlias())) 8182 return NestedNameSpecifier::Create(ToContext, Prefix, 8183 cast<NamespaceAliasDecl>(*NSADOrErr)); 8184 else 8185 return NSADOrErr.takeError(); 8186 8187 case NestedNameSpecifier::Global: 8188 return NestedNameSpecifier::GlobalSpecifier(ToContext); 8189 8190 case NestedNameSpecifier::Super: 8191 if (ExpectedDecl RDOrErr = Import(FromNNS->getAsRecordDecl())) 8192 return NestedNameSpecifier::SuperSpecifier(ToContext, 8193 cast<CXXRecordDecl>(*RDOrErr)); 8194 else 8195 return RDOrErr.takeError(); 8196 8197 case NestedNameSpecifier::TypeSpec: 8198 case NestedNameSpecifier::TypeSpecWithTemplate: 8199 if (Expected<QualType> TyOrErr = 8200 Import(QualType(FromNNS->getAsType(), 0u))) { 8201 bool TSTemplate = 8202 FromNNS->getKind() == NestedNameSpecifier::TypeSpecWithTemplate; 8203 return NestedNameSpecifier::Create(ToContext, Prefix, TSTemplate, 8204 TyOrErr->getTypePtr()); 8205 } else { 8206 return TyOrErr.takeError(); 8207 } 8208 } 8209 8210 llvm_unreachable("Invalid nested name specifier kind"); 8211 } 8212 8213 Expected<NestedNameSpecifierLoc> 8214 ASTImporter::Import(NestedNameSpecifierLoc FromNNS) { 8215 // Copied from NestedNameSpecifier mostly. 8216 SmallVector<NestedNameSpecifierLoc , 8> NestedNames; 8217 NestedNameSpecifierLoc NNS = FromNNS; 8218 8219 // Push each of the nested-name-specifiers's onto a stack for 8220 // serialization in reverse order. 8221 while (NNS) { 8222 NestedNames.push_back(NNS); 8223 NNS = NNS.getPrefix(); 8224 } 8225 8226 NestedNameSpecifierLocBuilder Builder; 8227 8228 while (!NestedNames.empty()) { 8229 NNS = NestedNames.pop_back_val(); 8230 NestedNameSpecifier *Spec = nullptr; 8231 if (Error Err = importInto(Spec, NNS.getNestedNameSpecifier())) 8232 return std::move(Err); 8233 8234 NestedNameSpecifier::SpecifierKind Kind = Spec->getKind(); 8235 8236 SourceLocation ToLocalBeginLoc, ToLocalEndLoc; 8237 if (Kind != NestedNameSpecifier::Super) { 8238 if (Error Err = importInto(ToLocalBeginLoc, NNS.getLocalBeginLoc())) 8239 return std::move(Err); 8240 8241 if (Kind != NestedNameSpecifier::Global) 8242 if (Error Err = importInto(ToLocalEndLoc, NNS.getLocalEndLoc())) 8243 return std::move(Err); 8244 } 8245 8246 switch (Kind) { 8247 case NestedNameSpecifier::Identifier: 8248 Builder.Extend(getToContext(), Spec->getAsIdentifier(), ToLocalBeginLoc, 8249 ToLocalEndLoc); 8250 break; 8251 8252 case NestedNameSpecifier::Namespace: 8253 Builder.Extend(getToContext(), Spec->getAsNamespace(), ToLocalBeginLoc, 8254 ToLocalEndLoc); 8255 break; 8256 8257 case NestedNameSpecifier::NamespaceAlias: 8258 Builder.Extend(getToContext(), Spec->getAsNamespaceAlias(), 8259 ToLocalBeginLoc, ToLocalEndLoc); 8260 break; 8261 8262 case NestedNameSpecifier::TypeSpec: 8263 case NestedNameSpecifier::TypeSpecWithTemplate: { 8264 SourceLocation ToTLoc; 8265 if (Error Err = importInto(ToTLoc, NNS.getTypeLoc().getBeginLoc())) 8266 return std::move(Err); 8267 TypeSourceInfo *TSI = getToContext().getTrivialTypeSourceInfo( 8268 QualType(Spec->getAsType(), 0), ToTLoc); 8269 Builder.Extend(getToContext(), ToLocalBeginLoc, TSI->getTypeLoc(), 8270 ToLocalEndLoc); 8271 break; 8272 } 8273 8274 case NestedNameSpecifier::Global: 8275 Builder.MakeGlobal(getToContext(), ToLocalBeginLoc); 8276 break; 8277 8278 case NestedNameSpecifier::Super: { 8279 auto ToSourceRangeOrErr = Import(NNS.getSourceRange()); 8280 if (!ToSourceRangeOrErr) 8281 return ToSourceRangeOrErr.takeError(); 8282 8283 Builder.MakeSuper(getToContext(), Spec->getAsRecordDecl(), 8284 ToSourceRangeOrErr->getBegin(), 8285 ToSourceRangeOrErr->getEnd()); 8286 } 8287 } 8288 } 8289 8290 return Builder.getWithLocInContext(getToContext()); 8291 } 8292 8293 Expected<TemplateName> ASTImporter::Import(TemplateName From) { 8294 switch (From.getKind()) { 8295 case TemplateName::Template: 8296 if (ExpectedDecl ToTemplateOrErr = Import(From.getAsTemplateDecl())) 8297 return TemplateName(cast<TemplateDecl>(*ToTemplateOrErr)); 8298 else 8299 return ToTemplateOrErr.takeError(); 8300 8301 case TemplateName::OverloadedTemplate: { 8302 OverloadedTemplateStorage *FromStorage = From.getAsOverloadedTemplate(); 8303 UnresolvedSet<2> ToTemplates; 8304 for (auto *I : *FromStorage) { 8305 if (auto ToOrErr = Import(I)) 8306 ToTemplates.addDecl(cast<NamedDecl>(*ToOrErr)); 8307 else 8308 return ToOrErr.takeError(); 8309 } 8310 return ToContext.getOverloadedTemplateName(ToTemplates.begin(), 8311 ToTemplates.end()); 8312 } 8313 8314 case TemplateName::AssumedTemplate: { 8315 AssumedTemplateStorage *FromStorage = From.getAsAssumedTemplateName(); 8316 auto DeclNameOrErr = Import(FromStorage->getDeclName()); 8317 if (!DeclNameOrErr) 8318 return DeclNameOrErr.takeError(); 8319 return ToContext.getAssumedTemplateName(*DeclNameOrErr); 8320 } 8321 8322 case TemplateName::QualifiedTemplate: { 8323 QualifiedTemplateName *QTN = From.getAsQualifiedTemplateName(); 8324 auto QualifierOrErr = Import(QTN->getQualifier()); 8325 if (!QualifierOrErr) 8326 return QualifierOrErr.takeError(); 8327 8328 if (ExpectedDecl ToTemplateOrErr = Import(From.getAsTemplateDecl())) 8329 return ToContext.getQualifiedTemplateName( 8330 *QualifierOrErr, QTN->hasTemplateKeyword(), 8331 cast<TemplateDecl>(*ToTemplateOrErr)); 8332 else 8333 return ToTemplateOrErr.takeError(); 8334 } 8335 8336 case TemplateName::DependentTemplate: { 8337 DependentTemplateName *DTN = From.getAsDependentTemplateName(); 8338 auto QualifierOrErr = Import(DTN->getQualifier()); 8339 if (!QualifierOrErr) 8340 return QualifierOrErr.takeError(); 8341 8342 if (DTN->isIdentifier()) { 8343 return ToContext.getDependentTemplateName(*QualifierOrErr, 8344 Import(DTN->getIdentifier())); 8345 } 8346 8347 return ToContext.getDependentTemplateName(*QualifierOrErr, 8348 DTN->getOperator()); 8349 } 8350 8351 case TemplateName::SubstTemplateTemplateParm: { 8352 SubstTemplateTemplateParmStorage *Subst = 8353 From.getAsSubstTemplateTemplateParm(); 8354 ExpectedDecl ParamOrErr = Import(Subst->getParameter()); 8355 if (!ParamOrErr) 8356 return ParamOrErr.takeError(); 8357 8358 auto ReplacementOrErr = Import(Subst->getReplacement()); 8359 if (!ReplacementOrErr) 8360 return ReplacementOrErr.takeError(); 8361 8362 return ToContext.getSubstTemplateTemplateParm( 8363 cast<TemplateTemplateParmDecl>(*ParamOrErr), *ReplacementOrErr); 8364 } 8365 8366 case TemplateName::SubstTemplateTemplateParmPack: { 8367 SubstTemplateTemplateParmPackStorage *SubstPack 8368 = From.getAsSubstTemplateTemplateParmPack(); 8369 ExpectedDecl ParamOrErr = Import(SubstPack->getParameterPack()); 8370 if (!ParamOrErr) 8371 return ParamOrErr.takeError(); 8372 8373 ASTNodeImporter Importer(*this); 8374 auto ArgPackOrErr = 8375 Importer.ImportTemplateArgument(SubstPack->getArgumentPack()); 8376 if (!ArgPackOrErr) 8377 return ArgPackOrErr.takeError(); 8378 8379 return ToContext.getSubstTemplateTemplateParmPack( 8380 cast<TemplateTemplateParmDecl>(*ParamOrErr), *ArgPackOrErr); 8381 } 8382 } 8383 8384 llvm_unreachable("Invalid template name kind"); 8385 } 8386 8387 Expected<SourceLocation> ASTImporter::Import(SourceLocation FromLoc) { 8388 if (FromLoc.isInvalid()) 8389 return SourceLocation{}; 8390 8391 SourceManager &FromSM = FromContext.getSourceManager(); 8392 bool IsBuiltin = FromSM.isWrittenInBuiltinFile(FromLoc); 8393 8394 std::pair<FileID, unsigned> Decomposed = FromSM.getDecomposedLoc(FromLoc); 8395 Expected<FileID> ToFileIDOrErr = Import(Decomposed.first, IsBuiltin); 8396 if (!ToFileIDOrErr) 8397 return ToFileIDOrErr.takeError(); 8398 SourceManager &ToSM = ToContext.getSourceManager(); 8399 return ToSM.getComposedLoc(*ToFileIDOrErr, Decomposed.second); 8400 } 8401 8402 Expected<SourceRange> ASTImporter::Import(SourceRange FromRange) { 8403 SourceLocation ToBegin, ToEnd; 8404 if (Error Err = importInto(ToBegin, FromRange.getBegin())) 8405 return std::move(Err); 8406 if (Error Err = importInto(ToEnd, FromRange.getEnd())) 8407 return std::move(Err); 8408 8409 return SourceRange(ToBegin, ToEnd); 8410 } 8411 8412 Expected<FileID> ASTImporter::Import(FileID FromID, bool IsBuiltin) { 8413 llvm::DenseMap<FileID, FileID>::iterator Pos = ImportedFileIDs.find(FromID); 8414 if (Pos != ImportedFileIDs.end()) 8415 return Pos->second; 8416 8417 SourceManager &FromSM = FromContext.getSourceManager(); 8418 SourceManager &ToSM = ToContext.getSourceManager(); 8419 const SrcMgr::SLocEntry &FromSLoc = FromSM.getSLocEntry(FromID); 8420 8421 // Map the FromID to the "to" source manager. 8422 FileID ToID; 8423 if (FromSLoc.isExpansion()) { 8424 const SrcMgr::ExpansionInfo &FromEx = FromSLoc.getExpansion(); 8425 ExpectedSLoc ToSpLoc = Import(FromEx.getSpellingLoc()); 8426 if (!ToSpLoc) 8427 return ToSpLoc.takeError(); 8428 ExpectedSLoc ToExLocS = Import(FromEx.getExpansionLocStart()); 8429 if (!ToExLocS) 8430 return ToExLocS.takeError(); 8431 unsigned TokenLen = FromSM.getFileIDSize(FromID); 8432 SourceLocation MLoc; 8433 if (FromEx.isMacroArgExpansion()) { 8434 MLoc = ToSM.createMacroArgExpansionLoc(*ToSpLoc, *ToExLocS, TokenLen); 8435 } else { 8436 if (ExpectedSLoc ToExLocE = Import(FromEx.getExpansionLocEnd())) 8437 MLoc = ToSM.createExpansionLoc(*ToSpLoc, *ToExLocS, *ToExLocE, TokenLen, 8438 FromEx.isExpansionTokenRange()); 8439 else 8440 return ToExLocE.takeError(); 8441 } 8442 ToID = ToSM.getFileID(MLoc); 8443 } else { 8444 const SrcMgr::ContentCache *Cache = FromSLoc.getFile().getContentCache(); 8445 8446 if (!IsBuiltin) { 8447 // Include location of this file. 8448 ExpectedSLoc ToIncludeLoc = Import(FromSLoc.getFile().getIncludeLoc()); 8449 if (!ToIncludeLoc) 8450 return ToIncludeLoc.takeError(); 8451 8452 if (Cache->OrigEntry && Cache->OrigEntry->getDir()) { 8453 // FIXME: We probably want to use getVirtualFile(), so we don't hit the 8454 // disk again 8455 // FIXME: We definitely want to re-use the existing MemoryBuffer, rather 8456 // than mmap the files several times. 8457 auto Entry = 8458 ToFileManager.getFile(Cache->OrigEntry->getName()); 8459 // FIXME: The filename may be a virtual name that does probably not 8460 // point to a valid file and we get no Entry here. In this case try with 8461 // the memory buffer below. 8462 if (Entry) 8463 ToID = ToSM.createFileID(*Entry, *ToIncludeLoc, 8464 FromSLoc.getFile().getFileCharacteristic()); 8465 } 8466 } 8467 8468 if (ToID.isInvalid() || IsBuiltin) { 8469 // FIXME: We want to re-use the existing MemoryBuffer! 8470 bool Invalid = true; 8471 const llvm::MemoryBuffer *FromBuf = 8472 Cache->getBuffer(FromContext.getDiagnostics(), 8473 FromSM.getFileManager(), SourceLocation{}, &Invalid); 8474 if (!FromBuf || Invalid) 8475 // FIXME: Use a new error kind? 8476 return llvm::make_error<ImportError>(ImportError::Unknown); 8477 8478 std::unique_ptr<llvm::MemoryBuffer> ToBuf = 8479 llvm::MemoryBuffer::getMemBufferCopy(FromBuf->getBuffer(), 8480 FromBuf->getBufferIdentifier()); 8481 ToID = ToSM.createFileID(std::move(ToBuf), 8482 FromSLoc.getFile().getFileCharacteristic()); 8483 } 8484 } 8485 8486 assert(ToID.isValid() && "Unexpected invalid fileID was created."); 8487 8488 ImportedFileIDs[FromID] = ToID; 8489 8490 if (FileIDImportHandler) 8491 FileIDImportHandler(ToID, FromID); 8492 8493 return ToID; 8494 } 8495 8496 Expected<CXXCtorInitializer *> ASTImporter::Import(CXXCtorInitializer *From) { 8497 ExpectedExpr ToExprOrErr = Import(From->getInit()); 8498 if (!ToExprOrErr) 8499 return ToExprOrErr.takeError(); 8500 8501 auto LParenLocOrErr = Import(From->getLParenLoc()); 8502 if (!LParenLocOrErr) 8503 return LParenLocOrErr.takeError(); 8504 8505 auto RParenLocOrErr = Import(From->getRParenLoc()); 8506 if (!RParenLocOrErr) 8507 return RParenLocOrErr.takeError(); 8508 8509 if (From->isBaseInitializer()) { 8510 auto ToTInfoOrErr = Import(From->getTypeSourceInfo()); 8511 if (!ToTInfoOrErr) 8512 return ToTInfoOrErr.takeError(); 8513 8514 SourceLocation EllipsisLoc; 8515 if (From->isPackExpansion()) 8516 if (Error Err = importInto(EllipsisLoc, From->getEllipsisLoc())) 8517 return std::move(Err); 8518 8519 return new (ToContext) CXXCtorInitializer( 8520 ToContext, *ToTInfoOrErr, From->isBaseVirtual(), *LParenLocOrErr, 8521 *ToExprOrErr, *RParenLocOrErr, EllipsisLoc); 8522 } else if (From->isMemberInitializer()) { 8523 ExpectedDecl ToFieldOrErr = Import(From->getMember()); 8524 if (!ToFieldOrErr) 8525 return ToFieldOrErr.takeError(); 8526 8527 auto MemberLocOrErr = Import(From->getMemberLocation()); 8528 if (!MemberLocOrErr) 8529 return MemberLocOrErr.takeError(); 8530 8531 return new (ToContext) CXXCtorInitializer( 8532 ToContext, cast_or_null<FieldDecl>(*ToFieldOrErr), *MemberLocOrErr, 8533 *LParenLocOrErr, *ToExprOrErr, *RParenLocOrErr); 8534 } else if (From->isIndirectMemberInitializer()) { 8535 ExpectedDecl ToIFieldOrErr = Import(From->getIndirectMember()); 8536 if (!ToIFieldOrErr) 8537 return ToIFieldOrErr.takeError(); 8538 8539 auto MemberLocOrErr = Import(From->getMemberLocation()); 8540 if (!MemberLocOrErr) 8541 return MemberLocOrErr.takeError(); 8542 8543 return new (ToContext) CXXCtorInitializer( 8544 ToContext, cast_or_null<IndirectFieldDecl>(*ToIFieldOrErr), 8545 *MemberLocOrErr, *LParenLocOrErr, *ToExprOrErr, *RParenLocOrErr); 8546 } else if (From->isDelegatingInitializer()) { 8547 auto ToTInfoOrErr = Import(From->getTypeSourceInfo()); 8548 if (!ToTInfoOrErr) 8549 return ToTInfoOrErr.takeError(); 8550 8551 return new (ToContext) 8552 CXXCtorInitializer(ToContext, *ToTInfoOrErr, *LParenLocOrErr, 8553 *ToExprOrErr, *RParenLocOrErr); 8554 } else { 8555 // FIXME: assert? 8556 return make_error<ImportError>(); 8557 } 8558 } 8559 8560 Expected<CXXBaseSpecifier *> 8561 ASTImporter::Import(const CXXBaseSpecifier *BaseSpec) { 8562 auto Pos = ImportedCXXBaseSpecifiers.find(BaseSpec); 8563 if (Pos != ImportedCXXBaseSpecifiers.end()) 8564 return Pos->second; 8565 8566 Expected<SourceRange> ToSourceRange = Import(BaseSpec->getSourceRange()); 8567 if (!ToSourceRange) 8568 return ToSourceRange.takeError(); 8569 Expected<TypeSourceInfo *> ToTSI = Import(BaseSpec->getTypeSourceInfo()); 8570 if (!ToTSI) 8571 return ToTSI.takeError(); 8572 ExpectedSLoc ToEllipsisLoc = Import(BaseSpec->getEllipsisLoc()); 8573 if (!ToEllipsisLoc) 8574 return ToEllipsisLoc.takeError(); 8575 CXXBaseSpecifier *Imported = new (ToContext) CXXBaseSpecifier( 8576 *ToSourceRange, BaseSpec->isVirtual(), BaseSpec->isBaseOfClass(), 8577 BaseSpec->getAccessSpecifierAsWritten(), *ToTSI, *ToEllipsisLoc); 8578 ImportedCXXBaseSpecifiers[BaseSpec] = Imported; 8579 return Imported; 8580 } 8581 8582 Error ASTImporter::ImportDefinition(Decl *From) { 8583 ExpectedDecl ToOrErr = Import(From); 8584 if (!ToOrErr) 8585 return ToOrErr.takeError(); 8586 Decl *To = *ToOrErr; 8587 8588 auto *FromDC = cast<DeclContext>(From); 8589 ASTNodeImporter Importer(*this); 8590 8591 if (auto *ToRecord = dyn_cast<RecordDecl>(To)) { 8592 if (!ToRecord->getDefinition()) { 8593 return Importer.ImportDefinition( 8594 cast<RecordDecl>(FromDC), ToRecord, 8595 ASTNodeImporter::IDK_Everything); 8596 } 8597 } 8598 8599 if (auto *ToEnum = dyn_cast<EnumDecl>(To)) { 8600 if (!ToEnum->getDefinition()) { 8601 return Importer.ImportDefinition( 8602 cast<EnumDecl>(FromDC), ToEnum, ASTNodeImporter::IDK_Everything); 8603 } 8604 } 8605 8606 if (auto *ToIFace = dyn_cast<ObjCInterfaceDecl>(To)) { 8607 if (!ToIFace->getDefinition()) { 8608 return Importer.ImportDefinition( 8609 cast<ObjCInterfaceDecl>(FromDC), ToIFace, 8610 ASTNodeImporter::IDK_Everything); 8611 } 8612 } 8613 8614 if (auto *ToProto = dyn_cast<ObjCProtocolDecl>(To)) { 8615 if (!ToProto->getDefinition()) { 8616 return Importer.ImportDefinition( 8617 cast<ObjCProtocolDecl>(FromDC), ToProto, 8618 ASTNodeImporter::IDK_Everything); 8619 } 8620 } 8621 8622 return Importer.ImportDeclContext(FromDC, true); 8623 } 8624 8625 Expected<DeclarationName> ASTImporter::Import(DeclarationName FromName) { 8626 if (!FromName) 8627 return DeclarationName{}; 8628 8629 switch (FromName.getNameKind()) { 8630 case DeclarationName::Identifier: 8631 return DeclarationName(Import(FromName.getAsIdentifierInfo())); 8632 8633 case DeclarationName::ObjCZeroArgSelector: 8634 case DeclarationName::ObjCOneArgSelector: 8635 case DeclarationName::ObjCMultiArgSelector: 8636 if (auto ToSelOrErr = Import(FromName.getObjCSelector())) 8637 return DeclarationName(*ToSelOrErr); 8638 else 8639 return ToSelOrErr.takeError(); 8640 8641 case DeclarationName::CXXConstructorName: { 8642 if (auto ToTyOrErr = Import(FromName.getCXXNameType())) 8643 return ToContext.DeclarationNames.getCXXConstructorName( 8644 ToContext.getCanonicalType(*ToTyOrErr)); 8645 else 8646 return ToTyOrErr.takeError(); 8647 } 8648 8649 case DeclarationName::CXXDestructorName: { 8650 if (auto ToTyOrErr = Import(FromName.getCXXNameType())) 8651 return ToContext.DeclarationNames.getCXXDestructorName( 8652 ToContext.getCanonicalType(*ToTyOrErr)); 8653 else 8654 return ToTyOrErr.takeError(); 8655 } 8656 8657 case DeclarationName::CXXDeductionGuideName: { 8658 if (auto ToTemplateOrErr = Import(FromName.getCXXDeductionGuideTemplate())) 8659 return ToContext.DeclarationNames.getCXXDeductionGuideName( 8660 cast<TemplateDecl>(*ToTemplateOrErr)); 8661 else 8662 return ToTemplateOrErr.takeError(); 8663 } 8664 8665 case DeclarationName::CXXConversionFunctionName: { 8666 if (auto ToTyOrErr = Import(FromName.getCXXNameType())) 8667 return ToContext.DeclarationNames.getCXXConversionFunctionName( 8668 ToContext.getCanonicalType(*ToTyOrErr)); 8669 else 8670 return ToTyOrErr.takeError(); 8671 } 8672 8673 case DeclarationName::CXXOperatorName: 8674 return ToContext.DeclarationNames.getCXXOperatorName( 8675 FromName.getCXXOverloadedOperator()); 8676 8677 case DeclarationName::CXXLiteralOperatorName: 8678 return ToContext.DeclarationNames.getCXXLiteralOperatorName( 8679 Import(FromName.getCXXLiteralIdentifier())); 8680 8681 case DeclarationName::CXXUsingDirective: 8682 // FIXME: STATICS! 8683 return DeclarationName::getUsingDirectiveName(); 8684 } 8685 8686 llvm_unreachable("Invalid DeclarationName Kind!"); 8687 } 8688 8689 IdentifierInfo *ASTImporter::Import(const IdentifierInfo *FromId) { 8690 if (!FromId) 8691 return nullptr; 8692 8693 IdentifierInfo *ToId = &ToContext.Idents.get(FromId->getName()); 8694 8695 if (!ToId->getBuiltinID() && FromId->getBuiltinID()) 8696 ToId->setBuiltinID(FromId->getBuiltinID()); 8697 8698 return ToId; 8699 } 8700 8701 Expected<Selector> ASTImporter::Import(Selector FromSel) { 8702 if (FromSel.isNull()) 8703 return Selector{}; 8704 8705 SmallVector<IdentifierInfo *, 4> Idents; 8706 Idents.push_back(Import(FromSel.getIdentifierInfoForSlot(0))); 8707 for (unsigned I = 1, N = FromSel.getNumArgs(); I < N; ++I) 8708 Idents.push_back(Import(FromSel.getIdentifierInfoForSlot(I))); 8709 return ToContext.Selectors.getSelector(FromSel.getNumArgs(), Idents.data()); 8710 } 8711 8712 Expected<DeclarationName> ASTImporter::HandleNameConflict(DeclarationName Name, 8713 DeclContext *DC, 8714 unsigned IDNS, 8715 NamedDecl **Decls, 8716 unsigned NumDecls) { 8717 if (ODRHandling == ODRHandlingType::Conservative) 8718 // Report error at any name conflict. 8719 return make_error<ImportError>(ImportError::NameConflict); 8720 else 8721 // Allow to create the new Decl with the same name. 8722 return Name; 8723 } 8724 8725 DiagnosticBuilder ASTImporter::ToDiag(SourceLocation Loc, unsigned DiagID) { 8726 if (LastDiagFromFrom) 8727 ToContext.getDiagnostics().notePriorDiagnosticFrom( 8728 FromContext.getDiagnostics()); 8729 LastDiagFromFrom = false; 8730 return ToContext.getDiagnostics().Report(Loc, DiagID); 8731 } 8732 8733 DiagnosticBuilder ASTImporter::FromDiag(SourceLocation Loc, unsigned DiagID) { 8734 if (!LastDiagFromFrom) 8735 FromContext.getDiagnostics().notePriorDiagnosticFrom( 8736 ToContext.getDiagnostics()); 8737 LastDiagFromFrom = true; 8738 return FromContext.getDiagnostics().Report(Loc, DiagID); 8739 } 8740 8741 void ASTImporter::CompleteDecl (Decl *D) { 8742 if (auto *ID = dyn_cast<ObjCInterfaceDecl>(D)) { 8743 if (!ID->getDefinition()) 8744 ID->startDefinition(); 8745 } 8746 else if (auto *PD = dyn_cast<ObjCProtocolDecl>(D)) { 8747 if (!PD->getDefinition()) 8748 PD->startDefinition(); 8749 } 8750 else if (auto *TD = dyn_cast<TagDecl>(D)) { 8751 if (!TD->getDefinition() && !TD->isBeingDefined()) { 8752 TD->startDefinition(); 8753 TD->setCompleteDefinition(true); 8754 } 8755 } 8756 else { 8757 assert(0 && "CompleteDecl called on a Decl that can't be completed"); 8758 } 8759 } 8760 8761 Decl *ASTImporter::MapImported(Decl *From, Decl *To) { 8762 llvm::DenseMap<Decl *, Decl *>::iterator Pos = ImportedDecls.find(From); 8763 assert((Pos == ImportedDecls.end() || Pos->second == To) && 8764 "Try to import an already imported Decl"); 8765 if (Pos != ImportedDecls.end()) 8766 return Pos->second; 8767 ImportedDecls[From] = To; 8768 // This mapping should be maintained only in this function. Therefore do not 8769 // check for additional consistency. 8770 ImportedFromDecls[To] = From; 8771 AddToLookupTable(To); 8772 return To; 8773 } 8774 8775 llvm::Optional<ImportError> 8776 ASTImporter::getImportDeclErrorIfAny(Decl *FromD) const { 8777 auto Pos = ImportDeclErrors.find(FromD); 8778 if (Pos != ImportDeclErrors.end()) 8779 return Pos->second; 8780 else 8781 return Optional<ImportError>(); 8782 } 8783 8784 void ASTImporter::setImportDeclError(Decl *From, ImportError Error) { 8785 auto InsertRes = ImportDeclErrors.insert({From, Error}); 8786 (void)InsertRes; 8787 // Either we set the error for the first time, or we already had set one and 8788 // now we want to set the same error. 8789 assert(InsertRes.second || InsertRes.first->second.Error == Error.Error); 8790 } 8791 8792 bool ASTImporter::IsStructurallyEquivalent(QualType From, QualType To, 8793 bool Complain) { 8794 llvm::DenseMap<const Type *, const Type *>::iterator Pos = 8795 ImportedTypes.find(From.getTypePtr()); 8796 if (Pos != ImportedTypes.end()) { 8797 if (ExpectedType ToFromOrErr = Import(From)) { 8798 if (ToContext.hasSameType(*ToFromOrErr, To)) 8799 return true; 8800 } else { 8801 llvm::consumeError(ToFromOrErr.takeError()); 8802 } 8803 } 8804 8805 StructuralEquivalenceContext Ctx(FromContext, ToContext, NonEquivalentDecls, 8806 getStructuralEquivalenceKind(*this), false, 8807 Complain); 8808 return Ctx.IsEquivalent(From, To); 8809 } 8810