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