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