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