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