1 //===--- ASTImporter.cpp - Importing ASTs from other Contexts ---*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file defines the ASTImporter class which imports AST nodes from one 11 // context into another context. 12 // 13 //===----------------------------------------------------------------------===// 14 #include "clang/AST/ASTImporter.h" 15 #include "clang/AST/ASTContext.h" 16 #include "clang/AST/ASTDiagnostic.h" 17 #include "clang/AST/ASTStructuralEquivalence.h" 18 #include "clang/AST/DeclCXX.h" 19 #include "clang/AST/DeclObjC.h" 20 #include "clang/AST/DeclVisitor.h" 21 #include "clang/AST/StmtVisitor.h" 22 #include "clang/AST/TypeVisitor.h" 23 #include "clang/Basic/FileManager.h" 24 #include "clang/Basic/SourceManager.h" 25 #include "llvm/Support/MemoryBuffer.h" 26 #include <deque> 27 28 namespace clang { 29 class ASTNodeImporter : public TypeVisitor<ASTNodeImporter, QualType>, 30 public DeclVisitor<ASTNodeImporter, Decl *>, 31 public StmtVisitor<ASTNodeImporter, Stmt *> { 32 ASTImporter &Importer; 33 34 public: 35 explicit ASTNodeImporter(ASTImporter &Importer) : Importer(Importer) { } 36 37 using TypeVisitor<ASTNodeImporter, QualType>::Visit; 38 using DeclVisitor<ASTNodeImporter, Decl *>::Visit; 39 using StmtVisitor<ASTNodeImporter, Stmt *>::Visit; 40 41 // Importing types 42 QualType VisitType(const Type *T); 43 QualType VisitAtomicType(const AtomicType *T); 44 QualType VisitBuiltinType(const BuiltinType *T); 45 QualType VisitDecayedType(const DecayedType *T); 46 QualType VisitComplexType(const ComplexType *T); 47 QualType VisitPointerType(const PointerType *T); 48 QualType VisitBlockPointerType(const BlockPointerType *T); 49 QualType VisitLValueReferenceType(const LValueReferenceType *T); 50 QualType VisitRValueReferenceType(const RValueReferenceType *T); 51 QualType VisitMemberPointerType(const MemberPointerType *T); 52 QualType VisitConstantArrayType(const ConstantArrayType *T); 53 QualType VisitIncompleteArrayType(const IncompleteArrayType *T); 54 QualType VisitVariableArrayType(const VariableArrayType *T); 55 // FIXME: DependentSizedArrayType 56 // FIXME: DependentSizedExtVectorType 57 QualType VisitVectorType(const VectorType *T); 58 QualType VisitExtVectorType(const ExtVectorType *T); 59 QualType VisitFunctionNoProtoType(const FunctionNoProtoType *T); 60 QualType VisitFunctionProtoType(const FunctionProtoType *T); 61 QualType VisitUnresolvedUsingType(const UnresolvedUsingType *T); 62 QualType VisitParenType(const ParenType *T); 63 QualType VisitTypedefType(const TypedefType *T); 64 QualType VisitTypeOfExprType(const TypeOfExprType *T); 65 // FIXME: DependentTypeOfExprType 66 QualType VisitTypeOfType(const TypeOfType *T); 67 QualType VisitDecltypeType(const DecltypeType *T); 68 QualType VisitUnaryTransformType(const UnaryTransformType *T); 69 QualType VisitAutoType(const AutoType *T); 70 QualType VisitInjectedClassNameType(const InjectedClassNameType *T); 71 // FIXME: DependentDecltypeType 72 QualType VisitRecordType(const RecordType *T); 73 QualType VisitEnumType(const EnumType *T); 74 QualType VisitAttributedType(const AttributedType *T); 75 QualType VisitTemplateTypeParmType(const TemplateTypeParmType *T); 76 QualType VisitSubstTemplateTypeParmType(const SubstTemplateTypeParmType *T); 77 QualType VisitTemplateSpecializationType(const TemplateSpecializationType *T); 78 QualType VisitElaboratedType(const ElaboratedType *T); 79 // FIXME: DependentNameType 80 QualType VisitPackExpansionType(const PackExpansionType *T); 81 // FIXME: DependentTemplateSpecializationType 82 QualType VisitObjCInterfaceType(const ObjCInterfaceType *T); 83 QualType VisitObjCObjectType(const ObjCObjectType *T); 84 QualType VisitObjCObjectPointerType(const ObjCObjectPointerType *T); 85 86 // Importing declarations 87 bool ImportDeclParts(NamedDecl *D, DeclContext *&DC, 88 DeclContext *&LexicalDC, DeclarationName &Name, 89 NamedDecl *&ToD, SourceLocation &Loc); 90 void ImportDefinitionIfNeeded(Decl *FromD, Decl *ToD = nullptr); 91 void ImportDeclarationNameLoc(const DeclarationNameInfo &From, 92 DeclarationNameInfo& To); 93 void ImportDeclContext(DeclContext *FromDC, bool ForceImport = false); 94 95 bool ImportCastPath(CastExpr *E, CXXCastPath &Path); 96 97 typedef DesignatedInitExpr::Designator Designator; 98 Designator ImportDesignator(const Designator &D); 99 100 101 /// \brief What we should import from the definition. 102 enum ImportDefinitionKind { 103 /// \brief Import the default subset of the definition, which might be 104 /// nothing (if minimal import is set) or might be everything (if minimal 105 /// import is not set). 106 IDK_Default, 107 /// \brief Import everything. 108 IDK_Everything, 109 /// \brief Import only the bare bones needed to establish a valid 110 /// DeclContext. 111 IDK_Basic 112 }; 113 114 bool shouldForceImportDeclContext(ImportDefinitionKind IDK) { 115 return IDK == IDK_Everything || 116 (IDK == IDK_Default && !Importer.isMinimalImport()); 117 } 118 119 bool ImportDefinition(RecordDecl *From, RecordDecl *To, 120 ImportDefinitionKind Kind = IDK_Default); 121 bool ImportDefinition(VarDecl *From, VarDecl *To, 122 ImportDefinitionKind Kind = IDK_Default); 123 bool ImportDefinition(EnumDecl *From, EnumDecl *To, 124 ImportDefinitionKind Kind = IDK_Default); 125 bool ImportDefinition(ObjCInterfaceDecl *From, ObjCInterfaceDecl *To, 126 ImportDefinitionKind Kind = IDK_Default); 127 bool ImportDefinition(ObjCProtocolDecl *From, ObjCProtocolDecl *To, 128 ImportDefinitionKind Kind = IDK_Default); 129 TemplateParameterList *ImportTemplateParameterList( 130 TemplateParameterList *Params); 131 TemplateArgument ImportTemplateArgument(const TemplateArgument &From); 132 Optional<TemplateArgumentLoc> ImportTemplateArgumentLoc( 133 const TemplateArgumentLoc &TALoc); 134 bool ImportTemplateArguments(const TemplateArgument *FromArgs, 135 unsigned NumFromArgs, 136 SmallVectorImpl<TemplateArgument> &ToArgs); 137 template <typename InContainerTy> 138 bool ImportTemplateArgumentListInfo(const InContainerTy &Container, 139 TemplateArgumentListInfo &ToTAInfo); 140 bool IsStructuralMatch(RecordDecl *FromRecord, RecordDecl *ToRecord, 141 bool Complain = true); 142 bool IsStructuralMatch(VarDecl *FromVar, VarDecl *ToVar, 143 bool Complain = true); 144 bool IsStructuralMatch(EnumDecl *FromEnum, EnumDecl *ToRecord); 145 bool IsStructuralMatch(EnumConstantDecl *FromEC, EnumConstantDecl *ToEC); 146 bool IsStructuralMatch(FunctionTemplateDecl *From, 147 FunctionTemplateDecl *To); 148 bool IsStructuralMatch(ClassTemplateDecl *From, ClassTemplateDecl *To); 149 bool IsStructuralMatch(VarTemplateDecl *From, VarTemplateDecl *To); 150 Decl *VisitDecl(Decl *D); 151 Decl *VisitEmptyDecl(EmptyDecl *D); 152 Decl *VisitAccessSpecDecl(AccessSpecDecl *D); 153 Decl *VisitStaticAssertDecl(StaticAssertDecl *D); 154 Decl *VisitTranslationUnitDecl(TranslationUnitDecl *D); 155 Decl *VisitNamespaceDecl(NamespaceDecl *D); 156 Decl *VisitNamespaceAliasDecl(NamespaceAliasDecl *D); 157 Decl *VisitTypedefNameDecl(TypedefNameDecl *D, bool IsAlias); 158 Decl *VisitTypedefDecl(TypedefDecl *D); 159 Decl *VisitTypeAliasDecl(TypeAliasDecl *D); 160 Decl *VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D); 161 Decl *VisitLabelDecl(LabelDecl *D); 162 Decl *VisitEnumDecl(EnumDecl *D); 163 Decl *VisitRecordDecl(RecordDecl *D); 164 Decl *VisitEnumConstantDecl(EnumConstantDecl *D); 165 Decl *VisitFunctionDecl(FunctionDecl *D); 166 Decl *VisitCXXMethodDecl(CXXMethodDecl *D); 167 Decl *VisitCXXConstructorDecl(CXXConstructorDecl *D); 168 Decl *VisitCXXDestructorDecl(CXXDestructorDecl *D); 169 Decl *VisitCXXConversionDecl(CXXConversionDecl *D); 170 Decl *VisitFieldDecl(FieldDecl *D); 171 Decl *VisitIndirectFieldDecl(IndirectFieldDecl *D); 172 Decl *VisitFriendDecl(FriendDecl *D); 173 Decl *VisitObjCIvarDecl(ObjCIvarDecl *D); 174 Decl *VisitVarDecl(VarDecl *D); 175 Decl *VisitImplicitParamDecl(ImplicitParamDecl *D); 176 Decl *VisitParmVarDecl(ParmVarDecl *D); 177 Decl *VisitObjCMethodDecl(ObjCMethodDecl *D); 178 Decl *VisitObjCTypeParamDecl(ObjCTypeParamDecl *D); 179 Decl *VisitObjCCategoryDecl(ObjCCategoryDecl *D); 180 Decl *VisitObjCProtocolDecl(ObjCProtocolDecl *D); 181 Decl *VisitLinkageSpecDecl(LinkageSpecDecl *D); 182 Decl *VisitUsingDecl(UsingDecl *D); 183 Decl *VisitUsingShadowDecl(UsingShadowDecl *D); 184 Decl *VisitUsingDirectiveDecl(UsingDirectiveDecl *D); 185 Decl *VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D); 186 Decl *VisitUnresolvedUsingTypenameDecl(UnresolvedUsingTypenameDecl *D); 187 188 189 ObjCTypeParamList *ImportObjCTypeParamList(ObjCTypeParamList *list); 190 Decl *VisitObjCInterfaceDecl(ObjCInterfaceDecl *D); 191 Decl *VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D); 192 Decl *VisitObjCImplementationDecl(ObjCImplementationDecl *D); 193 Decl *VisitObjCPropertyDecl(ObjCPropertyDecl *D); 194 Decl *VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D); 195 Decl *VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D); 196 Decl *VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D); 197 Decl *VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D); 198 Decl *VisitClassTemplateDecl(ClassTemplateDecl *D); 199 Decl *VisitClassTemplateSpecializationDecl( 200 ClassTemplateSpecializationDecl *D); 201 Decl *VisitVarTemplateDecl(VarTemplateDecl *D); 202 Decl *VisitVarTemplateSpecializationDecl(VarTemplateSpecializationDecl *D); 203 Decl *VisitFunctionTemplateDecl(FunctionTemplateDecl *D); 204 205 // Importing statements 206 DeclGroupRef ImportDeclGroup(DeclGroupRef DG); 207 208 Stmt *VisitStmt(Stmt *S); 209 Stmt *VisitGCCAsmStmt(GCCAsmStmt *S); 210 Stmt *VisitDeclStmt(DeclStmt *S); 211 Stmt *VisitNullStmt(NullStmt *S); 212 Stmt *VisitCompoundStmt(CompoundStmt *S); 213 Stmt *VisitCaseStmt(CaseStmt *S); 214 Stmt *VisitDefaultStmt(DefaultStmt *S); 215 Stmt *VisitLabelStmt(LabelStmt *S); 216 Stmt *VisitAttributedStmt(AttributedStmt *S); 217 Stmt *VisitIfStmt(IfStmt *S); 218 Stmt *VisitSwitchStmt(SwitchStmt *S); 219 Stmt *VisitWhileStmt(WhileStmt *S); 220 Stmt *VisitDoStmt(DoStmt *S); 221 Stmt *VisitForStmt(ForStmt *S); 222 Stmt *VisitGotoStmt(GotoStmt *S); 223 Stmt *VisitIndirectGotoStmt(IndirectGotoStmt *S); 224 Stmt *VisitContinueStmt(ContinueStmt *S); 225 Stmt *VisitBreakStmt(BreakStmt *S); 226 Stmt *VisitReturnStmt(ReturnStmt *S); 227 // FIXME: MSAsmStmt 228 // FIXME: SEHExceptStmt 229 // FIXME: SEHFinallyStmt 230 // FIXME: SEHTryStmt 231 // FIXME: SEHLeaveStmt 232 // FIXME: CapturedStmt 233 Stmt *VisitCXXCatchStmt(CXXCatchStmt *S); 234 Stmt *VisitCXXTryStmt(CXXTryStmt *S); 235 Stmt *VisitCXXForRangeStmt(CXXForRangeStmt *S); 236 // FIXME: MSDependentExistsStmt 237 Stmt *VisitObjCForCollectionStmt(ObjCForCollectionStmt *S); 238 Stmt *VisitObjCAtCatchStmt(ObjCAtCatchStmt *S); 239 Stmt *VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S); 240 Stmt *VisitObjCAtTryStmt(ObjCAtTryStmt *S); 241 Stmt *VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *S); 242 Stmt *VisitObjCAtThrowStmt(ObjCAtThrowStmt *S); 243 Stmt *VisitObjCAutoreleasePoolStmt(ObjCAutoreleasePoolStmt *S); 244 245 // Importing expressions 246 Expr *VisitExpr(Expr *E); 247 Expr *VisitVAArgExpr(VAArgExpr *E); 248 Expr *VisitGNUNullExpr(GNUNullExpr *E); 249 Expr *VisitPredefinedExpr(PredefinedExpr *E); 250 Expr *VisitDeclRefExpr(DeclRefExpr *E); 251 Expr *VisitImplicitValueInitExpr(ImplicitValueInitExpr *ILE); 252 Expr *VisitDesignatedInitExpr(DesignatedInitExpr *E); 253 Expr *VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E); 254 Expr *VisitIntegerLiteral(IntegerLiteral *E); 255 Expr *VisitFloatingLiteral(FloatingLiteral *E); 256 Expr *VisitCharacterLiteral(CharacterLiteral *E); 257 Expr *VisitStringLiteral(StringLiteral *E); 258 Expr *VisitCompoundLiteralExpr(CompoundLiteralExpr *E); 259 Expr *VisitAtomicExpr(AtomicExpr *E); 260 Expr *VisitAddrLabelExpr(AddrLabelExpr *E); 261 Expr *VisitParenExpr(ParenExpr *E); 262 Expr *VisitParenListExpr(ParenListExpr *E); 263 Expr *VisitStmtExpr(StmtExpr *E); 264 Expr *VisitUnaryOperator(UnaryOperator *E); 265 Expr *VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *E); 266 Expr *VisitBinaryOperator(BinaryOperator *E); 267 Expr *VisitConditionalOperator(ConditionalOperator *E); 268 Expr *VisitBinaryConditionalOperator(BinaryConditionalOperator *E); 269 Expr *VisitOpaqueValueExpr(OpaqueValueExpr *E); 270 Expr *VisitArrayTypeTraitExpr(ArrayTypeTraitExpr *E); 271 Expr *VisitExpressionTraitExpr(ExpressionTraitExpr *E); 272 Expr *VisitArraySubscriptExpr(ArraySubscriptExpr *E); 273 Expr *VisitCompoundAssignOperator(CompoundAssignOperator *E); 274 Expr *VisitImplicitCastExpr(ImplicitCastExpr *E); 275 Expr *VisitExplicitCastExpr(ExplicitCastExpr *E); 276 Expr *VisitOffsetOfExpr(OffsetOfExpr *OE); 277 Expr *VisitCXXThrowExpr(CXXThrowExpr *E); 278 Expr *VisitCXXNoexceptExpr(CXXNoexceptExpr *E); 279 Expr *VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E); 280 Expr *VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E); 281 Expr *VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E); 282 Expr *VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *CE); 283 Expr *VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *E); 284 Expr *VisitPackExpansionExpr(PackExpansionExpr *E); 285 Expr *VisitCXXNewExpr(CXXNewExpr *CE); 286 Expr *VisitCXXDeleteExpr(CXXDeleteExpr *E); 287 Expr *VisitCXXConstructExpr(CXXConstructExpr *E); 288 Expr *VisitCXXMemberCallExpr(CXXMemberCallExpr *E); 289 Expr *VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E); 290 Expr *VisitExprWithCleanups(ExprWithCleanups *EWC); 291 Expr *VisitCXXThisExpr(CXXThisExpr *E); 292 Expr *VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E); 293 Expr *VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E); 294 Expr *VisitMemberExpr(MemberExpr *E); 295 Expr *VisitCallExpr(CallExpr *E); 296 Expr *VisitInitListExpr(InitListExpr *E); 297 Expr *VisitArrayInitLoopExpr(ArrayInitLoopExpr *E); 298 Expr *VisitArrayInitIndexExpr(ArrayInitIndexExpr *E); 299 Expr *VisitCXXDefaultInitExpr(CXXDefaultInitExpr *E); 300 Expr *VisitCXXNamedCastExpr(CXXNamedCastExpr *E); 301 Expr *VisitSubstNonTypeTemplateParmExpr(SubstNonTypeTemplateParmExpr *E); 302 Expr *VisitTypeTraitExpr(TypeTraitExpr *E); 303 304 305 template<typename IIter, typename OIter> 306 void ImportArray(IIter Ibegin, IIter Iend, OIter Obegin) { 307 typedef typename std::remove_reference<decltype(*Obegin)>::type ItemT; 308 ASTImporter &ImporterRef = Importer; 309 std::transform(Ibegin, Iend, Obegin, 310 [&ImporterRef](ItemT From) -> ItemT { 311 return ImporterRef.Import(From); 312 }); 313 } 314 315 template<typename IIter, typename OIter> 316 bool ImportArrayChecked(IIter Ibegin, IIter Iend, OIter Obegin) { 317 typedef typename std::remove_reference<decltype(**Obegin)>::type ItemT; 318 ASTImporter &ImporterRef = Importer; 319 bool Failed = false; 320 std::transform(Ibegin, Iend, Obegin, 321 [&ImporterRef, &Failed](ItemT *From) -> ItemT * { 322 ItemT *To = cast_or_null<ItemT>( 323 ImporterRef.Import(From)); 324 if (!To && From) 325 Failed = true; 326 return To; 327 }); 328 return Failed; 329 } 330 331 template<typename InContainerTy, typename OutContainerTy> 332 bool ImportContainerChecked(const InContainerTy &InContainer, 333 OutContainerTy &OutContainer) { 334 return ImportArrayChecked(InContainer.begin(), InContainer.end(), 335 OutContainer.begin()); 336 } 337 338 template<typename InContainerTy, typename OIter> 339 bool ImportArrayChecked(const InContainerTy &InContainer, OIter Obegin) { 340 return ImportArrayChecked(InContainer.begin(), InContainer.end(), Obegin); 341 } 342 343 // Importing overrides. 344 void ImportOverrides(CXXMethodDecl *ToMethod, CXXMethodDecl *FromMethod); 345 }; 346 } 347 348 //---------------------------------------------------------------------------- 349 // Import Types 350 //---------------------------------------------------------------------------- 351 352 using namespace clang; 353 354 QualType ASTNodeImporter::VisitType(const Type *T) { 355 Importer.FromDiag(SourceLocation(), diag::err_unsupported_ast_node) 356 << T->getTypeClassName(); 357 return QualType(); 358 } 359 360 QualType ASTNodeImporter::VisitAtomicType(const AtomicType *T){ 361 QualType UnderlyingType = Importer.Import(T->getValueType()); 362 if(UnderlyingType.isNull()) 363 return QualType(); 364 365 return Importer.getToContext().getAtomicType(UnderlyingType); 366 } 367 368 QualType ASTNodeImporter::VisitBuiltinType(const BuiltinType *T) { 369 switch (T->getKind()) { 370 #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \ 371 case BuiltinType::Id: \ 372 return Importer.getToContext().SingletonId; 373 #include "clang/Basic/OpenCLImageTypes.def" 374 #define SHARED_SINGLETON_TYPE(Expansion) 375 #define BUILTIN_TYPE(Id, SingletonId) \ 376 case BuiltinType::Id: return Importer.getToContext().SingletonId; 377 #include "clang/AST/BuiltinTypes.def" 378 379 // FIXME: for Char16, Char32, and NullPtr, make sure that the "to" 380 // context supports C++. 381 382 // FIXME: for ObjCId, ObjCClass, and ObjCSel, make sure that the "to" 383 // context supports ObjC. 384 385 case BuiltinType::Char_U: 386 // The context we're importing from has an unsigned 'char'. If we're 387 // importing into a context with a signed 'char', translate to 388 // 'unsigned char' instead. 389 if (Importer.getToContext().getLangOpts().CharIsSigned) 390 return Importer.getToContext().UnsignedCharTy; 391 392 return Importer.getToContext().CharTy; 393 394 case BuiltinType::Char_S: 395 // The context we're importing from has an unsigned 'char'. If we're 396 // importing into a context with a signed 'char', translate to 397 // 'unsigned char' instead. 398 if (!Importer.getToContext().getLangOpts().CharIsSigned) 399 return Importer.getToContext().SignedCharTy; 400 401 return Importer.getToContext().CharTy; 402 403 case BuiltinType::WChar_S: 404 case BuiltinType::WChar_U: 405 // FIXME: If not in C++, shall we translate to the C equivalent of 406 // wchar_t? 407 return Importer.getToContext().WCharTy; 408 } 409 410 llvm_unreachable("Invalid BuiltinType Kind!"); 411 } 412 413 QualType ASTNodeImporter::VisitDecayedType(const DecayedType *T) { 414 QualType OrigT = Importer.Import(T->getOriginalType()); 415 if (OrigT.isNull()) 416 return QualType(); 417 418 return Importer.getToContext().getDecayedType(OrigT); 419 } 420 421 QualType ASTNodeImporter::VisitComplexType(const ComplexType *T) { 422 QualType ToElementType = Importer.Import(T->getElementType()); 423 if (ToElementType.isNull()) 424 return QualType(); 425 426 return Importer.getToContext().getComplexType(ToElementType); 427 } 428 429 QualType ASTNodeImporter::VisitPointerType(const PointerType *T) { 430 QualType ToPointeeType = Importer.Import(T->getPointeeType()); 431 if (ToPointeeType.isNull()) 432 return QualType(); 433 434 return Importer.getToContext().getPointerType(ToPointeeType); 435 } 436 437 QualType ASTNodeImporter::VisitBlockPointerType(const BlockPointerType *T) { 438 // FIXME: Check for blocks support in "to" context. 439 QualType ToPointeeType = Importer.Import(T->getPointeeType()); 440 if (ToPointeeType.isNull()) 441 return QualType(); 442 443 return Importer.getToContext().getBlockPointerType(ToPointeeType); 444 } 445 446 QualType 447 ASTNodeImporter::VisitLValueReferenceType(const LValueReferenceType *T) { 448 // FIXME: Check for C++ support in "to" context. 449 QualType ToPointeeType = Importer.Import(T->getPointeeTypeAsWritten()); 450 if (ToPointeeType.isNull()) 451 return QualType(); 452 453 return Importer.getToContext().getLValueReferenceType(ToPointeeType); 454 } 455 456 QualType 457 ASTNodeImporter::VisitRValueReferenceType(const RValueReferenceType *T) { 458 // FIXME: Check for C++0x support in "to" context. 459 QualType ToPointeeType = Importer.Import(T->getPointeeTypeAsWritten()); 460 if (ToPointeeType.isNull()) 461 return QualType(); 462 463 return Importer.getToContext().getRValueReferenceType(ToPointeeType); 464 } 465 466 QualType ASTNodeImporter::VisitMemberPointerType(const MemberPointerType *T) { 467 // FIXME: Check for C++ support in "to" context. 468 QualType ToPointeeType = Importer.Import(T->getPointeeType()); 469 if (ToPointeeType.isNull()) 470 return QualType(); 471 472 QualType ClassType = Importer.Import(QualType(T->getClass(), 0)); 473 return Importer.getToContext().getMemberPointerType(ToPointeeType, 474 ClassType.getTypePtr()); 475 } 476 477 QualType ASTNodeImporter::VisitConstantArrayType(const ConstantArrayType *T) { 478 QualType ToElementType = Importer.Import(T->getElementType()); 479 if (ToElementType.isNull()) 480 return QualType(); 481 482 return Importer.getToContext().getConstantArrayType(ToElementType, 483 T->getSize(), 484 T->getSizeModifier(), 485 T->getIndexTypeCVRQualifiers()); 486 } 487 488 QualType 489 ASTNodeImporter::VisitIncompleteArrayType(const IncompleteArrayType *T) { 490 QualType ToElementType = Importer.Import(T->getElementType()); 491 if (ToElementType.isNull()) 492 return QualType(); 493 494 return Importer.getToContext().getIncompleteArrayType(ToElementType, 495 T->getSizeModifier(), 496 T->getIndexTypeCVRQualifiers()); 497 } 498 499 QualType ASTNodeImporter::VisitVariableArrayType(const VariableArrayType *T) { 500 QualType ToElementType = Importer.Import(T->getElementType()); 501 if (ToElementType.isNull()) 502 return QualType(); 503 504 Expr *Size = Importer.Import(T->getSizeExpr()); 505 if (!Size) 506 return QualType(); 507 508 SourceRange Brackets = Importer.Import(T->getBracketsRange()); 509 return Importer.getToContext().getVariableArrayType(ToElementType, Size, 510 T->getSizeModifier(), 511 T->getIndexTypeCVRQualifiers(), 512 Brackets); 513 } 514 515 QualType ASTNodeImporter::VisitVectorType(const VectorType *T) { 516 QualType ToElementType = Importer.Import(T->getElementType()); 517 if (ToElementType.isNull()) 518 return QualType(); 519 520 return Importer.getToContext().getVectorType(ToElementType, 521 T->getNumElements(), 522 T->getVectorKind()); 523 } 524 525 QualType ASTNodeImporter::VisitExtVectorType(const ExtVectorType *T) { 526 QualType ToElementType = Importer.Import(T->getElementType()); 527 if (ToElementType.isNull()) 528 return QualType(); 529 530 return Importer.getToContext().getExtVectorType(ToElementType, 531 T->getNumElements()); 532 } 533 534 QualType 535 ASTNodeImporter::VisitFunctionNoProtoType(const FunctionNoProtoType *T) { 536 // FIXME: What happens if we're importing a function without a prototype 537 // into C++? Should we make it variadic? 538 QualType ToResultType = Importer.Import(T->getReturnType()); 539 if (ToResultType.isNull()) 540 return QualType(); 541 542 return Importer.getToContext().getFunctionNoProtoType(ToResultType, 543 T->getExtInfo()); 544 } 545 546 QualType ASTNodeImporter::VisitFunctionProtoType(const FunctionProtoType *T) { 547 QualType ToResultType = Importer.Import(T->getReturnType()); 548 if (ToResultType.isNull()) 549 return QualType(); 550 551 // Import argument types 552 SmallVector<QualType, 4> ArgTypes; 553 for (const auto &A : T->param_types()) { 554 QualType ArgType = Importer.Import(A); 555 if (ArgType.isNull()) 556 return QualType(); 557 ArgTypes.push_back(ArgType); 558 } 559 560 // Import exception types 561 SmallVector<QualType, 4> ExceptionTypes; 562 for (const auto &E : T->exceptions()) { 563 QualType ExceptionType = Importer.Import(E); 564 if (ExceptionType.isNull()) 565 return QualType(); 566 ExceptionTypes.push_back(ExceptionType); 567 } 568 569 FunctionProtoType::ExtProtoInfo FromEPI = T->getExtProtoInfo(); 570 FunctionProtoType::ExtProtoInfo ToEPI; 571 572 ToEPI.ExtInfo = FromEPI.ExtInfo; 573 ToEPI.Variadic = FromEPI.Variadic; 574 ToEPI.HasTrailingReturn = FromEPI.HasTrailingReturn; 575 ToEPI.TypeQuals = FromEPI.TypeQuals; 576 ToEPI.RefQualifier = FromEPI.RefQualifier; 577 ToEPI.ExceptionSpec.Type = FromEPI.ExceptionSpec.Type; 578 ToEPI.ExceptionSpec.Exceptions = ExceptionTypes; 579 ToEPI.ExceptionSpec.NoexceptExpr = 580 Importer.Import(FromEPI.ExceptionSpec.NoexceptExpr); 581 ToEPI.ExceptionSpec.SourceDecl = cast_or_null<FunctionDecl>( 582 Importer.Import(FromEPI.ExceptionSpec.SourceDecl)); 583 ToEPI.ExceptionSpec.SourceTemplate = cast_or_null<FunctionDecl>( 584 Importer.Import(FromEPI.ExceptionSpec.SourceTemplate)); 585 586 return Importer.getToContext().getFunctionType(ToResultType, ArgTypes, ToEPI); 587 } 588 589 QualType ASTNodeImporter::VisitUnresolvedUsingType( 590 const UnresolvedUsingType *T) { 591 UnresolvedUsingTypenameDecl *ToD = cast_or_null<UnresolvedUsingTypenameDecl>( 592 Importer.Import(T->getDecl())); 593 if (!ToD) 594 return QualType(); 595 596 UnresolvedUsingTypenameDecl *ToPrevD = 597 cast_or_null<UnresolvedUsingTypenameDecl>( 598 Importer.Import(T->getDecl()->getPreviousDecl())); 599 if (!ToPrevD && T->getDecl()->getPreviousDecl()) 600 return QualType(); 601 602 return Importer.getToContext().getTypeDeclType(ToD, ToPrevD); 603 } 604 605 QualType ASTNodeImporter::VisitParenType(const ParenType *T) { 606 QualType ToInnerType = Importer.Import(T->getInnerType()); 607 if (ToInnerType.isNull()) 608 return QualType(); 609 610 return Importer.getToContext().getParenType(ToInnerType); 611 } 612 613 QualType ASTNodeImporter::VisitTypedefType(const TypedefType *T) { 614 TypedefNameDecl *ToDecl 615 = dyn_cast_or_null<TypedefNameDecl>(Importer.Import(T->getDecl())); 616 if (!ToDecl) 617 return QualType(); 618 619 return Importer.getToContext().getTypeDeclType(ToDecl); 620 } 621 622 QualType ASTNodeImporter::VisitTypeOfExprType(const TypeOfExprType *T) { 623 Expr *ToExpr = Importer.Import(T->getUnderlyingExpr()); 624 if (!ToExpr) 625 return QualType(); 626 627 return Importer.getToContext().getTypeOfExprType(ToExpr); 628 } 629 630 QualType ASTNodeImporter::VisitTypeOfType(const TypeOfType *T) { 631 QualType ToUnderlyingType = Importer.Import(T->getUnderlyingType()); 632 if (ToUnderlyingType.isNull()) 633 return QualType(); 634 635 return Importer.getToContext().getTypeOfType(ToUnderlyingType); 636 } 637 638 QualType ASTNodeImporter::VisitDecltypeType(const DecltypeType *T) { 639 // FIXME: Make sure that the "to" context supports C++0x! 640 Expr *ToExpr = Importer.Import(T->getUnderlyingExpr()); 641 if (!ToExpr) 642 return QualType(); 643 644 QualType UnderlyingType = Importer.Import(T->getUnderlyingType()); 645 if (UnderlyingType.isNull()) 646 return QualType(); 647 648 return Importer.getToContext().getDecltypeType(ToExpr, UnderlyingType); 649 } 650 651 QualType ASTNodeImporter::VisitUnaryTransformType(const UnaryTransformType *T) { 652 QualType ToBaseType = Importer.Import(T->getBaseType()); 653 QualType ToUnderlyingType = Importer.Import(T->getUnderlyingType()); 654 if (ToBaseType.isNull() || ToUnderlyingType.isNull()) 655 return QualType(); 656 657 return Importer.getToContext().getUnaryTransformType(ToBaseType, 658 ToUnderlyingType, 659 T->getUTTKind()); 660 } 661 662 QualType ASTNodeImporter::VisitAutoType(const AutoType *T) { 663 // FIXME: Make sure that the "to" context supports C++11! 664 QualType FromDeduced = T->getDeducedType(); 665 QualType ToDeduced; 666 if (!FromDeduced.isNull()) { 667 ToDeduced = Importer.Import(FromDeduced); 668 if (ToDeduced.isNull()) 669 return QualType(); 670 } 671 672 return Importer.getToContext().getAutoType(ToDeduced, T->getKeyword(), 673 /*IsDependent*/false); 674 } 675 676 QualType ASTNodeImporter::VisitInjectedClassNameType( 677 const InjectedClassNameType *T) { 678 CXXRecordDecl *D = cast_or_null<CXXRecordDecl>(Importer.Import(T->getDecl())); 679 if (!D) 680 return QualType(); 681 682 QualType InjType = Importer.Import(T->getInjectedSpecializationType()); 683 if (InjType.isNull()) 684 return QualType(); 685 686 // FIXME: ASTContext::getInjectedClassNameType is not suitable for AST reading 687 // See comments in InjectedClassNameType definition for details 688 // return Importer.getToContext().getInjectedClassNameType(D, InjType); 689 enum { 690 TypeAlignmentInBits = 4, 691 TypeAlignment = 1 << TypeAlignmentInBits 692 }; 693 694 return QualType(new (Importer.getToContext(), TypeAlignment) 695 InjectedClassNameType(D, InjType), 0); 696 } 697 698 QualType ASTNodeImporter::VisitRecordType(const RecordType *T) { 699 RecordDecl *ToDecl 700 = dyn_cast_or_null<RecordDecl>(Importer.Import(T->getDecl())); 701 if (!ToDecl) 702 return QualType(); 703 704 return Importer.getToContext().getTagDeclType(ToDecl); 705 } 706 707 QualType ASTNodeImporter::VisitEnumType(const EnumType *T) { 708 EnumDecl *ToDecl 709 = dyn_cast_or_null<EnumDecl>(Importer.Import(T->getDecl())); 710 if (!ToDecl) 711 return QualType(); 712 713 return Importer.getToContext().getTagDeclType(ToDecl); 714 } 715 716 QualType ASTNodeImporter::VisitAttributedType(const AttributedType *T) { 717 QualType FromModifiedType = T->getModifiedType(); 718 QualType FromEquivalentType = T->getEquivalentType(); 719 QualType ToModifiedType; 720 QualType ToEquivalentType; 721 722 if (!FromModifiedType.isNull()) { 723 ToModifiedType = Importer.Import(FromModifiedType); 724 if (ToModifiedType.isNull()) 725 return QualType(); 726 } 727 if (!FromEquivalentType.isNull()) { 728 ToEquivalentType = Importer.Import(FromEquivalentType); 729 if (ToEquivalentType.isNull()) 730 return QualType(); 731 } 732 733 return Importer.getToContext().getAttributedType(T->getAttrKind(), 734 ToModifiedType, ToEquivalentType); 735 } 736 737 738 QualType ASTNodeImporter::VisitTemplateTypeParmType( 739 const TemplateTypeParmType *T) { 740 TemplateTypeParmDecl *ParmDecl = 741 cast_or_null<TemplateTypeParmDecl>(Importer.Import(T->getDecl())); 742 if (!ParmDecl && T->getDecl()) 743 return QualType(); 744 745 return Importer.getToContext().getTemplateTypeParmType( 746 T->getDepth(), T->getIndex(), T->isParameterPack(), ParmDecl); 747 } 748 749 QualType ASTNodeImporter::VisitSubstTemplateTypeParmType( 750 const SubstTemplateTypeParmType *T) { 751 const TemplateTypeParmType *Replaced = 752 cast_or_null<TemplateTypeParmType>(Importer.Import( 753 QualType(T->getReplacedParameter(), 0)).getTypePtr()); 754 if (!Replaced) 755 return QualType(); 756 757 QualType Replacement = Importer.Import(T->getReplacementType()); 758 if (Replacement.isNull()) 759 return QualType(); 760 Replacement = Replacement.getCanonicalType(); 761 762 return Importer.getToContext().getSubstTemplateTypeParmType( 763 Replaced, Replacement); 764 } 765 766 QualType ASTNodeImporter::VisitTemplateSpecializationType( 767 const TemplateSpecializationType *T) { 768 TemplateName ToTemplate = Importer.Import(T->getTemplateName()); 769 if (ToTemplate.isNull()) 770 return QualType(); 771 772 SmallVector<TemplateArgument, 2> ToTemplateArgs; 773 if (ImportTemplateArguments(T->getArgs(), T->getNumArgs(), ToTemplateArgs)) 774 return QualType(); 775 776 QualType ToCanonType; 777 if (!QualType(T, 0).isCanonical()) { 778 QualType FromCanonType 779 = Importer.getFromContext().getCanonicalType(QualType(T, 0)); 780 ToCanonType =Importer.Import(FromCanonType); 781 if (ToCanonType.isNull()) 782 return QualType(); 783 } 784 return Importer.getToContext().getTemplateSpecializationType(ToTemplate, 785 ToTemplateArgs, 786 ToCanonType); 787 } 788 789 QualType ASTNodeImporter::VisitElaboratedType(const ElaboratedType *T) { 790 NestedNameSpecifier *ToQualifier = nullptr; 791 // Note: the qualifier in an ElaboratedType is optional. 792 if (T->getQualifier()) { 793 ToQualifier = Importer.Import(T->getQualifier()); 794 if (!ToQualifier) 795 return QualType(); 796 } 797 798 QualType ToNamedType = Importer.Import(T->getNamedType()); 799 if (ToNamedType.isNull()) 800 return QualType(); 801 802 return Importer.getToContext().getElaboratedType(T->getKeyword(), 803 ToQualifier, ToNamedType); 804 } 805 806 QualType ASTNodeImporter::VisitPackExpansionType(const PackExpansionType *T) { 807 QualType Pattern = Importer.Import(T->getPattern()); 808 if (Pattern.isNull()) 809 return QualType(); 810 811 return Importer.getToContext().getPackExpansionType(Pattern, 812 T->getNumExpansions()); 813 } 814 815 QualType ASTNodeImporter::VisitObjCInterfaceType(const ObjCInterfaceType *T) { 816 ObjCInterfaceDecl *Class 817 = dyn_cast_or_null<ObjCInterfaceDecl>(Importer.Import(T->getDecl())); 818 if (!Class) 819 return QualType(); 820 821 return Importer.getToContext().getObjCInterfaceType(Class); 822 } 823 824 QualType ASTNodeImporter::VisitObjCObjectType(const ObjCObjectType *T) { 825 QualType ToBaseType = Importer.Import(T->getBaseType()); 826 if (ToBaseType.isNull()) 827 return QualType(); 828 829 SmallVector<QualType, 4> TypeArgs; 830 for (auto TypeArg : T->getTypeArgsAsWritten()) { 831 QualType ImportedTypeArg = Importer.Import(TypeArg); 832 if (ImportedTypeArg.isNull()) 833 return QualType(); 834 835 TypeArgs.push_back(ImportedTypeArg); 836 } 837 838 SmallVector<ObjCProtocolDecl *, 4> Protocols; 839 for (auto *P : T->quals()) { 840 ObjCProtocolDecl *Protocol 841 = dyn_cast_or_null<ObjCProtocolDecl>(Importer.Import(P)); 842 if (!Protocol) 843 return QualType(); 844 Protocols.push_back(Protocol); 845 } 846 847 return Importer.getToContext().getObjCObjectType(ToBaseType, TypeArgs, 848 Protocols, 849 T->isKindOfTypeAsWritten()); 850 } 851 852 QualType 853 ASTNodeImporter::VisitObjCObjectPointerType(const ObjCObjectPointerType *T) { 854 QualType ToPointeeType = Importer.Import(T->getPointeeType()); 855 if (ToPointeeType.isNull()) 856 return QualType(); 857 858 return Importer.getToContext().getObjCObjectPointerType(ToPointeeType); 859 } 860 861 //---------------------------------------------------------------------------- 862 // Import Declarations 863 //---------------------------------------------------------------------------- 864 bool ASTNodeImporter::ImportDeclParts(NamedDecl *D, DeclContext *&DC, 865 DeclContext *&LexicalDC, 866 DeclarationName &Name, 867 NamedDecl *&ToD, 868 SourceLocation &Loc) { 869 // Import the context of this declaration. 870 DC = Importer.ImportContext(D->getDeclContext()); 871 if (!DC) 872 return true; 873 874 LexicalDC = DC; 875 if (D->getDeclContext() != D->getLexicalDeclContext()) { 876 LexicalDC = Importer.ImportContext(D->getLexicalDeclContext()); 877 if (!LexicalDC) 878 return true; 879 } 880 881 // Import the name of this declaration. 882 Name = Importer.Import(D->getDeclName()); 883 if (D->getDeclName() && !Name) 884 return true; 885 886 // Import the location of this declaration. 887 Loc = Importer.Import(D->getLocation()); 888 ToD = cast_or_null<NamedDecl>(Importer.GetAlreadyImportedOrNull(D)); 889 return false; 890 } 891 892 void ASTNodeImporter::ImportDefinitionIfNeeded(Decl *FromD, Decl *ToD) { 893 if (!FromD) 894 return; 895 896 if (!ToD) { 897 ToD = Importer.Import(FromD); 898 if (!ToD) 899 return; 900 } 901 902 if (RecordDecl *FromRecord = dyn_cast<RecordDecl>(FromD)) { 903 if (RecordDecl *ToRecord = cast_or_null<RecordDecl>(ToD)) { 904 if (FromRecord->getDefinition() && FromRecord->isCompleteDefinition() && !ToRecord->getDefinition()) { 905 ImportDefinition(FromRecord, ToRecord); 906 } 907 } 908 return; 909 } 910 911 if (EnumDecl *FromEnum = dyn_cast<EnumDecl>(FromD)) { 912 if (EnumDecl *ToEnum = cast_or_null<EnumDecl>(ToD)) { 913 if (FromEnum->getDefinition() && !ToEnum->getDefinition()) { 914 ImportDefinition(FromEnum, ToEnum); 915 } 916 } 917 return; 918 } 919 } 920 921 void 922 ASTNodeImporter::ImportDeclarationNameLoc(const DeclarationNameInfo &From, 923 DeclarationNameInfo& To) { 924 // NOTE: To.Name and To.Loc are already imported. 925 // We only have to import To.LocInfo. 926 switch (To.getName().getNameKind()) { 927 case DeclarationName::Identifier: 928 case DeclarationName::ObjCZeroArgSelector: 929 case DeclarationName::ObjCOneArgSelector: 930 case DeclarationName::ObjCMultiArgSelector: 931 case DeclarationName::CXXUsingDirective: 932 case DeclarationName::CXXDeductionGuideName: 933 return; 934 935 case DeclarationName::CXXOperatorName: { 936 SourceRange Range = From.getCXXOperatorNameRange(); 937 To.setCXXOperatorNameRange(Importer.Import(Range)); 938 return; 939 } 940 case DeclarationName::CXXLiteralOperatorName: { 941 SourceLocation Loc = From.getCXXLiteralOperatorNameLoc(); 942 To.setCXXLiteralOperatorNameLoc(Importer.Import(Loc)); 943 return; 944 } 945 case DeclarationName::CXXConstructorName: 946 case DeclarationName::CXXDestructorName: 947 case DeclarationName::CXXConversionFunctionName: { 948 TypeSourceInfo *FromTInfo = From.getNamedTypeInfo(); 949 To.setNamedTypeInfo(Importer.Import(FromTInfo)); 950 return; 951 } 952 } 953 llvm_unreachable("Unknown name kind."); 954 } 955 956 void ASTNodeImporter::ImportDeclContext(DeclContext *FromDC, bool ForceImport) { 957 if (Importer.isMinimalImport() && !ForceImport) { 958 Importer.ImportContext(FromDC); 959 return; 960 } 961 962 for (auto *From : FromDC->decls()) 963 Importer.Import(From); 964 } 965 966 bool ASTNodeImporter::ImportDefinition(RecordDecl *From, RecordDecl *To, 967 ImportDefinitionKind Kind) { 968 if (To->getDefinition() || To->isBeingDefined()) { 969 if (Kind == IDK_Everything) 970 ImportDeclContext(From, /*ForceImport=*/true); 971 972 return false; 973 } 974 975 To->startDefinition(); 976 977 // Add base classes. 978 if (CXXRecordDecl *ToCXX = dyn_cast<CXXRecordDecl>(To)) { 979 CXXRecordDecl *FromCXX = cast<CXXRecordDecl>(From); 980 981 struct CXXRecordDecl::DefinitionData &ToData = ToCXX->data(); 982 struct CXXRecordDecl::DefinitionData &FromData = FromCXX->data(); 983 ToData.UserDeclaredConstructor = FromData.UserDeclaredConstructor; 984 ToData.UserDeclaredSpecialMembers = FromData.UserDeclaredSpecialMembers; 985 ToData.Aggregate = FromData.Aggregate; 986 ToData.PlainOldData = FromData.PlainOldData; 987 ToData.Empty = FromData.Empty; 988 ToData.Polymorphic = FromData.Polymorphic; 989 ToData.Abstract = FromData.Abstract; 990 ToData.IsStandardLayout = FromData.IsStandardLayout; 991 ToData.HasNoNonEmptyBases = FromData.HasNoNonEmptyBases; 992 ToData.HasPrivateFields = FromData.HasPrivateFields; 993 ToData.HasProtectedFields = FromData.HasProtectedFields; 994 ToData.HasPublicFields = FromData.HasPublicFields; 995 ToData.HasMutableFields = FromData.HasMutableFields; 996 ToData.HasVariantMembers = FromData.HasVariantMembers; 997 ToData.HasOnlyCMembers = FromData.HasOnlyCMembers; 998 ToData.HasInClassInitializer = FromData.HasInClassInitializer; 999 ToData.HasUninitializedReferenceMember 1000 = FromData.HasUninitializedReferenceMember; 1001 ToData.HasUninitializedFields = FromData.HasUninitializedFields; 1002 ToData.HasInheritedConstructor = FromData.HasInheritedConstructor; 1003 ToData.HasInheritedAssignment = FromData.HasInheritedAssignment; 1004 ToData.NeedOverloadResolutionForCopyConstructor 1005 = FromData.NeedOverloadResolutionForCopyConstructor; 1006 ToData.NeedOverloadResolutionForMoveConstructor 1007 = FromData.NeedOverloadResolutionForMoveConstructor; 1008 ToData.NeedOverloadResolutionForMoveAssignment 1009 = FromData.NeedOverloadResolutionForMoveAssignment; 1010 ToData.NeedOverloadResolutionForDestructor 1011 = FromData.NeedOverloadResolutionForDestructor; 1012 ToData.DefaultedCopyConstructorIsDeleted 1013 = FromData.DefaultedCopyConstructorIsDeleted; 1014 ToData.DefaultedMoveConstructorIsDeleted 1015 = FromData.DefaultedMoveConstructorIsDeleted; 1016 ToData.DefaultedMoveAssignmentIsDeleted 1017 = FromData.DefaultedMoveAssignmentIsDeleted; 1018 ToData.DefaultedDestructorIsDeleted = FromData.DefaultedDestructorIsDeleted; 1019 ToData.HasTrivialSpecialMembers = FromData.HasTrivialSpecialMembers; 1020 ToData.HasIrrelevantDestructor = FromData.HasIrrelevantDestructor; 1021 ToData.HasConstexprNonCopyMoveConstructor 1022 = FromData.HasConstexprNonCopyMoveConstructor; 1023 ToData.HasDefaultedDefaultConstructor 1024 = FromData.HasDefaultedDefaultConstructor; 1025 ToData.CanPassInRegisters = FromData.CanPassInRegisters; 1026 ToData.DefaultedDefaultConstructorIsConstexpr 1027 = FromData.DefaultedDefaultConstructorIsConstexpr; 1028 ToData.HasConstexprDefaultConstructor 1029 = FromData.HasConstexprDefaultConstructor; 1030 ToData.HasNonLiteralTypeFieldsOrBases 1031 = FromData.HasNonLiteralTypeFieldsOrBases; 1032 // ComputedVisibleConversions not imported. 1033 ToData.UserProvidedDefaultConstructor 1034 = FromData.UserProvidedDefaultConstructor; 1035 ToData.DeclaredSpecialMembers = FromData.DeclaredSpecialMembers; 1036 ToData.ImplicitCopyConstructorCanHaveConstParamForVBase 1037 = FromData.ImplicitCopyConstructorCanHaveConstParamForVBase; 1038 ToData.ImplicitCopyConstructorCanHaveConstParamForNonVBase 1039 = FromData.ImplicitCopyConstructorCanHaveConstParamForNonVBase; 1040 ToData.ImplicitCopyAssignmentHasConstParam 1041 = FromData.ImplicitCopyAssignmentHasConstParam; 1042 ToData.HasDeclaredCopyConstructorWithConstParam 1043 = FromData.HasDeclaredCopyConstructorWithConstParam; 1044 ToData.HasDeclaredCopyAssignmentWithConstParam 1045 = FromData.HasDeclaredCopyAssignmentWithConstParam; 1046 ToData.IsLambda = FromData.IsLambda; 1047 1048 SmallVector<CXXBaseSpecifier *, 4> Bases; 1049 for (const auto &Base1 : FromCXX->bases()) { 1050 QualType T = Importer.Import(Base1.getType()); 1051 if (T.isNull()) 1052 return true; 1053 1054 SourceLocation EllipsisLoc; 1055 if (Base1.isPackExpansion()) 1056 EllipsisLoc = Importer.Import(Base1.getEllipsisLoc()); 1057 1058 // Ensure that we have a definition for the base. 1059 ImportDefinitionIfNeeded(Base1.getType()->getAsCXXRecordDecl()); 1060 1061 Bases.push_back( 1062 new (Importer.getToContext()) 1063 CXXBaseSpecifier(Importer.Import(Base1.getSourceRange()), 1064 Base1.isVirtual(), 1065 Base1.isBaseOfClass(), 1066 Base1.getAccessSpecifierAsWritten(), 1067 Importer.Import(Base1.getTypeSourceInfo()), 1068 EllipsisLoc)); 1069 } 1070 if (!Bases.empty()) 1071 ToCXX->setBases(Bases.data(), Bases.size()); 1072 } 1073 1074 if (shouldForceImportDeclContext(Kind)) 1075 ImportDeclContext(From, /*ForceImport=*/true); 1076 1077 To->completeDefinition(); 1078 return false; 1079 } 1080 1081 bool ASTNodeImporter::ImportDefinition(VarDecl *From, VarDecl *To, 1082 ImportDefinitionKind Kind) { 1083 if (To->getAnyInitializer()) 1084 return false; 1085 1086 // FIXME: Can we really import any initializer? Alternatively, we could force 1087 // ourselves to import every declaration of a variable and then only use 1088 // getInit() here. 1089 To->setInit(Importer.Import(const_cast<Expr *>(From->getAnyInitializer()))); 1090 1091 // FIXME: Other bits to merge? 1092 1093 return false; 1094 } 1095 1096 bool ASTNodeImporter::ImportDefinition(EnumDecl *From, EnumDecl *To, 1097 ImportDefinitionKind Kind) { 1098 if (To->getDefinition() || To->isBeingDefined()) { 1099 if (Kind == IDK_Everything) 1100 ImportDeclContext(From, /*ForceImport=*/true); 1101 return false; 1102 } 1103 1104 To->startDefinition(); 1105 1106 QualType T = Importer.Import(Importer.getFromContext().getTypeDeclType(From)); 1107 if (T.isNull()) 1108 return true; 1109 1110 QualType ToPromotionType = Importer.Import(From->getPromotionType()); 1111 if (ToPromotionType.isNull()) 1112 return true; 1113 1114 if (shouldForceImportDeclContext(Kind)) 1115 ImportDeclContext(From, /*ForceImport=*/true); 1116 1117 // FIXME: we might need to merge the number of positive or negative bits 1118 // if the enumerator lists don't match. 1119 To->completeDefinition(T, ToPromotionType, 1120 From->getNumPositiveBits(), 1121 From->getNumNegativeBits()); 1122 return false; 1123 } 1124 1125 TemplateParameterList *ASTNodeImporter::ImportTemplateParameterList( 1126 TemplateParameterList *Params) { 1127 SmallVector<NamedDecl *, 4> ToParams(Params->size()); 1128 if (ImportContainerChecked(*Params, ToParams)) 1129 return nullptr; 1130 1131 Expr *ToRequiresClause; 1132 if (Expr *const R = Params->getRequiresClause()) { 1133 ToRequiresClause = Importer.Import(R); 1134 if (!ToRequiresClause) 1135 return nullptr; 1136 } else { 1137 ToRequiresClause = nullptr; 1138 } 1139 1140 return TemplateParameterList::Create(Importer.getToContext(), 1141 Importer.Import(Params->getTemplateLoc()), 1142 Importer.Import(Params->getLAngleLoc()), 1143 ToParams, 1144 Importer.Import(Params->getRAngleLoc()), 1145 ToRequiresClause); 1146 } 1147 1148 TemplateArgument 1149 ASTNodeImporter::ImportTemplateArgument(const TemplateArgument &From) { 1150 switch (From.getKind()) { 1151 case TemplateArgument::Null: 1152 return TemplateArgument(); 1153 1154 case TemplateArgument::Type: { 1155 QualType ToType = Importer.Import(From.getAsType()); 1156 if (ToType.isNull()) 1157 return TemplateArgument(); 1158 return TemplateArgument(ToType); 1159 } 1160 1161 case TemplateArgument::Integral: { 1162 QualType ToType = Importer.Import(From.getIntegralType()); 1163 if (ToType.isNull()) 1164 return TemplateArgument(); 1165 return TemplateArgument(From, ToType); 1166 } 1167 1168 case TemplateArgument::Declaration: { 1169 ValueDecl *To = cast_or_null<ValueDecl>(Importer.Import(From.getAsDecl())); 1170 QualType ToType = Importer.Import(From.getParamTypeForDecl()); 1171 if (!To || ToType.isNull()) 1172 return TemplateArgument(); 1173 return TemplateArgument(To, ToType); 1174 } 1175 1176 case TemplateArgument::NullPtr: { 1177 QualType ToType = Importer.Import(From.getNullPtrType()); 1178 if (ToType.isNull()) 1179 return TemplateArgument(); 1180 return TemplateArgument(ToType, /*isNullPtr*/true); 1181 } 1182 1183 case TemplateArgument::Template: { 1184 TemplateName ToTemplate = Importer.Import(From.getAsTemplate()); 1185 if (ToTemplate.isNull()) 1186 return TemplateArgument(); 1187 1188 return TemplateArgument(ToTemplate); 1189 } 1190 1191 case TemplateArgument::TemplateExpansion: { 1192 TemplateName ToTemplate 1193 = Importer.Import(From.getAsTemplateOrTemplatePattern()); 1194 if (ToTemplate.isNull()) 1195 return TemplateArgument(); 1196 1197 return TemplateArgument(ToTemplate, From.getNumTemplateExpansions()); 1198 } 1199 1200 case TemplateArgument::Expression: 1201 if (Expr *ToExpr = Importer.Import(From.getAsExpr())) 1202 return TemplateArgument(ToExpr); 1203 return TemplateArgument(); 1204 1205 case TemplateArgument::Pack: { 1206 SmallVector<TemplateArgument, 2> ToPack; 1207 ToPack.reserve(From.pack_size()); 1208 if (ImportTemplateArguments(From.pack_begin(), From.pack_size(), ToPack)) 1209 return TemplateArgument(); 1210 1211 return TemplateArgument( 1212 llvm::makeArrayRef(ToPack).copy(Importer.getToContext())); 1213 } 1214 } 1215 1216 llvm_unreachable("Invalid template argument kind"); 1217 } 1218 1219 Optional<TemplateArgumentLoc> 1220 ASTNodeImporter::ImportTemplateArgumentLoc(const TemplateArgumentLoc &TALoc) { 1221 TemplateArgument Arg = ImportTemplateArgument(TALoc.getArgument()); 1222 TemplateArgumentLocInfo FromInfo = TALoc.getLocInfo(); 1223 TemplateArgumentLocInfo ToInfo; 1224 if (Arg.getKind() == TemplateArgument::Expression) { 1225 Expr *E = Importer.Import(FromInfo.getAsExpr()); 1226 ToInfo = TemplateArgumentLocInfo(E); 1227 if (!E) 1228 return None; 1229 } else if (Arg.getKind() == TemplateArgument::Type) { 1230 if (TypeSourceInfo *TSI = Importer.Import(FromInfo.getAsTypeSourceInfo())) 1231 ToInfo = TemplateArgumentLocInfo(TSI); 1232 else 1233 return None; 1234 } else { 1235 ToInfo = TemplateArgumentLocInfo( 1236 Importer.Import(FromInfo.getTemplateQualifierLoc()), 1237 Importer.Import(FromInfo.getTemplateNameLoc()), 1238 Importer.Import(FromInfo.getTemplateEllipsisLoc())); 1239 } 1240 return TemplateArgumentLoc(Arg, ToInfo); 1241 } 1242 1243 bool ASTNodeImporter::ImportTemplateArguments(const TemplateArgument *FromArgs, 1244 unsigned NumFromArgs, 1245 SmallVectorImpl<TemplateArgument> &ToArgs) { 1246 for (unsigned I = 0; I != NumFromArgs; ++I) { 1247 TemplateArgument To = ImportTemplateArgument(FromArgs[I]); 1248 if (To.isNull() && !FromArgs[I].isNull()) 1249 return true; 1250 1251 ToArgs.push_back(To); 1252 } 1253 1254 return false; 1255 } 1256 1257 template <typename InContainerTy> 1258 bool ASTNodeImporter::ImportTemplateArgumentListInfo( 1259 const InContainerTy &Container, TemplateArgumentListInfo &ToTAInfo) { 1260 for (const auto &FromLoc : Container) { 1261 if (auto ToLoc = ImportTemplateArgumentLoc(FromLoc)) 1262 ToTAInfo.addArgument(*ToLoc); 1263 else 1264 return true; 1265 } 1266 return false; 1267 } 1268 1269 bool ASTNodeImporter::IsStructuralMatch(RecordDecl *FromRecord, 1270 RecordDecl *ToRecord, bool Complain) { 1271 // Eliminate a potential failure point where we attempt to re-import 1272 // something we're trying to import while completing ToRecord. 1273 Decl *ToOrigin = Importer.GetOriginalDecl(ToRecord); 1274 if (ToOrigin) { 1275 RecordDecl *ToOriginRecord = dyn_cast<RecordDecl>(ToOrigin); 1276 if (ToOriginRecord) 1277 ToRecord = ToOriginRecord; 1278 } 1279 1280 StructuralEquivalenceContext Ctx(Importer.getFromContext(), 1281 ToRecord->getASTContext(), 1282 Importer.getNonEquivalentDecls(), 1283 false, Complain); 1284 return Ctx.IsStructurallyEquivalent(FromRecord, ToRecord); 1285 } 1286 1287 bool ASTNodeImporter::IsStructuralMatch(VarDecl *FromVar, VarDecl *ToVar, 1288 bool Complain) { 1289 StructuralEquivalenceContext Ctx( 1290 Importer.getFromContext(), Importer.getToContext(), 1291 Importer.getNonEquivalentDecls(), false, Complain); 1292 return Ctx.IsStructurallyEquivalent(FromVar, ToVar); 1293 } 1294 1295 bool ASTNodeImporter::IsStructuralMatch(EnumDecl *FromEnum, EnumDecl *ToEnum) { 1296 StructuralEquivalenceContext Ctx(Importer.getFromContext(), 1297 Importer.getToContext(), 1298 Importer.getNonEquivalentDecls()); 1299 return Ctx.IsStructurallyEquivalent(FromEnum, ToEnum); 1300 } 1301 1302 bool ASTNodeImporter::IsStructuralMatch(FunctionTemplateDecl *From, 1303 FunctionTemplateDecl *To) { 1304 StructuralEquivalenceContext Ctx( 1305 Importer.getFromContext(), Importer.getToContext(), 1306 Importer.getNonEquivalentDecls(), false, false); 1307 return Ctx.IsStructurallyEquivalent(From, To); 1308 } 1309 1310 bool ASTNodeImporter::IsStructuralMatch(EnumConstantDecl *FromEC, 1311 EnumConstantDecl *ToEC) 1312 { 1313 const llvm::APSInt &FromVal = FromEC->getInitVal(); 1314 const llvm::APSInt &ToVal = ToEC->getInitVal(); 1315 1316 return FromVal.isSigned() == ToVal.isSigned() && 1317 FromVal.getBitWidth() == ToVal.getBitWidth() && 1318 FromVal == ToVal; 1319 } 1320 1321 bool ASTNodeImporter::IsStructuralMatch(ClassTemplateDecl *From, 1322 ClassTemplateDecl *To) { 1323 StructuralEquivalenceContext Ctx(Importer.getFromContext(), 1324 Importer.getToContext(), 1325 Importer.getNonEquivalentDecls()); 1326 return Ctx.IsStructurallyEquivalent(From, To); 1327 } 1328 1329 bool ASTNodeImporter::IsStructuralMatch(VarTemplateDecl *From, 1330 VarTemplateDecl *To) { 1331 StructuralEquivalenceContext Ctx(Importer.getFromContext(), 1332 Importer.getToContext(), 1333 Importer.getNonEquivalentDecls()); 1334 return Ctx.IsStructurallyEquivalent(From, To); 1335 } 1336 1337 Decl *ASTNodeImporter::VisitDecl(Decl *D) { 1338 Importer.FromDiag(D->getLocation(), diag::err_unsupported_ast_node) 1339 << D->getDeclKindName(); 1340 return nullptr; 1341 } 1342 1343 Decl *ASTNodeImporter::VisitEmptyDecl(EmptyDecl *D) { 1344 // Import the context of this declaration. 1345 DeclContext *DC = Importer.ImportContext(D->getDeclContext()); 1346 if (!DC) 1347 return nullptr; 1348 1349 DeclContext *LexicalDC = DC; 1350 if (D->getDeclContext() != D->getLexicalDeclContext()) { 1351 LexicalDC = Importer.ImportContext(D->getLexicalDeclContext()); 1352 if (!LexicalDC) 1353 return nullptr; 1354 } 1355 1356 // Import the location of this declaration. 1357 SourceLocation Loc = Importer.Import(D->getLocation()); 1358 1359 EmptyDecl *ToD = EmptyDecl::Create(Importer.getToContext(), DC, Loc); 1360 ToD->setLexicalDeclContext(LexicalDC); 1361 Importer.Imported(D, ToD); 1362 LexicalDC->addDeclInternal(ToD); 1363 return ToD; 1364 } 1365 1366 Decl *ASTNodeImporter::VisitTranslationUnitDecl(TranslationUnitDecl *D) { 1367 TranslationUnitDecl *ToD = 1368 Importer.getToContext().getTranslationUnitDecl(); 1369 1370 Importer.Imported(D, ToD); 1371 1372 return ToD; 1373 } 1374 1375 Decl *ASTNodeImporter::VisitAccessSpecDecl(AccessSpecDecl *D) { 1376 1377 SourceLocation Loc = Importer.Import(D->getLocation()); 1378 SourceLocation ColonLoc = Importer.Import(D->getColonLoc()); 1379 1380 // Import the context of this declaration. 1381 DeclContext *DC = Importer.ImportContext(D->getDeclContext()); 1382 if (!DC) 1383 return nullptr; 1384 1385 AccessSpecDecl *accessSpecDecl 1386 = AccessSpecDecl::Create(Importer.getToContext(), D->getAccess(), 1387 DC, Loc, ColonLoc); 1388 1389 if (!accessSpecDecl) 1390 return nullptr; 1391 1392 // Lexical DeclContext and Semantic DeclContext 1393 // is always the same for the accessSpec. 1394 accessSpecDecl->setLexicalDeclContext(DC); 1395 DC->addDeclInternal(accessSpecDecl); 1396 1397 return accessSpecDecl; 1398 } 1399 1400 Decl *ASTNodeImporter::VisitStaticAssertDecl(StaticAssertDecl *D) { 1401 DeclContext *DC = Importer.ImportContext(D->getDeclContext()); 1402 if (!DC) 1403 return nullptr; 1404 1405 DeclContext *LexicalDC = DC; 1406 1407 // Import the location of this declaration. 1408 SourceLocation Loc = Importer.Import(D->getLocation()); 1409 1410 Expr *AssertExpr = Importer.Import(D->getAssertExpr()); 1411 if (!AssertExpr) 1412 return nullptr; 1413 1414 StringLiteral *FromMsg = D->getMessage(); 1415 StringLiteral *ToMsg = cast_or_null<StringLiteral>(Importer.Import(FromMsg)); 1416 if (!ToMsg && FromMsg) 1417 return nullptr; 1418 1419 StaticAssertDecl *ToD = StaticAssertDecl::Create( 1420 Importer.getToContext(), DC, Loc, AssertExpr, ToMsg, 1421 Importer.Import(D->getRParenLoc()), D->isFailed()); 1422 1423 ToD->setLexicalDeclContext(LexicalDC); 1424 LexicalDC->addDeclInternal(ToD); 1425 Importer.Imported(D, ToD); 1426 return ToD; 1427 } 1428 1429 Decl *ASTNodeImporter::VisitNamespaceDecl(NamespaceDecl *D) { 1430 // Import the major distinguishing characteristics of this namespace. 1431 DeclContext *DC, *LexicalDC; 1432 DeclarationName Name; 1433 SourceLocation Loc; 1434 NamedDecl *ToD; 1435 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 1436 return nullptr; 1437 if (ToD) 1438 return ToD; 1439 1440 NamespaceDecl *MergeWithNamespace = nullptr; 1441 if (!Name) { 1442 // This is an anonymous namespace. Adopt an existing anonymous 1443 // namespace if we can. 1444 // FIXME: Not testable. 1445 if (TranslationUnitDecl *TU = dyn_cast<TranslationUnitDecl>(DC)) 1446 MergeWithNamespace = TU->getAnonymousNamespace(); 1447 else 1448 MergeWithNamespace = cast<NamespaceDecl>(DC)->getAnonymousNamespace(); 1449 } else { 1450 SmallVector<NamedDecl *, 4> ConflictingDecls; 1451 SmallVector<NamedDecl *, 2> FoundDecls; 1452 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls); 1453 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 1454 if (!FoundDecls[I]->isInIdentifierNamespace(Decl::IDNS_Namespace)) 1455 continue; 1456 1457 if (NamespaceDecl *FoundNS = dyn_cast<NamespaceDecl>(FoundDecls[I])) { 1458 MergeWithNamespace = FoundNS; 1459 ConflictingDecls.clear(); 1460 break; 1461 } 1462 1463 ConflictingDecls.push_back(FoundDecls[I]); 1464 } 1465 1466 if (!ConflictingDecls.empty()) { 1467 Name = Importer.HandleNameConflict(Name, DC, Decl::IDNS_Namespace, 1468 ConflictingDecls.data(), 1469 ConflictingDecls.size()); 1470 } 1471 } 1472 1473 // Create the "to" namespace, if needed. 1474 NamespaceDecl *ToNamespace = MergeWithNamespace; 1475 if (!ToNamespace) { 1476 ToNamespace = NamespaceDecl::Create(Importer.getToContext(), DC, 1477 D->isInline(), 1478 Importer.Import(D->getLocStart()), 1479 Loc, Name.getAsIdentifierInfo(), 1480 /*PrevDecl=*/nullptr); 1481 ToNamespace->setLexicalDeclContext(LexicalDC); 1482 LexicalDC->addDeclInternal(ToNamespace); 1483 1484 // If this is an anonymous namespace, register it as the anonymous 1485 // namespace within its context. 1486 if (!Name) { 1487 if (TranslationUnitDecl *TU = dyn_cast<TranslationUnitDecl>(DC)) 1488 TU->setAnonymousNamespace(ToNamespace); 1489 else 1490 cast<NamespaceDecl>(DC)->setAnonymousNamespace(ToNamespace); 1491 } 1492 } 1493 Importer.Imported(D, ToNamespace); 1494 1495 ImportDeclContext(D); 1496 1497 return ToNamespace; 1498 } 1499 1500 Decl *ASTNodeImporter::VisitNamespaceAliasDecl(NamespaceAliasDecl *D) { 1501 // Import the major distinguishing characteristics of this namespace. 1502 DeclContext *DC, *LexicalDC; 1503 DeclarationName Name; 1504 SourceLocation Loc; 1505 NamedDecl *LookupD; 1506 if (ImportDeclParts(D, DC, LexicalDC, Name, LookupD, Loc)) 1507 return nullptr; 1508 if (LookupD) 1509 return LookupD; 1510 1511 // NOTE: No conflict resolution is done for namespace aliases now. 1512 1513 NamespaceDecl *TargetDecl = cast_or_null<NamespaceDecl>( 1514 Importer.Import(D->getNamespace())); 1515 if (!TargetDecl) 1516 return nullptr; 1517 1518 IdentifierInfo *ToII = Importer.Import(D->getIdentifier()); 1519 if (!ToII) 1520 return nullptr; 1521 1522 NestedNameSpecifierLoc ToQLoc = Importer.Import(D->getQualifierLoc()); 1523 if (D->getQualifierLoc() && !ToQLoc) 1524 return nullptr; 1525 1526 NamespaceAliasDecl *ToD = NamespaceAliasDecl::Create( 1527 Importer.getToContext(), DC, Importer.Import(D->getNamespaceLoc()), 1528 Importer.Import(D->getAliasLoc()), ToII, ToQLoc, 1529 Importer.Import(D->getTargetNameLoc()), TargetDecl); 1530 1531 ToD->setLexicalDeclContext(LexicalDC); 1532 Importer.Imported(D, ToD); 1533 LexicalDC->addDeclInternal(ToD); 1534 1535 return ToD; 1536 } 1537 1538 Decl *ASTNodeImporter::VisitTypedefNameDecl(TypedefNameDecl *D, bool IsAlias) { 1539 // Import the major distinguishing characteristics of this typedef. 1540 DeclContext *DC, *LexicalDC; 1541 DeclarationName Name; 1542 SourceLocation Loc; 1543 NamedDecl *ToD; 1544 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 1545 return nullptr; 1546 if (ToD) 1547 return ToD; 1548 1549 // If this typedef is not in block scope, determine whether we've 1550 // seen a typedef with the same name (that we can merge with) or any 1551 // other entity by that name (which name lookup could conflict with). 1552 if (!DC->isFunctionOrMethod()) { 1553 SmallVector<NamedDecl *, 4> ConflictingDecls; 1554 unsigned IDNS = Decl::IDNS_Ordinary; 1555 SmallVector<NamedDecl *, 2> FoundDecls; 1556 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls); 1557 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 1558 if (!FoundDecls[I]->isInIdentifierNamespace(IDNS)) 1559 continue; 1560 if (TypedefNameDecl *FoundTypedef = 1561 dyn_cast<TypedefNameDecl>(FoundDecls[I])) { 1562 if (Importer.IsStructurallyEquivalent(D->getUnderlyingType(), 1563 FoundTypedef->getUnderlyingType())) 1564 return Importer.Imported(D, FoundTypedef); 1565 } 1566 1567 ConflictingDecls.push_back(FoundDecls[I]); 1568 } 1569 1570 if (!ConflictingDecls.empty()) { 1571 Name = Importer.HandleNameConflict(Name, DC, IDNS, 1572 ConflictingDecls.data(), 1573 ConflictingDecls.size()); 1574 if (!Name) 1575 return nullptr; 1576 } 1577 } 1578 1579 // Import the underlying type of this typedef; 1580 QualType T = Importer.Import(D->getUnderlyingType()); 1581 if (T.isNull()) 1582 return nullptr; 1583 1584 // Create the new typedef node. 1585 TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo()); 1586 SourceLocation StartL = Importer.Import(D->getLocStart()); 1587 TypedefNameDecl *ToTypedef; 1588 if (IsAlias) 1589 ToTypedef = TypeAliasDecl::Create(Importer.getToContext(), DC, 1590 StartL, Loc, 1591 Name.getAsIdentifierInfo(), 1592 TInfo); 1593 else 1594 ToTypedef = TypedefDecl::Create(Importer.getToContext(), DC, 1595 StartL, Loc, 1596 Name.getAsIdentifierInfo(), 1597 TInfo); 1598 1599 ToTypedef->setAccess(D->getAccess()); 1600 ToTypedef->setLexicalDeclContext(LexicalDC); 1601 Importer.Imported(D, ToTypedef); 1602 LexicalDC->addDeclInternal(ToTypedef); 1603 1604 return ToTypedef; 1605 } 1606 1607 Decl *ASTNodeImporter::VisitTypedefDecl(TypedefDecl *D) { 1608 return VisitTypedefNameDecl(D, /*IsAlias=*/false); 1609 } 1610 1611 Decl *ASTNodeImporter::VisitTypeAliasDecl(TypeAliasDecl *D) { 1612 return VisitTypedefNameDecl(D, /*IsAlias=*/true); 1613 } 1614 1615 Decl *ASTNodeImporter::VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D) { 1616 // Import the major distinguishing characteristics of this typedef. 1617 DeclContext *DC, *LexicalDC; 1618 DeclarationName Name; 1619 SourceLocation Loc; 1620 NamedDecl *ToD; 1621 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 1622 return nullptr; 1623 if (ToD) 1624 return ToD; 1625 1626 // If this typedef is not in block scope, determine whether we've 1627 // seen a typedef with the same name (that we can merge with) or any 1628 // other entity by that name (which name lookup could conflict with). 1629 if (!DC->isFunctionOrMethod()) { 1630 SmallVector<NamedDecl *, 4> ConflictingDecls; 1631 unsigned IDNS = Decl::IDNS_Ordinary; 1632 SmallVector<NamedDecl *, 2> FoundDecls; 1633 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls); 1634 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 1635 if (!FoundDecls[I]->isInIdentifierNamespace(IDNS)) 1636 continue; 1637 if (auto *FoundAlias = 1638 dyn_cast<TypeAliasTemplateDecl>(FoundDecls[I])) 1639 return Importer.Imported(D, FoundAlias); 1640 ConflictingDecls.push_back(FoundDecls[I]); 1641 } 1642 1643 if (!ConflictingDecls.empty()) { 1644 Name = Importer.HandleNameConflict(Name, DC, IDNS, 1645 ConflictingDecls.data(), 1646 ConflictingDecls.size()); 1647 if (!Name) 1648 return nullptr; 1649 } 1650 } 1651 1652 TemplateParameterList *Params = ImportTemplateParameterList( 1653 D->getTemplateParameters()); 1654 if (!Params) 1655 return nullptr; 1656 1657 NamedDecl *TemplDecl = cast_or_null<NamedDecl>( 1658 Importer.Import(D->getTemplatedDecl())); 1659 if (!TemplDecl) 1660 return nullptr; 1661 1662 TypeAliasTemplateDecl *ToAlias = TypeAliasTemplateDecl::Create( 1663 Importer.getToContext(), DC, Loc, Name, Params, TemplDecl); 1664 1665 ToAlias->setAccess(D->getAccess()); 1666 ToAlias->setLexicalDeclContext(LexicalDC); 1667 Importer.Imported(D, ToAlias); 1668 LexicalDC->addDeclInternal(ToAlias); 1669 return ToD; 1670 } 1671 1672 Decl *ASTNodeImporter::VisitLabelDecl(LabelDecl *D) { 1673 // Import the major distinguishing characteristics of this label. 1674 DeclContext *DC, *LexicalDC; 1675 DeclarationName Name; 1676 SourceLocation Loc; 1677 NamedDecl *ToD; 1678 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 1679 return nullptr; 1680 if (ToD) 1681 return ToD; 1682 1683 assert(LexicalDC->isFunctionOrMethod()); 1684 1685 LabelDecl *ToLabel = D->isGnuLocal() 1686 ? LabelDecl::Create(Importer.getToContext(), 1687 DC, Importer.Import(D->getLocation()), 1688 Name.getAsIdentifierInfo(), 1689 Importer.Import(D->getLocStart())) 1690 : LabelDecl::Create(Importer.getToContext(), 1691 DC, Importer.Import(D->getLocation()), 1692 Name.getAsIdentifierInfo()); 1693 Importer.Imported(D, ToLabel); 1694 1695 LabelStmt *Label = cast_or_null<LabelStmt>(Importer.Import(D->getStmt())); 1696 if (!Label) 1697 return nullptr; 1698 1699 ToLabel->setStmt(Label); 1700 ToLabel->setLexicalDeclContext(LexicalDC); 1701 LexicalDC->addDeclInternal(ToLabel); 1702 return ToLabel; 1703 } 1704 1705 Decl *ASTNodeImporter::VisitEnumDecl(EnumDecl *D) { 1706 // Import the major distinguishing characteristics of this enum. 1707 DeclContext *DC, *LexicalDC; 1708 DeclarationName Name; 1709 SourceLocation Loc; 1710 NamedDecl *ToD; 1711 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 1712 return nullptr; 1713 if (ToD) 1714 return ToD; 1715 1716 // Figure out what enum name we're looking for. 1717 unsigned IDNS = Decl::IDNS_Tag; 1718 DeclarationName SearchName = Name; 1719 if (!SearchName && D->getTypedefNameForAnonDecl()) { 1720 SearchName = Importer.Import(D->getTypedefNameForAnonDecl()->getDeclName()); 1721 IDNS = Decl::IDNS_Ordinary; 1722 } else if (Importer.getToContext().getLangOpts().CPlusPlus) 1723 IDNS |= Decl::IDNS_Ordinary; 1724 1725 // We may already have an enum of the same name; try to find and match it. 1726 if (!DC->isFunctionOrMethod() && SearchName) { 1727 SmallVector<NamedDecl *, 4> ConflictingDecls; 1728 SmallVector<NamedDecl *, 2> FoundDecls; 1729 DC->getRedeclContext()->localUncachedLookup(SearchName, FoundDecls); 1730 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 1731 if (!FoundDecls[I]->isInIdentifierNamespace(IDNS)) 1732 continue; 1733 1734 Decl *Found = FoundDecls[I]; 1735 if (TypedefNameDecl *Typedef = dyn_cast<TypedefNameDecl>(Found)) { 1736 if (const TagType *Tag = Typedef->getUnderlyingType()->getAs<TagType>()) 1737 Found = Tag->getDecl(); 1738 } 1739 1740 if (EnumDecl *FoundEnum = dyn_cast<EnumDecl>(Found)) { 1741 if (IsStructuralMatch(D, FoundEnum)) 1742 return Importer.Imported(D, FoundEnum); 1743 } 1744 1745 ConflictingDecls.push_back(FoundDecls[I]); 1746 } 1747 1748 if (!ConflictingDecls.empty()) { 1749 Name = Importer.HandleNameConflict(Name, DC, IDNS, 1750 ConflictingDecls.data(), 1751 ConflictingDecls.size()); 1752 } 1753 } 1754 1755 // Create the enum declaration. 1756 EnumDecl *D2 = EnumDecl::Create(Importer.getToContext(), DC, 1757 Importer.Import(D->getLocStart()), 1758 Loc, Name.getAsIdentifierInfo(), nullptr, 1759 D->isScoped(), D->isScopedUsingClassTag(), 1760 D->isFixed()); 1761 // Import the qualifier, if any. 1762 D2->setQualifierInfo(Importer.Import(D->getQualifierLoc())); 1763 D2->setAccess(D->getAccess()); 1764 D2->setLexicalDeclContext(LexicalDC); 1765 Importer.Imported(D, D2); 1766 LexicalDC->addDeclInternal(D2); 1767 1768 // Import the integer type. 1769 QualType ToIntegerType = Importer.Import(D->getIntegerType()); 1770 if (ToIntegerType.isNull()) 1771 return nullptr; 1772 D2->setIntegerType(ToIntegerType); 1773 1774 // Import the definition 1775 if (D->isCompleteDefinition() && ImportDefinition(D, D2)) 1776 return nullptr; 1777 1778 return D2; 1779 } 1780 1781 Decl *ASTNodeImporter::VisitRecordDecl(RecordDecl *D) { 1782 // If this record has a definition in the translation unit we're coming from, 1783 // but this particular declaration is not that definition, import the 1784 // definition and map to that. 1785 TagDecl *Definition = D->getDefinition(); 1786 if (Definition && Definition != D) { 1787 Decl *ImportedDef = Importer.Import(Definition); 1788 if (!ImportedDef) 1789 return nullptr; 1790 1791 return Importer.Imported(D, ImportedDef); 1792 } 1793 1794 // Import the major distinguishing characteristics of this record. 1795 DeclContext *DC, *LexicalDC; 1796 DeclarationName Name; 1797 SourceLocation Loc; 1798 NamedDecl *ToD; 1799 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 1800 return nullptr; 1801 if (ToD) 1802 return ToD; 1803 1804 // Figure out what structure name we're looking for. 1805 unsigned IDNS = Decl::IDNS_Tag; 1806 DeclarationName SearchName = Name; 1807 if (!SearchName && D->getTypedefNameForAnonDecl()) { 1808 SearchName = Importer.Import(D->getTypedefNameForAnonDecl()->getDeclName()); 1809 IDNS = Decl::IDNS_Ordinary; 1810 } else if (Importer.getToContext().getLangOpts().CPlusPlus) 1811 IDNS |= Decl::IDNS_Ordinary; 1812 1813 // We may already have a record of the same name; try to find and match it. 1814 RecordDecl *AdoptDecl = nullptr; 1815 RecordDecl *PrevDecl = nullptr; 1816 if (!DC->isFunctionOrMethod()) { 1817 SmallVector<NamedDecl *, 4> ConflictingDecls; 1818 SmallVector<NamedDecl *, 2> FoundDecls; 1819 DC->getRedeclContext()->localUncachedLookup(SearchName, FoundDecls); 1820 1821 if (!FoundDecls.empty()) { 1822 // We're going to have to compare D against potentially conflicting Decls, so complete it. 1823 if (D->hasExternalLexicalStorage() && !D->isCompleteDefinition()) 1824 D->getASTContext().getExternalSource()->CompleteType(D); 1825 } 1826 1827 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 1828 if (!FoundDecls[I]->isInIdentifierNamespace(IDNS)) 1829 continue; 1830 1831 Decl *Found = FoundDecls[I]; 1832 if (TypedefNameDecl *Typedef = dyn_cast<TypedefNameDecl>(Found)) { 1833 if (const TagType *Tag = Typedef->getUnderlyingType()->getAs<TagType>()) 1834 Found = Tag->getDecl(); 1835 } 1836 1837 if (RecordDecl *FoundRecord = dyn_cast<RecordDecl>(Found)) { 1838 if (D->isAnonymousStructOrUnion() && 1839 FoundRecord->isAnonymousStructOrUnion()) { 1840 // If both anonymous structs/unions are in a record context, make sure 1841 // they occur in the same location in the context records. 1842 if (Optional<unsigned> Index1 = 1843 StructuralEquivalenceContext::findUntaggedStructOrUnionIndex( 1844 D)) { 1845 if (Optional<unsigned> Index2 = StructuralEquivalenceContext:: 1846 findUntaggedStructOrUnionIndex(FoundRecord)) { 1847 if (*Index1 != *Index2) 1848 continue; 1849 } 1850 } 1851 } 1852 1853 PrevDecl = FoundRecord; 1854 1855 if (RecordDecl *FoundDef = FoundRecord->getDefinition()) { 1856 if ((SearchName && !D->isCompleteDefinition()) 1857 || (D->isCompleteDefinition() && 1858 D->isAnonymousStructOrUnion() 1859 == FoundDef->isAnonymousStructOrUnion() && 1860 IsStructuralMatch(D, FoundDef))) { 1861 // The record types structurally match, or the "from" translation 1862 // unit only had a forward declaration anyway; call it the same 1863 // function. 1864 // FIXME: For C++, we should also merge methods here. 1865 return Importer.Imported(D, FoundDef); 1866 } 1867 } else if (!D->isCompleteDefinition()) { 1868 // We have a forward declaration of this type, so adopt that forward 1869 // declaration rather than building a new one. 1870 1871 // If one or both can be completed from external storage then try one 1872 // last time to complete and compare them before doing this. 1873 1874 if (FoundRecord->hasExternalLexicalStorage() && 1875 !FoundRecord->isCompleteDefinition()) 1876 FoundRecord->getASTContext().getExternalSource()->CompleteType(FoundRecord); 1877 if (D->hasExternalLexicalStorage()) 1878 D->getASTContext().getExternalSource()->CompleteType(D); 1879 1880 if (FoundRecord->isCompleteDefinition() && 1881 D->isCompleteDefinition() && 1882 !IsStructuralMatch(D, FoundRecord)) 1883 continue; 1884 1885 AdoptDecl = FoundRecord; 1886 continue; 1887 } else if (!SearchName) { 1888 continue; 1889 } 1890 } 1891 1892 ConflictingDecls.push_back(FoundDecls[I]); 1893 } 1894 1895 if (!ConflictingDecls.empty() && SearchName) { 1896 Name = Importer.HandleNameConflict(Name, DC, IDNS, 1897 ConflictingDecls.data(), 1898 ConflictingDecls.size()); 1899 } 1900 } 1901 1902 // Create the record declaration. 1903 RecordDecl *D2 = AdoptDecl; 1904 SourceLocation StartLoc = Importer.Import(D->getLocStart()); 1905 if (!D2) { 1906 CXXRecordDecl *D2CXX = nullptr; 1907 if (CXXRecordDecl *DCXX = llvm::dyn_cast<CXXRecordDecl>(D)) { 1908 if (DCXX->isLambda()) { 1909 TypeSourceInfo *TInfo = Importer.Import(DCXX->getLambdaTypeInfo()); 1910 D2CXX = CXXRecordDecl::CreateLambda(Importer.getToContext(), 1911 DC, TInfo, Loc, 1912 DCXX->isDependentLambda(), 1913 DCXX->isGenericLambda(), 1914 DCXX->getLambdaCaptureDefault()); 1915 Decl *CDecl = Importer.Import(DCXX->getLambdaContextDecl()); 1916 if (DCXX->getLambdaContextDecl() && !CDecl) 1917 return nullptr; 1918 D2CXX->setLambdaMangling(DCXX->getLambdaManglingNumber(), CDecl); 1919 } else if (DCXX->isInjectedClassName()) { 1920 // We have to be careful to do a similar dance to the one in 1921 // Sema::ActOnStartCXXMemberDeclarations 1922 CXXRecordDecl *const PrevDecl = nullptr; 1923 const bool DelayTypeCreation = true; 1924 D2CXX = CXXRecordDecl::Create( 1925 Importer.getToContext(), D->getTagKind(), DC, StartLoc, Loc, 1926 Name.getAsIdentifierInfo(), PrevDecl, DelayTypeCreation); 1927 Importer.getToContext().getTypeDeclType( 1928 D2CXX, llvm::dyn_cast<CXXRecordDecl>(DC)); 1929 } else { 1930 D2CXX = CXXRecordDecl::Create(Importer.getToContext(), 1931 D->getTagKind(), 1932 DC, StartLoc, Loc, 1933 Name.getAsIdentifierInfo()); 1934 } 1935 D2 = D2CXX; 1936 D2->setAccess(D->getAccess()); 1937 1938 Importer.Imported(D, D2); 1939 1940 if (ClassTemplateDecl *FromDescribed = 1941 DCXX->getDescribedClassTemplate()) { 1942 ClassTemplateDecl *ToDescribed = cast_or_null<ClassTemplateDecl>( 1943 Importer.Import(FromDescribed)); 1944 if (!ToDescribed) 1945 return nullptr; 1946 D2CXX->setDescribedClassTemplate(ToDescribed); 1947 1948 } else if (MemberSpecializationInfo *MemberInfo = 1949 DCXX->getMemberSpecializationInfo()) { 1950 TemplateSpecializationKind SK = 1951 MemberInfo->getTemplateSpecializationKind(); 1952 CXXRecordDecl *FromInst = DCXX->getInstantiatedFromMemberClass(); 1953 CXXRecordDecl *ToInst = 1954 cast_or_null<CXXRecordDecl>(Importer.Import(FromInst)); 1955 if (FromInst && !ToInst) 1956 return nullptr; 1957 D2CXX->setInstantiationOfMemberClass(ToInst, SK); 1958 D2CXX->getMemberSpecializationInfo()->setPointOfInstantiation( 1959 Importer.Import(MemberInfo->getPointOfInstantiation())); 1960 } 1961 1962 } else { 1963 D2 = RecordDecl::Create(Importer.getToContext(), D->getTagKind(), 1964 DC, StartLoc, Loc, Name.getAsIdentifierInfo()); 1965 } 1966 1967 D2->setQualifierInfo(Importer.Import(D->getQualifierLoc())); 1968 D2->setLexicalDeclContext(LexicalDC); 1969 LexicalDC->addDeclInternal(D2); 1970 if (D->isAnonymousStructOrUnion()) 1971 D2->setAnonymousStructOrUnion(true); 1972 if (PrevDecl) { 1973 // FIXME: do this for all Redeclarables, not just RecordDecls. 1974 D2->setPreviousDecl(PrevDecl); 1975 } 1976 } 1977 1978 Importer.Imported(D, D2); 1979 1980 if (D->isCompleteDefinition() && ImportDefinition(D, D2, IDK_Default)) 1981 return nullptr; 1982 1983 return D2; 1984 } 1985 1986 Decl *ASTNodeImporter::VisitEnumConstantDecl(EnumConstantDecl *D) { 1987 // Import the major distinguishing characteristics of this enumerator. 1988 DeclContext *DC, *LexicalDC; 1989 DeclarationName Name; 1990 SourceLocation Loc; 1991 NamedDecl *ToD; 1992 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 1993 return nullptr; 1994 if (ToD) 1995 return ToD; 1996 1997 QualType T = Importer.Import(D->getType()); 1998 if (T.isNull()) 1999 return nullptr; 2000 2001 // Determine whether there are any other declarations with the same name and 2002 // in the same context. 2003 if (!LexicalDC->isFunctionOrMethod()) { 2004 SmallVector<NamedDecl *, 4> ConflictingDecls; 2005 unsigned IDNS = Decl::IDNS_Ordinary; 2006 SmallVector<NamedDecl *, 2> FoundDecls; 2007 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls); 2008 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 2009 if (!FoundDecls[I]->isInIdentifierNamespace(IDNS)) 2010 continue; 2011 2012 if (EnumConstantDecl *FoundEnumConstant 2013 = dyn_cast<EnumConstantDecl>(FoundDecls[I])) { 2014 if (IsStructuralMatch(D, FoundEnumConstant)) 2015 return Importer.Imported(D, FoundEnumConstant); 2016 } 2017 2018 ConflictingDecls.push_back(FoundDecls[I]); 2019 } 2020 2021 if (!ConflictingDecls.empty()) { 2022 Name = Importer.HandleNameConflict(Name, DC, IDNS, 2023 ConflictingDecls.data(), 2024 ConflictingDecls.size()); 2025 if (!Name) 2026 return nullptr; 2027 } 2028 } 2029 2030 Expr *Init = Importer.Import(D->getInitExpr()); 2031 if (D->getInitExpr() && !Init) 2032 return nullptr; 2033 2034 EnumConstantDecl *ToEnumerator 2035 = EnumConstantDecl::Create(Importer.getToContext(), cast<EnumDecl>(DC), Loc, 2036 Name.getAsIdentifierInfo(), T, 2037 Init, D->getInitVal()); 2038 ToEnumerator->setAccess(D->getAccess()); 2039 ToEnumerator->setLexicalDeclContext(LexicalDC); 2040 Importer.Imported(D, ToEnumerator); 2041 LexicalDC->addDeclInternal(ToEnumerator); 2042 return ToEnumerator; 2043 } 2044 2045 Decl *ASTNodeImporter::VisitFunctionDecl(FunctionDecl *D) { 2046 // Import the major distinguishing characteristics of this function. 2047 DeclContext *DC, *LexicalDC; 2048 DeclarationName Name; 2049 SourceLocation Loc; 2050 NamedDecl *ToD; 2051 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 2052 return nullptr; 2053 if (ToD) 2054 return ToD; 2055 2056 const FunctionDecl *FoundWithoutBody = nullptr; 2057 2058 // Try to find a function in our own ("to") context with the same name, same 2059 // type, and in the same context as the function we're importing. 2060 if (!LexicalDC->isFunctionOrMethod()) { 2061 SmallVector<NamedDecl *, 4> ConflictingDecls; 2062 unsigned IDNS = Decl::IDNS_Ordinary; 2063 SmallVector<NamedDecl *, 2> FoundDecls; 2064 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls); 2065 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 2066 if (!FoundDecls[I]->isInIdentifierNamespace(IDNS)) 2067 continue; 2068 2069 if (FunctionDecl *FoundFunction = dyn_cast<FunctionDecl>(FoundDecls[I])) { 2070 if (FoundFunction->hasExternalFormalLinkage() && 2071 D->hasExternalFormalLinkage()) { 2072 if (Importer.IsStructurallyEquivalent(D->getType(), 2073 FoundFunction->getType())) { 2074 // FIXME: Actually try to merge the body and other attributes. 2075 const FunctionDecl *FromBodyDecl = nullptr; 2076 D->hasBody(FromBodyDecl); 2077 if (D == FromBodyDecl && !FoundFunction->hasBody()) { 2078 // This function is needed to merge completely. 2079 FoundWithoutBody = FoundFunction; 2080 break; 2081 } 2082 return Importer.Imported(D, FoundFunction); 2083 } 2084 2085 // FIXME: Check for overloading more carefully, e.g., by boosting 2086 // Sema::IsOverload out to the AST library. 2087 2088 // Function overloading is okay in C++. 2089 if (Importer.getToContext().getLangOpts().CPlusPlus) 2090 continue; 2091 2092 // Complain about inconsistent function types. 2093 Importer.ToDiag(Loc, diag::err_odr_function_type_inconsistent) 2094 << Name << D->getType() << FoundFunction->getType(); 2095 Importer.ToDiag(FoundFunction->getLocation(), 2096 diag::note_odr_value_here) 2097 << FoundFunction->getType(); 2098 } 2099 } 2100 2101 ConflictingDecls.push_back(FoundDecls[I]); 2102 } 2103 2104 if (!ConflictingDecls.empty()) { 2105 Name = Importer.HandleNameConflict(Name, DC, IDNS, 2106 ConflictingDecls.data(), 2107 ConflictingDecls.size()); 2108 if (!Name) 2109 return nullptr; 2110 } 2111 } 2112 2113 DeclarationNameInfo NameInfo(Name, Loc); 2114 // Import additional name location/type info. 2115 ImportDeclarationNameLoc(D->getNameInfo(), NameInfo); 2116 2117 QualType FromTy = D->getType(); 2118 bool usedDifferentExceptionSpec = false; 2119 2120 if (const FunctionProtoType * 2121 FromFPT = D->getType()->getAs<FunctionProtoType>()) { 2122 FunctionProtoType::ExtProtoInfo FromEPI = FromFPT->getExtProtoInfo(); 2123 // FunctionProtoType::ExtProtoInfo's ExceptionSpecDecl can point to the 2124 // FunctionDecl that we are importing the FunctionProtoType for. 2125 // To avoid an infinite recursion when importing, create the FunctionDecl 2126 // with a simplified function type and update it afterwards. 2127 if (FromEPI.ExceptionSpec.SourceDecl || 2128 FromEPI.ExceptionSpec.SourceTemplate || 2129 FromEPI.ExceptionSpec.NoexceptExpr) { 2130 FunctionProtoType::ExtProtoInfo DefaultEPI; 2131 FromTy = Importer.getFromContext().getFunctionType( 2132 FromFPT->getReturnType(), FromFPT->getParamTypes(), DefaultEPI); 2133 usedDifferentExceptionSpec = true; 2134 } 2135 } 2136 2137 // Import the type. 2138 QualType T = Importer.Import(FromTy); 2139 if (T.isNull()) 2140 return nullptr; 2141 2142 // Import the function parameters. 2143 SmallVector<ParmVarDecl *, 8> Parameters; 2144 for (auto P : D->parameters()) { 2145 ParmVarDecl *ToP = cast_or_null<ParmVarDecl>(Importer.Import(P)); 2146 if (!ToP) 2147 return nullptr; 2148 2149 Parameters.push_back(ToP); 2150 } 2151 2152 // Create the imported function. 2153 TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo()); 2154 FunctionDecl *ToFunction = nullptr; 2155 SourceLocation InnerLocStart = Importer.Import(D->getInnerLocStart()); 2156 if (CXXConstructorDecl *FromConstructor = dyn_cast<CXXConstructorDecl>(D)) { 2157 ToFunction = CXXConstructorDecl::Create(Importer.getToContext(), 2158 cast<CXXRecordDecl>(DC), 2159 InnerLocStart, 2160 NameInfo, T, TInfo, 2161 FromConstructor->isExplicit(), 2162 D->isInlineSpecified(), 2163 D->isImplicit(), 2164 D->isConstexpr()); 2165 if (unsigned NumInitializers = FromConstructor->getNumCtorInitializers()) { 2166 SmallVector<CXXCtorInitializer *, 4> CtorInitializers; 2167 for (CXXCtorInitializer *I : FromConstructor->inits()) { 2168 CXXCtorInitializer *ToI = 2169 cast_or_null<CXXCtorInitializer>(Importer.Import(I)); 2170 if (!ToI && I) 2171 return nullptr; 2172 CtorInitializers.push_back(ToI); 2173 } 2174 CXXCtorInitializer **Memory = 2175 new (Importer.getToContext()) CXXCtorInitializer *[NumInitializers]; 2176 std::copy(CtorInitializers.begin(), CtorInitializers.end(), Memory); 2177 CXXConstructorDecl *ToCtor = llvm::cast<CXXConstructorDecl>(ToFunction); 2178 ToCtor->setCtorInitializers(Memory); 2179 ToCtor->setNumCtorInitializers(NumInitializers); 2180 } 2181 } else if (isa<CXXDestructorDecl>(D)) { 2182 ToFunction = CXXDestructorDecl::Create(Importer.getToContext(), 2183 cast<CXXRecordDecl>(DC), 2184 InnerLocStart, 2185 NameInfo, T, TInfo, 2186 D->isInlineSpecified(), 2187 D->isImplicit()); 2188 } else if (CXXConversionDecl *FromConversion 2189 = dyn_cast<CXXConversionDecl>(D)) { 2190 ToFunction = CXXConversionDecl::Create(Importer.getToContext(), 2191 cast<CXXRecordDecl>(DC), 2192 InnerLocStart, 2193 NameInfo, T, TInfo, 2194 D->isInlineSpecified(), 2195 FromConversion->isExplicit(), 2196 D->isConstexpr(), 2197 Importer.Import(D->getLocEnd())); 2198 } else if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(D)) { 2199 ToFunction = CXXMethodDecl::Create(Importer.getToContext(), 2200 cast<CXXRecordDecl>(DC), 2201 InnerLocStart, 2202 NameInfo, T, TInfo, 2203 Method->getStorageClass(), 2204 Method->isInlineSpecified(), 2205 D->isConstexpr(), 2206 Importer.Import(D->getLocEnd())); 2207 } else { 2208 ToFunction = FunctionDecl::Create(Importer.getToContext(), DC, 2209 InnerLocStart, 2210 NameInfo, T, TInfo, D->getStorageClass(), 2211 D->isInlineSpecified(), 2212 D->hasWrittenPrototype(), 2213 D->isConstexpr()); 2214 } 2215 2216 // Import the qualifier, if any. 2217 ToFunction->setQualifierInfo(Importer.Import(D->getQualifierLoc())); 2218 ToFunction->setAccess(D->getAccess()); 2219 ToFunction->setLexicalDeclContext(LexicalDC); 2220 ToFunction->setVirtualAsWritten(D->isVirtualAsWritten()); 2221 ToFunction->setTrivial(D->isTrivial()); 2222 ToFunction->setPure(D->isPure()); 2223 Importer.Imported(D, ToFunction); 2224 2225 // Set the parameters. 2226 for (unsigned I = 0, N = Parameters.size(); I != N; ++I) { 2227 Parameters[I]->setOwningFunction(ToFunction); 2228 ToFunction->addDeclInternal(Parameters[I]); 2229 } 2230 ToFunction->setParams(Parameters); 2231 2232 if (FoundWithoutBody) { 2233 auto *Recent = const_cast<FunctionDecl *>( 2234 FoundWithoutBody->getMostRecentDecl()); 2235 ToFunction->setPreviousDecl(Recent); 2236 } 2237 2238 if (usedDifferentExceptionSpec) { 2239 // Update FunctionProtoType::ExtProtoInfo. 2240 QualType T = Importer.Import(D->getType()); 2241 if (T.isNull()) 2242 return nullptr; 2243 ToFunction->setType(T); 2244 } 2245 2246 // Import the body, if any. 2247 if (Stmt *FromBody = D->getBody()) { 2248 if (Stmt *ToBody = Importer.Import(FromBody)) { 2249 ToFunction->setBody(ToBody); 2250 } 2251 } 2252 2253 // FIXME: Other bits to merge? 2254 2255 // Add this function to the lexical context. 2256 LexicalDC->addDeclInternal(ToFunction); 2257 2258 if (auto *FromCXXMethod = dyn_cast<CXXMethodDecl>(D)) 2259 ImportOverrides(cast<CXXMethodDecl>(ToFunction), FromCXXMethod); 2260 2261 return ToFunction; 2262 } 2263 2264 Decl *ASTNodeImporter::VisitCXXMethodDecl(CXXMethodDecl *D) { 2265 return VisitFunctionDecl(D); 2266 } 2267 2268 Decl *ASTNodeImporter::VisitCXXConstructorDecl(CXXConstructorDecl *D) { 2269 return VisitCXXMethodDecl(D); 2270 } 2271 2272 Decl *ASTNodeImporter::VisitCXXDestructorDecl(CXXDestructorDecl *D) { 2273 return VisitCXXMethodDecl(D); 2274 } 2275 2276 Decl *ASTNodeImporter::VisitCXXConversionDecl(CXXConversionDecl *D) { 2277 return VisitCXXMethodDecl(D); 2278 } 2279 2280 static unsigned getFieldIndex(Decl *F) { 2281 RecordDecl *Owner = dyn_cast<RecordDecl>(F->getDeclContext()); 2282 if (!Owner) 2283 return 0; 2284 2285 unsigned Index = 1; 2286 for (const auto *D : Owner->noload_decls()) { 2287 if (D == F) 2288 return Index; 2289 2290 if (isa<FieldDecl>(*D) || isa<IndirectFieldDecl>(*D)) 2291 ++Index; 2292 } 2293 2294 return Index; 2295 } 2296 2297 Decl *ASTNodeImporter::VisitFieldDecl(FieldDecl *D) { 2298 // Import the major distinguishing characteristics of a variable. 2299 DeclContext *DC, *LexicalDC; 2300 DeclarationName Name; 2301 SourceLocation Loc; 2302 NamedDecl *ToD; 2303 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 2304 return nullptr; 2305 if (ToD) 2306 return ToD; 2307 2308 // Determine whether we've already imported this field. 2309 SmallVector<NamedDecl *, 2> FoundDecls; 2310 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls); 2311 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 2312 if (FieldDecl *FoundField = dyn_cast<FieldDecl>(FoundDecls[I])) { 2313 // For anonymous fields, match up by index. 2314 if (!Name && getFieldIndex(D) != getFieldIndex(FoundField)) 2315 continue; 2316 2317 if (Importer.IsStructurallyEquivalent(D->getType(), 2318 FoundField->getType())) { 2319 Importer.Imported(D, FoundField); 2320 return FoundField; 2321 } 2322 2323 Importer.ToDiag(Loc, diag::err_odr_field_type_inconsistent) 2324 << Name << D->getType() << FoundField->getType(); 2325 Importer.ToDiag(FoundField->getLocation(), diag::note_odr_value_here) 2326 << FoundField->getType(); 2327 return nullptr; 2328 } 2329 } 2330 2331 // Import the type. 2332 QualType T = Importer.Import(D->getType()); 2333 if (T.isNull()) 2334 return nullptr; 2335 2336 TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo()); 2337 Expr *BitWidth = Importer.Import(D->getBitWidth()); 2338 if (!BitWidth && D->getBitWidth()) 2339 return nullptr; 2340 2341 FieldDecl *ToField = FieldDecl::Create(Importer.getToContext(), DC, 2342 Importer.Import(D->getInnerLocStart()), 2343 Loc, Name.getAsIdentifierInfo(), 2344 T, TInfo, BitWidth, D->isMutable(), 2345 D->getInClassInitStyle()); 2346 ToField->setAccess(D->getAccess()); 2347 ToField->setLexicalDeclContext(LexicalDC); 2348 if (Expr *FromInitializer = D->getInClassInitializer()) { 2349 Expr *ToInitializer = Importer.Import(FromInitializer); 2350 if (ToInitializer) 2351 ToField->setInClassInitializer(ToInitializer); 2352 else 2353 return nullptr; 2354 } 2355 ToField->setImplicit(D->isImplicit()); 2356 Importer.Imported(D, ToField); 2357 LexicalDC->addDeclInternal(ToField); 2358 return ToField; 2359 } 2360 2361 Decl *ASTNodeImporter::VisitIndirectFieldDecl(IndirectFieldDecl *D) { 2362 // Import the major distinguishing characteristics of a variable. 2363 DeclContext *DC, *LexicalDC; 2364 DeclarationName Name; 2365 SourceLocation Loc; 2366 NamedDecl *ToD; 2367 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 2368 return nullptr; 2369 if (ToD) 2370 return ToD; 2371 2372 // Determine whether we've already imported this field. 2373 SmallVector<NamedDecl *, 2> FoundDecls; 2374 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls); 2375 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 2376 if (IndirectFieldDecl *FoundField 2377 = dyn_cast<IndirectFieldDecl>(FoundDecls[I])) { 2378 // For anonymous indirect fields, match up by index. 2379 if (!Name && getFieldIndex(D) != getFieldIndex(FoundField)) 2380 continue; 2381 2382 if (Importer.IsStructurallyEquivalent(D->getType(), 2383 FoundField->getType(), 2384 !Name.isEmpty())) { 2385 Importer.Imported(D, FoundField); 2386 return FoundField; 2387 } 2388 2389 // If there are more anonymous fields to check, continue. 2390 if (!Name && I < N-1) 2391 continue; 2392 2393 Importer.ToDiag(Loc, diag::err_odr_field_type_inconsistent) 2394 << Name << D->getType() << FoundField->getType(); 2395 Importer.ToDiag(FoundField->getLocation(), diag::note_odr_value_here) 2396 << FoundField->getType(); 2397 return nullptr; 2398 } 2399 } 2400 2401 // Import the type. 2402 QualType T = Importer.Import(D->getType()); 2403 if (T.isNull()) 2404 return nullptr; 2405 2406 NamedDecl **NamedChain = 2407 new (Importer.getToContext())NamedDecl*[D->getChainingSize()]; 2408 2409 unsigned i = 0; 2410 for (auto *PI : D->chain()) { 2411 Decl *D = Importer.Import(PI); 2412 if (!D) 2413 return nullptr; 2414 NamedChain[i++] = cast<NamedDecl>(D); 2415 } 2416 2417 IndirectFieldDecl *ToIndirectField = IndirectFieldDecl::Create( 2418 Importer.getToContext(), DC, Loc, Name.getAsIdentifierInfo(), T, 2419 {NamedChain, D->getChainingSize()}); 2420 2421 for (const auto *Attr : D->attrs()) 2422 ToIndirectField->addAttr(Attr->clone(Importer.getToContext())); 2423 2424 ToIndirectField->setAccess(D->getAccess()); 2425 ToIndirectField->setLexicalDeclContext(LexicalDC); 2426 Importer.Imported(D, ToIndirectField); 2427 LexicalDC->addDeclInternal(ToIndirectField); 2428 return ToIndirectField; 2429 } 2430 2431 Decl *ASTNodeImporter::VisitFriendDecl(FriendDecl *D) { 2432 // Import the major distinguishing characteristics of a declaration. 2433 DeclContext *DC = Importer.ImportContext(D->getDeclContext()); 2434 DeclContext *LexicalDC = D->getDeclContext() == D->getLexicalDeclContext() 2435 ? DC : Importer.ImportContext(D->getLexicalDeclContext()); 2436 if (!DC || !LexicalDC) 2437 return nullptr; 2438 2439 // Determine whether we've already imported this decl. 2440 // FriendDecl is not a NamedDecl so we cannot use localUncachedLookup. 2441 auto *RD = cast<CXXRecordDecl>(DC); 2442 FriendDecl *ImportedFriend = RD->getFirstFriend(); 2443 StructuralEquivalenceContext Context( 2444 Importer.getFromContext(), Importer.getToContext(), 2445 Importer.getNonEquivalentDecls(), false, false); 2446 2447 while (ImportedFriend) { 2448 if (D->getFriendDecl() && ImportedFriend->getFriendDecl()) { 2449 if (Context.IsStructurallyEquivalent(D->getFriendDecl(), 2450 ImportedFriend->getFriendDecl())) 2451 return Importer.Imported(D, ImportedFriend); 2452 2453 } else if (D->getFriendType() && ImportedFriend->getFriendType()) { 2454 if (Importer.IsStructurallyEquivalent( 2455 D->getFriendType()->getType(), 2456 ImportedFriend->getFriendType()->getType(), true)) 2457 return Importer.Imported(D, ImportedFriend); 2458 } 2459 ImportedFriend = ImportedFriend->getNextFriend(); 2460 } 2461 2462 // Not found. Create it. 2463 FriendDecl::FriendUnion ToFU; 2464 if (NamedDecl *FriendD = D->getFriendDecl()) 2465 ToFU = cast_or_null<NamedDecl>(Importer.Import(FriendD)); 2466 else 2467 ToFU = Importer.Import(D->getFriendType()); 2468 if (!ToFU) 2469 return nullptr; 2470 2471 SmallVector<TemplateParameterList *, 1> ToTPLists(D->NumTPLists); 2472 TemplateParameterList **FromTPLists = 2473 D->getTrailingObjects<TemplateParameterList *>(); 2474 for (unsigned I = 0; I < D->NumTPLists; I++) { 2475 TemplateParameterList *List = ImportTemplateParameterList(FromTPLists[I]); 2476 if (!List) 2477 return nullptr; 2478 ToTPLists[I] = List; 2479 } 2480 2481 FriendDecl *FrD = FriendDecl::Create(Importer.getToContext(), DC, 2482 Importer.Import(D->getLocation()), 2483 ToFU, Importer.Import(D->getFriendLoc()), 2484 ToTPLists); 2485 2486 Importer.Imported(D, FrD); 2487 RD->pushFriendDecl(FrD); 2488 2489 FrD->setAccess(D->getAccess()); 2490 FrD->setLexicalDeclContext(LexicalDC); 2491 LexicalDC->addDeclInternal(FrD); 2492 return FrD; 2493 } 2494 2495 Decl *ASTNodeImporter::VisitObjCIvarDecl(ObjCIvarDecl *D) { 2496 // Import the major distinguishing characteristics of an ivar. 2497 DeclContext *DC, *LexicalDC; 2498 DeclarationName Name; 2499 SourceLocation Loc; 2500 NamedDecl *ToD; 2501 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 2502 return nullptr; 2503 if (ToD) 2504 return ToD; 2505 2506 // Determine whether we've already imported this ivar 2507 SmallVector<NamedDecl *, 2> FoundDecls; 2508 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls); 2509 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 2510 if (ObjCIvarDecl *FoundIvar = dyn_cast<ObjCIvarDecl>(FoundDecls[I])) { 2511 if (Importer.IsStructurallyEquivalent(D->getType(), 2512 FoundIvar->getType())) { 2513 Importer.Imported(D, FoundIvar); 2514 return FoundIvar; 2515 } 2516 2517 Importer.ToDiag(Loc, diag::err_odr_ivar_type_inconsistent) 2518 << Name << D->getType() << FoundIvar->getType(); 2519 Importer.ToDiag(FoundIvar->getLocation(), diag::note_odr_value_here) 2520 << FoundIvar->getType(); 2521 return nullptr; 2522 } 2523 } 2524 2525 // Import the type. 2526 QualType T = Importer.Import(D->getType()); 2527 if (T.isNull()) 2528 return nullptr; 2529 2530 TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo()); 2531 Expr *BitWidth = Importer.Import(D->getBitWidth()); 2532 if (!BitWidth && D->getBitWidth()) 2533 return nullptr; 2534 2535 ObjCIvarDecl *ToIvar = ObjCIvarDecl::Create(Importer.getToContext(), 2536 cast<ObjCContainerDecl>(DC), 2537 Importer.Import(D->getInnerLocStart()), 2538 Loc, Name.getAsIdentifierInfo(), 2539 T, TInfo, D->getAccessControl(), 2540 BitWidth, D->getSynthesize()); 2541 ToIvar->setLexicalDeclContext(LexicalDC); 2542 Importer.Imported(D, ToIvar); 2543 LexicalDC->addDeclInternal(ToIvar); 2544 return ToIvar; 2545 2546 } 2547 2548 Decl *ASTNodeImporter::VisitVarDecl(VarDecl *D) { 2549 // Import the major distinguishing characteristics of a variable. 2550 DeclContext *DC, *LexicalDC; 2551 DeclarationName Name; 2552 SourceLocation Loc; 2553 NamedDecl *ToD; 2554 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 2555 return nullptr; 2556 if (ToD) 2557 return ToD; 2558 2559 // Try to find a variable in our own ("to") context with the same name and 2560 // in the same context as the variable we're importing. 2561 if (D->isFileVarDecl()) { 2562 VarDecl *MergeWithVar = nullptr; 2563 SmallVector<NamedDecl *, 4> ConflictingDecls; 2564 unsigned IDNS = Decl::IDNS_Ordinary; 2565 SmallVector<NamedDecl *, 2> FoundDecls; 2566 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls); 2567 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 2568 if (!FoundDecls[I]->isInIdentifierNamespace(IDNS)) 2569 continue; 2570 2571 if (VarDecl *FoundVar = dyn_cast<VarDecl>(FoundDecls[I])) { 2572 // We have found a variable that we may need to merge with. Check it. 2573 if (FoundVar->hasExternalFormalLinkage() && 2574 D->hasExternalFormalLinkage()) { 2575 if (Importer.IsStructurallyEquivalent(D->getType(), 2576 FoundVar->getType())) { 2577 MergeWithVar = FoundVar; 2578 break; 2579 } 2580 2581 const ArrayType *FoundArray 2582 = Importer.getToContext().getAsArrayType(FoundVar->getType()); 2583 const ArrayType *TArray 2584 = Importer.getToContext().getAsArrayType(D->getType()); 2585 if (FoundArray && TArray) { 2586 if (isa<IncompleteArrayType>(FoundArray) && 2587 isa<ConstantArrayType>(TArray)) { 2588 // Import the type. 2589 QualType T = Importer.Import(D->getType()); 2590 if (T.isNull()) 2591 return nullptr; 2592 2593 FoundVar->setType(T); 2594 MergeWithVar = FoundVar; 2595 break; 2596 } else if (isa<IncompleteArrayType>(TArray) && 2597 isa<ConstantArrayType>(FoundArray)) { 2598 MergeWithVar = FoundVar; 2599 break; 2600 } 2601 } 2602 2603 Importer.ToDiag(Loc, diag::err_odr_variable_type_inconsistent) 2604 << Name << D->getType() << FoundVar->getType(); 2605 Importer.ToDiag(FoundVar->getLocation(), diag::note_odr_value_here) 2606 << FoundVar->getType(); 2607 } 2608 } 2609 2610 ConflictingDecls.push_back(FoundDecls[I]); 2611 } 2612 2613 if (MergeWithVar) { 2614 // An equivalent variable with external linkage has been found. Link 2615 // the two declarations, then merge them. 2616 Importer.Imported(D, MergeWithVar); 2617 2618 if (VarDecl *DDef = D->getDefinition()) { 2619 if (VarDecl *ExistingDef = MergeWithVar->getDefinition()) { 2620 Importer.ToDiag(ExistingDef->getLocation(), 2621 diag::err_odr_variable_multiple_def) 2622 << Name; 2623 Importer.FromDiag(DDef->getLocation(), diag::note_odr_defined_here); 2624 } else { 2625 Expr *Init = Importer.Import(DDef->getInit()); 2626 MergeWithVar->setInit(Init); 2627 if (DDef->isInitKnownICE()) { 2628 EvaluatedStmt *Eval = MergeWithVar->ensureEvaluatedStmt(); 2629 Eval->CheckedICE = true; 2630 Eval->IsICE = DDef->isInitICE(); 2631 } 2632 } 2633 } 2634 2635 return MergeWithVar; 2636 } 2637 2638 if (!ConflictingDecls.empty()) { 2639 Name = Importer.HandleNameConflict(Name, DC, IDNS, 2640 ConflictingDecls.data(), 2641 ConflictingDecls.size()); 2642 if (!Name) 2643 return nullptr; 2644 } 2645 } 2646 2647 // Import the type. 2648 QualType T = Importer.Import(D->getType()); 2649 if (T.isNull()) 2650 return nullptr; 2651 2652 // Create the imported variable. 2653 TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo()); 2654 VarDecl *ToVar = VarDecl::Create(Importer.getToContext(), DC, 2655 Importer.Import(D->getInnerLocStart()), 2656 Loc, Name.getAsIdentifierInfo(), 2657 T, TInfo, 2658 D->getStorageClass()); 2659 ToVar->setQualifierInfo(Importer.Import(D->getQualifierLoc())); 2660 ToVar->setAccess(D->getAccess()); 2661 ToVar->setLexicalDeclContext(LexicalDC); 2662 Importer.Imported(D, ToVar); 2663 LexicalDC->addDeclInternal(ToVar); 2664 2665 if (!D->isFileVarDecl() && 2666 D->isUsed()) 2667 ToVar->setIsUsed(); 2668 2669 // Merge the initializer. 2670 if (ImportDefinition(D, ToVar)) 2671 return nullptr; 2672 2673 if (D->isConstexpr()) 2674 ToVar->setConstexpr(true); 2675 2676 return ToVar; 2677 } 2678 2679 Decl *ASTNodeImporter::VisitImplicitParamDecl(ImplicitParamDecl *D) { 2680 // Parameters are created in the translation unit's context, then moved 2681 // into the function declaration's context afterward. 2682 DeclContext *DC = Importer.getToContext().getTranslationUnitDecl(); 2683 2684 // Import the name of this declaration. 2685 DeclarationName Name = Importer.Import(D->getDeclName()); 2686 if (D->getDeclName() && !Name) 2687 return nullptr; 2688 2689 // Import the location of this declaration. 2690 SourceLocation Loc = Importer.Import(D->getLocation()); 2691 2692 // Import the parameter's type. 2693 QualType T = Importer.Import(D->getType()); 2694 if (T.isNull()) 2695 return nullptr; 2696 2697 // Create the imported parameter. 2698 auto *ToParm = ImplicitParamDecl::Create(Importer.getToContext(), DC, Loc, 2699 Name.getAsIdentifierInfo(), T, 2700 D->getParameterKind()); 2701 return Importer.Imported(D, ToParm); 2702 } 2703 2704 Decl *ASTNodeImporter::VisitParmVarDecl(ParmVarDecl *D) { 2705 // Parameters are created in the translation unit's context, then moved 2706 // into the function declaration's context afterward. 2707 DeclContext *DC = Importer.getToContext().getTranslationUnitDecl(); 2708 2709 // Import the name of this declaration. 2710 DeclarationName Name = Importer.Import(D->getDeclName()); 2711 if (D->getDeclName() && !Name) 2712 return nullptr; 2713 2714 // Import the location of this declaration. 2715 SourceLocation Loc = Importer.Import(D->getLocation()); 2716 2717 // Import the parameter's type. 2718 QualType T = Importer.Import(D->getType()); 2719 if (T.isNull()) 2720 return nullptr; 2721 2722 // Create the imported parameter. 2723 TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo()); 2724 ParmVarDecl *ToParm = ParmVarDecl::Create(Importer.getToContext(), DC, 2725 Importer.Import(D->getInnerLocStart()), 2726 Loc, Name.getAsIdentifierInfo(), 2727 T, TInfo, D->getStorageClass(), 2728 /*DefaultArg*/ nullptr); 2729 2730 // Set the default argument. 2731 ToParm->setHasInheritedDefaultArg(D->hasInheritedDefaultArg()); 2732 ToParm->setKNRPromoted(D->isKNRPromoted()); 2733 2734 Expr *ToDefArg = nullptr; 2735 Expr *FromDefArg = nullptr; 2736 if (D->hasUninstantiatedDefaultArg()) { 2737 FromDefArg = D->getUninstantiatedDefaultArg(); 2738 ToDefArg = Importer.Import(FromDefArg); 2739 ToParm->setUninstantiatedDefaultArg(ToDefArg); 2740 } else if (D->hasUnparsedDefaultArg()) { 2741 ToParm->setUnparsedDefaultArg(); 2742 } else if (D->hasDefaultArg()) { 2743 FromDefArg = D->getDefaultArg(); 2744 ToDefArg = Importer.Import(FromDefArg); 2745 ToParm->setDefaultArg(ToDefArg); 2746 } 2747 if (FromDefArg && !ToDefArg) 2748 return nullptr; 2749 2750 if (D->isUsed()) 2751 ToParm->setIsUsed(); 2752 2753 return Importer.Imported(D, ToParm); 2754 } 2755 2756 Decl *ASTNodeImporter::VisitObjCMethodDecl(ObjCMethodDecl *D) { 2757 // Import the major distinguishing characteristics of a method. 2758 DeclContext *DC, *LexicalDC; 2759 DeclarationName Name; 2760 SourceLocation Loc; 2761 NamedDecl *ToD; 2762 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 2763 return nullptr; 2764 if (ToD) 2765 return ToD; 2766 2767 SmallVector<NamedDecl *, 2> FoundDecls; 2768 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls); 2769 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 2770 if (ObjCMethodDecl *FoundMethod = dyn_cast<ObjCMethodDecl>(FoundDecls[I])) { 2771 if (FoundMethod->isInstanceMethod() != D->isInstanceMethod()) 2772 continue; 2773 2774 // Check return types. 2775 if (!Importer.IsStructurallyEquivalent(D->getReturnType(), 2776 FoundMethod->getReturnType())) { 2777 Importer.ToDiag(Loc, diag::err_odr_objc_method_result_type_inconsistent) 2778 << D->isInstanceMethod() << Name << D->getReturnType() 2779 << FoundMethod->getReturnType(); 2780 Importer.ToDiag(FoundMethod->getLocation(), 2781 diag::note_odr_objc_method_here) 2782 << D->isInstanceMethod() << Name; 2783 return nullptr; 2784 } 2785 2786 // Check the number of parameters. 2787 if (D->param_size() != FoundMethod->param_size()) { 2788 Importer.ToDiag(Loc, diag::err_odr_objc_method_num_params_inconsistent) 2789 << D->isInstanceMethod() << Name 2790 << D->param_size() << FoundMethod->param_size(); 2791 Importer.ToDiag(FoundMethod->getLocation(), 2792 diag::note_odr_objc_method_here) 2793 << D->isInstanceMethod() << Name; 2794 return nullptr; 2795 } 2796 2797 // Check parameter types. 2798 for (ObjCMethodDecl::param_iterator P = D->param_begin(), 2799 PEnd = D->param_end(), FoundP = FoundMethod->param_begin(); 2800 P != PEnd; ++P, ++FoundP) { 2801 if (!Importer.IsStructurallyEquivalent((*P)->getType(), 2802 (*FoundP)->getType())) { 2803 Importer.FromDiag((*P)->getLocation(), 2804 diag::err_odr_objc_method_param_type_inconsistent) 2805 << D->isInstanceMethod() << Name 2806 << (*P)->getType() << (*FoundP)->getType(); 2807 Importer.ToDiag((*FoundP)->getLocation(), diag::note_odr_value_here) 2808 << (*FoundP)->getType(); 2809 return nullptr; 2810 } 2811 } 2812 2813 // Check variadic/non-variadic. 2814 // Check the number of parameters. 2815 if (D->isVariadic() != FoundMethod->isVariadic()) { 2816 Importer.ToDiag(Loc, diag::err_odr_objc_method_variadic_inconsistent) 2817 << D->isInstanceMethod() << Name; 2818 Importer.ToDiag(FoundMethod->getLocation(), 2819 diag::note_odr_objc_method_here) 2820 << D->isInstanceMethod() << Name; 2821 return nullptr; 2822 } 2823 2824 // FIXME: Any other bits we need to merge? 2825 return Importer.Imported(D, FoundMethod); 2826 } 2827 } 2828 2829 // Import the result type. 2830 QualType ResultTy = Importer.Import(D->getReturnType()); 2831 if (ResultTy.isNull()) 2832 return nullptr; 2833 2834 TypeSourceInfo *ReturnTInfo = Importer.Import(D->getReturnTypeSourceInfo()); 2835 2836 ObjCMethodDecl *ToMethod = ObjCMethodDecl::Create( 2837 Importer.getToContext(), Loc, Importer.Import(D->getLocEnd()), 2838 Name.getObjCSelector(), ResultTy, ReturnTInfo, DC, D->isInstanceMethod(), 2839 D->isVariadic(), D->isPropertyAccessor(), D->isImplicit(), D->isDefined(), 2840 D->getImplementationControl(), D->hasRelatedResultType()); 2841 2842 // FIXME: When we decide to merge method definitions, we'll need to 2843 // deal with implicit parameters. 2844 2845 // Import the parameters 2846 SmallVector<ParmVarDecl *, 5> ToParams; 2847 for (auto *FromP : D->parameters()) { 2848 ParmVarDecl *ToP = cast_or_null<ParmVarDecl>(Importer.Import(FromP)); 2849 if (!ToP) 2850 return nullptr; 2851 2852 ToParams.push_back(ToP); 2853 } 2854 2855 // Set the parameters. 2856 for (unsigned I = 0, N = ToParams.size(); I != N; ++I) { 2857 ToParams[I]->setOwningFunction(ToMethod); 2858 ToMethod->addDeclInternal(ToParams[I]); 2859 } 2860 SmallVector<SourceLocation, 12> SelLocs; 2861 D->getSelectorLocs(SelLocs); 2862 ToMethod->setMethodParams(Importer.getToContext(), ToParams, SelLocs); 2863 2864 ToMethod->setLexicalDeclContext(LexicalDC); 2865 Importer.Imported(D, ToMethod); 2866 LexicalDC->addDeclInternal(ToMethod); 2867 return ToMethod; 2868 } 2869 2870 Decl *ASTNodeImporter::VisitObjCTypeParamDecl(ObjCTypeParamDecl *D) { 2871 // Import the major distinguishing characteristics of a category. 2872 DeclContext *DC, *LexicalDC; 2873 DeclarationName Name; 2874 SourceLocation Loc; 2875 NamedDecl *ToD; 2876 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 2877 return nullptr; 2878 if (ToD) 2879 return ToD; 2880 2881 TypeSourceInfo *BoundInfo = Importer.Import(D->getTypeSourceInfo()); 2882 if (!BoundInfo) 2883 return nullptr; 2884 2885 ObjCTypeParamDecl *Result = ObjCTypeParamDecl::Create( 2886 Importer.getToContext(), DC, 2887 D->getVariance(), 2888 Importer.Import(D->getVarianceLoc()), 2889 D->getIndex(), 2890 Importer.Import(D->getLocation()), 2891 Name.getAsIdentifierInfo(), 2892 Importer.Import(D->getColonLoc()), 2893 BoundInfo); 2894 Importer.Imported(D, Result); 2895 Result->setLexicalDeclContext(LexicalDC); 2896 return Result; 2897 } 2898 2899 Decl *ASTNodeImporter::VisitObjCCategoryDecl(ObjCCategoryDecl *D) { 2900 // Import the major distinguishing characteristics of a category. 2901 DeclContext *DC, *LexicalDC; 2902 DeclarationName Name; 2903 SourceLocation Loc; 2904 NamedDecl *ToD; 2905 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 2906 return nullptr; 2907 if (ToD) 2908 return ToD; 2909 2910 ObjCInterfaceDecl *ToInterface 2911 = cast_or_null<ObjCInterfaceDecl>(Importer.Import(D->getClassInterface())); 2912 if (!ToInterface) 2913 return nullptr; 2914 2915 // Determine if we've already encountered this category. 2916 ObjCCategoryDecl *MergeWithCategory 2917 = ToInterface->FindCategoryDeclaration(Name.getAsIdentifierInfo()); 2918 ObjCCategoryDecl *ToCategory = MergeWithCategory; 2919 if (!ToCategory) { 2920 ToCategory = ObjCCategoryDecl::Create(Importer.getToContext(), DC, 2921 Importer.Import(D->getAtStartLoc()), 2922 Loc, 2923 Importer.Import(D->getCategoryNameLoc()), 2924 Name.getAsIdentifierInfo(), 2925 ToInterface, 2926 /*TypeParamList=*/nullptr, 2927 Importer.Import(D->getIvarLBraceLoc()), 2928 Importer.Import(D->getIvarRBraceLoc())); 2929 ToCategory->setLexicalDeclContext(LexicalDC); 2930 LexicalDC->addDeclInternal(ToCategory); 2931 Importer.Imported(D, ToCategory); 2932 // Import the type parameter list after calling Imported, to avoid 2933 // loops when bringing in their DeclContext. 2934 ToCategory->setTypeParamList(ImportObjCTypeParamList( 2935 D->getTypeParamList())); 2936 2937 // Import protocols 2938 SmallVector<ObjCProtocolDecl *, 4> Protocols; 2939 SmallVector<SourceLocation, 4> ProtocolLocs; 2940 ObjCCategoryDecl::protocol_loc_iterator FromProtoLoc 2941 = D->protocol_loc_begin(); 2942 for (ObjCCategoryDecl::protocol_iterator FromProto = D->protocol_begin(), 2943 FromProtoEnd = D->protocol_end(); 2944 FromProto != FromProtoEnd; 2945 ++FromProto, ++FromProtoLoc) { 2946 ObjCProtocolDecl *ToProto 2947 = cast_or_null<ObjCProtocolDecl>(Importer.Import(*FromProto)); 2948 if (!ToProto) 2949 return nullptr; 2950 Protocols.push_back(ToProto); 2951 ProtocolLocs.push_back(Importer.Import(*FromProtoLoc)); 2952 } 2953 2954 // FIXME: If we're merging, make sure that the protocol list is the same. 2955 ToCategory->setProtocolList(Protocols.data(), Protocols.size(), 2956 ProtocolLocs.data(), Importer.getToContext()); 2957 2958 } else { 2959 Importer.Imported(D, ToCategory); 2960 } 2961 2962 // Import all of the members of this category. 2963 ImportDeclContext(D); 2964 2965 // If we have an implementation, import it as well. 2966 if (D->getImplementation()) { 2967 ObjCCategoryImplDecl *Impl 2968 = cast_or_null<ObjCCategoryImplDecl>( 2969 Importer.Import(D->getImplementation())); 2970 if (!Impl) 2971 return nullptr; 2972 2973 ToCategory->setImplementation(Impl); 2974 } 2975 2976 return ToCategory; 2977 } 2978 2979 bool ASTNodeImporter::ImportDefinition(ObjCProtocolDecl *From, 2980 ObjCProtocolDecl *To, 2981 ImportDefinitionKind Kind) { 2982 if (To->getDefinition()) { 2983 if (shouldForceImportDeclContext(Kind)) 2984 ImportDeclContext(From); 2985 return false; 2986 } 2987 2988 // Start the protocol definition 2989 To->startDefinition(); 2990 2991 // Import protocols 2992 SmallVector<ObjCProtocolDecl *, 4> Protocols; 2993 SmallVector<SourceLocation, 4> ProtocolLocs; 2994 ObjCProtocolDecl::protocol_loc_iterator 2995 FromProtoLoc = From->protocol_loc_begin(); 2996 for (ObjCProtocolDecl::protocol_iterator FromProto = From->protocol_begin(), 2997 FromProtoEnd = From->protocol_end(); 2998 FromProto != FromProtoEnd; 2999 ++FromProto, ++FromProtoLoc) { 3000 ObjCProtocolDecl *ToProto 3001 = cast_or_null<ObjCProtocolDecl>(Importer.Import(*FromProto)); 3002 if (!ToProto) 3003 return true; 3004 Protocols.push_back(ToProto); 3005 ProtocolLocs.push_back(Importer.Import(*FromProtoLoc)); 3006 } 3007 3008 // FIXME: If we're merging, make sure that the protocol list is the same. 3009 To->setProtocolList(Protocols.data(), Protocols.size(), 3010 ProtocolLocs.data(), Importer.getToContext()); 3011 3012 if (shouldForceImportDeclContext(Kind)) { 3013 // Import all of the members of this protocol. 3014 ImportDeclContext(From, /*ForceImport=*/true); 3015 } 3016 return false; 3017 } 3018 3019 Decl *ASTNodeImporter::VisitObjCProtocolDecl(ObjCProtocolDecl *D) { 3020 // If this protocol has a definition in the translation unit we're coming 3021 // from, but this particular declaration is not that definition, import the 3022 // definition and map to that. 3023 ObjCProtocolDecl *Definition = D->getDefinition(); 3024 if (Definition && Definition != D) { 3025 Decl *ImportedDef = Importer.Import(Definition); 3026 if (!ImportedDef) 3027 return nullptr; 3028 3029 return Importer.Imported(D, ImportedDef); 3030 } 3031 3032 // Import the major distinguishing characteristics of a protocol. 3033 DeclContext *DC, *LexicalDC; 3034 DeclarationName Name; 3035 SourceLocation Loc; 3036 NamedDecl *ToD; 3037 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 3038 return nullptr; 3039 if (ToD) 3040 return ToD; 3041 3042 ObjCProtocolDecl *MergeWithProtocol = nullptr; 3043 SmallVector<NamedDecl *, 2> FoundDecls; 3044 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls); 3045 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 3046 if (!FoundDecls[I]->isInIdentifierNamespace(Decl::IDNS_ObjCProtocol)) 3047 continue; 3048 3049 if ((MergeWithProtocol = dyn_cast<ObjCProtocolDecl>(FoundDecls[I]))) 3050 break; 3051 } 3052 3053 ObjCProtocolDecl *ToProto = MergeWithProtocol; 3054 if (!ToProto) { 3055 ToProto = ObjCProtocolDecl::Create(Importer.getToContext(), DC, 3056 Name.getAsIdentifierInfo(), Loc, 3057 Importer.Import(D->getAtStartLoc()), 3058 /*PrevDecl=*/nullptr); 3059 ToProto->setLexicalDeclContext(LexicalDC); 3060 LexicalDC->addDeclInternal(ToProto); 3061 } 3062 3063 Importer.Imported(D, ToProto); 3064 3065 if (D->isThisDeclarationADefinition() && ImportDefinition(D, ToProto)) 3066 return nullptr; 3067 3068 return ToProto; 3069 } 3070 3071 Decl *ASTNodeImporter::VisitLinkageSpecDecl(LinkageSpecDecl *D) { 3072 DeclContext *DC = Importer.ImportContext(D->getDeclContext()); 3073 DeclContext *LexicalDC = Importer.ImportContext(D->getLexicalDeclContext()); 3074 3075 SourceLocation ExternLoc = Importer.Import(D->getExternLoc()); 3076 SourceLocation LangLoc = Importer.Import(D->getLocation()); 3077 3078 bool HasBraces = D->hasBraces(); 3079 3080 LinkageSpecDecl *ToLinkageSpec = 3081 LinkageSpecDecl::Create(Importer.getToContext(), 3082 DC, 3083 ExternLoc, 3084 LangLoc, 3085 D->getLanguage(), 3086 HasBraces); 3087 3088 if (HasBraces) { 3089 SourceLocation RBraceLoc = Importer.Import(D->getRBraceLoc()); 3090 ToLinkageSpec->setRBraceLoc(RBraceLoc); 3091 } 3092 3093 ToLinkageSpec->setLexicalDeclContext(LexicalDC); 3094 LexicalDC->addDeclInternal(ToLinkageSpec); 3095 3096 Importer.Imported(D, ToLinkageSpec); 3097 3098 return ToLinkageSpec; 3099 } 3100 3101 Decl *ASTNodeImporter::VisitUsingDecl(UsingDecl *D) { 3102 DeclContext *DC, *LexicalDC; 3103 DeclarationName Name; 3104 SourceLocation Loc; 3105 NamedDecl *ToD = nullptr; 3106 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 3107 return nullptr; 3108 if (ToD) 3109 return ToD; 3110 3111 DeclarationNameInfo NameInfo(Name, 3112 Importer.Import(D->getNameInfo().getLoc())); 3113 ImportDeclarationNameLoc(D->getNameInfo(), NameInfo); 3114 3115 UsingDecl *ToUsing = UsingDecl::Create(Importer.getToContext(), DC, 3116 Importer.Import(D->getUsingLoc()), 3117 Importer.Import(D->getQualifierLoc()), 3118 NameInfo, D->hasTypename()); 3119 ToUsing->setLexicalDeclContext(LexicalDC); 3120 LexicalDC->addDeclInternal(ToUsing); 3121 Importer.Imported(D, ToUsing); 3122 3123 if (NamedDecl *FromPattern = 3124 Importer.getFromContext().getInstantiatedFromUsingDecl(D)) { 3125 if (NamedDecl *ToPattern = 3126 dyn_cast_or_null<NamedDecl>(Importer.Import(FromPattern))) 3127 Importer.getToContext().setInstantiatedFromUsingDecl(ToUsing, ToPattern); 3128 else 3129 return nullptr; 3130 } 3131 3132 for (UsingShadowDecl *FromShadow : D->shadows()) { 3133 if (UsingShadowDecl *ToShadow = 3134 dyn_cast_or_null<UsingShadowDecl>(Importer.Import(FromShadow))) 3135 ToUsing->addShadowDecl(ToShadow); 3136 else 3137 // FIXME: We return a nullptr here but the definition is already created 3138 // and available with lookups. How to fix this?.. 3139 return nullptr; 3140 } 3141 return ToUsing; 3142 } 3143 3144 Decl *ASTNodeImporter::VisitUsingShadowDecl(UsingShadowDecl *D) { 3145 DeclContext *DC, *LexicalDC; 3146 DeclarationName Name; 3147 SourceLocation Loc; 3148 NamedDecl *ToD = nullptr; 3149 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 3150 return nullptr; 3151 if (ToD) 3152 return ToD; 3153 3154 UsingDecl *ToUsing = dyn_cast_or_null<UsingDecl>( 3155 Importer.Import(D->getUsingDecl())); 3156 if (!ToUsing) 3157 return nullptr; 3158 3159 NamedDecl *ToTarget = dyn_cast_or_null<NamedDecl>( 3160 Importer.Import(D->getTargetDecl())); 3161 if (!ToTarget) 3162 return nullptr; 3163 3164 UsingShadowDecl *ToShadow = UsingShadowDecl::Create( 3165 Importer.getToContext(), DC, Loc, ToUsing, ToTarget); 3166 3167 ToShadow->setLexicalDeclContext(LexicalDC); 3168 ToShadow->setAccess(D->getAccess()); 3169 Importer.Imported(D, ToShadow); 3170 3171 if (UsingShadowDecl *FromPattern = 3172 Importer.getFromContext().getInstantiatedFromUsingShadowDecl(D)) { 3173 if (UsingShadowDecl *ToPattern = 3174 dyn_cast_or_null<UsingShadowDecl>(Importer.Import(FromPattern))) 3175 Importer.getToContext().setInstantiatedFromUsingShadowDecl(ToShadow, 3176 ToPattern); 3177 else 3178 // FIXME: We return a nullptr here but the definition is already created 3179 // and available with lookups. How to fix this?.. 3180 return nullptr; 3181 } 3182 3183 LexicalDC->addDeclInternal(ToShadow); 3184 3185 return ToShadow; 3186 } 3187 3188 3189 Decl *ASTNodeImporter::VisitUsingDirectiveDecl(UsingDirectiveDecl *D) { 3190 DeclContext *DC, *LexicalDC; 3191 DeclarationName Name; 3192 SourceLocation Loc; 3193 NamedDecl *ToD = nullptr; 3194 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 3195 return nullptr; 3196 if (ToD) 3197 return ToD; 3198 3199 DeclContext *ToComAncestor = Importer.ImportContext(D->getCommonAncestor()); 3200 if (!ToComAncestor) 3201 return nullptr; 3202 3203 NamespaceDecl *ToNominated = cast_or_null<NamespaceDecl>( 3204 Importer.Import(D->getNominatedNamespace())); 3205 if (!ToNominated) 3206 return nullptr; 3207 3208 UsingDirectiveDecl *ToUsingDir = UsingDirectiveDecl::Create( 3209 Importer.getToContext(), DC, Importer.Import(D->getUsingLoc()), 3210 Importer.Import(D->getNamespaceKeyLocation()), 3211 Importer.Import(D->getQualifierLoc()), 3212 Importer.Import(D->getIdentLocation()), ToNominated, ToComAncestor); 3213 ToUsingDir->setLexicalDeclContext(LexicalDC); 3214 LexicalDC->addDeclInternal(ToUsingDir); 3215 Importer.Imported(D, ToUsingDir); 3216 3217 return ToUsingDir; 3218 } 3219 3220 Decl *ASTNodeImporter::VisitUnresolvedUsingValueDecl( 3221 UnresolvedUsingValueDecl *D) { 3222 DeclContext *DC, *LexicalDC; 3223 DeclarationName Name; 3224 SourceLocation Loc; 3225 NamedDecl *ToD = nullptr; 3226 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 3227 return nullptr; 3228 if (ToD) 3229 return ToD; 3230 3231 DeclarationNameInfo NameInfo(Name, Importer.Import(D->getNameInfo().getLoc())); 3232 ImportDeclarationNameLoc(D->getNameInfo(), NameInfo); 3233 3234 UnresolvedUsingValueDecl *ToUsingValue = UnresolvedUsingValueDecl::Create( 3235 Importer.getToContext(), DC, Importer.Import(D->getUsingLoc()), 3236 Importer.Import(D->getQualifierLoc()), NameInfo, 3237 Importer.Import(D->getEllipsisLoc())); 3238 3239 Importer.Imported(D, ToUsingValue); 3240 ToUsingValue->setAccess(D->getAccess()); 3241 ToUsingValue->setLexicalDeclContext(LexicalDC); 3242 LexicalDC->addDeclInternal(ToUsingValue); 3243 3244 return ToUsingValue; 3245 } 3246 3247 Decl *ASTNodeImporter::VisitUnresolvedUsingTypenameDecl( 3248 UnresolvedUsingTypenameDecl *D) { 3249 DeclContext *DC, *LexicalDC; 3250 DeclarationName Name; 3251 SourceLocation Loc; 3252 NamedDecl *ToD = nullptr; 3253 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 3254 return nullptr; 3255 if (ToD) 3256 return ToD; 3257 3258 UnresolvedUsingTypenameDecl *ToUsing = UnresolvedUsingTypenameDecl::Create( 3259 Importer.getToContext(), DC, Importer.Import(D->getUsingLoc()), 3260 Importer.Import(D->getTypenameLoc()), 3261 Importer.Import(D->getQualifierLoc()), Loc, Name, 3262 Importer.Import(D->getEllipsisLoc())); 3263 3264 Importer.Imported(D, ToUsing); 3265 ToUsing->setAccess(D->getAccess()); 3266 ToUsing->setLexicalDeclContext(LexicalDC); 3267 LexicalDC->addDeclInternal(ToUsing); 3268 3269 return ToUsing; 3270 } 3271 3272 3273 bool ASTNodeImporter::ImportDefinition(ObjCInterfaceDecl *From, 3274 ObjCInterfaceDecl *To, 3275 ImportDefinitionKind Kind) { 3276 if (To->getDefinition()) { 3277 // Check consistency of superclass. 3278 ObjCInterfaceDecl *FromSuper = From->getSuperClass(); 3279 if (FromSuper) { 3280 FromSuper = cast_or_null<ObjCInterfaceDecl>(Importer.Import(FromSuper)); 3281 if (!FromSuper) 3282 return true; 3283 } 3284 3285 ObjCInterfaceDecl *ToSuper = To->getSuperClass(); 3286 if ((bool)FromSuper != (bool)ToSuper || 3287 (FromSuper && !declaresSameEntity(FromSuper, ToSuper))) { 3288 Importer.ToDiag(To->getLocation(), 3289 diag::err_odr_objc_superclass_inconsistent) 3290 << To->getDeclName(); 3291 if (ToSuper) 3292 Importer.ToDiag(To->getSuperClassLoc(), diag::note_odr_objc_superclass) 3293 << To->getSuperClass()->getDeclName(); 3294 else 3295 Importer.ToDiag(To->getLocation(), 3296 diag::note_odr_objc_missing_superclass); 3297 if (From->getSuperClass()) 3298 Importer.FromDiag(From->getSuperClassLoc(), 3299 diag::note_odr_objc_superclass) 3300 << From->getSuperClass()->getDeclName(); 3301 else 3302 Importer.FromDiag(From->getLocation(), 3303 diag::note_odr_objc_missing_superclass); 3304 } 3305 3306 if (shouldForceImportDeclContext(Kind)) 3307 ImportDeclContext(From); 3308 return false; 3309 } 3310 3311 // Start the definition. 3312 To->startDefinition(); 3313 3314 // If this class has a superclass, import it. 3315 if (From->getSuperClass()) { 3316 TypeSourceInfo *SuperTInfo = Importer.Import(From->getSuperClassTInfo()); 3317 if (!SuperTInfo) 3318 return true; 3319 3320 To->setSuperClass(SuperTInfo); 3321 } 3322 3323 // Import protocols 3324 SmallVector<ObjCProtocolDecl *, 4> Protocols; 3325 SmallVector<SourceLocation, 4> ProtocolLocs; 3326 ObjCInterfaceDecl::protocol_loc_iterator 3327 FromProtoLoc = From->protocol_loc_begin(); 3328 3329 for (ObjCInterfaceDecl::protocol_iterator FromProto = From->protocol_begin(), 3330 FromProtoEnd = From->protocol_end(); 3331 FromProto != FromProtoEnd; 3332 ++FromProto, ++FromProtoLoc) { 3333 ObjCProtocolDecl *ToProto 3334 = cast_or_null<ObjCProtocolDecl>(Importer.Import(*FromProto)); 3335 if (!ToProto) 3336 return true; 3337 Protocols.push_back(ToProto); 3338 ProtocolLocs.push_back(Importer.Import(*FromProtoLoc)); 3339 } 3340 3341 // FIXME: If we're merging, make sure that the protocol list is the same. 3342 To->setProtocolList(Protocols.data(), Protocols.size(), 3343 ProtocolLocs.data(), Importer.getToContext()); 3344 3345 // Import categories. When the categories themselves are imported, they'll 3346 // hook themselves into this interface. 3347 for (auto *Cat : From->known_categories()) 3348 Importer.Import(Cat); 3349 3350 // If we have an @implementation, import it as well. 3351 if (From->getImplementation()) { 3352 ObjCImplementationDecl *Impl = cast_or_null<ObjCImplementationDecl>( 3353 Importer.Import(From->getImplementation())); 3354 if (!Impl) 3355 return true; 3356 3357 To->setImplementation(Impl); 3358 } 3359 3360 if (shouldForceImportDeclContext(Kind)) { 3361 // Import all of the members of this class. 3362 ImportDeclContext(From, /*ForceImport=*/true); 3363 } 3364 return false; 3365 } 3366 3367 ObjCTypeParamList * 3368 ASTNodeImporter::ImportObjCTypeParamList(ObjCTypeParamList *list) { 3369 if (!list) 3370 return nullptr; 3371 3372 SmallVector<ObjCTypeParamDecl *, 4> toTypeParams; 3373 for (auto fromTypeParam : *list) { 3374 auto toTypeParam = cast_or_null<ObjCTypeParamDecl>( 3375 Importer.Import(fromTypeParam)); 3376 if (!toTypeParam) 3377 return nullptr; 3378 3379 toTypeParams.push_back(toTypeParam); 3380 } 3381 3382 return ObjCTypeParamList::create(Importer.getToContext(), 3383 Importer.Import(list->getLAngleLoc()), 3384 toTypeParams, 3385 Importer.Import(list->getRAngleLoc())); 3386 } 3387 3388 Decl *ASTNodeImporter::VisitObjCInterfaceDecl(ObjCInterfaceDecl *D) { 3389 // If this class has a definition in the translation unit we're coming from, 3390 // but this particular declaration is not that definition, import the 3391 // definition and map to that. 3392 ObjCInterfaceDecl *Definition = D->getDefinition(); 3393 if (Definition && Definition != D) { 3394 Decl *ImportedDef = Importer.Import(Definition); 3395 if (!ImportedDef) 3396 return nullptr; 3397 3398 return Importer.Imported(D, ImportedDef); 3399 } 3400 3401 // Import the major distinguishing characteristics of an @interface. 3402 DeclContext *DC, *LexicalDC; 3403 DeclarationName Name; 3404 SourceLocation Loc; 3405 NamedDecl *ToD; 3406 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 3407 return nullptr; 3408 if (ToD) 3409 return ToD; 3410 3411 // Look for an existing interface with the same name. 3412 ObjCInterfaceDecl *MergeWithIface = nullptr; 3413 SmallVector<NamedDecl *, 2> FoundDecls; 3414 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls); 3415 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 3416 if (!FoundDecls[I]->isInIdentifierNamespace(Decl::IDNS_Ordinary)) 3417 continue; 3418 3419 if ((MergeWithIface = dyn_cast<ObjCInterfaceDecl>(FoundDecls[I]))) 3420 break; 3421 } 3422 3423 // Create an interface declaration, if one does not already exist. 3424 ObjCInterfaceDecl *ToIface = MergeWithIface; 3425 if (!ToIface) { 3426 ToIface = ObjCInterfaceDecl::Create(Importer.getToContext(), DC, 3427 Importer.Import(D->getAtStartLoc()), 3428 Name.getAsIdentifierInfo(), 3429 /*TypeParamList=*/nullptr, 3430 /*PrevDecl=*/nullptr, Loc, 3431 D->isImplicitInterfaceDecl()); 3432 ToIface->setLexicalDeclContext(LexicalDC); 3433 LexicalDC->addDeclInternal(ToIface); 3434 } 3435 Importer.Imported(D, ToIface); 3436 // Import the type parameter list after calling Imported, to avoid 3437 // loops when bringing in their DeclContext. 3438 ToIface->setTypeParamList(ImportObjCTypeParamList( 3439 D->getTypeParamListAsWritten())); 3440 3441 if (D->isThisDeclarationADefinition() && ImportDefinition(D, ToIface)) 3442 return nullptr; 3443 3444 return ToIface; 3445 } 3446 3447 Decl *ASTNodeImporter::VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D) { 3448 ObjCCategoryDecl *Category = cast_or_null<ObjCCategoryDecl>( 3449 Importer.Import(D->getCategoryDecl())); 3450 if (!Category) 3451 return nullptr; 3452 3453 ObjCCategoryImplDecl *ToImpl = Category->getImplementation(); 3454 if (!ToImpl) { 3455 DeclContext *DC = Importer.ImportContext(D->getDeclContext()); 3456 if (!DC) 3457 return nullptr; 3458 3459 SourceLocation CategoryNameLoc = Importer.Import(D->getCategoryNameLoc()); 3460 ToImpl = ObjCCategoryImplDecl::Create(Importer.getToContext(), DC, 3461 Importer.Import(D->getIdentifier()), 3462 Category->getClassInterface(), 3463 Importer.Import(D->getLocation()), 3464 Importer.Import(D->getAtStartLoc()), 3465 CategoryNameLoc); 3466 3467 DeclContext *LexicalDC = DC; 3468 if (D->getDeclContext() != D->getLexicalDeclContext()) { 3469 LexicalDC = Importer.ImportContext(D->getLexicalDeclContext()); 3470 if (!LexicalDC) 3471 return nullptr; 3472 3473 ToImpl->setLexicalDeclContext(LexicalDC); 3474 } 3475 3476 LexicalDC->addDeclInternal(ToImpl); 3477 Category->setImplementation(ToImpl); 3478 } 3479 3480 Importer.Imported(D, ToImpl); 3481 ImportDeclContext(D); 3482 return ToImpl; 3483 } 3484 3485 Decl *ASTNodeImporter::VisitObjCImplementationDecl(ObjCImplementationDecl *D) { 3486 // Find the corresponding interface. 3487 ObjCInterfaceDecl *Iface = cast_or_null<ObjCInterfaceDecl>( 3488 Importer.Import(D->getClassInterface())); 3489 if (!Iface) 3490 return nullptr; 3491 3492 // Import the superclass, if any. 3493 ObjCInterfaceDecl *Super = nullptr; 3494 if (D->getSuperClass()) { 3495 Super = cast_or_null<ObjCInterfaceDecl>( 3496 Importer.Import(D->getSuperClass())); 3497 if (!Super) 3498 return nullptr; 3499 } 3500 3501 ObjCImplementationDecl *Impl = Iface->getImplementation(); 3502 if (!Impl) { 3503 // We haven't imported an implementation yet. Create a new @implementation 3504 // now. 3505 Impl = ObjCImplementationDecl::Create(Importer.getToContext(), 3506 Importer.ImportContext(D->getDeclContext()), 3507 Iface, Super, 3508 Importer.Import(D->getLocation()), 3509 Importer.Import(D->getAtStartLoc()), 3510 Importer.Import(D->getSuperClassLoc()), 3511 Importer.Import(D->getIvarLBraceLoc()), 3512 Importer.Import(D->getIvarRBraceLoc())); 3513 3514 if (D->getDeclContext() != D->getLexicalDeclContext()) { 3515 DeclContext *LexicalDC 3516 = Importer.ImportContext(D->getLexicalDeclContext()); 3517 if (!LexicalDC) 3518 return nullptr; 3519 Impl->setLexicalDeclContext(LexicalDC); 3520 } 3521 3522 // Associate the implementation with the class it implements. 3523 Iface->setImplementation(Impl); 3524 Importer.Imported(D, Iface->getImplementation()); 3525 } else { 3526 Importer.Imported(D, Iface->getImplementation()); 3527 3528 // Verify that the existing @implementation has the same superclass. 3529 if ((Super && !Impl->getSuperClass()) || 3530 (!Super && Impl->getSuperClass()) || 3531 (Super && Impl->getSuperClass() && 3532 !declaresSameEntity(Super->getCanonicalDecl(), 3533 Impl->getSuperClass()))) { 3534 Importer.ToDiag(Impl->getLocation(), 3535 diag::err_odr_objc_superclass_inconsistent) 3536 << Iface->getDeclName(); 3537 // FIXME: It would be nice to have the location of the superclass 3538 // below. 3539 if (Impl->getSuperClass()) 3540 Importer.ToDiag(Impl->getLocation(), 3541 diag::note_odr_objc_superclass) 3542 << Impl->getSuperClass()->getDeclName(); 3543 else 3544 Importer.ToDiag(Impl->getLocation(), 3545 diag::note_odr_objc_missing_superclass); 3546 if (D->getSuperClass()) 3547 Importer.FromDiag(D->getLocation(), 3548 diag::note_odr_objc_superclass) 3549 << D->getSuperClass()->getDeclName(); 3550 else 3551 Importer.FromDiag(D->getLocation(), 3552 diag::note_odr_objc_missing_superclass); 3553 return nullptr; 3554 } 3555 } 3556 3557 // Import all of the members of this @implementation. 3558 ImportDeclContext(D); 3559 3560 return Impl; 3561 } 3562 3563 Decl *ASTNodeImporter::VisitObjCPropertyDecl(ObjCPropertyDecl *D) { 3564 // Import the major distinguishing characteristics of an @property. 3565 DeclContext *DC, *LexicalDC; 3566 DeclarationName Name; 3567 SourceLocation Loc; 3568 NamedDecl *ToD; 3569 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 3570 return nullptr; 3571 if (ToD) 3572 return ToD; 3573 3574 // Check whether we have already imported this property. 3575 SmallVector<NamedDecl *, 2> FoundDecls; 3576 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls); 3577 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 3578 if (ObjCPropertyDecl *FoundProp 3579 = dyn_cast<ObjCPropertyDecl>(FoundDecls[I])) { 3580 // Check property types. 3581 if (!Importer.IsStructurallyEquivalent(D->getType(), 3582 FoundProp->getType())) { 3583 Importer.ToDiag(Loc, diag::err_odr_objc_property_type_inconsistent) 3584 << Name << D->getType() << FoundProp->getType(); 3585 Importer.ToDiag(FoundProp->getLocation(), diag::note_odr_value_here) 3586 << FoundProp->getType(); 3587 return nullptr; 3588 } 3589 3590 // FIXME: Check property attributes, getters, setters, etc.? 3591 3592 // Consider these properties to be equivalent. 3593 Importer.Imported(D, FoundProp); 3594 return FoundProp; 3595 } 3596 } 3597 3598 // Import the type. 3599 TypeSourceInfo *TSI = Importer.Import(D->getTypeSourceInfo()); 3600 if (!TSI) 3601 return nullptr; 3602 3603 // Create the new property. 3604 ObjCPropertyDecl *ToProperty 3605 = ObjCPropertyDecl::Create(Importer.getToContext(), DC, Loc, 3606 Name.getAsIdentifierInfo(), 3607 Importer.Import(D->getAtLoc()), 3608 Importer.Import(D->getLParenLoc()), 3609 Importer.Import(D->getType()), 3610 TSI, 3611 D->getPropertyImplementation()); 3612 Importer.Imported(D, ToProperty); 3613 ToProperty->setLexicalDeclContext(LexicalDC); 3614 LexicalDC->addDeclInternal(ToProperty); 3615 3616 ToProperty->setPropertyAttributes(D->getPropertyAttributes()); 3617 ToProperty->setPropertyAttributesAsWritten( 3618 D->getPropertyAttributesAsWritten()); 3619 ToProperty->setGetterName(Importer.Import(D->getGetterName()), 3620 Importer.Import(D->getGetterNameLoc())); 3621 ToProperty->setSetterName(Importer.Import(D->getSetterName()), 3622 Importer.Import(D->getSetterNameLoc())); 3623 ToProperty->setGetterMethodDecl( 3624 cast_or_null<ObjCMethodDecl>(Importer.Import(D->getGetterMethodDecl()))); 3625 ToProperty->setSetterMethodDecl( 3626 cast_or_null<ObjCMethodDecl>(Importer.Import(D->getSetterMethodDecl()))); 3627 ToProperty->setPropertyIvarDecl( 3628 cast_or_null<ObjCIvarDecl>(Importer.Import(D->getPropertyIvarDecl()))); 3629 return ToProperty; 3630 } 3631 3632 Decl *ASTNodeImporter::VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D) { 3633 ObjCPropertyDecl *Property = cast_or_null<ObjCPropertyDecl>( 3634 Importer.Import(D->getPropertyDecl())); 3635 if (!Property) 3636 return nullptr; 3637 3638 DeclContext *DC = Importer.ImportContext(D->getDeclContext()); 3639 if (!DC) 3640 return nullptr; 3641 3642 // Import the lexical declaration context. 3643 DeclContext *LexicalDC = DC; 3644 if (D->getDeclContext() != D->getLexicalDeclContext()) { 3645 LexicalDC = Importer.ImportContext(D->getLexicalDeclContext()); 3646 if (!LexicalDC) 3647 return nullptr; 3648 } 3649 3650 ObjCImplDecl *InImpl = dyn_cast<ObjCImplDecl>(LexicalDC); 3651 if (!InImpl) 3652 return nullptr; 3653 3654 // Import the ivar (for an @synthesize). 3655 ObjCIvarDecl *Ivar = nullptr; 3656 if (D->getPropertyIvarDecl()) { 3657 Ivar = cast_or_null<ObjCIvarDecl>( 3658 Importer.Import(D->getPropertyIvarDecl())); 3659 if (!Ivar) 3660 return nullptr; 3661 } 3662 3663 ObjCPropertyImplDecl *ToImpl 3664 = InImpl->FindPropertyImplDecl(Property->getIdentifier(), 3665 Property->getQueryKind()); 3666 if (!ToImpl) { 3667 ToImpl = ObjCPropertyImplDecl::Create(Importer.getToContext(), DC, 3668 Importer.Import(D->getLocStart()), 3669 Importer.Import(D->getLocation()), 3670 Property, 3671 D->getPropertyImplementation(), 3672 Ivar, 3673 Importer.Import(D->getPropertyIvarDeclLoc())); 3674 ToImpl->setLexicalDeclContext(LexicalDC); 3675 Importer.Imported(D, ToImpl); 3676 LexicalDC->addDeclInternal(ToImpl); 3677 } else { 3678 // Check that we have the same kind of property implementation (@synthesize 3679 // vs. @dynamic). 3680 if (D->getPropertyImplementation() != ToImpl->getPropertyImplementation()) { 3681 Importer.ToDiag(ToImpl->getLocation(), 3682 diag::err_odr_objc_property_impl_kind_inconsistent) 3683 << Property->getDeclName() 3684 << (ToImpl->getPropertyImplementation() 3685 == ObjCPropertyImplDecl::Dynamic); 3686 Importer.FromDiag(D->getLocation(), 3687 diag::note_odr_objc_property_impl_kind) 3688 << D->getPropertyDecl()->getDeclName() 3689 << (D->getPropertyImplementation() == ObjCPropertyImplDecl::Dynamic); 3690 return nullptr; 3691 } 3692 3693 // For @synthesize, check that we have the same 3694 if (D->getPropertyImplementation() == ObjCPropertyImplDecl::Synthesize && 3695 Ivar != ToImpl->getPropertyIvarDecl()) { 3696 Importer.ToDiag(ToImpl->getPropertyIvarDeclLoc(), 3697 diag::err_odr_objc_synthesize_ivar_inconsistent) 3698 << Property->getDeclName() 3699 << ToImpl->getPropertyIvarDecl()->getDeclName() 3700 << Ivar->getDeclName(); 3701 Importer.FromDiag(D->getPropertyIvarDeclLoc(), 3702 diag::note_odr_objc_synthesize_ivar_here) 3703 << D->getPropertyIvarDecl()->getDeclName(); 3704 return nullptr; 3705 } 3706 3707 // Merge the existing implementation with the new implementation. 3708 Importer.Imported(D, ToImpl); 3709 } 3710 3711 return ToImpl; 3712 } 3713 3714 Decl *ASTNodeImporter::VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D) { 3715 // For template arguments, we adopt the translation unit as our declaration 3716 // context. This context will be fixed when the actual template declaration 3717 // is created. 3718 3719 // FIXME: Import default argument. 3720 return TemplateTypeParmDecl::Create(Importer.getToContext(), 3721 Importer.getToContext().getTranslationUnitDecl(), 3722 Importer.Import(D->getLocStart()), 3723 Importer.Import(D->getLocation()), 3724 D->getDepth(), 3725 D->getIndex(), 3726 Importer.Import(D->getIdentifier()), 3727 D->wasDeclaredWithTypename(), 3728 D->isParameterPack()); 3729 } 3730 3731 Decl * 3732 ASTNodeImporter::VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D) { 3733 // Import the name of this declaration. 3734 DeclarationName Name = Importer.Import(D->getDeclName()); 3735 if (D->getDeclName() && !Name) 3736 return nullptr; 3737 3738 // Import the location of this declaration. 3739 SourceLocation Loc = Importer.Import(D->getLocation()); 3740 3741 // Import the type of this declaration. 3742 QualType T = Importer.Import(D->getType()); 3743 if (T.isNull()) 3744 return nullptr; 3745 3746 // Import type-source information. 3747 TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo()); 3748 if (D->getTypeSourceInfo() && !TInfo) 3749 return nullptr; 3750 3751 // FIXME: Import default argument. 3752 3753 return NonTypeTemplateParmDecl::Create(Importer.getToContext(), 3754 Importer.getToContext().getTranslationUnitDecl(), 3755 Importer.Import(D->getInnerLocStart()), 3756 Loc, D->getDepth(), D->getPosition(), 3757 Name.getAsIdentifierInfo(), 3758 T, D->isParameterPack(), TInfo); 3759 } 3760 3761 Decl * 3762 ASTNodeImporter::VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D) { 3763 // Import the name of this declaration. 3764 DeclarationName Name = Importer.Import(D->getDeclName()); 3765 if (D->getDeclName() && !Name) 3766 return nullptr; 3767 3768 // Import the location of this declaration. 3769 SourceLocation Loc = Importer.Import(D->getLocation()); 3770 3771 // Import template parameters. 3772 TemplateParameterList *TemplateParams 3773 = ImportTemplateParameterList(D->getTemplateParameters()); 3774 if (!TemplateParams) 3775 return nullptr; 3776 3777 // FIXME: Import default argument. 3778 3779 return TemplateTemplateParmDecl::Create(Importer.getToContext(), 3780 Importer.getToContext().getTranslationUnitDecl(), 3781 Loc, D->getDepth(), D->getPosition(), 3782 D->isParameterPack(), 3783 Name.getAsIdentifierInfo(), 3784 TemplateParams); 3785 } 3786 3787 Decl *ASTNodeImporter::VisitClassTemplateDecl(ClassTemplateDecl *D) { 3788 // If this record has a definition in the translation unit we're coming from, 3789 // but this particular declaration is not that definition, import the 3790 // definition and map to that. 3791 CXXRecordDecl *Definition 3792 = cast_or_null<CXXRecordDecl>(D->getTemplatedDecl()->getDefinition()); 3793 if (Definition && Definition != D->getTemplatedDecl()) { 3794 Decl *ImportedDef 3795 = Importer.Import(Definition->getDescribedClassTemplate()); 3796 if (!ImportedDef) 3797 return nullptr; 3798 3799 return Importer.Imported(D, ImportedDef); 3800 } 3801 3802 // Import the major distinguishing characteristics of this class template. 3803 DeclContext *DC, *LexicalDC; 3804 DeclarationName Name; 3805 SourceLocation Loc; 3806 NamedDecl *ToD; 3807 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 3808 return nullptr; 3809 if (ToD) 3810 return ToD; 3811 3812 // We may already have a template of the same name; try to find and match it. 3813 if (!DC->isFunctionOrMethod()) { 3814 SmallVector<NamedDecl *, 4> ConflictingDecls; 3815 SmallVector<NamedDecl *, 2> FoundDecls; 3816 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls); 3817 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 3818 if (!FoundDecls[I]->isInIdentifierNamespace(Decl::IDNS_Ordinary)) 3819 continue; 3820 3821 Decl *Found = FoundDecls[I]; 3822 if (ClassTemplateDecl *FoundTemplate 3823 = dyn_cast<ClassTemplateDecl>(Found)) { 3824 if (IsStructuralMatch(D, FoundTemplate)) { 3825 // The class templates structurally match; call it the same template. 3826 // FIXME: We may be filling in a forward declaration here. Handle 3827 // this case! 3828 Importer.Imported(D->getTemplatedDecl(), 3829 FoundTemplate->getTemplatedDecl()); 3830 return Importer.Imported(D, FoundTemplate); 3831 } 3832 } 3833 3834 ConflictingDecls.push_back(FoundDecls[I]); 3835 } 3836 3837 if (!ConflictingDecls.empty()) { 3838 Name = Importer.HandleNameConflict(Name, DC, Decl::IDNS_Ordinary, 3839 ConflictingDecls.data(), 3840 ConflictingDecls.size()); 3841 } 3842 3843 if (!Name) 3844 return nullptr; 3845 } 3846 3847 CXXRecordDecl *DTemplated = D->getTemplatedDecl(); 3848 3849 // Create the declaration that is being templated. 3850 CXXRecordDecl *D2Templated = cast_or_null<CXXRecordDecl>( 3851 Importer.Import(DTemplated)); 3852 if (!D2Templated) 3853 return nullptr; 3854 3855 // Resolve possible cyclic import. 3856 if (Decl *AlreadyImported = Importer.GetAlreadyImportedOrNull(D)) 3857 return AlreadyImported; 3858 3859 // Create the class template declaration itself. 3860 TemplateParameterList *TemplateParams 3861 = ImportTemplateParameterList(D->getTemplateParameters()); 3862 if (!TemplateParams) 3863 return nullptr; 3864 3865 ClassTemplateDecl *D2 = ClassTemplateDecl::Create(Importer.getToContext(), DC, 3866 Loc, Name, TemplateParams, 3867 D2Templated); 3868 D2Templated->setDescribedClassTemplate(D2); 3869 3870 D2->setAccess(D->getAccess()); 3871 D2->setLexicalDeclContext(LexicalDC); 3872 LexicalDC->addDeclInternal(D2); 3873 3874 // Note the relationship between the class templates. 3875 Importer.Imported(D, D2); 3876 Importer.Imported(DTemplated, D2Templated); 3877 3878 if (DTemplated->isCompleteDefinition() && 3879 !D2Templated->isCompleteDefinition()) { 3880 // FIXME: Import definition! 3881 } 3882 3883 return D2; 3884 } 3885 3886 Decl *ASTNodeImporter::VisitClassTemplateSpecializationDecl( 3887 ClassTemplateSpecializationDecl *D) { 3888 // If this record has a definition in the translation unit we're coming from, 3889 // but this particular declaration is not that definition, import the 3890 // definition and map to that. 3891 TagDecl *Definition = D->getDefinition(); 3892 if (Definition && Definition != D) { 3893 Decl *ImportedDef = Importer.Import(Definition); 3894 if (!ImportedDef) 3895 return nullptr; 3896 3897 return Importer.Imported(D, ImportedDef); 3898 } 3899 3900 ClassTemplateDecl *ClassTemplate 3901 = cast_or_null<ClassTemplateDecl>(Importer.Import( 3902 D->getSpecializedTemplate())); 3903 if (!ClassTemplate) 3904 return nullptr; 3905 3906 // Import the context of this declaration. 3907 DeclContext *DC = ClassTemplate->getDeclContext(); 3908 if (!DC) 3909 return nullptr; 3910 3911 DeclContext *LexicalDC = DC; 3912 if (D->getDeclContext() != D->getLexicalDeclContext()) { 3913 LexicalDC = Importer.ImportContext(D->getLexicalDeclContext()); 3914 if (!LexicalDC) 3915 return nullptr; 3916 } 3917 3918 // Import the location of this declaration. 3919 SourceLocation StartLoc = Importer.Import(D->getLocStart()); 3920 SourceLocation IdLoc = Importer.Import(D->getLocation()); 3921 3922 // Import template arguments. 3923 SmallVector<TemplateArgument, 2> TemplateArgs; 3924 if (ImportTemplateArguments(D->getTemplateArgs().data(), 3925 D->getTemplateArgs().size(), 3926 TemplateArgs)) 3927 return nullptr; 3928 3929 // Try to find an existing specialization with these template arguments. 3930 void *InsertPos = nullptr; 3931 ClassTemplateSpecializationDecl *D2 3932 = ClassTemplate->findSpecialization(TemplateArgs, InsertPos); 3933 if (D2) { 3934 // We already have a class template specialization with these template 3935 // arguments. 3936 3937 // FIXME: Check for specialization vs. instantiation errors. 3938 3939 if (RecordDecl *FoundDef = D2->getDefinition()) { 3940 if (!D->isCompleteDefinition() || IsStructuralMatch(D, FoundDef)) { 3941 // The record types structurally match, or the "from" translation 3942 // unit only had a forward declaration anyway; call it the same 3943 // function. 3944 return Importer.Imported(D, FoundDef); 3945 } 3946 } 3947 } else { 3948 // Create a new specialization. 3949 if (ClassTemplatePartialSpecializationDecl *PartialSpec = 3950 dyn_cast<ClassTemplatePartialSpecializationDecl>(D)) { 3951 3952 // Import TemplateArgumentListInfo 3953 TemplateArgumentListInfo ToTAInfo; 3954 auto &ASTTemplateArgs = *PartialSpec->getTemplateArgsAsWritten(); 3955 for (unsigned I = 0, E = ASTTemplateArgs.NumTemplateArgs; I < E; ++I) { 3956 if (auto ToLoc = ImportTemplateArgumentLoc(ASTTemplateArgs[I])) 3957 ToTAInfo.addArgument(*ToLoc); 3958 else 3959 return nullptr; 3960 } 3961 3962 QualType CanonInjType = Importer.Import( 3963 PartialSpec->getInjectedSpecializationType()); 3964 if (CanonInjType.isNull()) 3965 return nullptr; 3966 CanonInjType = CanonInjType.getCanonicalType(); 3967 3968 TemplateParameterList *ToTPList = ImportTemplateParameterList( 3969 PartialSpec->getTemplateParameters()); 3970 if (!ToTPList && PartialSpec->getTemplateParameters()) 3971 return nullptr; 3972 3973 D2 = ClassTemplatePartialSpecializationDecl::Create( 3974 Importer.getToContext(), D->getTagKind(), DC, StartLoc, IdLoc, 3975 ToTPList, ClassTemplate, 3976 llvm::makeArrayRef(TemplateArgs.data(), TemplateArgs.size()), 3977 ToTAInfo, CanonInjType, nullptr); 3978 3979 } else { 3980 D2 = ClassTemplateSpecializationDecl::Create(Importer.getToContext(), 3981 D->getTagKind(), DC, 3982 StartLoc, IdLoc, 3983 ClassTemplate, 3984 TemplateArgs, 3985 /*PrevDecl=*/nullptr); 3986 } 3987 3988 D2->setSpecializationKind(D->getSpecializationKind()); 3989 3990 // Add this specialization to the class template. 3991 ClassTemplate->AddSpecialization(D2, InsertPos); 3992 3993 // Import the qualifier, if any. 3994 D2->setQualifierInfo(Importer.Import(D->getQualifierLoc())); 3995 3996 Importer.Imported(D, D2); 3997 3998 if (auto *TSI = D->getTypeAsWritten()) { 3999 TypeSourceInfo *TInfo = Importer.Import(TSI); 4000 if (!TInfo) 4001 return nullptr; 4002 D2->setTypeAsWritten(TInfo); 4003 D2->setTemplateKeywordLoc(Importer.Import(D->getTemplateKeywordLoc())); 4004 D2->setExternLoc(Importer.Import(D->getExternLoc())); 4005 } 4006 4007 SourceLocation POI = Importer.Import(D->getPointOfInstantiation()); 4008 if (POI.isValid()) 4009 D2->setPointOfInstantiation(POI); 4010 else if (D->getPointOfInstantiation().isValid()) 4011 return nullptr; 4012 4013 D2->setTemplateSpecializationKind(D->getTemplateSpecializationKind()); 4014 4015 // Add the specialization to this context. 4016 D2->setLexicalDeclContext(LexicalDC); 4017 LexicalDC->addDeclInternal(D2); 4018 } 4019 Importer.Imported(D, D2); 4020 if (D->isCompleteDefinition() && ImportDefinition(D, D2)) 4021 return nullptr; 4022 4023 return D2; 4024 } 4025 4026 Decl *ASTNodeImporter::VisitVarTemplateDecl(VarTemplateDecl *D) { 4027 // If this variable has a definition in the translation unit we're coming 4028 // from, 4029 // but this particular declaration is not that definition, import the 4030 // definition and map to that. 4031 VarDecl *Definition = 4032 cast_or_null<VarDecl>(D->getTemplatedDecl()->getDefinition()); 4033 if (Definition && Definition != D->getTemplatedDecl()) { 4034 Decl *ImportedDef = Importer.Import(Definition->getDescribedVarTemplate()); 4035 if (!ImportedDef) 4036 return nullptr; 4037 4038 return Importer.Imported(D, ImportedDef); 4039 } 4040 4041 // Import the major distinguishing characteristics of this variable template. 4042 DeclContext *DC, *LexicalDC; 4043 DeclarationName Name; 4044 SourceLocation Loc; 4045 NamedDecl *ToD; 4046 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 4047 return nullptr; 4048 if (ToD) 4049 return ToD; 4050 4051 // We may already have a template of the same name; try to find and match it. 4052 assert(!DC->isFunctionOrMethod() && 4053 "Variable templates cannot be declared at function scope"); 4054 SmallVector<NamedDecl *, 4> ConflictingDecls; 4055 SmallVector<NamedDecl *, 2> FoundDecls; 4056 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls); 4057 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 4058 if (!FoundDecls[I]->isInIdentifierNamespace(Decl::IDNS_Ordinary)) 4059 continue; 4060 4061 Decl *Found = FoundDecls[I]; 4062 if (VarTemplateDecl *FoundTemplate = dyn_cast<VarTemplateDecl>(Found)) { 4063 if (IsStructuralMatch(D, FoundTemplate)) { 4064 // The variable templates structurally match; call it the same template. 4065 Importer.Imported(D->getTemplatedDecl(), 4066 FoundTemplate->getTemplatedDecl()); 4067 return Importer.Imported(D, FoundTemplate); 4068 } 4069 } 4070 4071 ConflictingDecls.push_back(FoundDecls[I]); 4072 } 4073 4074 if (!ConflictingDecls.empty()) { 4075 Name = Importer.HandleNameConflict(Name, DC, Decl::IDNS_Ordinary, 4076 ConflictingDecls.data(), 4077 ConflictingDecls.size()); 4078 } 4079 4080 if (!Name) 4081 return nullptr; 4082 4083 VarDecl *DTemplated = D->getTemplatedDecl(); 4084 4085 // Import the type. 4086 QualType T = Importer.Import(DTemplated->getType()); 4087 if (T.isNull()) 4088 return nullptr; 4089 4090 // Create the declaration that is being templated. 4091 SourceLocation StartLoc = Importer.Import(DTemplated->getLocStart()); 4092 SourceLocation IdLoc = Importer.Import(DTemplated->getLocation()); 4093 TypeSourceInfo *TInfo = Importer.Import(DTemplated->getTypeSourceInfo()); 4094 VarDecl *D2Templated = VarDecl::Create(Importer.getToContext(), DC, StartLoc, 4095 IdLoc, Name.getAsIdentifierInfo(), T, 4096 TInfo, DTemplated->getStorageClass()); 4097 D2Templated->setAccess(DTemplated->getAccess()); 4098 D2Templated->setQualifierInfo(Importer.Import(DTemplated->getQualifierLoc())); 4099 D2Templated->setLexicalDeclContext(LexicalDC); 4100 4101 // Importer.Imported(DTemplated, D2Templated); 4102 // LexicalDC->addDeclInternal(D2Templated); 4103 4104 // Merge the initializer. 4105 if (ImportDefinition(DTemplated, D2Templated)) 4106 return nullptr; 4107 4108 // Create the variable template declaration itself. 4109 TemplateParameterList *TemplateParams = 4110 ImportTemplateParameterList(D->getTemplateParameters()); 4111 if (!TemplateParams) 4112 return nullptr; 4113 4114 VarTemplateDecl *D2 = VarTemplateDecl::Create( 4115 Importer.getToContext(), DC, Loc, Name, TemplateParams, D2Templated); 4116 D2Templated->setDescribedVarTemplate(D2); 4117 4118 D2->setAccess(D->getAccess()); 4119 D2->setLexicalDeclContext(LexicalDC); 4120 LexicalDC->addDeclInternal(D2); 4121 4122 // Note the relationship between the variable templates. 4123 Importer.Imported(D, D2); 4124 Importer.Imported(DTemplated, D2Templated); 4125 4126 if (DTemplated->isThisDeclarationADefinition() && 4127 !D2Templated->isThisDeclarationADefinition()) { 4128 // FIXME: Import definition! 4129 } 4130 4131 return D2; 4132 } 4133 4134 Decl *ASTNodeImporter::VisitVarTemplateSpecializationDecl( 4135 VarTemplateSpecializationDecl *D) { 4136 // If this record has a definition in the translation unit we're coming from, 4137 // but this particular declaration is not that definition, import the 4138 // definition and map to that. 4139 VarDecl *Definition = D->getDefinition(); 4140 if (Definition && Definition != D) { 4141 Decl *ImportedDef = Importer.Import(Definition); 4142 if (!ImportedDef) 4143 return nullptr; 4144 4145 return Importer.Imported(D, ImportedDef); 4146 } 4147 4148 VarTemplateDecl *VarTemplate = cast_or_null<VarTemplateDecl>( 4149 Importer.Import(D->getSpecializedTemplate())); 4150 if (!VarTemplate) 4151 return nullptr; 4152 4153 // Import the context of this declaration. 4154 DeclContext *DC = VarTemplate->getDeclContext(); 4155 if (!DC) 4156 return nullptr; 4157 4158 DeclContext *LexicalDC = DC; 4159 if (D->getDeclContext() != D->getLexicalDeclContext()) { 4160 LexicalDC = Importer.ImportContext(D->getLexicalDeclContext()); 4161 if (!LexicalDC) 4162 return nullptr; 4163 } 4164 4165 // Import the location of this declaration. 4166 SourceLocation StartLoc = Importer.Import(D->getLocStart()); 4167 SourceLocation IdLoc = Importer.Import(D->getLocation()); 4168 4169 // Import template arguments. 4170 SmallVector<TemplateArgument, 2> TemplateArgs; 4171 if (ImportTemplateArguments(D->getTemplateArgs().data(), 4172 D->getTemplateArgs().size(), TemplateArgs)) 4173 return nullptr; 4174 4175 // Try to find an existing specialization with these template arguments. 4176 void *InsertPos = nullptr; 4177 VarTemplateSpecializationDecl *D2 = VarTemplate->findSpecialization( 4178 TemplateArgs, InsertPos); 4179 if (D2) { 4180 // We already have a variable template specialization with these template 4181 // arguments. 4182 4183 // FIXME: Check for specialization vs. instantiation errors. 4184 4185 if (VarDecl *FoundDef = D2->getDefinition()) { 4186 if (!D->isThisDeclarationADefinition() || 4187 IsStructuralMatch(D, FoundDef)) { 4188 // The record types structurally match, or the "from" translation 4189 // unit only had a forward declaration anyway; call it the same 4190 // variable. 4191 return Importer.Imported(D, FoundDef); 4192 } 4193 } 4194 } else { 4195 4196 // Import the type. 4197 QualType T = Importer.Import(D->getType()); 4198 if (T.isNull()) 4199 return nullptr; 4200 TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo()); 4201 4202 // Create a new specialization. 4203 D2 = VarTemplateSpecializationDecl::Create( 4204 Importer.getToContext(), DC, StartLoc, IdLoc, VarTemplate, T, TInfo, 4205 D->getStorageClass(), TemplateArgs); 4206 D2->setSpecializationKind(D->getSpecializationKind()); 4207 D2->setTemplateArgsInfo(D->getTemplateArgsInfo()); 4208 4209 // Add this specialization to the class template. 4210 VarTemplate->AddSpecialization(D2, InsertPos); 4211 4212 // Import the qualifier, if any. 4213 D2->setQualifierInfo(Importer.Import(D->getQualifierLoc())); 4214 4215 // Add the specialization to this context. 4216 D2->setLexicalDeclContext(LexicalDC); 4217 LexicalDC->addDeclInternal(D2); 4218 } 4219 Importer.Imported(D, D2); 4220 4221 if (D->isThisDeclarationADefinition() && ImportDefinition(D, D2)) 4222 return nullptr; 4223 4224 return D2; 4225 } 4226 4227 Decl *ASTNodeImporter::VisitFunctionTemplateDecl(FunctionTemplateDecl *D) { 4228 DeclContext *DC, *LexicalDC; 4229 DeclarationName Name; 4230 SourceLocation Loc; 4231 NamedDecl *ToD; 4232 4233 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 4234 return nullptr; 4235 4236 if (ToD) 4237 return ToD; 4238 4239 // Try to find a function in our own ("to") context with the same name, same 4240 // type, and in the same context as the function we're importing. 4241 if (!LexicalDC->isFunctionOrMethod()) { 4242 unsigned IDNS = Decl::IDNS_Ordinary; 4243 SmallVector<NamedDecl *, 2> FoundDecls; 4244 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls); 4245 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 4246 if (!FoundDecls[I]->isInIdentifierNamespace(IDNS)) 4247 continue; 4248 4249 if (FunctionTemplateDecl *FoundFunction = 4250 dyn_cast<FunctionTemplateDecl>(FoundDecls[I])) { 4251 if (FoundFunction->hasExternalFormalLinkage() && 4252 D->hasExternalFormalLinkage()) { 4253 if (IsStructuralMatch(D, FoundFunction)) { 4254 Importer.Imported(D, FoundFunction); 4255 // FIXME: Actually try to merge the body and other attributes. 4256 return FoundFunction; 4257 } 4258 } 4259 } 4260 } 4261 } 4262 4263 TemplateParameterList *Params = 4264 ImportTemplateParameterList(D->getTemplateParameters()); 4265 if (!Params) 4266 return nullptr; 4267 4268 FunctionDecl *TemplatedFD = 4269 cast_or_null<FunctionDecl>(Importer.Import(D->getTemplatedDecl())); 4270 if (!TemplatedFD) 4271 return nullptr; 4272 4273 FunctionTemplateDecl *ToFunc = FunctionTemplateDecl::Create( 4274 Importer.getToContext(), DC, Loc, Name, Params, TemplatedFD); 4275 4276 TemplatedFD->setDescribedFunctionTemplate(ToFunc); 4277 ToFunc->setAccess(D->getAccess()); 4278 ToFunc->setLexicalDeclContext(LexicalDC); 4279 Importer.Imported(D, ToFunc); 4280 4281 LexicalDC->addDeclInternal(ToFunc); 4282 return ToFunc; 4283 } 4284 4285 //---------------------------------------------------------------------------- 4286 // Import Statements 4287 //---------------------------------------------------------------------------- 4288 4289 DeclGroupRef ASTNodeImporter::ImportDeclGroup(DeclGroupRef DG) { 4290 if (DG.isNull()) 4291 return DeclGroupRef::Create(Importer.getToContext(), nullptr, 0); 4292 size_t NumDecls = DG.end() - DG.begin(); 4293 SmallVector<Decl *, 1> ToDecls(NumDecls); 4294 auto &_Importer = this->Importer; 4295 std::transform(DG.begin(), DG.end(), ToDecls.begin(), 4296 [&_Importer](Decl *D) -> Decl * { 4297 return _Importer.Import(D); 4298 }); 4299 return DeclGroupRef::Create(Importer.getToContext(), 4300 ToDecls.begin(), 4301 NumDecls); 4302 } 4303 4304 Stmt *ASTNodeImporter::VisitStmt(Stmt *S) { 4305 Importer.FromDiag(S->getLocStart(), diag::err_unsupported_ast_node) 4306 << S->getStmtClassName(); 4307 return nullptr; 4308 } 4309 4310 4311 Stmt *ASTNodeImporter::VisitGCCAsmStmt(GCCAsmStmt *S) { 4312 SmallVector<IdentifierInfo *, 4> Names; 4313 for (unsigned I = 0, E = S->getNumOutputs(); I != E; I++) { 4314 IdentifierInfo *ToII = Importer.Import(S->getOutputIdentifier(I)); 4315 // ToII is nullptr when no symbolic name is given for output operand 4316 // see ParseStmtAsm::ParseAsmOperandsOpt 4317 if (!ToII && S->getOutputIdentifier(I)) 4318 return nullptr; 4319 Names.push_back(ToII); 4320 } 4321 for (unsigned I = 0, E = S->getNumInputs(); I != E; I++) { 4322 IdentifierInfo *ToII = Importer.Import(S->getInputIdentifier(I)); 4323 // ToII is nullptr when no symbolic name is given for input operand 4324 // see ParseStmtAsm::ParseAsmOperandsOpt 4325 if (!ToII && S->getInputIdentifier(I)) 4326 return nullptr; 4327 Names.push_back(ToII); 4328 } 4329 4330 SmallVector<StringLiteral *, 4> Clobbers; 4331 for (unsigned I = 0, E = S->getNumClobbers(); I != E; I++) { 4332 StringLiteral *Clobber = cast_or_null<StringLiteral>( 4333 Importer.Import(S->getClobberStringLiteral(I))); 4334 if (!Clobber) 4335 return nullptr; 4336 Clobbers.push_back(Clobber); 4337 } 4338 4339 SmallVector<StringLiteral *, 4> Constraints; 4340 for (unsigned I = 0, E = S->getNumOutputs(); I != E; I++) { 4341 StringLiteral *Output = cast_or_null<StringLiteral>( 4342 Importer.Import(S->getOutputConstraintLiteral(I))); 4343 if (!Output) 4344 return nullptr; 4345 Constraints.push_back(Output); 4346 } 4347 4348 for (unsigned I = 0, E = S->getNumInputs(); I != E; I++) { 4349 StringLiteral *Input = cast_or_null<StringLiteral>( 4350 Importer.Import(S->getInputConstraintLiteral(I))); 4351 if (!Input) 4352 return nullptr; 4353 Constraints.push_back(Input); 4354 } 4355 4356 SmallVector<Expr *, 4> Exprs(S->getNumOutputs() + S->getNumInputs()); 4357 if (ImportContainerChecked(S->outputs(), Exprs)) 4358 return nullptr; 4359 4360 if (ImportArrayChecked(S->inputs(), Exprs.begin() + S->getNumOutputs())) 4361 return nullptr; 4362 4363 StringLiteral *AsmStr = cast_or_null<StringLiteral>( 4364 Importer.Import(S->getAsmString())); 4365 if (!AsmStr) 4366 return nullptr; 4367 4368 return new (Importer.getToContext()) GCCAsmStmt( 4369 Importer.getToContext(), 4370 Importer.Import(S->getAsmLoc()), 4371 S->isSimple(), 4372 S->isVolatile(), 4373 S->getNumOutputs(), 4374 S->getNumInputs(), 4375 Names.data(), 4376 Constraints.data(), 4377 Exprs.data(), 4378 AsmStr, 4379 S->getNumClobbers(), 4380 Clobbers.data(), 4381 Importer.Import(S->getRParenLoc())); 4382 } 4383 4384 Stmt *ASTNodeImporter::VisitDeclStmt(DeclStmt *S) { 4385 DeclGroupRef ToDG = ImportDeclGroup(S->getDeclGroup()); 4386 for (Decl *ToD : ToDG) { 4387 if (!ToD) 4388 return nullptr; 4389 } 4390 SourceLocation ToStartLoc = Importer.Import(S->getStartLoc()); 4391 SourceLocation ToEndLoc = Importer.Import(S->getEndLoc()); 4392 return new (Importer.getToContext()) DeclStmt(ToDG, ToStartLoc, ToEndLoc); 4393 } 4394 4395 Stmt *ASTNodeImporter::VisitNullStmt(NullStmt *S) { 4396 SourceLocation ToSemiLoc = Importer.Import(S->getSemiLoc()); 4397 return new (Importer.getToContext()) NullStmt(ToSemiLoc, 4398 S->hasLeadingEmptyMacro()); 4399 } 4400 4401 Stmt *ASTNodeImporter::VisitCompoundStmt(CompoundStmt *S) { 4402 llvm::SmallVector<Stmt *, 8> ToStmts(S->size()); 4403 4404 if (ImportContainerChecked(S->body(), ToStmts)) 4405 return nullptr; 4406 4407 SourceLocation ToLBraceLoc = Importer.Import(S->getLBracLoc()); 4408 SourceLocation ToRBraceLoc = Importer.Import(S->getRBracLoc()); 4409 return CompoundStmt::Create(Importer.getToContext(), ToStmts, ToLBraceLoc, 4410 ToRBraceLoc); 4411 } 4412 4413 Stmt *ASTNodeImporter::VisitCaseStmt(CaseStmt *S) { 4414 Expr *ToLHS = Importer.Import(S->getLHS()); 4415 if (!ToLHS) 4416 return nullptr; 4417 Expr *ToRHS = Importer.Import(S->getRHS()); 4418 if (!ToRHS && S->getRHS()) 4419 return nullptr; 4420 Stmt *ToSubStmt = Importer.Import(S->getSubStmt()); 4421 if (!ToSubStmt && S->getSubStmt()) 4422 return nullptr; 4423 SourceLocation ToCaseLoc = Importer.Import(S->getCaseLoc()); 4424 SourceLocation ToEllipsisLoc = Importer.Import(S->getEllipsisLoc()); 4425 SourceLocation ToColonLoc = Importer.Import(S->getColonLoc()); 4426 CaseStmt *ToStmt = new (Importer.getToContext()) 4427 CaseStmt(ToLHS, ToRHS, ToCaseLoc, ToEllipsisLoc, ToColonLoc); 4428 ToStmt->setSubStmt(ToSubStmt); 4429 return ToStmt; 4430 } 4431 4432 Stmt *ASTNodeImporter::VisitDefaultStmt(DefaultStmt *S) { 4433 SourceLocation ToDefaultLoc = Importer.Import(S->getDefaultLoc()); 4434 SourceLocation ToColonLoc = Importer.Import(S->getColonLoc()); 4435 Stmt *ToSubStmt = Importer.Import(S->getSubStmt()); 4436 if (!ToSubStmt && S->getSubStmt()) 4437 return nullptr; 4438 return new (Importer.getToContext()) DefaultStmt(ToDefaultLoc, ToColonLoc, 4439 ToSubStmt); 4440 } 4441 4442 Stmt *ASTNodeImporter::VisitLabelStmt(LabelStmt *S) { 4443 SourceLocation ToIdentLoc = Importer.Import(S->getIdentLoc()); 4444 LabelDecl *ToLabelDecl = 4445 cast_or_null<LabelDecl>(Importer.Import(S->getDecl())); 4446 if (!ToLabelDecl && S->getDecl()) 4447 return nullptr; 4448 Stmt *ToSubStmt = Importer.Import(S->getSubStmt()); 4449 if (!ToSubStmt && S->getSubStmt()) 4450 return nullptr; 4451 return new (Importer.getToContext()) LabelStmt(ToIdentLoc, ToLabelDecl, 4452 ToSubStmt); 4453 } 4454 4455 Stmt *ASTNodeImporter::VisitAttributedStmt(AttributedStmt *S) { 4456 SourceLocation ToAttrLoc = Importer.Import(S->getAttrLoc()); 4457 ArrayRef<const Attr*> FromAttrs(S->getAttrs()); 4458 SmallVector<const Attr *, 1> ToAttrs(FromAttrs.size()); 4459 ASTContext &_ToContext = Importer.getToContext(); 4460 std::transform(FromAttrs.begin(), FromAttrs.end(), ToAttrs.begin(), 4461 [&_ToContext](const Attr *A) -> const Attr * { 4462 return A->clone(_ToContext); 4463 }); 4464 for (const Attr *ToA : ToAttrs) { 4465 if (!ToA) 4466 return nullptr; 4467 } 4468 Stmt *ToSubStmt = Importer.Import(S->getSubStmt()); 4469 if (!ToSubStmt && S->getSubStmt()) 4470 return nullptr; 4471 return AttributedStmt::Create(Importer.getToContext(), ToAttrLoc, 4472 ToAttrs, ToSubStmt); 4473 } 4474 4475 Stmt *ASTNodeImporter::VisitIfStmt(IfStmt *S) { 4476 SourceLocation ToIfLoc = Importer.Import(S->getIfLoc()); 4477 Stmt *ToInit = Importer.Import(S->getInit()); 4478 if (!ToInit && S->getInit()) 4479 return nullptr; 4480 VarDecl *ToConditionVariable = nullptr; 4481 if (VarDecl *FromConditionVariable = S->getConditionVariable()) { 4482 ToConditionVariable = 4483 dyn_cast_or_null<VarDecl>(Importer.Import(FromConditionVariable)); 4484 if (!ToConditionVariable) 4485 return nullptr; 4486 } 4487 Expr *ToCondition = Importer.Import(S->getCond()); 4488 if (!ToCondition && S->getCond()) 4489 return nullptr; 4490 Stmt *ToThenStmt = Importer.Import(S->getThen()); 4491 if (!ToThenStmt && S->getThen()) 4492 return nullptr; 4493 SourceLocation ToElseLoc = Importer.Import(S->getElseLoc()); 4494 Stmt *ToElseStmt = Importer.Import(S->getElse()); 4495 if (!ToElseStmt && S->getElse()) 4496 return nullptr; 4497 return new (Importer.getToContext()) IfStmt(Importer.getToContext(), 4498 ToIfLoc, S->isConstexpr(), 4499 ToInit, 4500 ToConditionVariable, 4501 ToCondition, ToThenStmt, 4502 ToElseLoc, ToElseStmt); 4503 } 4504 4505 Stmt *ASTNodeImporter::VisitSwitchStmt(SwitchStmt *S) { 4506 Stmt *ToInit = Importer.Import(S->getInit()); 4507 if (!ToInit && S->getInit()) 4508 return nullptr; 4509 VarDecl *ToConditionVariable = nullptr; 4510 if (VarDecl *FromConditionVariable = S->getConditionVariable()) { 4511 ToConditionVariable = 4512 dyn_cast_or_null<VarDecl>(Importer.Import(FromConditionVariable)); 4513 if (!ToConditionVariable) 4514 return nullptr; 4515 } 4516 Expr *ToCondition = Importer.Import(S->getCond()); 4517 if (!ToCondition && S->getCond()) 4518 return nullptr; 4519 SwitchStmt *ToStmt = new (Importer.getToContext()) SwitchStmt( 4520 Importer.getToContext(), ToInit, 4521 ToConditionVariable, ToCondition); 4522 Stmt *ToBody = Importer.Import(S->getBody()); 4523 if (!ToBody && S->getBody()) 4524 return nullptr; 4525 ToStmt->setBody(ToBody); 4526 ToStmt->setSwitchLoc(Importer.Import(S->getSwitchLoc())); 4527 // Now we have to re-chain the cases. 4528 SwitchCase *LastChainedSwitchCase = nullptr; 4529 for (SwitchCase *SC = S->getSwitchCaseList(); SC != nullptr; 4530 SC = SC->getNextSwitchCase()) { 4531 SwitchCase *ToSC = dyn_cast_or_null<SwitchCase>(Importer.Import(SC)); 4532 if (!ToSC) 4533 return nullptr; 4534 if (LastChainedSwitchCase) 4535 LastChainedSwitchCase->setNextSwitchCase(ToSC); 4536 else 4537 ToStmt->setSwitchCaseList(ToSC); 4538 LastChainedSwitchCase = ToSC; 4539 } 4540 return ToStmt; 4541 } 4542 4543 Stmt *ASTNodeImporter::VisitWhileStmt(WhileStmt *S) { 4544 VarDecl *ToConditionVariable = nullptr; 4545 if (VarDecl *FromConditionVariable = S->getConditionVariable()) { 4546 ToConditionVariable = 4547 dyn_cast_or_null<VarDecl>(Importer.Import(FromConditionVariable)); 4548 if (!ToConditionVariable) 4549 return nullptr; 4550 } 4551 Expr *ToCondition = Importer.Import(S->getCond()); 4552 if (!ToCondition && S->getCond()) 4553 return nullptr; 4554 Stmt *ToBody = Importer.Import(S->getBody()); 4555 if (!ToBody && S->getBody()) 4556 return nullptr; 4557 SourceLocation ToWhileLoc = Importer.Import(S->getWhileLoc()); 4558 return new (Importer.getToContext()) WhileStmt(Importer.getToContext(), 4559 ToConditionVariable, 4560 ToCondition, ToBody, 4561 ToWhileLoc); 4562 } 4563 4564 Stmt *ASTNodeImporter::VisitDoStmt(DoStmt *S) { 4565 Stmt *ToBody = Importer.Import(S->getBody()); 4566 if (!ToBody && S->getBody()) 4567 return nullptr; 4568 Expr *ToCondition = Importer.Import(S->getCond()); 4569 if (!ToCondition && S->getCond()) 4570 return nullptr; 4571 SourceLocation ToDoLoc = Importer.Import(S->getDoLoc()); 4572 SourceLocation ToWhileLoc = Importer.Import(S->getWhileLoc()); 4573 SourceLocation ToRParenLoc = Importer.Import(S->getRParenLoc()); 4574 return new (Importer.getToContext()) DoStmt(ToBody, ToCondition, 4575 ToDoLoc, ToWhileLoc, 4576 ToRParenLoc); 4577 } 4578 4579 Stmt *ASTNodeImporter::VisitForStmt(ForStmt *S) { 4580 Stmt *ToInit = Importer.Import(S->getInit()); 4581 if (!ToInit && S->getInit()) 4582 return nullptr; 4583 Expr *ToCondition = Importer.Import(S->getCond()); 4584 if (!ToCondition && S->getCond()) 4585 return nullptr; 4586 VarDecl *ToConditionVariable = nullptr; 4587 if (VarDecl *FromConditionVariable = S->getConditionVariable()) { 4588 ToConditionVariable = 4589 dyn_cast_or_null<VarDecl>(Importer.Import(FromConditionVariable)); 4590 if (!ToConditionVariable) 4591 return nullptr; 4592 } 4593 Expr *ToInc = Importer.Import(S->getInc()); 4594 if (!ToInc && S->getInc()) 4595 return nullptr; 4596 Stmt *ToBody = Importer.Import(S->getBody()); 4597 if (!ToBody && S->getBody()) 4598 return nullptr; 4599 SourceLocation ToForLoc = Importer.Import(S->getForLoc()); 4600 SourceLocation ToLParenLoc = Importer.Import(S->getLParenLoc()); 4601 SourceLocation ToRParenLoc = Importer.Import(S->getRParenLoc()); 4602 return new (Importer.getToContext()) ForStmt(Importer.getToContext(), 4603 ToInit, ToCondition, 4604 ToConditionVariable, 4605 ToInc, ToBody, 4606 ToForLoc, ToLParenLoc, 4607 ToRParenLoc); 4608 } 4609 4610 Stmt *ASTNodeImporter::VisitGotoStmt(GotoStmt *S) { 4611 LabelDecl *ToLabel = nullptr; 4612 if (LabelDecl *FromLabel = S->getLabel()) { 4613 ToLabel = dyn_cast_or_null<LabelDecl>(Importer.Import(FromLabel)); 4614 if (!ToLabel) 4615 return nullptr; 4616 } 4617 SourceLocation ToGotoLoc = Importer.Import(S->getGotoLoc()); 4618 SourceLocation ToLabelLoc = Importer.Import(S->getLabelLoc()); 4619 return new (Importer.getToContext()) GotoStmt(ToLabel, 4620 ToGotoLoc, ToLabelLoc); 4621 } 4622 4623 Stmt *ASTNodeImporter::VisitIndirectGotoStmt(IndirectGotoStmt *S) { 4624 SourceLocation ToGotoLoc = Importer.Import(S->getGotoLoc()); 4625 SourceLocation ToStarLoc = Importer.Import(S->getStarLoc()); 4626 Expr *ToTarget = Importer.Import(S->getTarget()); 4627 if (!ToTarget && S->getTarget()) 4628 return nullptr; 4629 return new (Importer.getToContext()) IndirectGotoStmt(ToGotoLoc, ToStarLoc, 4630 ToTarget); 4631 } 4632 4633 Stmt *ASTNodeImporter::VisitContinueStmt(ContinueStmt *S) { 4634 SourceLocation ToContinueLoc = Importer.Import(S->getContinueLoc()); 4635 return new (Importer.getToContext()) ContinueStmt(ToContinueLoc); 4636 } 4637 4638 Stmt *ASTNodeImporter::VisitBreakStmt(BreakStmt *S) { 4639 SourceLocation ToBreakLoc = Importer.Import(S->getBreakLoc()); 4640 return new (Importer.getToContext()) BreakStmt(ToBreakLoc); 4641 } 4642 4643 Stmt *ASTNodeImporter::VisitReturnStmt(ReturnStmt *S) { 4644 SourceLocation ToRetLoc = Importer.Import(S->getReturnLoc()); 4645 Expr *ToRetExpr = Importer.Import(S->getRetValue()); 4646 if (!ToRetExpr && S->getRetValue()) 4647 return nullptr; 4648 VarDecl *NRVOCandidate = const_cast<VarDecl*>(S->getNRVOCandidate()); 4649 VarDecl *ToNRVOCandidate = cast_or_null<VarDecl>(Importer.Import(NRVOCandidate)); 4650 if (!ToNRVOCandidate && NRVOCandidate) 4651 return nullptr; 4652 return new (Importer.getToContext()) ReturnStmt(ToRetLoc, ToRetExpr, 4653 ToNRVOCandidate); 4654 } 4655 4656 Stmt *ASTNodeImporter::VisitCXXCatchStmt(CXXCatchStmt *S) { 4657 SourceLocation ToCatchLoc = Importer.Import(S->getCatchLoc()); 4658 VarDecl *ToExceptionDecl = nullptr; 4659 if (VarDecl *FromExceptionDecl = S->getExceptionDecl()) { 4660 ToExceptionDecl = 4661 dyn_cast_or_null<VarDecl>(Importer.Import(FromExceptionDecl)); 4662 if (!ToExceptionDecl) 4663 return nullptr; 4664 } 4665 Stmt *ToHandlerBlock = Importer.Import(S->getHandlerBlock()); 4666 if (!ToHandlerBlock && S->getHandlerBlock()) 4667 return nullptr; 4668 return new (Importer.getToContext()) CXXCatchStmt(ToCatchLoc, 4669 ToExceptionDecl, 4670 ToHandlerBlock); 4671 } 4672 4673 Stmt *ASTNodeImporter::VisitCXXTryStmt(CXXTryStmt *S) { 4674 SourceLocation ToTryLoc = Importer.Import(S->getTryLoc()); 4675 Stmt *ToTryBlock = Importer.Import(S->getTryBlock()); 4676 if (!ToTryBlock && S->getTryBlock()) 4677 return nullptr; 4678 SmallVector<Stmt *, 1> ToHandlers(S->getNumHandlers()); 4679 for (unsigned HI = 0, HE = S->getNumHandlers(); HI != HE; ++HI) { 4680 CXXCatchStmt *FromHandler = S->getHandler(HI); 4681 if (Stmt *ToHandler = Importer.Import(FromHandler)) 4682 ToHandlers[HI] = ToHandler; 4683 else 4684 return nullptr; 4685 } 4686 return CXXTryStmt::Create(Importer.getToContext(), ToTryLoc, ToTryBlock, 4687 ToHandlers); 4688 } 4689 4690 Stmt *ASTNodeImporter::VisitCXXForRangeStmt(CXXForRangeStmt *S) { 4691 DeclStmt *ToRange = 4692 dyn_cast_or_null<DeclStmt>(Importer.Import(S->getRangeStmt())); 4693 if (!ToRange && S->getRangeStmt()) 4694 return nullptr; 4695 DeclStmt *ToBegin = 4696 dyn_cast_or_null<DeclStmt>(Importer.Import(S->getBeginStmt())); 4697 if (!ToBegin && S->getBeginStmt()) 4698 return nullptr; 4699 DeclStmt *ToEnd = 4700 dyn_cast_or_null<DeclStmt>(Importer.Import(S->getEndStmt())); 4701 if (!ToEnd && S->getEndStmt()) 4702 return nullptr; 4703 Expr *ToCond = Importer.Import(S->getCond()); 4704 if (!ToCond && S->getCond()) 4705 return nullptr; 4706 Expr *ToInc = Importer.Import(S->getInc()); 4707 if (!ToInc && S->getInc()) 4708 return nullptr; 4709 DeclStmt *ToLoopVar = 4710 dyn_cast_or_null<DeclStmt>(Importer.Import(S->getLoopVarStmt())); 4711 if (!ToLoopVar && S->getLoopVarStmt()) 4712 return nullptr; 4713 Stmt *ToBody = Importer.Import(S->getBody()); 4714 if (!ToBody && S->getBody()) 4715 return nullptr; 4716 SourceLocation ToForLoc = Importer.Import(S->getForLoc()); 4717 SourceLocation ToCoawaitLoc = Importer.Import(S->getCoawaitLoc()); 4718 SourceLocation ToColonLoc = Importer.Import(S->getColonLoc()); 4719 SourceLocation ToRParenLoc = Importer.Import(S->getRParenLoc()); 4720 return new (Importer.getToContext()) CXXForRangeStmt(ToRange, ToBegin, ToEnd, 4721 ToCond, ToInc, 4722 ToLoopVar, ToBody, 4723 ToForLoc, ToCoawaitLoc, 4724 ToColonLoc, ToRParenLoc); 4725 } 4726 4727 Stmt *ASTNodeImporter::VisitObjCForCollectionStmt(ObjCForCollectionStmt *S) { 4728 Stmt *ToElem = Importer.Import(S->getElement()); 4729 if (!ToElem && S->getElement()) 4730 return nullptr; 4731 Expr *ToCollect = Importer.Import(S->getCollection()); 4732 if (!ToCollect && S->getCollection()) 4733 return nullptr; 4734 Stmt *ToBody = Importer.Import(S->getBody()); 4735 if (!ToBody && S->getBody()) 4736 return nullptr; 4737 SourceLocation ToForLoc = Importer.Import(S->getForLoc()); 4738 SourceLocation ToRParenLoc = Importer.Import(S->getRParenLoc()); 4739 return new (Importer.getToContext()) ObjCForCollectionStmt(ToElem, 4740 ToCollect, 4741 ToBody, ToForLoc, 4742 ToRParenLoc); 4743 } 4744 4745 Stmt *ASTNodeImporter::VisitObjCAtCatchStmt(ObjCAtCatchStmt *S) { 4746 SourceLocation ToAtCatchLoc = Importer.Import(S->getAtCatchLoc()); 4747 SourceLocation ToRParenLoc = Importer.Import(S->getRParenLoc()); 4748 VarDecl *ToExceptionDecl = nullptr; 4749 if (VarDecl *FromExceptionDecl = S->getCatchParamDecl()) { 4750 ToExceptionDecl = 4751 dyn_cast_or_null<VarDecl>(Importer.Import(FromExceptionDecl)); 4752 if (!ToExceptionDecl) 4753 return nullptr; 4754 } 4755 Stmt *ToBody = Importer.Import(S->getCatchBody()); 4756 if (!ToBody && S->getCatchBody()) 4757 return nullptr; 4758 return new (Importer.getToContext()) ObjCAtCatchStmt(ToAtCatchLoc, 4759 ToRParenLoc, 4760 ToExceptionDecl, 4761 ToBody); 4762 } 4763 4764 Stmt *ASTNodeImporter::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S) { 4765 SourceLocation ToAtFinallyLoc = Importer.Import(S->getAtFinallyLoc()); 4766 Stmt *ToAtFinallyStmt = Importer.Import(S->getFinallyBody()); 4767 if (!ToAtFinallyStmt && S->getFinallyBody()) 4768 return nullptr; 4769 return new (Importer.getToContext()) ObjCAtFinallyStmt(ToAtFinallyLoc, 4770 ToAtFinallyStmt); 4771 } 4772 4773 Stmt *ASTNodeImporter::VisitObjCAtTryStmt(ObjCAtTryStmt *S) { 4774 SourceLocation ToAtTryLoc = Importer.Import(S->getAtTryLoc()); 4775 Stmt *ToAtTryStmt = Importer.Import(S->getTryBody()); 4776 if (!ToAtTryStmt && S->getTryBody()) 4777 return nullptr; 4778 SmallVector<Stmt *, 1> ToCatchStmts(S->getNumCatchStmts()); 4779 for (unsigned CI = 0, CE = S->getNumCatchStmts(); CI != CE; ++CI) { 4780 ObjCAtCatchStmt *FromCatchStmt = S->getCatchStmt(CI); 4781 if (Stmt *ToCatchStmt = Importer.Import(FromCatchStmt)) 4782 ToCatchStmts[CI] = ToCatchStmt; 4783 else 4784 return nullptr; 4785 } 4786 Stmt *ToAtFinallyStmt = Importer.Import(S->getFinallyStmt()); 4787 if (!ToAtFinallyStmt && S->getFinallyStmt()) 4788 return nullptr; 4789 return ObjCAtTryStmt::Create(Importer.getToContext(), 4790 ToAtTryLoc, ToAtTryStmt, 4791 ToCatchStmts.begin(), ToCatchStmts.size(), 4792 ToAtFinallyStmt); 4793 } 4794 4795 Stmt *ASTNodeImporter::VisitObjCAtSynchronizedStmt 4796 (ObjCAtSynchronizedStmt *S) { 4797 SourceLocation ToAtSynchronizedLoc = 4798 Importer.Import(S->getAtSynchronizedLoc()); 4799 Expr *ToSynchExpr = Importer.Import(S->getSynchExpr()); 4800 if (!ToSynchExpr && S->getSynchExpr()) 4801 return nullptr; 4802 Stmt *ToSynchBody = Importer.Import(S->getSynchBody()); 4803 if (!ToSynchBody && S->getSynchBody()) 4804 return nullptr; 4805 return new (Importer.getToContext()) ObjCAtSynchronizedStmt( 4806 ToAtSynchronizedLoc, ToSynchExpr, ToSynchBody); 4807 } 4808 4809 Stmt *ASTNodeImporter::VisitObjCAtThrowStmt(ObjCAtThrowStmt *S) { 4810 SourceLocation ToAtThrowLoc = Importer.Import(S->getThrowLoc()); 4811 Expr *ToThrow = Importer.Import(S->getThrowExpr()); 4812 if (!ToThrow && S->getThrowExpr()) 4813 return nullptr; 4814 return new (Importer.getToContext()) ObjCAtThrowStmt(ToAtThrowLoc, ToThrow); 4815 } 4816 4817 Stmt *ASTNodeImporter::VisitObjCAutoreleasePoolStmt 4818 (ObjCAutoreleasePoolStmt *S) { 4819 SourceLocation ToAtLoc = Importer.Import(S->getAtLoc()); 4820 Stmt *ToSubStmt = Importer.Import(S->getSubStmt()); 4821 if (!ToSubStmt && S->getSubStmt()) 4822 return nullptr; 4823 return new (Importer.getToContext()) ObjCAutoreleasePoolStmt(ToAtLoc, 4824 ToSubStmt); 4825 } 4826 4827 //---------------------------------------------------------------------------- 4828 // Import Expressions 4829 //---------------------------------------------------------------------------- 4830 Expr *ASTNodeImporter::VisitExpr(Expr *E) { 4831 Importer.FromDiag(E->getLocStart(), diag::err_unsupported_ast_node) 4832 << E->getStmtClassName(); 4833 return nullptr; 4834 } 4835 4836 Expr *ASTNodeImporter::VisitVAArgExpr(VAArgExpr *E) { 4837 QualType T = Importer.Import(E->getType()); 4838 if (T.isNull()) 4839 return nullptr; 4840 4841 Expr *SubExpr = Importer.Import(E->getSubExpr()); 4842 if (!SubExpr && E->getSubExpr()) 4843 return nullptr; 4844 4845 TypeSourceInfo *TInfo = Importer.Import(E->getWrittenTypeInfo()); 4846 if (!TInfo) 4847 return nullptr; 4848 4849 return new (Importer.getToContext()) VAArgExpr( 4850 Importer.Import(E->getBuiltinLoc()), SubExpr, TInfo, 4851 Importer.Import(E->getRParenLoc()), T, E->isMicrosoftABI()); 4852 } 4853 4854 4855 Expr *ASTNodeImporter::VisitGNUNullExpr(GNUNullExpr *E) { 4856 QualType T = Importer.Import(E->getType()); 4857 if (T.isNull()) 4858 return nullptr; 4859 4860 return new (Importer.getToContext()) GNUNullExpr( 4861 T, Importer.Import(E->getLocStart())); 4862 } 4863 4864 Expr *ASTNodeImporter::VisitPredefinedExpr(PredefinedExpr *E) { 4865 QualType T = Importer.Import(E->getType()); 4866 if (T.isNull()) 4867 return nullptr; 4868 4869 StringLiteral *SL = cast_or_null<StringLiteral>( 4870 Importer.Import(E->getFunctionName())); 4871 if (!SL && E->getFunctionName()) 4872 return nullptr; 4873 4874 return new (Importer.getToContext()) PredefinedExpr( 4875 Importer.Import(E->getLocStart()), T, E->getIdentType(), SL); 4876 } 4877 4878 Expr *ASTNodeImporter::VisitDeclRefExpr(DeclRefExpr *E) { 4879 ValueDecl *ToD = cast_or_null<ValueDecl>(Importer.Import(E->getDecl())); 4880 if (!ToD) 4881 return nullptr; 4882 4883 NamedDecl *FoundD = nullptr; 4884 if (E->getDecl() != E->getFoundDecl()) { 4885 FoundD = cast_or_null<NamedDecl>(Importer.Import(E->getFoundDecl())); 4886 if (!FoundD) 4887 return nullptr; 4888 } 4889 4890 QualType T = Importer.Import(E->getType()); 4891 if (T.isNull()) 4892 return nullptr; 4893 4894 4895 TemplateArgumentListInfo ToTAInfo; 4896 TemplateArgumentListInfo *ResInfo = nullptr; 4897 if (E->hasExplicitTemplateArgs()) { 4898 for (const auto &FromLoc : E->template_arguments()) { 4899 if (auto ToTALoc = ImportTemplateArgumentLoc(FromLoc)) 4900 ToTAInfo.addArgument(*ToTALoc); 4901 else 4902 return nullptr; 4903 } 4904 ResInfo = &ToTAInfo; 4905 } 4906 4907 DeclRefExpr *DRE = DeclRefExpr::Create(Importer.getToContext(), 4908 Importer.Import(E->getQualifierLoc()), 4909 Importer.Import(E->getTemplateKeywordLoc()), 4910 ToD, 4911 E->refersToEnclosingVariableOrCapture(), 4912 Importer.Import(E->getLocation()), 4913 T, E->getValueKind(), 4914 FoundD, ResInfo); 4915 if (E->hadMultipleCandidates()) 4916 DRE->setHadMultipleCandidates(true); 4917 return DRE; 4918 } 4919 4920 Expr *ASTNodeImporter::VisitImplicitValueInitExpr(ImplicitValueInitExpr *E) { 4921 QualType T = Importer.Import(E->getType()); 4922 if (T.isNull()) 4923 return nullptr; 4924 4925 return new (Importer.getToContext()) ImplicitValueInitExpr(T); 4926 } 4927 4928 ASTNodeImporter::Designator 4929 ASTNodeImporter::ImportDesignator(const Designator &D) { 4930 if (D.isFieldDesignator()) { 4931 IdentifierInfo *ToFieldName = Importer.Import(D.getFieldName()); 4932 // Caller checks for import error 4933 return Designator(ToFieldName, Importer.Import(D.getDotLoc()), 4934 Importer.Import(D.getFieldLoc())); 4935 } 4936 if (D.isArrayDesignator()) 4937 return Designator(D.getFirstExprIndex(), 4938 Importer.Import(D.getLBracketLoc()), 4939 Importer.Import(D.getRBracketLoc())); 4940 4941 assert(D.isArrayRangeDesignator()); 4942 return Designator(D.getFirstExprIndex(), 4943 Importer.Import(D.getLBracketLoc()), 4944 Importer.Import(D.getEllipsisLoc()), 4945 Importer.Import(D.getRBracketLoc())); 4946 } 4947 4948 4949 Expr *ASTNodeImporter::VisitDesignatedInitExpr(DesignatedInitExpr *DIE) { 4950 Expr *Init = cast_or_null<Expr>(Importer.Import(DIE->getInit())); 4951 if (!Init) 4952 return nullptr; 4953 4954 SmallVector<Expr *, 4> IndexExprs(DIE->getNumSubExprs() - 1); 4955 // List elements from the second, the first is Init itself 4956 for (unsigned I = 1, E = DIE->getNumSubExprs(); I < E; I++) { 4957 if (Expr *Arg = cast_or_null<Expr>(Importer.Import(DIE->getSubExpr(I)))) 4958 IndexExprs[I - 1] = Arg; 4959 else 4960 return nullptr; 4961 } 4962 4963 SmallVector<Designator, 4> Designators(DIE->size()); 4964 llvm::transform(DIE->designators(), Designators.begin(), 4965 [this](const Designator &D) -> Designator { 4966 return ImportDesignator(D); 4967 }); 4968 4969 for (const Designator &D : DIE->designators()) 4970 if (D.isFieldDesignator() && !D.getFieldName()) 4971 return nullptr; 4972 4973 return DesignatedInitExpr::Create( 4974 Importer.getToContext(), Designators, 4975 IndexExprs, Importer.Import(DIE->getEqualOrColonLoc()), 4976 DIE->usesGNUSyntax(), Init); 4977 } 4978 4979 Expr *ASTNodeImporter::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E) { 4980 QualType T = Importer.Import(E->getType()); 4981 if (T.isNull()) 4982 return nullptr; 4983 4984 return new (Importer.getToContext()) 4985 CXXNullPtrLiteralExpr(T, Importer.Import(E->getLocation())); 4986 } 4987 4988 Expr *ASTNodeImporter::VisitIntegerLiteral(IntegerLiteral *E) { 4989 QualType T = Importer.Import(E->getType()); 4990 if (T.isNull()) 4991 return nullptr; 4992 4993 return IntegerLiteral::Create(Importer.getToContext(), 4994 E->getValue(), T, 4995 Importer.Import(E->getLocation())); 4996 } 4997 4998 Expr *ASTNodeImporter::VisitFloatingLiteral(FloatingLiteral *E) { 4999 QualType T = Importer.Import(E->getType()); 5000 if (T.isNull()) 5001 return nullptr; 5002 5003 return FloatingLiteral::Create(Importer.getToContext(), 5004 E->getValue(), E->isExact(), T, 5005 Importer.Import(E->getLocation())); 5006 } 5007 5008 Expr *ASTNodeImporter::VisitCharacterLiteral(CharacterLiteral *E) { 5009 QualType T = Importer.Import(E->getType()); 5010 if (T.isNull()) 5011 return nullptr; 5012 5013 return new (Importer.getToContext()) CharacterLiteral(E->getValue(), 5014 E->getKind(), T, 5015 Importer.Import(E->getLocation())); 5016 } 5017 5018 Expr *ASTNodeImporter::VisitStringLiteral(StringLiteral *E) { 5019 QualType T = Importer.Import(E->getType()); 5020 if (T.isNull()) 5021 return nullptr; 5022 5023 SmallVector<SourceLocation, 4> Locations(E->getNumConcatenated()); 5024 ImportArray(E->tokloc_begin(), E->tokloc_end(), Locations.begin()); 5025 5026 return StringLiteral::Create(Importer.getToContext(), E->getBytes(), 5027 E->getKind(), E->isPascal(), T, 5028 Locations.data(), Locations.size()); 5029 } 5030 5031 Expr *ASTNodeImporter::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) { 5032 QualType T = Importer.Import(E->getType()); 5033 if (T.isNull()) 5034 return nullptr; 5035 5036 TypeSourceInfo *TInfo = Importer.Import(E->getTypeSourceInfo()); 5037 if (!TInfo) 5038 return nullptr; 5039 5040 Expr *Init = Importer.Import(E->getInitializer()); 5041 if (!Init) 5042 return nullptr; 5043 5044 return new (Importer.getToContext()) CompoundLiteralExpr( 5045 Importer.Import(E->getLParenLoc()), TInfo, T, E->getValueKind(), 5046 Init, E->isFileScope()); 5047 } 5048 5049 Expr *ASTNodeImporter::VisitAtomicExpr(AtomicExpr *E) { 5050 QualType T = Importer.Import(E->getType()); 5051 if (T.isNull()) 5052 return nullptr; 5053 5054 SmallVector<Expr *, 6> Exprs(E->getNumSubExprs()); 5055 if (ImportArrayChecked( 5056 E->getSubExprs(), E->getSubExprs() + E->getNumSubExprs(), 5057 Exprs.begin())) 5058 return nullptr; 5059 5060 return new (Importer.getToContext()) AtomicExpr( 5061 Importer.Import(E->getBuiltinLoc()), Exprs, T, E->getOp(), 5062 Importer.Import(E->getRParenLoc())); 5063 } 5064 5065 Expr *ASTNodeImporter::VisitAddrLabelExpr(AddrLabelExpr *E) { 5066 QualType T = Importer.Import(E->getType()); 5067 if (T.isNull()) 5068 return nullptr; 5069 5070 LabelDecl *ToLabel = cast_or_null<LabelDecl>(Importer.Import(E->getLabel())); 5071 if (!ToLabel) 5072 return nullptr; 5073 5074 return new (Importer.getToContext()) AddrLabelExpr( 5075 Importer.Import(E->getAmpAmpLoc()), Importer.Import(E->getLabelLoc()), 5076 ToLabel, T); 5077 } 5078 5079 Expr *ASTNodeImporter::VisitParenExpr(ParenExpr *E) { 5080 Expr *SubExpr = Importer.Import(E->getSubExpr()); 5081 if (!SubExpr) 5082 return nullptr; 5083 5084 return new (Importer.getToContext()) 5085 ParenExpr(Importer.Import(E->getLParen()), 5086 Importer.Import(E->getRParen()), 5087 SubExpr); 5088 } 5089 5090 Expr *ASTNodeImporter::VisitParenListExpr(ParenListExpr *E) { 5091 SmallVector<Expr *, 4> Exprs(E->getNumExprs()); 5092 if (ImportContainerChecked(E->exprs(), Exprs)) 5093 return nullptr; 5094 5095 return new (Importer.getToContext()) ParenListExpr( 5096 Importer.getToContext(), Importer.Import(E->getLParenLoc()), 5097 Exprs, Importer.Import(E->getLParenLoc())); 5098 } 5099 5100 Expr *ASTNodeImporter::VisitStmtExpr(StmtExpr *E) { 5101 QualType T = Importer.Import(E->getType()); 5102 if (T.isNull()) 5103 return nullptr; 5104 5105 CompoundStmt *ToSubStmt = cast_or_null<CompoundStmt>( 5106 Importer.Import(E->getSubStmt())); 5107 if (!ToSubStmt && E->getSubStmt()) 5108 return nullptr; 5109 5110 return new (Importer.getToContext()) StmtExpr(ToSubStmt, T, 5111 Importer.Import(E->getLParenLoc()), Importer.Import(E->getRParenLoc())); 5112 } 5113 5114 Expr *ASTNodeImporter::VisitUnaryOperator(UnaryOperator *E) { 5115 QualType T = Importer.Import(E->getType()); 5116 if (T.isNull()) 5117 return nullptr; 5118 5119 Expr *SubExpr = Importer.Import(E->getSubExpr()); 5120 if (!SubExpr) 5121 return nullptr; 5122 5123 return new (Importer.getToContext()) UnaryOperator(SubExpr, E->getOpcode(), 5124 T, E->getValueKind(), 5125 E->getObjectKind(), 5126 Importer.Import(E->getOperatorLoc())); 5127 } 5128 5129 Expr *ASTNodeImporter::VisitUnaryExprOrTypeTraitExpr( 5130 UnaryExprOrTypeTraitExpr *E) { 5131 QualType ResultType = Importer.Import(E->getType()); 5132 5133 if (E->isArgumentType()) { 5134 TypeSourceInfo *TInfo = Importer.Import(E->getArgumentTypeInfo()); 5135 if (!TInfo) 5136 return nullptr; 5137 5138 return new (Importer.getToContext()) UnaryExprOrTypeTraitExpr(E->getKind(), 5139 TInfo, ResultType, 5140 Importer.Import(E->getOperatorLoc()), 5141 Importer.Import(E->getRParenLoc())); 5142 } 5143 5144 Expr *SubExpr = Importer.Import(E->getArgumentExpr()); 5145 if (!SubExpr) 5146 return nullptr; 5147 5148 return new (Importer.getToContext()) UnaryExprOrTypeTraitExpr(E->getKind(), 5149 SubExpr, ResultType, 5150 Importer.Import(E->getOperatorLoc()), 5151 Importer.Import(E->getRParenLoc())); 5152 } 5153 5154 Expr *ASTNodeImporter::VisitBinaryOperator(BinaryOperator *E) { 5155 QualType T = Importer.Import(E->getType()); 5156 if (T.isNull()) 5157 return nullptr; 5158 5159 Expr *LHS = Importer.Import(E->getLHS()); 5160 if (!LHS) 5161 return nullptr; 5162 5163 Expr *RHS = Importer.Import(E->getRHS()); 5164 if (!RHS) 5165 return nullptr; 5166 5167 return new (Importer.getToContext()) BinaryOperator(LHS, RHS, E->getOpcode(), 5168 T, E->getValueKind(), 5169 E->getObjectKind(), 5170 Importer.Import(E->getOperatorLoc()), 5171 E->getFPFeatures()); 5172 } 5173 5174 Expr *ASTNodeImporter::VisitConditionalOperator(ConditionalOperator *E) { 5175 QualType T = Importer.Import(E->getType()); 5176 if (T.isNull()) 5177 return nullptr; 5178 5179 Expr *ToLHS = Importer.Import(E->getLHS()); 5180 if (!ToLHS) 5181 return nullptr; 5182 5183 Expr *ToRHS = Importer.Import(E->getRHS()); 5184 if (!ToRHS) 5185 return nullptr; 5186 5187 Expr *ToCond = Importer.Import(E->getCond()); 5188 if (!ToCond) 5189 return nullptr; 5190 5191 return new (Importer.getToContext()) ConditionalOperator( 5192 ToCond, Importer.Import(E->getQuestionLoc()), 5193 ToLHS, Importer.Import(E->getColonLoc()), 5194 ToRHS, T, E->getValueKind(), E->getObjectKind()); 5195 } 5196 5197 Expr *ASTNodeImporter::VisitBinaryConditionalOperator( 5198 BinaryConditionalOperator *E) { 5199 QualType T = Importer.Import(E->getType()); 5200 if (T.isNull()) 5201 return nullptr; 5202 5203 Expr *Common = Importer.Import(E->getCommon()); 5204 if (!Common) 5205 return nullptr; 5206 5207 Expr *Cond = Importer.Import(E->getCond()); 5208 if (!Cond) 5209 return nullptr; 5210 5211 OpaqueValueExpr *OpaqueValue = cast_or_null<OpaqueValueExpr>( 5212 Importer.Import(E->getOpaqueValue())); 5213 if (!OpaqueValue) 5214 return nullptr; 5215 5216 Expr *TrueExpr = Importer.Import(E->getTrueExpr()); 5217 if (!TrueExpr) 5218 return nullptr; 5219 5220 Expr *FalseExpr = Importer.Import(E->getFalseExpr()); 5221 if (!FalseExpr) 5222 return nullptr; 5223 5224 return new (Importer.getToContext()) BinaryConditionalOperator( 5225 Common, OpaqueValue, Cond, TrueExpr, FalseExpr, 5226 Importer.Import(E->getQuestionLoc()), Importer.Import(E->getColonLoc()), 5227 T, E->getValueKind(), E->getObjectKind()); 5228 } 5229 5230 Expr *ASTNodeImporter::VisitArrayTypeTraitExpr(ArrayTypeTraitExpr *E) { 5231 QualType T = Importer.Import(E->getType()); 5232 if (T.isNull()) 5233 return nullptr; 5234 5235 TypeSourceInfo *ToQueried = Importer.Import(E->getQueriedTypeSourceInfo()); 5236 if (!ToQueried) 5237 return nullptr; 5238 5239 Expr *Dim = Importer.Import(E->getDimensionExpression()); 5240 if (!Dim && E->getDimensionExpression()) 5241 return nullptr; 5242 5243 return new (Importer.getToContext()) ArrayTypeTraitExpr( 5244 Importer.Import(E->getLocStart()), E->getTrait(), ToQueried, 5245 E->getValue(), Dim, Importer.Import(E->getLocEnd()), T); 5246 } 5247 5248 Expr *ASTNodeImporter::VisitExpressionTraitExpr(ExpressionTraitExpr *E) { 5249 QualType T = Importer.Import(E->getType()); 5250 if (T.isNull()) 5251 return nullptr; 5252 5253 Expr *ToQueried = Importer.Import(E->getQueriedExpression()); 5254 if (!ToQueried) 5255 return nullptr; 5256 5257 return new (Importer.getToContext()) ExpressionTraitExpr( 5258 Importer.Import(E->getLocStart()), E->getTrait(), ToQueried, 5259 E->getValue(), Importer.Import(E->getLocEnd()), T); 5260 } 5261 5262 Expr *ASTNodeImporter::VisitOpaqueValueExpr(OpaqueValueExpr *E) { 5263 QualType T = Importer.Import(E->getType()); 5264 if (T.isNull()) 5265 return nullptr; 5266 5267 Expr *SourceExpr = Importer.Import(E->getSourceExpr()); 5268 if (!SourceExpr && E->getSourceExpr()) 5269 return nullptr; 5270 5271 return new (Importer.getToContext()) OpaqueValueExpr( 5272 Importer.Import(E->getLocation()), T, E->getValueKind(), 5273 E->getObjectKind(), SourceExpr); 5274 } 5275 5276 Expr *ASTNodeImporter::VisitArraySubscriptExpr(ArraySubscriptExpr *E) { 5277 QualType T = Importer.Import(E->getType()); 5278 if (T.isNull()) 5279 return nullptr; 5280 5281 Expr *ToLHS = Importer.Import(E->getLHS()); 5282 if (!ToLHS) 5283 return nullptr; 5284 5285 Expr *ToRHS = Importer.Import(E->getRHS()); 5286 if (!ToRHS) 5287 return nullptr; 5288 5289 return new (Importer.getToContext()) ArraySubscriptExpr( 5290 ToLHS, ToRHS, T, E->getValueKind(), E->getObjectKind(), 5291 Importer.Import(E->getRBracketLoc())); 5292 } 5293 5294 Expr *ASTNodeImporter::VisitCompoundAssignOperator(CompoundAssignOperator *E) { 5295 QualType T = Importer.Import(E->getType()); 5296 if (T.isNull()) 5297 return nullptr; 5298 5299 QualType CompLHSType = Importer.Import(E->getComputationLHSType()); 5300 if (CompLHSType.isNull()) 5301 return nullptr; 5302 5303 QualType CompResultType = Importer.Import(E->getComputationResultType()); 5304 if (CompResultType.isNull()) 5305 return nullptr; 5306 5307 Expr *LHS = Importer.Import(E->getLHS()); 5308 if (!LHS) 5309 return nullptr; 5310 5311 Expr *RHS = Importer.Import(E->getRHS()); 5312 if (!RHS) 5313 return nullptr; 5314 5315 return new (Importer.getToContext()) 5316 CompoundAssignOperator(LHS, RHS, E->getOpcode(), 5317 T, E->getValueKind(), 5318 E->getObjectKind(), 5319 CompLHSType, CompResultType, 5320 Importer.Import(E->getOperatorLoc()), 5321 E->getFPFeatures()); 5322 } 5323 5324 bool ASTNodeImporter::ImportCastPath(CastExpr *CE, CXXCastPath &Path) { 5325 for (auto I = CE->path_begin(), E = CE->path_end(); I != E; ++I) { 5326 if (CXXBaseSpecifier *Spec = Importer.Import(*I)) 5327 Path.push_back(Spec); 5328 else 5329 return true; 5330 } 5331 return false; 5332 } 5333 5334 Expr *ASTNodeImporter::VisitImplicitCastExpr(ImplicitCastExpr *E) { 5335 QualType T = Importer.Import(E->getType()); 5336 if (T.isNull()) 5337 return nullptr; 5338 5339 Expr *SubExpr = Importer.Import(E->getSubExpr()); 5340 if (!SubExpr) 5341 return nullptr; 5342 5343 CXXCastPath BasePath; 5344 if (ImportCastPath(E, BasePath)) 5345 return nullptr; 5346 5347 return ImplicitCastExpr::Create(Importer.getToContext(), T, E->getCastKind(), 5348 SubExpr, &BasePath, E->getValueKind()); 5349 } 5350 5351 Expr *ASTNodeImporter::VisitExplicitCastExpr(ExplicitCastExpr *E) { 5352 QualType T = Importer.Import(E->getType()); 5353 if (T.isNull()) 5354 return nullptr; 5355 5356 Expr *SubExpr = Importer.Import(E->getSubExpr()); 5357 if (!SubExpr) 5358 return nullptr; 5359 5360 TypeSourceInfo *TInfo = Importer.Import(E->getTypeInfoAsWritten()); 5361 if (!TInfo && E->getTypeInfoAsWritten()) 5362 return nullptr; 5363 5364 CXXCastPath BasePath; 5365 if (ImportCastPath(E, BasePath)) 5366 return nullptr; 5367 5368 switch (E->getStmtClass()) { 5369 case Stmt::CStyleCastExprClass: { 5370 CStyleCastExpr *CCE = cast<CStyleCastExpr>(E); 5371 return CStyleCastExpr::Create(Importer.getToContext(), T, 5372 E->getValueKind(), E->getCastKind(), 5373 SubExpr, &BasePath, TInfo, 5374 Importer.Import(CCE->getLParenLoc()), 5375 Importer.Import(CCE->getRParenLoc())); 5376 } 5377 5378 case Stmt::CXXFunctionalCastExprClass: { 5379 CXXFunctionalCastExpr *FCE = cast<CXXFunctionalCastExpr>(E); 5380 return CXXFunctionalCastExpr::Create(Importer.getToContext(), T, 5381 E->getValueKind(), TInfo, 5382 E->getCastKind(), SubExpr, &BasePath, 5383 Importer.Import(FCE->getLParenLoc()), 5384 Importer.Import(FCE->getRParenLoc())); 5385 } 5386 5387 case Stmt::ObjCBridgedCastExprClass: { 5388 ObjCBridgedCastExpr *OCE = cast<ObjCBridgedCastExpr>(E); 5389 return new (Importer.getToContext()) ObjCBridgedCastExpr( 5390 Importer.Import(OCE->getLParenLoc()), OCE->getBridgeKind(), 5391 E->getCastKind(), Importer.Import(OCE->getBridgeKeywordLoc()), 5392 TInfo, SubExpr); 5393 } 5394 default: 5395 break; // just fall through 5396 } 5397 5398 CXXNamedCastExpr *Named = cast<CXXNamedCastExpr>(E); 5399 SourceLocation ExprLoc = Importer.Import(Named->getOperatorLoc()), 5400 RParenLoc = Importer.Import(Named->getRParenLoc()); 5401 SourceRange Brackets = Importer.Import(Named->getAngleBrackets()); 5402 5403 switch (E->getStmtClass()) { 5404 case Stmt::CXXStaticCastExprClass: 5405 return CXXStaticCastExpr::Create(Importer.getToContext(), T, 5406 E->getValueKind(), E->getCastKind(), 5407 SubExpr, &BasePath, TInfo, 5408 ExprLoc, RParenLoc, Brackets); 5409 5410 case Stmt::CXXDynamicCastExprClass: 5411 return CXXDynamicCastExpr::Create(Importer.getToContext(), T, 5412 E->getValueKind(), E->getCastKind(), 5413 SubExpr, &BasePath, TInfo, 5414 ExprLoc, RParenLoc, Brackets); 5415 5416 case Stmt::CXXReinterpretCastExprClass: 5417 return CXXReinterpretCastExpr::Create(Importer.getToContext(), T, 5418 E->getValueKind(), E->getCastKind(), 5419 SubExpr, &BasePath, TInfo, 5420 ExprLoc, RParenLoc, Brackets); 5421 5422 case Stmt::CXXConstCastExprClass: 5423 return CXXConstCastExpr::Create(Importer.getToContext(), T, 5424 E->getValueKind(), SubExpr, TInfo, ExprLoc, 5425 RParenLoc, Brackets); 5426 default: 5427 llvm_unreachable("Cast expression of unsupported type!"); 5428 return nullptr; 5429 } 5430 } 5431 5432 Expr *ASTNodeImporter::VisitOffsetOfExpr(OffsetOfExpr *OE) { 5433 QualType T = Importer.Import(OE->getType()); 5434 if (T.isNull()) 5435 return nullptr; 5436 5437 SmallVector<OffsetOfNode, 4> Nodes; 5438 for (int I = 0, E = OE->getNumComponents(); I < E; ++I) { 5439 const OffsetOfNode &Node = OE->getComponent(I); 5440 5441 switch (Node.getKind()) { 5442 case OffsetOfNode::Array: 5443 Nodes.push_back(OffsetOfNode(Importer.Import(Node.getLocStart()), 5444 Node.getArrayExprIndex(), 5445 Importer.Import(Node.getLocEnd()))); 5446 break; 5447 5448 case OffsetOfNode::Base: { 5449 CXXBaseSpecifier *BS = Importer.Import(Node.getBase()); 5450 if (!BS && Node.getBase()) 5451 return nullptr; 5452 Nodes.push_back(OffsetOfNode(BS)); 5453 break; 5454 } 5455 case OffsetOfNode::Field: { 5456 FieldDecl *FD = cast_or_null<FieldDecl>(Importer.Import(Node.getField())); 5457 if (!FD) 5458 return nullptr; 5459 Nodes.push_back(OffsetOfNode(Importer.Import(Node.getLocStart()), FD, 5460 Importer.Import(Node.getLocEnd()))); 5461 break; 5462 } 5463 case OffsetOfNode::Identifier: { 5464 IdentifierInfo *ToII = Importer.Import(Node.getFieldName()); 5465 if (!ToII) 5466 return nullptr; 5467 Nodes.push_back(OffsetOfNode(Importer.Import(Node.getLocStart()), ToII, 5468 Importer.Import(Node.getLocEnd()))); 5469 break; 5470 } 5471 } 5472 } 5473 5474 SmallVector<Expr *, 4> Exprs(OE->getNumExpressions()); 5475 for (int I = 0, E = OE->getNumExpressions(); I < E; ++I) { 5476 Expr *ToIndexExpr = Importer.Import(OE->getIndexExpr(I)); 5477 if (!ToIndexExpr) 5478 return nullptr; 5479 Exprs[I] = ToIndexExpr; 5480 } 5481 5482 TypeSourceInfo *TInfo = Importer.Import(OE->getTypeSourceInfo()); 5483 if (!TInfo && OE->getTypeSourceInfo()) 5484 return nullptr; 5485 5486 return OffsetOfExpr::Create(Importer.getToContext(), T, 5487 Importer.Import(OE->getOperatorLoc()), 5488 TInfo, Nodes, Exprs, 5489 Importer.Import(OE->getRParenLoc())); 5490 } 5491 5492 Expr *ASTNodeImporter::VisitCXXNoexceptExpr(CXXNoexceptExpr *E) { 5493 QualType T = Importer.Import(E->getType()); 5494 if (T.isNull()) 5495 return nullptr; 5496 5497 Expr *Operand = Importer.Import(E->getOperand()); 5498 if (!Operand) 5499 return nullptr; 5500 5501 CanThrowResult CanThrow; 5502 if (E->isValueDependent()) 5503 CanThrow = CT_Dependent; 5504 else 5505 CanThrow = E->getValue() ? CT_Can : CT_Cannot; 5506 5507 return new (Importer.getToContext()) CXXNoexceptExpr( 5508 T, Operand, CanThrow, 5509 Importer.Import(E->getLocStart()), Importer.Import(E->getLocEnd())); 5510 } 5511 5512 Expr *ASTNodeImporter::VisitCXXThrowExpr(CXXThrowExpr *E) { 5513 QualType T = Importer.Import(E->getType()); 5514 if (T.isNull()) 5515 return nullptr; 5516 5517 Expr *SubExpr = Importer.Import(E->getSubExpr()); 5518 if (!SubExpr && E->getSubExpr()) 5519 return nullptr; 5520 5521 return new (Importer.getToContext()) CXXThrowExpr( 5522 SubExpr, T, Importer.Import(E->getThrowLoc()), 5523 E->isThrownVariableInScope()); 5524 } 5525 5526 Expr *ASTNodeImporter::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E) { 5527 ParmVarDecl *Param = cast_or_null<ParmVarDecl>( 5528 Importer.Import(E->getParam())); 5529 if (!Param) 5530 return nullptr; 5531 5532 return CXXDefaultArgExpr::Create( 5533 Importer.getToContext(), Importer.Import(E->getUsedLocation()), Param); 5534 } 5535 5536 Expr *ASTNodeImporter::VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E) { 5537 QualType T = Importer.Import(E->getType()); 5538 if (T.isNull()) 5539 return nullptr; 5540 5541 TypeSourceInfo *TypeInfo = Importer.Import(E->getTypeSourceInfo()); 5542 if (!TypeInfo) 5543 return nullptr; 5544 5545 return new (Importer.getToContext()) CXXScalarValueInitExpr( 5546 T, TypeInfo, Importer.Import(E->getRParenLoc())); 5547 } 5548 5549 Expr *ASTNodeImporter::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { 5550 Expr *SubExpr = Importer.Import(E->getSubExpr()); 5551 if (!SubExpr) 5552 return nullptr; 5553 5554 auto *Dtor = cast_or_null<CXXDestructorDecl>( 5555 Importer.Import(const_cast<CXXDestructorDecl *>( 5556 E->getTemporary()->getDestructor()))); 5557 if (!Dtor) 5558 return nullptr; 5559 5560 ASTContext &ToCtx = Importer.getToContext(); 5561 CXXTemporary *Temp = CXXTemporary::Create(ToCtx, Dtor); 5562 return CXXBindTemporaryExpr::Create(ToCtx, Temp, SubExpr); 5563 } 5564 5565 Expr *ASTNodeImporter::VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *CE) { 5566 QualType T = Importer.Import(CE->getType()); 5567 if (T.isNull()) 5568 return nullptr; 5569 5570 SmallVector<Expr *, 8> Args(CE->getNumArgs()); 5571 if (ImportContainerChecked(CE->arguments(), Args)) 5572 return nullptr; 5573 5574 auto *Ctor = cast_or_null<CXXConstructorDecl>( 5575 Importer.Import(CE->getConstructor())); 5576 if (!Ctor) 5577 return nullptr; 5578 5579 return CXXTemporaryObjectExpr::Create( 5580 Importer.getToContext(), T, 5581 Importer.Import(CE->getLocStart()), 5582 Ctor, 5583 CE->isElidable(), 5584 Args, 5585 CE->hadMultipleCandidates(), 5586 CE->isListInitialization(), 5587 CE->isStdInitListInitialization(), 5588 CE->requiresZeroInitialization(), 5589 CE->getConstructionKind(), 5590 Importer.Import(CE->getParenOrBraceRange())); 5591 } 5592 5593 Expr * 5594 ASTNodeImporter::VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *E) { 5595 QualType T = Importer.Import(E->getType()); 5596 if (T.isNull()) 5597 return nullptr; 5598 5599 Expr *TempE = Importer.Import(E->GetTemporaryExpr()); 5600 if (!TempE) 5601 return nullptr; 5602 5603 ValueDecl *ExtendedBy = cast_or_null<ValueDecl>( 5604 Importer.Import(const_cast<ValueDecl *>(E->getExtendingDecl()))); 5605 if (!ExtendedBy && E->getExtendingDecl()) 5606 return nullptr; 5607 5608 auto *ToMTE = new (Importer.getToContext()) MaterializeTemporaryExpr( 5609 T, TempE, E->isBoundToLvalueReference()); 5610 5611 // FIXME: Should ManglingNumber get numbers associated with 'to' context? 5612 ToMTE->setExtendingDecl(ExtendedBy, E->getManglingNumber()); 5613 return ToMTE; 5614 } 5615 5616 Expr *ASTNodeImporter::VisitPackExpansionExpr(PackExpansionExpr *E) { 5617 QualType T = Importer.Import(E->getType()); 5618 if (T.isNull()) 5619 return nullptr; 5620 5621 Expr *Pattern = Importer.Import(E->getPattern()); 5622 if (!Pattern) 5623 return nullptr; 5624 5625 return new (Importer.getToContext()) PackExpansionExpr( 5626 T, Pattern, Importer.Import(E->getEllipsisLoc()), 5627 E->getNumExpansions()); 5628 } 5629 5630 Expr *ASTNodeImporter::VisitCXXNewExpr(CXXNewExpr *CE) { 5631 QualType T = Importer.Import(CE->getType()); 5632 if (T.isNull()) 5633 return nullptr; 5634 5635 SmallVector<Expr *, 4> PlacementArgs(CE->getNumPlacementArgs()); 5636 if (ImportContainerChecked(CE->placement_arguments(), PlacementArgs)) 5637 return nullptr; 5638 5639 FunctionDecl *OperatorNewDecl = cast_or_null<FunctionDecl>( 5640 Importer.Import(CE->getOperatorNew())); 5641 if (!OperatorNewDecl && CE->getOperatorNew()) 5642 return nullptr; 5643 5644 FunctionDecl *OperatorDeleteDecl = cast_or_null<FunctionDecl>( 5645 Importer.Import(CE->getOperatorDelete())); 5646 if (!OperatorDeleteDecl && CE->getOperatorDelete()) 5647 return nullptr; 5648 5649 Expr *ToInit = Importer.Import(CE->getInitializer()); 5650 if (!ToInit && CE->getInitializer()) 5651 return nullptr; 5652 5653 TypeSourceInfo *TInfo = Importer.Import(CE->getAllocatedTypeSourceInfo()); 5654 if (!TInfo) 5655 return nullptr; 5656 5657 Expr *ToArrSize = Importer.Import(CE->getArraySize()); 5658 if (!ToArrSize && CE->getArraySize()) 5659 return nullptr; 5660 5661 return new (Importer.getToContext()) CXXNewExpr( 5662 Importer.getToContext(), 5663 CE->isGlobalNew(), 5664 OperatorNewDecl, OperatorDeleteDecl, 5665 CE->passAlignment(), 5666 CE->doesUsualArrayDeleteWantSize(), 5667 PlacementArgs, 5668 Importer.Import(CE->getTypeIdParens()), 5669 ToArrSize, CE->getInitializationStyle(), ToInit, T, TInfo, 5670 Importer.Import(CE->getSourceRange()), 5671 Importer.Import(CE->getDirectInitRange())); 5672 } 5673 5674 Expr *ASTNodeImporter::VisitCXXDeleteExpr(CXXDeleteExpr *E) { 5675 QualType T = Importer.Import(E->getType()); 5676 if (T.isNull()) 5677 return nullptr; 5678 5679 FunctionDecl *OperatorDeleteDecl = cast_or_null<FunctionDecl>( 5680 Importer.Import(E->getOperatorDelete())); 5681 if (!OperatorDeleteDecl && E->getOperatorDelete()) 5682 return nullptr; 5683 5684 Expr *ToArg = Importer.Import(E->getArgument()); 5685 if (!ToArg && E->getArgument()) 5686 return nullptr; 5687 5688 return new (Importer.getToContext()) CXXDeleteExpr( 5689 T, E->isGlobalDelete(), 5690 E->isArrayForm(), 5691 E->isArrayFormAsWritten(), 5692 E->doesUsualArrayDeleteWantSize(), 5693 OperatorDeleteDecl, 5694 ToArg, 5695 Importer.Import(E->getLocStart())); 5696 } 5697 5698 Expr *ASTNodeImporter::VisitCXXConstructExpr(CXXConstructExpr *E) { 5699 QualType T = Importer.Import(E->getType()); 5700 if (T.isNull()) 5701 return nullptr; 5702 5703 CXXConstructorDecl *ToCCD = 5704 dyn_cast_or_null<CXXConstructorDecl>(Importer.Import(E->getConstructor())); 5705 if (!ToCCD) 5706 return nullptr; 5707 5708 SmallVector<Expr *, 6> ToArgs(E->getNumArgs()); 5709 if (ImportContainerChecked(E->arguments(), ToArgs)) 5710 return nullptr; 5711 5712 return CXXConstructExpr::Create(Importer.getToContext(), T, 5713 Importer.Import(E->getLocation()), 5714 ToCCD, E->isElidable(), 5715 ToArgs, E->hadMultipleCandidates(), 5716 E->isListInitialization(), 5717 E->isStdInitListInitialization(), 5718 E->requiresZeroInitialization(), 5719 E->getConstructionKind(), 5720 Importer.Import(E->getParenOrBraceRange())); 5721 } 5722 5723 Expr *ASTNodeImporter::VisitExprWithCleanups(ExprWithCleanups *EWC) { 5724 Expr *SubExpr = Importer.Import(EWC->getSubExpr()); 5725 if (!SubExpr && EWC->getSubExpr()) 5726 return nullptr; 5727 5728 SmallVector<ExprWithCleanups::CleanupObject, 8> Objs(EWC->getNumObjects()); 5729 for (unsigned I = 0, E = EWC->getNumObjects(); I < E; I++) 5730 if (ExprWithCleanups::CleanupObject Obj = 5731 cast_or_null<BlockDecl>(Importer.Import(EWC->getObject(I)))) 5732 Objs[I] = Obj; 5733 else 5734 return nullptr; 5735 5736 return ExprWithCleanups::Create(Importer.getToContext(), 5737 SubExpr, EWC->cleanupsHaveSideEffects(), 5738 Objs); 5739 } 5740 5741 Expr *ASTNodeImporter::VisitCXXMemberCallExpr(CXXMemberCallExpr *E) { 5742 QualType T = Importer.Import(E->getType()); 5743 if (T.isNull()) 5744 return nullptr; 5745 5746 Expr *ToFn = Importer.Import(E->getCallee()); 5747 if (!ToFn) 5748 return nullptr; 5749 5750 SmallVector<Expr *, 4> ToArgs(E->getNumArgs()); 5751 if (ImportContainerChecked(E->arguments(), ToArgs)) 5752 return nullptr; 5753 5754 return new (Importer.getToContext()) CXXMemberCallExpr( 5755 Importer.getToContext(), ToFn, ToArgs, T, E->getValueKind(), 5756 Importer.Import(E->getRParenLoc())); 5757 } 5758 5759 Expr *ASTNodeImporter::VisitCXXThisExpr(CXXThisExpr *E) { 5760 QualType T = Importer.Import(E->getType()); 5761 if (T.isNull()) 5762 return nullptr; 5763 5764 return new (Importer.getToContext()) 5765 CXXThisExpr(Importer.Import(E->getLocation()), T, E->isImplicit()); 5766 } 5767 5768 Expr *ASTNodeImporter::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { 5769 QualType T = Importer.Import(E->getType()); 5770 if (T.isNull()) 5771 return nullptr; 5772 5773 return new (Importer.getToContext()) 5774 CXXBoolLiteralExpr(E->getValue(), T, Importer.Import(E->getLocation())); 5775 } 5776 5777 5778 Expr *ASTNodeImporter::VisitMemberExpr(MemberExpr *E) { 5779 QualType T = Importer.Import(E->getType()); 5780 if (T.isNull()) 5781 return nullptr; 5782 5783 Expr *ToBase = Importer.Import(E->getBase()); 5784 if (!ToBase && E->getBase()) 5785 return nullptr; 5786 5787 ValueDecl *ToMember = dyn_cast<ValueDecl>(Importer.Import(E->getMemberDecl())); 5788 if (!ToMember && E->getMemberDecl()) 5789 return nullptr; 5790 5791 DeclAccessPair ToFoundDecl = DeclAccessPair::make( 5792 dyn_cast<NamedDecl>(Importer.Import(E->getFoundDecl().getDecl())), 5793 E->getFoundDecl().getAccess()); 5794 5795 DeclarationNameInfo ToMemberNameInfo( 5796 Importer.Import(E->getMemberNameInfo().getName()), 5797 Importer.Import(E->getMemberNameInfo().getLoc())); 5798 5799 if (E->hasExplicitTemplateArgs()) { 5800 return nullptr; // FIXME: handle template arguments 5801 } 5802 5803 return MemberExpr::Create(Importer.getToContext(), ToBase, 5804 E->isArrow(), 5805 Importer.Import(E->getOperatorLoc()), 5806 Importer.Import(E->getQualifierLoc()), 5807 Importer.Import(E->getTemplateKeywordLoc()), 5808 ToMember, ToFoundDecl, ToMemberNameInfo, 5809 nullptr, T, E->getValueKind(), 5810 E->getObjectKind()); 5811 } 5812 5813 Expr *ASTNodeImporter::VisitCXXPseudoDestructorExpr( 5814 CXXPseudoDestructorExpr *E) { 5815 5816 Expr *BaseE = Importer.Import(E->getBase()); 5817 if (!BaseE) 5818 return nullptr; 5819 5820 TypeSourceInfo *ScopeInfo = Importer.Import(E->getScopeTypeInfo()); 5821 if (!ScopeInfo && E->getScopeTypeInfo()) 5822 return nullptr; 5823 5824 PseudoDestructorTypeStorage Storage; 5825 if (IdentifierInfo *FromII = E->getDestroyedTypeIdentifier()) { 5826 IdentifierInfo *ToII = Importer.Import(FromII); 5827 if (!ToII) 5828 return nullptr; 5829 Storage = PseudoDestructorTypeStorage( 5830 ToII, Importer.Import(E->getDestroyedTypeLoc())); 5831 } else { 5832 TypeSourceInfo *TI = Importer.Import(E->getDestroyedTypeInfo()); 5833 if (!TI) 5834 return nullptr; 5835 Storage = PseudoDestructorTypeStorage(TI); 5836 } 5837 5838 return new (Importer.getToContext()) CXXPseudoDestructorExpr( 5839 Importer.getToContext(), BaseE, E->isArrow(), 5840 Importer.Import(E->getOperatorLoc()), 5841 Importer.Import(E->getQualifierLoc()), 5842 ScopeInfo, Importer.Import(E->getColonColonLoc()), 5843 Importer.Import(E->getTildeLoc()), Storage); 5844 } 5845 5846 Expr *ASTNodeImporter::VisitCXXDependentScopeMemberExpr( 5847 CXXDependentScopeMemberExpr *E) { 5848 Expr *Base = nullptr; 5849 if (!E->isImplicitAccess()) { 5850 Base = Importer.Import(E->getBase()); 5851 if (!Base) 5852 return nullptr; 5853 } 5854 5855 QualType BaseType = Importer.Import(E->getBaseType()); 5856 if (BaseType.isNull()) 5857 return nullptr; 5858 5859 TemplateArgumentListInfo ToTAInfo(Importer.Import(E->getLAngleLoc()), 5860 Importer.Import(E->getRAngleLoc())); 5861 TemplateArgumentListInfo *ResInfo = nullptr; 5862 if (E->hasExplicitTemplateArgs()) { 5863 if (ImportTemplateArgumentListInfo(E->template_arguments(), ToTAInfo)) 5864 return nullptr; 5865 ResInfo = &ToTAInfo; 5866 } 5867 5868 DeclarationName Name = Importer.Import(E->getMember()); 5869 if (!E->getMember().isEmpty() && Name.isEmpty()) 5870 return nullptr; 5871 5872 DeclarationNameInfo MemberNameInfo(Name, Importer.Import(E->getMemberLoc())); 5873 // Import additional name location/type info. 5874 ImportDeclarationNameLoc(E->getMemberNameInfo(), MemberNameInfo); 5875 auto ToFQ = Importer.Import(E->getFirstQualifierFoundInScope()); 5876 if (!ToFQ && E->getFirstQualifierFoundInScope()) 5877 return nullptr; 5878 5879 return CXXDependentScopeMemberExpr::Create( 5880 Importer.getToContext(), Base, BaseType, E->isArrow(), 5881 Importer.Import(E->getOperatorLoc()), 5882 Importer.Import(E->getQualifierLoc()), 5883 Importer.Import(E->getTemplateKeywordLoc()), 5884 cast_or_null<NamedDecl>(ToFQ), MemberNameInfo, ResInfo); 5885 } 5886 5887 Expr *ASTNodeImporter::VisitCallExpr(CallExpr *E) { 5888 QualType T = Importer.Import(E->getType()); 5889 if (T.isNull()) 5890 return nullptr; 5891 5892 Expr *ToCallee = Importer.Import(E->getCallee()); 5893 if (!ToCallee && E->getCallee()) 5894 return nullptr; 5895 5896 unsigned NumArgs = E->getNumArgs(); 5897 5898 llvm::SmallVector<Expr *, 2> ToArgs(NumArgs); 5899 5900 for (unsigned ai = 0, ae = NumArgs; ai != ae; ++ai) { 5901 Expr *FromArg = E->getArg(ai); 5902 Expr *ToArg = Importer.Import(FromArg); 5903 if (!ToArg) 5904 return nullptr; 5905 ToArgs[ai] = ToArg; 5906 } 5907 5908 Expr **ToArgs_Copied = new (Importer.getToContext()) 5909 Expr*[NumArgs]; 5910 5911 for (unsigned ai = 0, ae = NumArgs; ai != ae; ++ai) 5912 ToArgs_Copied[ai] = ToArgs[ai]; 5913 5914 return new (Importer.getToContext()) 5915 CallExpr(Importer.getToContext(), ToCallee, 5916 llvm::makeArrayRef(ToArgs_Copied, NumArgs), T, E->getValueKind(), 5917 Importer.Import(E->getRParenLoc())); 5918 } 5919 5920 Expr *ASTNodeImporter::VisitInitListExpr(InitListExpr *ILE) { 5921 QualType T = Importer.Import(ILE->getType()); 5922 if (T.isNull()) 5923 return nullptr; 5924 5925 llvm::SmallVector<Expr *, 4> Exprs(ILE->getNumInits()); 5926 if (ImportContainerChecked(ILE->inits(), Exprs)) 5927 return nullptr; 5928 5929 ASTContext &ToCtx = Importer.getToContext(); 5930 InitListExpr *To = new (ToCtx) InitListExpr( 5931 ToCtx, Importer.Import(ILE->getLBraceLoc()), 5932 Exprs, Importer.Import(ILE->getLBraceLoc())); 5933 To->setType(T); 5934 5935 if (ILE->hasArrayFiller()) { 5936 Expr *Filler = Importer.Import(ILE->getArrayFiller()); 5937 if (!Filler) 5938 return nullptr; 5939 To->setArrayFiller(Filler); 5940 } 5941 5942 if (FieldDecl *FromFD = ILE->getInitializedFieldInUnion()) { 5943 FieldDecl *ToFD = cast_or_null<FieldDecl>(Importer.Import(FromFD)); 5944 if (!ToFD) 5945 return nullptr; 5946 To->setInitializedFieldInUnion(ToFD); 5947 } 5948 5949 if (InitListExpr *SyntForm = ILE->getSyntacticForm()) { 5950 InitListExpr *ToSyntForm = cast_or_null<InitListExpr>( 5951 Importer.Import(SyntForm)); 5952 if (!ToSyntForm) 5953 return nullptr; 5954 To->setSyntacticForm(ToSyntForm); 5955 } 5956 5957 To->sawArrayRangeDesignator(ILE->hadArrayRangeDesignator()); 5958 To->setValueDependent(ILE->isValueDependent()); 5959 To->setInstantiationDependent(ILE->isInstantiationDependent()); 5960 5961 return To; 5962 } 5963 5964 Expr *ASTNodeImporter::VisitArrayInitLoopExpr(ArrayInitLoopExpr *E) { 5965 QualType ToType = Importer.Import(E->getType()); 5966 if (ToType.isNull()) 5967 return nullptr; 5968 5969 Expr *ToCommon = Importer.Import(E->getCommonExpr()); 5970 if (!ToCommon && E->getCommonExpr()) 5971 return nullptr; 5972 5973 Expr *ToSubExpr = Importer.Import(E->getSubExpr()); 5974 if (!ToSubExpr && E->getSubExpr()) 5975 return nullptr; 5976 5977 return new (Importer.getToContext()) 5978 ArrayInitLoopExpr(ToType, ToCommon, ToSubExpr); 5979 } 5980 5981 Expr *ASTNodeImporter::VisitArrayInitIndexExpr(ArrayInitIndexExpr *E) { 5982 QualType ToType = Importer.Import(E->getType()); 5983 if (ToType.isNull()) 5984 return nullptr; 5985 return new (Importer.getToContext()) ArrayInitIndexExpr(ToType); 5986 } 5987 5988 Expr *ASTNodeImporter::VisitCXXDefaultInitExpr(CXXDefaultInitExpr *DIE) { 5989 FieldDecl *ToField = llvm::dyn_cast_or_null<FieldDecl>( 5990 Importer.Import(DIE->getField())); 5991 if (!ToField && DIE->getField()) 5992 return nullptr; 5993 5994 return CXXDefaultInitExpr::Create( 5995 Importer.getToContext(), Importer.Import(DIE->getLocStart()), ToField); 5996 } 5997 5998 Expr *ASTNodeImporter::VisitCXXNamedCastExpr(CXXNamedCastExpr *E) { 5999 QualType ToType = Importer.Import(E->getType()); 6000 if (ToType.isNull() && !E->getType().isNull()) 6001 return nullptr; 6002 ExprValueKind VK = E->getValueKind(); 6003 CastKind CK = E->getCastKind(); 6004 Expr *ToOp = Importer.Import(E->getSubExpr()); 6005 if (!ToOp && E->getSubExpr()) 6006 return nullptr; 6007 CXXCastPath BasePath; 6008 if (ImportCastPath(E, BasePath)) 6009 return nullptr; 6010 TypeSourceInfo *ToWritten = Importer.Import(E->getTypeInfoAsWritten()); 6011 SourceLocation ToOperatorLoc = Importer.Import(E->getOperatorLoc()); 6012 SourceLocation ToRParenLoc = Importer.Import(E->getRParenLoc()); 6013 SourceRange ToAngleBrackets = Importer.Import(E->getAngleBrackets()); 6014 6015 if (isa<CXXStaticCastExpr>(E)) { 6016 return CXXStaticCastExpr::Create( 6017 Importer.getToContext(), ToType, VK, CK, ToOp, &BasePath, 6018 ToWritten, ToOperatorLoc, ToRParenLoc, ToAngleBrackets); 6019 } else if (isa<CXXDynamicCastExpr>(E)) { 6020 return CXXDynamicCastExpr::Create( 6021 Importer.getToContext(), ToType, VK, CK, ToOp, &BasePath, 6022 ToWritten, ToOperatorLoc, ToRParenLoc, ToAngleBrackets); 6023 } else if (isa<CXXReinterpretCastExpr>(E)) { 6024 return CXXReinterpretCastExpr::Create( 6025 Importer.getToContext(), ToType, VK, CK, ToOp, &BasePath, 6026 ToWritten, ToOperatorLoc, ToRParenLoc, ToAngleBrackets); 6027 } else { 6028 return nullptr; 6029 } 6030 } 6031 6032 6033 Expr *ASTNodeImporter::VisitSubstNonTypeTemplateParmExpr( 6034 SubstNonTypeTemplateParmExpr *E) { 6035 QualType T = Importer.Import(E->getType()); 6036 if (T.isNull()) 6037 return nullptr; 6038 6039 NonTypeTemplateParmDecl *Param = cast_or_null<NonTypeTemplateParmDecl>( 6040 Importer.Import(E->getParameter())); 6041 if (!Param) 6042 return nullptr; 6043 6044 Expr *Replacement = Importer.Import(E->getReplacement()); 6045 if (!Replacement) 6046 return nullptr; 6047 6048 return new (Importer.getToContext()) SubstNonTypeTemplateParmExpr( 6049 T, E->getValueKind(), Importer.Import(E->getExprLoc()), Param, 6050 Replacement); 6051 } 6052 6053 Expr *ASTNodeImporter::VisitTypeTraitExpr(TypeTraitExpr *E) { 6054 QualType ToType = Importer.Import(E->getType()); 6055 if (ToType.isNull()) 6056 return nullptr; 6057 6058 SmallVector<TypeSourceInfo *, 4> ToArgs(E->getNumArgs()); 6059 if (ImportContainerChecked(E->getArgs(), ToArgs)) 6060 return nullptr; 6061 6062 // According to Sema::BuildTypeTrait(), if E is value-dependent, 6063 // Value is always false. 6064 bool ToValue = false; 6065 if (!E->isValueDependent()) 6066 ToValue = E->getValue(); 6067 6068 return TypeTraitExpr::Create( 6069 Importer.getToContext(), ToType, Importer.Import(E->getLocStart()), 6070 E->getTrait(), ToArgs, Importer.Import(E->getLocEnd()), ToValue); 6071 } 6072 6073 void ASTNodeImporter::ImportOverrides(CXXMethodDecl *ToMethod, 6074 CXXMethodDecl *FromMethod) { 6075 for (auto *FromOverriddenMethod : FromMethod->overridden_methods()) 6076 ToMethod->addOverriddenMethod( 6077 cast<CXXMethodDecl>(Importer.Import(const_cast<CXXMethodDecl*>( 6078 FromOverriddenMethod)))); 6079 } 6080 6081 ASTImporter::ASTImporter(ASTContext &ToContext, FileManager &ToFileManager, 6082 ASTContext &FromContext, FileManager &FromFileManager, 6083 bool MinimalImport) 6084 : ToContext(ToContext), FromContext(FromContext), 6085 ToFileManager(ToFileManager), FromFileManager(FromFileManager), 6086 Minimal(MinimalImport), LastDiagFromFrom(false) 6087 { 6088 ImportedDecls[FromContext.getTranslationUnitDecl()] 6089 = ToContext.getTranslationUnitDecl(); 6090 } 6091 6092 ASTImporter::~ASTImporter() { } 6093 6094 QualType ASTImporter::Import(QualType FromT) { 6095 if (FromT.isNull()) 6096 return QualType(); 6097 6098 const Type *fromTy = FromT.getTypePtr(); 6099 6100 // Check whether we've already imported this type. 6101 llvm::DenseMap<const Type *, const Type *>::iterator Pos 6102 = ImportedTypes.find(fromTy); 6103 if (Pos != ImportedTypes.end()) 6104 return ToContext.getQualifiedType(Pos->second, FromT.getLocalQualifiers()); 6105 6106 // Import the type 6107 ASTNodeImporter Importer(*this); 6108 QualType ToT = Importer.Visit(fromTy); 6109 if (ToT.isNull()) 6110 return ToT; 6111 6112 // Record the imported type. 6113 ImportedTypes[fromTy] = ToT.getTypePtr(); 6114 6115 return ToContext.getQualifiedType(ToT, FromT.getLocalQualifiers()); 6116 } 6117 6118 TypeSourceInfo *ASTImporter::Import(TypeSourceInfo *FromTSI) { 6119 if (!FromTSI) 6120 return FromTSI; 6121 6122 // FIXME: For now we just create a "trivial" type source info based 6123 // on the type and a single location. Implement a real version of this. 6124 QualType T = Import(FromTSI->getType()); 6125 if (T.isNull()) 6126 return nullptr; 6127 6128 return ToContext.getTrivialTypeSourceInfo(T, 6129 Import(FromTSI->getTypeLoc().getLocStart())); 6130 } 6131 6132 Decl *ASTImporter::GetAlreadyImportedOrNull(Decl *FromD) { 6133 llvm::DenseMap<Decl *, Decl *>::iterator Pos = ImportedDecls.find(FromD); 6134 if (Pos != ImportedDecls.end()) { 6135 Decl *ToD = Pos->second; 6136 ASTNodeImporter(*this).ImportDefinitionIfNeeded(FromD, ToD); 6137 return ToD; 6138 } else { 6139 return nullptr; 6140 } 6141 } 6142 6143 Decl *ASTImporter::Import(Decl *FromD) { 6144 if (!FromD) 6145 return nullptr; 6146 6147 ASTNodeImporter Importer(*this); 6148 6149 // Check whether we've already imported this declaration. 6150 llvm::DenseMap<Decl *, Decl *>::iterator Pos = ImportedDecls.find(FromD); 6151 if (Pos != ImportedDecls.end()) { 6152 Decl *ToD = Pos->second; 6153 Importer.ImportDefinitionIfNeeded(FromD, ToD); 6154 return ToD; 6155 } 6156 6157 // Import the type 6158 Decl *ToD = Importer.Visit(FromD); 6159 if (!ToD) 6160 return nullptr; 6161 6162 // Record the imported declaration. 6163 ImportedDecls[FromD] = ToD; 6164 6165 if (TagDecl *FromTag = dyn_cast<TagDecl>(FromD)) { 6166 // Keep track of anonymous tags that have an associated typedef. 6167 if (FromTag->getTypedefNameForAnonDecl()) 6168 AnonTagsWithPendingTypedefs.push_back(FromTag); 6169 } else if (TypedefNameDecl *FromTypedef = dyn_cast<TypedefNameDecl>(FromD)) { 6170 // When we've finished transforming a typedef, see whether it was the 6171 // typedef for an anonymous tag. 6172 for (SmallVectorImpl<TagDecl *>::iterator 6173 FromTag = AnonTagsWithPendingTypedefs.begin(), 6174 FromTagEnd = AnonTagsWithPendingTypedefs.end(); 6175 FromTag != FromTagEnd; ++FromTag) { 6176 if ((*FromTag)->getTypedefNameForAnonDecl() == FromTypedef) { 6177 if (TagDecl *ToTag = cast_or_null<TagDecl>(Import(*FromTag))) { 6178 // We found the typedef for an anonymous tag; link them. 6179 ToTag->setTypedefNameForAnonDecl(cast<TypedefNameDecl>(ToD)); 6180 AnonTagsWithPendingTypedefs.erase(FromTag); 6181 break; 6182 } 6183 } 6184 } 6185 } 6186 6187 return ToD; 6188 } 6189 6190 DeclContext *ASTImporter::ImportContext(DeclContext *FromDC) { 6191 if (!FromDC) 6192 return FromDC; 6193 6194 DeclContext *ToDC = cast_or_null<DeclContext>(Import(cast<Decl>(FromDC))); 6195 if (!ToDC) 6196 return nullptr; 6197 6198 // When we're using a record/enum/Objective-C class/protocol as a context, we 6199 // need it to have a definition. 6200 if (RecordDecl *ToRecord = dyn_cast<RecordDecl>(ToDC)) { 6201 RecordDecl *FromRecord = cast<RecordDecl>(FromDC); 6202 if (ToRecord->isCompleteDefinition()) { 6203 // Do nothing. 6204 } else if (FromRecord->isCompleteDefinition()) { 6205 ASTNodeImporter(*this).ImportDefinition(FromRecord, ToRecord, 6206 ASTNodeImporter::IDK_Basic); 6207 } else { 6208 CompleteDecl(ToRecord); 6209 } 6210 } else if (EnumDecl *ToEnum = dyn_cast<EnumDecl>(ToDC)) { 6211 EnumDecl *FromEnum = cast<EnumDecl>(FromDC); 6212 if (ToEnum->isCompleteDefinition()) { 6213 // Do nothing. 6214 } else if (FromEnum->isCompleteDefinition()) { 6215 ASTNodeImporter(*this).ImportDefinition(FromEnum, ToEnum, 6216 ASTNodeImporter::IDK_Basic); 6217 } else { 6218 CompleteDecl(ToEnum); 6219 } 6220 } else if (ObjCInterfaceDecl *ToClass = dyn_cast<ObjCInterfaceDecl>(ToDC)) { 6221 ObjCInterfaceDecl *FromClass = cast<ObjCInterfaceDecl>(FromDC); 6222 if (ToClass->getDefinition()) { 6223 // Do nothing. 6224 } else if (ObjCInterfaceDecl *FromDef = FromClass->getDefinition()) { 6225 ASTNodeImporter(*this).ImportDefinition(FromDef, ToClass, 6226 ASTNodeImporter::IDK_Basic); 6227 } else { 6228 CompleteDecl(ToClass); 6229 } 6230 } else if (ObjCProtocolDecl *ToProto = dyn_cast<ObjCProtocolDecl>(ToDC)) { 6231 ObjCProtocolDecl *FromProto = cast<ObjCProtocolDecl>(FromDC); 6232 if (ToProto->getDefinition()) { 6233 // Do nothing. 6234 } else if (ObjCProtocolDecl *FromDef = FromProto->getDefinition()) { 6235 ASTNodeImporter(*this).ImportDefinition(FromDef, ToProto, 6236 ASTNodeImporter::IDK_Basic); 6237 } else { 6238 CompleteDecl(ToProto); 6239 } 6240 } 6241 6242 return ToDC; 6243 } 6244 6245 Expr *ASTImporter::Import(Expr *FromE) { 6246 if (!FromE) 6247 return nullptr; 6248 6249 return cast_or_null<Expr>(Import(cast<Stmt>(FromE))); 6250 } 6251 6252 Stmt *ASTImporter::Import(Stmt *FromS) { 6253 if (!FromS) 6254 return nullptr; 6255 6256 // Check whether we've already imported this declaration. 6257 llvm::DenseMap<Stmt *, Stmt *>::iterator Pos = ImportedStmts.find(FromS); 6258 if (Pos != ImportedStmts.end()) 6259 return Pos->second; 6260 6261 // Import the type 6262 ASTNodeImporter Importer(*this); 6263 Stmt *ToS = Importer.Visit(FromS); 6264 if (!ToS) 6265 return nullptr; 6266 6267 // Record the imported declaration. 6268 ImportedStmts[FromS] = ToS; 6269 return ToS; 6270 } 6271 6272 NestedNameSpecifier *ASTImporter::Import(NestedNameSpecifier *FromNNS) { 6273 if (!FromNNS) 6274 return nullptr; 6275 6276 NestedNameSpecifier *prefix = Import(FromNNS->getPrefix()); 6277 6278 switch (FromNNS->getKind()) { 6279 case NestedNameSpecifier::Identifier: 6280 if (IdentifierInfo *II = Import(FromNNS->getAsIdentifier())) { 6281 return NestedNameSpecifier::Create(ToContext, prefix, II); 6282 } 6283 return nullptr; 6284 6285 case NestedNameSpecifier::Namespace: 6286 if (NamespaceDecl *NS = 6287 cast_or_null<NamespaceDecl>(Import(FromNNS->getAsNamespace()))) { 6288 return NestedNameSpecifier::Create(ToContext, prefix, NS); 6289 } 6290 return nullptr; 6291 6292 case NestedNameSpecifier::NamespaceAlias: 6293 if (NamespaceAliasDecl *NSAD = 6294 cast_or_null<NamespaceAliasDecl>(Import(FromNNS->getAsNamespaceAlias()))) { 6295 return NestedNameSpecifier::Create(ToContext, prefix, NSAD); 6296 } 6297 return nullptr; 6298 6299 case NestedNameSpecifier::Global: 6300 return NestedNameSpecifier::GlobalSpecifier(ToContext); 6301 6302 case NestedNameSpecifier::Super: 6303 if (CXXRecordDecl *RD = 6304 cast_or_null<CXXRecordDecl>(Import(FromNNS->getAsRecordDecl()))) { 6305 return NestedNameSpecifier::SuperSpecifier(ToContext, RD); 6306 } 6307 return nullptr; 6308 6309 case NestedNameSpecifier::TypeSpec: 6310 case NestedNameSpecifier::TypeSpecWithTemplate: { 6311 QualType T = Import(QualType(FromNNS->getAsType(), 0u)); 6312 if (!T.isNull()) { 6313 bool bTemplate = FromNNS->getKind() == 6314 NestedNameSpecifier::TypeSpecWithTemplate; 6315 return NestedNameSpecifier::Create(ToContext, prefix, 6316 bTemplate, T.getTypePtr()); 6317 } 6318 } 6319 return nullptr; 6320 } 6321 6322 llvm_unreachable("Invalid nested name specifier kind"); 6323 } 6324 6325 NestedNameSpecifierLoc ASTImporter::Import(NestedNameSpecifierLoc FromNNS) { 6326 // Copied from NestedNameSpecifier mostly. 6327 SmallVector<NestedNameSpecifierLoc , 8> NestedNames; 6328 NestedNameSpecifierLoc NNS = FromNNS; 6329 6330 // Push each of the nested-name-specifiers's onto a stack for 6331 // serialization in reverse order. 6332 while (NNS) { 6333 NestedNames.push_back(NNS); 6334 NNS = NNS.getPrefix(); 6335 } 6336 6337 NestedNameSpecifierLocBuilder Builder; 6338 6339 while (!NestedNames.empty()) { 6340 NNS = NestedNames.pop_back_val(); 6341 NestedNameSpecifier *Spec = Import(NNS.getNestedNameSpecifier()); 6342 if (!Spec) 6343 return NestedNameSpecifierLoc(); 6344 6345 NestedNameSpecifier::SpecifierKind Kind = Spec->getKind(); 6346 switch (Kind) { 6347 case NestedNameSpecifier::Identifier: 6348 Builder.Extend(getToContext(), 6349 Spec->getAsIdentifier(), 6350 Import(NNS.getLocalBeginLoc()), 6351 Import(NNS.getLocalEndLoc())); 6352 break; 6353 6354 case NestedNameSpecifier::Namespace: 6355 Builder.Extend(getToContext(), 6356 Spec->getAsNamespace(), 6357 Import(NNS.getLocalBeginLoc()), 6358 Import(NNS.getLocalEndLoc())); 6359 break; 6360 6361 case NestedNameSpecifier::NamespaceAlias: 6362 Builder.Extend(getToContext(), 6363 Spec->getAsNamespaceAlias(), 6364 Import(NNS.getLocalBeginLoc()), 6365 Import(NNS.getLocalEndLoc())); 6366 break; 6367 6368 case NestedNameSpecifier::TypeSpec: 6369 case NestedNameSpecifier::TypeSpecWithTemplate: { 6370 TypeSourceInfo *TSI = getToContext().getTrivialTypeSourceInfo( 6371 QualType(Spec->getAsType(), 0)); 6372 Builder.Extend(getToContext(), 6373 Import(NNS.getLocalBeginLoc()), 6374 TSI->getTypeLoc(), 6375 Import(NNS.getLocalEndLoc())); 6376 break; 6377 } 6378 6379 case NestedNameSpecifier::Global: 6380 Builder.MakeGlobal(getToContext(), Import(NNS.getLocalBeginLoc())); 6381 break; 6382 6383 case NestedNameSpecifier::Super: { 6384 SourceRange ToRange = Import(NNS.getSourceRange()); 6385 Builder.MakeSuper(getToContext(), 6386 Spec->getAsRecordDecl(), 6387 ToRange.getBegin(), 6388 ToRange.getEnd()); 6389 } 6390 } 6391 } 6392 6393 return Builder.getWithLocInContext(getToContext()); 6394 } 6395 6396 TemplateName ASTImporter::Import(TemplateName From) { 6397 switch (From.getKind()) { 6398 case TemplateName::Template: 6399 if (TemplateDecl *ToTemplate 6400 = cast_or_null<TemplateDecl>(Import(From.getAsTemplateDecl()))) 6401 return TemplateName(ToTemplate); 6402 6403 return TemplateName(); 6404 6405 case TemplateName::OverloadedTemplate: { 6406 OverloadedTemplateStorage *FromStorage = From.getAsOverloadedTemplate(); 6407 UnresolvedSet<2> ToTemplates; 6408 for (OverloadedTemplateStorage::iterator I = FromStorage->begin(), 6409 E = FromStorage->end(); 6410 I != E; ++I) { 6411 if (NamedDecl *To = cast_or_null<NamedDecl>(Import(*I))) 6412 ToTemplates.addDecl(To); 6413 else 6414 return TemplateName(); 6415 } 6416 return ToContext.getOverloadedTemplateName(ToTemplates.begin(), 6417 ToTemplates.end()); 6418 } 6419 6420 case TemplateName::QualifiedTemplate: { 6421 QualifiedTemplateName *QTN = From.getAsQualifiedTemplateName(); 6422 NestedNameSpecifier *Qualifier = Import(QTN->getQualifier()); 6423 if (!Qualifier) 6424 return TemplateName(); 6425 6426 if (TemplateDecl *ToTemplate 6427 = cast_or_null<TemplateDecl>(Import(From.getAsTemplateDecl()))) 6428 return ToContext.getQualifiedTemplateName(Qualifier, 6429 QTN->hasTemplateKeyword(), 6430 ToTemplate); 6431 6432 return TemplateName(); 6433 } 6434 6435 case TemplateName::DependentTemplate: { 6436 DependentTemplateName *DTN = From.getAsDependentTemplateName(); 6437 NestedNameSpecifier *Qualifier = Import(DTN->getQualifier()); 6438 if (!Qualifier) 6439 return TemplateName(); 6440 6441 if (DTN->isIdentifier()) { 6442 return ToContext.getDependentTemplateName(Qualifier, 6443 Import(DTN->getIdentifier())); 6444 } 6445 6446 return ToContext.getDependentTemplateName(Qualifier, DTN->getOperator()); 6447 } 6448 6449 case TemplateName::SubstTemplateTemplateParm: { 6450 SubstTemplateTemplateParmStorage *subst 6451 = From.getAsSubstTemplateTemplateParm(); 6452 TemplateTemplateParmDecl *param 6453 = cast_or_null<TemplateTemplateParmDecl>(Import(subst->getParameter())); 6454 if (!param) 6455 return TemplateName(); 6456 6457 TemplateName replacement = Import(subst->getReplacement()); 6458 if (replacement.isNull()) return TemplateName(); 6459 6460 return ToContext.getSubstTemplateTemplateParm(param, replacement); 6461 } 6462 6463 case TemplateName::SubstTemplateTemplateParmPack: { 6464 SubstTemplateTemplateParmPackStorage *SubstPack 6465 = From.getAsSubstTemplateTemplateParmPack(); 6466 TemplateTemplateParmDecl *Param 6467 = cast_or_null<TemplateTemplateParmDecl>( 6468 Import(SubstPack->getParameterPack())); 6469 if (!Param) 6470 return TemplateName(); 6471 6472 ASTNodeImporter Importer(*this); 6473 TemplateArgument ArgPack 6474 = Importer.ImportTemplateArgument(SubstPack->getArgumentPack()); 6475 if (ArgPack.isNull()) 6476 return TemplateName(); 6477 6478 return ToContext.getSubstTemplateTemplateParmPack(Param, ArgPack); 6479 } 6480 } 6481 6482 llvm_unreachable("Invalid template name kind"); 6483 } 6484 6485 SourceLocation ASTImporter::Import(SourceLocation FromLoc) { 6486 if (FromLoc.isInvalid()) 6487 return SourceLocation(); 6488 6489 SourceManager &FromSM = FromContext.getSourceManager(); 6490 6491 // For now, map everything down to its file location, so that we 6492 // don't have to import macro expansions. 6493 // FIXME: Import macro expansions! 6494 FromLoc = FromSM.getFileLoc(FromLoc); 6495 std::pair<FileID, unsigned> Decomposed = FromSM.getDecomposedLoc(FromLoc); 6496 SourceManager &ToSM = ToContext.getSourceManager(); 6497 FileID ToFileID = Import(Decomposed.first); 6498 if (ToFileID.isInvalid()) 6499 return SourceLocation(); 6500 SourceLocation ret = ToSM.getLocForStartOfFile(ToFileID) 6501 .getLocWithOffset(Decomposed.second); 6502 return ret; 6503 } 6504 6505 SourceRange ASTImporter::Import(SourceRange FromRange) { 6506 return SourceRange(Import(FromRange.getBegin()), Import(FromRange.getEnd())); 6507 } 6508 6509 FileID ASTImporter::Import(FileID FromID) { 6510 llvm::DenseMap<FileID, FileID>::iterator Pos 6511 = ImportedFileIDs.find(FromID); 6512 if (Pos != ImportedFileIDs.end()) 6513 return Pos->second; 6514 6515 SourceManager &FromSM = FromContext.getSourceManager(); 6516 SourceManager &ToSM = ToContext.getSourceManager(); 6517 const SrcMgr::SLocEntry &FromSLoc = FromSM.getSLocEntry(FromID); 6518 assert(FromSLoc.isFile() && "Cannot handle macro expansions yet"); 6519 6520 // Include location of this file. 6521 SourceLocation ToIncludeLoc = Import(FromSLoc.getFile().getIncludeLoc()); 6522 6523 // Map the FileID for to the "to" source manager. 6524 FileID ToID; 6525 const SrcMgr::ContentCache *Cache = FromSLoc.getFile().getContentCache(); 6526 if (Cache->OrigEntry && Cache->OrigEntry->getDir()) { 6527 // FIXME: We probably want to use getVirtualFile(), so we don't hit the 6528 // disk again 6529 // FIXME: We definitely want to re-use the existing MemoryBuffer, rather 6530 // than mmap the files several times. 6531 const FileEntry *Entry = ToFileManager.getFile(Cache->OrigEntry->getName()); 6532 if (!Entry) 6533 return FileID(); 6534 ToID = ToSM.createFileID(Entry, ToIncludeLoc, 6535 FromSLoc.getFile().getFileCharacteristic()); 6536 } else { 6537 // FIXME: We want to re-use the existing MemoryBuffer! 6538 const llvm::MemoryBuffer * 6539 FromBuf = Cache->getBuffer(FromContext.getDiagnostics(), FromSM); 6540 std::unique_ptr<llvm::MemoryBuffer> ToBuf 6541 = llvm::MemoryBuffer::getMemBufferCopy(FromBuf->getBuffer(), 6542 FromBuf->getBufferIdentifier()); 6543 ToID = ToSM.createFileID(std::move(ToBuf), 6544 FromSLoc.getFile().getFileCharacteristic()); 6545 } 6546 6547 6548 ImportedFileIDs[FromID] = ToID; 6549 return ToID; 6550 } 6551 6552 CXXCtorInitializer *ASTImporter::Import(CXXCtorInitializer *From) { 6553 Expr *ToExpr = Import(From->getInit()); 6554 if (!ToExpr && From->getInit()) 6555 return nullptr; 6556 6557 if (From->isBaseInitializer()) { 6558 TypeSourceInfo *ToTInfo = Import(From->getTypeSourceInfo()); 6559 if (!ToTInfo && From->getTypeSourceInfo()) 6560 return nullptr; 6561 6562 return new (ToContext) CXXCtorInitializer( 6563 ToContext, ToTInfo, From->isBaseVirtual(), Import(From->getLParenLoc()), 6564 ToExpr, Import(From->getRParenLoc()), 6565 From->isPackExpansion() ? Import(From->getEllipsisLoc()) 6566 : SourceLocation()); 6567 } else if (From->isMemberInitializer()) { 6568 FieldDecl *ToField = 6569 llvm::cast_or_null<FieldDecl>(Import(From->getMember())); 6570 if (!ToField && From->getMember()) 6571 return nullptr; 6572 6573 return new (ToContext) CXXCtorInitializer( 6574 ToContext, ToField, Import(From->getMemberLocation()), 6575 Import(From->getLParenLoc()), ToExpr, Import(From->getRParenLoc())); 6576 } else if (From->isIndirectMemberInitializer()) { 6577 IndirectFieldDecl *ToIField = llvm::cast_or_null<IndirectFieldDecl>( 6578 Import(From->getIndirectMember())); 6579 if (!ToIField && From->getIndirectMember()) 6580 return nullptr; 6581 6582 return new (ToContext) CXXCtorInitializer( 6583 ToContext, ToIField, Import(From->getMemberLocation()), 6584 Import(From->getLParenLoc()), ToExpr, Import(From->getRParenLoc())); 6585 } else if (From->isDelegatingInitializer()) { 6586 TypeSourceInfo *ToTInfo = Import(From->getTypeSourceInfo()); 6587 if (!ToTInfo && From->getTypeSourceInfo()) 6588 return nullptr; 6589 6590 return new (ToContext) 6591 CXXCtorInitializer(ToContext, ToTInfo, Import(From->getLParenLoc()), 6592 ToExpr, Import(From->getRParenLoc())); 6593 } else { 6594 return nullptr; 6595 } 6596 } 6597 6598 6599 CXXBaseSpecifier *ASTImporter::Import(const CXXBaseSpecifier *BaseSpec) { 6600 auto Pos = ImportedCXXBaseSpecifiers.find(BaseSpec); 6601 if (Pos != ImportedCXXBaseSpecifiers.end()) 6602 return Pos->second; 6603 6604 CXXBaseSpecifier *Imported = new (ToContext) CXXBaseSpecifier( 6605 Import(BaseSpec->getSourceRange()), 6606 BaseSpec->isVirtual(), BaseSpec->isBaseOfClass(), 6607 BaseSpec->getAccessSpecifierAsWritten(), 6608 Import(BaseSpec->getTypeSourceInfo()), 6609 Import(BaseSpec->getEllipsisLoc())); 6610 ImportedCXXBaseSpecifiers[BaseSpec] = Imported; 6611 return Imported; 6612 } 6613 6614 void ASTImporter::ImportDefinition(Decl *From) { 6615 Decl *To = Import(From); 6616 if (!To) 6617 return; 6618 6619 if (DeclContext *FromDC = cast<DeclContext>(From)) { 6620 ASTNodeImporter Importer(*this); 6621 6622 if (RecordDecl *ToRecord = dyn_cast<RecordDecl>(To)) { 6623 if (!ToRecord->getDefinition()) { 6624 Importer.ImportDefinition(cast<RecordDecl>(FromDC), ToRecord, 6625 ASTNodeImporter::IDK_Everything); 6626 return; 6627 } 6628 } 6629 6630 if (EnumDecl *ToEnum = dyn_cast<EnumDecl>(To)) { 6631 if (!ToEnum->getDefinition()) { 6632 Importer.ImportDefinition(cast<EnumDecl>(FromDC), ToEnum, 6633 ASTNodeImporter::IDK_Everything); 6634 return; 6635 } 6636 } 6637 6638 if (ObjCInterfaceDecl *ToIFace = dyn_cast<ObjCInterfaceDecl>(To)) { 6639 if (!ToIFace->getDefinition()) { 6640 Importer.ImportDefinition(cast<ObjCInterfaceDecl>(FromDC), ToIFace, 6641 ASTNodeImporter::IDK_Everything); 6642 return; 6643 } 6644 } 6645 6646 if (ObjCProtocolDecl *ToProto = dyn_cast<ObjCProtocolDecl>(To)) { 6647 if (!ToProto->getDefinition()) { 6648 Importer.ImportDefinition(cast<ObjCProtocolDecl>(FromDC), ToProto, 6649 ASTNodeImporter::IDK_Everything); 6650 return; 6651 } 6652 } 6653 6654 Importer.ImportDeclContext(FromDC, true); 6655 } 6656 } 6657 6658 DeclarationName ASTImporter::Import(DeclarationName FromName) { 6659 if (!FromName) 6660 return DeclarationName(); 6661 6662 switch (FromName.getNameKind()) { 6663 case DeclarationName::Identifier: 6664 return Import(FromName.getAsIdentifierInfo()); 6665 6666 case DeclarationName::ObjCZeroArgSelector: 6667 case DeclarationName::ObjCOneArgSelector: 6668 case DeclarationName::ObjCMultiArgSelector: 6669 return Import(FromName.getObjCSelector()); 6670 6671 case DeclarationName::CXXConstructorName: { 6672 QualType T = Import(FromName.getCXXNameType()); 6673 if (T.isNull()) 6674 return DeclarationName(); 6675 6676 return ToContext.DeclarationNames.getCXXConstructorName( 6677 ToContext.getCanonicalType(T)); 6678 } 6679 6680 case DeclarationName::CXXDestructorName: { 6681 QualType T = Import(FromName.getCXXNameType()); 6682 if (T.isNull()) 6683 return DeclarationName(); 6684 6685 return ToContext.DeclarationNames.getCXXDestructorName( 6686 ToContext.getCanonicalType(T)); 6687 } 6688 6689 case DeclarationName::CXXDeductionGuideName: { 6690 TemplateDecl *Template = cast_or_null<TemplateDecl>( 6691 Import(FromName.getCXXDeductionGuideTemplate())); 6692 if (!Template) 6693 return DeclarationName(); 6694 return ToContext.DeclarationNames.getCXXDeductionGuideName(Template); 6695 } 6696 6697 case DeclarationName::CXXConversionFunctionName: { 6698 QualType T = Import(FromName.getCXXNameType()); 6699 if (T.isNull()) 6700 return DeclarationName(); 6701 6702 return ToContext.DeclarationNames.getCXXConversionFunctionName( 6703 ToContext.getCanonicalType(T)); 6704 } 6705 6706 case DeclarationName::CXXOperatorName: 6707 return ToContext.DeclarationNames.getCXXOperatorName( 6708 FromName.getCXXOverloadedOperator()); 6709 6710 case DeclarationName::CXXLiteralOperatorName: 6711 return ToContext.DeclarationNames.getCXXLiteralOperatorName( 6712 Import(FromName.getCXXLiteralIdentifier())); 6713 6714 case DeclarationName::CXXUsingDirective: 6715 // FIXME: STATICS! 6716 return DeclarationName::getUsingDirectiveName(); 6717 } 6718 6719 llvm_unreachable("Invalid DeclarationName Kind!"); 6720 } 6721 6722 IdentifierInfo *ASTImporter::Import(const IdentifierInfo *FromId) { 6723 if (!FromId) 6724 return nullptr; 6725 6726 IdentifierInfo *ToId = &ToContext.Idents.get(FromId->getName()); 6727 6728 if (!ToId->getBuiltinID() && FromId->getBuiltinID()) 6729 ToId->setBuiltinID(FromId->getBuiltinID()); 6730 6731 return ToId; 6732 } 6733 6734 Selector ASTImporter::Import(Selector FromSel) { 6735 if (FromSel.isNull()) 6736 return Selector(); 6737 6738 SmallVector<IdentifierInfo *, 4> Idents; 6739 Idents.push_back(Import(FromSel.getIdentifierInfoForSlot(0))); 6740 for (unsigned I = 1, N = FromSel.getNumArgs(); I < N; ++I) 6741 Idents.push_back(Import(FromSel.getIdentifierInfoForSlot(I))); 6742 return ToContext.Selectors.getSelector(FromSel.getNumArgs(), Idents.data()); 6743 } 6744 6745 DeclarationName ASTImporter::HandleNameConflict(DeclarationName Name, 6746 DeclContext *DC, 6747 unsigned IDNS, 6748 NamedDecl **Decls, 6749 unsigned NumDecls) { 6750 return Name; 6751 } 6752 6753 DiagnosticBuilder ASTImporter::ToDiag(SourceLocation Loc, unsigned DiagID) { 6754 if (LastDiagFromFrom) 6755 ToContext.getDiagnostics().notePriorDiagnosticFrom( 6756 FromContext.getDiagnostics()); 6757 LastDiagFromFrom = false; 6758 return ToContext.getDiagnostics().Report(Loc, DiagID); 6759 } 6760 6761 DiagnosticBuilder ASTImporter::FromDiag(SourceLocation Loc, unsigned DiagID) { 6762 if (!LastDiagFromFrom) 6763 FromContext.getDiagnostics().notePriorDiagnosticFrom( 6764 ToContext.getDiagnostics()); 6765 LastDiagFromFrom = true; 6766 return FromContext.getDiagnostics().Report(Loc, DiagID); 6767 } 6768 6769 void ASTImporter::CompleteDecl (Decl *D) { 6770 if (ObjCInterfaceDecl *ID = dyn_cast<ObjCInterfaceDecl>(D)) { 6771 if (!ID->getDefinition()) 6772 ID->startDefinition(); 6773 } 6774 else if (ObjCProtocolDecl *PD = dyn_cast<ObjCProtocolDecl>(D)) { 6775 if (!PD->getDefinition()) 6776 PD->startDefinition(); 6777 } 6778 else if (TagDecl *TD = dyn_cast<TagDecl>(D)) { 6779 if (!TD->getDefinition() && !TD->isBeingDefined()) { 6780 TD->startDefinition(); 6781 TD->setCompleteDefinition(true); 6782 } 6783 } 6784 else { 6785 assert (0 && "CompleteDecl called on a Decl that can't be completed"); 6786 } 6787 } 6788 6789 Decl *ASTImporter::Imported(Decl *From, Decl *To) { 6790 if (From->hasAttrs()) { 6791 for (Attr *FromAttr : From->getAttrs()) 6792 To->addAttr(FromAttr->clone(To->getASTContext())); 6793 } 6794 if (From->isUsed()) { 6795 To->setIsUsed(); 6796 } 6797 if (From->isImplicit()) { 6798 To->setImplicit(); 6799 } 6800 ImportedDecls[From] = To; 6801 return To; 6802 } 6803 6804 bool ASTImporter::IsStructurallyEquivalent(QualType From, QualType To, 6805 bool Complain) { 6806 llvm::DenseMap<const Type *, const Type *>::iterator Pos 6807 = ImportedTypes.find(From.getTypePtr()); 6808 if (Pos != ImportedTypes.end() && ToContext.hasSameType(Import(From), To)) 6809 return true; 6810 6811 StructuralEquivalenceContext Ctx(FromContext, ToContext, NonEquivalentDecls, 6812 false, Complain); 6813 return Ctx.IsStructurallyEquivalent(From, To); 6814 } 6815